ZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3dpbnJ0L0NvcmVXaW5kb3dOYXRpdmVXaW5kb3cuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvd2lucnQvQ29yZVdpbmRvd05hdGl2ZVdpbmRvdy5jcHAKaW5kZXggMzJkNTY3Ni4uNWQ3YmVmZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvd2lucnQvQ29yZVdpbmRvd05hdGl2ZVdpbmRvdy5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2FuZ2xlL3NyYy9saWJBTkdMRS9yZW5kZXJlci9kM2QvZDNkMTEvd2lucnQvQ29yZVdpbmRvd05hdGl2ZVdpbmRvdy5jcHAKQEAgLTE5MSw2ICsxOTEsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIENvbVB0cjxJRFhHSURldmljZTE+IHBEWEdJRGV2aWNlOworICAgIHJlc3VsdCA9IGRldmljZS0+UXVlcnlJbnRlcmZhY2UoX191dWlkb2YoSURYR0lEZXZpY2UxKSwgKHZvaWQgKiopcERYR0lEZXZpY2UuR2V0QWRkcmVzc09mKCkpOworICAgIGlmIChTVUNDRUVERUQocmVzdWx0KSkKKyAgICB7CisgICAgICBwRFhHSURldmljZS0+U2V0TWF4aW11bUZyYW1lTGF0ZW5jeShzd2FwQ2hhaW5EZXNjLkJ1ZmZlckNvdW50KTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9iaW5kaW5nc190ZXN0cy5weSBiL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2JpbmRpbmdzL2JpbmRpbmdzX3Rlc3RzLnB5CmluZGV4IDFjNzJlODUuLjE0ZTU3YWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2JpbmRpbmdzL2JpbmRpbmdzX3Rlc3RzLnB5CisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2JpbmRpbmdzL2JpbmRpbmdzX3Rlc3RzLnB5CkBAIC01Myw4ICs1Myw4IEBACiAKIFBBU1NfTUVTU0FHRSA9ICdBbGwgdGVzdHMgUEFTUyEnCiBGQUlMX01FU1NBR0UgPSAiIiJTb21lIHRlc3RzIEZBSUwhCi1UbyB1cGRhdGUgdGhlIHJlZmVyZW5jZSBmaWxlcywgZXhlY3V0ZToKLSAgICBydW4tYmluZGluZ3MtdGVzdHMgLS1yZXNldC1yZXN1bHRzCitUbyB1cGRhdGUgdGhlIHJlZmVyZW5jZSBmaWxlcywgZXhlY3V0ZSAoZnJvbSBjb2JhbHQvYmluZGluZ3MpOgorICAgIC4vcnVuX2NvYmFsdF9iaW5kaW5nc190ZXN0cy5zaCAtLXJlc2V0LXJlc3VsdHMKIAogSWYgdGhlIGZhaWx1cmVzIGFyZSBub3QgZHVlIHRvIHlvdXIgY2hhbmdlcywgdGVzdCByZXN1bHRzIG1heSBiZSBvdXQgb2Ygc3luYzsKIHBsZWFzZSByZWJhc2VsaW5lIHRoZW0gaW4gYSBzZXBhcmF0ZSBDTCwgYWZ0ZXIgY2hlY2tpbmcgdGhhdCB0ZXN0cyBmYWlsIGluIFRvVC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9pY3UvaWN1Lmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9pY3UvaWN1Lmd5cAppbmRleCAzOTg5MmY3Li5hNzQxOTU3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvaWN1L2ljdS5neXAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2ljdS9pY3UuZ3lwCkBAIC0zMDEsNiArMzAxLDEyIEBACiAgICAgICAgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmRfaGVhZGVyc19vbmx5Lmd5cDpzdGFyYm9hcmRfaGVhZGVyc19vbmx5JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIFsnKE9TPT0ic3RhcmJvYXJkIikgYW5kICh0YXJnZXRfb3M9PSJhbmRyb2lkIiknLCB7CisgICAgICAgICAgICAgICdjZmxhZ3NfY2MnOiBbCisgICAgICAgICAgICAgICAgIyByZWxkdGZtdC5jcHAgY29tcGFyZXMgJ1VEYXRlRm9ybWF0U3R5bGUnIGFuZCAnRVN0eWxlJy4KKyAgICAgICAgICAgICAgICAnLVduby1lbnVtLWNvbXBhcmUtc3dpdGNoJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgWycoT1M9PSJsYl9zaGVsbCIgb3IgT1M9PSJzdGFyYm9hcmQiKSBhbmQgKHRhcmdldF9vcz09ImFuZHJvaWQiIG9yIHRhcmdldF9vcz09ImxpbnV4IiBvciBjbGFuZz09MSknLCB7CiAgICAgICAgICAgICAgICdjZmxhZ3NfY2MnOiBbCiAgICAgICAgICAgICAgICAgJy1mcnR0aScsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC8ubWFpbG1hcCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwLy5tYWlsbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC8ubWFpbG1hcApAQCAtMCwwICsxLDEyIEBACis8am9oYW5uLmtvZW5pZ0BkdWNrLmNvbT4gPGpvaGFubmtvZW5pZ0Bnb29nbGUuY29tPgorTWlrb8WCYWogWmFsZXdza2kgPG1pa29sYWp6QGdvb2dsZS5jb20+CitQYXNjYWwgTWFzc2ltaW5vIDxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4KKzxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4gPHNrYWxAZ29vZ2xlLmNvbT4KK1Zpa2FzIEFyb3JhIDx2aWthc2FAZ29vZ2xlLmNvbT4KKzx2aWthc2FAZ29vZ2xlLmNvbT4gPHZpa2FzYUBnbWFpbC5jb20+Cis8dmlrYXNhQGdvb2dsZS5jb20+IDx2aWthYXMuYXJvcmFAZ21haWwuY29tPgorPHNsb2JvZGFuLnByaWppY0BpbWd0ZWMuY29tPiA8U2xvYm9kYW4uUHJpamljQGltZ3RlYy5jb20+Cis8dnJhYmF1ZEBnb29nbGUuY29tPiA8dmluY2VudC5yYWJhdWRAZ21haWwuY29tPgorVGFtYXIgTGV2eSA8dGFtYXIubGV2eUBpbnRlbC5jb20+Cis8cXJjemFrQGdvb2dsZS5jb20+IDxxcmN6YWs+CitIdWkgU3UgPGh1aXN1QGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BVVRIT1JTIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M3YjljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQVVUSE9SUwpAQCAtMCwwICsxLDM5IEBACitDb250cmlidXRvcnM6CistIENoYXJsZXMgTXVuZ2VyIChjbG0gYXQgZ29vZ2xlIGRvdCBjb20pCistIENocmlzdGlhbiBEdXZpdmllciAoY2R1dml2aWVyIGF0IGdvb2dsZSBkb3QgY29tKQorLSBEam9yZGplIFBlc3V0IChkam9yZGplIGRvdCBwZXN1dCBhdCBpbWd0ZWMgZG90IGNvbSkKKy0gSHVpIFN1IChodWlzdSBhdCBnb29nbGUgZG90IGNvbSkKKy0gSmFtZXMgWmVybiAoanplcm4gYXQgZ29vZ2xlIGRvdCBjb20pCistIEphbiBFbmdlbGhhcmR0IChqZW5nZWxoIGF0IG1lZG96YXMgZG90IGRlKQorLSBKZWhhbiAoamVoYW4gYXQgZ2lyaW5zdHVkIGRvdCBpbykKKy0gSm9oYW5uIChqb2hhbm4gZG90IGtvZW5pZyBhdCBkdWNrIGRvdCBjb20pCistIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuIGRvdCB6ZWxpbmNldmljIGF0IGltZ3RlYyBkb3QgY29tKQorLSBKeXJraSBBbGFrdWlqYWxhIChqeXJraSBhdCBnb29nbGUgZG90IGNvbSkKKy0gTG9kZSBWYW5kZXZlbm5lIChsb2RlIGF0IGdvb2dsZSBkb3QgY29tKQorLSBMb3UgUXVpbGxpbyAobG91cXVpbGxpbyBhdCBnb29nbGUgZG90IGNvbSkKKy0gTWFucyBSdWxsZ2FyZCAobWFucyBhdCBtYW5zciBkb3QgY29tKQorLSBNYXJjaW4gS293YWxjenlrIChxcmN6YWsgYXQgZ29vZ2xlIGRvdCBjb20pCistIE1hcnRpbiBPbHNzb24gKG1uZW1vIGF0IG1pbmltdW0gZG90IHNlKQorLSBNaWtvxYJhaiBaYWxld3NraSAobWlrb2xhanogYXQgZ29vZ2xlIGRvdCBjb20pCistIE1pc2xhdiBCcmFkYWMgKG1pc2xhdm0gYXQgZ29vZ2xlIGRvdCBjb20pCistIE5pY28gV2ViZXIgKHRoYWtpcyBhdCBjaHJvbWl1bSBkb3Qgb3JnKQorLSBOb2VsIENocm9taXVtIChub2VsIGF0IGNocm9taXVtIGRvdCBvcmcpCistIE93ZW4gUm9kbGV5IChvcm9kbGV5IGF0IGdvb2dsZSBkb3QgY29tKQorLSBQYXJhZyBTYWxhc2FrYXIgKGltZyBkb3QgbWlwczEgYXQgZ21haWwgZG90IGNvbSkKKy0gUGFzY2FsIE1hc3NpbWlubyAocGFzY2FsIGRvdCBtYXNzaW1pbm8gYXQgZ21haWwgZG90IGNvbSkKKy0gUGF3ZcWCIEhhamRhbiwgSnIgKHBoYWpkYW4gZG90IGpyIGF0IGNocm9taXVtIGRvdCBvcmcpCistIFBpZXJyZSBKb3llIChwaWVycmUgZG90IHBocCBhdCBnbWFpbCBkb3QgY29tKQorLSBTYW0gQ2xlZ2cgKHNiYyBhdCBjaHJvbWl1bSBkb3Qgb3JnKQorLSBTY290dCBIYW5jaGVyIChzZWggYXQgZ29vZ2xlIGRvdCBjb20pCistIFNjb3R0IExhVmFybndheSAoc2xhdmFybndheSBhdCBnb29nbGUgZG90IGNvbSkKKy0gU2NvdHQgVGFsYm90IChzIGF0IGNoaWthY2hvdyBkb3Qgb3JnKQorLSBTbG9ib2RhbiBQcmlqaWMgKHNsb2JvZGFuIGRvdCBwcmlqaWMgYXQgaW1ndGVjIGRvdCBjb20pCistIFNvbW5hdGggQmFuZXJqZWUgKHNvbW5hdGggZG90IGJhbmVyamVlIGF0IGdtYWlsIGRvdCBjb20pCistIFNyaXJhbWFuIFRhbGxhbSAodG1zcmlyYW0gYXQgZ29vZ2xlIGRvdCBjb20pCistIFRhbWFyIExldnkgKHRhbWFyIGRvdCBsZXZ5IGF0IGludGVsIGRvdCBjb20pCistIFRpbW90aHkgR3UgKHRpbW90aHlndTk5IGF0IGdtYWlsIGRvdCBjb20pCistIFVydmFuZyBKb3NoaSAodXJ2YW5nIGF0IGdvb2dsZSBkb3QgY29tKQorLSBWaWthcyBBcm9yYSAodmlrYXNhIGF0IGdvb2dsZSBkb3QgY29tKQorLSBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZCBhdCBnb29nbGUgZG90IGNvbSkKKy0gVmxhZCBUc3lya2xldmljaCAodnRzeXJrbGV2aWNoIGF0IGNocm9taXVtIGRvdCBvcmcpCistIFlhbmcgWmhhbmcgKHlhbmcgZG90IHpoYW5nIGF0IGFybSBkb3QgY29tKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQW5kcm9pZC5tayBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1MmY3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyODAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworV0VCUF9DRkxBR1MgOj0gLVdhbGwgLURBTkRST0lEIC1ESEFWRV9NQUxMT0NfSCAtREhBVkVfUFRIUkVBRCAtRFdFQlBfVVNFX1RIUkVBRAorV0VCUF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorCitpZmVxICgkKEFQUF9PUFRJTSkscmVsZWFzZSkKKyAgV0VCUF9DRkxBR1MgKz0gLWZpbmxpbmUtZnVuY3Rpb25zIC1mZmFzdC1tYXRoIFwKKyAgICAgICAgICAgICAgICAgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMKKyAgaWZlcSAoJChmaW5kc3RyaW5nIGNsYW5nLCQoTkRLX1RPT0xDSEFJTl9WRVJTSU9OKSksKQorICAgIFdFQlBfQ0ZMQUdTICs9IC1mcmVuYW1lLXJlZ2lzdGVycyAtcworICBlbmRpZgorZW5kaWYKKworIyBtaXBzMzIgZmFpbHMgdG8gYnVpbGQgd2l0aCBjbGFuZyBmcm9tIHIxNGIKKyMgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAvaXNzdWVzL2RldGFpbD9pZD0zNDMKK2lmZXEgKCQoZmluZHN0cmluZyBjbGFuZywkKE5ES19UT09MQ0hBSU5fVkVSU0lPTikpLGNsYW5nKQorICBpZmVxICgkKFRBUkdFVF9BUkNIKSxtaXBzKQorICAgIGNsYW5nX3ZlcnNpb24gOj0gJChzaGVsbCAkKFRBUkdFVF9DQykgLS12ZXJzaW9uKQorICAgIGlmbmVxICgkKGZpbmRzdHJpbmcgY2xhbmcgdmVyc2lvbiAzLCQoY2xhbmdfdmVyc2lvbikpLCkKKyAgICAgIFdFQlBfQ0ZMQUdTICs9IC1uby1pbnRlZ3JhdGVkLWFzCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgYXJtZWFiaS12N2EsICQoVEFSR0VUX0FSQ0hfQUJJKSksKQorICAjIFNldHRpbmcgTE9DQUxfQVJNX05FT04gd2lsbCBlbmFibGUgLW1mcHU9bmVvbiB3aGljaCBtYXkgY2F1c2UgaWxsZWdhbAorICAjIGluc3RydWN0aW9ucyB0byBiZSBnZW5lcmF0ZWQgZm9yIGFybXY3YSBjb2RlLiBJbnN0ZWFkIHRhcmdldCB0aGUgbmVvbiBjb2RlCisgICMgc3BlY2lmaWNhbGx5LgorICBORU9OIDo9IGMubmVvbgorICBVU0VfQ1BVRkVBVFVSRVMgOj0geWVzCisgIFdFQlBfQ0ZMQUdTICs9IC1ESEFWRV9DUFVfRkVBVFVSRVNfSAorZWxzZQorICBORU9OIDo9IGMKK2VuZGlmCisKK2RlY19zcmNzIDo9IFwKKyAgICBzcmMvZGVjL2FscGhhX2RlYy5jIFwKKyAgICBzcmMvZGVjL2J1ZmZlcl9kZWMuYyBcCisgICAgc3JjL2RlYy9mcmFtZV9kZWMuYyBcCisgICAgc3JjL2RlYy9pZGVjX2RlYy5jIFwKKyAgICBzcmMvZGVjL2lvX2RlYy5jIFwKKyAgICBzcmMvZGVjL3F1YW50X2RlYy5jIFwKKyAgICBzcmMvZGVjL3RyZWVfZGVjLmMgXAorICAgIHNyYy9kZWMvdnA4X2RlYy5jIFwKKyAgICBzcmMvZGVjL3ZwOGxfZGVjLmMgXAorICAgIHNyYy9kZWMvd2VicF9kZWMuYyBcCisKK2RlbXV4X3NyY3MgOj0gXAorICAgIHNyYy9kZW11eC9hbmltX2RlY29kZS5jIFwKKyAgICBzcmMvZGVtdXgvZGVtdXguYyBcCisKK2RzcF9kZWNfc3JjcyA6PSBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMgXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYyBcCisgICAgc3JjL2RzcC9jcHUuYyBcCisgICAgc3JjL2RzcC9kZWMuYyBcCisgICAgc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMuYyBcCisgICAgc3JjL2RzcC9kZWNfbWlwczMyLmMgXAorICAgIHNyYy9kc3AvZGVjX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvZGVjX21zYS5jIFwKKyAgICBzcmMvZHNwL2RlY19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvZGVjX3NzZTIuYyBcCisgICAgc3JjL2RzcC9kZWNfc3NlNDEuYyBcCisgICAgc3JjL2RzcC9maWx0ZXJzLmMgXAorICAgIHNyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbXNhLmMgXAorICAgIHNyYy9kc3AvZmlsdGVyc19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvZmlsdGVyc19zc2UyLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3MuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX21zYS5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19zc2UyLmMgXAorICAgIHNyYy9kc3AvcmVzY2FsZXIuYyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIuYyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21zYS5jIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9zc2UyLmMgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZy5jIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX21zYS5jIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEuYyBcCisgICAgc3JjL2RzcC95dXYuYyBcCisgICAgc3JjL2RzcC95dXZfbWlwczMyLmMgXAorICAgIHNyYy9kc3AveXV2X21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AveXV2X25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC95dXZfc3NlMi5jIFwKKyAgICBzcmMvZHNwL3l1dl9zc2U0MS5jIFwKKworZHNwX2VuY19zcmNzIDo9IFwKKyAgICBzcmMvZHNwL2Nvc3QuYyBcCisgICAgc3JjL2RzcC9jb3N0X21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9jb3N0X3NzZTIuYyBcCisgICAgc3JjL2RzcC9lbmMuYyBcCisgICAgc3JjL2RzcC9lbmNfYXZ4Mi5jIFwKKyAgICBzcmMvZHNwL2VuY19taXBzMzIuYyBcCisgICAgc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9lbmNfbXNhLmMgXAorICAgIHNyYy9kc3AvZW5jX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9lbmNfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2VuY19zc2U0MS5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuYy5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jIFwKKyAgICBzcmMvZHNwL3NzaW0uYyBcCisgICAgc3JjL2RzcC9zc2ltX3NzZTIuYyBcCisKK2VuY19zcmNzIDo9IFwKKyAgICBzcmMvZW5jL2FscGhhX2VuYy5jIFwKKyAgICBzcmMvZW5jL2FuYWx5c2lzX2VuYy5jIFwKKyAgICBzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMuYyBcCisgICAgc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jIFwKKyAgICBzcmMvZW5jL2NvbmZpZ19lbmMuYyBcCisgICAgc3JjL2VuYy9jb3N0X2VuYy5jIFwKKyAgICBzcmMvZW5jL2ZpbHRlcl9lbmMuYyBcCisgICAgc3JjL2VuYy9mcmFtZV9lbmMuYyBcCisgICAgc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmMgXAorICAgIHNyYy9lbmMvaXRlcmF0b3JfZW5jLmMgXAorICAgIHNyYy9lbmMvbmVhcl9sb3NzbGVzc19lbmMuYyBcCisgICAgc3JjL2VuYy9waWN0dXJlX2VuYy5jIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfY3NwX2VuYy5jIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3Jlc2NhbGVfZW5jLmMgXAorICAgIHNyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYyBcCisgICAgc3JjL2VuYy9wcmVkaWN0b3JfZW5jLmMgXAorICAgIHNyYy9lbmMvcXVhbnRfZW5jLmMgXAorICAgIHNyYy9lbmMvc3ludGF4X2VuYy5jIFwKKyAgICBzcmMvZW5jL3Rva2VuX2VuYy5jIFwKKyAgICBzcmMvZW5jL3RyZWVfZW5jLmMgXAorICAgIHNyYy9lbmMvdnA4bF9lbmMuYyBcCisgICAgc3JjL2VuYy93ZWJwX2VuYy5jIFwKKworbXV4X3NyY3MgOj0gXAorICAgIHNyYy9tdXgvYW5pbV9lbmNvZGUuYyBcCisgICAgc3JjL211eC9tdXhlZGl0LmMgXAorICAgIHNyYy9tdXgvbXV4aW50ZXJuYWwuYyBcCisgICAgc3JjL211eC9tdXhyZWFkLmMgXAorCit1dGlsc19kZWNfc3JjcyA6PSBcCisgICAgc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9maWx0ZXJzX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9odWZmbWFuX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9yYW5kb21fdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy90aHJlYWRfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3V0aWxzLmMgXAorCit1dGlsc19lbmNfc3JjcyA6PSBcCisgICAgc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuYyBcCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYndlYnBkZWNvZGVyCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoZGVjX3NyY3MpIFwKKyAgICAkKGRzcF9kZWNfc3JjcykgXAorICAgICQodXRpbHNfZGVjX3NyY3MpIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjCisKKyMgcHJlZmVyIGFybSBvdmVyIHRodW1iIG1vZGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworaWZlcSAoJChVU0VfQ1BVRkVBVFVSRVMpLHllcykKKyAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBjcHVmZWF0dXJlcworZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IHdlYnBkZWNvZGVyX3N0YXRpYworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2lmZXEgKCQoRU5BQkxFX1NIQVJFRCksMSkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IHdlYnBkZWNvZGVyX3N0YXRpYworCitMT0NBTF9NT0RVTEUgOj0gd2VicGRlY29kZXIKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorZW5kaWYgICMgRU5BQkxFX1NIQVJFRD0xCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYndlYnAKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChkc3BfZW5jX3NyY3MpIFwKKyAgICAkKGVuY19zcmNzKSBcCisgICAgJCh1dGlsc19lbmNfc3JjcykgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMKKworIyBwcmVmZXIgYXJtIG92ZXIgdGh1bWIgbW9kZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnMKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IHdlYnBkZWNvZGVyX3N0YXRpYworCitMT0NBTF9NT0RVTEUgOj0gd2VicAorCitpZmVxICgkKEVOQUJMRV9TSEFSRUQpLDEpCisgIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2Vsc2UKKyAgaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGlid2VicGRlbXV4CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChkZW11eF9zcmNzKQorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMKKworIyBwcmVmZXIgYXJtIG92ZXIgdGh1bWIgbW9kZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnMKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9NT0RVTEUgOj0gd2VicGRlbXV4CisKK2lmZXEgKCQoRU5BQkxFX1NIQVJFRCksMSkKKyAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSB3ZWJwCisgIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2Vsc2UKKyAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSB3ZWJwCisgIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYndlYnBtdXgKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKG11eF9zcmNzKQorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMKKworIyBwcmVmZXIgYXJtIG92ZXIgdGh1bWIgbW9kZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnMKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9NT0RVTEUgOj0gd2VicG11eAorCitpZmVxICgkKEVOQUJMRV9TSEFSRUQpLDEpCisgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gd2VicAorICBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCitlbHNlCisgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gd2VicAorICBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitXRUJQX1NSQ19QQVRIIDo9ICQoTE9DQUxfUEFUSCkKK2luY2x1ZGUgJChXRUJQX1NSQ19QQVRIKS9pbWFnZWlvL0FuZHJvaWQubWsKK2luY2x1ZGUgJChXRUJQX1NSQ19QQVRIKS9leGFtcGxlcy9BbmRyb2lkLm1rCisKK2lmZXEgKCQoVVNFX0NQVUZFQVRVUkVTKSx5ZXMpCisgICQoY2FsbCBpbXBvcnQtbW9kdWxlLGFuZHJvaWQvY3B1ZmVhdHVyZXMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ01ha2VMaXN0cy50eHQgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI2M2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzNzEgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguNykKKworcHJvamVjdChsaWJ3ZWJwIEMpCisKKyMgT3B0aW9ucyBmb3IgY29kZXIgLyBkZWNvZGVyIGV4ZWN1dGFibGVzLgorb3B0aW9uKFdFQlBfRU5BQkxFX1NJTUQgIkVuYWJsZSBhbnkgU0lNRCBvcHRpbWl6YXRpb24uIiBPTikKK29wdGlvbihXRUJQX0JVSUxEX0NXRUJQICJCdWlsZCB0aGUgY3dlYnAgY29tbWFuZCBsaW5lIHRvb2wuIiBPRkYpCitvcHRpb24oV0VCUF9CVUlMRF9EV0VCUCAiQnVpbGQgdGhlIGR3ZWJwIGNvbW1hbmQgbGluZSB0b29sLiIgT0ZGKQorb3B0aW9uKFdFQlBfQlVJTERfR0lGMldFQlAgIkJ1aWxkIHRoZSBnaWYyd2VicCBjb252ZXJzaW9uIHRvb2wuIiBPRkYpCitvcHRpb24oV0VCUF9CVUlMRF9JTUcyV0VCUCAiQnVpbGQgdGhlIGltZzJ3ZWJwIGFuaW1hdGlvbiB0b29sLiIgT0ZGKQorb3B0aW9uKFdFQlBfQlVJTERfV0VCUElORk8gIkJ1aWxkIHRoZSB3ZWJwaW5mbyBjb21tYW5kIGxpbmUgdG9vbC4iIE9GRikKK29wdGlvbihXRUJQX0JVSUxEX1dFQlBfSlMgIkVtc2NyaXB0ZW4gYnVpbGQgb2Ygd2VicC5qcy4iIE9GRikKK29wdGlvbihXRUJQX05FQVJfTE9TU0xFU1MgIkVuYWJsZSBuZWFyLWxvc3NsZXNzIGVuY29kaW5nIiBPTikKK29wdGlvbihXRUJQX0VOQUJMRV9TV0FQXzE2QklUX0NTUCAiRW5hYmxlIGJ5dGUgc3dhcCBmb3IgMTYgYml0IGNvbG9yc3BhY2VzLiIgT0ZGKQorCitpZihXRUJQX0JVSUxEX1dFQlBfSlMpCisgIHNldChXRUJQX0VOQUJMRV9TSU1EIE9GRikKK2VuZGlmKCkKKworc2V0KFdFQlBfREVQX0xJQlJBUklFUykKK3NldChXRUJQX0RFUF9JTkNMVURFX0RJUlMpCisKK2lmKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSAiUmVsZWFzZSIgQ0FDSEUKKyAgICAiQnVpbGQgdHlwZTogUmVsZWFzZSwgRGVidWcgb3IgUmVsV2l0aERlYkluZm8iIFNUUklORyBGT1JDRQorICApCitlbmRpZigpCisKKyMgSW5jbHVkZSBkZXBlbmRlbmNpZXMuCitpbmNsdWRlKGNtYWtlL2RlcHMuY21ha2UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9wdGlvbnMuCitpZihXRUJQX0VOQUJMRV9TV0FQXzE2QklUX0NTUCkKKyAgYWRkX2RlZmluaXRpb25zKC1EV0VCUF9TV0FQXzE2QklUX0NTUD0xKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbmRyb2lkIG9ubHkuCitpZihBTkRST0lEKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7QU5EUk9JRF9OREt9L3NvdXJjZXMvYW5kcm9pZC9jcHVmZWF0dXJlcykKKyAgYWRkX2xpYnJhcnkoY3B1ZmVhdHVyZXMgU1RBVElDCisgICAgJHtBTkRST0lEX05ES30vc291cmNlcy9hbmRyb2lkL2NwdWZlYXR1cmVzL2NwdS1mZWF0dXJlcy5jCisgICkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNwdWZlYXR1cmVzIGRsKQorICBzZXQoV0VCUF9ERVBfTElCUkFSSUVTICR7V0VCUF9ERVBfTElCUkFSSUVTfSBjcHVmZWF0dXJlcykKKyAgc2V0KFdFQlBfREVQX0lOQ0xVREVfRElSUyAke1dFQlBfREVQX0lOQ0xVREVfRElSU30KKyAgICAke0FORFJPSURfTkRLfS9zb3VyY2VzL2FuZHJvaWQvY3B1ZmVhdHVyZXMKKyAgKQorICBhZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NQVV9GRUFUVVJFU19IPTEpCisgIHNldChIQVZFX0NQVV9GRUFUVVJFU19IIDEpCitlbHNlKCkKKyAgc2V0KEhBVkVfQ1BVX0ZFQVRVUkVTX0ggMCkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV2ViUCBzb3VyY2UgZmlsZXMuCisjIFJlYWQgdGhlIE1ha2VmaWxlLmFtIHRvIGdldCB0aGUgc291cmNlIGZpbGVzLgorCisjIFdlIGV4cGVjdCB0aGUgTWFrZWZpbGVzIHRvIGRlZmluZSB0aGUgc291cmNlcyBhcyBkZWZpbmVkIGluCisjIHRoZSBmaXJzdCByZWdleC4gRS5nLjoKKyMgbGliaW1hZ2VkZWNfbGFfU09VUkNFUyAgPSBpbWFnZV9kZWMuYyBpbWFnZV9kZWMuaAorZnVuY3Rpb24ocGFyc2VfTWFrZWZpbGVfYW0gRk9MREVSIFZBUiBTUkNfUkVHRVgpCisgIGZpbGUoUkVBRCAke0ZPTERFUn0vTWFrZWZpbGUuYW0gTUFLRUZJTEVfQU0pCisgIHN0cmluZyhSRUdFWCBNQVRDSEFMTCAiJHtTUkNfUkVHRVh9X1NPVVJDRVNbIF0qXFwrPz1bIF0rWzAtOWEtelxcLl8gXSoiCisgICAgRklMRVNfUEVSX0xJTkUgJHtNQUtFRklMRV9BTX0KKyAgKQorICBzZXQoU1JDUyAkeyR7VkFSfX0pCisgIGZvcmVhY2goRklMRVMgJHtGSUxFU19QRVJfTElORX0pCisgICAgc3RyaW5nKEZJTkQgJHtGSUxFU30gIj0iIE9GRlNFVCkKKyAgICBtYXRoKEVYUFIgT0ZGU0VUICIke09GRlNFVH0gKyAyIikKKyAgICBzdHJpbmcoU1VCU1RSSU5HICR7RklMRVN9ICR7T0ZGU0VUfSAtMSBGSUxFUykKKyAgICBpZihGSUxFUykKKyAgICAgIHN0cmluZyhSRUdFWCBNQVRDSEFMTCAiWzAtOWEtelxcLl9dKyIKKyAgICAgICAgRklMRVMgJHtGSUxFU30KKyAgICAgICkKKyAgICAgIGZvcmVhY2goRklMRSAke0ZJTEVTfSkKKyAgICAgICAgbGlzdChBUFBFTkQgU1JDUyAke0ZPTERFUn0vJHtGSUxFfSkKKyAgICAgIGVuZGZvcmVhY2goKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke1ZBUn0gJHtTUkNTfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK3NldChXRUJQX1NSQ19ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYykKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kZWMgIldFQlBfREVDX1NSQ1MiICIiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RlbXV4ICJXRUJQX0RFTVVYX1NSQ1MiICIiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RzcCAiV0VCUF9EU1BfQ09NTU9OX1NSQ1MiICJDT01NT04iKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RzcCAiV0VCUF9EU1BfRU5DX1NSQ1MiICJFTkMiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RzcCAiV0VCUF9EU1BfRU5DX1NSQ1MiICJkc3BfW14gXSoiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RzcCAiV0VCUF9EU1BfREVDX1NSQ1MiICJkZWNvZGVfW14gXSoiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2VuYyAiV0VCUF9FTkNfU1JDUyIgIiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vdXRpbHMgIldFQlBfVVRJTFNfQ09NTU9OX1NSQ1MiICJDT01NT04iKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L3V0aWxzICJXRUJQX1VUSUxTX0VOQ19TUkNTIiAiRU5DIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS91dGlscyAiV0VCUF9VVElMU19ERUNfU1JDUyIgImRlY29kZV9bXiBdKiIpCisKKyMgUmVtb3ZlIHRoZSBmaWxlcyBzcGVjaWZpYyB0byBTSU1EIHdlIGRvbid0IHVzZS4KK2ZvcmVhY2goRklMRSAke1dFQlBfU0lNRF9GSUxFU19OT1RfVE9fSU5DTFVERX0pCisgIGxpc3QoUkVNT1ZFX0lURU0gV0VCUF9EU1BfRU5DX1NSQ1MgJHtGSUxFfSkKKyAgbGlzdChSRU1PVkVfSVRFTSBXRUJQX0RTUF9ERUNfU1JDUyAke0ZJTEV9KQorZW5kZm9yZWFjaCgpCisKKyMjIyBEZWZpbmUgdGhlIG1hbmRhdG9yeSBsaWJyYXJpZXMuCisjIEJ1aWxkIHRoZSB3ZWJwZGVjb2RlciBsaWJyYXJ5LgoraWYoTVNWQykKKyAgIyBhdm9pZCBzZWN1cml0eSB3YXJuaW5ncyBmb3IgZS5nLiwgZm9wZW4oKSB1c2VkIGluIHRoZSBleGFtcGxlcy4KKyAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MpCitlbHNlKCkKKyAgYWRkX2RlZmluaXRpb25zKC1XYWxsKQorZW5kaWYoKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0gJHtXRUJQX0RFUF9JTkNMVURFX0RJUlN9KQorYWRkX2xpYnJhcnkod2VicGRlY29kZSBPQkpFQ1QgJHtXRUJQX0RFQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnBkc3BkZWNvZGUgT0JKRUNUICR7V0VCUF9EU1BfQ09NTU9OX1NSQ1N9ICR7V0VCUF9EU1BfREVDX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicHV0aWxzZGVjb2RlIE9CSkVDVCAke1dFQlBfVVRJTFNfQ09NTU9OX1NSQ1N9CisgICR7V0VCUF9VVElMU19ERUNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwZGVjb2RlciAkPFRBUkdFVF9PQkpFQ1RTOndlYnBkZWNvZGU+CisgICQ8VEFSR0VUX09CSkVDVFM6d2VicGRzcGRlY29kZT4gJDxUQVJHRVRfT0JKRUNUUzp3ZWJwdXRpbHNkZWNvZGU+KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBkZWNvZGVyICR7V0VCUF9ERVBfTElCUkFSSUVTfSkKKworIyBCdWlsZCB0aGUgd2VicCBsaWJyYXJ5LgorYWRkX2xpYnJhcnkod2VicGVuY29kZSBPQkpFQ1QgJHtXRUJQX0VOQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnBkc3AgT0JKRUNUICR7V0VCUF9EU1BfQ09NTU9OX1NSQ1N9ICR7V0VCUF9EU1BfREVDX1NSQ1N9CisgICR7V0VCUF9EU1BfRU5DX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicHV0aWxzIE9CSkVDVCAke1dFQlBfVVRJTFNfQ09NTU9OX1NSQ1N9ICR7V0VCUF9VVElMU19ERUNfU1JDU30KKyAgJHtXRUJQX1VUSUxTX0VOQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnAgJDxUQVJHRVRfT0JKRUNUUzp3ZWJwZGVjb2RlPiAkPFRBUkdFVF9PQkpFQ1RTOndlYnBkc3A+CisgICQ8VEFSR0VUX09CSkVDVFM6d2VicGVuY29kZT4gJDxUQVJHRVRfT0JKRUNUUzp3ZWJwdXRpbHM+KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnAgJHtXRUJQX0RFUF9MSUJSQVJJRVN9KQorCisjIE1ha2Ugc3VyZSB0aGUgT0JKRUNUIGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlCisjIChpdCBpcyBub3QgT04gYnkgZGVmYXVsdCkuCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicGRlY29kZSB3ZWJwZHNwZGVjb2RlIHdlYnB1dGlsc2RlY29kZQorICB3ZWJwZW5jb2RlIHdlYnBkc3Agd2VicHV0aWxzIFBST1BFUlRJRVMgUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTikKKworIyBCdWlsZCB0aGUgd2VicCBkZW11eCBsaWJyYXJ5LgorYWRkX2xpYnJhcnkod2VicGRlbXV4ICR7V0VCUF9ERU1VWF9TUkNTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwZGVtdXggd2VicCkKKworIyBTZXQgdGhlIHZlcnNpb24gbnVtYmVycy4KK2Z1bmN0aW9uKHBhcnNlX3ZlcnNpb24gRklMRSBOQU1FIFZBUikKKyAgZmlsZShSRUFEICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvJHtGSUxFfSBTT1VSQ0VfRklMRSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICIke05BTUV9X2xhX0xERkxBR1NbXlxuXSogLXZlcnNpb24taW5mbyBbMC05Ol0rIiBUTVAKKyAgICAke1NPVVJDRV9GSUxFfSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJbMC05Ol0rIiBUTVAgJHtUTVB9KQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiOiIgIi4iIFZFUlNJT04gJHtUTVB9KQorICBzZXQoJHtWQVJ9ICIke1ZFUlNJT059IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCitwYXJzZV92ZXJzaW9uKE1ha2VmaWxlLmFtIHdlYnAgV0VCUF9XRUJQX1NPVkVSU0lPTikKK3NldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwIFBST1BFUlRJRVMgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0KKyAgU09WRVJTSU9OICR7V0VCUF9XRUJQX1NPVkVSU0lPTn0pCitwYXJzZV92ZXJzaW9uKE1ha2VmaWxlLmFtIHdlYnBkZWNvZGVyIFdFQlBfREVDT0RFUl9TT1ZFUlNJT04pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicGRlY29kZXIgUFJPUEVSVElFUyBWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfQorICBTT1ZFUlNJT04gJHtXRUJQX0RFQ09ERVJfU09WRVJTSU9OfSkKK3BhcnNlX3ZlcnNpb24oZGVtdXgvTWFrZWZpbGUuYW0gd2VicGRlbXV4IFdFQlBfREVNVVhfU09WRVJTSU9OKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBkZW11eCBQUk9QRVJUSUVTIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059CisgIFNPVkVSU0lPTiAke1dFQlBfREVNVVhfU09WRVJTSU9OfSkKKworIyBEZWZpbmUgdGhlIGxpYnJhcmllcyB0byBpbnN0YWxsLgorc2V0KElOU1RBTExFRF9MSUJSQVJJRVMgd2VicGRlY29kZXIgd2VicCB3ZWJwZGVtdXgpCisKKyMjIyBEZWFsIHdpdGggU0lNRC4KKyMgQ2hhbmdlIHRoZSBjb21waWxlIGZsYWdzIGZvciBTSU1EIGZpbGVzIHdlIHVzZS4KK2xpc3QoTEVOR1RIIFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFIFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFX0xFTkdUSCkKK21hdGgoRVhQUiBXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERV9SQU5HRQorICAiJHtXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERV9MRU5HVEh9LTEiCispCisKK2ZvcmVhY2goSV9GSUxFIFJBTkdFICR7V0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREVfUkFOR0V9KQorICBsaXN0KEdFVCBXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERSAke0lfRklMRX0gRklMRSkKKyAgbGlzdChHRVQgV0VCUF9TSU1EX0ZMQUdTX1RPX0lOQ0xVREUgJHtJX0ZJTEV9IFNJTURfQ09NUElMRV9GTEFHKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtGSUxFfSBQUk9QRVJUSUVTCisgICAgQ09NUElMRV9GTEFHUyAke1NJTURfQ09NUElMRV9GTEFHfQorICApCitlbmRmb3JlYWNoKCkKKworIyBCdWlsZCB0aGUgZXhlY3V0YWJsZXMgaWYgYXNrZWQgZm9yLgoraWYoV0VCUF9CVUlMRF9DV0VCUCBPUiBXRUJQX0JVSUxEX0RXRUJQIE9SCisgICBXRUJQX0JVSUxEX0dJRjJXRUJQIE9SIFdFQlBfQlVJTERfSU1HMldFQlAgT1IgV0VCUF9CVUlMRF9XRUJQX0pTKQorICAjIEV4YW1wbGUgdXRpbGl0eSBsaWJyYXJ5LgorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIkVYQU1QTEVVVElMX1NSQ1MiCisgICAgImV4YW1wbGVfdXRpbF9bXiBdKiIpCisgIGxpc3QoQVBQRU5EIEVYQU1QTEVVVElMX1NSQ1MKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMvc3RvcHdhdGNoLmgpCisgIGFkZF9saWJyYXJ5KGV4YW1wbGV1dGlsICR7RVhBTVBMRVVUSUxfU1JDU30pCisKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2ltYWdlaW8gIklNQUdFSU9VVElMU19TUkNTIgorICAgICJpbWFnZWlvX3V0aWxfW14gXSoiKQorICBhZGRfbGlicmFyeShpbWFnZWlvdXRpbCAke0lNQUdFSU9VVElMU19TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGltYWdlaW91dGlsIHdlYnApCisKKyAgIyBJbWFnZS1kZWNvZGluZyB1dGlsaXR5IGxpYnJhcnkuCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbWFnZWlvICJJTUFHRURFQ19TUkNTIgorICAgICJpbWFnZWRlY19bXiBdKiIpCisgIGFkZF9saWJyYXJ5KGltYWdlZGVjICR7SU1BR0VERUNfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhpbWFnZWRlYyBpbWFnZWlvdXRpbCB3ZWJwZGVtdXggd2VicAorICAgICR7V0VCUF9ERVBfSU1HX0xJQlJBUklFU30pCisKKyAgIyBJbWFnZS1lbmNvZGluZyB1dGlsaXR5IGxpYnJhcnkuCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbWFnZWlvICJJTUFHRUVOQ19TUkNTIgorICAgICJpbWFnZWVuY19bXiBdKiIpCisgIGFkZF9saWJyYXJ5KGltYWdlZW5jICR7SU1BR0VFTkNfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhpbWFnZWVuYyB3ZWJwKQorCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgZXhhbXBsZXV0aWwgaW1hZ2Vpb3V0aWwgaW1hZ2VkZWMgaW1hZ2VlbmMKKyAgICBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0RXRUJQKQorICAjIGR3ZWJwCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTfSkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJEV0VCUF9TUkNTIgorICAgICJkd2VicCIpCisgIGFkZF9leGVjdXRhYmxlKGR3ZWJwICR7RFdFQlBfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkd2VicCBleGFtcGxldXRpbCBpbWFnZWRlYyBpbWFnZWVuYyB3ZWJwZGVjb2RlcikKKyAgaW5zdGFsbChUQVJHRVRTIGR3ZWJwIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBzZXRfcHJvcGVydHkoVEFSR0VUIGR3ZWJwIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfQ1dFQlApCisgICMgY3dlYnAKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1dFQlBfREVQX0lNR19JTkNMVURFX0RJUlN9KQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIkNXRUJQX1NSQ1MiCisgICAgImN3ZWJwIikKKyAgYWRkX2V4ZWN1dGFibGUoY3dlYnAgJHtDV0VCUF9TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGN3ZWJwIGV4YW1wbGV1dGlsIGltYWdlZGVjIHdlYnApCisgIGluc3RhbGwoVEFSR0VUUyBjd2VicCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCBjd2VicCBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0dJRjJXRUJQIEFORCBOT1QgR0lGX0ZPVU5EKQorICB1bnNldChXRUJQX0JVSUxEX0dJRjJXRUJQIENBQ0hFKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0dJRjJXRUJQIE9SIFdFQlBfQlVJTERfSU1HMldFQlApCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvbXV4ICJXRUJQX01VWF9TUkNTIgorICAgICIiKQorICBhZGRfbGlicmFyeSh3ZWJwbXV4ICR7V0VCUF9NVVhfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwbXV4IHdlYnApCisgIHBhcnNlX3ZlcnNpb24obXV4L01ha2VmaWxlLmFtIHdlYnBtdXggV0VCUF9NVVhfU09WRVJTSU9OKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicG11eCBQUk9QRVJUSUVTIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059CisgICAgU09WRVJTSU9OICR7V0VCUF9NVVhfU09WRVJTSU9OfSkKKyAgbGlzdChBUFBFTkQgSU5TVEFMTEVEX0xJQlJBUklFUyB3ZWJwbXV4KQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0dJRjJXRUJQKQorICAjIGdpZjJ3ZWJwCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXRUJQX0RFUF9HSUZfSU5DTFVERV9ESVJTfSkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJHSUYyV0VCUF9TUkNTIgorICAgICJnaWYyd2VicCIpCisgIGFkZF9leGVjdXRhYmxlKGdpZjJ3ZWJwICR7R0lGMldFQlBfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhnaWYyd2VicCBleGFtcGxldXRpbCBpbWFnZWlvdXRpbCB3ZWJwIHdlYnBtdXgKKyAgICAke1dFQlBfREVQX0dJRl9MSUJSQVJJRVN9KQorICBpbnN0YWxsKFRBUkdFVFMgZ2lmMndlYnAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgZ2lmMndlYnAgUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9JTUcyV0VCUCkKKyAgIyBpbWcyd2VicAorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSU30pCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiSU1HMldFQlBfU1JDUyIKKyAgICAiaW1nMndlYnAiKQorICBhZGRfZXhlY3V0YWJsZShpbWcyd2VicCAke0lNRzJXRUJQX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoaW1nMndlYnAgZXhhbXBsZXV0aWwgaW1hZ2VkZWMgaW1hZ2Vpb3V0aWwgd2VicCB3ZWJwbXV4KQorICBpbnN0YWxsKFRBUkdFVFMgaW1nMndlYnAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgaW1nMndlYnAgUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYgKFdFQlBfQlVJTERfV0VCUElORk8pCisgICMgd2VicGluZm8KKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1dFQlBfREVQX0lNR19JTkNMVURFX0RJUlN9KQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIldFQlBJTkZPX1NSQ1MiCisgICAgIndlYnBpbmZvIikKKyAgYWRkX2V4ZWN1dGFibGUod2VicGluZm8gJHtXRUJQSU5GT19TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBpbmZvIGV4YW1wbGV1dGlsIGltYWdlaW91dGlsKQorICBpbnN0YWxsKFRBUkdFVFMgd2VicGluZm8gUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgd2VicGluZm8gUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9XRUJQX0pTKQorICAjIEphdmFTY3JpcHQgdmVyc2lvbgorICBhZGRfZXhlY3V0YWJsZSh3ZWJwX2pzCisgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHRyYXMvd2VicF90b19zZGwuYykKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBfanMgd2VicGRlY29kZXIgU0RMKQorICBzZXQoV0VCUF9IQVZFX1NETCAxKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicF9qcyBQUk9QRVJUSUVTIExJTktfRkxBR1MKKyAgICAgICItcyBFWFBPUlRFRF9GVU5DVElPTlM9J1tcIl9XZWJwVG9TRExcIl0nIC1zIElOVk9LRV9SVU49MCBcCisgICAgICAgLXMgRVhUUkFfRVhQT1JURURfUlVOVElNRV9NRVRIT0RTPSdbXCJjd3JhcFwiXSciKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicF9qcyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHdlYnApCisgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKHdlYnBfanMgUFVCTElDIEVNU0NSSVBURU4gV0VCUF9IQVZFX1NETCkKKworICAjIFdBU00gdmVyc2lvbgorICBhZGRfZXhlY3V0YWJsZSh3ZWJwX3dhc20KKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4dHJhcy93ZWJwX3RvX3NkbC5jKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMod2VicF93YXNtIHdlYnBkZWNvZGVyIFNETCkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBfd2FzbSBQUk9QRVJUSUVTIExJTktfRkxBR1MKKyAgICAgICItcyBXQVNNPTEgLXMgJ0JJTkFSWUVOX01FVEhPRD1cIm5hdGl2ZS13YXNtXCInIFwKKyAgICAgICAtcyBFWFBPUlRFRF9GVU5DVElPTlM9J1tcIl9XZWJwVG9TRExcIl0nIC1zIElOVk9LRV9SVU49MCBcCisgICAgICAgLXMgRVhUUkFfRVhQT1JURURfUlVOVElNRV9NRVRIT0RTPSdbXCJjd3JhcFwiXSciKQorICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh3ZWJwX3dhc20gUFVCTElDIEVNU0NSSVBURU4gV0VCUF9IQVZFX1NETCkKKworICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh3ZWJwZGVjb2RlciBQVUJMSUMgRU1TQ1JJUFRFTikKK2VuZGlmKCkKKworIyBHZW5lcmF0ZSB0aGUgY29uZmlnLmggZmlsZS4KK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vY21ha2UvY29uZmlnLmguaW4KKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYy93ZWJwL2NvbmZpZy5oKQorYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKKyMgVGhlIHdlYnAgZm9sZGVyIGlzIGluY2x1ZGVkIGFzIHdlIHJlZmVyZW5jZSBjb25maWcuaCBhcworIyAuLi93ZWJwL2NvbmZpZy5oIG9yIHdlYnAvY29uZmlnLmgKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIEluc3RhbGwgdGhlIGRpZmZlcmVudCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCitpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC9kZWNvZGUuaAorICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvZGVtdXguaAorICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvZW5jb2RlLmgKKyAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL211eC5oCisgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC9tdXhfdHlwZXMuaAorICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvdHlwZXMuaAorICAgICAgICBERVNUSU5BVElPTiBpbmNsdWRlL3dlYnApCitpbnN0YWxsKFRBUkdFVFMgJHtJTlNUQUxMRURfTElCUkFSSUVTfQorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OIGxpYikKKworIyBDcmVhdGUgdGhlIENNYWtlIHZlcnNpb24gZmlsZS4KK2luY2x1ZGUoQ01ha2VQYWNrYWdlQ29uZmlnSGVscGVycykKK3dyaXRlX2Jhc2ljX3BhY2thZ2VfdmVyc2lvbl9maWxlKAorICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1dlYlBDb25maWdWZXJzaW9uLmNtYWtlIgorICBWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfQorICBDT01QQVRJQklMSVRZIEFueU5ld2VyVmVyc2lvbgorKQorCisjIENyZWF0ZSB0aGUgQ29uZmlnIGZpbGUuCitpbmNsdWRlKENNYWtlUGFja2FnZUNvbmZpZ0hlbHBlcnMpCitzZXQoQ29uZmlnUGFja2FnZUxvY2F0aW9uIHNoYXJlL1dlYlAvY21ha2UvKQorY29uZmlndXJlX3BhY2thZ2VfY29uZmlnX2ZpbGUoCisgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS9XZWJQQ29uZmlnLmNtYWtlLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9XZWJQQ29uZmlnLmNtYWtlCisgIElOU1RBTExfREVTVElOQVRJT04gJHtDb25maWdQYWNrYWdlTG9jYXRpb259CispCisKKyMgSW5zdGFsbCB0aGUgZ2VuZXJhdGVkIENNYWtlIGZpbGVzLgoraW5zdGFsbCgKKyAgRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9XZWJQQ29uZmlnVmVyc2lvbi5jbWFrZSIKKyAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9XZWJQQ29uZmlnLmNtYWtlIgorICBERVNUSU5BVElPTiAke0NvbmZpZ1BhY2thZ2VMb2NhdGlvbn0KKykKKworIyBJbnN0YWxsIHRoZSBtYW4gcGFnZXMuCitzZXQoTUFOX1BBR0VTIGN3ZWJwLjEgZHdlYnAuMSBnaWYyd2VicC4xIGltZzJ3ZWJwLjEgdndlYnAuMSB3ZWJwbXV4LjEKKyAgd2VicGluZm8uMSkKK3NldChFWEVDX0JVSUxEUyAiQ1dFQlAiICJEV0VCUCIgIkdJRjJXRUJQIiAiSU1HMldFQlAiICJWV0VCUCIgIldFQlBNVVgiCisgICJXRUJQSU5GTyIpCitsaXN0KExFTkdUSCBNQU5fUEFHRVMgTUFOX1BBR0VTX0xFTkdUSCkKK21hdGgoRVhQUiBNQU5fUEFHRVNfUkFOR0UgIiR7TUFOX1BBR0VTX0xFTkdUSH0gLSAxIikKKworZm9yZWFjaChJX01BTiBSQU5HRSAke01BTl9QQUdFU19SQU5HRX0pCisgIGxpc3QoR0VUIEVYRUNfQlVJTERTICR7SV9NQU59IEVYRUNfQlVJTEQpCisgIGlmKFdFQlBfQlVJTERfJHtFWEVDX0JVSUxEfSkKKyAgICBsaXN0KEdFVCBNQU5fUEFHRVMgJHtJX01BTn0gTUFOX1BBR0UpCisgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbWFuLyR7TUFOX1BBR0V9CisgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9zaGFyZS9tYW4vbWFuMQorICAgICAgQ09NUE9ORU5UIGRvYworICAgICkKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DT1BZSU5HIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZmOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ09QWUlORwpAQCAtMCwwICsxLDMwIEBACitDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICBkaXN0cmlidXRpb24uCisKKyAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK0hPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NoYW5nZUxvZyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQ5YWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzg1MiBAQAorOGQ1MTA3NTEgd2VicC1jb250YWluZXItc3BlYzogY29ycmVjdCBmcmFtZSBkdXJhdGlvbj0wIG5vdGUKK2U2YjIxNjRlIHZ3ZWJwOiBDb3B5IENocm9tZSdzIGJlaGF2aW9yIHcvZnJhbWUgZHVyYXRpb24gPT0gMAorZDIwYjc3MDcgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MS4wLjAtcmMzKQorMGQ1ZmFkNDYgYWRkIFdFQlBfRFNQX0lOSVQgLyBXRUJQX0RTUF9JTklUX0ZVTkMKK2MxY2I4NmFmIGZpeCAxNmIgb3ZlcmZsb3cgaW4gU1NFMgorZTU3N2ZlYjcgbWFrZWZpbGUudW5peDogYWRkIERFQlVHIGZsYWcgZm9yIGNvbXBpbGluZyB3LyBkZWJ1Zy1zeW1ib2wKKzk5YmUzNGIzIGN3ZWJwLGdldF9kaXN0bzogZml4IGJwcCBvdXRwdXQKK2Y1NTY1Y2E4IGNtYWtlOiBNYWtlIHN1cmUgd2UgdXNlIG5lYXItbG9zc2xlc3MgYnkgZGVmYXVsdC4KK2Q4OThkYzE0IGZpeCBidWcgaW4gV2ViUEltcG9ydDU2NTogYWxwaGEgdmFsdWUgd2FzIG5vdCBzZXQKKzg4Mjc4NGIwIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjEuMC4wLXJjMikKKzJmOTMwZTA4IFJldmVydCAiVXNlIHByb3BlciB0YXJnZXRzIGZvciBDTWFrZS4iCis4MTY1ZThmYiBVc2UgcHJvcGVyIHRhcmdldHMgZm9yIENNYWtlLgorM2YxNTdkZDUgUmVtb3ZlIHNvbWUgdmVyeSBoYXJkIFRPRE9zLgorY2Q3NThhMTcge2RlLH1tdXgvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIGhlYWRlcnMKK2I4OTJiOGJhIG1ha2VmaWxlLnVuaXgsZGlzdDogdXNlIGFzY2lpIGZvciB0ZXh0IG91dHB1dAorNjRhNTdkMDUgYWRkIC12ZXJzaW9uIG9wdGlvbiB0byBhbmltX2R1bXAsYW5pbV9kaWZmIGFuZCBpbWcyd2VicAorZmMxYjhlM2Egd2VicF9qczogZml4IHdlYnBfanMgZGVtbyBodG1sCisxNWFhNDhkOSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYxLjAuMC1yYzEpCitlNjA3ZGFiYyB1cGRhdGUgQVVUSE9SUworMzg0MTBjMDggW0NGSV0gUmVtb3ZlIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdHMKK2M1N2IyNzM2IGJ1bXAgdmVyc2lvbiB0byAxLjAuMAorY2JhMjg4NTMgdXBkYXRlIE5FV1MKK2M5MDlkNTMxIE1lcmdlICJyZW1vdmUgc29tZSBkZXByZWNhdGlvbiB3YXJuaW5nIG9uIE1hY09TWCIKKzIxNzQ0M2M3IHJlbW92ZSBzb21lIGRlcHJlY2F0aW9uIHdhcm5pbmcgb24gTWFjT1NYCitiNjcyYmRmYSBjb25maWd1cmU6IHF1aWV0IGdsdXQgZGVwcmVjYXRpb24gd2FybmluZ3Mgb24gT1MgWAorZGFhOWZjYWYgY29uZmlndXJlOiB1c2Ugc2RsLWNvbmZpZyBpZiBhdmFpbGFibGUKK2RkMTc0Y2FlIE1lcmdlICJpbWFnZWRlYzogc3VwcG9ydCBtZXRhZGF0YSByZWFkaW5nIGZvciBXZWJQIGltYWdlIGRlY29kaW5nIgorNjQxY2VkY2MgaW1hZ2VkZWM6IHN1cHBvcnQgbWV0YWRhdGEgcmVhZGluZyBmb3IgV2ViUCBpbWFnZSBkZWNvZGluZworMDY1YjJjZTEgYW5pbV9kaWZmOiBhZGQgYSBjb3VwbGUgbWlzc2luZyBuZXdsaW5lcyBpbiBIZWxwKCkKK2M0Y2MxMTQ3IE1lcmdlICJnaWYyd2VicDogZm9yY2UgbG93IGR1cmF0aW9uIGZyYW1lcyB0byAxMDBtcyIKKzA5MzMzMDk3IGdpZjJ3ZWJwOiBmb3JjZSBsb3cgZHVyYXRpb24gZnJhbWVzIHRvIDEwMG1zCitlMDNmMGVjMyBzaGFycF95dXY6IHVzZSAxNGIgZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBnYW1tYQorYjJkYjM2MWMgaW1hZ2VfZW5jLFdlYlBXcml0ZVBORzogbW92ZSBsb2NhbHMgYWZ0ZXIgc2V0am1wCis3NGU4MmVjNiBNZXJnZSAiV2ViUFBpY3R1cmVEaXN0b3J0aW9uOiBmaXggYmlnLWVuZGlhbiByZXN1bHRzIG9yZGVyIgorNjQ1ZDA0Y2EgTWVyZ2UgImN3ZWJwLGdldF9kaXN0bzogcmVwb3J0IGJwcCIKKzEyMGY1OGMzIE1lcmdlICJsb3NzbGVzcypzc2UyOiBpbXByb3ZlIG5vbi1jb25zdCAxNi1iaXQgdmVjdG9yIGNyZWF0aW9uIgorYTdmZTk0MTIgV2ViUFBpY3R1cmVEaXN0b3J0aW9uOiBmaXggYmlnLWVuZGlhbiByZXN1bHRzIG9yZGVyCitlMjZmZTA2NiBjd2VicCxnZXRfZGlzdG86IHJlcG9ydCBicHAKKzlkZjY0ZTI4IE1lcmdlIGNoYW5nZXMgSWQ1YjRhMWE0LElhMjBjZTg0NAorODA0MzUwNGYgbG9zc2xlc3Mqc3NlMjogaW1wcm92ZSBub24tY29uc3QgMTYtYml0IHZlY3RvciBjcmVhdGlvbgorMWUzZGZjNDggSW1wb3J0OiBleHRyYWN0IGNvbmRpdGlvbiBmcm9tIGxvb3AKKzNiMDdkMzI3IEltcG9ydCxSR0JBOiBmaXggZm9yIEJpZ0VuZGlhbiBpbXBvcnQKKzU1MTk0OGU0IFJlbW92ZSB1bnVzZWQgYXJndW1lbnQgaW4gVlA4TEJpdHNFbnRyb3B5LgorMzAwNTIzN2EgUmVhZFdlYlA6IGZpeCBmb3IgYmlnLWVuZGlhbgorNDk5YzM5NWEgTWVyZ2UgImFuaW1fZGlmZjogZXhwb3NlIHRoZSAtbWF4X2RpZmYgb3B0aW9uIgorZjY5ZGNkNjkgTWVyZ2UgInJlbW92ZSBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUyIKKzA3ZDg4NGQ1IGFuaW1fZGlmZjogZXhwb3NlIHRoZSAtbWF4X2RpZmYgb3B0aW9uCitmNGRkOTI1NiByZW1vdmUgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKKzk0YTgzNzdiIGV4dHJhY3QgdGhlIGNvbW1hbmQtbGluZSBwYXJzaW5nIGhlbHBlcnMgdG8gZXhhbXBsZV91dGlsCitmYzA5ZTZlMiBQTk0gZGVjb2RlcjogcHJldmVudCB1bnN1cHBvcnRlZCBkZXB0aD0yIFBBTSBjYXNlLgorNmRlNTg2MDMgTUlQUzY0OiBGaXggZGVmaW5lZC1idXQtbm90LXVzZWQgZXJyb3JzIHdpdGggV0VCUF9SRURVQ0VfQ1NQCitjYmRlNTcyOCBnaWYyd2VicDogYWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgZnJvbSBzdGRpbgorY2YxYzUwNTQgQWRkIGFuIFNTRTQgdmVyc2lvbiBvZiBzb21lIGxvc3NsZXNzIGNvbG9yIHRyYW5zZm9ybXMuCis0NWE4YjVlYiBGaXggbGludCBlcnJvciB3aXRoIG1hbiBwYWdlLgorY2ZmMzhlOGYgTWVyZ2UgIlBORyBkZWNvZGVyOiBoYW5kbGUgZ0FNQSBjaHVuayIKKzU5Y2IxYTQ4IE1lcmdlICJlbmFibGUgZGMgZXJyb3ItZGlmZnVzaW9uIGFsd2F5cyIKKzc4MzE4YjMwIFBORyBkZWNvZGVyOiBoYW5kbGUgZ0FNQSBjaHVuaworNjY0YzIxZGQgTWVyZ2UgInJlbW92ZSBzb21lIFRPRE9zIgorODE1NjUyZGUgZW5hYmxlIGRjIGVycm9yLWRpZmZ1c2lvbiBhbHdheXMKK2FlYzQ1Y2VjIHJlbW92ZSBzb21lIFRPRE9zCis1NzE1ZGZjZSBmaXggYmxvY2stY291bnRbXSBpbmNyZW1lbnQgaW4gY2FzZSBvZiBsYXJnZSBpbWFnZQorYzJkMDRmM2UgZW5hYmxlIERDIGVycm9yLWRpZmZ1c2lvbiBhbHdheXMgZm9yIG11bHRpLXBhc3MKKzk2YmYwN2M1IHVzZSBEQyBlcnJvciBkaWZmdXNpb24gZm9yIFUvViBhdCBsb3ctcXVhbGl0eQorMWM1OTAyMGIgZml4IG1pc3Npbmcgc3NlNDEgdGFyZ2V0cyBpbiBtYWtlZmlsZS51bml4Cis3YThlODE0YiBjb3NtZXRpY3M6IHMvY29sb3Jfc3BhY2UvY29sb3JzcGFjZS8KKzA1ZjZmZTI0IHVwc2FtcGxpbmc6IHJtIGFzc2VydHMgdy9SRURVQ0VfQ1NQK09NSVRfQ19DT0RFCitiNGNmNTU5NyBNZXJnZSAiVXBzYW1wbGluZyBTU0UyL1NTRTQgc3BlZWR1cC4iCitjY2JlYjMyYyBNYWtlZmlsZS52YzogYWRkIG1pc3Npbmcgc3NlNDEgZmlsZXMKKzU1NDAzYTlhIFVwc2FtcGxpbmcgU1NFMi9TU0U0IHNwZWVkdXAuCis4MDdiNTNjNCBJbXBsZW1lbnQgdGhlIHVwc2FtcGxpbmcveXV2IGZ1bmN0aW9ucyBpbiBTU0U0MQorODQxMDFhODEgRml4IHdhc20gV2ViUCBjb21waWxhdGlvbgorOGJlYmQyYTMgZml4IHdhcm5pbmcgb24gTVNWQworYTdmOTNmZTMgd2VicG11eDogYWxsb3cgcmVhZGluZyBhcmd1bWVudCBmcm9tIGEgZmlsZQorYjY5ZjE4YTcgZ2lmMndlYnAuMTogZml4IC1sb29wX2NvbXBhdGliaWxpdHkgbGF5b3V0Cis3MmQ1MzBjMCBNZXJnZSAiZml4IGxvc3NsZXNzIGRlY29kaW5nIHcvV0VCUF9SRURVQ0VfU0laRSIKKzI5NmM3ZGM0IGZpeCBsb3NzbGVzcyBkZWNvZGluZyB3L1dFQlBfUkVEVUNFX1NJWkUKKzBkNWQwMjljIE1lcmdlICJJbWdJb1V0aWxSZWFkRmlsZTogZml4IGZpbGUgbGVhayB1cG9uIGVycm9yIgorYWU1NjhjZTcgSW1nSW9VdGlsUmVhZEZpbGU6IGZpeCBmaWxlIGxlYWsgdXBvbiBlcnJvcgorNzk2YjVhOGEgTWVyZ2UgdGFnICd2MC42LjEnCis2YjdhOTVmZCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjYuMSkKK2Y2Njk1NWRlIFdFQlBfUkVEVUNFX0NTUDogcmVzdHJpY3QgY29sb3JzcGFjZSBzdXBwb3J0CisxYWYwZGY3NiBNZXJnZSAiV0VCUF9SRURVQ0VfQ1NQOiByZXN0cmljdCBjb2xvcnNwYWNlIHN1cHBvcnQiCis2ZGUyMGRmMCBXRUJQX1JFRFVDRV9DU1A6IHJlc3RyaWN0IGNvbG9yc3BhY2Ugc3VwcG9ydAorYTI4OWQ4ZTcgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC42LjEtcmMyKQorYzEwYTQ5M2MgdndlYnA6IGRpc2FibGUgZG91YmxlIGJ1ZmZlcmluZyBvbiB3aW5kb3dzICYgbWFjCiswZDQ0NjZjMiB3ZWJwX3RvX3NkbC5jOiBmaXggZmlsZSBtb2RlCisxYjI3YmY4YiBXRUJQX1JFRFVDRV9TSVpFOiBkaXNhYmxlIGFsbCByZXNjYWxlciBjb2RlCisxMjZiZTEwOSB3ZWJwaW5mbzogYWRkIC12ZXJzaW9uIG9wdGlvbgorMGRmMjJiOWUgV0VCUF9SRURVQ0VfU0laRTogZGlzYWJsZSBhbGwgcmVzY2FsZXIgY29kZQorOWFkZDYyYjUgYnVtcCB2ZXJzaW9uIHRvIDAuNi4xCitkM2UyNjE0NCB1cGRhdGUgTkVXUworMmVkZGE2MzkgUkVBRE1FOiBhZGQgd2VicGluZm8gc2VjdGlvbgorOWNhNTY4ZWYgTWVyZ2UgInJpZ2h0LXNpemUgc29tZSB0YWJsZXMiCiszMWYxOTk1YyBNZXJnZSAiU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBIYXNBbHBoYVhYWCIKK2E4MGM0NmJkIFNTRTIgaW1wbGVtZW50YXRpb24gb2YgSGFzQWxwaGFYWFgKKzA4MzUwN2YyIHJpZ2h0LXNpemUgc29tZSB0YWJsZXMKKzJlNTc4NWIyIGFuaW1fdXRpbHMuYzogcmVtb3ZlIHdhcm5pbmcgd2hlbiAhZGVmaW5lZChXRUJQX0hBVkVfR0lGKQorYjI5OWM0N2UgYWRkIFdFQlBfUkVEVUNFX1NJWkUKK2Y1OTNkNzFhIGVuYzogZGlzYWJsZSBwaWMtPnN0YXRzL2V4dHJhX2luZm8gdy9XRUJQX0RJU0FCTEVfU1RBVFMKKzU0MTE3OWE5IE1lcmdlICJwcmVkaWN0b3JfZW5jOiBmaXggYnVpbGQgdy8tLWRpc2FibGUtbmVhci1sb3NzbGVzcyIKKzU3NTVhN2VjIHByZWRpY3Rvcl9lbmM6IGZpeCBidWlsZCB3Ly0tZGlzYWJsZS1uZWFyLWxvc3NsZXNzCitlYWI1YmFiNyBhZGQgV0VCUF9ESVNBQkxFX1NUQVRTCis4MDUyYzU4NSByZW1vdmUgc29tZSBwZXR0eSBUT0RPcyBmcm9tIHZ3ZWJwLgorYzI0NTM0M2QgbW92ZSBMT0FEOHg0IGFuZCBTVE9SRTh4MiBjbG9zZXIgdG8gdGhlaXIgdXNlIGxvY2F0aW9uCitiOWU3MzRmZCBkZWMsY29zbWV0aWNzOiBub3JtYWxpemUgZnVuY3Rpb24gbmFtaW5nIHN0eWxlCitjMTg4ZDU0NiBkZWM6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworMjhjNWFjODEgZGVjX3NzZTQxOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2U2NWI3MmEzIE1lcmdlICJpbnRyb2R1Y2UgV2ViUEhhc0FscGhhOGIgYW5kIFdlYlBIYXNBbHBoYTMyYiIKK2I5NGNlZTk4IGRlY19zc2UyOiByZW1vdmUgSEU4dXZfU1NFMgorNDRhMGVlM2YgaW50cm9kdWNlIFdlYlBIYXNBbHBoYThiIGFuZCBXZWJQSGFzQWxwaGEzMmIKK2FlYmY1OWFjIE1lcmdlICJXZWJQUGljdHVyZUFsbG9jQVJHQjogYWxpZ24gYXJnYiBhbGxvY2F0aW9uIgorYzE4NDY2NWUgV2ViUFBpY3R1cmVBbGxvY0FSR0I6IGFsaWduIGFyZ2IgYWxsb2NhdGlvbgorM2RhZjc1MDkgV2ViUFBhcnNlSGVhZGVyczogcmVtb3ZlIG9ic29sZXRlIGFuaW1hdGlvbiBUT0RPCis4MDI4NWQ5NyBjbWFrZTogYXZvaWQgc2VjdXJpdHkgd2FybmluZ3MgdW5kZXIgbXN2YworNjUwZWFjNTUgY21ha2U6IGRvbid0IHNldCAtV2FsbCB3aXRoIE1TVkMKK2M0NjJjZDAwIFJlbW92ZSB1c2VsZXNzIGNvZGUuCiswMWE5ODIxNyBNZXJnZSAicmVtb3ZlIFdlYlBXb3JrZXJJbXBsIGRlY2xhcmF0aW9uIGZyb20gdGhlIGhlYWRlciIKKzNjNDlmYzQ3IE1lcmdlICJ0aHJlYWRfdXRpbHM6IGZpeCBwb3RlbnRpYWxseSBiYWQgY2FsbCB0byBFeGVjdXRlIgorZmRlMjc4MmUgdGhyZWFkX3V0aWxzOiBmaXggcG90ZW50aWFsbHkgYmFkIGNhbGwgdG8gRXhlY3V0ZQorMmEyNzBjMWQgcmVtb3ZlIFdlYlBXb3JrZXJJbXBsIGRlY2xhcmF0aW9uIGZyb20gdGhlIGhlYWRlcgorZjFmNDM3Y2MgcmVtb3ZlIG1lbnRpb24gb2YgJ2xvc3N5LW9ubHkgcGFyYW1ldGVycycgZnJvbSB0aGUgZG9jCiszODc5MDc0ZCBNZXJnZSAiV2ViUE1lbVRvVWludDMyOiByZW1vdmUgcHRyIGNhc3QgdG8gaW50IgorMDRiMDI5ZDIgV2ViUE1lbVRvVWludDMyOiByZW1vdmUgcHRyIGNhc3QgdG8gaW50CitiNzk3MWQwZSBkc3A6IGF2b2lkIGRlZmluaW5nIF9DIGZ1bmN0aW9ucyB3L05FT04gYnVpbGRzCis2YmE5ODc2NCB3ZWJwZGVjOiBjb3JyZWN0IGFsbG9jIHNpemUgY2hlY2sgdy91c2VfYXJnYgorNWNmYjNiMGYgbm9ybWFsaXplIGluY2x1ZGUgZ3VhcmRzCitmNDMzMjA1ZSBNZXJnZSBjaGFuZ2VzIElhMTdjN2RmYyxJNzU0MjNhYmIsSWEyZjcxNmI0LEkxNjFjYWExNCxJNDIxMDA4MWEsIC4uLgorOGQwMzNiMTQge2RlYyxlbmN9X25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcyB4MgorMDI5NWU5ODEgdXBzYW1wbGluZ19uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2Q1NzJjNGU1IHl1dl9uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2FiOWMyNTAwIHJlc2NhbGVyX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworOTNlMGNlMjcgbG9zc2xlc3NfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCisyMmZiYzUwZSBsb3NzbGVzc19lbmNfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCis0NDc4NzViNCBmaWx0ZXJzX25lb24sY29zbWV0aWNzOiBmaXggaW5kZW50CitlNTFiZGQ0MyByZW1vdmUgdW51c2VkIFZQOFRva2VuVG9TdGF0cygpIGZ1bmN0aW9uCis3ODVkYTdlYSBlbmNfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitiYzFhMjUxZiBkZWNfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCis2MWU1MzVmMSBkc3AvbG9zc2xlc3M6IHdvcmthcm91bmQgZ2NjLTQuOCBidWcgb24gYXJtCis2OGIyZWFiNyBjd2VicDogZml4IGFscGhhIHJlcG9ydGluZyB3L2xvc3NsZXNzICYgbWV0YWRhdGEKKzMwMDQyZmFhIFdlYlBEZW11eEdldEk6IGFkZCBkb2MgZGV0YWlscyBhcm91bmQgV2ViUEZvcm1hdEZlYXR1cmUKKzBhMTdmNDcxIE1lcmdlICJXSVA6IGxpc3QgaW5jbHVkZXMgYXMgZGVzY2VuZGFudHMgb2YgdGhlIHByb2plY3QgZGlyIgorYTQzOTk3MjEgV0lQOiBsaXN0IGluY2x1ZGVzIGFzIGRlc2NlbmRhbnRzIG9mIHRoZSBwcm9qZWN0IGRpcgorMDgyNzU3MDggTWVyZ2UgIk1ha2Ugc3VyZSB3ZSByZWFjaCB0aGUgZnVsbCByYW5nZSBmb3IgYWxwaGEgYmxlbmRpbmcuIgorZDM2MWE2YTcgeXV2X3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworNjkyMWFhNmYgdXBzYW1wbGluZ19zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzA4YzY3ZDNlIHNzaW1fc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCis1ODJhMWI1NyByZXNjYWxlcl9zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzJjMWIxOGJhIGxvc3NsZXNzX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworMGFjNDZlODEgbG9zc2xlc3NfZW5jX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworYmM2MzRkNTcgZW5jX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworYmNiNzM0N2MgZGVjX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworZTE0YWQ5M2MgTWFrZSBzdXJlIHdlIHJlYWNoIHRoZSBmdWxsIHJhbmdlIGZvciBhbHBoYSBibGVuZGluZy4KKzcwMzhjYThkIGRlbXV4LFN0b3JlRnJhbWU6IHJlc3RvcmUgaGRyIHNpemUgY2hlY2sgdG8gbWluIHJlcQorZmIzZGFhZDYgY3B1OiBmaXggc3NzZTMgY2hlY2sKK2JlNTkwZTA2IE1lcmdlICJGaXggQ01ha2UgcmVkZWZpbml0aW9uIGZvciBIQVZFX0NQVV9GRUFUVVJFU19IIgorMzVmNzM2ZTEgRml4IENNYWtlIHJlZGVmaW5pdGlvbiBmb3IgSEFWRV9DUFVfRkVBVFVSRVNfSAorYTUyMTZlZmMgRml4IGludGVnZXIgb3ZlcmZsb3cgd2FybmluZy4KK2E5Yzg5MTZiIGRlY29kZS5oLFdlYlBJRGVjR2V0UkdCOiBjbGFyaWZ5IG91dHB1dCBwdHIgdmFsaWRpdHkKKzNjNzRjNjQ1IGdpZjJ3ZWJwOiBoYW5kbGUgMS1mcmFtZSBjYXNlIHByb3Blcmx5ICsgZml4IGFuaW1fZGlmZgorYzdmMjk1ZDMgTWVyZ2UgImdpZjJ3ZWJwOiBpbnRyb2R1Y2UgLWxvb3BfY29tcGF0aWJpbGl0eSBvcHRpb24iCitiNGUwNDY3NyBnaWYyd2VicDogaW50cm9kdWNlIC1sb29wX2NvbXBhdGliaWxpdHkgb3B0aW9uCitmNzhkYTNkZSBhZGQgTE9DQUxfQ0xBTkdfUFJFUkVRIGFuZCBhdm9pZCBXT1JLX0FST1VORF9HQ0Mgdy8zLjgrCiswMWM0MjZmMSBkZWZpbmUgV0VCUF9VU0VfSU5UUklOU0lDUyB3L2djYy00LjkrCis4NjM1OTczZCB1c2Ugc2RsLWNvbmZpZyAoaWYgYXZhaWxhYmxlKSB0byBkZXRlcm1pbmUgdGhlIGxpbmsgZmxhZ3MKK2U5NDU5MzgyIHVzZSBDUFBGTEFHUyBiZWZvcmUgQ0ZMQUdTCis0YTlkNzg4ZSBNZXJnZSAiQW5kcm9pZC5tayxtaXBzOiBmaXggY2xhbmcgYnVpbGQgd2l0aCByMTUiCis0ZmJkYzlmYiBBbmRyb2lkLm1rLG1pcHM6IGZpeCBjbGFuZyBidWlsZCB3aXRoIHIxNQorYTgwZmNjNGEgaWZkZWYgY29kZSBub3QgdXNlZCBieSBDaHJvbWUvQW5kcm9pZC4KKzM5OTNhZjEyIEZpeCBzaWduZWQgaW50ZWdlciBvdmVyZmxvd3MuCitmNjZmOTRlZiBhbmltX2R1bXA6IHNtYWxsIHRvb2wgdG8gZHVtcCBmcmFtZXMgZnJvbSBhbmltYXRlZCBXZWJQCis2ZWJhODU3YiBNZXJnZSAicmF0aW9uYWxpemUgdGhlIE1ha2VmaWxlLmFtIgorYzVlMzRmYmEgZnVuY3Rpb24gZGVmaW5pdGlvbiBjbGVhbnVwCiszODIyNzYyYSByYXRpb25hbGl6ZSB0aGUgTWFrZWZpbGUuYW0KKzUwMWVmNmU0IGNvbmZpZ3VyZSBzdHlsZSBmaXg6IGFuaW1kaWZmIC0+IGFuaW1fZGlmZgorZjhiZGMyNjggTWVyZ2UgInByb3RlY3QgYWdhaW5zdCBOVUxMIGR1bXBfZm9sZGVyW10gdmFsdWUgaW4gUmVhZEFuaW1hdGVkSW1hZ2UoKSIKKzIzYmZjNjUyIHByb3RlY3QgYWdhaW5zdCBOVUxMIGR1bXBfZm9sZGVyW10gdmFsdWUgaW4gUmVhZEFuaW1hdGVkSW1hZ2UoKQorOGRjM2Q3MWIgY29zbWV0aWNzLFJlYWRBbmltYXRlZFdlYlA6IGNvcnJlY3QgZnVuY3Rpb24gY29tbWVudAorNWJkNDAwNjYgTWVyZ2UgY2hhbmdlcyBJNjZhNjRhMGEsSTRkMmU1MjBmCis3OTQ1NTc1YyBjb3NtZXRpY3Msd2VicGluZm86IHJlbW92ZSBhbiBlbHNlIGFmdGVyIGEgcmV0dXJuCis4NzI5ZmExMSBjb3NtZXRpY3MsY3dlYnA6IHJlbW92ZSBhbiBlbHNlIGFmdGVyIGEgcmV0dXJuCitmMzI0YjdmOSBjb3NtZXRpY3M6IG5vcm1hbGl6ZSBmbiBwcm90byAmIGRlY2wgcGFyYW0gbmFtZXMKKzg2OWViMzY5IENNYWtlIGNsZWFudXBzLgorMjg5ZTYyYTMgUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIHVuaW1wbGVtZW50ZWQgVlA4QXBwbHlOZWFyTG9zc2xlc3NQcmVkaWN0CisyMGE5NDE4NiBwbm1kZWMsUEFNOiB2YWxpZGF0ZSBkZXB0aCBiZWZvcmUgY2FsY3VsYXRpbmcgYnl0ZXNfcGVyX3B4CiszNDEzMGFmZSBhbmltX2VuY29kZTogZml4IGludGVnZXIgb3ZlcmZsb3cKKzQyYzc5YWE2IE1lcmdlICJFbmNvZGVyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMiCitiMDkzMDdkYyBFbmNvZGVyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2JlZDA0NTZkIE1lcmdlICJTU0lNOiBoYXJtb25pemUgdGhlIGZ1bmN0aW9uIHN1ZmZpeCIKKzU0ZjZhM2NmIGxvc3NsZXNzX3NzZTIuYzogZml4IHNvbWUgbWlzc2VkIHN1ZmZpeCBjaGFuZ2VzCiswODhmMWRjYyBTU0lNOiBoYXJtb25pemUgdGhlIGZ1bmN0aW9uIHN1ZmZpeAorODZmYzRkZDkgd2VicGRlYzogdXNlIEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93CiswOGVhOWVjZCBpbWFnZWlvOiBhZGQgYWJpbGl0eSByZXN0cmljdCBtYXggaW1hZ2Ugc2l6ZQorNmY5ZGFhNGEganBlZ2RlYyxSZWFkRXJyb3I6IGZpeCBsZWFrcyBvbiBlcnJvcgorYTBmNzJhNGYgVlA4TFRyYW5zZm9ybUNvbG9yRnVuYzogZHJvcCBhbiBub24tcmVzcGVjdGVkICdjb25zdCcgZnJvbSB0aGUgc2lnbmF0dXJlLgorOGM5MzQ5MDIgTWVyZ2UgIkxvc3Nlc3MgZGVjOiBoYXJtb25pemUgdGhlIGZ1bmN0aW9uIHN1ZmZpeGVzIgorNjIyMjQyYWEgTG9zc2VzcyBkZWM6IGhhcm1vbml6ZSB0aGUgZnVuY3Rpb24gc3VmZml4ZXMKKzE0MTFmMDI3IExvc3NsZXNzIEVuYzogaGFybW9uaXplIHRoZSBmdW5jdGlvbiBzdWZmaXhlcworMjRhZDJlM2MgYWRkIGNvbnN0IHRvIHR3byB2YXJpYWJsZXMKKzQ2ZWZlMDYyIE1lcmdlICJBbGxvdyB0aGUgbG9zc2xlc3MgY3J1bmNoZXIgdG8gd29yayBmb3IgYWxwaGEuIgorOGMzZjlhNDcgU3BlZWQtdXAgTFo3Ny4KKzFhZWY0YzcxIEFsbG93IHRoZSBsb3NzbGVzcyBjcnVuY2hlciB0byB3b3JrIGZvciBhbHBoYS4KK2I4ODIxZGJkIEltcHJvdmUgdGhlIGJveCBMWjc3IHNwZWVkLgorN2JlZWQyODAgYWRkIG1pc3NpbmcgKClzIHRvIG1hY3JvIHBhcmFtZXRlcnMKKzY0NzNkMjBiIE1lcmdlICJmaXggQW5kcm9pZCBzdGFuZGFsb25lIHRvb2xjaGFpbiBidWlsZCIKK2RjZWZlZDk1IE1lcmdlICJidWlsZC5ncmFkbGU6IGZpeCBhcm02NCBidWlsZCIKKzBjODNhOGJjIE1lcmdlICJ5dXY6IGhhcm1vbml6ZSBzdWZmaXggbmFtaW5nIgorYzZkMWRiNGIgZml4IEFuZHJvaWQgc3RhbmRhbG9uZSB0b29sY2hhaW4gYnVpbGQKKzY2M2E2ZDlkIHVuaWZ5IHRoZSBBTFRFUk5BVEVfQ09ERSBmbGFnIHVzYWdlCis3M2VhOWYyNyB5dXY6IGhhcm1vbml6ZSBzdWZmaXggbmFtaW5nCitjNzFiNjhhYyBidWlsZC5ncmFkbGU6IGZpeCBhcm02NCBidWlsZAorYzQ1NjhiNDcgUmVzY2FsZXI6IGhhcm1vbml6ZSB0aGUgc3VmZml4IG5hbWluZworNmNiMTNiMDUgTWVyZ2UgImFscGhhX3Byb2Nlc3Npbmc6IGhhcm1vbml6ZSB0aGUgbmFtaW5nIHN1ZmZpeGVzIHRvIGJlIF9DKCkiCis4M2EzZTY5YSBNZXJnZSAic2ltcGxpZnkgV0VCUF9FWFRFUk4gbWFjcm8iCis3Mjk1ZmRlMiBNZXJnZSAiZmlsdGVyczogaGFybW9uaXplIHRoZSBzdWZmaXhlcyBuYW1pbmcgdG8gX1NTRTIoKSwgX0MoKSwgZXRjLiIKKzhlNDJiYTRjIHNpbXBsaWZ5IFdFQlBfRVhURVJOIG1hY3JvCiszMzFhYjM0YiBjb3N0Ki5jOiBoYXJtb25pemUgdGhlIHN1ZmZpeCBuYW1pbmdzCitiMTYxZjY3MCBmaWx0ZXJzOiBoYXJtb25pemUgdGhlIHN1ZmZpeGVzIG5hbWluZyB0byBfU1NFMigpLCBfQygpLCBldGMuCitkZWM1ZTRkMyBhbHBoYV9wcm9jZXNzaW5nOiBoYXJtb25pemUgdGhlIG5hbWluZyBzdWZmaXhlcyB0byBiZSBfQygpCis2ODc4ZDQyNyBmaXggbWVtb3J5IGxlYWsgaW4gU0RMX0luaXQoKQorNDYxYWU1NTUgTWVyZ2UgImNvbmZpZ3VyZTogZml4IHdhcm5pbmdzIGluIHNkbCBjaGVjayIKKzYyNDg2YTIyIGNvbmZpZ3VyZTogdGVzdCBmb3IgLVd1bmRlZgorOTI5ODI2MDkgZHNwLmg6IGZpeCAtV3VuZGVmIHcvX19taXBzX2RzcF9yZXYKKzAyNjVjZWRlIGNvbmZpZ3VyZTogZml4IHdhcm5pbmdzIGluIHNkbCBjaGVjaworODhjNzNkOGEgYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaDogZml4IFdJTkRPV19TSVpFX0JJVFMgY2hlY2sKKzRlYTQ5ZjZiIHJlc2NhbGVyX3NzZTIuYzogZml4IFdFQlBfUkVTQ0FMRVJfRklYIC0+IF9SRklYIHR5cG8KKzFiNTI2NjM4IENsZWFuLXVwIHNvbWUgQ01ha2UKKzg3ZjU3YTRiIE1lcmdlICJjbWFrZTogZml4IGdpZiBsaWIgZGV0ZWN0aW9uIHdoZW4gY3Jvc3MgY29tcGlsaW5nIgorYjM0YTlkYjEgY29zbWV0aWNzLGRlY19zc2UyOiByZW1vdmUgc29tZSByZWR1bmRhbnQgY29tbWVudHMKKzQ3MWM1NzU1IGNtYWtlOiBmaXggZ2lmIGxpYiBkZXRlY3Rpb24gd2hlbiBjcm9zcyBjb21waWxpbmcKK2M3OTM0MTdhIGNtYWtlOiBkaXNhYmxlIGdpZjJ3ZWJwIGlmIGdpZiBsaWIgaXNuJ3QgZm91bmQKK2RjYmMxYzg4IGNtYWtlOiBzcGxpdCBnaWYgZGV0ZWN0aW9uIGZyb20gSU1HIGRlcHMKKzY2YWQ4NGYwIE1lcmdlICJtdXhyZWFkOiByZW1vdmUgdW5yZWFjaGFibGUgY29kZSIKKzUwZWMzYWI3IG11eHJlYWQ6IHJlbW92ZSB1bnJlYWNoYWJsZSBjb2RlCis3ZDY3YTE2NCBMb3NzeSBlbmNvZGluZzogc21vb3RoZW4gdHJhbnNwYXJlbnQgYXJlYXMgdG8gaW1wcm92ZSBjb21wcmVzc2lvbgorZTUwNjUwYzcgTWVyZ2UgImZpeCBzaWduYXR1cmUgZm9yIERJU0FCTEVfVE9LRU5fQlVGRkVSIGNvbXBpbGF0aW9uIgorNjcxZDI1NjcgZml4IHNpZ25hdHVyZSBmb3IgRElTQUJMRV9UT0tFTl9CVUZGRVIgY29tcGlsYXRpb24KK2Q2NzU1NTgwIGNwdS5jbWFrZTogdXNlIHVuaXF1ZSBmbGFnIHRvIHRlc3Qgc2ltZCBkaXNhYmxlIGZsYWdzCisyODkxNDUyOCBNZXJnZSAiUmVtb3ZlIHRoZSBhcmdiKiBmaWxlcy4iCis4YWNiNDk0MiBSZW1vdmUgdGhlIGFyZ2IqIGZpbGVzLgorM2I2MjM0N2IgUkVBRE1FOiBjb3JyZWN0IGNtYWtlIGludm9jYXRpb24gbm90ZQorN2NhMGRmMTMgSGF2ZSB0aGUgU1NFMiB2ZXJzaW9uIG9mIFBhY2tBUkdCIHVzZSBjb21tb24gY29kZS4KKzdiMjUwNDU5IE1lcmdlICJSZS11c2UgdGhlIHRyYW5zZm9ybWVkIGltYWdlIHdoZW4gdHJ5aW5nIHNldmVyYWwgTFo3NyBpbiBsb3NzbGVzcy4iCitlMTMyMDcyZiBSZS11c2UgdGhlIHRyYW5zZm9ybWVkIGltYWdlIHdoZW4gdHJ5aW5nIHNldmVyYWwgTFo3NyBpbiBsb3NzbGVzcy4KKzVkN2E1MGVmIEdldCBjb2RlIHRvIGNvbXBpbGUgaW4gQysrLgorN2IwMTI5ODcgY29uZmlndXJlOiB0ZXN0IGZvciAtV3BhcmVudGhlc2VzLWVxdWFsaXR5CitmMDU2OWFkYiBGaXggbWFuIHBhZ2VzIGZvciBtdWx0aS10aHJlYWRpbmcuCitmMWQ1YTM5NyBtdWx0aXRocmVhZCBjcnVuY2hlcjogb25seSBjb3B5IHN0YXRzIHdoZW4gcGljdHVyZS0+c3RhdHMgIT0gTlVMTAorZjhjMmFjMTUgTXVsdGktdGhyZWFkIHRoZSBsb3NzbGVzcyBjcnVuY2hlci4KK2E4OGM2NTIyIE1lcmdlICJJbnRlZ3JhdGUgYSBuZXcgTFo3NyBsb29raW5nIGZvciBtYXRjaGVzIGluIHRoZSBuZWlnaGJvcmhvb2Qgb2YgYSBwaXhlbCBvbmx5LiIKKzhmNmRmMWQwIFVucm9sbCBQcmVkaWN0b3JzIDEwLCAxMSBhbmQgMTIuCiszNTVjM2QxYiBJbnRlZ3JhdGUgYSBuZXcgTFo3NyBsb29raW5nIGZvciBtYXRjaGVzIGluIHRoZSBuZWlnaGJvcmhvb2Qgb2YgYSBwaXhlbCBvbmx5LgorYTE3NzlhMDEgUmVmYWN0b3IgTFo3NyBoYW5kbGluZyBpbiBwcmVwYXJhdGlvbiBmb3IgYSBuZXcgbWV0aG9kLgorNjdkZTY4YjUgQW5kcm9pZC5tay9idWlsZC5ncmFkbGU6IGZpeCBtaXBzIGJ1aWxkIHdpdGggY2xhbmcgZnJvbSByMTRiCitmMjA5YTU0OCBVc2UgdGhlIHBsYW5lIGNvZGUgYW5kIG5vdCB0aGUgZGlzdGFuY2Ugd2hlbiBjb21wdXRpbmcgc3RhdGlzdGljcy4KK2I5MDNiODBjIFNwbGl0IGNvc3QtYmFzZWQgYmFja3dhcmQgcmVmZXJlbmNlcyBpbiBpdHMgb3duIGZpbGUuCis0OThjYWQzNCBDb3NtZXRpYyBjaGFuZ2VzIGluIGJhY2t3YXJkIHJlZmVyZW5jZS4KK2U0ZWI0NTg3IGxvc3NsZXNzLCBWUDhMVHJhbnNmb3JtQ29sb3JfQzogbWFrZSBzdXJlIG5vIG92ZXJmbG93IGhhcHBlbnMgd2l0aCBjb2xvcnMuCithZjZkZWFmZiB3ZWJwaW5mbzogaGFuZGxlIGFscGhhIGZsYWcgbWlzbWF0Y2gKKzdjYWVmMjliIEZpeCB0eXBvIHRoYXQgY3JlZXBlZCBpbi4KKzM5ZTE5ZjkyIE1lcmdlICJuZWFyIGxvc3NsZXNzOiBmaXggdW5zaWduZWQgaW50IG92ZXJmbG93IHdhcm5pbmdzLiIKKzliYmMwODkxIG5lYXIgbG9zc2xlc3M6IGZpeCB1bnNpZ25lZCBpbnQgb3ZlcmZsb3cgd2FybmluZ3MuCitlMTExOGQ2MiBNZXJnZSAiY29zbWV0aWNzLEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQ6IHVzZSB1aW50IGluIG1hc2sgY3JlYXRpb24iCisxODZiYzliNyBNZXJnZSAid2VicGluZm86IHRvbGVyYXRlIEFMUEgrVlA4TCIKK2I1ODg3Mjk3IGNvc21ldGljcyxGaW5kQ2xvc2VzdERpc2NyZXRpemVkOiB1c2UgdWludCBpbiBtYXNrIGNyZWF0aW9uCitmMTc4NGFlZSBuZWFyX2xvc3NsZXNzLEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQ6IHVzZSB1bnNpZ25lZCBvcHMKKzBkMjBhYmIzIHdlYnBpbmZvOiB0b2xlcmF0ZSBBTFBIK1ZQOEwKKzk3MjEwNGIzIHdlYnBtdXg6IHRvbGVyYXRlIGZhbHNlIHBvc2l0aXZlIEFscGhhIGZsYWcKK2RkN2U4M2NjIHRpZmZkZWMsUmVhZFRJRkY6IGVuc3VyZSBkYXRhX3NpemUgaXMgPCB0c2l6ZV90IG1heAorZDk4OGViN2IgdGlmZmRlYyxNeVJlYWQ6IHF1aWV0IC1Xc2hvcnRlbi02NC10by0zMiB3YXJuaW5nCitkYWJkYTcwNyB3ZWJwaW5mbzogYWRkIHN1cHBvcnQgdG8gcGFyc2UgQWxwaGEgYml0c3RyZWFtCis0YzExNzY0MyB3ZWJwaW5mbzogY29ycmVjdCBiYWNrZ3JvdW5kIGNvbG9yIG91dHB1dCwgQkdSQS0+QVJHQgorZGVmYzk4ZDcgRG9jOiBjbGFyaWZ5IHRoZSByb2xlIG9mIHF1YWxpdHkgaW4gV2ViUENvbmZpZy4KK2Q3OGZmNzgwIE1lcmdlICJGaXggY29kZSB0byBjb21waWxlIHdpdGggQysrLiIKK2M4ZjE0MDkzIEZpeCBjb2RlIHRvIGNvbXBpbGUgd2l0aCBDKysuCis0OTdkYzZhNyBwbm1kZWM6IHNhbml0aXplIGludmFsaWQgaGVhZGVyIG91dHB1dAorZDc4ZTU4NjcgTWVyZ2UgImNvbmZpZ3VyZTogdGVzdCBmb3IgLVdjb25zdGFudC1jb252ZXJzaW9uIgorNDgxZTkxZWIgTWVyZ2UgInBubWRlYyxQQU06IHNldCBieXRlc19wZXJfcHggYmFzZWQgb24gZGVwdGggd2hlbiBtaXNzaW5nIgorOTNiMTI3NTMgY29uZmlndXJlOiB0ZXN0IGZvciAtV2NvbnN0YW50LWNvbnZlcnNpb24KKzY0NWYwYzUzIHBubWRlYyxQQU06IHNldCBieXRlc19wZXJfcHggYmFzZWQgb24gZGVwdGggd2hlbiBtaXNzaW5nCitlOTE1NDYwNSBNZXJnZSAidndlYnA6IGFjdGl2YXRlIEdMVVQgZG91YmxlLWJ1ZmZlcmluZyIKKzgxOGQ3OTViIHZ3ZWJwOiBhY3RpdmF0ZSBHTFVUIGRvdWJsZS1idWZmZXJpbmcKK2Q2M2U2ZjRiIEFkZCBhIG1hbiBwYWdlIGZvciB3ZWJwaW5mbworNGQ3MDg0MzUgTWVyZ2UgIk5FT046IGltcGxlbWVudCBDb252ZXJ0UkdCMjRUb1kvQkdSMjQvQVJHQi9SR0JBMzJUb1VWL0FSR0JUb1VWIgorZmFmNDIyMTMgTkVPTjogaW1wbGVtZW50IENvbnZlcnRSR0IyNFRvWS9CR1IyNC9BUkdCL1JHQkEzMlRvVVYvQVJHQlRvVVYKK2I0ZDU3NmZhIEluc3RhbGwgbWFuIHBhZ2VzIHdpdGggQ01ha2UuCitjYmMxYjkyMSB3ZWJwaW5mbzogYWRkIGZlYXR1cmVzIHRvIHBhcnNlIGJpdHN0cmVhbSBoZWFkZXIKK2U2NDRjNTU2IEZpeCBiYWQgYml0IHdyaXRlciBpbml0aWFsaXphdGlvbi4KK2I2MmNkYWQyIE1lcmdlICJJbXBsZW1lbnQgYSBjcnVuY2hlciBmb3IgbG9zc2xlc3MgYXQgbWV0aG9kIDYuIgorZGEzZTRkZmIgdXNlIHRoZSBleGFjdCBjb25zdGFudCBmb3IgdGhlIGdhbW1hIHRyYW5zZmVyIGZ1bmN0aW9uCithOWM3MDFlMCBNZXJnZSAidGlmZmRlYzogZml4IEVYVFJBU0FNUExFUyBjaGVjayIKK2FkYWI4Y2UwIEltcGxlbWVudCBhIGNydW5jaGVyIGZvciBsb3NzbGVzcyBhdCBtZXRob2QgNi4KKzFiOTJiMjM3IE1lcmdlICJGaXggVlA4QXBwbHlOZWFyTG9zc2xlc3MgdG8gcmVzcGVjdCBjb25zdCBhbmQgc3RyaWRlLiIKKzE5MjNmZjAyIHRpZmZkZWM6IGZpeCBFWFRSQVNBTVBMRVMgY2hlY2sKKzk3Y2NlNWJhIHRpZmZkZWM6IG9ubHkgcmVxdWVzdCBFWFRSQVNBTVBMRVMgdy8+IDMgc2FtcGxlcy9weAorMGRjZDg1YjYgRml4IFZQOEFwcGx5TmVhckxvc3NsZXNzIHRvIHJlc3BlY3QgY29uc3QgYW5kIHN0cmlkZS4KK2Y3NjgyMTg5IHl1djogcmF0aW9uYWxpemUgdGhlIEMvU1NFMiBmdW5jdGlvbiBuYW1pbmcKKzUyMjQ1NDI0IE5FT04gaW1wbGVtZW50YXRpb24gb2Ygc29tZSBTaGFycC1ZVVY0MjAgZnVuY3Rpb25zCis2OTBlZmQ4MiBBdm9pZCBzZXZlcmFsIGJhY2t3YXJkIHJlZmVyZW5jZSBjb3BpZXMuCis0YmIxZjYwNyBzcmMvZGVjL3ZwOF9kZWMuaCwgY29zbWV0aWNzOiBmaXggY29tbWVudHMKKzI4NTc0OGJlIGNtYWtlOiBidWlsZC9pbnN0YWxsIHdlYnBpbmZvCis3OGZkMTk5YyBiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jOiBjbGVhciAtV3NoYWRvdyB3YXJuaW5ncworYWU4MzY0MTAgV2ViUExvZzJGbG9vckM6IGNsZWFyIC1Xc2hhZG93IHdhcm5pbmcKK2QwYjc0MDRlIE1lcmdlICJXQVNNIHN1cHBvcnQiCisxMzRlMzE0ZiBXQVNNIHN1cHBvcnQKK2MwOGFkYjZmIE1lcmdlICJWUDhMRW5jOiByZW1vdmUgdXNlIG9mIEJpdHNMb2cyQ2VpbGluZygpIgorMjhjMzdlYmQgVlA4TEVuYzogcmVtb3ZlIHVzZSBvZiBCaXRzTG9nMkNlaWxpbmcoKQorMmNiNThhYjIgd2VicGluZm86IG91dHB1dCBmb3JtYXQgYXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKK2JiMTc1YTkzIE1lcmdlICJyZW5hbWUgc29tZSBzeW1ib2xzIGNsYXNoaW5nIHdpdGggTVNWQyBoZWFkZXJzIgorMzllZGE2NTggUmVtb3ZlIGEgZHVwbGljYXRlZCBwaXhlbCBoYXNoIGltcGxlbWVudGF0aW9uLgorMzZiODI3NGQgcmVuYW1lIHNvbWUgc3ltYm9scyBjbGFzaGluZyB3aXRoIE1TVkMgaGVhZGVycworMjc0ZGFmNTQgQWRkIHdlYnBpbmZvIHRvb2wuCitlYzUwMzZlNCBhZGQgZXhwbGljaXQgcmVmZXJlbmNlIHRvIC91c3IvbG9jYWwve2xpYixpbmN9CisxOGYwZGZhYyBNZXJnZSAiZml4IFRJRkYgZW5jb2RlciByZWdhcmRpbmcgcmdiQS9SR0JBIgorNGUyYjBiNTAgTWVyZ2UgIndlYnBkZWMuaDogZml4IGEgZG9jIHR5cG8iCitlMmVlYWJmZiBNZXJnZSAiSW5zdGFsbCBiaW5hcmllcywgbGlicmFyaWVzIGFuZCBoZWFkZXJzIGluIENNYWtlLiIKKzgzNjYwN2U2IHdlYnBkZWMuaDogZml4IGEgZG9jIHR5cG8KKzkyNzNlNDQxIGZpeCBUSUZGIGVuY29kZXIgcmVnYXJkaW5nIHJnYkEvUkdCQQorMTdlM2MxMWYgQWRkIGxpbWl0ZWQgUEFNIGRlY29kaW5nIHN1cHBvcnQKKzVmNjI0ODcxIEluc3RhbGwgYmluYXJpZXMsIGxpYnJhcmllcyBhbmQgaGVhZGVycyBpbiBDTWFrZS4KKzk3NmFkYWMxIE1lcmdlICJsb3NzbGVzcyBpbmNyZW1lbnRhbCBkZWNvZGluZzogZml4IG1pc3NpbmcgZW9zXyB0ZXN0IgorZjhmYWQ0ZmEgbG9zc2xlc3MgaW5jcmVtZW50YWwgZGVjb2Rpbmc6IGZpeCBtaXNzaW5nIGVvc18gdGVzdAorMjc0MTVkNDEgTWVyZ2UgInZ3ZWJwX3NkbDogZml4IHRoZSBtYWtlZmlsZS51bml4IgorNDk1NjYxODIgTWVyZ2UgIkltZ0lvVXRpbFdyaXRlRmlsZSgpOiB1c2UgSW1nSW9VdGlsU2V0QmluYXJ5TW9kZSIKKzZmNzVhNTFiIEFuYWx5emUgdGhlIHRyYW5zZm9ybSBlbnRyb3B5IG9uIHRoZSB3aG9sZSBpbWFnZS4KK2E1ZTRlM2FmIFVzZSBwYWxldHRlIG9ubHkgaWYgd2UgY2FuIGluIGVudHJvcHkgYW5hbHlzaXMuCis3NWE5YzNjNCBJbXByb3ZlIGNvbXByZXNzaW9uIGJ5IGJldHRlciBlbnRyb3B5IGFuYWx5c2lzLgorMzljZjZmNGYgdndlYnBfc2RsOiBmaXggdGhlIG1ha2VmaWxlLnVuaXgKKzY5OWIwNDE2IEltZ0lvVXRpbFdyaXRlRmlsZSgpOiB1c2UgSW1nSW9VdGlsU2V0QmluYXJ5TW9kZQorN2Q5ODViZDEgRml4IHNtYWxsIGVudHJvcHkgYW5hbHlzaXMgYnVnLgorNmU3Y2FmMDYgT3B0aW1pemUgdGhlIGNvbG9yIGNhY2hlIHNpemUuCis4MzNjOTIxOSBNb3JlIGVmZmljaWVudCBzdG9jaGFzdGljIGhpc3RvZ3JhbSBtZXJnZS4KKzUxODMzMjZiIFJlZmFjdG9yIHRoZSBncmVlZHkgaGlzdG9ncmFtIG1lcmdlLgorOTlmNmY0NjIgTWVyZ2UgImhpc3RvZ3JhbV9lbmMuYyxNeVJhbmQ6IHMvdWwvdS8gZm9yIHVuc2lnbmVkIGNvbnN0YW50cyIKKzgwYTIyMTg2IHNzaW0uYzogcmVtb3ZlIGRlYWQgaW5jbHVkZQorYTEyOGRmZmYgaGlzdG9ncmFtX2VuYy5jLE15UmFuZDogcy91bC91LyBmb3IgdW5zaWduZWQgY29uc3RhbnRzCis2OTNiZjc0ZSBtb3ZlIHRoZSBTU0lNIGNhbGN1bGF0aW9uIGNvZGUgaW4gc3NpbS5jIC8gc3NpbV9zc2UyLmMKKzEwZDc5MWNhIE1lcmdlICJGaXggdGhlIHJhbmRvbSBnZW5lcmF0b3IgaW4gSGlzdG9ncmFtQ29tYmluZVN0b2NoYXN0aWMuIgorZmE2M2E5NjYgRml4IHRoZSByYW5kb20gZ2VuZXJhdG9yIGluIEhpc3RvZ3JhbUNvbWJpbmVTdG9jaGFzdGljLgorMTZiZTE5MmYgVlA4TFNldEJpdFBvczogcmVtb3ZlIHRoZSBlb3NfIHNldHRpbmcKKzAyNzE1MWNhIGRvbid0IGVyYXNlIHRoZSBzdXJmYWNlIGJlZm9yZSBibGl0dGluZy4KKzQxMDVkNTY1IGRpc2FibGUgV0VCUF9VU0VfWFhYIG9wdGltaXNhdGlvbnMgd2hlbiBFTVNDUklQVEVOIGlzIGRlZmluZWQKKzllZTMyYTc1IE1lcmdlICJXZWJQLUpTOiBlbXNjcmlwdGVuLWJhc2VkIEphdmFzY3JpcHQgZGVjb2RlciIKK2NhOWY3YjdkIFdlYlAtSlM6IGVtc2NyaXB0ZW4tYmFzZWQgSmF2YXNjcmlwdCBkZWNvZGVyCis4NjhhYTY5MCBQZXJmb3JtIGdyZWVkeSBoaXN0b2dyYW0gbWVyZ2UgaW4gYSB1bmlmaWVkIHdheS4KKzViMzkzZjJkIE1lcmdlICJmaXggcGF0aCB0eXBvIGZvciB2d2VicF9zZGwgaW4gTWFrZWZpbGUudmMiCitlMDAxMmJlYSBDTWFrZTogb25seSB1c2UgbGlid2VicGRlY29kZXIgZm9yIGJ1aWxkaW5nIGR3ZWJwCis4NGMyYTdiMCBmaXggcGF0aCB0eXBvIGZvciB2d2VicF9zZGwgaW4gTWFrZWZpbGUudmMKKzFiMGU0YWJmIE1lcmdlICJBZGQgYSBmbGFnIHRvIGRpc2FibGUgU0lNRCBvcHRpbWl6YXRpb25zLiIKKzMyMjYzMjUwIEFkZCBhIGZsYWcgdG8gZGlzYWJsZSBTSU1EIG9wdGltaXphdGlvbnMuCitiNDk0ZmRlYyBvcHRpbWl6ZSB0aGUgQVJHQi0+QVJHQiBJbXBvcnQgdG8gdXNlIG1lbWNweQorZjE1MzYwMzkgTWVyZ2UgIlJlYWRXZWJQOiBkZWNvZGUgZGlyZWN0bHkgaW50byBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyIgorZTY5ZWQyOTEgUmVhZFdlYlA6IGRlY29kZSBkaXJlY3RseSBpbnRvIGEgcHJlLWFsbG9jYXRlZCBidWZmZXIKKzU3ZDhkZThhIE1lcmdlICJ2d2VicF9zZGw6IHNpbXBsZSB2aWV3ZXIgYmFzZWQgb24gU0RMIgorNWNmZDRlYmMgTFo3NyBpbnRlcnZhbCBzcGVlZHVwcy4gRmFzdGVyLCBzbWFsbGVyLCBzaW1wbGVyLgorMWU3YWQ4OGIgUE5NIGhlYWRlciBkZWNvZGVyOiBhZGQgc29tZSBiYXNpYyBudW1lcmljYWwgdmFsaWRhdGlvbgorMTdjNzg5MGMgTWVyZ2UgIkFkZCBhIGRlY29kZXIgb25seSBsaWJyYXJ5IGZvciBXZWJQIGluIENNYWtlLiIKK2JlNzMzNzg2IE1lcmdlICJBZGQgY2xhbmcgYnVpbGQgZml4IGZvciBNU0EiCiswM2NkYTBlNCBBZGQgYSBkZWNvZGVyIG9ubHkgbGlicmFyeSBmb3IgV2ViUCBpbiBDTWFrZS4KK2FhODkzOTE0IEFkZCBjbGFuZyBidWlsZCBmaXggZm9yIE1TQQorMzFhOTJlOTcgTWVyZ2UgImltYWdlaW86IGFkZCBsaW1pdGVkIFBOTSBzdXBwb3J0IGZvciByZWFkaW5nIgorZGNmOWQ4MmEgaW1hZ2VpbzogYWRkIGxpbWl0ZWQgUE5NIHN1cHBvcnQgZm9yIHJlYWRpbmcKKzY1MjRmY2Q2IHZ3ZWJwX3NkbDogc2ltcGxlIHZpZXdlciBiYXNlZCBvbiBTREwKKzZjZjI0YTI0IGdldF9kaXN0bzogZml4IHJlZmVyZW5jZSBmaWxlIHJlYWQKKzQzZDQ3MmFhIE1lcmdlIHRhZyAndjAuNi4wJworNTBkMWE4NDggdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC42LjAsIG9yaWdpbi8wLjYuMCwgMC42LjApCisyMGE3ZmVhMCBleHRyYXMvTWFrZWZpbGUuYW06IGZpeCBsaWJ3ZWJwZXh0cmFzLmxhIHJlZmVyZW5jZQorNDE1ZjNmZmUgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC42LjAtcmMzKQorM2M2ZDEyMjQgdXBkYXRlIE5FV1MKK2VlNGE0MTQxIHVwZGF0ZSBBVVRIT1JTCiszMmVkODU2ZiBGaXggImFsbHxubyBmcmFtZXMgYXJlIGtleWZyYW1lcyIgc2V0dGluZ3MuCisxYzMxOTBiNiBNZXJnZSAiRml4ICJhbGx8bm8gZnJhbWVzIGFyZSBrZXlmcmFtZXMiIHNldHRpbmdzLiIKK2Y0ZGM1NmZkIGRpc2FibGUgR3JhZGllbnRVbmZpbHRlcl9ORU9OCis0ZjNlM2JiZCBkaXNhYmxlIEdyYWRpZW50VW5maWx0ZXJfTkVPTgorMmRjMGJkY2EgRml4ICJhbGx8bm8gZnJhbWVzIGFyZSBrZXlmcmFtZXMiIHNldHRpbmdzLgorMGQ4ZTA1ODggaW1nMndlYnA6IHRyZWF0IC1sb29wIGFzIGEgbm8tb3Agdy9zaW5nbGUgaW1hZ2VzCitiMDQ1MDEzOSBSZWFkSW1hZ2UoKTogcmVzdG9yZSBzaXplIHJlcG9ydGluZworMGFkM2I0ZWYgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC42LjAtcmMyKQorNjQ1MTcwOWUgaW1nMndlYnAsZ2V0X2Rpc3RvOiBmaXggaW1hZ2UgZGVjb2RlIHcvV0lDIGJ1aWxkcworOTI1MDRkMjEgZ2V0X2Rpc3RvOiBtYWtlIFJlYWRQaWN0dXJlKCkgcmV0dXJuIGEgYm9vbAorYzNlNGIzYTkgdXBkYXRlIE5FV1MKKzMzNjNlYjZkIG1hbi9pbWcyd2VicC4xOiBmaXggZm9ybWF0dGluZyB3YXJuaW5nCis0ZDEzMTJmMiB1cGRhdGUgTkVXUworMzZjNDJlYTQgYnVtcCB2ZXJzaW9uIHRvIDAuNi4wCitiYjQ5OGE1MSB1cGRhdGUgQVVUSE9SUworODRjZWYxNmYgTWFrZWZpbGUudmM6IGZpeCBDRkc9ZGVidWctZHluYW1pYyBidWlsZAorOTE5ZjllMmYgTWVyZ2UgImFkZCAucmMgZmlsZXMgZm9yIHdpbmRvd3MgZGxsIHZlcnNpb25pbmciCitmMWFlOGFmNCBNZXJnZSAiLmdpdGlnbm9yZTogYWRkIGltZzJ3ZWJwIgorNDY4OWNlMTYgY3dlYnA6IGFkZCBhIC1zaGFycF95dXYgb3B0aW9uIGZvciAnc2hhcnAnIFJHQi0+WVVWIGNvbnZlcnNpb24KKzc5YmY0NmYxIHJlbmFtZSB0aGUgcHJldGVudGlvdXMgU21hcnRZVVYgaW50byBTaGFycFlVVgorZWIxZGM4OWEgc2lsZW50bHkgZXhwb3NlIHVzZV9kZWx0YV9wYWxldHRlIGluIHRoZSBXZWJQQ29uZmlnIEFQSQorYzg1YjBkZGUgLmdpdGlnbm9yZTogYWRkIGltZzJ3ZWJwCis0M2QzZjAxYSBhZGQgLnJjIGZpbGVzIGZvciB3aW5kb3dzIGRsbCB2ZXJzaW9uaW5nCis2NjhlMWRkNCBzcmMve2RlYyxlbmMsdXRpbHN9OiBnaXZlIGZpbGVuYW1lcyBhIHVuaXF1ZSBzdWZmaXgKKzBlNmI3ZjMzIE1lcmdlICJpb3NidWlsZC5zaDogb25seSBhZGQgcmVxdWlyZWQgaGVhZGVycyB0byBmcmFtZXdvcmsiCisyOWVkNmY5YSBpb3NidWlsZC5zaDogb25seSBhZGQgcmVxdWlyZWQgaGVhZGVycyB0byBmcmFtZXdvcmsKKzcxYzUzZjFhIE5FT046IHNwZWVkLXVwIHN0cm9uZyBmaWx0ZXJpbmcKKzczZjU2N2VhIE1lcmdlICJnZXRfZGlzdG86IHJlbW92ZSByZWR1bmRhbnQgcmVhZGVyIGNoZWNrIgorOWUxNDI3NmYgTWVyZ2UgIm1ha2VmaWxlczogcHJ1bmUgZ2V0X2Rpc3RvICYgd2VicF9xdWFsaXR5IGRlcHMiCis5OTk2NWJhYyBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBnZXRfZGlzdG8uZXhlLCB3ZWJwX3F1YWxpdHkuZXhlIgorZDQ5MTIyMzggZ2V0X2Rpc3RvOiByZW1vdmUgcmVkdW5kYW50IHJlYWRlciBjaGVjaworZWE0ODI0MDkgbWFrZWZpbGVzOiBwcnVuZSBnZXRfZGlzdG8gJiB3ZWJwX3F1YWxpdHkgZGVwcworMmVkZTVhMTkgTWFrZWZpbGUudmM6IGFkZCBnZXRfZGlzdG8uZXhlLCB3ZWJwX3F1YWxpdHkuZXhlCithMzQ1MDY4YSBBUk06IHNwZWVkIHVwIGJpdHJlYWRlciBieSBhdm9pZGluZyB0YWJsZXMKKzFkYzgyYTZiIE1lcmdlICJpbnRyb2R1Y2UgYSBnZW5lcmljIEdldENvZWZmcygpIGZ1bmN0aW9uIHBvaW50ZXIiCis4MDc0Yjg5ZSBpbnRyb2R1Y2UgYSBnZW5lcmljIEdldENvZWZmcygpIGZ1bmN0aW9uIHBvaW50ZXIKKzc0OWE0NWE1IE1lcmdlICJORU9OOiBpbXBsZW1lbnQgYWxwaGEtZmlsdGVycyAoaG9yaXpvbnRhbC92ZXJ0aWNhbC9ncmFkaWVudCkiCis3NGMwNTNiNSBNZXJnZSAiTkVPTjogZml4IG92ZXJmbG93IGluIFNTRSBOeE4gY2FsY3VsYXRpb24iCiswYTNhZWZmNyBNZXJnZSAiZHNwOiBXZWJQRXh0cmFjdEdyZWVuIGZ1bmN0aW9uIGZvciBhbHBoYSBkZWNvbXByZXNzaW9uIgorMWRlOTMxYzYgTkVPTjogaW1wbGVtZW50IGFscGhhLWZpbHRlcnMgKGhvcml6b250YWwvdmVydGljYWwvZ3JhZGllbnQpCis5YjNhY2E0MCBORU9OOiBmaXggb3ZlcmZsb3cgaW4gU1NFIE54TiBjYWxjdWxhdGlvbgorMWMwN2EzYzYgZHNwOiBXZWJQRXh0cmFjdEdyZWVuIGZ1bmN0aW9uIGZvciBhbHBoYSBkZWNvbXByZXNzaW9uCis5ZWQ1ZTNlNSB1c2UgcG9pbnRlcnMgZm9yIFdlYlBSZXNjYWxlcidzIGluIFdlYlBEZWNQYXJhbXMKK2RiMDEzYThkIE1lcmdlICJBUk06IGRvbid0IHVzZSBVU0VfR0VORVJJQ19UUkVFIgorZmNkNDc4NGQgdXNlIGEgOGIgdGFibGUgZm9yIEMtdmVyc2lvbiBmb3IgY2x6KCkKK2ZiYjVjNDczIEFSTTogZG9uJ3QgdXNlIFVTRV9HRU5FUklDX1RSRUUKKzhmZGE1NjEyIE1lcmdlICJhZGQgYSBrU2xvd1NTU0UzIGZlYXR1cmUgZm9yIENQVUluZm8iCis4NmJiZDI0NSBhZGQgYSBrU2xvd1NTU0UzIGZlYXR1cmUgZm9yIENQVUluZm8KKzdjMjc3OWU5IEdldCBjb2RlIHRvIGZ1bGx5IGNvbXBpbGUgaW4gQysrLgorMjUwYzM1ODYgTWVyZ2UgIldoZW4gY29tcGlsaW5nIGFzIEMrKywgYXZvaWQgbmFycm93aW5nIHdhcm5pbmdzLiIKK2MwNjQ4YWMyIFdoZW4gY29tcGlsaW5nIGFzIEMrKywgYXZvaWQgbmFycm93aW5nIHdhcm5pbmdzLgorMGQ1NWY2MGMgNDAlIGZhc3RlciBBcHBseUFscGhhTXVsdGlwbHlfU1NFMgorNDlkMDI4MGQgTkVPTjogaW1wbGVtZW50IHNldmVyYWwgYWxwaGEtcHJvY2Vzc2luZyBmdW5jdGlvbnMKKzQ4YjFlODVmIFNTRTI6IDE1JSBmYXN0ZXIgYWxwaGEtcHJvY2Vzc2luZyBmdW5jdGlvbnMKK2UzYjhhYmJjIGZpeCB3YXJuaW5nIGZyb20gc3RhdGljIGFuYWx5c2lzLgorMjhmZTA1NGUgU1NFMjogMzAlIGZhc3RlciBBcHBseUFscGhhTXVsdGlwbHkoKQorZjQ0YWNkMjUgTWVyZ2UgIlByb3Blcmx5IGNvbXB1dGUgdGhlIG9wdGltYWwgY29sb3IgY2FjaGUgc2l6ZS4iCis1Mjc4NDRmZSBQcm9wZXJseSBjb21wdXRlIHRoZSBvcHRpbWFsIGNvbG9yIGNhY2hlIHNpemUuCitiZTBlZjYzOSBmaXggYSBjb21tZW50IHR5cG8KKzg4NzRiMTYyIEZpeCBhIG5vbi1kZXRlcm1pbmlzdGljIGNvbG9yIGNhY2hlIHNpemUgY29tcHV0YXRpb24uCitkNzEyZTIwZCBEbyBub3QgYWxsb3cgYSBjb2xvciBjYWNoZSBzaXplIGJpZ2dlciB0aGFuIHRoZSBudW1iZXIgb2YgY29sb3JzLgorZWNmZjA0ZjYgcmUtaW50cm9kdWNlIHNvbWUgY29tbWVudHMgaW4gSHVmZm1hbiBDb3N0LgorMjU5ZTk4MjggcmVwbGFjZSAncHRyICsgeSAqIHN0cmlkZScgYnkgJ3B0ciArPSBzdHJpZGUnCiswMGIwOGM4OCBNZXJnZSAiTkVPTjogNSUgZmFzdGVyIGNvbnZlcnNpb24gdG8gUkdCNTY1IGFuZCBSR0JBNDQ0NCIKKzBlN2Y0NDQ3IE1lcmdlICJORU9OOiBmYXN0ZXIgZmFuY3kgdXBzYW1wbGluZyIKK2IwMTZjYjkxIE5FT046IGZhc3RlciBmYW5jeSB1cHNhbXBsaW5nCisxY2I2MzgwMSBDYWxsIHRoZSBDIGZ1bmN0aW9uIHRvIGZpbmlzaCBvZmYgbG9zc2xlc3MgU1NFIGxvb3BzIG9ubHkgd2hlbiBuZWNlc3NhcnkuCis4NzVmYWZjMSBJbXBsZW1lbnQgQnVuZGxlQ29sb3JNYXAgaW4gU1NFMi4KKzM2NzRkNDllIE1lcmdlICJyZW1vdmUgQ2xhbmcgd2FybmluZ3Mgd2l0aCB1bnVzZWQgYXJjaCBhcmd1bWVudHMuIgorZjA0ZWIzNzYgTWVyZ2UgdGFnICd2MC41LjInCiszNDFkNzExYyBORU9OOiA1JSBmYXN0ZXIgY29udmVyc2lvbiB0byBSR0I1NjUgYW5kIFJHQkE0NDQ0CithYmI1NDgyNyByZW1vdmUgQ2xhbmcgd2FybmluZ3Mgd2l0aCB1bnVzZWQgYXJjaCBhcmd1bWVudHMuCitlY2U5Njg0ZiB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjUuMi1yYzIsIHRhZzogdjAuNS4yLCBvcmlnaW4vMC41LjIsIDAuNS4yKQorYWE3NzQ0Y2EgYW5pbV91dGlsOiBxdWlldCBpbXBsaWNpdCBjb252IHdhcm5pbmdzIGluIDMyLWJpdAorZDkxMjAyNzEganBlZ2RlYzogY29ycmVjdCBDb250ZXh0RmlsbCBzaWduYXR1cmUKKzI0ZWIzOTQwIFJlbW92ZSBzb21lIGVycm9ycyB3aGVuIGNvbXBpbGluZyB0aGUgY29kZSBhcyBDKysuCithNGE4ZTVmMyB2d2VicDogY2xlYXIgY2FudmFzIGR1cmluZyByZXNpemUgdy9vIGFuaW1hdGlvbgorNjdjMjVhZDUgdndlYnA6IGNsZWFyIGNhbnZhcyBkdXJpbmcgcmVzaXplIHcvbyBhbmltYXRpb24KK2E0YmJlNGIzIGZpeCBpbmRlbnRhdGlvbgorMzFjYTJhODAgdGlmZmRlYzogcmVzdG9yZSBsaWJ0aWZmIDMuOS54IGNvbXBhdGliaWxpdHkKK2IyZjc3YjU3IHVwZGF0ZSBORVdTCis1YWI2ZDlkZSBBbmltRW5jb2RlcjogYXZvaWQgZnJlZWluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBwb2ludGVyLgorZjI5YmY1ODIgV2ViUEFuaW1FbmNvZGVyOiBJZiAnbWluaW1pemVfc2l6ZScgYW5kICdhbGxvd19taXhlZCcgb24sIHRyeSBsb3NzeSArIGxvc3NsZXNzLgorM2ViZTFjMDAgQW5pbUVuY29kZXI6IGF2b2lkIGZyZWVpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcG9pbnRlci4KK2RmNzgwZTBlIGZpeCBhIHBvdGVudGlhbCBvdmVyZmxvdyB3aXRoIE1BTExPQ19MSU1JVAorNThmYzUwNzggTWVyZ2UgIlByZWRpY3RvclN1YjogaW1wbGVtZW50IGZ1bGx5LVNTRTIgdmVyc2lvbiIKKzljYzQyMTY3IFByZWRpY3RvclN1YjogaW1wbGVtZW50IGZ1bGx5LVNTRTIgdmVyc2lvbgorMGFhMWYzNWMgcmVtb3ZlIGRlcGVuZGVuY3kgb2YgaW1hZ2Vpby8gdG8gc3RvcHdhdGNoLmgKK2NiOWVjODRiIE1lcmdlICJyZW1vdmUgdGhlIGRlcGVuZGVuY3kgdG8gc3RvcF93YXRjaC5bY2hdIGluIGltYWdlaW8iCitkYzBjMDFmYiBNZXJnZSAiYW5pbV91dGlsOiBxdWlldCBpbXBsaWNpdCBjb252IHdhcm5pbmdzIGluIDMyLWJpdCIKKzgyN2QzYzUwIE1lcmdlICJmaXggYSBwb3RlbnRpYWwgb3ZlcmZsb3cgd2l0aCBNQUxMT0NfTElNSVQiCisxZTJlMjViMCBhbmltX3V0aWw6IHF1aWV0IGltcGxpY2l0IGNvbnYgd2FybmluZ3MgaW4gMzItYml0CisyMTg0NjBjZCBidW1wIHZlcnNpb24gdG8gMC41LjIKK2RlN2Q2NTRkIHVwZGF0ZSBBVVRIT1JTICYgLm1haWxtYXAKKzI3MzM2N2MxIE1lcmdlICJkc3AvbG9zc2xlc3MuYyxjb3NtZXRpY3M6IGZpeCBpbmRlbnQiCis3NmJiY2YyZSBmaXggYSBwb3RlbnRpYWwgb3ZlcmZsb3cgd2l0aCBNQUxMT0NfTElNSVQKKzhhYzFhYmZlIE1lcmdlICJqcGVnZGVjOiBjb3JyZWN0IENvbnRleHRGaWxsIHNpZ25hdHVyZSIKK2NiMjE1YWVkIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSB0byBzdG9wX3dhdGNoLltjaF0gaW4gaW1hZ2VpbworMjQyMzAxN2EgZHNwL2xvc3NsZXNzLmMsY29zbWV0aWNzOiBmaXggaW5kZW50Cis3NGExMmIxMCBpb3NidWlsZC5zaDogYWRkIFdlYlBEZWNvZGVyLmZyYW1ld29yayArIGVuY29kZXIKK2E5Y2M3NjIxIE1lcmdlICJpb3NidWlsZC5zaDogYWRkIFdlYlBEZWNvZGVyLmZyYW1ld29yayArIGVuY29kZXIiCitmYmJhNWJjMiBvcHRpbWl6ZSBwcmVkaWN0b3IgIzEgaW4gcGxhaW4tQyBGb3Igc29tZSByZWFzb24sIGdjYyBoYXMgaGFyZCB0aW1lIGlubGluaW5nIHRoaXMgb25lLi4uCis5YWUwYjNmNiBNZXJnZSAiU1NFMjogc2xpZ2h0bHkgKH4yJSkgZmFzdGVyIFByZWRpY3RvciAjMSIKK2MxZjk3YmQ3IFNTRTI6IHNsaWdodGx5ICh+MiUpIGZhc3RlciBQcmVkaWN0b3IgIzEKK2VhNjY0Yjg5IFNTRTI6IDEwJSBmYXN0ZXIgUHJlZGljdG9yICMxMQorYmU3ZGNjMDggQW5pbUVuY29kZXI6IENvcnJlY3RseSBza2lwIGEgZnJhbWUgd2hlbiBzdWItcmVjdGFuZ2xlIGlzIGVtcHR5LgorNDA4ODU4MzAgRml4IGFzc2VydGlvbnMgaW4gV2ViUFJlc2NhbGVyRXhwb3J0Um93KCkKKzFkNTA0NmQxIGlvc2J1aWxkLnNoOiBhZGQgV2ViUERlY29kZXIuZnJhbWV3b3JrICsgZW5jb2RlcgorY2VjNzIwMTQganBlZ2RlYzogY29ycmVjdCBDb250ZXh0RmlsbCBzaWduYXR1cmUKKzhmMzhjNzJlIGZpeCBhIHR5cG8gaW4gV2ViUFBpY3R1cmVZVVZBVG9BUkdCJ3MgZG9jCiszM2NhOTNmOSBzeXN0ZW1hdGljYWxseSBjYWxsIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigpIG9uIGRlYy0+cHJldl9pdGVyXworNzZlMTkwNzMgZG9jOiB1c2UgdHdvJ3MgY29tcGxlbWVudCBleHBsaWNpdGx5IGZvciB1aW50OC0+aW50OCBjb252ZXJzaW9uCitmOTFiYTk2MyBBbmltX2VuY29kZXI6IGNvcnJlY3RseSBoYW5kbGUgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfCisyNWQ3NGU2NSBXZWJQUGljdHVyZURpc3RvcnRpb24oKTogZnJlZSgpIC0+IFdlYlBTYWZlRnJlZSgpCiswM2YxYzAwOCBtdXgvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIC1sbQorNTg0MTBjZDYgZml4IGJ1ZyBpbiBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oKQorZTE2OGFmOGMgZml4IGZpbHRlcmluZyBhdXRvLWFkanVzdG1lbnQKK2VkOWRlYzQxIGZpeCBkb2MgYW5kIGNvZGUgc25pcHBldCBmb3IgV2ViUElOZXdEZWNvZGVyKCkgZG9jCiszYzQ5MTc4ZiBwcmV2ZW50IDMyYiBvdmVyZmxvdyBmb3IgdmVyeSBsYXJnZSBjYW52YXNfd2lkdGggLyBoZWlnaHQKKzk1OTVmMjkwIGZpeCBhbmltX3V0aWwuYyBjb21waWxhdGlvbiB3aGVuIEhBVkVfR0lGIGlzIG5vdCBkZWZpbmVkLgorN2VjOTU1MmMgTWFrZSBnaWYgdHJhbnNwYXJlbnQgY29sb3IgdG8gYmUgdHJhbnNwYXJlbnQgYmxhY2sKK2IzZmI4YmI2IHNsaWdodGx5IGZhc3RlciBQcmVkaWN0b3IgIzExIGluIE5FT04KKzk4NzEzMzVmIEFkZCBhIENNYWtlIG9wdGlvbiBmb3IgV0VCUF9TV0FQXzE2QklUX0NTUC4KKzBhZTMyMjI2IEZpeCBtaXNzaW5nIGNwdS1mZWF0dXJlcyBmb3IgQW5kcm9pZC4KK2FiNGM4MDU2IGNwdS5jbWFrZTogaW1wcm92ZSB3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcgb3V0cHV0CitlZWM1ZmEzYSBQcm92aWRlIHN1cHBvcnQgZm9yIENNYWtlIG9uIEFuZHJvaWQgc3R1ZGlvIDIuMi4KKzAwNGQ1NjkwIFNwbGl0IHRoZSBtYWluIENNYWtlIGZpbGUuCis0ZmU1ZDU4OCBBbmRyb2lkLm1rOiB1c2UgLWZ2aXNpYmlsaXR5PWhpZGRlbgorYmQ2M2EzMWEgdndlYnA6IGVuc3VyZSBzZXRlbnYoKSBpcyBhdmFpbGFibGUgaW4gc3RkbGliLmgKKzM2M2E1NjgxIHZ3ZWJwOiBoYW5kbGUgd2luZG93IHJlc2l6aW5nIHByb3Blcmx5CithMGQyNzUzZiBsb3dlciBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZIGRlZmF1bHQKKzMxZmUxMWE1ICBmaXggaW5maW5pdGUgbG9vcCBpbiBjYXNlIG9mIFBBUlRJVElPTjAgb3ZlcmZsb3cKKzUzMjIxNWRkIENoYW5nZSB0aGUgcnVsZSBvZiBwaWNraW5nIFVWIG1vZGUgaW4gTUJBbmFseXplQmVzdFVWTW9kZSgpCis5Yzc1ZGJkMyBjd2VicC4xOiBpbXByb3ZlIHNvbWUgZ3JhbW1hcgorYWYyZTA1Y2IgdndlYnA6IENsZWFyIHByZXZpb3VzIGZyYW1lIHdoZW4gYSBrZXkgdHJpZ2dlcnMgYSByZWRyYXcKKzI2ZmZhMjk2IEFkZCBkZXNjcmlwdGlvbnMgb2YgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGhlbHAgaW5mby4KKzc0MTYyODBkIEZpeCBhbiB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGVycm9yIGluIGVuYy9jb3N0LmgKKzEzY2YxZDJlIERvIHRva2VuIHJlY29yZGluZyBhbmQgY291bnRpbmcgaW4gYSBzaW5nbGUgbG9vcAorZWI5YTRiOTcgUmVzZXQgc2VnbWVudCBpZCBpZiB3ZSBkZWNpZGUgbm90IHRvIHVwZGF0ZSBzZWdtZW50IG1hcAorNDJlYmUzYjcgY29uZmlndXJlOiBmaXggTkVPTiBmbGFnIGRldGVjdGlvbiB1bmRlciBnY2MgNgorNzZlYmJmZmYgTkVPTjogaW1wbGVtZW50IHByZWRpY3RvciAjMTMKKzk1YjEyYTA4IE1lcmdlICJSZXZlcnQgQXZlcmFnZTMgYW5kIEF2ZXJhZ2U0IgorNTRhYjJlNzUgUmV2ZXJ0IEF2ZXJhZ2UzIGFuZCBBdmVyYWdlNAorZmUxMjMzMGMgMy01JSBmYXN0ZXIgUHJlZGljdG9yICM1LCAjNiwgIzcgYW5kICMxMCBmb3IgTkVPTgorZmJmYjNiZWYgfjIlIGZhc3RlciBwcmVkaWN0b3IgIzEwIGZvciBORU9OCitkNGI3ZDgwMSBsb3NzbGVzc19zc2UyOiB1c2UgdGhlIGxvY2FsIGZ1bmN0aW9ucworYTVlM2IyMjUgTG9zc2xlc3MgZGVjb2RlciBTU0UyIGltcHJvdmVtZW50cy4KKzU4YTFmMTI0IH4yJSBmYXN0ZXIgcHJlZGljdG9yICMxMiBpbiBORU9OLgorOTA2YzNiNjMgTWVyZ2UgIkltcGxlbWVudCBsb3NzbGVzcyB0cmFuc2Zvcm1zIGluIE5FT04uIgorZDIzYWJlNGUgSW1wbGVtZW50IGxvc3NsZXNzIHRyYW5zZm9ybXMgaW4gTkVPTi4KKzJlNmNiNmYzIEdpdmUgbW9yZSBmbGV4aWJpbGl0eSB0byB0aGUgcHJlZGljdG9yIGdlbmVyYXRpbmcgbWFjcm8uCisyOGUwYmI3MCBNZXJnZSAiRml4IHJhY2UgY29uZGl0aW9uIGluIG11bHRpLXRocmVhZGluZyBpbml0aWFsaXphdGlvbi4iCis2NDcwNDUzMCBGaXggcmFjZSBjb25kaXRpb24gaW4gbXVsdGktdGhyZWFkaW5nIGluaXRpYWxpemF0aW9uLgorYmRlZDc4NDggaW1nMndlYnA6IGZpeCBkZWZhdWx0IC1sb3NzbGVzcyB2YWx1ZSBhbmQgdXNlIHBpYy5hcmdiPTEKKzBlNjFhNTEzIE1lcmdlICJpbWcyd2VicDogY29udmVydCBhIHNlcXVlbmNlIG9mIGltYWdlcyB0byBhbiBhbmltYXRlZCB3ZWJwIgorMWNjNzllOTIgQW5pbUVuY29kZXI6IENvcnJlY3RseSBza2lwIGEgZnJhbWUgd2hlbiBzdWItcmVjdGFuZ2xlIGlzIGVtcHR5LgorMDNmNDA5NTUgaW1nMndlYnA6IGNvbnZlcnQgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgdG8gYW4gYW5pbWF0ZWQgd2VicAorZWE3MmNkNjAgYWRkIG1pc3NpbmcgJ2V4dGVybicga2V5d29yZCBmb3IgcHJlZGljdG9yIGRjbAorNjc4NzllNmQgU1NFIGltcGxlbWVudGF0aW9uIG9mIGRlY29kaW5nIHByZWRpY3RvcnMuCiszNGFlZTk5MCBNZXJnZSAidndlYnA6IG1ha2UgJ2QnIGtleSB0b2dnbGUgdGhlIGRlYnVnZ2luZyBvZiBmcmFnbWVudHMiCithNDEyOTZhZSBGaXggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YWx1ZS4KK2M4NWFkYjMzIHZ3ZWJwOiBtYWtlICdkJyBrZXkgdG9nZ2xlIHRoZSBkZWJ1Z2dpbmcgb2YgZnJhZ21lbnRzCis0MjM5YTE0OCBNYWtlIHRoZSBsb3NzbGVzcyBwcmVkaWN0b3JzIHdvcmsgb24gYSBiYXRjaCBvZiBwaXhlbHMuCitiYzE4ZWJhZCBmaXggZXh0cmEgJ2NvbnN0J3MgaW4gc2lnbmF0dXJlcworNzFlMmY1Y2EgUmVtb3ZlIG1lbWNweSBpbiBsb3NzbGVzcyBkZWNvZGluZy4KKzc0NzRkNDZlIERvIG5vdCB1c2UgYSByZWdpc3RlciBhcnJheSBpbiBTU0UuCis2Nzc0OGI0MSBJbXByb3ZlIGxhdGVuY3kgb2YgRlRyYW5zZm9ybTIuCisxNjk1MWIxOSBNZXJnZSAiUHJvdmlkZSBhbiBTU0UgaW1wbGVtZW50YXRpb24gb2YgQ29udmVydEJHUkFUb1JHQiIKKzY1NDBjZDBlIFByb3ZpZGUgYW4gU1NFIGltcGxlbWVudGF0aW9uIG9mIENvbnZlcnRCR1JBVG9SR0IKK2RlNTY4YWJmIEFuZHJvaWQubWs6IHVzZSAtZnZpc2liaWxpdHk9aGlkZGVuCiszYzJhNjFiMCByZW1vdmUgc29tZSB1bm5lZWRlZCBjYXN0cworOWFjMDYzYzMgYWRkIGRzcCBmdW5jdGlvbnMgZm9yIFNtYXJ0WVVWCisyMmVmYWJkZCBNZXJnZSAic21hcnRfeXV2OiBzd2l0Y2ggdG8gcGxhbmFyIGluc3RlYWQgb2YgcGFja2VkIHIvZy9iIHByb2Nlc3NpbmciCisxZDZlN2JmMyBzbWFydF95dXY6IHN3aXRjaCB0byBwbGFuYXIgaW5zdGVhZCBvZiBwYWNrZWQgci9nL2IgcHJvY2Vzc2luZworMGEzODM4Y2EgZml4IGJ1ZyBpbiBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oKQorYzA2OTk1MTUgd2VicG11eCAtZHVyYXRpb246IHNldCBkZWZhdWx0ICdlbmQnIHZhbHVlIGVxdWFsIHRvICdzdGFydCcKKzgzY2JmYTA5IEltcG9ydDogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworYTFhZGU0MGUgUHJlcHJvY2Vzc0FSR0I6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2ZkNGQwOTBmIENvbnZlcnRXUkdCVG9ZVVY6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKKzlkYWFkNDU5IEltcG9ydFlVVkFGcm9tUkdCQTogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworZjkwYzYwZDEgTWVyZ2UgImFkZCBhICItZHVyYXRpb24gZHVyYXRpb24sc3RhcnQsZW5kIiBvcHRpb24gdG8gd2VicG11eCIKKzNmMTgyZDM2IGFkZCBhICItZHVyYXRpb24gZHVyYXRpb24sc3RhcnQsZW5kIiBvcHRpb24gdG8gd2VicG11eAorMzQyZTE1ZjAgSW1wb3J0OiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCisxMTQ3YWI0ZSBQcmVwcm9jZXNzQVJHQjogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworZTRjZDRkYWYgZml4IGZpbHRlcmluZyBhdXRvLWFkanVzdG1lbnQKK2U3MTUyODU2IGZpeCBkb2MgYW5kIGNvZGUgc25pcHBldCBmb3IgV2ViUElOZXdEZWNvZGVyKCkgZG9jCitkZTlmYTUwNyBDb252ZXJ0V1JHQlRvWVVWOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCitkZWIxYjgzMSBJbXBvcnRZVVZBRnJvbVJHQkE6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2MyODQ3ODBmIGltYWdlaW9fdXRpbDogYWRkIEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93CitlMzc1MDgwZCBnaWZkZWMsUmVtYXA6IGF2b2lkIG91dCBvZiBib3VuZHMgY29sb3JtYXAgcmVhZAorYzIyMmEwNTMgYWRkaXRpb25hbCBmaXggZm9yIHN0cmlkZSB0eXBlIGFzIHNpemVfdAorYmIyMzM2MTcgZml4IHBvdGVudGlhbCBvdmVyZmxvdyB3aGVuIHdpZHRoICogaGVpZ2h0ICogNCA+PSAoMTw8MzIpCis4ODNkNDFmYiBnaWYyd2VicDogZml4IGNyYXNoIHdpdGggTlVMTCBleHRlbnNpb24gZGF0YQorY2FjOWEzNmEgZ2lmZGVjLFJlbWFwOiBhdm9pZCBvdXQgb2YgYm91bmRzIGNvbG9ybWFwIHJlYWQKKzQ1OTVlMDFmIFJldmVydCAiZ2lmZGVjLFJlbWFwOiBhdm9pZCBvdXQgb2YgYm91bmRzIGNvbG9ybWFwIHJlYWQiCitmYjUyZDQ0MyBnaWZkZWM6IG1ha2Ugc29tZSBjb25zdGFudHMgdW5zaWduZWQKK2YwNDhkMzhkIGdpZmRlYyxSZW1hcDogYXZvaWQgb3V0IG9mIGJvdW5kcyBjb2xvcm1hcCByZWFkCiszMWIxZTM0MyBmaXggU1NJTSBtZXRyaWMgLi4uIGJ5IGlnbm9yaW5nIHRvby1kYXJrIGFyZWEKKzJmNTFiNjE0IGludHJvZHVjZSBXZWJQUGxhbmVEaXN0b3J0aW9uIHRvIGNvbXB1dGUgcGxhbmUgZGlzdG9ydGlvbgorMDEwNGQ3MzAgY29uZmlndXJlOiBmaXggTkVPTiBmbGFnIGRldGVjdGlvbiB1bmRlciBnY2MgNgorMjY1YWJiZTkgTWVyZ2UgImFkZGl0aW9uYWwgZml4IGZvciBzdHJpZGUgdHlwZSBhcyBzaXplX3QiCitmNzYwMWFhNiBNZXJnZSAiSW50cm9kdWNlIGEgZ2VuZXJpYyBXZWJQR2V0SW1hZ2VSZWFkZXIodHlwZSkgZnVuY3Rpb24iCitjZTg3MzMyMCBJbnRyb2R1Y2UgYSBnZW5lcmljIFdlYlBHZXRJbWFnZVJlYWRlcih0eXBlKSBmdW5jdGlvbgorMmEyNzczZWEgaW1hZ2Vpby8qZGVjLFJlYWQqOiBhZGQgaW5wdXQgcGFyYW1ldGVyIGNoZWNrcworOWY1YzhlY2EgYWRkaXRpb25hbCBmaXggZm9yIHN0cmlkZSB0eXBlIGFzIHNpemVfdAorNGViNWRmMjggcmVtb3ZlIHVudXNlZCBzdHJpZGUgZmllbGRzIGZyb20gVlA4SXRlcmF0b3IKKzExYmM0MjNhIE1JTl9MRU5HVEggY2xlYW51cHMuCisyNzNkMDM1YSBNZXJnZSAiZml4IGEgdHlwbyBpbiBXZWJQUGljdHVyZVlVVkFUb0FSR0IncyBkb2MiCis0ZGI4MmExNyBNZXJnZSAiZml4IHBvdGVudGlhbCBvdmVyZmxvdyB3aGVuIHdpZHRoICogaGVpZ2h0ICogNCA+PSAoMTw8MzIpIgorZTJhZmZhY2MgZml4IHBvdGVudGlhbCBvdmVyZmxvdyB3aGVuIHdpZHRoICogaGVpZ2h0ICogNCA+PSAoMTw8MzIpCitkYzc4OWFkYSBmaXggYSB0eXBvIGluIFdlYlBQaWN0dXJlWVVWQVRvQVJHQidzIGRvYworNTM5ZjVhNjggRml4IG5vbi1pbmNsdWRlZCBoZWFkZXIgaW4gY29uZmlnLmMuCithYWYyYTZhNiBzeXN0ZW1hdGljYWxseSBjYWxsIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigpIG9uIGRlYy0+cHJldl9pdGVyXworMjBlZjk5MTUgTWVyZ2UgImltYWdlaW9fdXRpbDogYWRkIEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93IgorYmM4NmI3YTggaW1hZ2Vpb191dGlsOiBhZGQgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3cKKzgwNmY2Mjc5IGdpZjJ3ZWJwOiBmaXggY3Jhc2ggd2l0aCBOVUxMIGV4dGVuc2lvbiBkYXRhCis2OGFlNWI2NyBBZGQgbGlid2VicC9zcmMvbXV4L2FuaW1pLmgKKzI4Y2UzMDQzIFJlbW92ZSBzb21lIGVycm9ycyB3aGVuIGNvbXBpbGluZyB0aGUgY29kZSBhcyBDKysuCitiMzRhYmNiOCBGYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIgaW4gc3BhdGlhbCBwcmVkaWN0aW9uIG1vZGUgc2VsZWN0aW9uCitiYTg0M2E5MiBmaXggc29tZSBTU0lNIGNhbGN1bGF0aW9ucworNTFiNzFmZDIgTWVyZ2UgInZ3ZWJwOiBlbnN1cmUgc2V0ZW52KCkgaXMgYXZhaWxhYmxlIGluIHN0ZGxpYi5oIgorZmIwMTc0M2EgZ2V0X2Rpc3RvOiBmaXggdGhlIHIvZy9iIG9yZGVyIGZvciBsdW1hIGNhbGN1bGF0aW9uCitiZmFiODk0NyB2d2VicDogZW5zdXJlIHNldGVudigpIGlzIGF2YWlsYWJsZSBpbiBzdGRsaWIuaAorOTMxMGQxOTIgdndlYnA6IGhhbmRsZSB3aW5kb3cgcmVzaXppbmcgcHJvcGVybHkKK2Y3OTQ1MGNhIFNwZWVkdXAgQXBwbHlNYXAuCitjZmRkYTdjNiBNZXJnZSAicHJldmVudCAzMmIgb3ZlcmZsb3cgZm9yIHZlcnkgbGFyZ2UgY2FudmFzX3dpZHRoIC8gaGVpZ2h0IgorZTM2Mzk2YmEgTWVyZ2UgImdldF9kaXN0bzogbmV3IG9wdGlvbiB0byBjb21wdXRlIFNTSU0gbWFwIGFuZCBjb252ZXJ0IHRvIGdyYXkiCisxOGE5YTBhYiBBZGQgYW4gQVBJIHRvIGltcG9ydCBhIGNvbG9yLW1hcHBlZCBpbWFnZS4KKzMwZDQzNzA2IFNwZWVkLXVwIENvbWJpbmVkIGVudHJvcHkgZm9yIHBhbGV0dGl6ZWQgaGlzdG9ncmFtcy4KKzM2YWEwODdiIGdldF9kaXN0bzogbmV3IG9wdGlvbiB0byBjb21wdXRlIFNTSU0gbWFwIGFuZCBjb252ZXJ0IHRvIGdyYXkKKzg2YTg0YjM1IDJ4IGZhc3RlciBTU0UyIGltcGxlbWVudGF0aW9uIG9mIFNTSU1HZXQKK2I4Mzg0YjUzIGxvd2VyIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgZGVmYXVsdAorMWMzNjQ0MDAgcHJldmVudCAzMmIgb3ZlcmZsb3cgZm9yIHZlcnkgbGFyZ2UgY2FudmFzX3dpZHRoIC8gaGVpZ2h0CitlZWUwY2NlMSBNZXJnZSAiU21hbGwgTFo3NyBzcGVlZHVwcy4iCis1ZjFjYWYyOSBTbWFsbCBMWjc3IHNwZWVkdXBzLgorMWVmZmRlN2IgZml4IGFuaW1fdXRpbC5jIGNvbXBpbGF0aW9uIHdoZW4gSEFWRV9HSUYgaXMgbm90IGRlZmluZWQuCithMmZlOWJmNCBTcGVlZHVwIFRyZWxsaXNRdWFudGl6ZUJsb2NrKCkuCis1NzNjY2UyNyBzbWFydFlVViBpbXByb3ZlbWVudHMKKzIxZTc1MzdhICBmaXggaW5maW5pdGUgbG9vcCBpbiBjYXNlIG9mIFBBUlRJVElPTjAgb3ZlcmZsb3cKKzA1M2ExNTY1IE1lcmdlICJDaGFuZ2UgdGhlIHJ1bGUgb2YgcGlja2luZyBVViBtb2RlIGluIE1CQW5hbHl6ZUJlc3RVVk1vZGUoKSIKKzEzNzdhYzJlIENoYW5nZSB0aGUgcnVsZSBvZiBwaWNraW5nIFVWIG1vZGUgaW4gTUJBbmFseXplQmVzdFVWTW9kZSgpCis3YzFmYjdkMCBmaXggdWludDMyX3QgaW5pdGlhbGl6YXRpb24gKDAuIC0+IDApCitiZmZmMGJmMyBzcGVlZC11cCBTU0lNIGNhbGN1bGF0aW9uCis2NDU3N2RlOCBEZS1WUDhMLWl6ZSBHZXRFbnRyb3BVbnJlZmluZWRIZWxwZXIuCithN2JlNzMyOCBNZXJnZSAicmVmYWN0b3IgdGhlIFBTTlIgLyBTU0lNIGNhbGN1bGF0aW9uIGNvZGUiCis1MGMzZDdkYSByZWZhY3RvciB0aGUgUFNOUiAvIFNTSU0gY2FsY3VsYXRpb24gY29kZQorZDYyMjhhZWQgaW5kZW50YXRpb24gZml4IGFmdGVyIEk3MDU1ZDNlZTNiZDdlZDVlNzhlOTRhZTgyY2I4NThmYTdkYjNkZGMwCitkZDUzOGIxOSBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uLgorNmNjNDhiMTcgTW92ZSBzb21lIGxvc3NsZXNzIGxvZ2ljIG91dCBvZiBkc3AuCis3ODM2M2U5ZSBNZXJnZSAiUmVtb3ZlIGEgcmVkdW5kYW50IGNhbGwgdG8gSW5pdExlZnQoKSBpbiBWUDhJdGVyYXRvclJlc2V0KCkiCitmZmQwMTkyOSBSZWZhY3RvciBWUDhJdGVyYXRvck5leHQoKS4KK2M0ZjZkOWM5IFJlbW92ZSBhIHJlZHVuZGFudCBjYWxsIHRvIEluaXRMZWZ0KCkgaW4gVlA4SXRlcmF0b3JSZXNldCgpCitjMjdkODIxMCBNZXJnZSAic21hcnRZVVY6IHNpbXBsaWZ5IG1haW4gbG9vcCIKKzA3Nzk1Mjk2IHNtYXJ0WVVWOiBzaW1wbGlmeSBtYWluIGxvb3AKK2M5YjQ1ODYzIFNwbGl0IG9mZiBjb21tb24gbG9zc2xlc3MgZHNwIGlubGluZSBmdW5jdGlvbnMuCis0OTBhZTViMSBzbWFydFlVVjogaW1wcm92ZSBpbml0aWFsIHN0YXRlIGZvciBmYXN0ZXIgY29udmVyZ2VuY2UKKzg5NDIzMmJlIHNtYXJ0WVVWOiBmaXggYW5kIHNpbXBsaWZ5IHRoZSBvdmVyLXplYWxvdXMgc3RvcCBjcml0ZXJpb24KKzhkZTA4NDgzIFJlbW92ZSB1bnVzZWQgY29kZSBpbiB3ZWJwaS5oCis0MWNhYjdmZSBpbWFnZWlvL0FuZHJvaWQubWs6IGNvcnJlY3QgaW1hZ2VkZWMgZGVwZW5kZW5jaWVzCis4MmM5MWM3MCBNZXJnZSAibGliaW1hZ2VlbmMuYTogZXh0cmFjdCBpbWFnZS1zYXZpbmcgY29kZSBmcm9tIGR3ZWJwIgorYWYxYWQzZTIgbGliaW1hZ2VlbmMuYTogZXh0cmFjdCBpbWFnZS1zYXZpbmcgY29kZSBmcm9tIGR3ZWJwCitkZDczMDllMyBNZXJnZSAiZG9jOiB1c2UgdHdvJ3MgY29tcGxlbWVudCBleHBsaWNpdGx5IGZvciB1aW50OC0+aW50OCBjb252ZXJzaW9uIgorNjEwNTc3N2UgTWVyZ2UgImFkZCBnaWYyd2VicCB0byBDTWFrZSIKKzEzYWUwMTFlIGRvYzogdXNlIHR3bydzIGNvbXBsZW1lbnQgZXhwbGljaXRseSBmb3IgdWludDgtPmludDggY29udmVyc2lvbgorNGJkYTBjZmIgYWRkIGdpZjJ3ZWJwIHRvIENNYWtlCis2MDI5YzdmZSBNZXJnZSAicmVtb3ZlIG1lbnRpb24gb2YgZnJhZ21lbnQsIGZyZ20sIEZSR00sIGV0Yy4iCis1NDVjMTQ3ZiByZW1vdmUgbWVudGlvbiBvZiBmcmFnbWVudCwgZnJnbSwgRlJHTSwgZXRjLgorNWI0NmY3ZmMgY3dlYnAuMTogaW1wcm92ZSBzb21lIGdyYW1tYXIKKzllNDc4ZjgwIGRlYy92cDhsLmM6IGFkZCBhc3NlcnRpb25zIGluIEVtaXRSZXNjYWxlZFJvd3NSR0JBL1lVVkEKKzQzYmQ4OTU4IE1ha2UgZ2lmIHRyYW5zcGFyZW50IGNvbG9yIHRvIGJlIHRyYW5zcGFyZW50IGJsYWNrCiswODg3ZmMyZCBNZXJnZSAiZ2V0X2Rpc3RvOiBhZGQgYSAnLW8gZmlsZScgb3B0aW9uIHRvIHNhdmUgYSBkaWZmIG1hcCIKKzBkZTQ4ZTE4IGdldF9kaXN0bzogYWRkIGEgJy1vIGZpbGUnIG9wdGlvbiB0byBzYXZlIGEgZGlmZiBtYXAKKzBhNTdhZDBkIGNvc21ldGljczogV2ViUFNhZmVBbGxvYyAtPiBXZWJQU2FmZU1hbGxvYworMGE0Njk5YmMgTWVyZ2UgIldlYlBQaWN0dXJlRGlzdG9ydGlvbigpOiBmcmVlKCkgLT4gV2ViUFNhZmVGcmVlKCkiCisyOWZlZGJmNSBBbmltX2VuY29kZXI6IGNvcnJlY3RseSBoYW5kbGUgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfCiszMmRlYWQ0ZSBXZWJQUGljdHVyZURpc3RvcnRpb24oKTogZnJlZSgpIC0+IFdlYlBTYWZlRnJlZSgpCis4NWNkNWQwNiBTbWFydGVyIExaNzcgZm9yIHVuaWZvcm0gcmVnaW9ucy4KKzY1ODUwNzVmIENoYW5nZSBQaXhlbHNBcmVTaW1pbGFyKCkgdG8gaGFuZGxlIGJsYWNrIHBpeGVscyBjb3JyZWN0bHkuCitjMGEyN2ZkMiB2d2VicDogQ2xlYXIgcHJldmlvdXMgZnJhbWUgd2hlbiBhIGtleSB0cmlnZ2VycyBhIHJlZHJhdworNTdhNWUzYjYgd2VicF9xdWFsaXR5IHNob3VsZCByZXR1cm4gJzAnIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKzdmMWI4OTdiIEZhc3RlciBzdG9jaGFzdGljIGhpc3RvZ3JhbSBtZXJnaW5nLgorNDhjODEwYjggTWVyZ2UgInJlbW92ZSBXRUJQX0ZPUkNFX0FMSUdORUQgYW5kIHVzZSBtZW1jcHkoKSBpbnN0ZWFkLiIKKzM4ODQ5NzJlIHJlbW92ZSBXRUJQX0ZPUkNFX0FMSUdORUQgYW5kIHVzZSBtZW1jcHkoKSBpbnN0ZWFkLgorNDg1Y2FjMWEgc3dpdGNoIGxpYmltYWdlZGVjLmEgYW5kIGxpYmltYWdlaW9fdXRpbC5hIHRvIGF2b2lkIHVuZGVmaW5lZCBzeW1ib2wKKzAwNWUxNWIxIE1lcmdlICJ7ZXh0cmFzLG11eH0vTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIC1sbSIKKzZhYjQ5NmVkIGZpeCBzb21lICd1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93JyB3YXJuaW5ncyBpbiB1YnNhbgorOGE0ZWJjNmEgUmV2ZXJ0ICJmaXggJ3Vuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cnIHdhcm5pbmdzIGluIHVic2FuIgorOWQ0ZjIwOWYgTWVyZ2UgY2hhbmdlcyBJMjU3MTFkZDUsSTQzMTg4ZmFiCitlNDRmNTI0OCBmaXggJ3Vuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cnIHdhcm5pbmdzIGluIHVic2FuCisyN2I1ZDk5MSBGaXggYXNzZXJ0aW9ucyBpbiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coKQorNzRmNmY5ZTcgQWRkIGRlc2NyaXB0aW9ucyBvZiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gaGVscCBpbmZvLgorYWFmMjUzMGMge2V4dHJhcyxtdXh9L01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyAtbG0KKzEyNjlkYzdjIFJlZmFjdG9yIFZQOExDb2xvckNhY2hlQ29udGFpbnMoKQorNDA4NzJmYjIgZGVjX25lb24sTmVlZHNIZXY6IG1pY3JvIG9wdGltaXphdGlvbgorN2I1NGUyNmIgQWRkIGEgQ01ha2Ugb3B0aW9uIGZvciBXRUJQX1NXQVBfMTZCSVRfQ1NQLgorZDIyMjNkOGQgRml4IG1pc3NpbmcgY3B1LWZlYXR1cmVzIGZvciBBbmRyb2lkLgorYmYxNmE0YjQgTWVyZ2UgImNwdS5jbWFrZTogaW1wcm92ZSB3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcgb3V0cHV0IgorZWUxMDU3ZTMgY3B1LmNtYWtlOiBpbXByb3ZlIHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZyBvdXRwdXQKK2I1NTFlNTg3IGNvc21ldGljczogYWRkIHt9cyBvbiBjb250aW51ZWQgY29udHJvbCBzdGF0ZW1lbnRzCitkMmU0NDg0ZSBkc3AvTWFrZWZpbGUuYW06IHB1dCBtc2Egc291cmNlIGluIGNvcnJlY3QgbGliCitjN2Y2NmM4MiBNZXJnZSAidXRpbHMvdGhyZWFkLmMsY29zbWV0aWNzOiBqb2luIGEgZmV3IGxpbmVzIgorOThkOGYyOTUgTWVyZ2UgImV4YW1wbGVzL01ha2VmaWxlLmFtLGNvc21ldGljczogc29ydCBiaW5hcnkgdGFyZ2V0cyIKKzM5ZjRmZmJjIHV0aWxzL3RocmVhZC5jLGNvc21ldGljczogam9pbiBhIGZldyBsaW5lcworYTg2Y2UyYjEgTWVyZ2UgImV4dHJhcy9NYWtlZmlsZS5hbTogZG9uJ3QgaW5zdGFsbCBsaWJ3ZWJwZXh0cmFzIgorNmZhOWZlMjQgZXh0cmFzL01ha2VmaWxlLmFtOiBkb24ndCBpbnN0YWxsIGxpYndlYnBleHRyYXMKKzBiMmM1OGE5IEZpeCBhbiB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGVycm9yIGluIGVuYy9jb3N0LmgKK2Q3Y2U0YTJlIGV4YW1wbGVzL01ha2VmaWxlLmFtLGNvc21ldGljczogc29ydCBiaW5hcnkgdGFyZ2V0cworMzg2ZTRiYTIgUmVzZXQgc2VnbWVudCBpZCBpZiB3ZSBkZWNpZGUgbm90IHRvIHVwZGF0ZSBzZWdtZW50IG1hcAorN2I4N2U4NDggTWVyZ2UgIkFkZCBNU0Egb3B0aW1pemVkIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMiCitkM2RkYWNiNiBBZGQgTVNBIG9wdGltaXplZCBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zCitlYjk4ZDhkOCB3ZWJwX3F1YWxpdHk6IGRldGVjdCBsb3NzbGVzcyBmb3JtYXQgYW5kIGZlYXR1cmVzCitlYmVlNTdmNCBtb3ZlIGltYWdlaW8vZXhhbXBsZV91dGlsLltoY10gKGJhY2sgdG8pIGV4YW1wbGVzLworOTk1NDJiYmYgd2VicGRlYzogcy9FeFV0aWwvLworZGE1NzNjZjQgaW1hZ2Vpb191dGlsOiBzL0V4VXRpbC9JbWdJb1V0aWwvCitiZGRhNWJkNCBzcGxpdCBleGFtcGxlX3V0aWwuaAorMTVlZDQ2MmIgLmdpdGlnbm9yZTogYWRkIGV4dHJhcy97Z2V0X2Rpc3RvLHdlYnBfcXVhbGl0eX0KKzdiZTU3NDg5IE1lcmdlICJWUDhFc3RpbWF0ZVF1YWxpdHkoKTogcm91Z2h0eSBlc3RpbWF0ZSB3ZWJwIGJpdHN0cmVhbSBxdWFsaXR5IGZhY3RvciIKKzU3MDIwNTI1IE1ha2VmaWxlLnZjOiBhZGQgbWlzc2luZyBpbWFnZWlvIHRhcmdldAorZThhYjZhODIgVlA4RXN0aW1hdGVRdWFsaXR5KCk6IHJvdWdodHkgZXN0aW1hdGUgd2VicCBiaXRzdHJlYW0gcXVhbGl0eSBmYWN0b3IKK2ZlZTdiM2Q2IE1lcmdlICInZXh0cmFzL2dldF9kaXN0bycgZXhhbXBsZTogY29tcHV0ZSBQU05SIGJldHdlZW4gdHdvIGZpbGVzIgorMWU3ZDQ0MDEgJ2V4dHJhcy9nZXRfZGlzdG8nIGV4YW1wbGU6IGNvbXB1dGUgUFNOUiBiZXR3ZWVuIHR3byBmaWxlcworNGNlY2FiNjMgcG5nZGVjLmMsanBlZ2RlYy5baGNdOiByZW1vdmUgdW5uZWNlc3NhcnkgaW5jbHVkZXMKKzI1OWYwNDM0IG1ha2VmaWxlLnVuaXg6IG5vcm1hbGl6ZSBpbWFnZSBkZWNvZGUgbGliIG5hbWUKK2VkMzRjMzliIGZpeDogZXhhbXBsZXMvbGliZXhhbXBsZV9kZWMuYSA9PiBpbWFnZWlvL2xpYmV4YW1wbGVfZGVjLmEKKzMzZDhkMGQ0IE1lcmdlICJtb3ZlIGV4YW1wbGVzL3tleGFtcGxlX3V0aWwsaW1hZ2VfZGVjfSB0byBpbWFnZWlvLyIKK2M5NjBiODJlIE1lcmdlICJleHRyYXMuaDogY29ycmVjdCBpbmNsdWRlIGd1YXJkIgorZmUzY2QyOGEgTWVyZ2UgIi5naXRpZ25vcmU6IGFkZCAuZ3JhZGxlLCAvYnVpbGQiCis0NWZiZWJhNSBNZXJnZSAiRG8gdG9rZW4gcmVjb3JkaW5nIGFuZCBjb3VudGluZyBpbiBhIHNpbmdsZSBsb29wIgorNGYzM2M4MjAgLmdpdGlnbm9yZTogYWRkIC5ncmFkbGUsIC9idWlsZAorYzM3OWI1NWEgbW92ZSBleGFtcGxlcy97ZXhhbXBsZV91dGlsLGltYWdlX2RlY30gdG8gaW1hZ2Vpby8KKzUxMDhkOWFhIGV4dHJhcy5oOiBjb3JyZWN0IGluY2x1ZGUgZ3VhcmQKK2FkNDk3ZmJjIG1vdmUgc3JjL2V4dHJhcyB0byB0aGUgdG9wLWxldmVsCiswYzBmYjgzMiBEbyB0b2tlbiByZWNvcmRpbmcgYW5kIGNvdW50aW5nIGluIGEgc2luZ2xlIGxvb3AKKzlhYzc0ZjkyIEFkZCBNU0Egb3B0aW1pemVkIHJlc2NhbGluZyBmdW5jdGlvbnMKK2NiMTlkYmMxIEFkZCBNU0Egb3B0aW1pemVkIGNvbG9yIHRyYW5zZm9ybSBmdW5jdGlvbnMKKzNmNDA0MmI1IFdlYlBBbmltRW5jb2RlcjogSWYgJ21pbmltaXplX3NpemUnIGFuZCAnYWxsb3dfbWl4ZWQnIG9uLCB0cnkgbG9zc3kgKyBsb3NzbGVzcy4KKzVlMmViODllIGNvc21ldGljcyxkc3AvKm1zYS5jOiBhc3NvY2lhdGUgJyonIHdpdGggdGhlIHR5cGUKKzViNjBkYjVjIEZhc3RNQkFuYWx5emUoKSBmb3IgcXVpY2sgaTE2L2k0IGRlY2lzaW9uCis1NjdlNjk3NyBBZGQgTVNBIG9wdGltaXplZCBDb2xsZWN0SGlzdG9ncmFtIGZ1bmN0aW9uCitjNTRhYjhkZCBBZGQgTVNBIG9wdGltaXplZCBxdWFudGl6YXRpb24gZnVuY3Rpb25zCitlYzZmNjhjNSBNZXJnZSAiUmVtb3ZlIFF1YW50aXplQmxvY2tXSFQoKSBpbiBlbmMuYyIKKzJhNWM0MTdjIEFwcGx5IHRoZSBSTEUgaGV1cmlzdGljIHRvIExaNzcuCis5MWI1OWU4OCBSZW1vdmUgUXVhbnRpemVCbG9ja1dIVCgpIGluIGVuYy5jCitmZTU3MjczNyBBZGQgTVNBIG9wdGltaXplZCBTU0UgZnVuY3Rpb25zCis2YjUzY2E4NyBjb3NtZXRpY3MsKGRlY3xlbmMpX3NzZTIuYzogZml4IGluZGVudAorYjE1ZDAwZDkgTWVyZ2UgIkFkZCBNU0Egb3B0aW1pemVkIGVuY29kZXIgSW50cmFDaHJvbWFQcmVkcyBmdW5jdGlvbiIKK2FmZTNjZWM4IEFkZCBNU0Egb3B0aW1pemVkIGVuY29kZXIgSW50cmFDaHJvbWFQcmVkcyBmdW5jdGlvbgorZmM4Y2FkOWYgcmVkdWNlIHRoZSBudW1iZXIgb2YgbWFsbG9jL2ZyZWUgY3ljbGVzIGluIGh1ZmZtYW4uYworN2I0YjA1ZTAgQWRkIE1TQSBvcHRpbWl6ZWQgZW5jb2RlciBJbnRyYTE2UHJlZHMgZnVuY3Rpb24KK2MxODc4N2EwIEFkZCBNU0Egb3B0aW1pemVkIGVuY29kZXIgSW50cmE0UHJlZHMgZnVuY3Rpb24KKzQ3OWQxOTA4IHdlYnBtdXg6IEFsc28gcHJpbnQgY29tcHJlc3Npb24gaW5mbyBwZXIgZnJhbWUuCithODBlOGNmZCBQcm92aWRlIHN1cHBvcnQgZm9yIENNYWtlIG9uIEFuZHJvaWQgc3R1ZGlvIDIuMi4KKzZjNjI4NDEwIFNwbGl0IHRoZSBtYWluIENNYWtlIGZpbGUuCitiYmI2ZWNkOSBNZXJnZSAiQWRkIE1TQSBvcHRpbWl6ZWQgZGlzdG9ydGlvbiBmdW5jdGlvbnMiCis3OTE1Mzk2ZiBBZGQgTVNBIG9wdGltaXplZCBkaXN0b3J0aW9uIGZ1bmN0aW9ucworNjUyZTk0NGYgTWVyZ2UgImJ1aWxkLmdyYWRsZTogcmVtb3ZlIHRhYiIKK2MwOTkxYTE0IGlvLEVtaXRSZXNjYWxlZEFscGhhWVVWOiBmYWN0b3Igb3V0IGEgY29tbW9uIGV4cHIKKzQ4YmY1ZWQxIGJ1aWxkLmdyYWRsZTogcmVtb3ZlIHRhYgorYmZlZjZjOWYgTWVyZ2UgdGFnICd2MC41LjEnCiszZDk3YmI3NSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjUuMSwgb3JpZ2luLzAuNS4xLCAwLjUuMSkKK2RlYjU0ZDkxIENsYXJpZnkgdGhlIGV4cGVjdGVkICdjb25maWcnIGxpZmVzcGFuIGluIFdlYlBJRGVjb2RlKCkKKzQzNTMwOGUwIEFkZCBNU0Egb3B0aW1pemVkIGVuY29kZXIgdHJhbnNmb3JtIGZ1bmN0aW9ucworZGNlNjRiZmEgQWRkIE1TQSBvcHRpbWl6ZWQgYWxwaGEgZmlsdGVyIGZ1bmN0aW9ucworNDI5MTIwZDAgQWRkIE1TQSBvcHRpbWl6ZWQgY29sb3IgdHJhbnNmb3JtIGZ1bmN0aW9ucworYzdlMmQyNDUgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC41LjEtcmM1KQorNTViMmZlZGUgbm9ybWFsaXplIHRoZSBtYWNyb3MnICJkbyB7Li4ufSB3aGlsZSAoMCkiIGNvbnN0cnVjdHMKKzcwMWM3NzJlIEFkZCBNU0Egb3B0aW1pemVkIGNvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMKK2M3ZWIwNmY3IEZpeCBjb3JuZXIgY2FzZSBpbiBDb3N0TWFuYWdlckluaXQuCitmOTE4Y2IxMCBmaXggcmVzY2FsaW5nIGJ1ZzogYWxwaGEgcGxhbmUgd2Fzbid0IGZpbGxlZCB3aXRoIDB4ZmYKK2FiNzkzN2E1IGdpZjJ3ZWJwOiBub3JtYWxpemUgdGhlIG51bWJlciBvZiAuJ3MgaW4gdGhlIGhlbHAgbWVzc2FnZQorM2NkZWM4NDcgdndlYnA6IG5vcm1hbGl6ZSB0aGUgbnVtYmVyIG9mIC4ncyBpbiB0aGUgaGVscCBtZXNzYWdlCitiZGY2MjQxZSBjd2VicDogbm9ybWFsaXplIHRoZSBudW1iZXIgb2YgLidzIGluIHRoZSBoZWxwIG1lc3NhZ2UKKzA2YTM4YzdiIGZpeCByZXNjYWxpbmcgYnVnOiBhbHBoYSBwbGFuZSB3YXNuJ3QgZmlsbGVkIHdpdGggMHhmZgorMzE5ZTM3YmUgSW1wcm92ZSBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKzZhMTk3OTM3IEFkZCBNU0Egb3B0aW1pemVkIGludHJhIHByZWQgY2hyb21hIGZ1bmN0aW9ucworNDQ3YWRiY2UgJ291ciBidWcgdHJhY2tlcicgLT4gJ3RoZSBidWcgdHJhY2tlcicKKzk3YjllNjQ0IG5vcm1hbGl6ZSB0aGUgbnVtYmVyIG9mIC4ncyBpbiB0aGUgaGVscCBtZXNzYWdlCisyOTNkNzg2ZiBBZGRlZCBNU0Egb3B0aW1pemVkIGludHJhIHByZWRpY3Rpb24gMTZ4MTYgZnVuY3Rpb25zCiswYWZhMGNlMiBBZGRlZCBNU0Egb3B0aW1pemVkIGludHJhIHByZWRpY3Rpb24gNHg0IGZ1bmN0aW9ucworYTY2MjFiYWMgQWRkZWQgTVNBIG9wdGltaXplZCBzaW1wbGUgZWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCitiYjUwYmY0MiBwbmdkZWMsUmVhZEZ1bmM6IHRocm93IGFuIGVycm9yIG9uIGludmFsaWQgcmVhZAorMzgwNjNhZjEgZGVjb2RlLmgsV2ViUEdldEluZm86IG5vcm1hbGl6ZSBmdW5jdGlvbiBjb21tZW50CisxZWJmMTkzYyBBZGRlZCBNU0Egb3B0aW1pemVkIGNocm9tYSBlZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKzlhZDIzNTJkIE1lcmdlICJBZGRlZCBNU0Egb3B0aW1pemVkIGVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucyIKKzYwNzUxMDk2IEFkZGVkIE1TQSBvcHRpbWl6ZWQgZWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCis5ZThlMWI3YiBJbmxpbmUgR2V0UmVzaWR1YWwgZm9yIHNwZWVkLgorN2Q1OGQxYjcgU3BlZWQtdXAgdW5pZm9ybS1yZWdpb24gcHJvY2Vzc2luZy4KKzhlYzcwMzJiIHNpbXBsaWZ5IEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKCkKKzIzZTI5Y2IxIE1lcmdlICJGaXggYSBib3VuZGFyeSBjYXNlIGluIEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seS4iIGludG8gMC41LjEKKzQ3MmEwNDliIHJlbW92ZSBiaW5fbWFwW10gYWxsb2NhdGlvbiBhbHRvZ2V0aGVyCiswYmIyM2IyYyBmcmVlIC0+IFdlYlBTYWZlRnJlZSgpCithOTc3YjRiNSBNZXJnZSAicmV3cml0ZSB0aGUgYmluX21hcCBjbHVzdGVyaW5nIHRvIHVzZSBsZXNzIG1lbW9yeSIKKzM1OTFiYTY2IHJld3JpdGUgdGhlIGJpbl9tYXAgY2x1c3RlcmluZyB0byB1c2UgbGVzcyBtZW1vcnkKK2U2YWM0NTBjIHV0aWxzLltoY106IHMvTUFYX0NPTE9SX0NPVU5UL01BWF9QQUxFVFRFX1NJWkUvCitlN2I5MTc3MiBNZXJnZSAiRGVjb2RlSW1hZ2VEYXRhKCk6IGNoYW5nZSB0aGUgaW5jb3JyZWN0IGFzc2VydCIgaW50byAwLjUuMQorMmFiZmE1NGYgRGVjb2RlSW1hZ2VEYXRhKCk6IGNoYW5nZSB0aGUgaW5jb3JyZWN0IGFzc2VydAorNWE0OGZjZDggTWVyZ2UgImNvbmZpZ3VyZTogdGVzdCBmb3IgLVdmbG9hdC1jb252ZXJzaW9uIgorMDE3NGQxOGQgRml4IGEgYm91bmRhcnkgY2FzZSBpbiBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkuCis2YTljMjYyYSBNZXJnZSAiQWRkZWQgTVNBIG9wdGltaXplZCB0cmFuc2Zvcm0gZnVuY3Rpb25zIgorY2ZiY2M1ZWMgTWFrZSBzdXJlIHRvIGNvbnNpZGVyIHNtYWxsIGRpc3RhbmNlcyBpbiBMWjc3LgorNWU2MGM0MmEgQWRkZWQgTVNBIG9wdGltaXplZCB0cmFuc2Zvcm0gZnVuY3Rpb25zCiszZGMyOGQ3NiBjb25maWd1cmU6IHRlc3QgZm9yIC1XZmxvYXQtY29udmVyc2lvbgorZjJhMDk0NmEgYWRkIHNvbWUgYXNzZXJ0cyB0byBkZWxpbWl0IHRoZSBwZXJpbWV0ZXIgb2YgQ29zdE1hbmFnZXIncyBvcGVyYXRpb24KKzlhNTgzYzY2IGZpeCBpbnZhbGlkLXdyaXRlIGJ1ZyBmb3IgYWxwaGEtZGVjb2RpbmcKK2Y2NjUxMmRiIG1ha2UgZ3JhZGxldyBleGVjdXRhYmxlCis2ZmRhNThmMSBiYWNrd2FyZF9yZWZlcmVuY2VzOiBxdWlldCBkb3VibGUtPmludCB3YXJuaW5nCithNDhjYzlkMiBNZXJnZSAiRml4IGEgY29tcHJlc3Npb24gcmVncmVzc2lvbiBmb3IgaW1hZ2VzIHdpdGggbG9uZyB1bmlmb3JtIHJlZ2lvbnMuIiBpbnRvIDAuNS4xCitjYzI3MjBjMSBNZXJnZSAiUmV2ZXJ0IGFuIExaNzcgYm91bmRhcnkgY29uc3RhbnQuIiBpbnRvIDAuNS4xCiswNTlhYWI0ZiBGaXggYSBjb21wcmVzc2lvbiByZWdyZXNzaW9uIGZvciBpbWFnZXMgd2l0aCBsb25nIHVuaWZvcm0gcmVnaW9ucy4KK2IwYzdlNDllIENoZWNrIG1vcmUgYmFja3dhcmQgbWF0Y2hlcyB3aXRoIGhpZ2hlciBxdWFsaXR5LgorYTM2MTE1MTMgUmV2ZXJ0IGFuIExaNzcgYm91bmRhcnkgY29uc3RhbnQuCis4MTkwMzc0YyBSRUFETUU6IGZpeCB0eXBvCis3NTUxZGI0NCB1cGRhdGUgTkVXUworMGZiMjI2OWMgYnVtcCB2ZXJzaW9uIHRvIDAuNS4xCitmNDUzNzYxMCB1cGRhdGUgQVVUSE9SUyAmIC5tYWlsbWFwCiszMjU5NTcxZSBSZWZhY3RvciBHZXRDb2xvclBhbGV0dGUgbWV0aG9kLgorMWRmNWUyNjAgYXZvaWQgdXNpbmcgdG1wIGhpc3RvZ3JhbSBpbiBQcmVwYXJlUGFpcigpCis3Njg1MTIzYSBmaXggY29tbWVudCB0eXBvcworYTI0NmI5MjEgU3BlZWR1cCBiYWNrd2FyZCByZWZlcmVuY2VzLgorNzZkNzNmMTggTWVyZ2UgIkNvc3RNYW5hZ2VyOiBpbnRyb2R1Y2UgYSBmcmVlLWxpc3Qgb2YgfjEwIGludGVydmFscyIKK2VhYjM5ZDgxIENvc3RNYW5hZ2VyOiBpbnRyb2R1Y2UgYSBmcmVlLWxpc3Qgb2YgfjEwIGludGVydmFscworNGM1OWFhYzAgTWVyZ2UgIm1pcHMgbXNhIHdlYnAgY29uZmlndXJhdGlvbiIKKzA0M2MzM2YxIE1lcmdlICJJbXByb3ZlIHNwZWVkIGFuZCBjb21wcmVzc2lvbiBpbiBiYWNrd2FyZCByZWZlcmVuY2UgZm9yIGxvc3NsZXNzLiIKKzcxYmU5YjhjIE1lcmdlICJjbGFyaWZ5IHZhcmlhYmxlIG5hbWVzIGluIEhpc3RvZ3JhbVJlbWFwKCkiCiswYmE3ZmQ3MCBJbXByb3ZlIHNwZWVkIGFuZCBjb21wcmVzc2lvbiBpbiBiYWNrd2FyZCByZWZlcmVuY2UgZm9yIGxvc3NsZXNzLgorMDQ4MWQ0MmEgQ29zdE1hbmFnZXI6IGNhY2hlIG9uZSBpbnRlcnZhbCBhbmQgcmUtdXNlIGl0IHdoZW4gcG9zc2libGUKKzQxYjdlNmI1IE1lcmdlICJoaXN0b2dyYW06IGZpeCBiaW4gY2FsY3VsYXRpb24iCis5NmMzZDYyNCBoaXN0b2dyYW06IGZpeCBiaW4gY2FsY3VsYXRpb24KK2ZlOWUzMWVmIGNsYXJpZnkgdmFyaWFibGUgbmFtZXMgaW4gSGlzdG9ncmFtUmVtYXAoKQorY2UzYzgyNDcgZGlzYWJsZSBuZWFyLWxvc3NsZXNzIHF1YW50aXphdGlvbiBpZiBwYWxldHRlIGlzIHVzZWQKK2UxMWRhMDgxIG1pcHMgbXNhIHdlYnAgY29uZmlndXJhdGlvbgorNWY4Zjk5OGQgbXV4OiBQcmVzZW5jZSBvZiB1bmtub3duIGNodW5rcyBzaG91bGQgdHJpZ2dlciBWUDhYIGNodW5rIG91dHB1dC4KK2NhZGVjMGIxIE1lcmdlICJTeW5jIG1pcHMzMiBhbmQgZHNwX3IyIFlVVi0+UkdCIGNvZGUgd2l0aCBDIHZlcmlzb24iCitkOTYzNzc1OCBDb21wdXRlIHRoZSBoYXNoIGNoYWluIG9uY2UgYW5kIGZvciBhbGwgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorNTBhNDg2NjUgU3luYyBtaXBzMzIgYW5kIGRzcF9yMiBZVVYtPlJHQiBjb2RlIHdpdGggQyB2ZXJpc29uCitlZWU3ODhlMiBNZXJnZSAiaW50cm9kdWNlIGEgY29tbW9uIHNpZ25hdHVyZSBmb3IgYWxsIGltYWdlIHJlYWRlciBmdW5jdGlvbiIKK2Q3N2I4NzdjIGludHJvZHVjZSBhIGNvbW1vbiBzaWduYXR1cmUgZm9yIGFsbCBpbWFnZSByZWFkZXIgZnVuY3Rpb24KK2NhOGQ5NTE5IHJlbW92ZSBzb21lIG9ic29sZXRlIFRPRE9zCithZTJhNzIyMiBjb2xsZWN0IGFsbCBkZWNvZGluZyB1dGlsaXRpZXMgZnJvbSBleGFtcGxlcy8gaW4gbGliZXhhbXBsZWRlYy5hCiswYjhhZTg1MiBNZXJnZSAiTW92ZSBEaXRoZXJDb21iaW5lOHg4IHRvIGRzcC9kZWMuYyIKKzc3Y2FkODg1IE1lcmdlICJSZWFkV2ViUDogYXZvaWQgY29udmVyc2lvbiB0byBBUkdCIGlmIGZpbmFsIGZvcm1hdCBpcyBZVVZBIgorYWI4ZDY2OTggUmVhZFdlYlA6IGF2b2lkIGNvbnZlcnNpb24gdG8gQVJHQiBpZiBmaW5hbCBmb3JtYXQgaXMgWVVWQQorZjhiN2NlOWUgTWVyZ2UgInRlc3QgcG9pbnRlciB0byBOVUxMIGV4cGxpY2l0bHkiCis1ZGY2ZjIxNCB0ZXN0IHBvaW50ZXIgdG8gTlVMTCBleHBsaWNpdGx5Cis3N2YyMWM5YyBNb3ZlIERpdGhlckNvbWJpbmU4eDggdG8gZHNwL2RlYy5jCitjOWU2ZDg2NSBBZGQgZ3JhZGxlIHN1cHBvcnQKK2M2NWY0MWU4IFJldmVydCAiQWRkIGdyYWRsZSBzdXBwb3J0IgorYmY3MzFlZGUgQWRkIGdyYWRsZSBzdXBwb3J0CiswODMzM2I4NSBXZWJQQW5pbUVuY29kZXI6IERldGVjdCB3aGVuIGNhbnZhcyBpcyBtb2RpZmllZCwgcmVzdG9yZSBvbmx5IHdoZW4gbmVlZGVkLgorMDIwOWQ3ZTYgTWVyZ2UgInNwZWVkLXVwIE1hcFRvUGFsZXR0ZSgpIHdpdGggYmluYXJ5IHNlYXJjaCIKK2ZkZDI5YTNkIHNwZWVkLXVwIE1hcFRvUGFsZXR0ZSgpIHdpdGggYmluYXJ5IHNlYXJjaAorY2Y0YTY1MWIgUmV2ZXJ0ICJSZWZhY3RvciBHZXRDb2xvclBhbGV0dGUgbWV0aG9kLiIKKzBhMjdhY2EzIE1lcmdlIGNoYW5nZXMgSWRmYThjZTgzLEkxOWFkYzljNAorZjI1YzQ0MDYgV2ViUEFuaW1FbmNvZGVyOiBSZXN0b3JlIG9yaWdpbmFsIGNhbnZhcyBiZXR3ZWVuIG11bHRpcGxlIGVuY29kZXMuCisxNjkwMDRiMSBSZWZhY3RvciBHZXRDb2xvclBhbGV0dGUgbWV0aG9kLgorNTc2MzYyYWIgVlA4TERvRmlsbEJpdFdpbmRvdzogc3VwcG9ydCBiaWctZW5kaWFuIGluIGZhc3QgcGF0aAorYWM0OWU0ZTQgYml0X3JlYWRlci5jOiBzL1ZQOExfVVNFX1VOQUxJR05FRF9MT0FEL1ZQOExfVVNFX0ZBU1RfTE9BRC8KK2QzOWNlYjU4IFZQOExEb0ZpbGxCaXRXaW5kb3c6IHJlbW92ZSBzdGFsZSBUT0RPCisyZWMyZGUxNCBNZXJnZSAiU3BlZWQtdXAgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5LiIKKzNlMDIzYzE3IFNwZWVkLXVwIEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seS4KK2YyZTFlZmJlIEltcHJvdmUgbmVhciBsb3NzbGVzcyBjb21wcmVzc2lvbiB3aGVuIGEgcHJlZGljdGlvbiBmaWx0ZXIgaXMgdXNlZC4KK2UxNWFmYmNlIGRzcC5oOiBmaXggdWJzYW4gbWFjcm8gbmFtZQorZTUzYzljY2IgZHNwLmg6IGFkZCBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVworYWY4MWZkYjcgdXRpbHMuaDogcXVpZXQgLWZzYW5pdGl6ZT11bmRlZmluZWQgd2FybmluZ3MKK2VhMGJlMzU0IGRzcC5oOiByZW1vdmUgdXRpbHMuaCBpbmNsdWRlCitjZDI3NmFlYyB1dGlscy8qLmM6IC4uL3V0aWxzL3V0aWxzLmggLT4gLi91dGlscy5oCitjODkyNzEzMSB1dGlscy9NYWtlZmlsZS5hbTogYWRkIHNvbWUgbWlzc2luZyBoZWFkZXJzCitlYTI0ZTAyNiBNZXJnZSAiZHNwLmg6IGFkZCBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRiIKKzM2OWUyNjRlIGRzcC5oOiBhZGQgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYKKzBkMDIwYTc4IE1lcmdlICJhZGQgcnVudGltZSBORU9OIGRldGVjdGlvbiIKKzVlZTIxMzZhIE1lcmdlICJhZGQgVlA4TEFkZFBpeGVscygpIHRvIGxvc3NsZXNzLmgiCis0NzQzNWE2MSBhZGQgVlA4TEFkZFBpeGVscygpIHRvIGxvc3NsZXNzLmgKKzhmYTZhYzY4IHJlbW92ZSB0d28gdWJzYW4gd2FybmluZ3MKKzc0ZmI1NmZiIGFkZCBydW50aW1lIE5FT04gZGV0ZWN0aW9uCis0MTU0YTgzOSBNSVBTIHVwZGF0ZSB0byBuZXcgVW5maWx0ZXIgQVBJCitjODBiOWZjOCBNZXJnZSAiY2hlcnJ5LXBpY2sgZGVjb2RlciBmaXggZm9yIDY0LWJpdCBhbmRyb2lkIGRldmljZXMiCis2MjM1MTQ3ZSBjaGVycnktcGljayBkZWNvZGVyIGZpeCBmb3IgNjQtYml0IGFuZHJvaWQgZGV2aWNlcworZDQxYjhjNDMgY29uZmlndXJlOiB0ZXN0IGZvciAtV2Zvcm1hdC0qIHcvLVdmb3JtYXQgcHJlc2VudAorNWY5NTU4OWYgRml4IFdFQlBfQUxJR04gaW4gY2FzZSB0aGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgdHlwZSBsYXJnZXIgdGhhbiBhIGJ5dGUuCisyMzA5ZmQ1YyByZXBsYWNlIG51bV9wYXJ0c18gYnkgbnVtX3BhcnRzX21pbnVzX29uZV8gKHVuc2lnbmVkKQorOTYyOWY0YmMgU2ltcGxpZnlTZWdtZW50czogcXVpZXQgLVdhcnJheS1ib3VuZHMgd2FybmluZworZGU0NzQ5MmUgTWVyZ2UgInVwZGF0ZSB0aGUgVW5maWx0ZXIgQVBJIGluIGRzcCB0byBwcm9jZXNzIG9uZSByb3cgaW5kZXBlbmRlbnRseSIKKzIxMDJjY2QwIHVwZGF0ZSB0aGUgVW5maWx0ZXIgQVBJIGluIGRzcCB0byBwcm9jZXNzIG9uZSByb3cgaW5kZXBlbmRlbnRseQorZTM5MTJkNTYgV2ViUEFuaW1FbmNvZGVyOiBSZXN0b3JlIGNhbnZhcyBiZWZvcmUgZXZhbHVhdGluZyBibGVuZGluZyBwb3NzaWJpbGl0eS4KKzZlMTJlMWUzIFdlYlBBbmltRW5jb2RlcjogRml4IGZvciBzaW5nbGUtZnJhbWUgb3B0aW1pemF0aW9uLgorNjAyZjM0NGEgTWVyZ2UgY2hhbmdlcyBJMWQwM2FjYWMsSWZjYjY0MjE5Cis5NWVjY2NmNiBvbmx5IGFwcGx5IGNvbG9yLW1hcHBpbmcgZm9yIGFscGhhIG9uIHRoZSBjcm9wcGVkIGFyZWEKKzQ3ZGQwNzA4IGFuaW1fZGlmZjogQWRkIGFuIGV4cGVyaW1lbnRhbCBvcHRpb24gZm9yIG1heCBpbnRlci1mcmFtZSBkaWZmLgorYWE4MDljZmUgb25seSBhbGxvY2F0ZSBhbHBoYV9wbGFuZV8gdXAgdG8gY3JvcF9ib3R0b20gcm93CiszMWYyYjhkOCBXZWJQQW5pbUVuY29kZXI6IEZsYXR0ZW5TaW1pbGFyUGl4ZWxzKCk6IGxvb2sgZm9yIHNpbWlsYXIKKzc3NGRmYmRjIHBlcmZvcm0gYWxwaGEgZmlsdGVyaW5nIHdpdGhpbiB0aGUgZGVjb2RpbmcgbG9vcAorYTRjYWU2OGQgbG9zc2xlc3MgZGVjb2Rpbmc6IG9ubHkgcHJvY2VzcyBkZWNvZGVkIHJvdyB1cCB0byBsYXN0X3JvdworMjM4Y2RjZGIgT25seSBjYWxsIFdlYlBEZXF1YW50aXplTGV2ZWxzKCkgb24gY3JvcHBlZCBhcmVhCitjZjZjNzEzYSBhbHBoYTogcHJlcGFyYXRvcnkgY2xlYW51cAorYjk1YWMwYTIgTWVyZ2UgIlZQOEdldEhlYWRlcnMoKTogaW5pdGlhbGl6ZSBWUDhJbyB3aXRoIHNhbmUgdmFsdWUgZm9yIGNyb3Avc2NhbGUgZGltZW5zaW9ucyIKKzg5MjMxMzk0IFZQOEdldEhlYWRlcnMoKTogaW5pdGlhbGl6ZSBWUDhJbyB3aXRoIHNhbmUgdmFsdWUgZm9yIGNyb3Avc2NhbGUgZGltZW5zaW9ucworNTgyOGUxOTkgdXNlXzhiX2RlY29kZSAtPiB1c2VfOGJfZGVjb2RlXworOGRjYTAyNDcgZml4IGJ1ZyBpbiBhbHBoYS5jIHRoYXQgd2FzIHRyaWdnZXJpbmcgYSBtZW1vcnkgZXJyb3IgaW4gaW5jcmVtZW50YWwgbW9kZQorOWE5NTBjNTMgV2ViUEFuaW1FbmNvZGVyOiBEaXNhYmxlIGZpbHRlcmluZyB3aGVuIGJsZW5kaW5nIGlzIHVzZWQgd2l0aCBsb3NzeSBlbmNvZGluZy4KK2ViNDIzOTAzIFdlYlBBbmltRW5jb2RlcjogY2hvb3NlIG1heCBkaWZmIGZvciBmcmFtZXJlY3QgYmFzZWQgb24gcXVhbGl0eS4KK2ZmMGE5NGJlIFdlYlBBbmltRW5jb2RlciBsb3NzeTogaWdub3JlIHNtYWxsIHBpeGVsIGRpZmZlcmVuY2VzIGZvciBmcmFtZSByZWN0YW5nbGVzLgorZjgwNDAwODQgZ2lmMndlYnA6IFJlbW92ZSB0aGUgJ3ByZXZfdG9fcHJldl9jYW52YXMnIGJ1ZmZlci4KKzZkOGMwN2QzIE1lcmdlICJXZWJQRGVxdWFudGl6ZUxldmVscygpOiB1c2Ugc3RyaWRlIGluIENvdW50TGV2ZWxzKCkiCitkOTZmZTVlMCBXZWJQRGVxdWFudGl6ZUxldmVscygpOiB1c2Ugc3RyaWRlIGluIENvdW50TGV2ZWxzKCkKK2VjMWIyNDA3IFdlYlBQaWN0dXJlSW1wb3J0KjogY2hlY2sgb3V0cHV0IHBvaW50ZXIKK2MwNzY4NzY5IE1lcmdlICJSZXZlcnQgIlJlLWVuYWJsZSBlbmNvZGluZyBvZiBhbHBoYSBwbGFuZSB3aXRoIGNvbG9yIGNhY2hlIGZvciBuZXh0IHJlbGVhc2UuIiIKKzQxZjE0YmNiIFdlYlBQaWN0dXJlSW1wb3J0KjogY2hlY2sgc3JjIHBvaW50ZXIKKzY0ZWVkMzg3IFBhc3Mgc3RyaWRlIHBhcmFtZXRlciB0byBXZWJQRGVxdWFudGl6ZUxldmVscygpCis5NzkzNGUyNCBSZXZlcnQgIlJlLWVuYWJsZSBlbmNvZGluZyBvZiBhbHBoYSBwbGFuZSB3aXRoIGNvbG9yIGNhY2hlIGZvciBuZXh0IHJlbGVhc2UuIgorZTg4YzRjYTAgZml4IC1tIDIgbW9kZS1jb3N0IGV2YWx1YXRpb24gKGNhdXNpbmcgcGFydGl0aW9uMCBvdmVyZmxvdykKKzQ1NjJlODNkIE1lcmdlICJhZGQgZXh0cmEgbWVhbmluZyB0byBXZWJQRGVjQnVmZmVyOjppc19leHRlcm5hbF9tZW1vcnkiCithYmRiMTA5ZiBhZGQgZXh0cmEgbWVhbmluZyB0byBXZWJQRGVjQnVmZmVyOjppc19leHRlcm5hbF9tZW1vcnkKKzg3NWFlYzcwIGVuY19uZW9uLGNvc21ldGljczogYnJlYWsgbG9uZyBjb21tZW50Cis3MWU4NTZjZiBHZXRNQlNTSU0sY29zbWV0aWNzOiBmaXggYWxpZ25tZW50CithOTBlZGZmYiBmaXggbWlzc2luZyAnZXh0ZXJuJyBmb3IgU1NJTSBmdW5jdGlvbiBpbiBkc3AvCis0MjNlY2FmNCBtb3ZlIHNvbWUgU1NJTS1hY2N1bXVsYXRpb24gZnVuY3Rpb24gZm9yIGRzcC8KK2YwOGU2NjI0IE1lcmdlICJGaXggRmluZENsb3Nlc3REaXNjcmV0aXplZCBpbiBuZWFyIGxvc3NsZXNzOiIKKzBkNDBjYzVlIGVuY19uZW9uLERpc3RvNHg0OiByZW1vdmUgYW4gdW5uZWNlc3NhcnkgdHJhbnNwb3NlCitlOGZlYjIwZSBGaXggRmluZENsb3Nlc3REaXNjcmV0aXplZCBpbiBuZWFyIGxvc3NsZXNzOgorODIwMDY0MzAgYW5pbV91dGlsOiBxdWlldCBzdGF0aWMgYW5hbHlzaXMgd2FybmluZworYTZmMjNjNDkgTWVyZ2UgIkFuaW1FbmNvZGVyOiBTdXBwb3J0IHByb2dyZXNzIGhvb2sgYW5kIHVzZXIgZGF0YS4iCithNTE5Mzc3NCBNZXJnZSAiTmVhciBsb3NzbGVzcyBmZWF0dXJlOiBmaXggc29tZSBjb21tZW50cy4iCitkYTk4ZDMxYyBBbmltRW5jb2RlcjogU3VwcG9ydCBwcm9ncmVzcyBob29rIGFuZCB1c2VyIGRhdGEuCiszMzM1NzEzMSBOZWFyIGxvc3NsZXNzIGZlYXR1cmU6IGZpeCBzb21lIGNvbW1lbnRzLgorMGJlZWQwMWEgY29zbWV0aWNzOiBmaXggaW5kZW50IGFmdGVyIDJmNWU4OTgKKzY3NTNmMzVjIE1lcmdlICJGVHJhbnNmb3JtV0hUIG9wdGltaXphdGlvbi4iCis2NTgzYmIxYSBJbXByb3ZlIFNTRTQuMSBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNmb3JtLgorNzU2MWQwYzMgRlRyYW5zZm9ybVdIVCBvcHRpbWl6YXRpb24uCis3Y2NkYjczNCBmaXggaW5kZW50YXRpb24gYWZ0ZXIgcGF0Y2ggIzMyODIyMAorNmVjMGQyYTkgY2xhcmlmeSB0aGUgbG9naWMgb2YgdGhlIGVycm9yIHBhdGggd2hlbiBkZWNvZGluZyBmYWlscy4KKzhhYTM1MmIyIE1lcmdlICJSZW1vdmUgYW4gdW5uZWNlc3NhcnkgdHJhbnNwb3NpdGlvbiBpbiBUVHJhbnNmb3JtLiIKK2RiODYwODg0IE1lcmdlICJyZW1vdmUgdXNlbGVzcyAjaW5jbHVkZSIKKzk5NjBjMzE2IFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSB0cmFuc3Bvc2l0aW9uIGluIFRUcmFuc2Zvcm0uCis2ZTM2YjUxMSBTbWFsbCBzcGVlZHVwIGluIEZUcmFuc2Zvcm0uCis5ZGJkNGFhZCBNZXJnZSAiZml4IEMgYW5kIFNJTUQgZmxhZ3MgY29tcGxldGlvbi4iCitlNjA4NTNlYSBBZGQgbWlzc2luZyBjb21tb25fc3NlMi5oIGZpbGUgdG8gbWFrZWZpbGUudW5peAorNjk2ZWIyYjAgZml4IEMgYW5kIFNJTUQgZmxhZ3MgY29tcGxldGlvbi4KKzJiNGZlMzNlIE1lcmdlICJmaXggbXVsdGlwbGUgYWxsb2NhdGlvbiBmb3IgdHJhbnNmb3JtIGJ1ZmZlciIKKzJmNWU4OTg2IGZpeCBtdWx0aXBsZSBhbGxvY2F0aW9uIGZvciB0cmFuc2Zvcm0gYnVmZmVyCitiZjJiNGYxMSBSZWdyb3VwIGNvbW1vbiBTU0UgY29kZSArIG9wdGltaXphdGlvbi4KKzRlZDY1MGExIGZvcmNlICItcGFzcyA2IiBpZiAtcHNuciBvciAtc2l6ZSBpcyB1c2VkIGJ1dCAtcGFzcyBpc24ndC4KKzNlZjFjZTk4IHl1dl9zc2UyOiBmaXggLVdjb25zdGFudC1jb252ZXJzaW9uIHdhcm5pbmcKK2E3YTAzZTlmIE1lcmdlIGNoYW5nZXMgSTQ4NTJkMThmLEk1MWNjYjg1ZAorNWUxMjJiZDYgZ2lmMndlYnA6IHNldCBlbmNfb3B0aW9ucy52ZXJib3NlID0gMCB3Ly1xdWlldAorYWIzYzI1ODMgYW5pbV9lbmNvZGUsRGVmYXVsdEVuY29kZXJPcHRpb25zOiBpbml0IHZlcmJvc2UKKzhmMGRlZTc3IE1lcmdlICJjb25maWd1cmU6IGZpeCBidWlsdGluIGRldGVjdGlvbiB3Ly1XZXJyb3IiCis0YTdiODVhOSBjbWFrZTogZml4IGJ1aWx0aW4gZGV0ZWN0aW9uIHcvLVdlcnJvcgorYjc0NjU3ZmIgY29uZmlndXJlOiBmaXggYnVpbHRpbiBkZXRlY3Rpb24gdy8tV2Vycm9yCiszNjYxYjk4MCBBZGQgYSBDTWFrZUxpc3RzLnR4dAorNzVmNGFmNGQgcmVtb3ZlIHVzZWxlc3MgI2luY2x1ZGUKKzZjMWQ3NjMxIGF2b2lkIFlvZGEgc3R5bGUgZm9yIGNvbXBhcmlzb24KKzhjZTk3NWFjIFNTRSBvcHRpbWl6YXRpb24gZm9yIHZlY3RvciBtaXNtYXRjaC4KKzdkYjUzODMxIE1lcmdlIHRhZyAndjAuNS4wJworMzdmMDQ5NDkgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC41LjAtcmMxLCB0YWc6IHYwLjUuMCwgb3JpZ2luLzAuNS4wLCAwLjUuMCkKKzdlN2I2Y2NjIGZhc3RlciByZ2I1NjUvcmdiNDQ0NC9hcmdiIG91dHB1dAorNGM3ZjU2NWYgdXBkYXRlIE5FV1MKKzFmNjJiNmIyIHVwZGF0ZSBBVVRIT1JTCitlMjI0ZmRjOCB1cGRhdGUgbWFpbG1hcAorNzExMDA1MDAgYnVtcCB2ZXJzaW9uIHRvIDAuNS4wCisyMzBhNjg1ZSBSRUFETUU6IHVwZGF0ZSBoZWxwIHRleHQsIHJlcG8gbGluaworZDQ4ZTQyN2IgTWVyZ2UgImRlbXV4OiBhY2NlcHQgcmF3IGJpdHN0cmVhbXMiCis5OWEwMWY0ZiBNZXJnZSAiVW5pZnkgc29tZSBlbnRyb3B5IGZ1bmN0aW9ucy4iCis0YjAyNWYxMCBNZXJnZSAiY29uZmlndXJlOiBkaXNhYmxlIGFzc2VydHMgYnkgZGVmYXVsdCIKKzkyY2JkZGY4IE1lcmdlICJmaXggUHJpbnRCbG9ja0luZm8oKSIKK2NhNTA5YTMzIFVuaWZ5IHNvbWUgZW50cm9weSBmdW5jdGlvbnMuCiszNjdiZjkwMyBmaXggUHJpbnRCbG9ja0luZm8oKQorYjA1NDdmZjAgbW92ZSBiYWNrIGNvbW1vbiBjb25zdGFudHMgZm9yIGxvc3NsZXNzX2VuYyouYyBpbnRvIHRoZSAuaAorZmI0Yzc4MzIgbG9zc2xlc3M6IHNpbXBsZXIgYWxwaGEgY2xlYW51cCBwcmVwcm9jZXNzaW5nCitiYTdmNGI2OCBNZXJnZSAiYW5pbV9kaWZmOiBhZGQgYnJpZWYgZGVzY3JpcHRpb24gb2Ygb3B0aW9ucyIKKzQ3ZGRkNWE0IE1vdmUgc29tZSBjb2RlYyBsb2dpYyBvdXQgb2YgLi9kc3AgLgorYjQxMDZjNDQgYW5pbV9kaWZmOiBhZGQgYnJpZWYgZGVzY3JpcHRpb24gb2Ygb3B0aW9ucworMzU3ZjQ1NWQgeXV2X3NzZTI6IGZpeCAzMi1iaXQgdmlzdWFsIHN0dWRpbyBidWlsZAorYjlkODBmYTQgY29uZmlndXJlOiBkaXNhYmxlIGFzc2VydHMgYnkgZGVmYXVsdAorN2JhZGQzZGEgY29zbWV0aWMgZml4OiBzaXplb2YodHlwZSkgLT4gc2l6ZW9mKCp2YXIpCis4MGNlMjdkMyBTcGVlZCB1cCAyNC1iaXQgcGFja2luZyAvIHVucGFja2luZyBpbiBZVVYgLyBSR0IgY29udmVyc2lvbnMuCis2OGVlYmNiMCByZW1vdmUgYSBUT0RPIGFib3V0IHJvdGF0aW9uCisyZGVlMjk2NiByZW1vdmUgZmV3IG9ic29sZXRlIFRPRE8gYWJvdXQgYWxpZ25lZCBsb2FkcyBpbiBTU0UyCitlMGMwYmIzNCByZW1vdmUgVE9ETyBhYm91dCB1bnVzZWQgcmVmX2xmX2RlbHRhW10KKzljZjFjYzJiIHJlbW92ZSBmZXcgVE9ETzogICAqIDI1NiAtPiBSRF9ESVNUT19NVUxUICAgKiBkb24ndCB1c2UgVERpc3RvIGZvciBVViBtb2RlIHBpY2tpbmcKKzc5MTg5NjQ1IE1lcmdlIGNoYW5nZXMgZnJvbSB0b3BpYyAnZGVtdXgtZnJhZ21lbnQtY2xlYW51cCcKKzQ3Mzk5ZjkyIGRlbXV4OiByZW1vdmUgR2V0RnJhZ21lbnQoKQorZDNjZmI3OWEgZGVtdXg6IHJlbW92ZSBkZWFkIGZyYWdtZW50IHJlbGF0ZWQgVE9ETworYWI3MTRiOGEgZGVtdXgsIEZyYW1lOiByZW1vdmUgaXNfZnJhZ21lbnRfIGZpZWxkCitiMTA1OTIxYyB5dXZfc3NlMiwgY29zbWV0aWNzOiBmaXggaW5kZW50Cis0NjZjOTJlOCBkZW11eCxXZWJQSXRlcmF0b3I6IHJlbW92ZSBmcmFnbWVudF9udW0vbnVtX2ZyYWdtZW50cworMTE3MTRmZjEgZGVtdXg6IHJlbW92ZSBXZWJQRGVtdXhTZWxlY3RGcmFnbWVudAorYzBmN2NjNDcgZml4IGZvciBidWcgIzI4MDogVU1SIGluIG5leHQtPmJpdHMKKzU3OGJlZWI4IE1lcmdlICJlbmMvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIGhlYWRlcnMiCisxYTgxOWYwMCBtYWtlZmlsZS51bml4OiBtYWtlIHZpc2liaWxpdHk9aGlkZGVuIHRoZSBkZWZhdWx0CitkNGY5YzJlZiBlbmMvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIGhlYWRlcnMKKzg0NmNhZmY0IGNvbmZpZ3VyZTogY2hlY2sgZm9yIC1mdmlzaWJpbGl0eT1oaWRkZW4KKzNmM2VhMmM1IGRlbXV4OiBhY2NlcHQgcmF3IGJpdHN0cmVhbXMKK2Q2ZGFkNWQwIG1hbiBjd2VicDogYWRkIHByZWNpc2lvbiBhYm91dCBleGFjdG5lc3Mgb2YgdGhlICdsb3NzbGVzcycgbW9kZQorNDZiYjFlMzQgTWVyZ2UgImdpZmRlYzogcmVtb3ZlIHV0aWxzLmggaW5jbHVkZSIKKzJiODgyZTk0IE1lcmdlICJNYWtlZmlsZS52YzogZGVmaW5lIFdFQlBfSEFWRV9HSUYgZm9yIGdpZmRlYy5jIgorODkyYjkyMzggTWVyZ2UgIm1hbi8qLCBBVVRIT1JTOiBjbGFyaWZ5IG9yaWdpbiBvZiB0aGUgdG9vbCIKK2U1Njg3YTE4IE1lcmdlICJmaXggb3B0aW1pemVkIGJ1aWxkIHdpdGggLW1jbW9kZWw9bWVkaXVtIgorZTU2ZTY4NTkgTWFrZWZpbGUudmM6IGRlZmluZSBXRUJQX0hBVkVfR0lGIGZvciBnaWZkZWMuYworNDA3N2Q5NDQgZ2lmZGVjOiByZW1vdmUgdXRpbHMuaCBpbmNsdWRlCitiNWUzMGRhYyBtYW4vKiwgQVVUSE9SUzogY2xhcmlmeSBvcmlnaW4gb2YgdGhlIHRvb2wKK2IyNzVlNTk4IGZpeCBvcHRpbWl6ZWQgYnVpbGQgd2l0aCAtbWNtb2RlbD1tZWRpdW0KKzY0ZGE0NWE5IGNvc21ldGljcywgY3dlYnA6IGZpeCBpbmRlbnQKKzAzOGEwNjBkIE1lcmdlICJhZGQgZGlzdG8tYmFzZWQgcmVmaW5lbWVudCBmb3IgVVYgbW9kZSAoaWYgbWV0aG9kID0gMSBvciAyKSIKKzI4MzUwODlkIFByb3ZpZGUgYW4gU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBDb21iaW5lZFNoYW5ub25FbnRyb3B5LgorZTZjOTM1MTkgYWRkIGRpc3RvLWJhc2VkIHJlZmluZW1lbnQgZm9yIFVWIG1vZGUgKGlmIG1ldGhvZCA9IDEgb3IgMikKKzA0NTA3ZGM5IE1lcmdlICJmaXggdW5kZWZpbmVkIGJlaGF2aW91ciBkdXJpbmcgc2hpZnQsIHVzaW5nIGEgY2FzdCIKKzc5M2M1MjYxIE1lcmdlICJ3aWNkZWM6IGFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGZyb20gc3RkaW4iCitkM2QxNjM5NyBPcHRpbWl6ZSB0aGUgaGVhcCB1c2FnZSBpbiBIaXN0b2dyYW1Db21iaW5lR3JlZWR5LgorMjAyYTcxMGIgZml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgZHVyaW5nIHNoaWZ0LCB1c2luZyBhIGNhc3QKKzE0ZDI3YTQ2IGltcHJvdmUgbWV0aG9kICMyIGJ5IG1lcmdpbmcgRGlzdG9SZWZpbmUoKSBhbmQgIFNpbXBsZVF1YW50aXplKCkKK2NiMWNlOTk2IE1lcmdlICIxMCUgZmFzdGVyIHRhYmxlLWxlc3MgU1NFMi9ORU9OIHZlcnNpb24gb2YgWVVWLT5SR0IgY29udmVyc2lvbiIKK2FjNzYxYTM3IDEwJSBmYXN0ZXIgdGFibGUtbGVzcyBTU0UyL05FT04gdmVyc2lvbiBvZiBZVVYtPlJHQiBjb252ZXJzaW9uCis3OWZjZjI5YSB3aWNkZWM6IGFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGZyb20gc3RkaW4KKzAxNWYxNzNmIE1lcmdlICJjd2VicDogYWRkIHN1cHBvcnQgZm9yIHN0ZGluIGlucHV0IgorYTk5NDdjMzIgY3dlYnA6IGFkZCBzdXBwb3J0IGZvciBzdGRpbiBpbnB1dAorN2ViMDFmZjMgTWVyZ2UgIkltcHJvdmVkIGFscGhhIGNsZWFudXAgZm9yIHRoZSB3ZWJwIGVuY29kZXIgd2hlbiBwcmVkaWN0aW9uIHRyYW5zZm9ybSBpcyB1c2VkLiIKK2ZiOGM5MTA2IE1lcmdlICJpbnRyb2R1Y2UgV2ViUE1lbVRvVWludDMyIGFuZCBXZWJQVWludDMyVG9NZW0gZm9yIG1lbW9yeSBhY2Nlc3MiCitiZDkxYWYyMCBNZXJnZSAiYml0X3JlYWRlcjogcmVtb3ZlIGFhcmNoNjQgQklUUyBUT0RPIgorNmM3MDJiODEgU3BlZWQgdXAgaGFzaCBjaGFpbiBpbml0aWFsaXphdGlvbiB1c2luZyBtZW1zZXQuCis0YzYwZjYzYyBtYWtlIFJlYWRQTkcgYW5kIFJlYWRKUEVHIHRha2UgYSBmaWxlbmFtZSBpbnN0ZWFkIG9mIGEgRklMRQorNDY0ZWQxMGYgYml0X3JlYWRlcjogcmVtb3ZlIGFhcmNoNjQgQklUUyBUT0RPCitkNDc4ZTU4OSBNZXJnZSAiY29uZmlndXJlOiB1cGRhdGUgaXNzdWUgdHJhY2tlciIKKzY5MzgxMTEzIEltcHJvdmVkIGFscGhhIGNsZWFudXAgZm9yIHRoZSB3ZWJwIGVuY29kZXIgd2hlbiBwcmVkaWN0aW9uIHRyYW5zZm9ybSBpcyB1c2VkLgorMmMwOGFhYzggaW50cm9kdWNlIFdlYlBNZW1Ub1VpbnQzMiBhbmQgV2ViUFVpbnQzMlRvTWVtIGZvciBtZW1vcnkgYWNjZXNzCiswMTBjYTNkMSBGaXggRmluZE1hdGNoTGVuZ3RoIHdpdGggbm9uLWFsaWduZWQgYnVmZmVycy4KK2E5MGUxZTNmIFJFQURNRTogYWRkIHByZXJlcXVpc2l0ZXMgZm9yIGFuIGF1dG9jb25mIGJ1aWxkCis0NThmMDg2NiBjb25maWd1cmU6IHVwZGF0ZSBpc3N1ZSB0cmFja2VyCiszMzkxNDU5NSB2d2VicDogd29yayBhcm91bmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQgd2l0aCBHTFVUIGJ1ZworZTRhN2VlZDQgY29zbWV0aWNzOiBmaXggaW5kZW50CiswODM3NTEyOSBNZXJnZSAiTWFrZSBhIHNlcGFyYXRlIGNhc2UgZm9yIGxvd19lZmZvcnQgaW4gQ29weUltYWdlV2l0aFByZWRpY3Rpb24iCithYTJlYjJkNCBNZXJnZSAiY29zbWV0aWNzOiBmaXggaW5kZW50IgorYjc1NTFlOTAgY29zbWV0aWNzOiBmaXggaW5kZW50Cis1YmRhNTJkNCBNYWtlIGEgc2VwYXJhdGUgY2FzZSBmb3IgbG93X2VmZm9ydCBpbiBDb3B5SW1hZ2VXaXRoUHJlZGljdGlvbgorNjZmYTU5OGEgTWVyZ2UgImNvbmZpZ3VyZTogZml4IGludHJpbnNpY3MgYnVpbGQgdy9vbGRlciBnY2MiCis1YWUyMjBiZSBiYWNrd2FyZF9yZWZlcmVuY2VzLmM6IEZpeGVkIGNvbXBpbGVyIHdhcm5pbmcKKzE1NTZkYTA5IE1lcmdlICJjb25maWd1cmU6IHJlc3RvcmUgMiB3YXJuaW5ncyIKKzcxYTE3ZTU4IGNvbmZpZ3VyZTogcmVzdG9yZSAyIHdhcm5pbmdzCis5ZWVhYmMwNyBjb25maWd1cmU6IGZpeCBpbnRyaW5zaWNzIGJ1aWxkIHcvb2xkZXIgZ2NjCiszNjNiYWJlMiBNZXJnZSAiZml4IHNvbWUgd2FybmluZyBhYm91dCB1bmFsaWduZWQgMzJiIHJlYWRzIgorYTE0MTE3ODIgT3B0aW1pemF0aW9uIGluIGhhc2ggY2hhaW4gY29tcGFyaXNvbiBmb3IgNjQgYml0IEFycmF5cyB3ZXJlIGNvbXBhcmVkIDMyIGJpdHMgYXQgYSB0aW1lLCBpdCBpcyBub3cgZG9uZSA2NCBiaXRzIGF0IGEgdGltZS4gT3ZlcmFsbCBlbmNvZGluZyBzcGVlZC11cCBpcyBvbmx5IG9mIDAuMiUgb24gQHNrYWwncyBzbWFsbCBQTkcgY29ycHVzLiBJdCBpcyBvZiAzJSBvbiBteSBpbml0aWFsIDEuMyBNcCBkZXNrdG9wIHNjcmVlbnNob3QgaW1hZ2UuCis4MjliZDE0MSBDb21iaW5lIEh1ZmZtYW4gY29zdCBhbmQgYml0IGVudHJvcHkgaW50byBvbmUgbG9vcAorYTdhOTU0YzggTWVyZ2UgImxvc3NsZXNzOiBtYWtlIHByZWRpY3Rpb24gaW4gZW5jb2RlciB3b3JrIHBlciBzY2FubGluZSIKKzYxYjYwNWI0IE1lcmdlICJmaXggb2YgdW5kZWZpbmVkIG11bHRpcGx5IChpbnQzMiBvdmVyZmxvdykiCisyMzk0MjFjNSBsb3NzbGVzczogbWFrZSBwcmVkaWN0aW9uIGluIGVuY29kZXIgd29yayBwZXIgc2NhbmxpbmUKK2Y1Y2E0MGUwIGZpeCBvZiB1bmRlZmluZWQgbXVsdGlwbHkgKGludDMyIG92ZXJmbG93KQorNWNkMmVmNGMgTWVyZ2UgY2hhbmdlcyBmcm9tIHRvcGljICd3aW4tdGhyZWFkaW5nLWNvbXBhdCcKKzc2Y2U5MTg3IE1ha2VmaWxlLnZjOiBlbmFibGUgV0VCUF9VU0VfVEhSRUFEIGZvciB3aW5kb3dzIHBob25lCitkMmFmZTk3NCB0aHJlYWQ6IHVzZSBDcmVhdGVUaHJlYWQgZm9yIHdpbmRvd3MgcGhvbmUKKzBmZDBlMTJiIHRocmVhZDogdXNlIFdhaXRGb3JTaW5nbGVPYmplY3RFeCBpZiBhdmFpbGFibGUKKzYzZmFkYzlmIHRocmVhZDogdXNlIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25FeCBpZiBhdmFpbGFibGUKKzExMGFkNTgzIHRocmVhZDogdXNlIG5hdGl2ZSB3aW5kb3dzIGNvbmQgdmFyIGlmIGF2YWlsYWJsZQorOTEyYzlmZGYgZGVjL3dlYnA6IHVzZSBHZXRMRSgyNHwzMikgZnJvbSB1dGlscworZjE2OTQ0ODEgdXRpbHMvR2V0TEUzMjogY29ycmVjdCB1aW50MzIgcHJvbW90aW9uCisxNTg3NjNkZSBNZXJnZSAiYWx3YXlzIGNhbGwgV2ViUEluaXRTYW1wbGVycygpLCBkb24ndCB0cnkgdG8gYmUgc21hcnQiCiszNzcwZjNiYiBNZXJnZSAiY2xlYW51cCB0aGUgWUZJWC9URklYIGRpZmZlcmVuY2UgYnkgcmVtb3Zpbmcgc29tZSBjb2RlIGFuZCAjZGVmaW5lIgorYTQwZjYwYTkgTWVyZ2UgIjMlIHNwZWVkIGltcHJvdmVtZW50IGZvciBsb3NzbGVzcyB3ZWJwIGVuY29kZXIgZm9yIGxvdyBlZmZvcnQgbW9kZToiCitlZDFjMmJjNiBhbHdheXMgY2FsbCBXZWJQSW5pdFNhbXBsZXJzKCksIGRvbid0IHRyeSB0byBiZSBzbWFydAorYjhjNDRmMWEgMyUgc3BlZWQgaW1wcm92ZW1lbnQgZm9yIGxvc3NsZXNzIHdlYnAgZW5jb2RlciBmb3IgbG93IGVmZm9ydCBtb2RlOgorOTk3ZTEwMzggY2xlYW51cCB0aGUgWUZJWC9URklYIGRpZmZlcmVuY2UgYnkgcmVtb3Zpbmcgc29tZSBjb2RlIGFuZCAjZGVmaW5lCitkNzNkMWM4YiBNZXJnZSAiTWFrZSBkaXNjYXJkaW5nIGludmlzaWJsZSBSR0IgdmFsdWVzIChjbGVhbnVwIGFscGhhKSB0aGUgZGVmYXVsdC4iCisxZjliZTk3YyBNYWtlIGRpc2NhcmRpbmcgaW52aXNpYmxlIFJHQiB2YWx1ZXMgKGNsZWFudXAgYWxwaGEpIHRoZSBkZWZhdWx0LgorZjI0MDExN2IgTWFrZSBkd2VicCBsaXN0ZW4gbW9yZSB0byB0aGUgLXF1aWV0IGZsYWcKK2IzN2IwMTc5IGZpeCBmb3IgaXNzdWUgIzI3NTogZG9uJ3QgY29tcGFyZSB0byBvdXQtb2YtYm91bmQgcG9pbnRlcnMKKzIxNzM1ZTA2IHNwZWVkLXVwIHRyaXZpYWwgb25lLXN5bWJvbCBkZWNvZGluZyBjYXNlIGZvciBsb3NzbGVzcworMzk3ODYzYmQgUmVmYWN0b3IgQ29weVBsYW5lKCkgYW5kIENvcHlQaXhlbHMoKSBtZXRob2RzOiBwdXQgdGhlbSBpbiB1dGlscy4KKzZlY2Q3MmY4IFJlLWVuYWJsZSBlbmNvZGluZyBvZiBhbHBoYSBwbGFuZSB3aXRoIGNvbG9yIGNhY2hlIGZvciBuZXh0IHJlbGVhc2UuCisxZjcxNDhhNCBNZXJnZSAicmVtb3ZlIHVudXNlZCBmaWVsZHMgZnJvbSBXZWJQRGVjb2Rlck9wdGlvbnMgYW5kIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyIKKzZhZTM5NWZhIE1lcmdlICJ1c2UgRXhSZWFkRmlsZSgpIGZvciBSZWFkWVVWKCkiCis4MDc2YTAwZSBnaXRpZ25vcmUgbGlzdDogYWRkIGFuaW1fZGlmZi4KKzFjMTcwMmQ4IHVzZSBFeFJlYWRGaWxlKCkgZm9yIFJlYWRZVVYoKQorNzc1ZDNhMzcgcmVtb3ZlIHVudXNlZCBmaWVsZHMgZnJvbSBXZWJQRGVjb2Rlck9wdGlvbnMgYW5kIFdlYlBCaXRzdHJlYW1GZWF0dXJlcworYzEzMjQ1YzcgQW5pbUVuY29kZXI6IEFkZCBhIEdldEVycm9yKCkgbWV0aG9kLgorNjg4YjI2NWQgQW5pbURlY29kZXIgQVBJOiBBZGQgYSBHZXREZW11eGVyKCkgbWV0aG9kLgorMWFhNGUzZDYgV2ViUEFuaW1EZWNvZGVyOiBhZGQgYW4gb3B0aW9uIHRvIGVuYWJsZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZy4KKzM1ODRhYmNhIEFuaW1EZWNvZGVyOiBvcHRpb24gdG8gZGVjb2RlIHRvIGNvbW1vbiBjb2xvciBtb2Rlcy4KK2FmZDVhNjJjIE1lcmdlICJtdXguaCBkb2VzIE5PVCBuZWVkIHRvIGluY2x1ZGUgZW5jb2RlLmgiCis4NTUwZDQ0MyBNZXJnZSAibWlncmF0ZSBhbmltX2RpZmYgdG9vbCBmcm9tIEMrKyB0byBDODkiCis5NjIwMWU1MCBtaWdyYXRlIGFuaW1fZGlmZiB0b29sIGZyb20gQysrIHRvIEM4OQorOTQ1Y2ZhM2IgbXV4LmggZG9lcyBOT1QgbmVlZCB0byBpbmNsdWRlIGVuY29kZS5oCis4ZGEwN2U4ZCBNZXJnZSAifjJ4IGZhc3RlciBTU0UyIFJHQjI0dG9ZLCBCR1IyNHRvWSwgQVJHQlRvWXxVViIKK2JmZDNmYzAyIH4yeCBmYXN0ZXIgU1NFMiBSR0IyNHRvWSwgQkdSMjR0b1ksIEFSR0JUb1l8VVYKKzAyNDMyNDI3IG1hbi9jd2VicC4xLCBjb3NtZXRpY3M6IGVzY2FwZSAnLSdzCis5NmY1YjQyMyBtYW4vY3dlYnA6IGdyb3VwIGxvc3N5LW9ubHkgb3B0aW9ucworNTJmZGJkZmUgZXh0cmFjdCBzb21lIFJHQjI0IHRvIEx1bWEgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIGVuYy8gdG8gZHNwLworYWI4YzIzMDAgYWRkIG1pc3NpbmcgXG4KKzgzMDQxNzlhIHN5bmMgTkVXUyB3aXRoIDAuNC40Cis1YmQwNGEwOCBzeW5jIHZlcnNpb25zIHdpdGggMC40LjQKKzhmMWZjYzE1IE1lcmdlICJNb3ZlIEFSR0ItPllVViBmdW5jdGlvbnMgZnJvbSBkZWMvdnA4bC5jIHRvIGRzcC95dXYuYyIKKzI1YmYyY2U1IGZpeCBzb21lIHdhcm5pbmcgYWJvdXQgdW5hbGlnbmVkIDMyYiByZWFkcworOTIyMjY4ZmQgcy9USUZGL1dlYlAKK2ZhODkyN2VmIE1vdmUgQVJHQi0+WVVWIGZ1bmN0aW9ucyBmcm9tIGRlYy92cDhsLmMgdG8gZHNwL3l1di5jCis5YjM3MzU5OCBNZXJnZSAiZm9yIFJlYWRYWFhYKCkgaW1hZ2UtcmVhZGVycywgdXNlIHRoZSB2YWx1ZSBvZiBwaWMtPnVzZV9hcmdiIgorZjdjNTA3YTUgTWVyZ2UgInJlbW92ZSB1bm5lY2Vzc2FyeSAjaW5jbHVkZSAieXV2LmgiIgorNzg2MTU3OGIgZm9yIFJlYWRYWFhYKCkgaW1hZ2UtcmVhZGVycywgdXNlIHRoZSB2YWx1ZSBvZiBwaWMtPnVzZV9hcmdiCisxNGU0MDQzYiByZW1vdmUgdW5uZWNlc3NhcnkgI2luY2x1ZGUgInl1di5oIgorNDY5YmEyY2QgdndlYnA6IGZpeCBpbmNvcnJlY3QgY2xpcHBpbmcgdy9OT19CTEVORAorNGI5MTg2YjIgdXBkYXRlIGlzc3VlIHRyYWNrZXIgdXJsCitkNjRkMzc2YyBjaGFuZ2UgV0VCUF9BTElHTl9DU1QgdmFsdWUgdG8gMzEKK2Y3MTdiODI4IHZwOGwuYywgY29zbWV0aWNzOiBmaXggaW5kZW50IGFmdGVyIDk1NTA5ZjkKKzkyN2NjZGM0IE1lcmdlICJmaXggYWxpZ25tZW50IG9mIGFsbG9jYXRlZCBtZW1vcnkgaW4gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIiCitmZWE5NGIyYiBmaXggYWxpZ25tZW50IG9mIGFsbG9jYXRlZCBtZW1vcnkgaW4gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIKKzVhYThkNjFmIE1lcmdlICJNSVBTOiByZXNjYWxlciBjb2RlIHN5bmNlZCB3aXRoIEMgaW1wbGVtZW50YXRpb24iCitlN2ZiMjY3ZCBNSVBTOiByZXNjYWxlciBjb2RlIHN5bmNlZCB3aXRoIEMgaW1wbGVtZW50YXRpb24KKzkzYzg2ZWQ1IE1lcmdlICJmb3JtYXRfY29uc3RhbnRzLmg6IE1LRk9VUkNDLCBjb3JyZWN0IGNhc3QiCis1ZDc5MWQyNiBmb3JtYXRfY29uc3RhbnRzLmg6IE1LRk9VUkNDLCBjb3JyZWN0IGNhc3QKKzY1NzI2Y2QzIGRzcC9sb3NzbGVzczogQXZlcmFnZTIsIG1ha2UgYSBjb25zdGFudCB1bnNpZ25lZAorZDI2ZDlkZWYgVXNlIF9faGFzX2J1aWx0aW4gdG8gY2hlY2sgY2xhbmcgc3VwcG9ydAorMTJlYzIwNGUgbW92ZWQgQUxJR05fQ1NUIGludG8gdXRpbC91dGlscy5oIGFuZCByZW5hbWVkIFdFQlBfQUxJR05feHh4CithMjY0MDgzOCBNZXJnZSAicmVzY2FsZXI6IH4yMCUgZmFzdGVyIFNTRTIgaW1wbGVtZW50YXRpb24gZm9yIGxvc3NsZXNzIEltcG9ydFJvd0V4cGFuZCIKKzNmYjYwMGQ1IE1lcmdlICJ3aWNkZWM6IGZpeCBhbHBoYSBkZXRlY3Rpb24gdy82NGJwcCBCR1JBL1JHQkEiCis2N2M1NDdmZCByZXNjYWxlcjogfjIwJSBmYXN0ZXIgU1NFMiBpbXBsZW1lbnRhdGlvbiBmb3IgbG9zc2xlc3MgSW1wb3J0Um93RXhwYW5kCis5OWUzZjgxMiBNZXJnZSAibGFyZ2UgcmUtb3JnYW5pemF0aW9uIG9mIHRoZSBkZWx0YS1wYWxldHRpemF0aW9uIGNvZGUiCis5NTUwOWY5OSBsYXJnZSByZS1vcmdhbml6YXRpb24gb2YgdGhlIGRlbHRhLXBhbGV0dGl6YXRpb24gY29kZQorNzRmYjQ1OGIgZml4IGZvciB3ZWlyZCBtc3ZjIHdhcm5pbmcgbWVzc2FnZQorYWU0OWFkODYgTWVyZ2UgIlNTRTIgaW1wbGVtZW50YXRpb24gb2YgSW1wb3J0Um93U2hyaW5rIgorOTMyZmQ0ZGYgU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBJbXBvcnRSb3dTaHJpbmsKK2JhZGZjYmFhIHdpY2RlYzogZml4IGFscGhhIGRldGVjdGlvbiB3LzY0YnBwIEJHUkEvUkdCQQorMzVjYWZhNmMgTWVyZ2UgImlvc2J1aWxkOiBmaXggbGlua2luZyB3aXRoIFhjb2RlIDcgLyBpT1MgU0RLIDkiCitiMGM5ZDhhZiBsYWJlbCByZW5hbWU6IE5PX0NIQU5HRSAtPiBOb0NoYW5nZQorYjRlNzMxY2QgbmVvbi1pbXBsZW1lbnRhdGlvbiBmb3IgcmVzY2FsZXIgY29kZQorZGIxMzIxYTYgaW9zYnVpbGQ6IGZpeCBsaW5raW5nIHdpdGggWGNvZGUgNyAvIGlPUyBTREsgOQorNmRmYTVlM2UgcmVzY2FsZXI6IGJldHRlciBoYW5kbGluZyBvZiB0aGUgZnh5X3NjYWxlPTAgc3BlY2lhbCBjYXNlLgorNTVjMDUyOTMgUmV2ZXJ0ICJyZXNjYWxlcjogYmV0dGVyIGhhbmRsaW5nIG9mIHRoZSBmeHlfc2NhbGU9MCBzcGVjaWFsIGNhc2UuIgorOWYyMjZiZjggcmVzY2FsZXI6IGJldHRlciBoYW5kbGluZyBvZiB0aGUgZnh5X3NjYWxlPTAgc3BlY2lhbCBjYXNlLgorZjdiOGY5MDcgZGVsdGFfcGFsZXR0aXphdGlvbi4qOiBhZGQgY29weXJpZ2h0CitjMWUxYjcxMCBDaGFuZ2VkIGRlbHRhIHBhbGV0dGUgdG8gY29tcHJlc3MgYmV0dGVyCiswZGQyODI2NyBNZXJnZSAiQWRkIGRlbHRhX3BhbGV0dGl6YXRpb24gZmVhdHVyZSB0byBXZWJQIgorNDhmNjZiNjYgQWRkIGRlbHRhX3BhbGV0dGl6YXRpb24gZmVhdHVyZSB0byBXZWJQCisyNzkzM2UyYSBhbmltX2VuY29kZXI6IGRyb3AgYSBmcmFtZSBpZiBpdCBoYXMgc2FtZSBwaXhlbHMgYXMgdGhlIHByZXYgZnJhbWUuCitkZjlmNmVjOCBNZXJnZSAid2VicG11eC9EaXNwbGF5SW5mbzogc2VuZCBub24tZXJyb3Igb3V0cHV0IHRvIHN0ZG91dCIKKzhhZjQ5OTNiIE1lcmdlICJyZXNjYWxlcl9taXBzX2RzcF9yMjogY29zbWV0aWNzLCBmaXggaW5kZW50IgorMmI5ZDI0OTUgTWVyZ2UgInJlc2NhbGVyOiBjb3NtZXRpY3MsIGpvaW4gdHdvIGxpbmVzIgorY2MwMjBhOGMgd2VicG11eC9EaXNwbGF5SW5mbzogc2VuZCBub24tZXJyb3Igb3V0cHV0IHRvIHN0ZG91dAorYTI4OGU3NDYgY29uZmlndXJlOiBhZGQgLVdzaG9ydGVuLTY0LXRvLTMyCitjNGMzY2YyZCBwbmdkZWM6IGZpeCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MKK2JlZjhlOTdkIHdlYnBtdXg6IGZpeCB0eXBlIGNvbnZlcnNpb24gd2FybmluZworNWE4NDQ2MGQgcmVzY2FsZXJfbWlwc19kc3BfcjI6IGNvc21ldGljcywgZml4IGluZGVudAorYWNkZTBhYWUgcmVzY2FsZXI6IGNvc21ldGljcywgam9pbiB0d28gbGluZXMKKzMwNmNlNGZkIHJlc2NhbGVyOiBtb3ZlIHRoZSAxeDEgb3IgMngxIGhhbmRsaW5nIG9uZSBsZXZlbCB1cAorY2NlZDk3NGIgcmVtb3ZlIF9tbV9zZXRfZXBpNjR4KCksIHdoaWNoIGlzIHRvbyBzcGVjaWZpYworNTY2NjhjOWYgZml4IHdhcm5pbmdzIGFib3V0IHVpbnQ2NF90IC0+IHVpbnQzMl90IGNvbnZlcnNpb24KKzc2YTdkYzM5IHJlc2NhbGVyOiBhZGQgc29tZSBTU0UyIGNvZGUKKzFkZjFkMGVlIHJlc2NhbGVyOiBoYXJtb25pemUgZnVuY3Rpb24gcHJvdG9zCis5YmExODk0YiByZXNjYWxlcjogc2ltcGxpZnkgSW1wb3J0Um93IGxvZ2ljCis1ZmYwMDc5ZSBmaXggcmVzY2FsZXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgorY2Q4MjQ0MGUgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0OiBhbGlnbiBoaXN0b2dyYW1bXSBlbnRyaWVzCithNDA2YjFkZCBNZXJnZSAiZml4IG1lbW9yeSBvdmVyLWFsbG9jYXRpb24gaW4gbG9zc2xlc3MgcmVzY2FsZXIgaW5pdCIKKzBmZGUzM2UzIGFkZCBtaXNzaW5nIGNvbnN0IGluIFZQOEluaXRGcmFtZSBzaWduYXR1cmUKK2FjN2Q1ZThkIGZpeCBtZW1vcnkgb3Zlci1hbGxvY2F0aW9uIGluIGxvc3NsZXNzIHJlc2NhbGVyIGluaXQKKzAxN2Y4Y2NjIExvb3NlbiB0aGUgYnVmZmVyIHNpemUgY2hlY2tzIGZvciBZL1UvVi9BIHRvby4KKzE1Y2E1MDE0IGxvb3NlbiB0aGUgcGFkZGluZyBjaGVjayBvbiBidWZmZXIgc2l6ZQorZDYyM2E4NzAgZGVjX25lb246IGFkZCB3aGl0ZXNwYWNlIGFyb3VuZCBzdHJpbmdpemluZyBvcGVyYXRvcgorMjkzNzdkNTUgZHNwL21pcHM6IGNvc21ldGljczogYWRkIHdoaXRlc3BhY2UgYXJvdW5kIFhTVFIgbWFjcm8KK2VlYmFmOTdmIGRzcC9taXBzOiBhZGQgd2hpdGVzcGFjZSBhcm91bmQgc3RyaW5naXppbmcgb3BlcmF0b3IKK2QzOWRjOGYzIENyZWF0ZSBhIFdlYlBBbmltRGVjb2RlciBBUEkuCiswM2ZiNzUyMiBnaWYyd2VicDogcHJpbnQgb3V0cHV0IGZpbGUgc2l6ZQorMTRlZmFiYmYgQW5kcm9pZDogbGltaXQgdXNlIG9mIGNwdWZlYXR1cmVzCis3YjgzYWRiZSBwcmVwYXJhdG9yeSBjb3NtZXRpY3MgZm9yIFJlc2NhbGVyIGNvZGUgZml4IGFuZCBjbGVhbi11cAorNzdmYjQxYzIgZGVjL3ZwOGwvRGVjb2RlQWxwaGFEYXRhOiByZW1vdmUgcmVkdW5kYW50IGNhc3QKKzkwZmNmY2Q5IEluc2VydCBsZXNzIGhhc2ggY2hhaW4gZW50cmllcyBmcm9tIHRoZSBiZWdpbm5pbmdzIG9mIGxvbmcgY29waWVzLgorYmQ1NTYwNGQgU1NFMjogYWRkIHl1djQ0NCBjb252ZXJ0ZXJzLCByZS11c2luZyB5dXZfc3NlMi5jCis0MWE1ZDk5ZCBhZGQgYSAtcXVpZXQgb3B0aW9uIHRvICdkd2VicCcKKzgwYWIzZWRiIE1lcmdlICJSRUFETUU6IHVwZGF0ZSBkd2VicCBoZWxwIG91dHB1dCBhZnRlciAxZTU5NWZlIgorMzJiNzFiMmUgUkVBRE1FOiB1cGRhdGUgZHdlYnAgaGVscCBvdXRwdXQgYWZ0ZXIgMWU1OTVmZQorM2VjMTE4MjcgdXNlIHRoZSBEaXNwYXRjaEFscGhhKCkgY2FsbCBmcm9tIGRzcAorYzVmMDA2MjEgaW5jb3Jwb3JhdGUgYnplcm8oKSBpbnRvIFdlYlBSZXNjYWxlckluaXQoKSBpbnN0ZWFkIG9mIGNhbGwgc2l0ZQorM2ViY2RkNDEgcmVtb3ZlIGR1cGxpY2F0ZSAiI2luY2x1ZGUgPHN0ZGxpYi5oPiIKKzFlNTk1ZmUxIGR3ZWJwOiBhZGQgLXJlc2l6ZSBhcyBhIHN5bm9ueW0gZm9yIC1zY2FsZQorMjRhOTY5MzIgZGVjOiBhbGxvdyAwIGFzIGEgc2NhbGluZyBkaW1lbnNpb24KK2I5MTg3MjQyIHV0aWxzL3Jlc2NhbGVyOiBhZGQgV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucworOTIzZThlZGEgTWVyZ2UgInVwZGF0ZSBORVdTIgorMDIwZmQwOTkgTWVyZ2UgIldlYlBQaWN0dXJlRGlzdG9ydGlvbjogc3VwcG9ydCBBUkdCIGZvcm1hdCBmb3IgJ3BpYycgd2hlbiBjb21wdXRpbmcgZGlzdG9ydGlvbi4iCis2YTUyOTJmNiB1cGRhdGUgTkVXUworNTZhMmU5ZjUgV2ViUFBpY3R1cmVEaXN0b3J0aW9uOiBzdXBwb3J0IEFSR0IgZm9ybWF0IGZvciAncGljJyB3aGVuIGNvbXB1dGluZyBkaXN0b3J0aW9uLgorMGFlNTgyZTQgY29uZmlndXJlOiB0ZXN0IGFuZCBhZGQgLVd1bnJlYWNoYWJsZS1jb2RlCitjMmY5ZGMwNiBiaXRfd3JpdGVyOiBjb252ZXJ0IFZQOEwgbWFjcm8gdmFsdWVzIHRvIGltbWVkaWF0ZXMKK2I5NjlmODg4IFJlZHVjZSBtYWdpYyBpbiBwYWxldHRlIHJlb3JkZXJpbmcKK2FjYjI5N2U5IGFuaW1fZGlmZjogYWRkIGEgLXJhd19jb21wYXJpc29uIGZsYWcKKzE1NWMxYjIyIE1lcmdlIGNoYW5nZXMgSTc2ZjRkNmZlLEk0NTQzNDYzOQorNzE3ZTRkNWEgbWlwczMyL21pcHNEU1ByMjogZnVuY3Rpb24gSW1wb3J0Um93IHJlYmFzZWQKKzdkZjkzODkzIGZpeCByZXNjYWxpbmcgYnVnICh1bmluaXRpYWxpemVkIHJlYWQsIHNlZSBidWcgIzI1NCkuCis1Y2RjZDU2MSBsb3NzbGVzc19lbmNfbmVvbjogYWRkIFZQOExUcmFuc2Zvcm1Db2xvcgorYTUzYzMzNjkgbG9zc2xlc3NfbmVvbjogYWRkIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UKKzk5MTMxZTdmIE1lcmdlIGNoYW5nZXMgSTlmYjI1YTg5LEliYzY0OGU5ZQorYzQ1NTY3NjYgc2ltcGxpZnkgdGhlIG1haW4gbG9vcCBmb3IgZG93bnNjYWxpbmcKKzJhMDEwZjk5IGxvc3NsZXNzX25lb246IHJlbW92ZSBwcmVkaWN0b3JzIDUtMTMKK2NhMjIxYmJjIGxsX2VuY19uZW9uOiBlbmFibGUgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZAorNTg1ZDkzZGIgQ29udGFpbmVyIHNwZWM6IGNsYXJpZnkgb3JkZXJpbmcgb2YgQUxQSCBjaHVuay4KKzAxZDYxZmQ5IGxvc3NsZXNzOiB+MjAgJSBzcGVlZHVwCitmNzIyYzhmMCBsb3NzbGVzczogU3BlZWQgdXAgQ29tcHV0ZUNhY2hlRW50cm9weSBieSA0MCAlCisxY2VlY2RjOCBhZGQgYSBWUDhMQ29sb3JDYWNoZVNldCgpIG1ldGhvZCBmb3IgY29sb3IgY2FjaGUKKzE3ZWI2MDk5IGxvc3NsZXNzOiBBbGxvdyBjb3B5aW5nIGZyb20gcHJldiByb3cgaW4gcmxlLW1vZGUuCitmM2E3YTViZiBsb3NzbGVzczogYml0IHdyaXRlciBvcHRpbWl6YXRpb24KK2Q5N2I5ZmY3IE1lcmdlIGNoYW5nZXMgZnJvbSB0b3BpYyAnbG9zc2xlc3MtZW5jLWltcHJvdmVtZW50cycKKzAyNTBkZmNjIG1zdmM6IGZpeCBwb2ludGVyIHR5cGUgd2FybmluZyBpbiBCaXRzTG9nMkZsb29yCis1MjkzMWZkNSBsb3NzbGVzczogY29tYmluZSB0aGUgSHVmZm1hbiBjb2RlIHdpdGggZXh0cmEgYml0cworYzQ4NTVjYTIgbG9zc2xlc3M6IElubGluaW5nIGFkZCBsaXRlcmFsCis4ZTljOTRkZSBsb3NzbGVzczogc2ltcGxpZnkgSGFzaENoYWluRmluZENvcHkgaGV1cmlzdGljcworODg4NDI5ZjQgbG9zc2xlc3M6IDAuNSAlIGNvbXByZXNzaW9uIGRlbnNpdHkgaW1wcm92ZW1lbnQKKzdiMjNiMTk4IGxvc3NsZXNzOiBBZGQgemVyb2VzIGludG8gdGhlIHByZWRpY3RlZCBoaXN0b2dyYW1zLgorODViNDRkOGEgbG9zc2xlc3M6IGVuY29kaW5nLCBkb24ndCBjb21wdXRlIHVubmVjZXNzYXJ5IGhpc3RvCitkOTI0NTNmMyBsb3NzbGVzczogUmVtb3ZlIGFib3V0IDI1ICUgb2YgdGhlIHNwZWVkIGRlZ3JhZGF0aW9uCisyY2NlMDMxNyBGYXN0ZXIgYWxwaGEgY29kaW5nIGZvciB3ZWJwCis1ZTc1NjQyZSBsb3NzbGVzczogcmxlIG1vZGUgbm90IHRvIGFjY2VwdCBsZW5ndGhzIHNtYWxsZXIgdGhhbiA0LgorODQzMjZlNGEgbG9zc2xlc3M6IExlc3MgY29kZSBmb3IgdGhlIGVudHJvcHkgc2VsZWN0aW9uCisxNmFiOTUxYSBsb3NzbGVzczogMC4zNyAlIGNvbXByZXNzaW9uIGRlbnNpdHkgaW1wcm92ZW1lbnQKKzgyMmYxMTNlIGFkZCBXZWJQRnJlZSgpIHRvIHRoZSBBUEkKKzBhZTJjMmU0IFNTRTIvU1NFNDE6IG9wdGltaXplIFNTRV8xNnhOIGxvb3BzCiszOTIxNmU1OSBjb3NtZXRpY3M6IGZpeCBpbmRlbnQgYWZ0ZXIgMzI0NjJhMDcKKzU1OWU1NGNhIE1lcmdlICJTU0UyOiBzbGlnaHRseSBmYXN0ZXIgRlRyYW5zZm9ybVdIVCIKKzhlZjlhNjNiIFNTRTI6IHNsaWdodGx5IGZhc3RlciBGVHJhbnNmb3JtV0hUCitmMjdmNzczNSBsb3NzbGVzc19uZW9uOiBlbmFibGUgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkCiszNmU5YzRiYyBTU0UyOiBtaW5vciBjb3NtZXRyaWNzIG9uIGluLWxvb3AgZmlsdGVyIGNvZGUKKzQ3NDFmYWM0IGRzcC9sb3NzbGVzc18qc3NlMjogcmVtb3ZlIHNvbWUgdW5uZWNlc3NhcnkgaW5saW5lcworMTgxOTk2NWUgZml4IHdhcm5pbmcgKCJsZWZ0IHNoaWZ0IG9mIG5lZ2F0aXZlIHZhbHVlIikgdXNpbmcgYSBjYXN0Cis3MDE3MDAxNCBTU0UyOiBzcGVlZC11cCBzb21lIGxvc3NsZXNzLWVuY29kaW5nIGZ1bmN0aW9ucworYWJjYjAxMjggTWVyZ2UgIlNTRTI6IHNsaWdodGx5IGZhc3RlciAofjUlKSBBZGRHcmVlblRvQmx1ZUFuZFJlZCgpIgorMmRmNWJkMzAgTWVyZ2UgIlNwZWVkdXAgdG8gSHVmZm1hbkNvc3RDb21iaW5lZENvdW50IgorOWUzNTZkNmIgU1NFMjogc2xpZ2h0bHkgZmFzdGVyICh+NSUpIEFkZEdyZWVuVG9CbHVlQW5kUmVkKCkKK2ZjNmM3NWEyIFNTRTI6IDUzJSBmYXN0ZXIgVHJhbnNmb3JtQ29sb3JbSW52ZXJzZV0KKzQ5MDczZGE2IFNTRTI6IDQ2JSBzcGVlZC11cCBvZiBUcmFuc2Zvcm1Db2xvcltJbnZlcnNlXQorMzI0NjJhMDcgU3BlZWR1cCB0byBIdWZmbWFuQ29zdENvbWJpbmVkQ291bnQKK2YzZDY4N2UzIFNTRTQuMSBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIGxvc3NsZXNzIGVuY29kaW5nIGZ1bmN0aW9ucworYmZjMzAwYzcgU1NFNC4xIGltcGxlbWVudGF0aW9uIG9mIHNvbWUgYWxwaGEtcHJvY2Vzc2luZyBmdW5jdGlvbnMKKzdmOWM5OGYyIE1lcmdlICJzc2UyIGluLWxvb3A6IHNpbXBsaWZ5IFNpZ25lZFNoaWZ0OGIoKSBhIGJpdCIKK2VmMzE0YTVkIGRlY19zc2UyL0dldE5vdEhFVjogbWljcm8gb3B0aW1pemF0aW9uCithNzI5Y2ZmOSBzc2UyIGluLWxvb3A6IHNpbXBsaWZ5IFNpZ25lZFNoaWZ0OGIoKSBhIGJpdAorNDIyZWM5ZmIgc2ltcGxpZnkgTG9hZDh4NCgpIGEgYml0Cis4ZGYyMzhlYyBNZXJnZSAicmVtb3ZlIHNvbWUgZHVwbGljYXRlIEZsaXBTaWduKCkiCis3NTE1MDZjNCByZW1vdmUgc29tZSBkdXBsaWNhdGUgRmxpcFNpZ24oKQorNjVlZjVhZmMgTWVyZ2UgImxvc3NsZXNzOiAwLjEzJSBjb21wcmVzc2lvbiBkZW5zaXR5IGdhaW4iCisyYmVlZjJmMiBsb3NzbGVzczogMC4xMyUgY29tcHJlc3Npb24gZGVuc2l0eSBnYWluCiszMDMzZjI0YyBsb3NzbGVzczogMC4wNiAlIGNvbXByZXNzaW9uIGRlbnNpdHkgaW1wcm92ZW1lbnQKKzY0OTYwZGE5IGRlY19uZW9uOiBhZGQgVkU4dXYgLyBWRTE2CisxNGRiZDg3YiBkZWNfbmVvbjogYWRkIEhFOHV2IC8gSEUxNgorYWM3NjgwMTEgaW50cm9kdWNlIEZUcmFuc2Zvcm0yIHRvIHBlcmZvcm0gdHdvIHRyYW5zZm9ybXMgYXQgYSB0aW1lLgorYWE2MDY1YWUgZGVjX25lb246IHVzZSB2bGQxX2R1cChtZW0pIHJhdGhlciB0aGFuIHZkdXAobWVtWzBdKQorOGI2M2FjNzggTWVyZ2UgImRlY19uZW9uOiBhZGQgVE0xNiIKK2Y1MWJlMDllIE1lcmdlICJkZWNfbmVvbi9UcnVlTW90aW9uOiBzaW1wbHkgbGVmdCBib3JkZXIgbG9hZCIKK2RjNDgxOTZiIGRlY19uZW9uOiBhZGQgVE0xNgorZWE5NWIzMDUgZGVjX25lb24vVHJ1ZU1vdGlvbjogc2ltcGx5IGxlZnQgYm9yZGVyIGxvYWQKK2YyNjJkNjEyIHNwZWVkLXVwIFNldFJlc2lkdWFsU1NFMgorYmY0NmQwYWMgZml4IG1pcHMyIGJ1aWxkIHRhcmdldAorOTI5YTBmZGMgZW5jX3NzZTIvVFRyYW5zZm9ybTogc2ltcGxpZnkgYWJzIGNhbGN1bGF0aW9uCisxN2RiZDA1OCBlbmNfc3NlMi9Db2xsZWN0SGlzdG9ncmFtOiBzaW1wbGlmeSBhYnMgY2FsY3VsYXRpb24KK2E2YzE1OTM2IGRlY19uZW9uOiBhZGQgREMxNiBpbnRyYSBwcmVkaWN0b3JzCiswM2I0ZjUwZCBNYWtlZmlsZS52YzogYWRkIGFuaW1fZGlmZiBidWlsZCBzdXBwb3J0LgorMWI5ODk4NzQgTWVyZ2UgY2hhbmdlcyBJOWNkODQxMjUsSWVlN2UzODdmLEk3NTQ4YmU3MgorYWNkN2I1YWYgSW50cm9kdWNlIGEgdGVzdCB0b29sIGFuaW1fZGlmZi4KK2YyNzRhOTZjIGRzcC9lbmNfc3NlMjogYWRkIGx1bWE0IGludHJhIHByZWRpY3RvcnMKKzA0MGIxMWJkIGRzcC9lbmNfc3NlMjogYWRkIGNocm9tYSBpbnRyYSBwcmVkaWN0b3JzCithZWUwMjFiYiBkc3AvZW5jX3NzZTI6IGFkZCBsdW1hMTYgaW50cmEgcHJlZGljdG9ycworOWUwMGE0OTkgbWFrZWZpbGUudW5peDogcmVtb3ZlIHN1cGVyY2xlYW4gdGFyZ2V0CitjZWZjOWMwOSBtYWtlZmlsZS51bml4OiBjbGVhbiB1cCBhZnRlciBleHRyYXMgdGFyZ2V0Cis0YzlhZjAyMyBkZWNfbmVvbjogYWRkIERDOHV2Tm9Ub3BMZWZ0CitkZDU1Yjg3MyBNZXJnZSAiZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IHVwZGF0ZSByZXBvIGJyb3dzZXIgbGluayIKK2YwNDg2OTY4IGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiB1cGRhdGUgcmVwbyBicm93c2VyIGxpbmsKKzkyODc3NjFkIE1lcmdlICJHZXRSZXNpZHVhbENvc3RTU0UyOiBzaW1wbGlmeSBhYnMgY2FsY3VsYXRpb24iCiswZTAwOTM2NiBkc3AvY3B1LmMoeDg2KTogY2hlY2sgbWF4aW11bSBzdXBwb3J0ZWQgY3B1aWQgZmVhdHVyZQorYjI0M2E0YmMgR2V0UmVzaWR1YWxDb3N0U1NFMjogc2ltcGxpZnkgYWJzIGNhbGN1bGF0aW9uCis2ZDQ2MDJiOCBNZXJnZSAiZml4IHR5cG86IGNvbnN0aXR1dGVzIC0+IGNvbnN0aXR1dGUiCis1ZmUxZmUzNyBmaXggdHlwbzogY29uc3RpdHV0ZXMgLT4gY29uc3RpdHV0ZQorYjgzYmQ3YzQgTWVyZ2UgInBvcHVsYXRlICdsaWJ3ZWJwZXh0cmFzJyB3aXRoOiBpbXBvcnQgZ3JheSwgcmdiNTY1IGFuZCByZ2I0NDQ0IGZ1bmN0aW9ucyIKK2IwMTE0YTMyIE1lcmdlICJoaXN0b2dyYW0uaDogY29zbWV0aWNzOiByZW1vdmUgdW5uZWNlc3NhcnkgaW5jbHVkZXMiCitmZWFiNDVlZiBnaWZkZWM6IE1vdmUgaW5jbHVzaW9uIG9mIHdlYnAvY29uZmlnLmggdG8gaGVhZGVyLgorZGJiYTY3ZDEgaGlzdG9ncmFtLmg6IGNvc21ldGljczogcmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVzCitlOTc4ZmVjNiBNZXJnZSAiVlA4TEJpdFJlYWRlcjogZml4IHJlbWFpbmluZyB1YnNhbiBlcnJvciB3aXRoIGxhcmdlIHNoaWZ0cyIKK2Q2ZmU1ODg0IE1lcmdlICJSZWNvbnN0cnVjdFJvdzogbW92ZSBzb21lIG9uZS10aW1lIGluaXRzIG91dCBvZiB0aGUgbWFpbiBsb29wIgorYTIxZDY0N2MgUmVjb25zdHJ1Y3RSb3c6IG1vdmUgc29tZSBvbmUtdGltZSBpbml0cyBvdXQgb2YgdGhlIG1haW4gbG9vcAorN2EwMWMzYzMgVlA4TEJpdFJlYWRlcjogZml4IHJlbWFpbmluZyB1YnNhbiBlcnJvciB3aXRoIGxhcmdlIHNoaWZ0cworN2ZhNjdjOWIgY2hhbmdlIEdldFBpeFBhaXJIYXNoNjQoKSByZXR1cm4gdHlwZSB0byB1aW50MzJfdAorZWMxZmI5ZjggTWVyZ2UgImRzcC9lbmMuYzogY29zbWV0aWNzOiBtb3ZlIERTVCgpIGRlZiBjbG9zZXIgdG8gdXNlIgorNzA3M2JmYjMgTWVyZ2UgInNwbGl0IDY0LW11bHQgaGFzaGluZyBpbnRvIHR3byAzMi1iaXQgbXVsdGlwbGllcyIKKzA3NjhiMjUyIGRzcC9lbmMuYzogY29zbWV0aWNzOiBtb3ZlIERTVCgpIGRlZiBjbG9zZXIgdG8gdXNlCis2YTQ4YjhmMCBNZXJnZSAiZml4IE1TVkMgc2l6ZV90LT5pbnQgY29udmVyc2lvbiB3YXJuaW5nIgorMWRiMDdjZGUgTWVyZ2UgImFuaW1fZW5jb2RlOiBjb3NtZXRpY3M6IGZpeCBhbGlnbm1lbnQiCitlMjgyNzFhMyBhbmltX2VuY29kZTogY29zbWV0aWNzOiBmaXggYWxpZ25tZW50Cis3ZmUzNTdiOCBzcGxpdCA2NC1tdWx0IGhhc2hpbmcgaW50byB0d28gMzItYml0IG11bHRpcGxpZXMKK2FmNzRjMTQ1IHBvcHVsYXRlICdsaWJ3ZWJwZXh0cmFzJyB3aXRoOiBpbXBvcnQgZ3JheSwgcmdiNTY1IGFuZCByZ2I0NDQ0IGZ1bmN0aW9ucworNjEyMTQxMzQgcmVtb3ZlIFZQOFJlc2lkdWFsOjpjb3N0IHVudXNlZCBmaWVsZAorZTI1NDQ4MjMgZml4IE1TVkMgc2l6ZV90LT5pbnQgY29udmVyc2lvbiB3YXJuaW5nCitiNjlhNmMzNSB2d2VicDogZG9uJ3QgcmVkZWZpbmUgc25wcmludGYgd2l0aCBWUzIwMTUrCiswYWMyOWM1MSBBbmltRW5jb2RlciBBUEk6IENvbnNpc3RlbnQgdXNlIG9mIHRyYWlsaW5nIHVuZGVyc2NvcmVzIGluIHN0cnVjdC4KK2Q0ODQ1NTUwIEFuaW1FbmNvZGVyIEFQSTogVXNlIHRpbWVzdGFtcCBpbnN0ZWFkIG9mIGR1cmF0aW9uIGFzIGlucHV0IHRvIEFkZCgpLgorOTkwNGUzNjUgZHNwL2RlY19zc2UyOiBEQzh1diAvIERDOHV2Tm9MZWZ0IHNwZWVkdXAKKzdkZjIwNDk3IGRzcC9kZWNfc3NlMjogREMxNiAvIERDMTZOb0xlZnQgc3BlZWR1cAorOGU1MTVkZmUgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IGFkZCBzb21lIG1pc3NpbmcgaGVhZGVycyIKK2RiMTIyNTBmIGNvc21ldGljczogdnA4ZW5jaS5oOiBicmVhayBsb25nIGxpbmUKK2JmNTE2YTg3IG1ha2VmaWxlLnVuaXg6IGFkZCBzb21lIG1pc3NpbmcgaGVhZGVycworYjQ0ZWRhM2YgZHNwOiBhZGQgRFNQX0lOSVRfU1RVQgorMDNlNzZlOTYgY2xhcmlmeSB0aGUgY29tbWVudCBhYm91dCBkb3VibGUtc2V0dGluZyB0aGUgc3RhdHVzIGluIFNldEVycm9yKCkKKzlmZWNkZDcxIHJlbW92ZSB1bnVzZWQgRW1pdFJHQigpCis0M2YwMTBkZCBtb3ZlIFJlY29uc3RydWN0Um93IHRvIHRvcAorODJkOTgwMjAgYWRkIGEgZGVjL2NvbW1vbi5oIGhlYWRlciB0byBjb2xsZWN0IGNvbW1vbiBlbmMvZGVjICNkZWZpbmVzCis1ZDQ3NDRhMiBNZXJnZSAiZW5jX3NzZTQxOiBhZGQgRGlzdG80eDQgLyBEaXN0bzE2eDE2IgorZTM4ODg2YTcgbXV4Lmg6IEJ1bXAgdXAgQUJJIHZlcnNpb24KKzQ2MzA1Y2E2IGNvbmZpZ3VyZTogYWRkIC0tZGlzYWJsZS08YXZ4Mnxzc2U0LjF8c3NlMj4KKzJmYzhiNjU4IENQUEZMQUdTLT5DRkxBR1MgZm9yIGRldGVjdGluZyBzc2U0LjEgaW4gcHJlcHJvY2Vzc29yCisxYTMzOGZiMyBlbmNfc3NlNDE6IGFkZCBEaXN0bzR4NCAvIERpc3RvMTZ4MTYKKzk0MDU1NTAzIGVuY29kaW5nIFNTRTQuMSBzdHViIGZvciBTdG9yZUhpc3RvZ3JhbSArIFF1YW50aXplICsgU1NFXzE2eE4KK2M2NDY1OWUxIHJlbW92ZSBkdXBsaWNhdGUgdmFyaWFibGVzIGFmdGVyIHRoZSBsb3NzbGVzc3tfZW5jfS5jIHNwbGl0Cis2N2JhN2M3YSBlbmNfc3NlMjogY2FsbCBsb2NhbCBGVHJhbnNmb3JtIGluIENvbGxlY3RIaXN0b2dyYW0KKzE4MjQ5Nzk5IGRzcDogcy9WUDhMU2V0SGlzdG9ncmFtRGF0YS9WUDhTZXRIaXN0b2dyYW1EYXRhLworZWRlNWUxNTggY29zbWV0aWNzOiBkc3AvbG9zc2xlc3MuaDogcmVvcmRlciBwcm90b3R5cGVzCis1NTMwNTFmNyBkc3AvbG9zc2xlc3M6IHNwbGl0IGVuYy9kZWMgZnVuY3Rpb25zCis5MDY0YWRjOCBNZXJnZSAiY29uZGl0aW9uYWxseSBhZGQgLW1zc2U0LjEgaW4gTWFrZWZpbGUudW5peCIKK2NlY2Y1MDk2IGRzcC95dXYqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzY1ODRkMzk4IGRzcC91cHNhbXBsaW5nKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis4MDgwOTQyMiBkc3AvcmVzY2FsZXIqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzFkOTNkZGVjIGRzcC9sb3NzbGVzcyouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorNzM4MDVmZjIgZHNwL2ZpbHRlcnMqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKK2ZiZGNlZjI0IGRzcC9lbmMqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzY2ZGU2OWMxIGRzcC9kZWMqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzQ4ZTRmZmQxIGRzcC9jb3N0Ki5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCisyOWZkNmY5MCBkc3AvYXJnYiouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorODBmZjM4MTMgZHNwL2FscGhhKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCitiZjA5Y2YxZSBjb25kaXRpb25hbGx5IGFkZCAtbXNzZTQuMSBpbiBNYWtlZmlsZS51bml4CitlOTU3MGRkOSBzdHViIGZvciBTU0U0LjEgc3VwcG9ydC4KKzRhOTUzODRiIE1lcmdlICJkc3A6IGFkZCBzc2U0LjEgZGV0ZWN0aW9uIgorY2FiZjRiZDIgZHNwOiBhZGQgc3NlNC4xIGRldGVjdGlvbgorNGVjYmExYWIgdGhyZWFkLmg6IHJlbmFtZSBpbnRlcmZhY2UgcGFyYW0KK2I4ZDcwNmM4IE1lcmdlICJzeW5jIHZlcnNpb25zIHdpdGggMC40LjMiCithZTY0YTcxMSBNZXJnZSAiYWRkIHNoZWxsIGZvciBsaWJ3ZWJwZXh0cmFzIgorOTJhNWRhOWMgc3luYyB2ZXJzaW9ucyB3aXRoIDAuNC4zCis5ZDRlMmQxNiBNZXJnZSAifjMwJSBmYXN0ZXIgc21hcnQteXV2ICgtcHJlIDQpIHdpdGggZWFybHktb3V0IGNyaXRlcmlvbiIKK2IxYmRiYmFiIH4zMCUgZmFzdGVyIHNtYXJ0LXl1diAoLXByZSA0KSB3aXRoIGVhcmx5LW91dCBjcml0ZXJpb24KKzdlZmI5NzQ4IE1lcmdlICJEaXNhYmxlIE5FT04gY29kZSBvbiBOYXRpdmUgQ2xpZW50IgorYWM0ZjU3ODQgRGlzYWJsZSBORU9OIGNvZGUgb24gTmF0aXZlIENsaWVudAorMDg3M2Y4NWIgQW5pbUVuY29kZXIgQVBJOiBTdXBwb3J0IGlucHV0IGZyYW1lcyBpbiBZVVYoQSkgZm9ybWF0LgorNWMxNzZkMmQgYWRkIHNoZWxsIGZvciBsaWJ3ZWJwZXh0cmFzCis0NGJkOTU2MSBmaXggc2lnbmF0dXJlIGZvciBWUDhSZWNvcmRDb2VmZlRva2VucygpCitjOWI4ZWEwZSBzbWFsbCBjb3NtZXRpY3Mgb24gVG9rZW5CdWZmZXIuCis3NjM5NGMwOSBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgVHJ1ZU1vdGlvbiIKKzBmNzczNjkzIFdlYlBQaWN0dXJlUmVzY2FsZTogYWRkIGEgbm90ZSBhYm91dCAwIHdpZHRoL2hlaWdodAorMjQxYmI1ZDkgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgVHJ1ZU1vdGlvbgorNmNlZjBlNGYgZXhhbXBsZXMvQW5kcm9pZC5tazogYWRkIHdlYnBtdXhfZXhhbXBsZSB0YXJnZXQKKzUzYzE2ZmYwIEFuZHJvaWQubWs6IGFkZCB3ZWJwbXV4IHRhcmdldAorMjE4NTJhMDAgQW5kcm9pZC5tazogYWRkIHdlYnBkZW11eCB0YXJnZXQKKzg2OTdhM2JjIEFuZHJvaWQubWs6IGFkZCB3ZWJwZGVjb2RlcnssX3N0YXRpY30gdGFyZ2V0cworNGE2NzA0OTEgQW5kcm9pZC5tazogc3BsaXQgc291cmNlIGxpc3RzIHBlci1kaXJlY3RvcnkKK2I1ZTc5NDIyIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIHNvbWUgY29udmVydCBmdW5jdGlvbnMKKzBmNTk1ZGI2IE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIHNvbWUgY29udmVydCBmdW5jdGlvbnMKKzhhMjE4YjRhIE1JUFM6IFttaXBzMzJ8ZHNwcjJdOiBHZXRSZXNpZHVhbENvc3QgcmViYXNlZAorZWY5ODc1MDAgU3BlZWR1cCBtZXRob2QgU3RvcmVJbWFnZVRvQml0TWFzayBieSA1JS4KKzYwMmEwMGY5IGZpeCBpT1MgYXJtNjQgYnVpbGQgd2l0aCBYY29kZSA2LjMKKzIzODIwNTA3IDEtMiUgZmFzdGVyIGVuY29kaW5nIGJ5IHJlbW92aW5nIGFuIGluZGlyZWN0aW9uIGluIEdldFJlc2lkdWFsQ29zdCgpCitlZGRiN2U3MCBNSVBTOiBkc3ByMjogYWRkZWQgb3RwaW1pemF0aW9uIGZvciBEQzh1diwgREM4dXZOb1RvcCBhbmQgREM4dXZOb0xlZnQKKzczYmEyOTE1IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9ucyBSRDQgYW5kIExENAorYzcxMjlkYTUgTWVyZ2UgIjQtNSUgZmFzdGVyIGVuY29kaW5nIHVzaW5nIFNTRTIgZm9yIEdldFJlc2lkdWFsQ29zdCIKKzk0MzgwZDAwIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRvbiBmb3IgZnVuY3Rpb25zIFZFNCBhbmQgREM0CisyYTQwNzA5MiA0LTUlIGZhc3RlciBlbmNvZGluZyB1c2luZyBTU0UyIGZvciBHZXRSZXNpZHVhbENvc3QKKzE3ZTE5ODYyIE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBzaW1wbGUgZmlsdGVyaW5nIGZ1bmN0aW9ucyIKKzNlYzQwNGM0IE1lcmdlICJkc3A6IG5vcm1hbGl6ZSBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHVzYWdlIgorYjk2OWY1ZGYgZHNwOiBub3JtYWxpemUgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB1c2FnZQorZDdiOGU3MTEgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3Igc2ltcGxlIGZpbHRlcmluZyBmdW5jdGlvbnMKKzIzNWY3NzRlIE1lcmdlICJNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MiCis0MmE4YTYyOCBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MKK2I0NDJiZWYzIE1lcmdlICJBcHBseUZpbHRlcnNBbmRFbmNvZGU6IG9ubHkgY29weSBsb3NzbGVzcyBzdGF0cyIKK2I1MTBmYmZlIGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiBub3RlIE1TQiBvcmRlciBmb3IgY2h1bmsgZGlhZ3JhbXMKKzliYzBmOTIyIEFwcGx5RmlsdGVyc0FuZEVuY29kZTogb25seSBjb3B5IGxvc3NsZXNzIHN0YXRzCiszMDMwZjExNSBNZXJnZSAiZHNwL21pcHM6IGFkZCBzb21lIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9ucyIKK2RmY2Y0NTkzIE1lcmdlICJNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyIKKzU1Yzc1YTI1IGRzcC9taXBzOiBhZGQgc29tZSBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbnMKKzJjYjg3OWYwIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DCitlMTU1NjAxMCBtb3ZlIHNvbWUgY29zdCB0YWJsZXMgZnJvbSBlbmMvIHRvIGRzcC8KK2MzYTAzMTY4IE1lcmdlICJwaWN0dXJlX2NzcDogZml4IGJ1aWxkIHcvVVNFX0dBTU1BX0NPTVBSRVNTSU9OIHVuZGVmaW5lZCIKKzM5NTM3ZDdjIE1lcmdlICJWUDhMRHNwSW5pdE1JUFNkc3BSMjogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9uIgorMWRkNDE5Y2UgcGljdHVyZV9jc3A6IGZpeCBidWlsZCB3L1VTRV9HQU1NQV9DT01QUkVTU0lPTiB1bmRlZmluZWQKKzQzZmQzNTQzIFZQOExEc3BJbml0TUlQU2RzcFIyOiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb24KK2M3MjMzZGZjIE1lcmdlICJWUDhMRHNwSW5pdDogcmVtb3ZlIG1lbWNweSIKKzBlYzRkYTk2IHBpY3R1cmVfY3NwOjpJbml0R2FtbWFUYWJsZXMqOiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb25zCiszNTU3OWE0OSBWUDhMRHNwSW5pdDogcmVtb3ZlIG1lbWNweQorOTdmNmFmZjggVlA4WVVWSW5pdDogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9uCitmOTAxNmQ2NiBkc3AvZW5jOjpJbml0VGFibGVzOiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb24KK2UzZDk3NzFhIFZQOEVuY0RzcENvc3RJbml0KjogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9ucworZDk3YzE0M2QgTWVyZ2UgImRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiBjb3NtZXRpY3MiCiszMDliNzkwOCBNSVBTOiBtaXBzMzI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gU2V0UmVzaWR1YWxDb2VmZnMKK2E5ODdmYWVkIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEdldFJlc2lkdWFsQ29zdAorZTdkM2RmMjMgZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IGNvc21ldGljcworYmU2NjM1ZTkgTWVyZ2UgIlZQOFRCdWZmZXJDbGVhcjogcmVtb3ZlIHNvbWUgbWlzbGVhZGluZyBjb25zdCdzIgorMDI5NzFlNzIgTWVyZ2UgIlZQOEVtaXRUb2tlbnM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBwYXJhbSB2b2lkIGNhc3QiCiszYjc3ZTVhNyBWUDhUQnVmZmVyQ2xlYXI6IHJlbW92ZSBzb21lIG1pc2xlYWRpbmcgY29uc3QncworYWExMzljOGYgVlA4RW1pdFRva2VuczogcmVtb3ZlIHVubmVjZXNzYXJ5IHBhcmFtIHZvaWQgY2FzdAorYzI0ZDhmMTQgY29zbWV0aWNzOiB1cHNhbXBsaW5nX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCisxODI5YzQyYyBjb3NtZXRpY3M6IGxvc3NsZXNzX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCisxODMxNjhmMyBjb3NtZXRpY3M6IGVuY19zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworODYwYmFkY2EgY29zbWV0aWNzOiBkZWNfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzAyNTRkYjk3IGNvc21ldGljczogYXJnYl9zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworMWFhZGY4NTYgY29zbWV0aWNzOiBhbHBoYV9wcm9jZXNzaW5nX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCisxNTc5ZGUzYyB2d2VicDogY2xlYXIgY2FudmFzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsb29wCis0YjlmYTVkMCBNZXJnZSAid2VicC1jb250YWluZXItc3BlYzogY2xhcmlmeSBiYWNrZ3JvdW5kIGNsZWFyIG9uIGxvb3AiCis0YzgyMjg0ZCBVcGRhdGVkIHRoZSBuZWFyLWxvc3NsZXNzIGxldmVsIG1hcHBpbmcuCis1NjAzOTQ3OSB3ZWJwLWNvbnRhaW5lci1zcGVjOiBjbGFyaWZ5IGJhY2tncm91bmQgY2xlYXIgb24gbG9vcAorMTlmMGJhMGUgSW1wbGVtZW50IHRydWUtbW90aW9uIHByZWRpY3Rpb24gaW4gU1NFMgorNzc0ZDRjYjcgbWFrZSBWUDhQcmVkTHVtYTE2W10gYXJyYXkgbm9uLWNvbnN0CitkN2VhYmI4MCBNZXJnZSAiTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gQ29sbGVjdEhpc3RvZ3JhbSIKK2ZlNDI3MzljIFVzZSBpbnRlZ2VycyBmb3Iga21pbi9rbWF4IGZvciBzaW1wbGljaXR5LgorYjlkZjM1ZjcgQW5pbUVuY29kZSBBUEk6IGttYXg9MCBzaG91bGQgaW1wbHkgYWxsIGtleWZyYW1lcy4KKzZjZTI5NmRhIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIENvbGxlY3RIaXN0b2dyYW0KKzJjOTA2YzQwIHZ3ZWJwOiByZW1vdmUgdW5uZWNlc3Nhcnkgc3RhdGljIEhlbHAoKSBwcm90b3R5cGUKK2JlMGZkMWQ1IE1lcmdlICJkZWMvdnA4OiBjbGVhciAnZGl0aGVyXycgb24gc2tpcHBlZCBibG9ja3MiCitlOTYxNzBmZSBNZXJnZSAidndlYnAvYW5pbWF0aW9uOiBkaXNwbGF5IGxhc3QgZnJhbWUgb24gZW5kLW9mLWxvb3AiCiswZjAxN2I1NiB2d2VicC9hbmltYXRpb246IGRpc3BsYXkgbGFzdCBmcmFtZSBvbiBlbmQtb2YtbG9vcAorYzg2YjQwY2MgZW5jL25lYXJfbG9zc2xlc3MuYzogZml4IGFsaWdubWVudAorNjY5MzVmYjkgZGVjL3ZwODogY2xlYXIgJ2RpdGhlcl8nIG9uIHNraXBwZWQgYmxvY2tzCitiN2RlNzk0NiBNZXJnZSAibG9zc2xlc3NfbmVvbjogZW5hYmxlIHN1YnRyYWN0IGdyZWVuIGZvciBhYXJjaDY0IgorNzc3MjRmNzAgU1NFMiB2ZXJzaW9uIG9mIEdyYWRpZW50VW5maWx0ZXIKKzQxNmUxY2VhIGxvc3NsZXNzX25lb246IGVuYWJsZSBzdWJ0cmFjdCBncmVlbiBmb3IgYWFyY2g2NAorNzI4MzFmNmIgU3BlZWR1cCBBbmFseXplQW5kSW5pdCBmb3IgbG93IGVmZm9ydCBjb21wcmVzc2lvbi4KK2E2NTk3NDgzIFNwZWVkdXAgQW5hbHl6ZSBtZXRob2RzIGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKzk4YzgxMzg2IEVuYWJsZSBOZWFyLWxvc3NsZXNzIGZlYXR1cmUuCitjNmIyNDU0MyBBbmltRW5jb2RlciBBUEk6IEZpeCBmb3Iga21heD0xIGFuZCBkZWZhdWx0IGttaW4gY2FzZS4KKzAyMmQyZjg4IGFkZCBTU0UyIHZhcmlhbnRzIGZvciBhbHBoYSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisyZGIxNWE5NSBUZW1wb3JhcmlseSBkaXNhYmxlIGVuY29kaW5nIG9mIGFscGhhIHBsYW5lIHdpdGggY29sb3IgY2FjaGUuCisxZDU3NWNjZCBNZXJnZSAiTG9zc2xlc3MgZGVjb2Rpbmc6IFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBpZiBjb25kaXRpb24uIgorY2FmYTFkODggTWVyZ2UgIlNpbXBsaWZ5IGJhY2t3YXJkIHJlZnMgY2FsY3VsYXRpb24gZm9yIGxvdy1lZmZvcnQuIgorN2FmZGFmODQgQWxwaGEgY29kaW5nOiByZW9yZ2FuaXplIHRoZSBmaWx0ZXIvdW5maWx0ZXJpbmcgY29kZQorNGQ2ZDcyODUgU2ltcGxpZnkgYmFja3dhcmQgcmVmcyBjYWxjdWxhdGlvbiBmb3IgbG93LWVmZm9ydC4KK2VjMGQxYmU1IENsZWF1cCBOZWFyLWxvc3NsZXNzIGNvZGUuCis5ODE0ZGRiNiBSZW1vdmUgdGhlIHBvc3QtdHJhbnNmb3JtIG5lYXItbG9zc2xlc3MgaGV1cmlzdGljLgorNDUwOWUzMmUgTG9zc2xlc3MgZGVjb2Rpbmc6IFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBpZiBjb25kaXRpb24uCitmMmViYzRhOCBNZXJnZSAiUmVncmVzc2lvbiBmaXggZm9yIGxvc3NsZXNzIGRlY29kaW5nIgorNzgzYThjZGEgUmVncmVzc2lvbiBmaXggZm9yIGxvc3NsZXNzIGRlY29kaW5nCis5YTA2MmI4ZSBBbmltRW5jb2RlcjogQnVnZml4IGZvciBrbWluID0gMSBhbmQga21heCA9IDIuCiswZjAyN2E3MiBzaW1wbGlmeSBzbWFydCBSR0ItPllVViBjb252ZXJzaW9uIGNvZGUKKzBkNWIzMzRlIEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGg6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKK2Y0ODBkMWE3IEZpeCB0byBuZWFyIGxvc3NsZXNzIGFydGVmYWN0cyBvbiBwYWxldHRpemVkIGltYWdlcy4KK2Q0NjE1ZDA4IE1lcmdlIGNoYW5nZXMgSWExNjg2ODI4LEkzOTlmZGE0MAorY2I0YTE4YTcgcmVuYW1lIEhhc2hDaGFpbkluaXQgaW50byBIYXNoQ2hhaW5SZXNldAorZjA3OWU0ODcgdXNlIHVpbnQxNl90IGZvciBjaG9zZW5fcGF0aFtdCitkYTA5MTIxMiBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBGVHJhbnNmb3JtV0hUCitiOGMyMDEzNSBNZXJnZSAid2ljZGVjOiAobXN2cykgcXVpZXQgc29tZSAvYW5hbHl6ZSB3YXJuaW5ncyIKKzliMjI4YjU0IHdpY2RlYzogKG1zdnMpIHF1aWV0IHNvbWUgL2FuYWx5emUgd2FybmluZ3MKK2RhZWIyNzZhIE1lcmdlICJNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBNdWx0QVJHQlJvdyBmdW5jdGlvbiIKK2NjMDg3NDI0IE1lcmdlICJkc3AvY3B1OiAobXN2cykgYWRkIGluY2x1ZGUgZm9yIF9fY3B1aWRleCIKKzRhODJhYWI1IE1lcmdlIGNoYW5nZXMgSTg3NTQ0ZTkyLEkwYmI2Y2RhNQorN2ExOTEzOTggZHdlYnAvV3JpdGVQTkc6IG1hcmsgcG5nIHZhcmlhYmxlcyB2b2xhdGlsZQorNzc1ZGZhZDIgZHdlYnA6IGluY2x1ZGUgc2V0am1wLmggdy9XRUJQX0hBVkVfUE5HCis0N2QyNmJlNyBkd2VicDogY29ycmVjdCBzaWduIGluIGZvcm1hdCBzdHJpbmdzCitmMGUwNjc3YiBWUDhMRW5jb2RlU3RyZWFtOiBhZGQgYW4gYXNzZXJ0CitjNWY3NzQ3ZiBWUDhMQ29sb3JDYWNoZUNvcHk6IHByb21vdGUgYW4gaW50IGJlZm9yZSBzaGlmdGluZworMGRlNWYzM2UgZHNwL2NwdTogKG1zdnMpIGFkZCBpbmNsdWRlIGZvciBfX2NwdWlkZXgKKzdkODUwZjdiIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIE11bHRBUkdCUm93IGZ1bmN0aW9uCis1NDg3NTI5MyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBRdWFudGl6ZUJsb2NrCis0ZmJlOWNmMiBkc3AvY3B1OiAobXN2cykgYXZvaWQgaW1taW50cmluLmggb24gX01fQVJNCiszZmQ1OTAzOSBzaW1wbGlmeS9yZW9yZ2FuaXplIGFyZ3VtZW50cyBmb3IgQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMKK2I5ZTM1NmI5IERpc2FibGUgY29zdGx5IFRyYWNlQmFja3dhcmRzIGZvciBtZXRob2Q9MC4KK2E3ZTdjYWE0IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFRyYW5zZm9ybUNvbG9yUmVkCisyY2IzOTE4MCBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVHJhbnNmb3JtQ29sb3JCbHVlIgorMjc5ZTY2MTMgTWVyZ2UgImRzcC9jcHU6IGFkZCBpbmNsdWRlIGZvciBfeGdldGJ2KCkgdy9NU1ZTIgorYjZjMDQyOGUgZHNwL2NwdTogYWRkIGluY2x1ZGUgZm9yIF94Z2V0YnYoKSB3L01TVlMKK2QxYzRmZmFlIGdpZjJ3ZWJwOiBNb3ZlIEdJRiBkZWNvZGluZyByZWxhdGVkIGNvZGUgdG8gYSBzdXBwb3J0IGxpYnJhcnkuCiswN2MzOTU1OSBNZXJnZSAiQW5pbUVuY29kZXIgQVBJOiBBZGQgaW5mbyBpbiBSRUFETUUubXV4IgorN2IxNjE5NzMgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVHJhbnNmb3JtQ29sb3JCbHVlCitkN2M0YjAyYSBjcHU6IGZpeCBBVlgyIGRldGVjdGlvbiBmb3IgZ2NjL2NsYW5nIHRhcmdldHMKKzlkMjk5NDY5IEFuaW1FbmNvZGVyIEFQSTogQWRkIGluZm8gaW4gUkVBRE1FLm11eAorZDU4MWJhNDAgZm9sbG93LXVwOiBjbGVhbiB1cCBXZWJQUmVzY2FsZXJYWFggZHNwIGZ1bmN0aW9uCitmODc0MGYwZCBkc3A6IHMvVVNFX0lOVFJJTlNJQ1MvV0VCUF9VU0VfSU5UUklOU0lDUy8KK2NlNzNhYmUwIE1lcmdlICJpbnRyb2R1Y2UgYSBzZXBhcmF0ZSBXZWJQUmVzY2FsZXJEc3BJbml0IHRvIGluaXRpYWxpemUgcG9pbnRlcnMiCithYjY2YmVjYSBpbnRyb2R1Y2UgYSBzZXBhcmF0ZSBXZWJQUmVzY2FsZXJEc3BJbml0IHRvIGluaXRpYWxpemUgcG9pbnRlcnMKKzIwNWM3ZjI2IGZpeCBoYW5kbGluZyBvZiB6ZXJvLXNpemVkIHBhcnRpdGlvbiAjMCBjb3JuZXIgY2FzZQorY2JjZGQ1ZmYgTWVyZ2UgIm1vdmUgcmVzY2FsZXIgZnVuY3Rpb25zIHRvIHJlc2NhbGVyKiBmaWxlcyBpbiBzcmMvZHNwLyIKK2JmNTg2ZTg4IE1lcmdlIGNoYW5nZXMgSTIzMGIzNTMyLElkZjMwNTdhNworNmRjNzlkYzIgTWVyZ2UgImFuaW1fZW5jb2RlOiBmaXggdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzIgorMTFmY2UyNWEgTWVyZ2UgImRlY19uZW9uOiByZW1vdmUgcmV0dXJucyBmcm9tIHZvaWQgZnVuY3Rpb25zIgorYzRlNjNmOTkgTWFrZWZpbGUudmM6IGFkZCBnaWYyd2VicCB0YXJnZXQKKzRmNDNkMzhjIGVuYWJsZSBORU9OIGZvciBXaW5kb3dzIEFSTSBidWlsZHMKKzNmNjYxNWFjIE1ha2VmaWxlLnZjOiBhZGQgcnVkaW1lbnRhcnkgV2luZG93cyBBUk0gc3VwcG9ydAorZTdjNTk1NGMgZGVjX25lb246IHJlbW92ZSByZXR1cm5zIGZyb20gdm9pZCBmdW5jdGlvbnMKK2Y3OWMxNjNiIGFuaW1fZW5jb2RlOiBmaXggdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzCiswZjU0ZjFlYyBSZW1vdmUgZ2lmMndlYnBfdXRpbCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkLgorY2JjYmVkZDAgbW92ZSByZXNjYWxlciBmdW5jdGlvbnMgdG8gcmVzY2FsZXIqIGZpbGVzIGluIHNyYy9kc3AvCithYzc5ZWQxOSB3ZWJwbXV4OiByZW1vdmUgZXhwZXJpbWVudGFsIGZyYWdtZW50IGhhbmRsaW5nCitlODY5NGQ0ZCBtdXg6IHJlbW92ZSBleHBlcmltZW50YWwgRlJHTSBwYXJzaW5nCis5ZTkyYjZlYSBBbmltRW5jb2RlciBBUEk6IE9wdGltaXplIHNpbmdsZS1mcmFtZSBhbmltYXRlZCBpbWFnZXMKK2FiYmFlMjc5IE1lcmdlICJNb3ZlIG92ZXIgZ2lmMndlYnAgdG8gdGhlIG5ldyBBbmltRW5jb2RlciBBUEkuIgorYTI4YzRiMzYgTUlQUzogbW92ZSBXT1JLX0FST1VORF9HQ0MgZGVmaW5lIHRvIGFwcHJvcHJpYXRlIHBsYWNlCiswMTJkMmM2MCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbnMgU1NFQXhCCis2NzcyMGM4YiBNb3ZlIG92ZXIgZ2lmMndlYnAgdG8gdGhlIG5ldyBBbmltRW5jb2RlciBBUEkuCis5MjQxZWNmNCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBBdmVyYWdlCis5NDIyMjExZCBNZXJnZSAiVHVuZSBCYWNrd2FyZFJlZmVyZW5jZXNMejc3IGZvciBsb3dfZWZmb3J0IChtPTApLiIKK2RmNDAwNTdiIE1lcmdlICJTcGVlZHVwIFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyBmb3IgbG93IGVmZm9ydCAobT0wKSBtb2RlLiIKK2VhMDg0NjZkIFR1bmUgQmFja3dhcmRSZWZlcmVuY2VzTHo3NyBmb3IgbG93X2VmZm9ydCAobT0wKS4KK2IwYjk3M2MzIFNwZWVkdXAgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzIGZvciBsb3cgZWZmb3J0IChtPTApIG1vZGUuCitjNmQzMjkyNyBhcmdiX3NzZTI6IGNvc21ldGljcworNjdmNjAxY2QgbWFrZSB0aGUgJ2xhc3RfY3B1aW5mb191c2VkJyB2YXJpYWJsZSBuYW1lcyB1bmlxdWUKK2I5NDg5ODYxIEFuaW1FbmNvZGVyIEFQSTogSW5pdCBtZXRob2QgZm9yIGRlZmF1bHQgb3B0aW9ucy4KKzg1NmY4ZWMxIE1lcmdlICJBbmltRW5jb2RlciBBUEk6IFJlbW92ZSBBbmltRW5jb2RlckZyYW1lT3B0aW9ucy4iCitjNTM3NTE0ZCBNZXJnZSAiQW5pbUVuY29kZXIgQVBJOiBHZW5lcmF0ZUNhbmRpZGF0ZXMgYnVnZml4LiIKK2RjMGNlMDM5IE1lcmdlICJBbmltRW5jb2RlciBBUEk6IENvbXB1dGUgY2hhbmdlIHJlY3RhbmdsZSBmb3IgZmlyc3QgZnJhbWUgdG9vLiIKK2YwMGI2MzliIE1lcmdlICJBbmltRW5jb2RlciBBUEk6IEluIEFzc2VtYmxlKCksIGFsd2F5cyBzZXQgYW5pbWF0aW9uIHBhcmFtZXRlcnMuIgorMjllZDc5NmMgTWVyZ2UgIkFuaW1FbmNvZGVyIGxpYiBjbGVhbnVwOiBwcmV2IHRvIHByZXYgY2FudmFzIG5vdCBuZWVkZWQuIgorOWYwZGQ2ZTUgTWVyZ2UgIldlYlBBbmltRW5jb2RlciBBUEk6IEhlYWRlciBhbmQgaW1wbGVtZW50YXRpb24iCis1ZTU2YmJlMCBBbmltRW5jb2RlciBBUEk6IFJlbW92ZSBBbmltRW5jb2RlckZyYW1lT3B0aW9ucy4KK2I5MDJjM2VhIEFuaW1FbmNvZGVyIEFQSTogR2VuZXJhdGVDYW5kaWRhdGVzIGJ1Z2ZpeC4KK2VmM2MzOWJiIEFuaW1FbmNvZGVyIEFQSTogQ29tcHV0ZSBjaGFuZ2UgcmVjdGFuZ2xlIGZvciBmaXJzdCBmcmFtZSB0b28uCitlZWM0MjNhYiBBbmltRW5jb2RlciBBUEk6IEluIEFzc2VtYmxlKCksIGFsd2F5cyBzZXQgYW5pbWF0aW9uIHBhcmFtZXRlcnMuCithZTFjMDQ2ZSBBbmltRW5jb2RlciBsaWIgY2xlYW51cDogcHJldiB0byBwcmV2IGNhbnZhcyBub3QgbmVlZGVkLgorNGI5OTdhZTQgV2ViUEFuaW1FbmNvZGVyIEFQSTogSGVhZGVyIGFuZCBpbXBsZW1lbnRhdGlvbgorNzIyMDhiZWMgbW92ZSBhcmdiXyoubyBidWlsZCB0YXJnZXQgdG8gZW5jb2RlciBsaXN0Cis5NTkyMDUzOCBNZXJnZSAibXVsdGktdGhyZWFkIGZpeDogbG9jayBlYWNoIGVudHJ5IHBvaW50cyB3aXRoIGEgc3RhdGljIHZhciIKKzRjMWIzMDBhIE1lcmdlICJTU0UyIGltcGxlbWVudGF0aW9uIG9mIFZQOFBhY2tBUkdCIgorZmJjYzIwMDQgTWVyZ2UgImFkZCAtV2Zvcm1hdC1ub25saXRlcmFsIGFuZCAtV2Zvcm1hdC1zZWN1cml0eSIKKzgwZDk1MGQ5IGFkZCAtV2Zvcm1hdC1ub25saXRlcmFsIGFuZCAtV2Zvcm1hdC1zZWN1cml0eQorMDRjMjBlNzUgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEludHJhNFByZWRzIgorYTQzNzY5NGEgbXVsdGktdGhyZWFkIGZpeDogbG9jayBlYWNoIGVudHJ5IHBvaW50cyB3aXRoIGEgc3RhdGljIHZhcgorY2E3ZjYwZGIgU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBWUDhQYWNrQVJHQgorNzJkNTczZjYgc2ltcGxpZnkgdGhlIFBhY2tBUkdCIHNpZ25hdHVyZQorNGUyNTg5ZmYgZGVtdXg6IHJlc3RvcmUgc3RyaWN0IGZyYWdtZW50IGZsYWcgY2hlY2sKKzRiYThlMDc0IE1lcmdlICJ3ZWJwLWNvbnRhaW5lci1zcGVjOiByZW1vdmUgcmVmZXJlbmNlcyB0byBmcmFnbWVudHMiCitlNzUyZjBhNiBNZXJnZSAiZGVtdXg6IHJlbW92ZSBleHBlcmltZW50YWwgRlJHTSBwYXJzaW5nIgorZjhhYmIxMTIgTWVyZ2UgY2hhbmdlcyBJMTA5ZWM0ZDksSTczZmU3NzQzCithZTIxODhhNCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBJbnRyYTRQcmVkcworMWY0Yjg2NDIgbW92ZSBWUDhFbmNEc3BBUkdCSW5pdCgpIGNhbGwgY2xvc2VyIHRvIHdoZXJlIGl0J3MgbmVlZGVkCisxNDEwOGQ3OCBkZWNfbmVvbjogYWRkIERDOHV2Tm9Ub3AgLyBEQzh1dk5vTGVmdAorZDgzNDBkYTcgZGVjX25lb246IGFkZCBEQzh1dgorYTY2ZTY2Yzcgd2VicC1jb250YWluZXItc3BlYzogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gZnJhZ21lbnRzCis3Y2U4Nzg4YiBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBNYWtlQVJHQjMyCiswMTJlNjIzZCBkZW11eDogcmVtb3ZlIGV4cGVyaW1lbnRhbCBGUkdNIHBhcnNpbmcKKzg3YzNkNTMxIG1ldGhvZD0wOiBEb24ndCBldmFsdWF0ZSBhbnkgcHJlZGljdG9yCis2ZjRmY2I5OCBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gSW1wb3J0Um93IgorMjQyODQ0NTkgcmVwbGFjZSB1bm5lZWRlZCBjYWxscyB0byBIaXN0b2dyYW1Db3B5KCkgYnkgc3dhcHMKK2JkZjdiNDBjIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEltcG9ydFJvdworZTY2YTkyMjUgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEV4cG9ydFJvd0MiCitjMjc5ZmVjMSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBFeHBvcnRSb3dDCiszMWE5Y2Y2NCBTcGVlZHVwIFdlYlAgbG9zc2xlc3MgY29tcHJlc3Npb24gZm9yIGxvdyBlZmZvcnQgKG09MCkgbW9kZSB3aXRoIGZvbGxvd2luZzogLSBEaXNhYmxlIENyb3NzLUNvbG9yIHRyYW5zZm9ybS4gLSBFdmFsdWF0ZSBwcmVkaWN0b3JzICMxMSAocGFldGgpLCAjMTIgYW5kICMxMyBvbmx5LgorOTI3NWQ5MWMgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVHJ1ZU1vdGlvbgorMjYxMDZkNjYgTWVyZ2UgImVuY19uZW9uOiBmaXggYnVpbGRpbmcgd2l0aCBub24tWGNvZGUgY2xhbmcgKGlPUykiCisxYzRlM2VmZSB1bnJvbGwgdGhlIGtCYW5kc1tdIGluZGlyZWN0aW9uIHRvIHJlbW92ZSBhIGRlcmVmZXJlbmNlIGluIEdldENvZWZmcygpCithMzk0NmI4OSBlbmNfbmVvbjogZml4IGJ1aWxkaW5nIHdpdGggbm9uLVhjb2RlIGNsYW5nIChpT1MpCis4ZWQ5YzAwZCBNZXJnZSAic2ltcGxpZnkgdGhlIEhpc3RvZ3JhbSBzdHJ1Y3QsIHRvIG9ubHkgc3RvcmUgbWF4X3ZhbHVlIGFuZCBsYXN0X256IgorYmFkNzc1NzEgc2ltcGxpZnkgdGhlIEhpc3RvZ3JhbSBzdHJ1Y3QsIHRvIG9ubHkgc3RvcmUgbWF4X3ZhbHVlIGFuZCBsYXN0X256CiszY2NhMGRjNyBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBEQ01vZGUgZnVuY3Rpb24KKzM3ZTM5NWZkIE1JUFM6IGZpeCBmdW5jdGlvbnMgdG8gdXNlIGdlbmVyaWMgQlBTIGlzdGVhZCBvZiBoYXJkY29kZWQgdmFsdWUKKzk0NzViZWY0IFBpY2tCZXN0VVY6IGZpeCBWUDhDb3B5MTZ4OCBpbnZvY2F0aW9uCis0NDFmMjczZiBNZXJnZSBjaGFuZ2VzIEk1NWY4ZGE1MixJZDczYTFlOTYKKzRhMjc5YTY4IGNvc21ldGljczogYWRkIHNvbWUgbWlzc2luZyAhPSBOVUxMIGNvbXBhcmlzb25zCis2NmFkMzcyNSBmYWN0b3JpemUgQlBTIGRlZmluaXRpb24gaW4gZHNwLmggYW5kIGFkZCBWUDhDb3B5MTZ4OAorNDMyZTViNTUgbWFrZSBBTElHTl94eHggbmFtaW5nIGNvbnNpc3RlbnQKKzU3NjA2MDQ3IGVuY29kZXI6IHN3aXRjaCBCUFMgdG8gMzIgaW5zdGVhZCBvZiAxNgorMWI2NmJiZTkgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVHJhbnNmb3JtQ29sb3JfQworYzZkMGY5ZTcgaGlzdG9ncmFtOiBjb3NtZXRpY3MKK2YzOTlkMzA3IE1lcmdlIGNoYW5nZXMgSTZlYWMxN2U1LEkzMmQyYjUxNAorOWRlOTA3NGMgZGVjX25lb246IGFkZCBUTTh1dgorOGU1MTdlY2EgYml0X3JlYWRlci9rVlA4TmV3UmFuZ2U6IHJhbmdlX3QgLT4gdWludDhfdAorZTE4NTcxMzkgZHNwOiBpbml0aWFsaXplIFZQOFByZWRDaHJvbWE4IGluIFZQOERzcEluaXQoKQorZTBjODA5YWQgTW92ZSBFbnRyb3B5IG1ldGhvZHMgdG8gbG9zc2xlc3MuYworYTk2Y2NmOGYgaW9zYnVpbGQ6IGFkZCB4NjRfNjQgc2ltdWxhdG9yIHN1cHBvcnQKK2EwZGY1NTEwIFJlbW92ZSBoYW5kbGluZyBmb3IgV0VCUF9ISU5UX0dSQVBICis0MTNkZmMwYyBNb3ZlIHN0YXRpYyBtZXRob2QgZGVmaW5pdGlvbiBiZWZvcmUgaXRzIHVzYWdlLgorMGYyMzU2NjUgVXBkYXRlIEJhY2t3YXJkUmVmc1dpdGhMb2NhbENhY2hlLgorZDY5ZTM2ZWMgUmVtb3ZlIFRPRE9zIGZyb20gbG9zc2xlc3MgZW5jb2RlciBjb2RlLgorZmRhYWM4ZTAgT3B0bWl6ZSBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzIExaNzcgcmVmZXJlbmNlcy4KKzJmMGUyYmE4IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFNlbGVjdAorYTNlNzlhNDYgTWVyZ2UgIldlYlBFbmNvZGU6IFN1cHBvcnQgZW5jb2Rpbmcgc2FtZSBwaWMgdHdpY2UgKGV2ZW4gaWYgbW9kaWZpZWQpIgorZTRmNGRkZGIgV2ViUEVuY29kZTogU3VwcG9ydCBlbmNvZGluZyBzYW1lIHBpYyB0d2ljZSAoZXZlbiBpZiBtb2RpZmllZCkKK2NiYzNmYmI0IE1lcmdlICJVcGRhdGVkIFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMgYW5kIGNvbG9yIGNhY2hlLiIKKzk1YTliZDg1IFVwZGF0ZWQgVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyBhbmQgY29sb3IgY2FjaGUuCis1NGYyYzE0YyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBGVHJhbnNmb3JtCithYTQyZjQyMyBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkCisxMWEyNWY3NSBNZXJnZSAiRmxhdHRlblNpbWlsYXJCbG9ja3Mgc2hvdWxkIG9ubHkgYmUgdHJpZWQgd2hlbiBibGVuZGluZyBpcyBwb3NzaWJsZS4iCis1Y2NjZGFkZiBGbGF0dGVuU2ltaWxhckJsb2NrcyBzaG91bGQgb25seSBiZSB0cmllZCB3aGVuIGJsZW5kaW5nIGlzIHBvc3NpYmxlLgorOTVjYTQ0YTcgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgRGlzdG80eDQKKzQxNzFiNjcyIGJhY2t3YXJkX3JlZmVyZW5jZXMuYzogcmVpbmRlbnQgYWZ0ZXIgYzg1ODFiMAorYzg1ODFiMDYgT3B0aW1pemUgQmFja3dhcmRSZWZlcmVuY2VzIGZvciBSTEUgZW5jb2RpbmcuCis1Nzk4ZWVlNiBNSVBTOiBkc3ByMjogdW5maWx0ZXJzIGJ1Z2ZpeCAoSWU3YjczODc0NzhhNmI1YzNmMDg2OTE2MjhhZTAwZjA1OWNmNmQ4OTkpCis0MTY3YTNmNSBPcHRpbWl6ZSBiYWNrd2FyZHJlZmVyZW5jZXMKK2QxODU1NGMzIE1lcmdlICJ3ZWJwL3R5cGVzLmg6IHVzZSBpbmxpbmUgZm9yIGNsYW5nKysvLXN0ZD1jKysxMSIKKzc0ODliMGU3IGdpZjJ3ZWJwOiBBZGQgJy1taW4tc2l6ZScgb3B0aW9uIHRvIGdldCBiZXN0IGNvbXByZXNzaW9uLgorNzdiZGRkZjAgU3BlZWQgdXAgQmFja3dhcmRSZWZlcmVuY2VzCis2NjM4NzEwYiB3ZWJwL3R5cGVzLmg6IHVzZSBpbmxpbmUgZm9yIGNsYW5nKysvLXN0ZD1jKysxMQorYWJmMDQyMDUgRW5hYmxlIGVudHJvcHkgYmFzZWQgbWVyZ2UgaGlzdG8gZm9yIChxPDEwMCkKKzU3MjAyMmEzIGZpbHRlcnNfbWlwc19kc3BfcjIuYzogZGlzYWJsZSB1bmZpbHRlcnMKK2EyOGUyMWIxIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwKKzE4ZDVhMWVmIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYKKzgyOWE4YzE5IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIElUcmFuc2Zvcm0KK2M5NGVkNDllIGdpZjJ3ZWJwOiBVc2UgdGhlIGRlZmF1bHQgaGludCBpbnN0ZWFkIG9mIFdFQlBfSElOVF9HUkFQSC4KKzY1M2FjZTU1IEluY3JlYXNlIHRoZSBNQVhfQ09MT1JfQ0FDSEVfQklUUyBmcm9tIDkgdG8gMTAuCis5MTkyMjBjNyBDaGFuZ2UgdGhlIGxvZ2ljIGFkanVzdGluZyB0aGUgSGlzdG9ncmFtIGJpdHMuCis1M2IwOTZjMCBNZXJnZSAiRml4IGJ1ZyBpbiBWUDhMQ2FsY3VsYXRlRXN0aW1hdGVGb3JDYWNoZVNpemUuIgorZTkxMmJkNTUgRml4IGJ1ZyBpbiBWUDhMQ2FsY3VsYXRlRXN0aW1hdGVGb3JDYWNoZVNpemUuCis1NDFkNzgzOSBNZXJnZSAiZGVjX25lb246IGFkZCBSRDQgaW50cmEgcHJlZGljdG9yIgorZjhjZDA2NzIgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgYSAnbGVnYWN5JyBSVExJQkNGRyBvcHRpb24iCisyMjg4MWM5OSBkZWNfbmVvbjogYWRkIFJENCBpbnRyYSBwcmVkaWN0b3IKKzYxM2QyODFlIHVwZGF0ZSBORVdTCisxMzA0ZWIzNCBNZXJnZSAiZGVjX25lb246IERDNDogdXNlIHBhaXItd2lzZSBhZGRzIGZvciB0b3Agcm93IgorMzRjMjBjMDYgTWFrZWZpbGUudmM6IGFkZCBhICdsZWdhY3knIFJUTElCQ0ZHIG9wdGlvbgorNzA4MzAwNmIgTWVyZ2UgImRzcC9kZWNfe25lb24sc3NlMn06IFZFNDogbm9ybWFsaXplIHZhcmlhYmxlIG5hbWVzIgorMGRiOTAzMWMgZHNwL2RlY197bmVvbixzc2UyfTogVkU0OiBub3JtYWxpemUgdmFyaWFibGUgbmFtZXMKK2I1YmMxNTMwIGRlY19uZW9uOiBEQzQ6IHVzZSBwYWlyLXdpc2UgYWRkcyBmb3IgdG9wIHJvdworNWI5MGQ4ZmUgVW5pZnkgdGhlIEFQSSBiZXR3ZWVuIFZQOEJpdFdyaXRlciBhbmQgVlA4TEJpdFdyaXRlcgorZjdhZGE1NjAgTWVyZ2UgY2hhbmdlcyBJMmUwNjkwN2IsSWE5ZWQ0Y2E2LEk3ODIyODJmZgorNWJlYjZiZjAgTWVyZ2UgImRlY19uZW9uOiBhZGQgVkU0IGludHJhIHByZWRpY3RvciIKK2ViYTZjZTA2IGRlY19uZW9uOiBhZGQgREM0IGludHJhIHByZWRpY3RvcgorNzlhYmZiZDkgZGVjX25lb246IGFkZCBUTTQgaW50cmEgcHJlZGljdG9yCitmZTM5NWYwZSBkZWNfbmVvbjogYWRkIExENCBpbnRyYSBwcmVkaWN0b3IKKzMyZGUzODVlIGRlY19uZW9uOiBhZGQgVkU0IGludHJhIHByZWRpY3RvcgorNzIzOTViYTkgTWVyZ2UgIk1vZGlmeSBDb3N0TW9kZWwgdG8gYWxsb2NhdGUgb3B0aW1hbCBtZW1vcnkuIgorNjVlNWViOGEgZ2lmMndlYnA6IFN1cHBvcnQgR0lGX0RJU1BPU0VfUkVTVE9SRV9QUkVWSU9VUworZTRjODI5ZWYgZ2lmMndlYnA6IEhhbmRsZSBmcmFtZXMgd2l0aCBvZGQgb2Zmc2V0cyArIGRpc3Bvc2FsIHRvIGJhY2tncm91bmQuCitjMmI1YTAzOSBNb2RpZnkgQ29zdE1vZGVsIHRvIGFsbG9jYXRlIG9wdGltYWwgbWVtb3J5LgorYjdhMzNkN2UgaW1wbGVtZW50IFZFNC9IRTQvUkQ0Ly4uLiBpbiBTU0UyCis5N2M3NmYxZiBtYWtlIFZQOFByZWRMdW1hNFtdIG5vbi1jb25zdCBhbmQgaW5pdGlhbGl6ZSBhcnJheSBpbiBWUDhEc3BJbml0KCkKKzBlYThjNmMyIE1lcmdlICJQcmludFJlZzogb3V0cHV0IHRvIHN0ZGVyciIKK2Q3ZmYyZjk3IE1lcmdlICJzdG9wd2F0Y2guaDogZml4IGluY2x1ZGVzIgorZjg1ZWM3MTIgUHJpbnRSZWc6IG91dHB1dCB0byBzdGRlcnIKKzU0ZWRiZjY1IHN0b3B3YXRjaC5oOiBmaXggaW5jbHVkZXMKKzEzOTE0MmU0IE9wdGltaXplIEJhY2t3YXJkUmVmZXJlbmNlSGFzaENoYWluRm9sbG93UGF0aC4KKzVmMzZiNjhkIGVuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmM6IGZpeCBpbmRlbnQKK2UwZTk5NjBkIE1lcmdlICJzeW5jIHZlcnNpb24gbnVtYmVycyB0byAwLjQuMiByZWxlYXNlIgorNjRhYzUxNDQgc3luYyB2ZXJzaW9uIG51bWJlcnMgdG8gMC40LjIgcmVsZWFzZQorYzI0Zjg5NTQgU2ltcGxpZnkgYW5kIHNwZWVkdXAgQmFja3dhcmQgcmVmcyBjb21wdXRhdGlvbi4KK2QxYzM1OWVmIGZpeCBzaGFyZWQgb2JqZWN0IGJ1aWxkIHdpdGggLWZ2aXNpYmlsaXR5PWhpZGRlbgorYTRjM2EzMWIgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTjogZml4IGdjYyBjb21wYXQgd2FybmluZworZjM1OGVlYjggYWRkIGNvZGUgZm9yIHRlc3RpbmcgcmFuZG9tIGluY3JlbWVudGFsIGRlY29kaW5nIGluIGR3ZWJwCis4MDI0NzI5MSBtYXJrIHNvbWUgaW5pdCBmdW5jdGlvbiBhcyBiZWluZyBzYWZlIGZvciB0aHJlYWRfc2FuaXRpemVyLgorNzliNWJkYmYgYml0X3JlYWRlci5oOiBjb3NtZXRpY3M6IGZpeCBhIHR5cG8KKzZjNjczNjgxIEltcHJvdmVkIG5lYXItbG9zc2xlc3MgbW9kZS4KKzBjZTI3ZTcxIGVuY19taXBzMzI6IHdvcmthcm91bmQgZ2NjLTQuOSBidWcKK2FjYTFiOThmIGVuYy92cDhsLmM6IGZpeCBpbmRlbnQKK2NhMDA1MDI3IEV2YWx1YXRlIG5vbi1wYWxldHRlIGNvbXByZXNzaW9uIGZvciBwYWxldHRlIGltYWdlCitjOGE4N2JiNiBBc3NpZ25TZWdtZW50czogcXVpZXQgLVdhcnJheS1ib3VuZHMgd2FybmluZworMzJmNjdlMzAgTWVyZ2UgImVuY19uZW9uOiBpbml0aWFsaXplIHZlY3RvcnMgdy92ZHVwX25fdTMyIgorZmFiYzY1ZGEgMS0zJSBmYXN0ZXIgZW5jb2Rpbmcgb3B0aW1pemluZyBTU0VfTnhOIGZ1bmN0aW9ucworNzUzNGQ3MTYgZW5jX25lb246IGluaXRpYWxpemUgdmVjdG9ycyB3L3ZkdXBfbl91MzIKKzVmODEzOTEyIE1lcmdlICJGaXggcmV0dXJuIGNvZGUgb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIgorZTMyMWFiZTQgRml4IHJldHVybiBjb2RlIG9mIEVuY29kZUltYWdlSW50ZXJuYWwoKQorZjgyY2IwNmEgb3B0aW1pemUgcGFsZXR0ZSBvcmRlcmluZworZjU0NWZlZWUgZG9uJ3Qgc2V0IHRoZSBhbHBoYSB2YWx1ZSBmb3IgaGlzdG9ncmFtIGluZGV4IGltYWdlCisyZDliMGE0NCBhZGQgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKCkgdG8gZHNwCisxYmQ0YzJhZCBNZXJnZSAiQ2hhbmdlIEVudHJvcHkgYmFzZWQgSGlzdG9ncmFtIENvbWJpbmUgaGV1cmlzdGljLiIKK2UyOTViOGYxIE1lcmdlICJpb3NidWlsZDogY2xlYW51cCIKKzFiZTRlNzYwIE1lcmdlICJpb3NidWlsZDogb3V0cHV0IGF1dG9jb25mIHJlcS4gb24gZmFpbHVyZSIKK2Q1ZTQ5OGQ0IENoYW5nZSBFbnRyb3B5IGJhc2VkIEhpc3RvZ3JhbSBDb21iaW5lIGhldXJpc3RpYy4KKzQ3YTJkOGUxIGZpeCBNU1ZDIGZsb2F0LT5pbnQgY29udmVyc2lvbiB3YXJuaW5nCiswNDE5NTZmNiBpb3NidWlsZDogY2xlYW51cAorNzY3ZWI0MDIgaW9zYnVpbGQ6IG91dHB1dCBhdXRvY29uZiByZXEuIG9uIGZhaWx1cmUKKzM1YWQ0OGI4IEhpc3RvSGVhcEluaXQ6IGNvcnJlY3QgcG9zaXRpb25zIGFsbG9jYXRpb24gc2l6ZQorNDVkOTYzNWYgbG9zc2xlc3M6IGVudHJvcHkgY2x1c3RlcmluZyBmb3IgaGlnaCBxdWFsaXRpZXMuCitkYzM3ZGY4YyBmaXggdHlwZSB3YXJuaW5nIGZvciBWUzlfeDY0Cis5ZjdkOWU2ZCBpb3NidWlsZDogbWFrZSBpT1MgNiB0aGUgbWluaW11bSByZXF1aXJlbWVudAorZmRkNjUyOGIgUmVtb3ZlIHVudXNlZCBWUDhMRGVjb2RlciBtZW1iZXIgdmFyaWFibGUKK2VhM2JiYTVhIE1lcmdlICJyZXdyaXRlIERpc3RvNHg0IGluIGVuY19uZW9uLmMgd2l0aCBpbnRyaW5zaWMiCitmMDYwZGZjNCBhZGQgbG9zc2xlc3MgaW5jcmVtZW50YWwgZGVjb2Rpbmcgc3VwcG9ydAorYWI3MDc5NGQgcmV3cml0ZSBEaXN0bzR4NCBpbiBlbmNfbmVvbi5jIHdpdGggaW50cmluc2ljCitkNDQ3MTYzNyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBGaWx0ZXJMb29wMjQKKzJhZWY1NGQ0IE1lcmdlICJwcmVwYXJlIFZQOExEZWNvZGVJbWFnZSBmb3IgaW5jcmVtZW50YWwgZGVjb2RlIgorYWVkMGY1YTIgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEZpbHRlckxvb3AyNiIKKzI4NjMwNjg1IHByZXBhcmUgVlA4TERlY29kZUltYWdlIGZvciBpbmNyZW1lbnRhbCBkZWNvZGUKKzI0OGYzYWVkIHJlbW92ZSBici0+ZXJyb3JfIGZpZWxkCis0OWUxNTA0NCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBGaWx0ZXJMb29wMjYKKzM4MTI4Y2I5IGlvYnVpbGQuc2g6IG9ubHkgaW5zdGFsbCAuaCBmaWxlcyBpbiBIZWFkZXJzCitjNzkyZDQxMiBQcmVtdWx0aXBseSB3aXRoIGFscGhhIGR1cmluZyBVL1YgZG93bnNhbXBsaW5nCiswY2M4MTFkNyBnaWYyd2VicDogQmFja2dyb3VuZCBjb2xvciBjb3JyZWN0aW9uCitkNzE2N2ZmNyBBbWVuZCB0aGUgbG9zc2xlc3Mgc3BlYyBhY2NvcmRpbmcgdG8gaXNzdWUgIzIwNSwgIzIwNiBhbmQgIzIyNAorYjkwMTQxNmIgUmVjb3JkIHRoZSBsb3NzbGVzcyBzaXplIHN0YXRzLgorY2RkZDMzNDAgQWRkIGEgV2ViUEV4dHJhY3RBbHBoYSBmdW5jdGlvbiB0byBkc3AKKzA3MTZhOThlIGZpeCBpbmRlbnQgYWZ0ZXIgSTAyMDQ5NDk5MTc4MzZmNzRjMGViNGJhNWE3ZjQwNTJhNDc5NzgzM2IKK2Y5Y2VkOTVhIE9wdGltaXplIGxvc3NsZXNzIGRlY29kaW5nIGZvciB0cml2aWFsKEFSQikgY29kZXMuCis5MjRmY2ZkOSBNZXJnZSAid2VicG11eDogc2ltcGxpZnkgSW5pdGlhbGl6ZUNvbmZpZygpIgorYzBhNDYyY2Egd2VicG11eDogc2ltcGxpZnkgSW5pdGlhbGl6ZUNvbmZpZygpCis2OTg2YmI1ZSB3ZWJwbXV4OiBmaXggaW5kZW50CitmODllMTY5MCB3ZWJwbXV4OiBmaXggZXhpdCBzdGF0dXMgb24gbnVtZXJpYyB2YWx1ZSBwYXJzZSBlcnJvcgorMjE3MmNiNjIgTWVyZ2UgIndlYnBtdXg6IGZpeCBsb29wX2NvdW50IHJhbmdlIGNoZWNrIgorZTNiMzQzZWMgTWVyZ2UgImV4YW1wbGVzOiB3YXJuIG9uIGludmFsaWQgbnVtZXJpYyBwYXJhbWV0ZXJzIgorMGUyM2M0ODcgd2VicG11eDogZml4IGxvb3BfY291bnQgcmFuZ2UgY2hlY2sKKzYyMDgzMzhhIE1lcmdlICJmaXggbG9vcCBidWcgaW4gRGlzcGF0Y2hBbHBoYSgpIgorZDUxZjNlNDAgZ2lmMndlYnA6IEhhbmRsZSBmcmFtZXMgd2l0aCBtaXNzaW5nICBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9uCis2OTBiNDkxYSBmaXggbG9vcCBidWcgaW4gRGlzcGF0Y2hBbHBoYSgpCis5NmQ0M2E4NyBleGFtcGxlczogd2FybiBvbiBpbnZhbGlkIG51bWVyaWMgcGFyYW1ldGVycworMzEwMWY1MzcgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgVHJhbnNmb3JtT25lCithNmJiOWIxNyBTU0UyIGZvciBpbnZlcnNlIE11bHQoQVJHQilSb3cgYW5kIEFwcGx5QWxwaGFNdWx0aXBseQorZDg0YThmZmQgUmVtb3ZlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgZGVjb2RlciBzdGF0dXMuCitiZTcwYjg2YyBjb25maWd1cmU6IHNpbXBsaWZ5IGxpYnBuZy1jb25maWcgaW52b2NhdGlvbgorZTBhOTkzMjEgUmVjdGlmeSBidWcgaW4gbG9zc2xlc3MgaW5jcmVtZW50YWwgZGVjb2RpbmcuCitlMjUwMmE5NyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBUcmFuc2Zvcm1BQzMKKzI0ZTEwNzJhIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIFRyYW5zZm9ybURDCitjMGU4NGRmOCBNZXJnZSAiU2xpZ2h0bHkgZmFzdGVyIGxvc3NsZXNzIGRlY29kaW5nICgxJSkiCis4ZGQyOGJiNSBTbGlnaHRseSBmYXN0ZXIgbG9zc2xlc3MgZGVjb2RpbmcgKDElKQorZjAxMDM1OTUgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1zCitkMzI0MmFlZSBtYWtlIFZQOExTZXRCaXRQb3MoKSBzZXQgYnItPmVvc18gZmxhZworYTlkZWNiNTUgTG9zc2xlc3MgZGVjb2Rpbmc6IGZpeCBlb3NfIGZsYWcgY29uZGl0aW9uCiszZmVhNmEyOCBmaXggZXJyb25lb3VzIGRlYy0+c3RhdHVzXyBzZXR0aW5nCis4MGI4MDk5ZiBNSVBTOiBkc3ByMjogYWRkIHNvbWUgc3BlY2lmaWMgbWlwcyBjb2RlIHRvIGNvbW1pdCBJMmMzZjJiMTJmOGRmMTViNzg1ZmFkNWE5YzU2MzE2ZTk1NGFlMGM1MworZTU2NDA2MjUgTWVyZ2UgImZ1cnRoZXIgcmVmaW5lIHRoZSBDT1BZX1BBVFRFUk4gb3B0aW0gZm9yIERlY29kZUFscGhhIgorODU0NTA5ZmUgZW5jL2hpc3RvZ3JhbS5jOiByZWluZGVudCBhZnRlciBmNDA1OWQwCiszNDQyMTk2NCBNZXJnZSAifjMtNSUgZmFzdGVyIGVuY29kaW5nIG9wdGltaXppbmcgUGlja0Jlc3RJbnRyYSooKSIKKzg2NTA2OWMxIGZ1cnRoZXIgcmVmaW5lIHRoZSBDT1BZX1BBVFRFUk4gb3B0aW0gZm9yIERlY29kZUFscGhhCithNTk1NjIyOCBhZGRlZCBDLWxldmVsIG9wdGltaXphdGlvbiBmb3IgRGVjb2RlQWxwaGFEYXRhIGZ1bmN0aW9uCisxODdkMzc5ZCBhZGQgYSBmYWxsYmFjayB0byBBTFBIQV9OT19DT01QUkVTU0lPTgorYTQ4YTJkNzYgfjMtNSUgZmFzdGVyIGVuY29kaW5nIG9wdGltaXppbmcgUGlja0Jlc3RJbnRyYSooKQorYTYxNDAxOTQgRXhVdGlsUmVhZEZyb21TdGRpbjogKHdpbmRvd3MpIG9wZW4gc3RkaW4gaW4gYmluIG1vZGUKK2U4MGVhYjFmIHdlYnBtdXg6ICh3aW5kb3dzKSBvcGVuIHN0ZG91dCBpbiBiaW5hcnkgbW9kZQorZTliZmIxMTYgY3dlYnA6ICh3aW5kb3dzKSBvcGVuIHN0ZG91dCBpbiBiaW5hcnkgbW9kZQorNTkyN2UxNWIgZXhhbXBsZV91dGlsOiBhZGQgRXhVdGlsU2V0QmluYXJ5TW9kZQorMzBmM2I3NWIgd2VicG11eCBtYW4gcGFnZTogQ2xhcmlmeSBzb21lIHRpdGxlLCBkZXNjcmlwdGlvbnMgYW5kIGV4YW1wbGVzCis3N2Q0YzdlMyBhZGRyZXNzIGNvc21ldGljIGNvbW1lbnRzIGZyb20gcGF0Y2ggIzcxMzgwCitmNzVkZmJmMiBTcGVlZCB1cCBIdWZmbWFuIGRlY29kaW5nIGZvciBsb3NzbGVzcworNjM3YjM4ODggZHNwL2xvc3NsZXNzOiB3b3JrYXJvdW5kIGdjYy00LjkgYnVnIG9uIGFybQorODMyM2E5MDMgZHNwLmg6IGNvbGxlY3QgZ2NjL2NsYW5nIHZlcnNpb24gdGVzdCBtYWNyb3MKK2U2YzRiNTJmIG1vdmUgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW10gdG8gdGhlIEluaXQgZnVuY3Rpb24uCis0OTkxMWQ0ZCBNZXJnZSAiZml4IGluZGVudGF0aW9uIgorZjQwNTlkMGMgQ29kZSBjbGVhbnVwIGZvciBIaXN0b2dyYW1SZW1hcC4KK2U2MzJiMDkyIGZpeCBpbmRlbnRhdGlvbgorZjVjMDRkNjQgTWVyZ2UgImFkZCBhIERpc3BhdGNoQWxwaGEoKSBmb3IgU1NFMiB0aGF0IGhhbmRsZXMgOCBwaXhlbHMgYXQgYSB0aW1lIgorZmM5OGVkZDkgYWRkIGEgRGlzcGF0Y2hBbHBoYSgpIGZvciBTU0UyIHRoYXQgaGFuZGxlcyA4IHBpeGVscyBhdCBhIHRpbWUKKzczZDM2MWRkIGludHJvZHVjZSBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgdG8gcXVhbnRpemUgdHdvIGJsb2NrcyBhdCBhIHRpbWUKKzBiMjFjMzBiIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIEVtaXRBbHBoYVJHQgorOTUzYWNkNTYgZW5jX25lb246IGVuYWJsZSBRdWFudGl6ZUJsb2NrIGZvciBhYXJjaDY0CitmNGFlMTQzNyBNSVBTOiBtaXBzMzI6IGNvZGUgcmViYXNlCis1Njk3NzE1NCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9ucyBmb3IgVlA4WXV2VG8qCisyNTIzYWE3MyBTbWFydFJHQllVVjogZml4IG9kZC13aWR0aCBwcm9ibGVtIHdpdGggcGl4ZWwgcmVwbGljYXRpb24KK2VlNTJkYzRlIGZpeCBzb21lIE1TVkM2NCB3YXJuaW5nIGFib3V0IGZsb2F0IGNvbnZlcnNpb24KKzNmY2E4NTFhIGNwdTogY2hlY2sgZm9yIF9NU0NfVkVSIGJlZm9yZSB1c2luZyBtc3ZjIGlubGluZSBhc20KK2UyYTgzZDcxIGZhc3RlciBSR0ItPllVViBjb252ZXJzaW9uIGZ1bmN0aW9uICh+NyUgc3BlZWR1cCkKK2RlMmQwM2UxIE1lcmdlICJBZGQgc21hcnQgUkdCLT5ZVVYgY29udmVyc2lvbiBvcHRpb24gLXByZSA0IgorM2ZjNGM1MzkgQWRkIHNtYXJ0IFJHQi0+WVVWIGNvbnZlcnNpb24gb3B0aW9uIC1wcmUgNAorYjRkYzQwNjkgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgKHVuKWZpbHRlcnMKKzEzN2U2MDkwIE1lcmdlICJjb25maWd1cmU6IGFkZCB3b3JrIGFyb3VuZCBmb3IgZ2NjLTQuOSBhYXJjaDY0IGJ1ZyIKK2I2MWM5Y2VjIE1JUFM6IGRzcHIyOiBPcHRpbWl6YXRpb24gb2Ygc29tZSBzaW1wbGUgcG9pbnQtc2FtcGxpbmcgZnVuY3Rpb25zCitlMmI4Y2VjMCBjb25maWd1cmU6IGFkZCB3b3JrIGFyb3VuZCBmb3IgZ2NjLTQuOSBhYXJjaDY0IGJ1ZworOThjNTQxMDcgTUlQUzogbWlwczMycjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgQlN3YXAzMgorZGFiNzAyYjMgVXBkYXRlIFBBVEVOVFMgdG8gcmVmbGVjdCBzL1ZQOC9XZWJNL2cKK2I1NjRmN2M3IE1lcmdlICJNSVBTOiBkZXRlY3QgbWlwczMycjYgYW5kIGRpc2FibGUgbWlwczMycjEgY29kZSIKK2I3ZTVhNWM0IE1JUFM6IGRldGVjdCBtaXBzMzJyNiBhbmQgZGlzYWJsZSBtaXBzMzJyMSBjb2RlCis2M2MyZmMwMiBDb3JyZWN0bHkgdXNlIHRoZSBBQ19DQU5PTklDQUxfKiBtYWNyb3MKK2JiMDcwMjJiIE1lcmdlICJjb3NtZXRpY3MiCitlMzAwYzlkOCBjb3NtZXRpY3MKKzBlNTE5ZWVhIE1lcmdlICJjb3NtZXRpY3M6IHJlbW92ZSBzb21lIGV4dHJhbmVvdXMgJ2V4dGVybidzIgorM2VmMGYwOGEgTWVyZ2UgInZwOGVuY2kuaDogY29zbWV0aWNzOiBmaXggJyonIHBsYWNlbWVudCIKKzRjNmRkZTM3IGJpdF93cml0ZXI6IGNvc21ldGljczogcmVuYW1lIGtGbHVzaCgpIC0+IEZsdXNoKCkKK2Y3YjRjNDhiIGNvc21ldGljczogcmVtb3ZlIHNvbWUgZXh0cmFuZW91cyAnZXh0ZXJuJ3MKK2I0N2ZiMDBhIHZwOGVuY2kuaDogY29zbWV0aWNzOiBmaXggJyonIHBsYWNlbWVudAorYjVhMzZjYzkgYWRkIC1uZWFyX2xvc3NsZXNzIFswLi4xMDBdIGV4cGVyaW1lbnRhbCBvcHRpb24KKzA1MjRkOWU1IGRzcDogZGV0ZWN0IG1pcHM2NCAmIGRpc2FibGUgbWlwczMyIGNvZGUKK2QzNDg1ZDk2IGN3ZWJwLjE6IGZpeCBxdWFsaXR5IGRlc2NyaXB0aW9uIHBsYWNlbWVudAorMjlhOWZlMjIgTWVyZ2UgdGFnICd2MC40LjEnCis4YWYyNzcxOCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjQuMSwgb3JpZ2luLzAuNC4xLCAwLjQuMSkKK2UwOWU5ZmY2IFJlY29yZCAmIGxvZyB0aGUgaW1hZ2UgcHJlLXByb2Nlc3NpbmcgdGltZS4KK2Y1OWMwYjRiIGlvc2J1aWxkLnNoOiBzcGVjaWZ5IG9wdGltaXphdGlvbiBmbGFncworOGQzNGVhM2UgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC40LjEtcmMxKQorZGJjM2RhNjYgbWFrZWZpbGUudW5peDogYWRkIHZ3ZWJwLjEgdG8gdGhlIGRpc3QgdGFyZ2V0Cis4OWE3YzgzYyB1cGRhdGUgQ2hhbmdlTG9nCitmZmU2N2VlOSBNZXJnZSAidXBkYXRlIE5FV1MgZm9yIHRoZSBuZXh0IHJlbGVhc2UiIGludG8gMC40LjEKKzJkZWYxZmU2IGdpZjJ3ZWJwOiBkdXN0IHVwIHRoZSBoZWxwIG1lc3NhZ2UKK2ZiNjY4ZDc4IHJlbW92ZSAtbm9hbHBoYWRpdGhlciBvcHRpb24gZnJvbSBSRUFETUUvdndlYnAuMQorZTQ5ZjY5M2IgdXBkYXRlIE5FV1MgZm9yIHRoZSBuZXh0IHJlbGVhc2UKK2NkMDEzNTgwIE1lcmdlICJ1cGRhdGUgQVVUSE9SUyIgaW50byAwLjQuMQorMjY4ZDAxZWIgdXBkYXRlIEFVVEhPUlMKKzg1MjEzYjliIGJ1bXAgdmVyc2lvbiB0byAwLjQuMQorNjk1ZjgwYWUgTWVyZ2UgInJlc3RvcmUgbXV4IEFQSSBjb21wYXRpYmlsaXR5IiBpbnRvIDAuNC4xCis4NjJkMjk2YyByZXN0b3JlIG11eCBBUEkgY29tcGF0aWJpbGl0eQorOGY2ZjhjNWQgcmVtb3ZlIHRoZSAhV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04gdHdlYWsgaW4gUHV0OHg4dXYKK2Q3MTNhNjk2IE1lcmdlIGNoYW5nZXMgSWY0ZGViYzE1LEk0MzdhNWQ1ZiBpbnRvIDAuNC4xCitjMmZjNTJlNCByZXN0b3JlIGVuY29kZSBBUEkgY29tcGF0aWJpbGl0eQorNzkzMzY4ZTggcmVzdG9yZSBkZWNvZGUgQVBJIGNvbXBhdGliaWxpdHkKK2I4OTg0ZjMxIGdpZjJ3ZWJwOiBmaXggY29tcGlsZSB3aXRoIGdpZmxpYiA1LjEuMAorMjIyZjliMWEgZ2lmMndlYnA6IHNpbXBsaWZ5IGdpZmxpYiB2ZXJzaW9uIGNoZWNraW5nCitkMmNjNjFiNyBFeHRlbmQgTWFrZUFSR0IzMigpIHRvIGFjY2VwdCBBbHBoYSBjaGFubmVsLgorNDU5NWI2MmIgTWVyZ2UgInVzZSBleHBsaWNpdCBzaXplIG9mIGtFcnJvck1lc3NhZ2VzW10gYXJyYXlzIgorMTU3ZGUwMTUgTWVyZ2UgIkFjdHVhdGUgbWVtb3J5IHN0YXRzIGZvciBQUklOVF9NRU1PUllfSU5GTyIKK2ZiZGEyZjQ5IEpQRUcgZGVjb2RlcjogZGVsYXkgY29udmVyc2lvbiB0byBZVVYgdG8gV2ViUEVuY29kZSgpIGNhbGwKKzBiNzQ3YjFiIHVzZSBleHBsaWNpdCBzaXplIG9mIGtFcnJvck1lc3NhZ2VzW10gYXJyYXlzCiszMzk4ZDgxYSBBY3R1YXRlIG1lbW9yeSBzdGF0cyBmb3IgUFJJTlRfTUVNT1JZX0lORk8KKzZmMzIwMmJlIE1lcmdlICJtb3ZlIFdlYlBQaWN0dXJlSW5pdCB0byBwaWN0dXJlLmMiCis2YzM0N2JiYiBtb3ZlIFdlYlBQaWN0dXJlSW5pdCB0byBwaWN0dXJlLmMKK2ZiM2FjZjE5IGZpeCBjb25maWd1cmUgbWVzc2FnZSBmb3IgbXVsdGktdGhyZWFkCis0MGIwODZmNyBjb25maWd1cmU6IGNoZWNrIGZvciBfYmVnaW50aHJlYWRleAorMTU0OWQ2MjAgcmVvcmRlciB0aGUgWVVWQS0+QVJHQiBhbmQgQVJHQi0+WVVWQSBmdW5jdGlvbnMgY29ycmVjdGx5CitjNjQ2MWJmZCBNZXJnZSAiZXh0cmFjdCBjb2xvcnNwYWNlIGNvZGUgZnJvbSBwaWN0dXJlLmMgaW50byBwaWN0dXJlX2NzcC5jIgorNzM2ZjJhMTcgZXh0cmFjdCBjb2xvcnNwYWNlIGNvZGUgZnJvbSBwaWN0dXJlLmMgaW50byBwaWN0dXJlX2NzcC5jCis2NDVkYWEwMyBNZXJnZSAiY29uZmlndXJlOiBjaGVjayBmb3IgLVdmb3JtYXQtc2VjdXJpdHkiCithYmFmZWQ4NiBjb25maWd1cmU6IGNoZWNrIGZvciAtV2Zvcm1hdC1zZWN1cml0eQorZmJhZGI0ODAgc3BsaXQgbW9ub2xpdGhpYyBwaWN0dXJlLmMgaW50byBwaWN0dXJlX3t0b29scyxwc25yLHJlc2NhbGV9LmMKK2M3NmYwN2VjIGRlY19uZW9uL1RyYW5zZm9ybUFDMzogaW5pdGlhbGl6ZSB2ZWN0b3Igdy92Y3JlYXRlCitiYjRmYzA1MSBnaWYyd2VicDogQWxsb3cgc2luZ2xlLWZyYW1lIGFuaW1hdGlvbnMKKzQ2ZmQ0NGMxIHRocmVhZDogcmVtb3ZlIGhhcm1sZXNzIHJhY2Ugb24gc3RhdHVzXyBpbiBFbmQoKQorNWExYTcyNjQgTWVyZ2UgImNvbmZpZ3VyZTogY2hlY2sgZm9yIF9fYnVpbHRpbl9ic3dhcFhYKCkiCis2NzgxNDIzYiBjb25maWd1cmU6IGNoZWNrIGZvciBfX2J1aWx0aW5fYnN3YXBYWCgpCis2NDUwYzQ4ZCBjb25maWd1cmU6IGZpeCBpT1MgYnVpbGRzCis2NDIyZTY4MyBWUDhMRmlsbEJpdFdpbmRvdzogZW5hYmxlIGZhc3QgcGF0aCBmb3IgMzItYml0IGJ1aWxkcworNGY3ZjUyYjIgVlA4TEZpbGxCaXRXaW5kb3c6IHJlc3BlY3QgV0VCUF9GT1JDRV9BTElHTkVECitlNDU4YmFkYyBlbmRpYW5faW5sLmg6IGltcGxlbWVudCBodG9sZVhYIHdpdGggQlN3YXBYWAorZjI2NjRkMWEgZW5kaWFuX2lubC5oOiBhZGQgQlN3YXAxNgorNmZiZjUzNDUgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLWFsaWduZWQiCitkYzBmNDc5ZCBjb25maWd1cmU6IGFkZCAtLWVuYWJsZS1hbGlnbmVkCis5Y2M2OWUyYiBNZXJnZSAiY29uZmlndXJlOiBzdXBwb3J0IFdJQyArIE9wZW5HTCB1bmRlciBtaW5ndzY0IgorMjU3YWRmYjAgcmVtb3ZlIGV4cGVyaW1lbnRhbCBZVVY0NDQgWVVWNDIyIGFuZCBZVVY0MDAgY29kZQorMTBmNDI1N2MgY29uZmlndXJlOiBzdXBwb3J0IFdJQyArIE9wZW5HTCB1bmRlciBtaW5ndzY0CiszODBjY2E0ZiBjb25maWd1cmUuYWM6IGFkZCBBQ19DX0JJR0VORElBTgorZWU3MGE5MDEgZW5kaWFuX2lubC5oOiBhZGQgQlN3YXA2NAorNDc3NzlkNDYgZW5kaWFuX2lubC5oOiBhZGQgQlN3YXAzMgorZDUxMDRiMWYgdXRpbHM6IGFkZCBlbmRpYW5faW5sLmgKKzU4YWI2MjI0IE1lcmdlICJtYWtlIGFscGhhLWRldGVjdGlvbiBsb29wIGluIElzS2V5RnJhbWUoKSBpbiBnb29kIHgveSBvcmRlciIKKzlkNTYyOTAyIG1ha2UgYWxwaGEtZGV0ZWN0aW9uIGxvb3AgaW4gSXNLZXlGcmFtZSgpIGluIGdvb2QgeC95IG9yZGVyCis1MTY5NzFiMSBsb3NzbGVzczogUmVtb3ZlIHVuYWxpZ25lZCByZWFkIHdhcm5pbmcKK2I4YjU5NmY2IE1lcmdlICJjb25maWd1cmUuYWM6IGFkZCBhbiBhdXRvY29uZiB2ZXJzaW9uIHByZXJlcXVpc2l0ZSIKKzM0YjAyZjhjIGNvbmZpZ3VyZS5hYzogYWRkIGFuIGF1dG9jb25mIHZlcnNpb24gcHJlcmVxdWlzaXRlCitlNTlmNTM2MCBuZW9uOiBub3JtYWxpemUgdmR1cF9uXyogdXNhZ2UKKzZlZTcxNjBkIE1lcmdlIGNoYW5nZXMgSTBkYTdiM2QzLElkYWQyZjI3OCxJNGFjY2MzMDUKK2FiYzAyZjI0IE1lcmdlICJmaXggKHVuY29tcGlsZWQpIHR5cG8iCitiYzAzNjcwZiBuZW9uOiBhZGQgSU5JVF9WRUNUT1I0Cis2YzFjNjMyYiBuZW9uOiBhZGQgSU5JVF9WRUNUT1IzCitkYzc2ODdlNSBuZW9uOiBhZGQgSU5JVF9WRUNUT1IyCis0NTM2ZTdjNCBhZGQgV2ViUE11eFNldENhbnZhc1NpemUoKSB0byB0aGUgbXV4IEFQSQorODI0ZWFiMTAgZml4ICh1bmNvbXBpbGVkKSB0eXBvCisxZjNlNWYxZSByZW1vdmUgdW51c2VkICdzaGlmdCcgYXJndW1lbnQgYW5kIFFGSVgyIGRlZmluZQorOGU4NjcwNTEgTWVyZ2UgIlZQOExvYWROZXdCeXRlczogdXNlIF9fYnVpbHRpbl9ic3dhcDMyIGlmIGF2YWlsYWJsZSIKKzFiNmEyNjM1IE1lcmdlICJGaXggaGFuZGxpbmcgb2Ygd2VpcmQgR0lGIHdpdGggY2FudmFzIGRpbWVuc2lvbiAweDAiCisxZGEzZDQ2MSBWUDhMb2FkTmV3Qnl0ZXM6IHVzZSBfX2J1aWx0aW5fYnN3YXAzMiBpZiBhdmFpbGFibGUKKzE1ODJlNDAyIEZpeCBoYW5kbGluZyBvZiB3ZWlyZCBHSUYgd2l0aCBjYW52YXMgZGltZW5zaW9uIDB4MAorYjg4MTFkYWMgTWVyZ2UgInJlbmFtZSBpbnRlcmZhY2UgLT4gd2ludGVyZmFjZSIKK2RiOGI4YjVmIEZpeCBsb2dpYyBpbiB0aGUgR0lGIExPT1AtZGV0ZWN0aW9uIHBhcnNpbmcKKzI1YWFkZGM4IHJlbmFtZSBpbnRlcmZhY2UgLT4gd2ludGVyZmFjZQorNTU4NGQ5ZDIgbWFrZSBXZWJQU2V0V29ya2VySW50ZXJmYWNlKCkgY2hlY2sgaXRzIGFyZ3VtZW50cworYTllZjdlZjkgTWVyZ2UgImNvc21ldGljczogdXBkYXRlIHRocmVhZC5oIGNvbW1lbnRzIgorYzZhZjk5OTEgTWVyZ2UgImR1c3QgdXAgdGhlIGhlbHAgbWVzc2FnZSIKKzBhOGI4ODYzIGR1c3QgdXAgdGhlIGhlbHAgbWVzc2FnZQorYTljZjMxOTEgY29zbWV0aWNzOiB1cGRhdGUgdGhyZWFkLmggY29tbWVudHMKKzI3YmZlZWU0IFF1YW50aXplQmxvY2sgU1NFMiBPcHRpbWl6YXRpb246CisyYmMwZGMzZSBNZXJnZSAid2VicG11eDogd2FybiB3aGVuIG9kZCBmcmFtZSBvZmZzZXRzIGFyZSB1c2VkIgorMzExNGViZTQgTWVyZ2UgY2hhbmdlcyBJZDhlZGQzYzEsSWQ0MThlYjk2LElkZTA1ZTNiZQorYzA3MjY2MzQgd2VicG11eDogd2FybiB3aGVuIG9kZCBmcmFtZSBvZmZzZXRzIGFyZSB1c2VkCitjNWM2YjQwOCBNZXJnZSAiYWRkIGFscGhhIGRpdGhlcmluZyBmb3IgbG9zc3kiCitkNTE0Njc4NCBleGFtcGxlcy9BbmRyb2lkLm1rOiBhZGQgY3dlYnAKK2NhMGZhN2M3IEFuZHJvaWQubWs6IG1vdmUgZHdlYnAgdG8gZXhhbXBsZXMvQW5kcm9pZC5taworNzNkOGZjYTAgQW5kcm9pZC5tazogYWRkIEVOQUJMRV9TSEFSRUQgZmxhZworNmU5MzMxN2YgbXV4cmVhZDogZml4IG91dCBvZiBib3VuZHMgcmVhZAorOGIwZjZhNDggTWFrZWZpbGUudmM6IGZpeCBDRkxBR1MgYXNzaWdubWVudCB3L0hBVkVfQVZYMj0xCitiYmUzMmRmMSBhZGQgYWxwaGEgZGl0aGVyaW5nIGZvciBsb3NzeQorNzkwMjA3NjcgTWVyZ2UgIm1ha2UgZXJyb3ItY29kZSByZXBvcnRpbmcgY29uc2lzdGVudCB1cG9uIG1hbGxvYyBmYWlsdXJlIgorNzdiZjQ0MTAgbWFrZSBlcnJvci1jb2RlIHJlcG9ydGluZyBjb25zaXN0ZW50IHVwb24gbWFsbG9jIGZhaWx1cmUKKzdhOTNjMDAwICoqL01ha2VmaWxlLmFtOiByZW1vdmUgdW51c2VkIEFNX0NQUEZMQUdTCisyNGUzMDgwNSBBZGQgYW4gaW50ZXJmYWNlIGFic3RyYWN0aW9uIHRvIHRoZSBXZWJQIHdvcmtlciB0aHJlYWQgaW1wbGVtZW50YXRpb24KK2Q2Y2Q2MzU4IE1lcmdlICJmaXggb3JpZ19yZWN0PT1OVUxMIGNhc2UiCisyYmZkMWZmYSBmaXggb3JpZ19yZWN0PT1OVUxMIGNhc2UKKzA1OWUyMWMxIE1lcmdlICJjb25maWd1cmU6IG1vdmUgY29uZmlnLmggdG8gc3JjL3dlYnAvY29uZmlnLmgiCitmMDVmZTAwNiBwcm9wZXJseSByZXBvcnQgYmFjayBlbmNvZGluZyBlcnJvciBjb2RlIGluIFdlYlBGcmFtZUNhY2hlQWRkRnJhbWUoKQorMzJiMzEzNzkgY29uZmlndXJlOiBtb3ZlIGNvbmZpZy5oIHRvIHNyYy93ZWJwL2NvbmZpZy5oCis5MDA5MGQ5OSBNZXJnZSBjaGFuZ2VzIEk3YzY3NWU1MSxJODRmN2Q3ODUKK2FlNzY2MWIzIG1ha2VmaWxlczogZGVmaW5lIFdFQlBfSEFWRV9BVlgyIHdoZW4gYXBwcm9wcmlhdGUKKzY5ZmNlMmVhIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNpbmcgZm9yIHJlcy0+Zmlyc3QgaW4gVlA4U2V0UmVzaWR1YWxDb2VmZnMKKzZlNjFhM2E5IGNvbmZpZ3VyZTogdGVzdCBmb3IgLW1zc2UyCitiOWQyZWZjNiByZW5hbWUgdXBzYW1wbGluZ19taXBzMzIuYyB0byB5dXZfbWlwczMyLmMKK2JkZmVlYmFhIGRzcC95dXY6IG1vdmUgc3NlMiBmdW5jdGlvbnMgdG8geXV2X3NzZTIuYworNDZiMzJlODYgTWVyZ2UgImNvbmZpZ3VyZTogc2V0IFdFQlBfSEFWRV9BVlgyIHdoZW4gYXZhaWxhYmxlIgorODgzMDVkYjQgTWVyZ2UgIlZQOFJhbmRvbUJpdHMyOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3ciCis3M2ZlZTg4YyBWUDhSYW5kb21CaXRzMjogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93CitkYjQ4NjBiMyBlbmNfc3NlMjogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93CiszZmRhZjRkMiBNZXJnZSAicmVhbCBmaXggZm9yIGxvbmdqbXAgd2FybmluZyIKKzM4NWUzMzQwIHJlYWwgZml4IGZvciBsb25nam1wIHdhcm5pbmcKKzIzMGEwNTU1IGNvbmZpZ3VyZTogc2V0IFdFQlBfSEFWRV9BVlgyIHdoZW4gYXZhaWxhYmxlCithMmFjOGE0MiByZXN0b3JlIG9yaWdpbmFsIHZhbHVlXy9yYW5nZV8gZmllbGQgb3JkZXIKKzVlMmVlNTZmIE1lcmdlICJyZW1vdmUgbGlid2VicGRzcGRlY29kZSBkZXAgb24gbGlid2VicGRzcF9hdngyIgorNjEzNjJkYjUgcmVtb3ZlIGxpYndlYnBkc3BkZWNvZGUgZGVwIG9uIGxpYndlYnBkc3BfYXZ4MgorNDJjNDQ3YWUgTWVyZ2UgImxvc3N5IGJpdC1yZWFkZXIgY2xlYW4tdXA6IgorNDc5ZmZkOGIgTWVyZ2UgInJlbW92ZSB1bnVzZWQgI2luY2x1ZGUncyIKKzk3NTRkMzlhIE1lcmdlICJzdHJvbmcgZmlsdGVyaW5nIHNwZWVkLXVwICh+Mi0zJSB4ODYsIH4xLTIlIGZvciBORU9OKSIKKzE1OGFmZjliIHJlbW92ZSB1bnVzZWQgI2luY2x1ZGUncworMDk1NDVlZWEgbG9zc3kgYml0LXJlYWRlciBjbGVhbi11cDoKK2VhOGIwYTE3IHN0cm9uZyBmaWx0ZXJpbmcgc3BlZWQtdXAgKH4yLTMlIHg4NiwgfjEtMiUgZm9yIE5FT04pCis2Njc5Zjg5OSBPcHRpbWl6ZSBWUDhTZXRSZXNpZHVhbENvZWZmcy4KK2FjNTkxY2YyIGZpeCBmb3IgZ2NjLTQuOSB3YXJuaW5ncyBhYm91dCBsb25nam1wICsgbG9jYWwgdmFyaWFibGVzCis0ZGZhODZiMiBkc3AvY3B1OiBOYUNsIGhhcyBubyBzdXBwb3J0IGZvciB4Z2V0YnYKKzRjMzk4Njk5IE1lcmdlICJjd2VicDogZmFsbGJhY2sgdG8gbmF0aXZlIHdlYnAgZGVjb2RlIGluIFdJQyBidWlsZHMiCiszM2FhNDk3ZSBNZXJnZSAiY3dlYnA6IGFkZCBzb21lIG1pc3NpbmcgbmV3bGluZXMgaW4gbG9uZ2hlbHAgb3V0cHV0IgorYzliMzQwYTIgZml4IG1pc3NpbmcgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcgY2FsbCBmb3IgcHJlbXVsdGlwbGllZCBjb2xvcnNwYWNlIG91dHB1dAorNTc4OTdiYWUgTWVyZ2UgImxvc3NsZXNzX25lb246IHVzZSB2Y3JlYXRlXyooKSB3aGVyZSBhcHByb3ByaWF0ZSIKKzZhYTQ3NzdiIE1lcmdlICIoZW5jfGRlYylfbmVvbjogdXNlIHZjcmVhdGVfKigpIHdoZXJlIGFwcHJvcHJpYXRlIgorMGQzNDZlNDEgQWx3YXlzIHJlaW5pdCBWUDhUcmFuc2Zvcm1XSFQgaW5zdGVhZCBvZiBoYXJkLWNvZGluZworN2QwMzlmYzMgY3dlYnA6IGZhbGxiYWNrIHRvIG5hdGl2ZSB3ZWJwIGRlY29kZSBpbiBXSUMgYnVpbGRzCitkNDcxZjQyNCBjd2VicDogYWRkIHNvbWUgbWlzc2luZyBuZXdsaW5lcyBpbiBsb25naGVscCBvdXRwdXQKK2JmMGUwMDMwIGxvc3NsZXNzX25lb246IHVzZSB2Y3JlYXRlXyooKSB3aGVyZSBhcHByb3ByaWF0ZQorOTI1MWMyZjYgKGVuY3xkZWMpX25lb246IHVzZSB2Y3JlYXRlXyooKSB3aGVyZSBhcHByb3ByaWF0ZQorMzk5YjkxNmQgbG9zc3kgZGVjb2Rpbmc6IGNvcnJlY3QgYWxwaGEtcmVzY2FsaW5nIGZvciBZVVZBIGZvcm1hdAorNzhjMTJlZDggTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgcnVkaW1lbnRhcnkgYXZ4MiBzdXBwb3J0IgorZGM1YjEyMmYgdHJ5IHRvIHJlbW92ZSB0aGUgc3B1cmlvdXMgd2FybmluZyBmb3Igc3RhdGljIGFuYWx5c2lzCitkZGZlZmQ2MiBNYWtlZmlsZS52YzogYWRkIHJ1ZGltZW50YXJ5IGF2eDIgc3VwcG9ydAorYTg5MTE2NDMgTWVyZ2UgInNpbXBsaWZ5IFZQOExJbml0Qml0UmVhZGVyKCkiCitmZGJjZDQ0ZCBzaW1wbGlmeSBWUDhMSW5pdEJpdFJlYWRlcigpCis3YzAwNDI4NyBtYWtlZmlsZS51bml4OiBhZGQgcnVkaW1lbnRhcnkgYXZ4MiBzdXBwb3J0Cis1MTVlMzVjZiBNZXJnZSAiYWRkIHN0dWIgZHNwL2VuY19hdngyLmMiCithMDVkYzE0MCBTU0UyOiB5dXYtPnJnYiBzcGVlZC11cCBmb3IgcG9pbnQtc2FtcGxpbmcKKzE3OGU5YTY5IGFkZCBzdHViIGRzcC9lbmNfYXZ4Mi5jCisxYjk5YzA5YyBNZXJnZSAiY29uZmlndXJlOiBhZGQgYSB0ZXN0IGZvciAtbWF2eDIiCitmZTcyODA3MSBjb25maWd1cmU6IGFkZCBhIHRlc3QgZm9yIC1tYXZ4MgorZTQ2YTI0N2MgY3B1OiBmaXggY2hlY2sgZm9yIF9fY3B1aWRleCBhdmFpbGFiaWxpdHkKKzE3NmZkYTI2IGZpeCB0aGUgYml0LXdyaXRlciBmb3IgbG9zc2xlc3MgaW4gMzJiaXQgbW9kZQorNTQxNzg0YzcgZHNwLmg6IGFkZCBhIGNoZWNrIGZvciBBVlgyIC8gZGVmaW5lIFdFQlBfVVNFX0FWWDIKK2JkYjE1MWVlIGRzcC9jcHU6IGFkZCBBVlgyIGRldGVjdGlvbgorYWI5ZjJmODYgTWVyZ2UgInJldmFtcCB0aGUgcG9pbnQtc2FtcGxpbmcgZnVuY3Rpb25zIGJ5IHByb2Nlc3NpbmcgYSBmdWxsIHBsYW5lIgorYTJmOGIyODkgcmV2YW1wIHRoZSBwb2ludC1zYW1wbGluZyBmdW5jdGlvbnMgYnkgcHJvY2Vzc2luZyBhIGZ1bGwgcGxhbmUKK2VmMDc2MDI2IHVzZSBkZWNvZGVyJ3MgRFNQIGZ1bmN0aW9ucyBmb3IgYXV0b2ZpbHRlcgorMmI1Y2IzMjYgTWVyZ2UgImRzcC9jcHU6IGFkZCBBVlggZGV0ZWN0aW9uIgorZGYwOGU2N2UgZHNwL2NwdTogYWRkIEFWWCBkZXRlY3Rpb24KK2UyZjQwNWM5IE1lcmdlICJjbGVhbi11cCBhbmQgc2xpZ2h0IHNwZWVkLXVwIGluLWxvb3AgZmlsdGVyaW5nIFNTRTIiCitmNjA5NTdiZiBjbGVhbi11cCBhbmQgc2xpZ2h0IHNwZWVkLXVwIGluLWxvb3AgZmlsdGVyaW5nIFNTRTIKKzlmYzNhZTQ2IC5naXRhdHRyaWJ1dGVzOiB0cmVhdCAucHBtIGFzIGJpbmFyeQorM2RhOTI0YjUgTWVyZ2UgImRzcC9XRUJQX1VTRV9ORU9OOiB0ZXN0IGZvciBfX2FhcmNoNjRfXyIKK2M3MTY0NDkwIEFuZHJvaWQubWs6IGFsd2F5cyBpbmNsdWRlICpfbmVvbi5jIGluIHRoZSBidWlsZAorYTU3N2IyM2EgZHNwL1dFQlBfVVNFX05FT046IHRlc3QgZm9yIF9fYWFyY2g2NF9fCis1NGJmZmZjYSBtb3ZlIFJlbWFwQml0UmVhZGVyKCkgZnJvbSBpZGVjLmMgdG8gYml0X3JlYWRlciBjb2RlCiszNDE2OGVjYiBNZXJnZSAicmVtb3ZlIGFsbCB1bnVzZWQgbGF5ZXIgY29kZSIKK2YxZTc3MTczIHJlbW92ZSBhbGwgdW51c2VkIGxheWVyIGNvZGUKK2IwNzU3ZGI3IENvZGUgY2xlYW51cCBmb3IgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzLgorNWZlNjI4ZDMgbWFrZSB0aGUgdG9rZW4gcGFnZSBzaXplIGJlIHZhcmlhYmxlIGluc3RlYWQgb2YgZml4ZWQgODE5MgorZjk0OGQwOGMgbWVtb3J5IGRlYnVnOiBhbGxvdyBzZXR0aW5nIHByZS1kZWZpbmVkIG1hbGxvYyBmYWlsdXJlIHBvaW50cworY2EzZDc0NmUgdXNlIGJsb2NrLWJhc2VkIGFsbG9jYXRpb24gZm9yIGJhY2t3YXJkIHJlZnMgc3RvcmFnZSwgYW5kIGZyZWUtbGlzdHMKKzFiYTYxYjA5IGVuYWJsZSBORU9OIGludHJpbnNpY3MgaW4gYWFyY2g2NCBidWlsZHMKK2I5ZDJiYjY3IGRzcC9uZW9uLmg6IGNvYWxlc2NlIGludHJpbnNpY3MtcmVsYXRlZCBkZWZpbmVzCitiNWM3NTI1OCBpb3NidWlsZDogYWRkIHN1cHBvcnQgZm9yIGlPU3Y3L2FhcmNoNjQKKzkzODNhZmQ1IFJlZHVjZSBudW1iZXIgb2YgbWVtb3J5IGFsbG9jYXRpb25zIHdoaWxlIGRlY29kaW5nIGxvc3NsZXNzLgorODg4ZTYzZWQgTWVyZ2UgImRzcC9sb3NzbGVzczogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzIgorODEzN2YzZWQgTWVyZ2UgImluc3RydW1lbnQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgZm9yIGRlYnVnZ2luZyIKKzJhYTE4NzM2IGluc3RydW1lbnQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgZm9yIGRlYnVnZ2luZworZDNiY2Y3MmIgRG9uJ3QgYWxsb2NhdGUgVlA4TEhhc2hDaGFpbiwgYnV0IHRyZWF0IGxpa2UgYXV0b21hdGljIG9iamVjdAorYmQ2Yjg2MTkgZHNwL2xvc3NsZXNzOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMKK2I3ZjE5YjgzIE1lcmdlICJkZWMvdnA4bDogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzIgorMjkwNTlkNTEgTWVyZ2UgInJlbW92ZSBzb21lIHVpbnQ2NF90IGNhc3RzIGFuZCB1c2UuIgorZTY5YTFkZjQgZGVjL3ZwOGw6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcworY2Y1ZWI4YWQgcmVtb3ZlIHNvbWUgdWludDY0X3QgY2FzdHMgYW5kIHVzZS4KKzM4ZTJkYjNlIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIEhpc3RvZ3JhbUFkZC4KK2UwNjA5YWRlIGR3ZWJwOiBmaXggZXhpdCBjb2RlIG9uIHdlYnAgbG9hZCBmYWlsdXJlCitiYmQzNThhOCBNZXJnZSAiZXhhbXBsZV91dGlsLmg6IGF2b2lkIGZvcndhcmQgZGVjbGFyaW5nIGVudW1zIgorODk1NWRhMjEgZXhhbXBsZV91dGlsLmg6IGF2b2lkIGZvcndhcmQgZGVjbGFyaW5nIGVudW1zCis2ZDY4NjVmMCBBZGRlZCBTU0UyIHZhcmlhbnRzIGZvciBBdmVyYWdlMi8zLzQKK2IzYTYxNmIzIG1ha2UgSGlzdG9ncmFtQWRkKCkgYSBwb2ludGVyIGluIGRzcAorYzhiYmI2MzYgZGVjX25lb246IHJlbG9jYXRlIHNvbWUgaW5saW5lLWFzbSBkZWZpbmVzCis0ZTM5M2JiOSBkZWNfbmVvbjogZW5hYmxlIGludHJpbnNpY3Mtb25seSBmdW5jdGlvbnMKK2JhOTlhOTIyIGRlY19uZW9uOiB1c2UgcG9zaXRpdmUgdGVzdHMgZm9yIFVTRV9JTlRSSU5TSUNTCis2OTA1OGZmOCBNZXJnZSAiZXhhbXBsZV91dGlsOiBhZGQgRXhVdGlsRGVjb2RlV2ViUEluY3JlbWVudGFsIgorYTc4MjhlOGIgZGVjX25lb246IG1ha2UgV09SS19BUk9VTkRfR0NDIGNvbmRpdGlvbmFsIG9uIHZlcnNpb24KKzNmM2Q3MTdhIE1lcmdlICJlbmNfbmVvbjogZW5hYmxlIGludHJpbnNpY3Mtb25seSBmdW5jdGlvbnMiCitkZTNjYjZjOCBNZXJnZSAibW92ZSBMT0NBTF9HQ0NfVkVSU0lPTiBkZWYgdG8gZHNwLmgiCisxYjJmZTE0ZCBleGFtcGxlX3V0aWw6IGFkZCBFeFV0aWxEZWNvZGVXZWJQSW5jcmVtZW50YWwKK2NhNDllN2FkIE1lcmdlICJlbmNfbmVvbjogbW92ZSBUcmFuc3Bvc2U0eDQgdG8gZHNwL25lb24uaCIKK2FkOTAwYWJkIE1lcmdlICJmaXggd2FybmluZyBhYm91dCBzaXplX3QgLT4gaW50IGNvbnZlcnNpb24iCis0ODI1YjQzNiBmaXggd2FybmluZyBhYm91dCBzaXplX3QgLT4gaW50IGNvbnZlcnNpb24KKzQyYjM1ZTA4IGVuY19uZW9uOiBlbmFibGUgaW50cmluc2ljcy1vbmx5IGZ1bmN0aW9ucworZjkzN2UwMTIgbW92ZSBMT0NBTF9HQ0NfVkVSU0lPTiBkZWYgdG8gZHNwLmgKKzVlMWExN2VmIGVuY19uZW9uOiBtb3ZlIFRyYW5zcG9zZTR4NCB0byBkc3AvbmVvbi5oCitjN2I5MmE1YSBkZWNfbmVvbjogKFdPUktfQVJPVU5EX0dDQykgZGVsZXRlIHVudXNlZCBMb2FkNHg4Cis4ZTVmOTBiMCBNZXJnZSAibWFrZSBFeFV0aWxMb2FkV2ViUCgpIGFjY2VwdCBOVUxMIGJpdHN0cmVhbSBwYXJhbS4iCiswNWQ0YzFiNyBNZXJnZSAiY3dlYnA6IGFkZCB3ZWJwZGVjIgorZGRlYjZhYzggY3dlYnA6IGFkZCB3ZWJwZGVjCiszNWQ3ZDA5NSBNZXJnZSAiUmVkdWNlIG1lbW9yeSBmb290cHJpbnQgZm9yIGVuY29kaW5nIFdlYlAgbG9zc2xlc3MuIgorMGI4OTYxMDEgUmVkdWNlIG1lbW9yeSBmb290cHJpbnQgZm9yIGVuY29kaW5nIFdlYlAgbG9zc2xlc3MuCitmMGI2NWM5YSBtYWtlIEV4VXRpbExvYWRXZWJQKCkgYWNjZXB0IE5VTEwgYml0c3RyZWFtIHBhcmFtLgorOWMwYTYwY2MgTWVyZ2UgImR3ZWJwOiBtb3ZlIHdlYnAgZGVjb2RpbmcgdG8gZXhhbXBsZV91dGlsIgorMWQ2MmFjZjYgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgSHVmZm1hbkNvc3QgZnVuY3Rpb25zLgorNGEwZTczOTAgZHdlYnA6IG1vdmUgd2VicCBkZWNvZGluZyB0byBleGFtcGxlX3V0aWwKK2MwMjIwNDYwIE1lcmdlICJCdWdmaXg6IEluY3JlbWVudGFsIGRlY29kZSBvZiBsb3NzeS1hbHBoYSIKKzhjN2NkNzIyIEJ1Z2ZpeDogSW5jcmVtZW50YWwgZGVjb2RlIG9mIGxvc3N5LWFscGhhCis3OTU1MTUyZCBNSVBTOiBmaXggZXJyb3Igd2l0aCBudW1iZXIgb2YgcmVnaXN0ZXJzLgorYjFkYWJlMzcgTWVyZ2UgIk1vdmUgdGhlIEh1ZmZtYW5Db3N0KCkgZnVuY3Rpb24gdG8gZHNwIGxpYiIKKzc1YjEyMDA2IE1vdmUgdGhlIEh1ZmZtYW5Db3N0KCkgZnVuY3Rpb24gdG8gZHNwIGxpYgorMjc3MmI4YmQgTUlQUzogZml4IGFzc2VtYmxlciBlcnJvciByZXZlYWxlZCBieSBjbGFuZydzIGRlYnVnIGJ1aWxkCis2NjUzYjYwMSBlbmNfbWlwczMyOiBmaXggdW51c2VkIHN5bWJvbCB3YXJuaW5nIGluIGRlYnVnCis4ZGVjMTIwOSBlbmNfbWlwczMyOiBkaXNhYmxlIElUcmFuc2Zvcm0oT25lKSBpbiBkZWJ1ZyBidWlsZHMKKzk4NTE5ZGQ1IGVuY19uZW9uOiBjb252ZXJ0IERpc3RvNHg0IHRvIGludHJpbnNpY3MKK2ZlOTMxN2M5IGNvc21ldGljczoKKzk1M2IwNzQ2IGVuY19uZW9uOiBjb3NtZXRpY3MKK2E5ZmM2OTdjIE1lcmdlICJXSVA6IGV4dHJhY3QgdGhlIGZsb2F0LWNhbGN1bGF0aW9uIG9mIEh1ZmZtYW5Db3N0IGZyb20gbG9vcCIKKzNmODRiNTIxIE1lcmdlICJyZXBsYWNlIHNvbWUgbXVsdC1sb25nICh2bXVsbF91OCkgd2l0aCBtdWx0LWxvbmctYWNjdW11bGF0ZSAodm1sYWxfdTgpIgorNGFlMDUzM2YgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbnMgZm9yIEV4dHJhQ29zdCBmdW5jdGlvbnMuCitiMzBhMDRjZiBXSVA6IGV4dHJhY3QgdGhlIGZsb2F0LWNhbGN1bGF0aW9uIG9mIEh1ZmZtYW5Db3N0IGZyb20gbG9vcAorYThmZThjZTIgTWVyZ2UgIk5FT04gaW50cmluc2ljcyB2ZXJzaW9uIG9mIENvbGxlY3RIaXN0b2dyYW0iCis5NTIwM2QyZCBORU9OIGludHJpbnNpY3MgdmVyc2lvbiBvZiBDb2xsZWN0SGlzdG9ncmFtCis3Y2EyZTc0YiByZXBsYWNlIHNvbWUgbXVsdC1sb25nICh2bXVsbF91OCkgd2l0aCBtdWx0LWxvbmctYWNjdW11bGF0ZSAodm1sYWxfdTgpCis0MWM2ZWZiZCBmaXggbG9zc2xlc3NfbmVvbi5jCis4ZmY5NmEwMiBORU9OIGludHJpbnNpY3MgdmVyc2lvbiBvZiBGVHJhbnNmb3JtCiswMjE0ZjRhOSBNZXJnZSAiTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbnMgZm9yIEZhc3RMb2cyIgorYmFhYmYxZWEgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbnMgZm9yIEZhc3RMb2cyCiszZDQ5ODcxZCBORU9OIGZ1bmN0aW9ucyBmb3IgbG9zc2xlc3MgY29kaW5nCiszZmUwMjkxNSBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9ucyBmb3IgU1NFIGZ1bmN0aW9ucy4KK2M1MDNiNDg1IE1lcmdlICJmaXggdGhlIGdjYy00LjYuMCBidWcgYnkgaW1wbGVtZW50aW5nIGFsdGVybmF0aXZlIG1ldGhvZCIKK2FiZTZmNDg3IGZpeCB0aGUgZ2NjLTQuNi4wIGJ1ZyBieSBpbXBsZW1lbnRpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kCis1NTk4YmRlYyBlbmNfbWlwczMyLmM6IGZpeCBmaWxlIG1vZGUKKzJiMWI0ZDVhIE1JUFM6IE1JUFMzMnIxOiBBZGQgb3B0aW1pemF0aW9uIGZvciBHZXRSZXNpZHVhbENvc3QKK2YwYTFmM2NkIE1lcmdlICJNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBGVHJhbnNmb3JtIgorNzIzMWY2MTAgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgRlRyYW5zZm9ybQorODY5ZWFmNmMgIH4zMCUgZW5jb2Rpbmcgc3BlZWR1cDogdXNlIE5FT04gZm9yIFF1YW50aXplQmxvY2soKQorZjc1OGFmNmIgZW5jX25lb246IGNvbnZlcnQgRlRyYW5zZm9ybVdIVCB0byBpbnRyaW5zaWNzCis3ZGFkMDk1YiBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBEaXN0bzR4NCAoVFRyYW5zZm9ybSkKKzIyOThkNWYzIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIFF1YW50aXplQmxvY2sKK2U4ODE1MGM5IE1lcmdlICJNSVBTOiBNSVBTMzJyMTogQWRkIG9wdGltaXphdGlvbiBmb3IgSVRyYW5zZm9ybSIKK2RlNjkzZjI1IGxvc3NsZXNzX25lb246IGRpc2FibGUgVlA4TENvbnZlcnQqIGZ1bmN0aW9ucworNDE0MzMzMmIgTkVPTiBpbnRyaW5zaWNzIGZvciBlbmNvZGluZworMGNhMjkxNGIgTUlQUzogTUlQUzMycjE6IEFkZCBvcHRpbWl6YXRpb24gZm9yIElUcmFuc2Zvcm0KKzcxYmNhNWVjIGRlY19uZW9uOiB1c2UgdnN0X2xhbmUgaW5zdGVhZCBvZiB2Z2V0X2xhbmUKK2JmMDYxMDUyIEludHJpbnNpY3MgTkVPTiB2ZXJzaW9uIG9mIFRyYW5zZm9ybU9uZQorMTljNmYxYmEgTWVyZ2UgImRlY19uZW9uOiB1c2UgdmxkP19sYW5lIGluc3RlYWQgb2YgdnNldD9fbGFuZSIKKzdhOTRjMGNmIHVwc2FtcGxpbmdfbmVvbjogZHJvcCBORU9OIHN1ZmZpeCBmcm9tIGxvY2FsIGZ1bmN0aW9ucworZDE0NjY5YzggdXBzYW1wbGluZ19zc2UyOiBkcm9wIFNTRTIgc3VmZml4IGZyb20gbG9jYWwgZnVuY3Rpb25zCisyY2E0MmE0ZiBlbmNfc3NlMjogZHJvcCBTU0UyIHN1ZmZpeCBmcm9tIGxvY2FsIGZ1bmN0aW9ucworZDAzOGU2MTkgZGVjX3NzZTI6IGRyb3AgU1NFMiBzdWZmaXggZnJvbSBsb2NhbCBmdW5jdGlvbnMKK2ZhNTJkNzUyIGRlY19uZW9uOiB1c2UgdmxkP19sYW5lIGluc3RlYWQgb2YgdnNldD9fbGFuZQorYzUyMGU3N2QgY29zbWV0aWM6IGZpeCBsb25nIGxpbmUKKzRiMGYyZGFlIE1lcmdlICJhZGQgaW50cmluc2ljcyBORU9OIGNvZGUgZm9yIGNocm9tYSBzdHJvbmctZmlsdGVyaW5nIgorZTM1MWVjMDcgYWRkIGludHJpbnNpY3MgTkVPTiBjb2RlIGZvciBjaHJvbWEgc3Ryb25nLWZpbHRlcmluZworYWFmNzM0YjggTWVyZ2UgIkFkZCBTU0UyIHZlcnNpb24gb2YgZm9yd2FyZCBjcm9zcy1jb2xvciB0cmFuc2Zvcm0iCitjOTBhOTAyZSBBZGQgU1NFMiB2ZXJzaW9uIG9mIGZvcndhcmQgY3Jvc3MtY29sb3IgdHJhbnNmb3JtCitiYzM3NGZmMyBVc2UgaGlzdG9ncmFtX2JpdHMgdG8gaW5pdGFsaXplIHRyYW5zZm9ybV9iaXRzLgorMjEzMjk5MmQgTWVyZ2UgIkFkZCBzdHJvbmcgZmlsdGVyaW5nIGludHJpbnNpY3MgKGlubmVyIGFuZCBvdXRlciBlZGdlcykiCis1ZmJmZjNhNiBBZGQgc3Ryb25nIGZpbHRlcmluZyBpbnRyaW5zaWNzIChpbm5lciBhbmQgb3V0ZXIgZWRnZXMpCitkNDgxM2YwYyBBZGQgU1NFMiBmdW5jdGlvbiBmb3IgSW52ZXJzZSBDcm9zcy1jb2xvciBUcmFuc2Zvcm0KKzI2MDI5NTY4IGRlY19uZW9uOiBhZGQgc3Ryb25nIGxvb3BmaWx0ZXIgaW50cmluc2ljcworY2NhN2Q3ZWYgTWVyZ2UgImFkZCBpbnRyaW5zaWNzIHZlcnNpb24gb2YgU2ltcGxlSEZpbHRlcjE2TkVPTigpIgorMWEwNWRmYTcgd2luZG93czogZml4IGRsbCBidWlsZHMKK2Q2YzUwZDhhIE1lcmdlICJhZGQgc29tZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGluIE5FT04iCis0ZmQ3YzgyZSBTU0UyIHZhcmlhbnRzIG9mIFN1YnRyYWN0LUdyZWVuOiBSZWN0aWZ5IGxvb3AgY29uZGl0aW9uCis5N2U1ZmFjMyBhZGQgc29tZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGluIE5FT04KK2I5YTdhNDVmIGFkZCBpbnRyaW5zaWNzIHZlcnNpb24gb2YgU2ltcGxlSEZpbHRlcjE2TkVPTigpCitkYWNjYmY0MCBhZGQgbGlnaHQgZmlsdGVyaW5nIE5FT04gaW50cmluc2ljcworYWY0NDQ2MDggZml4IHR5cG8gaW4gU1RPUkVfV0hUCis2YWY2YjhlMSBUdW5lIEhpc3RvZ3JhbUNvbWJpbmVCaW4gZm9yIGxhcmdlIGltYWdlcy4KK2FmOTNiZGQ2IHVzZSBXZWJQU2FmZVtDTV1hbGxvYy9XZWJQU2FmZUZyZWUgaW5zdGVhZCBvZiBbY21dYWxsb2MvZnJlZQorNTFmNDA2YTUgbG9zc2xlc3Nfc3NlMjogcmVsb2NhdGUgVlA4TERzcEluaXRTU0UyIHByb3RvCiswZjRmNzIxYiBzZXBhcmF0ZSBTU0UyIGxvc3NsZXNzIGZ1bmN0aW9ucyBpbnRvIGl0cyBvd24gZmlsZQorNTE0ZmMyNTEgVlA4TENvbnZlcnRGcm9tQkdSQTogdXNlIGNvbnZlcnNpb24gZnVuY3Rpb24gcG9pbnRlcnMKKzZkMmYzNTI3IGRzcC9kZWM6IFRyYW5zZm9ybURDVVY6IHVzZSBWUDhUcmFuc2Zvcm1EQworZGVmYzhlMWIgTWVyZ2UgImZpeCBvdXQtb2YtYm91bmQgcmVhZCBkdXJpbmcgYWxwaGEtcGxhbmUgZGVjb2RpbmciCitmYmVkMzY0MyBNZXJnZSAiZHNwOiByZXVzZSB3aHQgdHJhbnNmb3JtIGZyb20gZGVjIGluIGVuY29kZXIiCitkODQ2NzA4NCBNZXJnZSAiQWRkIFNTRTIgdmVyc2lvbiBvZiBBUkdCIC0+IEJHUi9SR0IvLi4uIGNvbnZlcnNpb24gZnVuY3Rpb25zIgorMjA3ZDAzYjQgZml4IG91dC1vZi1ib3VuZCByZWFkIGR1cmluZyBhbHBoYS1wbGFuZSBkZWNvZGluZworZDFiMzNhZDUgMi01JSBmYXN0ZXIgdHJlbGxpcyB3aXRoIGNsYW5nL01hY09TIChhbmQgfjItMyUgb24gQVJNKQorMzY5YzI2ZGQgQWRkIFNTRTIgdmVyc2lvbiBvZiBBUkdCIC0+IEJHUi9SR0IvLi4uIGNvbnZlcnNpb24gZnVuY3Rpb25zCitkZjIzMGYyNyBkc3A6IHJldXNlIHdodCB0cmFuc2Zvcm0gZnJvbSBkZWMgaW4gZW5jb2RlcgorODBlMjE4ZDQgQW5kcm9pZC5tazogZml4IGJ1aWxkIHdpdGggQVBQX0FCST1hcm1lYWJpLXY3YS1oYXJkCis1OWRhZjA4MyBNZXJnZSAiY29zbWV0aWNzOiIKKzUzNjIyMDA4IGNvc21ldGljczoKKzNlN2YzNGEzIEFzc2lnblNlZ21lbnRzOiBxdWlldCBhcnJheS1ib3VuZHMgd2FybmluZworM2MyZWJmNTggTWVyZ2UgIlVwZGF0ZUhpc3RvZ3JhbUNvc3Q6IGF2b2lkIGltcGxpY2l0IGRvdWJsZS0+ZmxvYXQiCitjZjgyMWM4MiBVcGRhdGVIaXN0b2dyYW1Db3N0OiBhdm9pZCBpbXBsaWNpdCBkb3VibGUtPmZsb2F0CiszMTJlNjM4ZiBFeHRlbmQgdGhlIHNlYXJjaCBzcGFjZSBmb3IgR2V0QmVzdEdyZWVuUmVkVG9CbHVlCisxYzU4NTI2ZiBGaXggZmV3IG5pdHMKK2ZlZjIyNzA0IE9wdGltaXplIGFuZCByZS1zdHJ1Y3R1cmUgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzCiswNjhiMTRhYyBPcHRpbWl6ZSBsb3NzbGVzcyBkZWNvZGluZy4KKzVmMGNmYTgwIERvIGEgYmluYXJ5IHNlYXJjaCB0byBnZXQgdGhlIG9wdGltdW0gY2FjaGUgYml0cy4KKzI0Y2EzNjc4IE1lcmdlICJhbGxvdyAnY3dlYnAgLW8gLScgdG8gZW1pdCBvdXRwdXQgdG8gc3Rkb3V0IgorZTEyZjg3NGUgYWxsb3cgJ2N3ZWJwIC1vIC0nIHRvIGVtaXQgb3V0cHV0IHRvIHN0ZG91dAorMmJjYWQ4OWIgYWxsb3cgc29tZSBtb3JlIHN0ZGluL3N0b3V0IEkvTworODRlZDRiM2EgZml4IGN3ZWJwLjEgdHlwb3MgYWZ0ZXIgcGF0Y2ggIzY5MTk5Cis2NWI5OWYxYyBhZGQgYSAteiBvcHRpb24gdG8gY3dlYnAsIGFuZCBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoKSBmdW5jdGlvbgorMzAxNzY2MTkgNC01JSBmYXN0ZXIgdHJlbGxpcyBieSByZW1vdmluZyBzb21lIHVubmVlZGVkIGNhbGN1bGF0aW9ucy4KKzY4N2E1OGVjIGhpc3RvZ3JhbS5jOiByZWluZGVudCBhZnRlciBiMzNlOGEwCiswNmQ0NTZmNiBNZXJnZSAifjMtNCUgZmFzdGVyIGxvc3NsZXNzIGVuY29kaW5nIgorYzYwZGUyNjAgfjMtNCUgZmFzdGVyIGxvc3NsZXNzIGVuY29kaW5nCis0MmViMDZmYyBNZXJnZSAiZmV3IGNvc21ldGljcyBhZnRlciBwYXRjaCAjNjkwNzkiCis4MmFmODI2NCBmZXcgY29zbWV0aWNzIGFmdGVyIHBhdGNoICM2OTA3OQorYjMzZThhMDUgUmVmYWN0b3IgY29kZSBmb3IgSGlzdG9ncmFtQ29tYmluZS4KK2NhMWJmZmY1IE1lcmdlICI1LTEwJSBlbmNvZGluZyBzcGVlZHVwIHdpdGggZmFzdGVyIHRyZWxsaXMgKC1tIDYpIgorNWFlZWIwODcgNS0xMCUgZW5jb2Rpbmcgc3BlZWR1cCB3aXRoIGZhc3RlciB0cmVsbGlzICgtbSA2KQorODJhZTFiZjIgY29zbWV0aWNzOiBub3JtYWxpemUgVlA4R2V0Q1BVSW5mbyBjaGVja3MKK2UzZGQ5MjQzIE1lcmdlICJSZWZhY3RvciBHZXRCZXN0UHJlZGljdG9yRm9yVGlsZSBmb3IgZnV0dXJlIHR1bmluZy4iCisyMDZjYzFiZSBSZWZhY3RvciBHZXRCZXN0UHJlZGljdG9yRm9yVGlsZSBmb3IgZnV0dXJlIHR1bmluZy4KKzNjYjg0MDYyIE1lcmdlICJzcGVlZC11cCB0cmVsbGlzIHF1YW50ICh+NS0xMCUgb3ZlcmFsbCBzcGVlZC11cCkiCitiNjZmMjIyNyBNZXJnZSAibG9zc3kgZW5jb2Rpbmc6IH4zJSBzcGVlZC11cCIKKzQyODdkMGQ0IHNwZWVkLXVwIHRyZWxsaXMgcXVhbnQgKH41LTEwJSBvdmVyYWxsIHNwZWVkLXVwKQorMzkwYzhiMzEgbG9zc3kgZW5jb2Rpbmc6IH4zJSBzcGVlZC11cAorOWE0NjNjNGEgTWVyZ2UgImRlY19uZW9uOiBjb252ZXJ0IFRyYW5zZm9ybVdIVCB0byBpbnRyaW5zaWNzIgorZTg2MDVlOTYgTWVyZ2UgImRlY19uZW9uOiBhZGQgQ29udmVydFU4VG9TMTYiCis0YWEzZTQxMiBNSVBTOiBNSVBTMzJyMTogcmVzY2FsZXIgYnVnZml4CitjMTZjZDk5YSBTcGVlZCB1cCBsb3NzbGVzcyBlbmNvZGVyLgorOWQ2YjVmZjEgZGVjX25lb246IGNvbnZlcnQgVHJhbnNmb3JtV0hUIHRvIGludHJpbnNpY3MKKzJmZjBhYWUyIGRlY19uZW9uOiBhZGQgQ29udmVydFU4VG9TMTYKKzc3YThmOTE5IGZpeCBjb21waWxhdGlvbiB3aXRoIFVTRV9ZVVZqIGZsYWcKKzRhY2JlYzFiIE1lcmdlIGNoYW5nZXMgSTNiMjQwZmZiLElhOTM3MDI4MyxJYTJkMjg3MjgKKzI3MTliYjdlIGRlY19uZW9uOiBUcmFuc2Zvcm1BQzM6IHdvcmsgb24gcGFja2VkIHZlY3RvcnMKK2I3YjYwY2ExIGRlY19uZW9uOiBhZGQgU2F0dXJhdGVBbmRTdG9yZTR4NAorYjc2ODVkNzMgUmVzY2FsZTogbGV0IEltcG9ydFJvdyAvIEV4cG9ydFJvdyBiZSBwb2ludGVyLXRvLWZ1bmN0aW9uCitlMDJmMTZlZiBkZWNfbmVvbi5jOiBjb252ZXJ0IFRyYW5zZm9ybURDIHRvIGludHJpbnNpY3MKKzljYmE5NjNmIGFkZCBtaXNzaW5nIGZpbGUKKzg5OTJkZGI3IHVzZSBzdGF0aWMgY2xpcHBpbmcgdGFibGVzCiswMjM1ZDVlNCAxLTIlIGZhc3RlciBxdWFudGl6YXRpb24gaW4gU1NFMgorYjJmYmMzNmMgZml4IFZDMTIteDY0IHdhcm5pbmcKKzZlMzdjYjk0IE1lcmdlICJjb3NtZXRpY3M6IGJhY2t3YXJkX3JlZmVyZW5jZXMuYzogcmVpbmRlbnQgYWZ0ZXIgYTdkMmVlMyIKK2E0MmVhOTc0IGNvc21ldGljczogYmFja3dhcmRfcmVmZXJlbmNlcy5jOiByZWluZGVudCBhZnRlciBhN2QyZWUzCis2YzMyNzQ0MiBNZXJnZSAiZml4IG1pc3NpbmcgX19CSUdfRU5ESUFOX18gZGVmaW5pdGlvbiBvbiBzb21lIHBsYXRmb3JtIgorYThiNmFhZDEgZml4IG1pc3NpbmcgX19CSUdfRU5ESUFOX18gZGVmaW5pdGlvbiBvbiBzb21lIHBsYXRmb3JtCitmZGUyOTA0YiBJbmNyZWFzZSBpbml0aWFsIGJ1ZmZlciBzaXplIGZvciBWUDhMIEJpdCBXcml0ZXIuCithN2QyZWUzOSBPcHRpbWl6ZSBjYWNoZSBlc3RpbWF0ZSBsb2dpYy4KKzdmYjYwOTViIE1lcmdlICJkZWNfbmVvbi5jOiBhZGQgVHJhbnNmb3JtQUMzIgorYmYxODJlODMgVlA4TEJpdFdyaXRlcjogdXNlIGEgYml0LWFjY3VtdWxhdG9yCiszZjQwYjRhNSBNZXJnZSAiTUlQUzogTUlQUzMycjE6IGNsYW5nIG1hY3JvIHdhcm5pbmcgcmVzb2x2ZWQiCisxNjg0ZjRlZSBXZWJQIERlY29kZXI6IE1hcmsgc29tZSB0cnVuY2F0ZWQgYml0c3RyZWFtcyBhcyBpbnZhbGlkCithY2JlZGFjNCBNSVBTOiBNSVBTMzJyMTogY2xhbmcgbWFjcm8gd2FybmluZyByZXNvbHZlZAorMjI4ZTQ4NzcgZGVjX25lb24uYzogYWRkIFRyYW5zZm9ybUFDMworMzkzZjg5YjcgQW5kcm9pZC5tazogYXZvaWQgZ2NjLXNwZWNpZmljIGZsYWdzIHdpdGggY2xhbmcKKzMyYWVhZjExIHJldmFtcCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybSgpIGEgYml0CiswYzdjYzRjYSBNZXJnZSAiRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCwgZW5zdXJlIEhhc2hDaGFpbiBmdWxseSBpbml0aWFsaXplZCIKKzM5MTMxNmZlIERvbid0IGRlcmVmZXJlbmNlIE5VTEwsIGVuc3VyZSBIYXNoQ2hhaW4gZnVsbHkgaW5pdGlhbGl6ZWQKKzkyNmZmNDAyIFdFQlBfU1dBUF8xNkJJVF9DU1A6IHJlbW92ZSBjb2RlIGR1cAorMWQxY2QzYmIgRml4IGRlY29kZSBidWcgZm9yIHJnYkFfNDQ0NC9SR0JBXzQ0NDQgY29sb3ItbW9kZXMuCis5MzllNzBlNyB1cGRhdGUgQVVUSE9SUyBmaWxlCis4OTM0YTYyMiBjb3NtZXRpY3M6ICpfbWlwczMyLmMKK2RkNDM4YzlhIE1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2Ygc29tZSBzaW1wbGUgcG9pbnQtc2FtcGxpbmcgZnVuY3Rpb25zLiBQQVRDSCBbNi82XQorNTM1MjA5MTEgQWRkZWQgc3VwcG9ydCBmb3IgY2FsbGluZyBzYW1wbGluZyBmdW5jdGlvbnMgdmlhIHBvaW50ZXJzLgorZDE2YzY5NzQgTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBmaWx0ZXIgZnVuY3Rpb25zLiBQQVRDSCBbNS82XQorMDQzMzZmYzcgTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBUcmFuc2Zvcm1PbmUuIFBBVENIIFs0LzZdCis5MmQ4ZmM3ZCBNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIFdlYlBSZXNjYWxlckltcG9ydFJvdy4gUEFUQ0ggWzMvNl0KK2JiYzIzZmYzIHBhcnNlIG9uZSByb3cgb2YgaW50cmEgbW9kZXMgYWx0b2dldGhlcgorYTJmNjA4ZjkgTWVyZ2UgIk1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2YgZnVuY3Rpb24gV2ViUFJlc2NhbGVyRXhwb3J0Um93LiBbMi82XSIKKzg4MjMwODU0IE1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2YgZnVuY3Rpb24gV2ViUFJlc2NhbGVyRXhwb3J0Um93LiBbMi82XQorYzVhNWIwMjggZGVjb2RlIG10K2luY3JlbWVudGFsOiBmaXggc2VnZmF1bHQgaW4gZGVidWcgYnVpbGRzCis5ODgyYjJmOSBhbHdheXMgdXNlIGZhc3QtYW5hbHlzaXMgZm9yIGFsbCBtZXRob2RzLgorMDAwYWRhYzAgTWVyZ2UgImF1dG9jb25mOiB1cGRhdGUgYXhfcHRocmVhZC5tNCIKKzJkMmZjMzdkIHVwZGF0ZSAuZ2l0aWdub3JlCis1YmY0MjU1YSBNZXJnZSAiTWFrZSBpdCBwb3NzaWJsZSB0byBhdm9pZCBhdXRvbWFnaWMgZGVwZW5kZW5jaWVzIgorYzFjYjE5MzMgZGlzYWJsZSBORU9OIGZvciBhcm02NCBwbGF0Zm9ybQorNzNhMzA0ZTkgTWFrZSBpdCBwb3NzaWJsZSB0byBhdm9pZCBhdXRvbWFnaWMgZGVwZW5kZW5jaWVzCis0ZDQ5M2Y4ZCBNSVBTOiBNSVBTMzJyMTogRGVjb2RlciBiaXQgcmVhZGVyIGZ1bmN0aW9uIG9wdGltaXplZC4gUEFUQ0ggWzEvNl0KK2M3NDExODNjIG1ha2UgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEgd29yayB3aXRoIGFyZ2IgcGljdHVyZQorNWRhMTg1NTIgYWRkIGEgZGVjb2Rpbmcgb3B0aW9uIHRvIGZsaXAgaW1hZ2UgdmVydGljYWxseQorMDBjM2M0ZTEgTWVyZ2UgImFkZCBtYW4vdndlYnAuMSIKKzJjNmJiNDI4IGFkZCBtYW4vdndlYnAuMQorZWE1OWE4ZTkgTWVyZ2UgIk1lcmdlIHRhZyAndjAuNC4wJyIKKzc1NzRiZWQ0IGZpeCBjb21tZW50cyByZWxhdGVkIHRvIGFycmF5IHNpemVzCiswYjVhOTBmZCBkd2VicC4xOiBmaXggb3B0aW9uIGZvcm1hdHRpbmcKK2VmZmNiMGZkIE1lcmdlIHRhZyAndjAuNC4wJworN2M3NjI1NWQgYXV0b2NvbmY6IHVwZGF0ZSBheF9wdGhyZWFkLm00CitmZmYyYTExYiBtYWtlIC1zaG9ydCB3b3JrIHdpdGggLXByaW50X3NzaW0sIC1wcmludF9wc25yLCBldGMuCis2OGU3OTAxZCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjQuMC1yYzEsIHRhZzogdjAuNC4wLCBvcmlnaW4vMC40LjAsIDAuNC4wKQorMjU2ZTQzMzMgdXBkYXRlIE5FV1MgZGVzY3JpcHRpb24gd2l0aCBuZXcgZ2VuZXJhbCBmZWF0dXJlcworMjk2MjUzNDAgTWVyZ2UgImdpZjJ3ZWJwOiBkb24ndCB1c2UgQzk5ICV6dSIgaW50byAwLjQuMAorM2I5ZjlkZDAgZ2lmMndlYnA6IGRvbid0IHVzZSBDOTkgJXp1CitiNWIyZTNjNyBjd2VicDogZml4IG1ldGFkYXRhIG91dHB1dCB3L2xvc3N5K2FscGhhCithZDI2ZGYxYSBtYWtlZmlsZS51bml4OiBjbGVhbiB1cCBsaWJnaWYyd2VicF91dGlsLmEKK2MzYjQ1NTcwIHVwZGF0ZSBDaGFuZ2Vsb2cKK2NhODQxMTIxIE1lcmdlICJidW1wIHZlcnNpb24gdG8gMC40LjAiIGludG8gMC40LjAKKzhjNTI0ZGI4IGJ1bXAgdmVyc2lvbiB0byAwLjQuMAorZWVjMjM5OGMgdXBkYXRlIEFVVEhPUlMgJiAubWFpbG1hcAorYjliYmY2YTEgdXBkYXRlIE5FV1MgZm9yIDAuNC4wCitjNzJlMDgxMSBNZXJnZSAiZGVjL3dlYnAuYzogZG9uJ3Qgd2FpdCBmb3IgZGF0YSBiZWZvcmUgcmVwb3J0aW5nIHcvaCIKKzVhZDY1MzE0IGRlYy9mcmFtZS5jOiBmaXggZm9ybWF0dGluZworZjdmYzRiYzggZGVjL3dlYnAuYzogZG9uJ3Qgd2FpdCBmb3IgZGF0YSBiZWZvcmUgcmVwb3J0aW5nIHcvaAorNjZhMzJhZjUgTWVyZ2UgIk5FT04gc3BlZWQgdXAiCisyNmQ4NDJlYiBORU9OIHNwZWVkIHVwCitmMzA3Zjk4YiBNZXJnZSAid2VicG11eDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmciCitmZTA1MWRhNyBNZXJnZSAiUkVBRE1FOiBhZGQgYSBzZWN0aW9uIG9uIGdpZjJ3ZWJwIgorNmZkMmJkNjIgTWVyZ2UgIm1hbnBhZ2UgcGVkYW50cnkiCis0YWYxOTAwNyBSRUFETUU6IGFkZCBhIHNlY3Rpb24gb24gZ2lmMndlYnAKKzZmMzZhZGU5IG1hbnBhZ2UgcGVkYW50cnkKK2Y5MDE2Y2I5IFJFQURNRTogdXBkYXRlIGR3ZWJwIG9wdGlvbnMKK2I0ZmEwYTQ3IHdlYnBtdXg6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nCithOWEyMGFjZiBnaWYyd2VicDogQWRkIGEgbXVsdGktdGhyZWFkZWQgZW5jb2RlIG9wdGlvbgorNDk1YmVmNDEgZml4IGJ1ZyBpbiBUcmVsbGlzUXVhbnRpemUKKzYwNWE3MTI3IHNpbXBsaWZ5IF9fY3BsdXNwbHVzIGlmZGVmCiszMzEwOWY5OSBNZXJnZSAiZHJvcDogaWZkZWYgX19jcGx1c3BsdXMgY2hlY2tzIGZyb20gQyBmaWxlcyIKKzdmOWRlMGI5IE1lcmdlIGNoYW5nZXMgSTk5NGE1NTg3LEk4NDY3YmI3MSxJMTNiNTA2ODgsSTFlMmM5YzdiCis1NDU5MDMwYiBnaWYyd2VicDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmcKK2E0YjBhYTA2IHZ3ZWJwOiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZworOThhZjY4ZmUgY3dlYnA6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nCithMzM4MzFlMiBkd2VicDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmcKKzM2MzAxMjQ5IGFkZCBzb21lIGNoZWNrcyBvbiBlcnJvciBwYXRocworY2U0YzcxMzkgTWVyZ2UgImF1dG9jb25mOiBhZGQgLS1kaXNhYmxlLXdpYyIKKzUyMjdkOTkxIGRyb3A6IGlmZGVmIF9fY3BsdXNwbHVzIGNoZWNrcyBmcm9tIEMgZmlsZXMKK2Y2NDUzNTU5IGR3ZWJwLjE6IGZpeCB0eXBvCitmOTEwMzRmMiBNZXJnZSAiY3dlYnA6IHByaW50IG1ldGFkYXRhIHN0YXRzIHdoZW4gbm8gb3V0cHV0IGZpbGUgaXMgZ2l2ZW4iCitkNDkzNDU1MyBnaWYyd2VicDogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgZ2lmbGliIHZlcnNpb24gPD0gNC4xLjMKKzRjNjE3ZDMyIGdpZjJ3ZWJwOiBEaXNhYmxlIG91dHB1dCBvZiBJQ0MgcHJvZmlsZSBieSBkZWZhdWx0Cis3M2I3MzFmYiBpbnRyb2R1Y2UgYSBzcGVjaWFsIHF1YW50aXphdGlvbiBmdW5jdGlvbiBmb3IgV0hUCis0MWMwY2M0YiBNYWtlIEZvcndhcmQgV0hUIHRyYW5zZm9ybSB1c2UgMzJiaXQgZml4ZWQtcG9pbnQgY2FsY3VsYXRpb24KK2EzMzU5ZjVkIE9ubHkgY29tcHV0ZSBxdWFudGl6YXRpb24gcGFyYW1zIG9uY2UKKzcwNDkwNDM3IGN3ZWJwOiBwcmludCBtZXRhZGF0YSBzdGF0cyB3aGVuIG5vIG91dHB1dCBmaWxlIGlzIGdpdmVuCitkNTEzYmI2MiAqIGZpeCBvZmYtYnktb25lIHp0aHJlc2ggY2FsY3VsYXRpb24gKiByZW1vdmUgdGhlIHNoYXJwZW5pbmcgZm9yIG5vbiBsdW1hLUFDIGNvZWZmcyAqIGFkanVzdCB0aGUgYmlhcyBhIGxpdHRsZSBiaXQgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcworYWQ5ZGVjMGMgTWVyZ2UgImNvc21ldGljczogZHdlYnA6IGZpeCBsb2NhbCBmdW5jdGlvbiBuYW1lIGZvcm1hdCIKK2Y3MzdmMDM3IE1lcmdlICJkd2VicDogcmVtb3ZlIGEgZGVhZCBzdG9yZSIKKzNjM2E3MGRhIE1lcmdlICJtYWtlZmlsZS51bml4OiBpbnN0YWxsIGJpbmFyaWVzIGluICQoREVTVERJUikvYmluLyIKKzE1MGI2NTVmIE1lcmdlICJBbmRyb2lkLm1rOiBhZGQgc29tZSByZWxlYXNlIGNvbXBpbGUgZmxhZ3MiCitkYmViZDMzYiBjb3NtZXRpY3M6IGR3ZWJwOiBmaXggbG9jYWwgZnVuY3Rpb24gbmFtZSBmb3JtYXQKKzI3NzQ5OTUxIGR3ZWJwOiByZW1vdmUgYSBkZWFkIHN0b3JlCithMDFlMDRmZSBhdXRvY29uZjogYWRkIC0tZGlzYWJsZS13aWMKKzUwMDliMjI3IG1ha2VmaWxlLnVuaXg6IGluc3RhbGwgYmluYXJpZXMgaW4gJChERVNURElSKS9iaW4vCitiYWIzMGZjYSBNZXJnZSAiZml4IC1wcmludF9wc25yIC8gc3NpbSBvcHRpb25zIgorZWJlZjdmYjMgZml4IC1wcmludF9wc25yIC8gc3NpbSBvcHRpb25zCitjYjYzNzg1NSBNZXJnZSAiZml4IGJ1ZyBkdWUgdG8gb3ZlcnplYWxvdXMgY2hlY2sgaW4gV2ViUFBpY3R1cmVZVVZBVG9BUkdCKCkiCis4MTg5ODg1YiBNZXJnZSAiRXN0aW1hdGVCZXN0RmlsdGVyOiB1c2UgYW4gaW50IHRvIGl0ZXJhdGUgV0VCUF9GSUxURVJfVFlQRSIKKzRhZDdkMzM1IEFuZHJvaWQubWs6IGFkZCBzb21lIHJlbGVhc2UgY29tcGlsZSBmbGFncworYzEyZTIzNjkgY29zbWV0aWNzOiBmaXggYSBmZXcgdHlwb3MKKzZmMTA0MDM0IGZpeCBidWcgZHVlIHRvIG92ZXJ6ZWFsb3VzIGNoZWNrIGluIFdlYlBQaWN0dXJlWVVWQVRvQVJHQigpCiszZjZjMzVjNiBFc3RpbWF0ZUJlc3RGaWx0ZXI6IHVzZSBhbiBpbnQgdG8gaXRlcmF0ZSBXRUJQX0ZJTFRFUl9UWVBFCitjYzU1NzkwZSBNZXJnZSBjaGFuZ2VzIEk4YmI3YTRkYyxJMmMxODAwNTEsSTAyMWEwMTRmLEk4YTIyNGE2MgorYzUzNmFmYjUgTWVyZ2UgImNvc21ldGljczogZml4IHNvbWUgdHlwb3MiCitjYmRkM2U2ZSBhZGQgYSAtZGl0aGVyIGRpdGhlcmluZyBvcHRpb24gdG8gdGhlIGRlY29kZXIKK2U4MTI0MDEyIFVwZGF0ZWQgaW9zYnVpbGQuc2ggZm9yIFhDb2RlIDUueAorNDkzMWMzMjkgY29zbWV0aWNzOiBmaXggc29tZSB0eXBvcworMDVhYWNmNzcgbXV4OiBhZGQgc29tZSBtaXNzaW5nIGNhc3RzCis2MTdkOTM0OCBlbmMvdnA4bDogYWRkIGEgbWlzc2luZyBjYXN0Cis0NmRiMjg2NSBpZGVjOiBhZGQgc29tZSBtaXNzaW5nIGNhc3RzCitiNTI0ZTMzNiBFcnJvclN0YXR1c0xvc3NsZXNzOiBjb3JyZWN0IHJldHVybiB0eXBlCitjYjI2MWY3OSBmaXggYSBkZXNjYWxpbmcgYnVnIGZvciB2ZXJ0aWNhbC9ob3Jpem9udGFsIFUvViBpbnRlcnBvbGF0aW9uCitiY2IzOTU1YyBNZXJnZSBjaGFuZ2VzIEk0ODk2ODQ2OCxJMTgxYmM3MzYKKzczZjUyMTMzIGdpZjJ3ZWJwOiBBZGQgYSBtaXhlZCBjb21wcmVzc2lvbiBtb2RlCis2MTk4NzE1ZSBkZW11eDogc3BsaXQgY2h1bmsgcGFyc2luZyBmcm9tIFBhcnNlVlA4WAorZDJlM2Y0ZTYgZGVtdXg6IGFkZCBhIHRhaWwgcG9pbnRlciBmb3IgY2h1bmtzCis4N2NmZmNjMyBkZW11eDogY29zbWV0aWNzOiBzL2hhc19mcmFtZXMvaXNfYW5pbWF0aW9uLworZTE4ZTY2NzcgZGVtdXg6IHN0cmljdGx5IGVuZm9yY2UgdGhlIGFuaW1hdGlvbiBmbGFnCitjNGYzOWY0YSBkZW11eDogY29zbWV0aWNzOiByZW1vdmUgYSB1c2VsZXNzIGJyZWFrCis2MWNiODg0ZCBkZW11eDogKG5vbi1leHApIGZhaWwgaWYgdGhlIGZyYWdtZW50ZWQgZmxhZyBpcyBzZXQKK2ZmMzc5ZGIzIGZldyAlIHNwZWVkdXAgb2YgbG9zc2xlc3MgZW5jb2RpbmcKK2RmMzY0OWEyIHJlbW92ZSBhbGwgZGlzYWJsZWQgY29kZSByZWxhdGVkIHRvIFAtZnJhbWVzCis2ZDBjYjNkZSBNZXJnZSAiZ2lmMndlYnA6IGttaW4gPSAwIHNob3VsZCBzdXBwcmVzcyBrZXktZnJhbWUgYWRkaXRpb24uIgorMzY1NTU5ODMgZ2lmMndlYnA6IGttaW4gPSAwIHNob3VsZCBzdXBwcmVzcyBrZXktZnJhbWUgYWRkaXRpb24uCis3NzA4ZTYwOSBNZXJnZSAiZGV0ZWN0IGZsYXRuZXNzIGluIGJsb2NrcyBhbmQgZmF2b3IgREMgcHJlZGljdGlvbiIKKzA2YjE1MDNlIE1lcmdlICJhZGQgY29tbWVudCBhYm91dCB0aGUga0xldmVsc0Zyb21EZWx0YVtdW10gTFVUIGdlbmVyYXRpb24iCis1OTM1MjU5YyBhZGQgY29tbWVudCBhYm91dCB0aGUga0xldmVsc0Zyb21EZWx0YVtdW10gTFVUIGdlbmVyYXRpb24KK2UzMzEyZWE2IGRldGVjdCBmbGF0bmVzcyBpbiBibG9ja3MgYW5kIGZhdm9yIERDIHByZWRpY3Rpb24KK2ViYzliMWVlIE1lcmdlICJWUExCaXRSZWFkZXIgYnVnZml4OiBDYXRjaCBlcnJvciBpZiBiaXRfcG9zID4gTEJJVFMgdG9vLiIKKzk2YWQwZTBhIFZQTEJpdFJlYWRlciBidWdmaXg6IENhdGNoIGVycm9yIGlmIGJpdF9wb3MgPiBMQklUUyB0b28uCithMDE0ZTljOSB0dW5lIHF1YW50aXphdGlvbiBiaWFzZXMgdG93YXJkIGhpZ2hlciBwcmVjaXNpb24KKzFlODk4NjE5IGFkZCBoZWxwZnVsIFByaW50QmxvY2tJbmZvKCkgZnVuY3Rpb24KKzU5NmE2ZDczIG1ha2UgdXNlIG9mICdleHRlcm4nIGNvbnNpc3RlbnQgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCitjOGQ0OGM2ZSBNZXJnZSAiZXh0cmFjdCByYW5kb20gdXRpbHMgdG8gdGhlaXIgb3duIGZpbGUgdXRpbC9yYW5kb20uW2NoXSIKKzk4YWEzM2NmIGV4dHJhY3QgcmFuZG9tIHV0aWxzIHRvIHRoZWlyIG93biBmaWxlIHV0aWwvcmFuZG9tLltjaF0KKzQzMmE3MjNlIE1lcmdlICJzd2lnOiBhZGQgYmFzaWMgZ28gYmluZGluZ3MiCitmYWI2MThiNSBNZXJnZSAicmVuYW1lIGxpYndlYnAuaSAtPiBsaWJ3ZWJwLnN3aWciCitlNGU3ZmNkNiBzd2lnOiBhZGQgYmFzaWMgZ28gYmluZGluZ3MKK2QzNDA4NzIwIE1lcmdlICJmYXN0IGF1dG8tZGV0ZXJtaW5lZCBmaWx0ZXJpbmcgc3RyZW5ndGgiCitmOGJmZDVjZCBmYXN0IGF1dG8tZGV0ZXJtaW5lZCBmaWx0ZXJpbmcgc3RyZW5ndGgKK2FjMGJmOTUxIHNtYWxsIGNsZWFuLXVwIGluIEV4cGFuZE1hdHJpeCgpCisxOTM5NjA3ZSByZW5hbWUgbGlid2VicC5pIC0+IGxpYndlYnAuc3dpZworNDMxNDhiNmMgZmlsdGVyaW5nOiBwcmVjb21wdXRlIGlsaW1pdCBhbmQgaGV2X3RocmVzaG9sZAorMThmOTkyZWMgc2ltcGxpZnkgZl9pbm5lciBjYWxjdWxhdGlvbiBhIGxpdHRsZQorMjQxZDExZjEgYWRkIG1pc3NpbmcgY29uc3QKKzg2YzAwMzFlIGFkZCBhICdmb3JtYXQnIGZpZWxkIHRvIFdlYlBCaXRzdHJlYW1GZWF0dXJlcworZGRlOTFmZGUgRGVtdXg6IENvcnJlY3QgdGhlIGV4dGVuZGVkIGZvcm1hdCB2YWxpZGF0aW9uCis1ZDZjNWJkMiBhZGQgZW50cnkgZm9yICctcmVzaXplJyBvcHRpb24gaW4gY3dlYnAncyBtYW4KKzdjMDk4ZDE4IFVzZSBzb21lIGdhbW1hLWN1cnZlIHJhbmdlIGNvbXByZXNzaW9uIHdoZW4gY29tcHV0aW5nIFUvViBhdmVyYWdlCiswYjJiMDUwNCBVc2UgZGV0ZXJtaW5pc3RpYyByYW5kb20tZGl0aGVyaW5nIGR1cmluZyBSR0ItPllVViBjb252ZXJzaW9uCis4YTJmYTA5OSBBZGQgYSBzZWNvbmQgbXVsdGktdGhyZWFkIG1ldGhvZAorN2Q2ZjJkYTAgTWVyZ2UgInVwIHRvIDIwJSBmYXN0ZXIgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmciCisyNjZmNjNlYSBNZXJnZSAibGlid2VicC5qYXI6IGJ1aWxkIHcvSmF2YSAxLjYgZm9yIEFuZHJvaWQgY29tcGF0IgorMDUzMjE0OWMgdXAgdG8gMjAlIGZhc3RlciBtdWx0aS10aHJlYWRlZCBkZWNvZGluZworMzhlZmRjMmUgU2ltcGxpZnkgdGhlIGdpZjJ3ZWJwIHRvb2w6IG1vdmUgdGhlIG9wdGltaXphdGlvbiBkZXRhaWxzIHRvIHV0aWwKK2RlODk5NTE2IGxpYndlYnAuamFyOiBidWlsZCB3L0phdmEgMS42IGZvciBBbmRyb2lkIGNvbXBhdAorY2IyMjE1NTIgRGVjb2RlIGEgZnVsbCByb3cgb2YgYml0c3RyZWFtIGJlZm9yZSByZWNvbnN0cnVjdGluZworZGNhOGE0ZDMgTWVyZ2UgIk5FT04vc2ltcGxlIGxvb3BmaWx0ZXI6IGF2b2lkIHE0LXE3IHJlZ2lzdGVycyIKKzllODRkOTAxIE1lcmdlICJORU9OL1RyYW5zZm9ybVdIVDogYXZvaWQgcTQtcTcgcmVnaXN0ZXJzIgorZmMxMDI0OWIgTkVPTi9zaW1wbGUgbG9vcGZpbHRlcjogYXZvaWQgcTQtcTcgcmVnaXN0ZXJzCisyZjA5ZDYzZSBORU9OL1RyYW5zZm9ybVdIVDogYXZvaWQgcTQtcTcgcmVnaXN0ZXJzCis3NzU4NWEyYiBNZXJnZSAidXNlIGEgbWFjcm9mdW5jIGZvciBzZXR0aW5nIE56Q29lZmZzIGJpdHMiCitkMTU1NTA3YyBNZXJnZSAidXNlIEhJTlRfR1JBUEggYXMgaW1hZ2VfaGludCBmb3IgZ2lmIHNvdXJjZSIKKzljNTYxNjQ2IE1lcmdlICJvbmx5IHByaW50IEdJRl9ESVNQT1NFX1dBUk5JTkcgb25jZSIKKzA1ODc5ODY1IHVzZSBISU5UX0dSQVBIIGFzIGltYWdlX2hpbnQgZm9yIGdpZiBzb3VyY2UKKzBiMjhkN2FiIHVzZSBhIG1hY3JvZnVuYyBmb3Igc2V0dGluZyBOekNvZWZmcyBiaXRzCitmOWJiYzJhMCBTcGVjaWFsLWNhc2Ugc3BhcnNlIHRyYW5zZm9ybQorMDAxMjUxOTYgZ2lmMndlYnA6IGRldGVjdCBhbmQgZmxhdHRlbiB1bmlmb3JtbHkgc2ltaWxhciBibG9ja3MKKzBkZWFmMGZhIG9ubHkgcHJpbnQgR0lGX0RJU1BPU0VfV0FSTklORyBvbmNlCis2YThjMGViNyBNZXJnZSAic21hbGwgb3B0aW1pemF0aW9uIGluIHNlZ21lbnQtc21vb3RoaW5nIGxvb3AiCitmNzE0NmJjMSBzbWFsbCBvcHRpbWl6YXRpb24gaW4gc2VnbWVudC1zbW9vdGhpbmcgbG9vcAorNWE3NTMzY2Ugc21hbGwgZ2lmMndlYnAgZml4Cis0ZGYwYzg5ZSBNZXJnZSBjaGFuZ2VzIEljNjk3NjYwYyxJMjcyODU1MjEKKzViMmU2YmQzIEFuZHJvaWQubWs6IGFkZCBhIGR3ZWJwIHRhcmdldAorZjkxMGE4NGUgQW5kcm9pZC5tazogdXBkYXRlIGJ1aWxkIGZsYWdzCis2M2Y5YWJhNCBzcGVjaWFsLWNhc2UgV0hUIHRyYW5zZm9ybSB3aGVuIHRoZXJlJ3Mgb25seSBEQworODA5MTFhZWYgTWVyZ2UgIjctOCUgZmFzdGVyIGRlY29kaW5nIGJ5IHJld3JpdGluZyBHZXRDb2VmZnMoKSIKKzYwNmM0MzA0IGdpZjJ3ZWJwOiBJbXByb3ZlZCBjb21wcmVzc2lvbiBmb3IgbG9zc3kgYW5pbWF0ZWQgV2ViUAorZmI4ODdmN2YgZ2lmMndlYnA6IERpZmZlcmVudCBrbWluL2ttYXggZGVmYXVsdHMgZm9yIGxvc3N5IGFuZCBsb3NzbGVzcworMmE5ODEzNjYgNy04JSBmYXN0ZXIgZGVjb2RpbmcgYnkgcmV3cml0aW5nIEdldENvZWZmcygpCis5MmQ0N2U0YyBpbXByb3ZlIFZQOEwgc2lnbmF0dXJlIGRldGVjdGlvbiBieSBjaGVja2luZyB0aGUgdmVyc2lvbiBiaXRzIHRvbworNWNkNDNlNDMgQWRkIC1pbmNyZW1lbnRhbCBvcHRpb24gdG8gZHdlYnAKKzU0YjhlM2Y2IHdlYnBtdXg6IERpc3BsYXlJbmZvKCk6IHJlbW92ZSB1bm5lY2Vzc2FyeSBlcnJvciBjaGVja3MuCis0MGFlMzUyMCBmaXggbWVtbGVhayBpbiBXZWJQSURlbGV0ZSgpCitkOTY2MjY1OCBtdXguaCBkb2M6IFdlYlBNdXhHZXRGcmFtZSgpIGNhbiByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SIHRvby4KKzBlNjc0N2Y4IHdlYnBtdXggLWluZm86IGRpc3BsYXkgZGltZW5zaW9ucyBhbmQgaGFzX2FscGhhIHBlciBmcmFtZQorZDc4YTgyYzQgU2FuaXR5IGNoZWNrIGZvciB1bmRlcmZsb3cKKzg0OThmNGJmIE1lcmdlICJyZW1vdmUgLVdzaGFkb3cgd2FybmluZ3MiCitlODljNmZjOCBBdm9pZCBhIHBvdGVudGlhbCBtZW1sZWFrCiszZWJlMTc1NyBNZXJnZSAiYnJlYWsgZG93biB0aGUgcHJvYmEgNEQtYXJyYXkgaW50byBzb21lIGhhbmR5IHN0cnVjdHMiCis2YTQ0NTUwYSBicmVhayBkb3duIHRoZSBwcm9iYSA0RC1hcnJheSBpbnRvIHNvbWUgaGFuZHkgc3RydWN0cworMmY1ZTg5MzQgcmVtb3ZlIC1Xc2hhZG93IHdhcm5pbmdzCitiZjNhMjliMyBNZXJnZSAiYWRkIHByb3BlciBXRUJQX0hBVkVfR0lGIGFuZCBXRUJQX0hBVkVfR0wgZmxhZ3MiCisyYjBhNzU5MyBNZXJnZSAiZml4IHNvbWUgd2FybmluZ3MgZnJvbSBzdGF0aWMgYW5hbHlzaXMiCisyMmRkMDdjZSBtdXguaDogU29tZSBkb2MgY29ycmVjdGlvbnMKKzc5ZmYwMzQ2IGFkZCBwcm9wZXIgV0VCUF9IQVZFX0dJRiBhbmQgV0VCUF9IQVZFX0dMIGZsYWdzCitkNTFmNDVmMCBmaXggc29tZSB3YXJuaW5ncyBmcm9tIHN0YXRpYyBhbmFseXNpcworZDEzNDMwN2IgZml4IGNvbnZlcnNpb24gd2FybmluZyBvbiBNU1ZDCitkNTM4Y2VhOCBnaWYyd2VicDogU3VwcG9ydCBhICdtaW4nIGFuZCAnbWF4JyAga2V5IGZyYW1lIGludGVydmFsCis4MGI1NGUxYyBhbGxvdyBzZWFyY2ggd2l0aCB0b2tlbiBidWZmZXIgbG9vcCBhbmQgZml4IFBBUlRJVElPTjAgcHJvYmxlbQorYjdkNGUwNDIgYWRkIFZQOEVzdGltYXRlVG9rZW5TaXplKCkKKzEwZmRkZjUzIGVuYy9xdWFudC5jOiBzaWxlbmNlIGEgd2FybmluZworMzk5Y2Q0NTYgTWVyZ2UgImZpeCBjb21waWxlIGVycm9yIG9uIEFSTS9nY2MiCis5ZjI0NTE5ZSBlbmNvZGVyOiBtaXNjIHJhdGUtcmVsYXRlZCBmaXhlcworYzY2M2JiMjEgTWVyZ2UgInNpbXBsaWZ5IFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCkgYXJnIHBhc3NpbmciCitmYTQ2YjMxMiBEZW11eC5oOiBDb3JyZWN0IGEgbWV0aG9kIG5hbWUgcmVmZXJlbmNlCitmODM5OGM5ZCBmaXggY29tcGlsZSBlcnJvciBvbiBBUk0vZ2NjCitmNjkxZjBlNCBzaW1wbGlmeSBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeSgpIGFyZyBwYXNzaW5nCis0MjU0MmJlOCB1cCB0byA2JSBmYXN0ZXIgZW5jb2Rpbmcgd2l0aCBjbGFuZyBjb21waWxlcgorOTM0MDJmMDIgbXVsdGktdGhyZWFkZWQgc2VnbWVudCBhbmFseXNpcworN2UyZDY1OTUgTWVyZ2UgInJlbW92ZSB0aGUgUEFDSygpIGJpdC1wYWNraW5nIHRyaWNrcyIKK2MxM2ZlY2Y5IHJlbW92ZSB0aGUgUEFDSygpIGJpdC1wYWNraW5nIHRyaWNrcworMmZkMDkxYzkgTWVyZ2UgInVzZSBOVUxMIGZvciBsZl9zdGF0c18gdGVzdGluZywgbm90IGJvb2wiCitiMTFjOWQ2MiBkd2VicDogdXNlIGRlZmF1bHQgZGN0X21ldGhvZAorNGJiODQ2NWYgTWVyZ2UgIihkZSltdXguaDogd3JhcCBwc2V1ZG8tY29kZSBpbiAvKiAqLyIKK2NmYjU2YjE3IG1ha2UgLXBhc3Mgb3B0aW9uIHdvcmsgd2l0aCB0b2tlbiBidWZmZXJzCis1NDE2YWFiNCAoZGUpbXV4Lmg6IHdyYXAgcHNldWRvLWNvZGUgaW4gLyogKi8KKzM1ZGJhMzM3IHVzZSBOVUxMIGZvciBsZl9zdGF0c18gdGVzdGluZywgbm90IGJvb2wKKzczM2E3ZmFhIGVuYy0+SXRlcmF0b3IgbWVtb3J5IGNsZWFudXAKK2U4MWZhYzg2IEFkZCBzdXBwb3J0IGZvciAibm8gYmxlbmQiIGluIHdlYnBtdXggYmluYXJ5CiszYjgwYmM0OCBnaWYyd2VicDogU2VwYXJhdGUgb3V0IGVhY2ggc3RlcCBpbnRvIGEgbWV0aG9kCitiZWY3ZTljYyBBZGQgZG9jIHByZWNpc2lvbiBhYm91dCBkZW11eCBvYmplY3Qga2VlcGluZyBwb2ludGVycyB0byBkYXRhLgorNjE0MDVhMTQgZHdlYnA6IGVuYWJsZSBzdGRvdXQgb3V0cHV0IHdpdGggV0lDCis2ZWFiYjg4NiBNZXJnZSAiQW5pbWF0ZWQgV2ViUDogYWRkICJkbyBubyBibGVuZCIgb3B0aW9uIHRvIHNwZWMiCitiZTIwZGVjYiBmaXggY29tcGlsYXRpb24gZm9yIEJJVFMgMjQKK2U1OGNjMTM3IE1lcmdlICJkd2VicDogcy91bnNpZ25lZCBjaGFyL3VpbnQ4X3QvIgorNzI1MDFkNDMgZHdlYnA6IHMvdW5zaWduZWQgY2hhci91aW50OF90LworMmM5NjMzZTggTWVyZ2UgImdpZjJ3ZWJwOiBJbnNlcnQgaW5kZXBlbmRlbnQgZnJhbWVzIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLiIKK2YwZDZhMTRiIGdpZjJ3ZWJwOiBJbnNlcnQgaW5kZXBlbmRlbnQgZnJhbWVzIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgorYjI1YTZmYmYgeXV2Lmg6IGZpeCBpbmRlbnQKK2VkZTM2MDJlIE1lcmdlICJjb3NtZXRpY3M6IGZpeCBpbmRlbnQiCiszYTY1MTIyYSBkd2VicDogZml4IHN0ZG91dCByZWxhdGVkIG91dHB1dAorMzg4YTcyNDkgY29zbWV0aWNzOiBmaXggaW5kZW50Cis0YzczMjJjOCBNZXJnZSAiZHNwOiBtc3ZjIGNvbXBhdGliaWxpdHkiCitkNTBjN2UzMiBNZXJnZSAiNS03JSBmYXN0ZXIgU1NFMiB2ZXJzaW9ucyBvZiBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucyIKK2I4YWI3ODQ3IE1lcmdlICJzaW1wbGlmeSB1cHNhbXBsZXIgY2FsbHM6IG9ubHkgYWxsb3cgJ2JvdHRvbScgdG8gYmUgTlVMTCIKK2RmNmNlYmZhIDUtNyUgZmFzdGVyIFNTRTIgdmVyc2lvbnMgb2YgWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKK2FkNmFjMzJkIHNpbXBsaWZ5IHVwc2FtcGxlciBjYWxsczogb25seSBhbGxvdyAnYm90dG9tJyB0byBiZSBOVUxMCithNWU4YWZhZiBvdXRwdXQgdG8gc3Rkb3V0IGlmIGZpbGUgbmFtZSBpcyAiLSIKK2YzNTg0NTBmIGRzcDogbXN2YyBjb21wYXRpYmlsaXR5Cis0M2E3YzhlYiBNZXJnZSAiY29zbWV0aWNzIgorNGM1ZjE5YzEgTWVyZ2UgImJpdF9yZWFkZXIuaDogY29zbWV0aWNzIgorZjcyZmFiNzAgY29zbWV0aWNzCisxNGRkNWU3OCBmaXggY29uc3QtbmVzcworYjIwYWVjNDkgTWVyZ2UgIlN1cHBvcnQgZm9yICdkbyBub3QgYmxlbmQnIG9wdGlvbiBpbiB2d2VicCIKK2RjZjY1MjIyIFN1cHBvcnQgZm9yICdkbyBub3QgYmxlbmQnIG9wdGlvbiBpbiB2d2VicAorZDViYWQwMzMgQW5pbWF0ZWQgV2ViUDogYWRkICJkbyBubyBibGVuZCIgb3B0aW9uIHRvIHNwZWMKK2EyZjVmNzNkIE1lcmdlICJTdXBwb3J0IGZvciAiRG8gbm90IGJsZW5kIiBpbiBtdXggYW5kIGRlbXV4IGxpYnJhcmllcyIKK2UwODFmMmYzIFBhY2sgY29kZSAmIGV4dHJhX2JpdHMgdG8gU3RydWN0IChWUDhMUHJlZml4Q29kZSkuCis2Mjg0ODU0YiBTdXBwb3J0IGZvciAiRG8gbm90IGJsZW5kIiBpbiBtdXggYW5kIGRlbXV4IGxpYnJhcmllcworZjQ4NmFhYTkgTWVyZ2UgInNsaWdodGx5IGZhc3RlciBQYXJzZUludHJhTW9kZSIKK2QxNzE4NjMyIHNsaWdodGx5IGZhc3RlciBQYXJzZUludHJhTW9kZQorM2NlY2E4YWQgYml0X3JlYWRlci5oOiBjb3NtZXRpY3MKKzY5MjU3ZjcwIENyZWF0ZSBMVVQgZm9yIFByZWZpeEVuY29kZS4KKzk4OGI3MDg0IGFkZCBXZWJQV29ya2VyRXhlY3V0ZSgpIGZvciBjb252ZW5pZW50IGJ5cGFzcworMDZlMjQ5ODcgTWVyZ2UgIlZQOEVuY0l0ZXJhdG9yIGNsZWFuLXVwIgorZGU0ZDRhZDUgVlA4RW5jSXRlcmF0b3IgY2xlYW4tdXAKKzdiYmU5NTI5IE1lcmdlICJjb3NtZXRpY3M6IHRocmVhZC5jOiBkcm9wIGEgcmVkdW5kYW50IGNvbW1lbnQiCitkYTQxMTQ4NSBjb3NtZXRpY3M6IHRocmVhZC5jOiBkcm9wIGEgcmVkdW5kYW50IGNvbW1lbnQKK2ZlYjRiNmU2IHRocmVhZC5oOiAjaWZkZWYgd2hlbiBjaGVja2luZyBXRUJQX1VTRV9USFJFQUQKKzg5MjRhM2E3IHRocmVhZC5jOiBkcm9wIFdlYlBXb3JrZXIgcHJlZml4IGZyb20gc3RhdGljIGZ1bmNzCisxYWVkOGYyYSBNZXJnZSAiZml4IGluZGVudCIKKzQwMzhlZDE1IGZpeCBpbmRlbnQKKzE2OTNmZDliIERlbXV4OiBBIG5ldyBzdGF0ZSBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SCis4ZGNhZThiMyBmaXggcmVzY2FsaW5nLXdpdGgtYWxwaGEgaW5hY2N1cmFjeQorMTEyNDlhYmYgTWVyZ2UgY2hhbmdlcyBJOWI0ZGMzNmMsSTRlMGVlZjRkCis1MjUwOGExZiBNdXg6IHN1cHBvcnQgcGFyc2luZyB1bmtub3duIGNodW5rcyB3aXRoaW4gYSBmcmFtZS9mcmFnbWVudC4KKzA1ZGIwNTcyIFdlYlBNdXhTZXRDaHVuazogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorOGJhMWJmNjEgU3RyaWN0ZXIgY2hlY2sgZm9yIHByZXNlbmNlIG9mIGFscGhhIHdoZW4gd3JpdGluZyBsb3NzbGVzcyBpbWFnZXMKK2EwM2MzNTE2IERlbXV4OiBXZWJQSXRlcmF0b3Igbm93IGFsc28gZGVub3RlcyBpZiB0aGUgZnJhbWUgaGFzIGFscGhhLgorNmRmNzQzYTMgRGVjb2RlcjogaGFuZGxlIGZyYWdtZW50cyBjYXNlIGNvcnJlY3RseSB0b28uCitmYWE0YjA3ZSBTdXBwb3J0IGZvciB1bmtub3duIGNodW5rcyBpbiBtdXggbGlicmFyeQorN2Q2MGJiYzYgU3BlZWQgdXAgSGFzaENoYWluRmluZENvcHkgZnVuY3Rpb24uCis2Njc0MDE0MCBTcGVlZHVwIEFscGhhIHBsYW5lIGVuY29kaW5nLgorYjczNDZhMWUgMC4xICUgc3BlZWR1cCB0byBkZWNvZGluZworYzYwNjE4MmUgd2VicC1jb250YWluZXItc3BlYzogVGlnaHRlbiBsYW5ndWFnZSBhZGRlZCBieSBsYXN0CithMzRhNTAyOSBwbmdkZWM6IG91dHB1dCBlcnJvciBtZXNzYWdlcyBmcm9tIGxpYnBuZworZTg0YzYyNWQgTWVyZ2UgIkRldGVjdCBjYW52YXMgYW5kIGltYWdlIHNpemUgbWlzbWF0Y2ggaW4gZGVjb2Rlci4iCitmNjI2ZmUyZSBEZXRlY3QgY2FudmFzIGFuZCBpbWFnZSBzaXplIG1pc21hdGNoIGluIGRlY29kZXIuCitmNWZiZGVlMCBkZW11eDogc3RyaWN0ZXIgaW1hZ2UgYm91bmRzIGNoZWNrCiszMGM4MTU4YSBhZGQgZXh0cmEgYXNzZXJ0IGluIEh1ZmZtYW4gZGVjb2RlIGNvZGUKKzg5NjdiOWYzIFNTRTIgZm9yIGxvc3NsZXNzIGRlY29kaW5nIChjcml0aWNhbCkgZnVuY3Rpb25zLgorNjk5ZDgwZWEgSnVtcC1sb29rdXAgZm9yIEh1ZmZtYW4gY29kaW5nCitjMzQzMDdhYiBmaXggc29tZSBWUzkgd2FybmluZ3MgYWJvdXQgdHlwZSBjb252ZXJzaW9uCitlZWFkYTM1YyBwbmdkZWM6IGFkZCBtaXNzaW5nIGluY2x1ZGUKKzU0YjY1MTA4IGdpZjJ3ZWJwOiBJZiBhbGlnbmluZyB0byBldmVuIG9mZnNldHMsIGV4dHJhIHBpeGVscyBzaG91bGQgYmUgdHJhbnNwYXJlbnQKKzBiY2Y1Y2UzIE1lcmdlICJyZW1vdmUgYSBtYWxsb2MoKSBpbiBjYXNlIHdlJ3JlIHVzaW5nIG9ubHkgRklMVEVSX05PTkUgZm9yIGFscGhhIgorMmMwNzE0M2IgcmVtb3ZlIGEgbWFsbG9jKCkgaW4gY2FzZSB3ZSdyZSB1c2luZyBvbmx5IEZJTFRFUl9OT05FIGZvciBhbHBoYQorYTRkNWY1OWQgRmFzdGVyIGxvc3NsZXNzIGRlY29kaW5nCitmZDUzYmI3NSBNZXJnZSAiYWx0ZXJuYXRlIExVVC1iYXNlIHJldmVyc2UtYml0cyBjb2RlIgorZDFjMTY2ZWYgTWVyZ2UgIkNvbnRhaW5lciBzcGVjOiBhIGNsYXJpZmljYXRpb24gb24gYmFja2dyb3VuZCBjb2xvci4iCitmZGI5MTc3OSBSZW5hbWUgYSBtZXRob2QKKzVlOTY3NTMyIENvbnRhaW5lciBzcGVjOiBhIGNsYXJpZmljYXRpb24gb24gYmFja2dyb3VuZCBjb2xvci4KKzMwZTc3ZDBmIE1lcmdlIGJyYW5jaCAnMC4zLjAnCisxYjYzMWUyOSBhbHRlcm5hdGUgTFVULWJhc2UgcmV2ZXJzZS1iaXRzIGNvZGUKKzI0Y2MzMDdhIH4yMCUgZmFzdGVyIGxvc3NsZXNzIGRlY29kaW5nCiszMTNkODUzZiBTcGVlZHVwIGZvciBkZWNvZGluZyBsb3NzbGVzcyBXZWJQIHBob3RvZ3JhcGhzOgorMjRlZTA5OGEgY2hhbmdlIHRoZSBieXRlc19wZXJfcGl4ZWxzXyBmaWVsZCBpbnRvIG1vcmUgZXZvY2F0aXZlIHVzZV84Yl9kZWNvZGUKKzJhMDRiMDM0IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMy4xLXJjMiwgdGFnOiB2MC4zLjEpCis3Mjg4OTUwYiBSZWdyZXNzaW9uIGZpeCBmb3IgYWxwaGEgY2hhbm5lbHMgdXNpbmcgY29sb3IgY2FjaGU6CisyZTM3N2I1MyB3aWNkZWM6IHNpbGVuY2UgYSBmb3JtYXQgd2FybmluZworYWQ5ZTQyYTYgbXV4ZWRpdDogc2lsZW5jZSBzb21lIHVuaW5pdGlhbGl6ZWQgd2FybmluZ3MKKzMzMDdjMTYzIERvbid0IHNldCBhbHBoYS1jaGFubmVsIHRvIDB4ZmYgZm9yIGFscGhhLT5ncmVlbiB1cGxpZnQKKzUxMzA3NzBjIE1lcmdlICJ3aWNkZWM6IHNpbGVuY2UgYSBmb3JtYXQgd2FybmluZyIKK2EzN2VmZjQ3IFJlZ3Jlc3Npb24gZml4IGZvciBhbHBoYSBjaGFubmVscyB1c2luZyBjb2xvciBjYWNoZToKKzI0MWNmOTliIE1lcmdlICJtdXhlZGl0OiBzaWxlbmNlIHNvbWUgdW5pbml0aWFsaXplZCB3YXJuaW5ncyIKK2M4ZjljODRkIFJlZ3Jlc3Npb24gZml4IGZvciBhbHBoYSB1bmZpbHRlcmluZzoKKzE0Y2Q1YzZjIG11eGVkaXQ6IHNpbGVuY2Ugc29tZSB1bmluaXRpYWxpemVkIHdhcm5pbmdzCithMzY4ZGI4MSBkZWMvdnA4bDogcXVpZXQgdnM5IHg2NCB0eXBlIGNvbnZlcnNpb24gd2FybmluZworZmZhZTlmMzEgd2ljZGVjOiBzaWxlbmNlIGEgZm9ybWF0IHdhcm5pbmcKKzhjZjA3MDFlIEFscGhhIGVuY29kaW5nOiBuZXZlciBmaWx0ZXIgaW4gY2FzZSBvZiBOT19DT01QUkVTU0lPTgorODI1ZTczYjEgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4zLjEtcmMxKQorYWJmNmY2OTEgdXBkYXRlIE5FV1MKKzVhOTJjMWE1IGJ1bXAgdmVyc2lvbiB0byAwLjMuMQorODZkYWY3N2Mgc3RvcmUgdG9wIFkvVS9WIHNhbXBsZXMgaW4gcGFja2VkIGZhc2hpb24KKzY3YmMzNTNlIFJldmVydCAiYWRkIFdlYlBCbGVuZEFscGhhKCkgZnVuY3Rpb24gdG8gYmxlbmQgY29sb3JzIGFnYWluc3QgYmFja2dyb3VuZCIKKzA2OGRiNTllIEludGVydHdpbmVkIGRlY29kaW5nIG9mIGFscGhhIGFuZCBSR0IKKzM4Y2MwMTE0IFNpbXBsaWZ5IGZvcndhcmQtV0hUICsgU1NFMiB2ZXJzaW9uCiszZmE1OTVhNSBTdXBwb3J0IGRlY29kaW5nIHVwdG8gZ2l2ZW4gcm93IGluIERFQ09ERV9EQVRBX0ZVTkMKKzUyMGYwMDVmIERlcXVhbnRpemVMZXZlbHMoKTogQWRkICdyb3cnIGFuZCAnbnVtX3Jvd3MnIGFyZ3MKKzQ3Mzc0YjgyIEFscGhhIHVuZmlsdGVyIGZvciBnaXZlbiBzZXQgb2Ygcm93cworZjMyMDk3ZTAgcHJvYmUgaW5wdXQgZmlsZSBhbmQgcXVpY2stY2hlY2sgZm9yIFdlYlAgZm9ybWF0LgorYTJhZWQxZDAgY29uZmlndXJlOiBpbXByb3ZlIGdsL2dsdXQgbGlicmFyeSB0ZXN0CitjN2U4OWNiYiB1cGRhdGUgY29weXJpZ2h0IHRleHQKK2EwMDM4MGQyIGNvbmZpZ3VyZTogcmVtb3ZlIHVzZSBvZiBBU19WQVJfQVBQRU5ECithOTRhODhkZCBmaXggRVhJRiBwYXJzaW5nIGluIFBORworYTcxZTVkODQgYWRkIGRvYyBwcmVjaXNpb24gZm9yIFdlYlBQaWN0dXJlQ29weSgpIGFuZCBXZWJQUGljdHVyZVZpZXcoKQorODI4NzAxMmUgcmVtb3ZlIGRhdGF0eXBlIHF1YWxpZmllciBmb3Igdm1udgorZTE5MDg0MzAgZml4IGEgbWVtb3J5IGxlYWsgaW4gZ2lmMndlYnAKKzBiMThiOWVlIGZpeCB0d28gbWlub3IgbWVtb3J5IGxlYWtzIGluIHdlYnBtdXgKK2RiNTA5NWQ1IHJlbW92ZSBzb21lIGNydWZ0IGZyb20gc3dpZy9saWJ3ZWJwLmphcgorODUwZTk1NmYgUkVBRE1FOiB1cGRhdGUgc3dpZyBub3RlcworYmRkZDliMGEgc3dpZy9weXRob246IGFkZCBtaW5pbWFsIGRvY3VtZW50YXRpb24KK2Q1NzNhOGQ1IHN3aWc6IGFkZCBweXRob24gZW5jb2RlIHN1cHBvcnQKKzZiOTMxODc1IHN3aWcvamF2YTogcmVkdWNlIHdyYXBwZXIgZnVuY3Rpb24gY29kZSBkdXBsaWNhdGlvbgorNmZlNTM2ZjQgc3dpZy9qYXZhOiByZXdvcmsgdWludDhfdCB0eXBlbWFwCithMmVhNDY0MyBGaXggdGhlIGJ1ZyBpbiBBcHBseVBhbGV0dGUuCis3YmIyOGQyYSB3ZWJwL2xvc3NsZXNzOiBmaXggYmlnIGVuZGlhbiBCR1JBIG91dHB1dAorZjAzNmQ0YmYgU3BlZWQgdXAgQXBwbHlQYWxldHRlIGZvciBBUkdCIHBpeGVscy4KKzgxMTJjOGNmIHJlbW92ZSBzb21lIHdhcm5pbmdzOgorY2MxMjhlMGIgRnVydGhlciByZWR1Y2UgbWVtb3J5IHRvIGRlY29kZSBsb3NzeSthbHBoYSBpbWFnZXMKKzA3ZGI3MGQyIGZpeCBmb3IgYmlnLWVuZGlhbgorZWRhOGE3ZGUgZ2lmMndlYnA6IEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBtaXNtYXRjaAorMzFmMzQ2ZmUgTWFrZWZpbGUudmM6IGZpeCBsaWJ3ZWJwZGVtdXggZGxsIHZhcmlhYmxlIHR5cG8KKzZjNzZkMjhlIHN3aWc6IGFkZCBweXRob24gKGRlY29kZSkgc3VwcG9ydAorYjRmNWJiNmMgc3dpZzogY29zbWV0aWNzCis0OThkNGRkNiBXZWJQLUxvc3NsZXNzIGVuY29kaW5nIGltcHJvdmVtZW50cy4KKzI2ZTcyNDQyIHN3aWc6IGlmZGVmIHNvbWUgSmF2YSBzcGVjaWZpYyBjb2RlCis4ZWNlYzY4NiBjb25maWd1cmU6IGFkZCB3YXJuaW5nIHJlbGF0ZWQgZmxhZ3MKK2U2NzZiMDQzIGNvbmZpZ3VyZTogYWRkIEdMVVQgZGV0ZWN0aW9uOyBidWlsZCB2d2VicAorYjBmZmM0MzcgQWxwaGEgZGVjb2Rpbmc6IHNpZ25pZmljYW50bHkgcmVkdWNlIG1lbW9yeSB1c2FnZQorMjBhYTdhOGQgY29uZmlndXJlOiBhZGQgLS1lbmFibGUtZXZlcnl0aGluZworYjgzMDdjYzAgY29uZmlndXJlLmFjOiBhZGQgc29tZSBoZWxwZXIgbWFjcm9zCis5ODBlN2FlOSBSZW1vdmUgdGhlIGdjYyBjb21waWxhdGlvbiBjb21tZW50cworN2YyNWZmOTkgZ2lmMndlYnA6IEZpeCBJQ0MgYW5kIFhNUCBzdXBwb3J0CitkOGU1MzIxMSBBZGQgbWlzc2luZyBuYW1lIHRvIEFVVEhPUlMKKzExZWRmNWUyIERlbXV4OiBGaXggYSBwb3RlbnRpYWwgbWVtbGVhaworYzdiOTIxODQgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIGVudW1zCis3YTY1MGM2YSBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMKKzMxYmVhMzI0IGFkZCBwcmVjaXNpb24gYWJvdXQgZHluYW1pYyBvdXRwdXQgcmVhbGxvY2F0aW9uIHdpdGggSURlY29kZXIKK2MyMjg3N2Y3IEFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBleHRlbmRlZCBmb3JtYXQgZmlsZXMKKzUwNTEyNDVmIE1ha2VmaWxlLnZjOiBoYXZlICdhbGwnIHRhcmdldCBidWlsZCBldmVyeXRoaW5nCis4MTkxZGVjYSBNYWtlZmlsZS52YzogZmxhZ3MgY2xlYW51cAorYjlkNzQ3MzUgTWFrZWZpbGUudmM6IGRyb3AgL0ZEIGZsYWcKKzU1NjhkYmNmIHVwZGF0ZSBnaXRpZ25vcmUKK2Y0YzdiNjU0IFdlYlBFbmNvZGU6IEFuIGFkZGl0aW9uYWwgY2hlY2suIFN0YXJ0IFZQOEVuY0xvb3AvVlA4RW5jVG9rZW5Mb29wIG9ubHkgaWYgVlA4RW5jU3RhcnRBbHBoYSBzdWNjZWVkZWQuCisxZmIwNGJlYyBwbmdkZWM6IEF2b2lkIGEgZG91YmxlLWZyZWUuCitkY2JiMWNhNSBhZGQgV2ViUEJsZW5kQWxwaGEoKSBmdW5jdGlvbiB0byBibGVuZCBjb2xvcnMgYWdhaW5zdCBiYWNrZ3JvdW5kCitiYzlmNWZiZSBjb25maWd1cmUuYWM6IGFkZCBBTV9QUk9HX0FSIGZvciBhdXRvbWFrZSA+PSAxLjEyCitiZjg2N2JmMiBUdW5lZCBjcm9zc19jb2xvciBwYXJhbWV0ZXIgKHN0ZXApIGZvciBsb3dlciBxdWFsCis5MGUyZWM1YSBNZXJnZSAicHJvYmUgaW5wdXQgZmlsZSBhbmQgcXVpY2stY2hlY2sgZm9yIFdlYlAgZm9ybWF0LiIKKzcxODBkN2ZmIE1lcmdlICJ1cGRhdGUgY29weXJpZ2h0IHRleHQiCis4MzBmNzJiNyBwcm9iZSBpbnB1dCBmaWxlIGFuZCBxdWljay1jaGVjayBmb3IgV2ViUCBmb3JtYXQuCisyY2NmNThkNiBjb25maWd1cmU6IGltcHJvdmUgZ2wvZ2x1dCBsaWJyYXJ5IHRlc3QKK2Q2NDA2MTRkIHVwZGF0ZSBjb3B5cmlnaHQgdGV4dAorYzIxMTNhZDQgTWVyZ2UgImNvbmZpZ3VyZTogcmVtb3ZlIHVzZSBvZiBBU19WQVJfQVBQRU5EIgorOTMyNmE1NmYgY29uZmlndXJlOiByZW1vdmUgdXNlIG9mIEFTX1ZBUl9BUFBFTkQKK2VhNjNkNjE5IGZpeCBhIHR5cGUgd2FybmluZyBvbiBWUzkgeDg2CitiZWMxMTA5MiBmaXggRVhJRiBwYXJzaW5nIGluIFBORworYjZlNjVmM2QgTWVyZ2UgImZpeCB3YXJuaW5ncyBmb3IgdnM5IHg2NCIKKzQzODk0NmRjIGZpeCB3YXJuaW5ncyBmb3IgdnM5IHg2NAorZjQ3MTBlM2IgY29sbGVjdCBtYWNyb2Jsb2NrIHJlY29uc3RydWN0aW9uIGRhdGEgaW4gVlA4TUJEYXRhIHN0cnVjdAorMjNkMjhlMjEgYWRkIGRvYyBwcmVjaXNpb24gZm9yIFdlYlBQaWN0dXJlQ29weSgpIGFuZCBXZWJQUGljdHVyZVZpZXcoKQorNTE4ZjJjZDcgY29zbWV0aWNzOiBnaWYyd2VicDogZml4IGluZGVudAorYWYzNThlNjggTWVyZ2UgInJlbW92ZSBkYXRhdHlwZSBxdWFsaWZpZXIgZm9yIHZtbnYiCiszZmU5MTYzNSByZW1vdmUgZGF0YXR5cGUgcXVhbGlmaWVyIGZvciB2bW52Cis3NjRmZGZmYSBmaXggYSBtZW1vcnkgbGVhayBpbiBnaWYyd2VicAorM2U1OWE3NGQgZml4IHR3byBtaW5vciBtZW1vcnkgbGVha3MgaW4gd2VicG11eAorNDdiOTg2MmYgTWVyZ2UgIlJFQURNRTogdXBkYXRlIHN3aWcgbm90ZXMiCiszMjVkMTVmZiByZW1vdmUgc29tZSBjcnVmdCBmcm9tIHN3aWcvbGlid2VicC5qYXIKKzRhNzYyN2MyIFJFQURNRTogdXBkYXRlIHN3aWcgbm90ZXMKKzVkYTgxZTMzIE1lcmdlICJzd2lnL3B5dGhvbjogYWRkIG1pbmltYWwgZG9jdW1lbnRhdGlvbiIKK2YzOWUwOGYyIE1lcmdlICJzd2lnOiBhZGQgcHl0aG9uIGVuY29kZSBzdXBwb3J0IgorNmNhNGEzZTMgTWVyZ2UgInN3aWcvamF2YTogcmVkdWNlIHdyYXBwZXIgZnVuY3Rpb24gY29kZSBkdXBsaWNhdGlvbiIKKzhmODcwMmIwIE1lcmdlICJzd2lnL2phdmE6IHJld29yayB1aW50OF90IHR5cGVtYXAiCis5MTQxM2JlMiByZWR1Y2UgbWVtb3J5IGZvciBWUDhNQiBhbmQgcmVtb3ZlIGJpdGZpZWxkcyB1c2UKKzc0MTMzOTRlIEZpeCB0aGUgbWVtb3J5IGxlYWsgaW4gQXBwbHlGaWx0ZXJzLgorMjA1M2MyY2Ygc2ltcGxpZnkgdGhlIGFscGhhLWZpbHRlciB0ZXN0aW5nIGxvb3AKKzgyNWI2NGRiIHN3aWcvcHl0aG9uOiBhZGQgbWluaW1hbCBkb2N1bWVudGF0aW9uCisxNDY3N2UxMSBzd2lnOiBhZGQgcHl0aG9uIGVuY29kZSBzdXBwb3J0CithNWMyOTdjOCBzd2lnL2phdmE6IHJlZHVjZSB3cmFwcGVyIGZ1bmN0aW9uIGNvZGUgZHVwbGljYXRpb24KK2FkNGEzNjdkIHN3aWcvamF2YTogcmV3b3JrIHVpbnQ4X3QgdHlwZW1hcAorMGQyNTg3NmIgdXNlIHVpbnQ4X3QgZm9yIGludl9wYWxldHRlW10KK2FmYTM0NTBjIEZpeCB0aGUgYnVnIGluIEFwcGx5UGFsZXR0ZS4KKzJkNmFjNDIyIE1lcmdlICJ3ZWJwL2xvc3NsZXNzOiBmaXggYmlnIGVuZGlhbiBCR1JBIG91dHB1dCIKKzJjYTgzOTY4IHdlYnAvbG9zc2xlc3M6IGZpeCBiaWcgZW5kaWFuIEJHUkEgb3V0cHV0Cis3NDIxMTBjYyBTcGVlZCB1cCBBcHBseVBhbGV0dGUgZm9yIEFSR0IgcGl4ZWxzLgorMjQ1MWU0N2QgbWlzYyBjb2RlIGNsZWFudXAKKzgzZGI0MDQzIE1lcmdlICJzd2lnOiBhZGQgcHl0aG9uIChkZWNvZGUpIHN1cHBvcnQiCitlZWVlYThiNSBNZXJnZSAic3dpZzogY29zbWV0aWNzIgorZDVmOWI4ZjMgTWVyZ2UgImxpYndlYnA6IGZpeCB2cDggZW5jb2RlciBtZW0gYWxsb2Mgb2Zmc2V0dGluZyIKK2Q4ZWRkODM1IGxpYndlYnA6IGZpeCB2cDggZW5jb2RlciBtZW0gYWxsb2Mgb2Zmc2V0dGluZworODk4M2I4M2UgcmVtb3ZlIHVzZSBvZiBiaXQtZmllbGRzIGluIFZQOEZJbmZvCis4N2E0ZmNhMiByZW1vdmUgc29tZSB3YXJuaW5nczoKK2JhOGY3NGUyIE1lcmdlICJmaXggZm9yIGJpZy1lbmRpYW4iCithNjUwNjdmYSBNZXJnZSAiRnVydGhlciByZWR1Y2UgbWVtb3J5IHRvIGRlY29kZSBsb3NzeSthbHBoYSBpbWFnZXMiCis2NGM4NDQ4NiBGdXJ0aGVyIHJlZHVjZSBtZW1vcnkgdG8gZGVjb2RlIGxvc3N5K2FscGhhIGltYWdlcworMzMyMTMwYjkgTXV4OiBtYWtlIGEgZmV3IG1ldGhvZHMgc3RhdGljCis0NDM3MDYxNyBmaXggZm9yIGJpZy1lbmRpYW4KKzUxOTllYWI1IE1lcmdlICJhZGQgdW5jb21wcmVzc2VkIFRJRkYgb3V0cHV0IHN1cHBvcnQiCithM2FlZGU5NyBhZGQgdW5jb21wcmVzc2VkIFRJRkYgb3V0cHV0IHN1cHBvcnQKK2Y5NzViNjdmIE1lcmdlICJnaWYyd2VicDogRml4IHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIG1pc21hdGNoIgorNWZiYzczNGIgTWVyZ2UgIkdldEZlYXR1cmVzOiBEZXRlY3QgaW52YWxpZCBWUDhYL1ZQOC9WUDhMIGRhdGEiCitkNTA2MGM4NyBNZXJnZSAibXV4Lmg6IEEgY29tbWVudCBmaXggKyBzb21lIGNvbnNpc3RlbmN5IGZpeGVzIgorMzUyZDBkZWUgR2V0RmVhdHVyZXM6IERldGVjdCBpbnZhbGlkIFZQOFgvVlA4L1ZQOEwgZGF0YQorM2VmNzlmZWYgQ29zbWV0aWM6ICJ3aWR0aCAqIGhlaWdodCIKKzA0M2UxYWU0IGdpZjJ3ZWJwOiBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gbWlzbWF0Y2gKKzU4MThjZmY3IG11eC5oOiBBIGNvbW1lbnQgZml4ICsgc29tZSBjb25zaXN0ZW5jeSBmaXhlcworMTE1M2Y4ODggTWVyZ2UgInN3aWc6IGlmZGVmIHNvbWUgSmF2YSBzcGVjaWZpYyBjb2RlIgorM2VlZWRhZTEgTWFrZWZpbGUudmM6IGZpeCBsaWJ3ZWJwZGVtdXggZGxsIHZhcmlhYmxlIHR5cG8KK2Y5ODBmYWY0IHN3aWc6IGFkZCBweXRob24gKGRlY29kZSkgc3VwcG9ydAorN2Y1ZjQyYmIgc3dpZzogY29zbWV0aWNzCis4ZWFlMTg4YSBXZWJQLUxvc3NsZXNzIGVuY29kaW5nIGltcHJvdmVtZW50cy4KK2M3MjQ3YzRjIHN3aWc6IGlmZGVmIHNvbWUgSmF2YSBzcGVjaWZpYyBjb2RlCis0Y2IyMzRkNSBNZXJnZSAiTXV4OiBtYWtlIFZhbGlkYXRlRm9yU2luZ2xlSW1hZ2UoKSBtZXRob2Qgc3RhdGljIgorZWQ2ZjUzMDggTWVyZ2UgIkFkZCBHZXRDYW52YXNTaXplKCkgbWV0aG9kIHRvIG11eCIKKzFkNTMwYzlhIE11eDogbWFrZSBWYWxpZGF0ZUZvclNpbmdsZUltYWdlKCkgbWV0aG9kIHN0YXRpYworYmJhNGMyYjIgY29uZmlndXJlOiBhZGQgd2FybmluZyByZWxhdGVkIGZsYWdzCitmZmZlZmQxOCBBZGQgR2V0Q2FudmFzU2l6ZSgpIG1ldGhvZCB0byBtdXgKKzczMmRhOGQwIE1lcmdlICJjb25maWd1cmU6IGFkZCBHTFVUIGRldGVjdGlvbjsgYnVpbGQgdndlYnAiCiswZTUxM2Y3YSBjb25maWd1cmU6IGFkZCBHTFVUIGRldGVjdGlvbjsgYnVpbGQgdndlYnAKKzU1ZDFjMTUwIE1lcmdlICJBbHBoYSBkZWNvZGluZzogc2lnbmlmaWNhbnRseSByZWR1Y2UgbWVtb3J5IHVzYWdlIgorMTNkOTlmYjUgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLWV2ZXJ5dGhpbmciCisyYmY2OThmZSBNZXJnZSAiY29uZmlndXJlLmFjOiBhZGQgc29tZSBoZWxwZXIgbWFjcm9zIgorZWRjY2QxOTQgQWxwaGEgZGVjb2Rpbmc6IHNpZ25pZmljYW50bHkgcmVkdWNlIG1lbW9yeSB1c2FnZQorM2NhZmNjOWEgY29uZmlndXJlOiBhZGQgLS1lbmFibGUtZXZlcnl0aGluZworNGVmMTQ0NzcgY29uZmlndXJlLmFjOiBhZGQgc29tZSBoZWxwZXIgbWFjcm9zCithNGUxY2RiYiBSZW1vdmUgdGhlIGdjYyBjb21waWxhdGlvbiBjb21tZW50cworNjM5M2ZlNGIgQ29zbWV0aWMgZml4ZXMKKzljNGNlOTcxIFNpbXBsaWZ5IGZvcndhcmQtV0hUICsgU1NFMiB2ZXJzaW9uCis4NzhiOWRhNSBmaXggbWlzc2VkIG9wdGltCiswMDA0NjE3MSBWUDhHZXRJbmZvKCk6IENoZWNrIGZvciB6ZXJvIHdpZHRoIG9yIGhlaWdodC4KKzliZjMxMjkzIGFsaWduIFZQOEVuY29kZXI6Om56XyBhbGxvY2F0aW9uCis1ZGExNjVjZiBmaXggQ2hlY2tNb2RlKCkgc2lnbmF0dXJlCiswZWNlMDdkYyBNZXJnZSAiZXhwbGljaXRseSBwYWQgYml0ZmllbGRzIHRvIDMyLWJpdHMiCis5ZGJjOWQxOSBleHBsaWNpdGx5IHBhZCBiaXRmaWVsZHMgdG8gMzItYml0cworNTM2OWE4MGYgTWVyZ2UgInByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcyIKKzcwZTM5NzEyIE1lcmdlICJjb3NtZXRpY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSAnOydzIgorZDMxMzZjZTIgTWVyZ2UgImRvbid0IGZvcndhcmQgZGVjbGFyZSBlbnVtcyIKK2IyNmU1YWQ1IGdpZjJ3ZWJwOiBGaXggSUNDIGFuZCBYTVAgc3VwcG9ydAorNDYwODliMjAgQWRkIG1pc3NpbmcgbmFtZSB0byBBVVRIT1JTCis5NDMyOGQ2NCBEZW11eDogRml4IGEgcG90ZW50aWFsIG1lbWxlYWsKKzk2ZTk0OGQ3IGRvbid0IGZvcndhcmQgZGVjbGFyZSBlbnVtcworZjRmOTA4ODAgcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzCiswMjYxNTQ1ZSBjb3NtZXRpY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSAnOydzCis3ZWJkZjExMCBNZXJnZSAiRml4IGZldyBtaXNzaW5nIGNvbXBhcmlzb25zIHRvIE5VTEwiCisxNTc5OTg5ZSBGaXggZmV3IG1pc3NpbmcgY29tcGFyaXNvbnMgdG8gTlVMTAorZWExYjIxY2YgQ2xlYW5lZCB1cCBWUDhHZXRIZWFkZXJzKCkgc28gdGhhdCBpdCBwYXJzZXMgb25seSBmcmFtZSBoZWFkZXIKK2I2NmNhZWU0IGR3ZWJwOiBhZGQgc3VwcG9ydCBmb3IgQk1QIG91dHB1dAorZmY4ODViZmUgYWRkIHByZWNpc2lvbiBhYm91dCBkeW5hbWljIG91dHB1dCByZWFsbG9jYXRpb24gd2l0aCBJRGVjb2RlcgorNzkyNDFkNWEgTWVyZ2UgIk1ha2VmaWxlLnZjOiBoYXZlICdhbGwnIHRhcmdldCBidWlsZCBldmVyeXRoaW5nIgorYWMxYzcyOWIgTWVyZ2UgIk1ha2VmaWxlLnZjOiBmbGFncyBjbGVhbnVwIgorMTE4YTA1NWMgTWVyZ2UgIk1ha2VmaWxlLnZjOiBkcm9wIC9GRCBmbGFnIgorZWNhZDAxMDkgTWVyZ2UgInVwZGF0ZSBnaXRpZ25vcmUiCithNjgxYjRmNCBSZW5hbWUgUFJFX1ZQOCBzdGF0ZSB0byBXRUJQX0hFQURFUgorZWFkNGQ0NzggQWRkIGluY3JlbWVudGFsIHN1cHBvcnQgZm9yIGV4dGVuZGVkIGZvcm1hdCBmaWxlcworNjlkMGY5MjYgTWFrZWZpbGUudmM6IGhhdmUgJ2FsbCcgdGFyZ2V0IGJ1aWxkIGV2ZXJ5dGhpbmcKKzUyOTY3NDk4IE1ha2VmaWxlLnZjOiBmbGFncyBjbGVhbnVwCitjNjFiYWYwYyBNYWtlZmlsZS52YzogZHJvcCAvRkQgZmxhZworM2ExNTEyNWQgdXBkYXRlIGdpdGlnbm9yZQorNTE2N2NhNDcgTWVyZ2UgIldlYlBFbmNvZGU6IEFuIGFkZGl0aW9uYWwgY2hlY2suIFN0YXJ0IFZQOEVuY0xvb3AvVlA4RW5jVG9rZW5Mb29wIG9ubHkgaWYgVlA4RW5jU3RhcnRBbHBoYSBzdWNjZWVkZWQuIgorNjc3MDhkNjcgV2ViUEVuY29kZTogQW4gYWRkaXRpb25hbCBjaGVjay4gU3RhcnQgVlA4RW5jTG9vcC9WUDhFbmNUb2tlbkxvb3Agb25seSBpZiBWUDhFbmNTdGFydEFscGhhIHN1Y2NlZWRlZC4KK2I2ODkxMmFmIHBuZ2RlYzogQXZvaWQgYSBkb3VibGUtZnJlZS4KKzgyYWJiZTEyIE1lcmdlICJjb25maWd1cmUuYWM6IGFkZCBBTV9QUk9HX0FSIGZvciBhdXRvbWFrZSA+PSAxLjEyIgorZTdkOTU0OGMgYWRkIFdlYlBCbGVuZEFscGhhKCkgZnVuY3Rpb24gdG8gYmxlbmQgY29sb3JzIGFnYWluc3QgYmFja2dyb3VuZAorZWQ0ZGM3MTcgY29uZmlndXJlLmFjOiBhZGQgQU1fUFJPR19BUiBmb3IgYXV0b21ha2UgPj0gMS4xMgorZGY0YTQwNmQgTWVyZ2UgYnJhbmNoICcwLjMuMCcKKzFlMGQ0YjhjIFVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMy4wLXJjNywgdGFnOiB2MC4zLjApCitkNTJiNDA1ZCBDb3NtZXRpYyBmaXhlcworNmNiNGE2MTggbWlzYyBzdHlsZSBmaXgKKzY4MTExYWIwIGFkZCBtaXNzaW5nIFlVVkEtPkFSR0IgYXV0b21hdGljIGNvbnZlcnNpb24gaW4gV2ViUEVuY29kZSgpCitlOWE3OTkwYiBDb3NtZXRpYyBmaXhlcworNDAzYmZlODIgQ29udGFpbmVyIHNwZWM6IENsYXJpZnkgZnJhbWUgZGlzcG9zYWwKKzJhYWE0MjNiIE1lcmdlICJhZGQgbWlzc2luZyBZVVZBLT5BUkdCIGF1dG9tYXRpYyBjb252ZXJzaW9uIGluIFdlYlBFbmNvZGUoKSIKKzA3ZDg3YmRhIGFkZCBtaXNzaW5nIFlVVkEtPkFSR0IgYXV0b21hdGljIGNvbnZlcnNpb24gaW4gV2ViUEVuY29kZSgpCisxNDJjNDYyOSBtaXNjIHN0eWxlIGZpeAorM2U3YTEzYTAgTWVyZ2UgIkNvbnRhaW5lciBzcGVjOiBjbGFyaWZ5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZpZWxkIiBpbnRvIDAuMy4wCisxNGFmNzc0NSBjb250YWluZXIgZG9jOiBhZGQgYSBub3RlIGFib3V0IHRoZSAnQU5NRicgcGF5bG9hZAorY2M2MzVlZmEgQ29udGFpbmVyIHNwZWM6IGNsYXJpZnkgdGhlIGJhY2tncm91bmQgY29sb3IgZmllbGQKK2UzZTMzOTQ5IGNvbnRhaW5lciBkb2M6IG1vdmUgUklGRiBkZXNjcmlwdGlvbiB0byBvd24gc2VjdGlvbgorNDI5OWYzOTggbGlid2VicC9tdXg6IGZpeCBkb3VibGUgZnJlZQorMzNmOWE2OTIgTWVyZ2UgImRlbXV4OiBrZWVwIGEgZnJhbWUgdGFpbCBwb2ludGVyOyB1c2VkIGluIEFkZEZyYW1lIiBpbnRvIDAuMy4wCithMmE3Yjk1OSB1c2UgV2ViUERhdGFDb3B5KCkgaW5zdGVhZCBvZiByZS1jb2RpbmcgaXQuCis2ZjE4ZjEyZiBkZW11eDoga2VlcCBhIGZyYW1lIHRhaWwgcG9pbnRlcjsgdXNlZCBpbiBBZGRGcmFtZQorZTVhZjQ5ZTkgYWRkIGRvYyBwcmVjaXNpb24gYWJvdXQgV2ViUFBhcnNlSGVhZGVycygpIHJldHVybiBjb2RlcworZGI0NmRhYWIgTWVyZ2UgIk1ha2VmaWxlLnZjOiBmaXggZHluYW1pYyBidWlsZHMiIGludG8gMC4zLjAKKzUzYzc3YWZjIE1lcmdlICJnaWYyd2VicDogQmdjb2xvciBmaXggZm9yIGEgc3BlY2lhbCBjYXNlIiBpbnRvIDAuMy4wCithNWViZDE0MyBnaWYyd2VicDogQmdjb2xvciBmaXggZm9yIGEgc3BlY2lhbCBjYXNlCis2Mzc4ZjIzOCBNZXJnZSAidndlYnAvYW5pbWF0aW9uOiBmaXggYmFja2dyb3VuZCBkaXNwb3NlIiBpbnRvIDAuMy4wCiszYzhlYjlhOCBmaXggYmFkIHNhdHVyYXRpb24gb3JkZXIgaW4gUXVhbnRpemVCbG9jaworMDRjN2EyZWMgdndlYnAvYW5pbWF0aW9uOiBmaXggYmFja2dyb3VuZCBkaXNwb3NlCis4MWE1MDY5NSBNYWtlZmlsZS52YzogZml4IGR5bmFtaWMgYnVpbGRzCis1ZjI1YzM5NiB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjMuMC1yYzYpCisxNGQ0MmFmMiBleGFtcGxlczogZG9uJ3QgdXNlIEM5OSAlenUKKzVjY2YxZmU1IHVwZGF0ZSBDaGFuZ2VMb2cKKzI1NjBjMjQzIHVwZGF0ZSBORVdTCitmNDNiYWZjMyBNZXJnZSBjaGFuZ2VzIEllY2NjYjA5YyxJZjVlZTlmZDIsSTNlMTgxY2U0IGludG8gMC4zLjAKK2E3ODg2NDRmIGR3ZWJwOiB3YXJuIHdoZW4gZGVjb2RpbmcgYW5pbWF0ZWQgd2VicCdzCiszMDJlZmNkYiBEZWNvZGU6IHJldHVybiBtb3JlIG1lYW5pbmdmdWwgZXJyb3IgZm9yIGFuaW1hdGlvbgorYWQ0NTI3MzUgV2ViUEJpdHN0cmVhbUZlYXR1cmVzOiBhZGQgaGFzX2FuaW1hdGlvbiBmaWVsZAorNzgzZGZhNDkgZGlzYWJsZSBGUkdNIGRlY29kaW5nIGZvciBnb29kIGluIGxpYndlYnBtdXgKKzRiOTU2YmUwIFVwZGF0ZSBDaGFuZ2VMb2cKK2FkOGI4NmQ3IHVwZGF0ZSBORVdTCiszZTA4NGY2MyBNZXJnZSAiZGVtdXggY29zbWV0aWNzOiBjb21tZW50cy9yZW5hbWUgaW50ZXJuYWwgZnVuY3Rpb24iIGludG8gMC4zLjAKK2QzZjhjNjIxIE1lcmdlICJtb3ZlIFdlYlBGZWF0dXJlRmxhZ3MgZGVjbGFyYXRpb24iIGludG8gMC4zLjAKKzczODZmZTUwIE1lcmdlICJsaWJ3ZWJwe2RlbXV4LG11eH06IGluc3RhbGwgbXV4X3R5cGVzLmgiIGludG8gMC4zLjAKK2Q2Y2Q0ZTkwIE1lcmdlICJidW1wIGRlY29kZSBhYmkiIGludG8gMC4zLjAKKzE3ZjhkYTVjIGJ1bXAgZGVjb2RlIGFiaQorOTc2ODRhZTIgTWVyZ2UgImFkZCBkb2MgcHJlY2lzaW9uIGFib3V0IFdlYlBEZW11eFBhcnRpYWwoKSIgaW50byAwLjMuMAorZjkzM2ZkMmEgbW92ZSBXZWJQRmVhdHVyZUZsYWdzIGRlY2xhcmF0aW9uCisyODliYzQ3YiBsaWJ3ZWJwe2RlbXV4LG11eH06IGluc3RhbGwgbXV4X3R5cGVzLmgKKzIyNGU4ZDQ2IGFkZCBkb2MgcHJlY2lzaW9uIGFib3V0IFdlYlBEZW11eFBhcnRpYWwoKQorNGMxOGU4MGMgZGVtdXggY29zbWV0aWNzOiBjb21tZW50cy9yZW5hbWUgaW50ZXJuYWwgZnVuY3Rpb24KKzdjZmQxYmYxIHVwZGF0ZSBBVVRIT1JTCis0MDFmN2I4NSBNZXJnZSAic3BlZWQtdXAgbG9zc2xlc3MgKH4zJSkgd2l0aCBhZC1ob2MgaGlzdG9ncmFtIGNvc3QgZXZhbHVhdGlvbiIgaW50byAwLjMuMAorMWZjOGZmY2EgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IGRpc3QgcmVsYXRlZCBjaGFuZ2VzIiBpbnRvIDAuMy4wCis4YTg5YzZlZCBNZXJnZSBjaGFuZ2VzIEk0NjZjMzc3ZixJYjc2MWViZDMsSTY5NDg1N2ZjIGludG8gMC4zLjAKK2Y0ZmZiMmQ1IHNwZWVkLXVwIGxvc3NsZXNzICh+MyUpIHdpdGggYWQtaG9jIGhpc3RvZ3JhbSBjb3N0IGV2YWx1YXRpb24KKzcyMzg0N2Q1IGdpZjJ3ZWJwOiBvbmx5IHdyaXRlIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVycgorNzAxYjllMmEgbWFrZWZpbGUudW5peDogZGlzdCByZWxhdGVkIGNoYW5nZXMKK2JiODViNDM3IE1lcmdlICJ1cGRhdGUgTkVXUyIgaW50byAwLjMuMAorNTk0MjNhMjQgZ2lmMndlYnA6IGZpeCBjcmFzaCBvbiBvcGVuIGZhaWx1cmUgd2l0aCBsaWJnaWY1Cis5YWNiMTdkZSBnaWYyd2VicDogc2lsZW5jZSBhIHVudXNlZCBwYXJhbSB3YXJuaW5nCis3ZDlmZGMyMyBNZXJnZSAiUkVBRE1FIHVwZGF0ZXMiIGludG8gMC4zLjAKKzU2MjE5MzRlIE1lcmdlICJidWlsZDogZml4IGluc3RhbGwgcmFjZSBvbiBzaGFyZWQgaGVhZGVycyIgaW50byAwLjMuMAorNzA4MDlkODkgTWVyZ2UgImJ1bXAgdmVyc2lvbiB0byAwLjMuMCIgaW50byAwLjMuMAorZDg1MWNkMWQgZGVtdXg6IG1ha2UgdGhlIHBhcnNlIGEgYml0IG1vcmUgc3RyaWN0CisyOGJiNDEwNyB1cGRhdGUgTkVXUworY2VmOTM4ODIgYnVtcCB2ZXJzaW9uIHRvIDAuMy4wCis5MDQ4NDk0ZCBidWlsZDogZml4IGluc3RhbGwgcmFjZSBvbiBzaGFyZWQgaGVhZGVycworMWU2N2U4ZWYgUkVBRE1FIHVwZGF0ZXMKKzQyYjYxMWE0IE1lcmdlICJjb25maWd1cmU6IGRyb3AgZXhwZXJpbWVudGFsIGZyb20gbXV4L2RlbXV4IiBpbnRvIDAuMy4wCiswOTZhOGUzMiBNZXJnZSAidndlYnA6IGFkZCBjb2xvciBwcm9maWxlIHN1cHBvcnQiIGludG8gMC4zLjAKK2RkZmVlNWRjIHZ3ZWJwOiBhZGQgY29sb3IgcHJvZmlsZSBzdXBwb3J0CiswZDY5MjdkMyBNZXJnZSAiTWFyayBmcmFnbWVudCBvcHRpb25zIGFzIGV4cGVyaW1lbnRhbCBpbiB3ZWJwbXV4IiBpbnRvIDAuMy4wCis1ZGJkNDAzMCBNYXJrIGZyYWdtZW50IG9wdGlvbnMgYXMgZXhwZXJpbWVudGFsIGluIHdlYnBtdXgKK2EwYTY2NDhjIGNvbmZpZ3VyZTogZHJvcCBleHBlcmltZW50YWwgZnJvbSBtdXgvZGVtdXgKK2VlNjViYWQ4IE1lcmdlICJhZGQgc3VwcG9ydCBmb3IgQklUUyA+IDMyIiBpbnRvIDAuMy4wCis3NDQ5MzBkYiBhZGQgc3VwcG9ydCBmb3IgQklUUyA+IDMyCis3ZGQyODhmMCBjd2VicDogZml4IGJ1aWxkCisxOWE4ZGQwMSBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCB2d2VicC5leGUgdGFyZ2V0IiBpbnRvIDAuMy4wCis1MGVlZGRhZCBNZXJnZSAiZXhhbXBsZXM6IG5vcm1hbGl6ZSBpY2MgcmVsYXRlZCBwcm9ncmFtIGFyZ3VtZW50cyIgaW50byAwLjMuMAorNzU3ZjYzN2YgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgbGlid2VicGRlY29kZXIgdGFyZ2V0IiBpbnRvIDAuMy4wCitiNjVjNGI3YyBNYWtlZmlsZS52YzogYWRkIGxpYndlYnBkZWNvZGVyIHRhcmdldAorZjhkYjdiNGEgTWVyZ2UgInZ3ZWJwOiByZXBsYWNlIGRvdWJsZXMgdy9mbG9hdHMgd2hlcmUgYXBwcm9wcmlhdGUiIGludG8gMC4zLjAKK2Q5OWFhNTZmIE1ha2VmaWxlLnZjOiBhZGQgdndlYnAuZXhlIHRhcmdldAorMDEzMDIzZTcgdndlYnA6IHJlcGxhY2UgZG91YmxlcyB3L2Zsb2F0cyB3aGVyZSBhcHByb3ByaWF0ZQorOWIzZGI4OTQgUkVBRE1FLm11eDogYWRkIHZlcnNpb24gcmVmZXJlbmNlCis3YjZhMjZjZiBNZXJnZSAiY3dlYnA6IG91dHB1dCBtZXRhZGF0YSBzdGF0aXN0aWNzIiBpbnRvIDAuMy4wCitkOGRjNzJhMCBleGFtcGxlczogbm9ybWFsaXplIGljYyByZWxhdGVkIHByb2dyYW0gYXJndW1lbnRzCis3YmZjOTA1NiBNZXJnZSAibWFrZSBhbHBoYSB1bmZpbHRlciB3b3JrIGluLXBsYWNlIiBpbnRvIDAuMy4wCiswMDM3YjJkMiBNZXJnZSAiYWRkIExVVC1mcmVlIHJlZmVyZW5jZSBjb2RlIGZvciBZVVYtPlJHQiBjb252ZXJzaW9uLiIgaW50byAwLjMuMAorMTY2YmY3NDQgTWVyZ2UgImRlbXV4OiBkaXNhYmxlIGZyYWdtZW50IHBhcnNpbmciIGludG8gMC4zLjAKKzEyNjk3NGI0IGFkZCBMVVQtZnJlZSByZWZlcmVuY2UgY29kZSBmb3IgWVVWLT5SR0IgY29udmVyc2lvbi4KKzBhZWYzZWJkIG1ha2UgYWxwaGEgdW5maWx0ZXIgd29yayBpbi1wbGFjZQorMTRlZjUwMDUgTWVyZ2UgIlJlbW92ZSAnc3RhdHVzOiBleHBlcmltZW50YWwnIGZyb20gY29udGFpbmVyIHNwZWMiIGludG8gMC4zLjAKK2Q0MGM5OGUxIE1lcmdlICJ3ZWJwbXV4IGJpbmFyeTogdGlueSBzdHlsZSBmaXgiIGludG8gMC4zLjAKKzBiYzQyNjg5IGN3ZWJwOiBvdXRwdXQgbWV0YWRhdGEgc3RhdGlzdGljcworYmMwMzk4MDMgTWVyZ2UgImF1dG9jb25mOiBub3JtYWxpemUgZXhwZXJpbWVudGFsIGRlZmluZSIgaW50byAwLjMuMAorZDFlMjFiMTMgUmVtb3ZlICdzdGF0dXM6IGV4cGVyaW1lbnRhbCcgZnJvbSBjb250YWluZXIgc3BlYworNzY4MWJiOTYgd2VicG11eCBiaW5hcnk6IHRpbnkgc3R5bGUgZml4CithM2RkM2QwZiBhdm9pZCBpbnN0YWxsaW5nIGV4YW1wbGVfdXRpbC5oCisyNTIzMjBlMiBkZW11eDogZGlzYWJsZSBmcmFnbWVudCBwYXJzaW5nCis1MzdiZGUwNSBhdXRvY29uZjogbm9ybWFsaXplIGV4cGVyaW1lbnRhbCBkZWZpbmUKKzVlMzM4ZTBiIE1lcmdlIGNoYW5nZXMgSTMzZThhNjEzLEk4ZThhN2I0NCBpbnRvIDAuMy4wCitkOWQwZWExYiBNZXJnZSBjaGFuZ2VzIElmMjFlM2VjNyxJOTkxZmMzMGIgaW50byAwLjMuMAorNjI3ZjVjYTYgYXV0b21ha2U6IGFkZCByZWZlcmVuY2UgdG8gbGlid2VicCBmb3IgbXV4L2RlbXV4CitlZWY3M2QwNyBkb24ndCBjb25zb2xpZGF0ZSBwcm9iYSBzdGF0cyB0b28gb2Z0ZW4KKzA1ZWM0Y2MyIGxpYndlYnB7LGRlY29kZXJ9LnBjOiBhZGQgcHRocmVhZCBmbGFncworMWJmY2Y1YmYgYWRkIGxpYndlYnBtdXgucGMKKzI2Y2E4NDNkIGFkZCBsaWJ3ZWJwZGVtdXgucGMKKzY5ZTI1OTA2IE1lcmdlICJUdW5lIExvc3NsZXNzIGNvbXByZXNzaW9uIGZvciBsb3dlciBxdWFsaXRpZXMuIgorMDQ3OGI1ZDIgVHVuZSBMb3NzbGVzcyBjb21wcmVzc2lvbiBmb3IgbG93ZXIgcXVhbGl0aWVzLgorMzlmNzU4NmYgYWRkIGEgbWVudGlvbiBvZiBwYXJhbGxlbCBhbHBoYSBlbmNvZGluZyBpbiB0aGUgTkVXUworNWEyMWQ5NjcgTWVyZ2UgIjEuNXgtMnggZmFzdGVyIGVuY29kaW5nIGZvciBtZXRob2QgMyBhbmQgdXAiCis5YmZiZGQxNCAxLjV4LTJ4IGZhc3RlciBlbmNvZGluZyBmb3IgbWV0aG9kIDMgYW5kIHVwCisyN2RjNzQxYiBDb3JyZWN0IGZyYW1lIG9wdGlvbnMgb3JkZXIgaW4gUkVBRE1FLm11eAorYmUyZmQxNzMgTXV4OiBmaXggYSBzY2VuYXJpbyB3aXRoIGJhZCBBTk1GL0ZSR00gc2l6ZQorMTllYjAxMmMgTWVyZ2UgIkRlbXV4OiBBZGQgb3B0aW9uIHRvIGdldCBmcmFtZSBjb3VudCB1c2luZyBHZXRJKCkiCis3MzY4YjhjYiBNZXJnZSAiV2ViUEdldEZlYXR1cmVzKCkgb3V0IG9mIGlmIGNvbmRpdGlvbiBmb3IgY2xhcml0eS4iCitmNjA0YzlhNCBNZXJnZSAiZml4IHdpbmRvd3MgYnVpbGQiCisxNTNmOTRlOCBmaXggd2luZG93cyBidWlsZAorODQ3YjQ5MjQgTWVyZ2UgInZ3ZWJwOiB1c2UgbWFnZW50YSBmb3IgJ2knbmZvIGRpc3BsYXkiCisyNWVhNDZiZCBNZXJnZSAidndlYnA6IGFkZCBrZXlib2FyZCBzaG9ydGN1dHMgdG8gaGVscCBvdXRwdXQiCitiZWE3Y2NhZiB2d2VicDogdXNlIG1hZ2VudGEgZm9yICdpJ25mbyBkaXNwbGF5Cis4ZmFiMTYxYSB3ZWJwbXV4OiBjb3JyZWN0IC1mcmFtZSBwYXJhbSBvcmRlciBpbiBoZWxwIG91dHB1dAorMDNjYzIzZDYgdndlYnA6IGFkZCBrZXlib2FyZCBzaG9ydGN1dHMgdG8gaGVscCBvdXRwdXQKKzA2OGViYThkIERlbXV4OiBBZGQgb3B0aW9uIHRvIGdldCBmcmFtZSBjb3VudCB1c2luZyBHZXRJKCkKKzk4OGI4ZjU2IFdlYlBHZXRGZWF0dXJlcygpIG91dCBvZiBpZiBjb25kaXRpb24gZm9yIGNsYXJpdHkuCis2OTMzZDkxMCBNZXJnZSAiZ2lmMndlYnA6IEJlIGxlbmllbnQgYWJvdXQgYmFja2dyb3VuZCBjb2xvciBpbmRleC4iCis0ZDBmN2M1NSBNZXJnZSAiV2ViUEdldEZlYXR1cmVzKCkgYmVoYXZpb3IgY2hhbmdlOiIKK2ZkZWViMDFkIGdpZjJ3ZWJwOiBCZSBsZW5pZW50IGFib3V0IGJhY2tncm91bmQgY29sb3IgaW5kZXguCithZDI1MDMyMCBNZXJnZSAibXVsdGktdGhyZWFkZWQgYWxwaGEgZW5jb2RpbmcgZm9yIGxvc3N5IgorNGUzMmQzZTEgTWVyZ2UgImZpeCBjb21waWxhdGlvbiBvZiB0b2tlbi5jIgorZjgxNzkzMGEgbXVsdGktdGhyZWFkZWQgYWxwaGEgZW5jb2RpbmcgZm9yIGxvc3N5Cis4ODA1MDM1MSBmaXggY29tcGlsYXRpb24gb2YgdG9rZW4uYworZmM4MTYyMTkgY29kZSB1c2luZyB0aGUgYWN0dWFsIHZhbHVlcyBmb3IgbnVtX3BhcnRzXywgbm90IHRoZSBvbmVzIGZyb20gY29uZmlnCis3MjY1NTM1MCBNZXJnZSAibW92ZSB0aGUgY29uZmlnIGNoZWNrIGZyb20gLmMgdG8gLmgiCitkZDllNzZmNyBtb3ZlIHRoZSBjb25maWcgY2hlY2sgZnJvbSAuYyB0byAuaAorOTU2YjIxN2EgV2ViUEdldEZlYXR1cmVzKCkgYmVoYXZpb3IgY2hhbmdlOgorZGYwMmU0Y2UgV2ViUERlbXV4R2V0SSBiZWhhdmlvciBjaGFuZ2U6Cis2MzNjMDA0ZCBNZXJnZSAicmViYWxhbmNlIG1ldGhvZCB0b29scyAoLW0pIGZvciBtZXRob2RzIFswLi40XSIKKzU4Y2E2ZjY1IHJlYmFsYW5jZSBtZXRob2QgdG9vbHMgKC1tKSBmb3IgbWV0aG9kcyBbMC4uNF0KKzc2NDhjM2NjIE1lcmdlICJkZXNjcmliZSByZC1vcHQgbGV2ZWxzIGludHJvZHVjZSBWUDhSRExldmVsIGVudW0iCis2N2ZiMTAwMyBNZXJnZSAiYXV0b2NvbmY6IGVuYWJsZSBzaWxlbnQtcnVsZXMgYnkgZGVmYXVsdCIKK2E1MDQyYTMyIEdldFZlcnNpb24oKSBtZXRob2RzIGZvciBtdXggYW5kIGRlbXV4Cis1MTg5OTU3ZSBkZXNjcmliZSByZC1vcHQgbGV2ZWxzIGludHJvZHVjZSBWUDhSRExldmVsIGVudW0KKzRlMDk0YWNlIGF1dG9jb25mOiBlbmFibGUgc2lsZW50LXJ1bGVzIGJ5IGRlZmF1bHQKK2I3ZWFhODVkIGlubGluZSBWUDhMRmFzdExvZzIoKSBhbmQgVlA4TEZhc3RTTG9nMiBmb3Igc21hbGwgdmFsdWVzCis1Y2Y3NzkyZSBzcGxpdCBxdWFudF9sZXZlbHMuYyBpbnRvIGRlY29kZXIgYW5kIGVuY29kZXIgdmVyc2lvbgorZTVkM2ZmZTIgTWVyZ2UgIlVwZGF0ZSBjb2RlIGV4YW1wbGUgaW4gUkVBRE1FLm11eCIKK2FjNWE5MTU2IFVwZGF0ZSBjb2RlIGV4YW1wbGUgaW4gUkVBRE1FLm11eAorMzhhOTFlOTkgQWRkIGV4YW1wbGUgY29kZSBzbmlwcGV0IGZvciBkZW11eCBBUEkKKzVmNTU3ZjNjIFJFQURNRS5tdXg6IGFkZCBpbmZvIGFib3V0IERlbXV4IEFQSSBhbmQgdndlYnAKK2MwYmEwOTAzIGJhY2t3YXJkX3JlZmVyZW5jZXM6IGF2b2lkIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93Cis5NDMzODZkYiBkaXNhYmxlIFNTRTIgZm9yIG5vdworOTQ3OWZiN2QgbG9zc2xlc3MgZW5jb2Rpbmcgc3BlZWR1cAorZWMyMDMwYTggbWVyZ2UgdHdvIGxpbmVzIHRvZ2V0aGVyCitiNjc5NTZjMCBNZXJnZSAiUmVtb3ZlIFJlYWRPbmVCaXQoKSBhbmQgUmVhZFN5bWJvbFVuc2FmZSgpIgorMTY2N2JkZWQgUmVtb3ZlIFJlYWRPbmVCaXQoKSBhbmQgUmVhZFN5bWJvbFVuc2FmZSgpCiszMTUxNjY5YiB3aWNkZWMgKyBkd2VicCBjb3NtZXRpY3M6IG5vcm1hbGl6ZSBmb3JtYXR0aW5nCis5MjY2OGRhNiBjaGFuZ2UgZGVmYXVsdCBmaWx0ZXJpbmcgcGFyYW1ldGVyczogICAqIHR5cGUgaXMgbm93ICdzdHJvbmcnICAgKiBzdHJlbmd0aCBpcyBub3cgJzYwJworYjc0OTBmODUgaW50cm9kdWNlIFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OIGNvbXBpbGUgb3B0aW9uCiszMzgzODg1NyBmYXN0ZXIgZGVjb2RpbmcgKDMlLTYlKQorNWMzZTM4MWIgTWVyZ2UgImFkZCBhIC1qcGVnX2xpa2Ugb3B0aW9uIgorYzIzMTEwNDYgcmVtb3ZlIHVudXNlZCBkZWNsYXJhdGlvbiBvZiBWUDhaaWd6YWcKKzM2MTUyOTU3IE1lcmdlICJ3aWNkZWM6IGFkZCBhbHBoYSBzdXBwb3J0IGZvciBwYWxldHRlZCBmb3JtYXRzIgorYzlmMTY0OTAgd2ljZGVjOiBhZGQgYWxwaGEgc3VwcG9ydCBmb3IgcGFsZXR0ZWQgZm9ybWF0cworMTI2MmY4MWUgTWVyZ2UgIndpY2RlYzogc2lsZW5jZSBzb21lIHdhcm5pbmdzIgorZTdlYTYxZWIgd2ljZGVjOiBzaWxlbmNlIHNvbWUgd2FybmluZ3MKKzIzYzBmMzU0IGZpeCBtaXNzaW5nIGludHB0cl90LT5pbnQgY2FzdCBmb3IgTVNWQworZTg5NTA1OWEgYWRkIGEgLWpwZWdfbGlrZSBvcHRpb24KKzFmODAzZjY0IE1lcmdlICJUdW5lIGFscGhhIHF1YWxpdHkgbWFwcGluZyB0byBtb3JlIHJlYXNvbmFibGUgdmFsdWVzLiIKKzEyNjdkNDk4IFR1bmUgYWxwaGEgcXVhbGl0eSBtYXBwaW5nIHRvIG1vcmUgcmVhc29uYWJsZSB2YWx1ZXMuCiswNDMwNzZlMiBNZXJnZSAic3BlZWQtdXAgbG9zc2xlc3MgaW4gQmFja3dhcmRUcmFjZSIKK2YzYTQ0ZGNkIHJlbW92ZSBvbmUgbWFsbG9jIGZyb20gVHJhY2VCYWNrd2FyZHMoKQorMGZjMWEzYTAgc3BlZWQtdXAgbG9zc2xlc3MgaW4gQmFja3dhcmRUcmFjZQorN2M3MzJlNTkgY3dlYnA6IGNlbnRyYWxpemUgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoKQorNzM4MTI1NGUgTWVyZ2UgIndpY2RlYzogYWRkIElDQyBwcm9maWxlIGV4dHJhY3Rpb24iCitlODNmZjdkZSB3aWNkZWM6IGFkZCBJQ0MgcHJvZmlsZSBleHRyYWN0aW9uCisxNDZjNmUzYiBNZXJnZSAiY29zbWV0aWNzOiBwbmdkZWM6IG5vcm1hbGl6ZSBkZWZhdWx0IGxhYmVsIGxvY2F0aW9uIgorYThmNTQ5ZDcgTWVyZ2UgIm1hbnBhZ2VzOiBpdGFsaWNpemUgb3B0aW9uIHBhcmFtZXRlcnMiCitlMTE4ZGI4MyBNZXJnZSAiZW5jb2RlLmg6IG5vdGUgdGhlIG5lZWQgdG8gZnJlZSgpIFdlYlBNZW1vcnlXcml0ZXIiCisxZGZlZTZkYiBjb3NtZXRpY3M6IHBuZ2RlYzogbm9ybWFsaXplIGRlZmF1bHQgbGFiZWwgbG9jYXRpb24KKzE0YzM4MjAwIG1hbnBhZ2VzOiBpdGFsaWNpemUgb3B0aW9uIHBhcmFtZXRlcnMKKzdkZWZiZmFkIGVuY29kZS5oOiBub3RlIHRoZSBuZWVkIHRvIGZyZWUoKSBXZWJQTWVtb3J5V3JpdGVyCis4OGQzODJhMCBjd2VicDogY2xlYW51cCBhZnRlciBtZW1vcnlfd3JpdGVyCisxMmQ2Y2VjZiBmaXggZXh0cmEgc3BhY2UgaW4gZHdlYnAuMSBtYW4KK2IwMTY4MWE5IEZpeCBmb3IgZGVtdXhlciBmcmFtZSBpdGVyYXRpb246Cis1NmMxMmFhNiBEZW11eGVyIGNyZWF0aW9uIGZpeDoKKzY2YzgxMGJjIGFkZCBhIC15dXYgb3B0aW9uIHRvIGR3ZWJwICh2ZXJ5IHNpbWlsYXIgdG8gLXBnbSkKKzg0MWEzYmE1IE1lcmdlICJSZW1vdmUgLVdzaGFkb3cgd2FybmluZ3MuIgorOGZkMDI1MjcgTWVyZ2UgInVwc2FtcGxpbmdfbmVvbi5jOiBmaXggYnVpbGQiCis2ZWZlZDI2OCBSZW1vdmUgLVdzaGFkb3cgd2FybmluZ3MuCis2MDkwNGFhNiBNZXJnZSAiYWxsb3cgV2ViUElOZXdSR0IvWVVWQSB0byBiZSBwYXNzZWQgYSBOVUxMIG91dHB1dCBidWZmZXIuIgorYjdhZGYzNzYgYWxsb3cgV2ViUElOZXdSR0IvWVVWQSB0byBiZSBwYXNzZWQgYSBOVUxMIG91dHB1dCBidWZmZXIuCisyN2Y4Zjc0MiB1cHNhbXBsaW5nX25lb24uYzogZml4IGJ1aWxkCiswNmI5Y2RmMSBnaXRpZ25vcmU6IGFkZCBJT1MgcmVsYXRlZCBkaXJlY3RvcmllcworZjExMjIyMWUgTWVyZ2UgIkZpeCBtb3JlIGNvbW1lbnRzIGZvciBpb2J1aWxkLnNoIgorZmU0ZDI1ZGQgRml4IG1vcmUgY29tbWVudHMgZm9yIGlvYnVpbGQuc2gKKzFkZTNlMjUyIE1lcmdlICJORU9OIG9wdGltaXNlZCB5dXYgdG8gcmdiIGNvbnZlcnNpb24iCiswOTBiNzA4YSBORU9OIG9wdGltaXNlZCB5dXYgdG8gcmdiIGNvbnZlcnNpb24KK2RhYTA2NDc2IE1lcmdlICJBZGQgaW9zIGJ1aWxkIHNjcmlwdCBmb3IgYnVpbGRpbmcgaU9TIGxpYnJhcnkuIgorNzlmZTM5ZTIgQWRkIGlvcyBidWlsZCBzY3JpcHQgZm9yIGJ1aWxkaW5nIGlPUyBsaWJyYXJ5LgorMTI2YzAzNWYgcmVtb3ZlIHNvbWUgbW9yZSAtV3NoYWRvdyB3YXJuaW5ncworNTIyZTlkNjEgTWVyZ2UgImN3ZWJwOiBlbmFibGUgJy1tZXRhZGF0YSciCis3NmVjNWZhMSBjd2VicDogZW5hYmxlICctbWV0YWRhdGEnCithZWI5MWE5ZCBNZXJnZSAiY29zbWV0aWNzOiBicmVhayBhIGZldyBsb25nIGxpbmVzIgorYmU3Yzk2YjAgY29zbWV0aWNzOiBicmVhayBhIGZldyBsb25nIGxpbmVzCitjZmY4ZGRiNiBNZXJnZSAiYWRkIGxpYndlYnBkZWNvZGVyLnBjIgorOTMxNDhhYjggTWVyZ2UgImxpYndlYnAucGMuaW46IGRldGFiIgorNjQ3N2Y5NTUgTWVyZ2UgIk1ha2VmaWxlLnZjOiBub3JtYWxpemUgcGF0aCBzZXBhcmF0b3IiCitiZWQxZWQ3YyBhZGQgbGlid2VicGRlY29kZXIucGMKKzQ2MTY4YjJkIGxpYndlYnAucGMuaW46IGRldGFiCithOTQxYTM0NiBGaXhlZCBmZXcgbml0cyBpbiB0aGUgYnVpbGQgZmlsZXMuCitkZDdhNDliMiBNYWtlZmlsZS52Yzogbm9ybWFsaXplIHBhdGggc2VwYXJhdG9yCis5MTYxYmU4NiBNZXJnZSAiY3dlYnA6IGV4dHJhY3QgV0lDIGRlY29kaW5nIHRvIGl0cyBvd24gbW9kdWxlIgorMDhlN2M1OGUgTWVyZ2UgIlByb3ZpZGUgYW4gb3B0aW9uIHRvIGJ1aWxkIGRlY29kZXIgbGlicmFyeS4iCiswYWViYTUyOCBQcm92aWRlIGFuIG9wdGlvbiB0byBidWlsZCBkZWNvZGVyIGxpYnJhcnkuCis3NTdlYmNiMSBjYXRjaCBtYWxsb2MoMCkvY2FsbG9jKDApIHdpdGggYW4gYXNzZXJ0CisxNTJlYzNkMiBNZXJnZSAiaGFuZGxlIG1hbGxvYygwKSBhbmQgY2FsbG9jKDApIHVuaWZvcm1seSBvbiBhbGwgcGxhdGZvcm1zIgorYTQ1MmE1NTUgY3dlYnA6IGV4dHJhY3QgV0lDIGRlY29kaW5nIHRvIGl0cyBvd24gbW9kdWxlCisyYjI1MmE1MyBNZXJnZSAiUHJvdmlkZSBvcHRpb24gdG8gc3dhcCBieXRlcyBmb3IgMTYgYml0IGNvbG9ybW9kZXMiCis5NGE0OGI0YiBQcm92aWRlIG9wdGlvbiB0byBzd2FwIGJ5dGVzIGZvciAxNiBiaXQgY29sb3Jtb2RlcworNDJmOGY5MzQgaGFuZGxlIG1hbGxvYygwKSBhbmQgY2FsbG9jKDApIHVuaWZvcm1seSBvbiBhbGwgcGxhdGZvcm1zCis4YjIxNTJjNSBNZXJnZSAiYWRkIGFuIGV4dHJhIGFzc2VydCB0byBjaGVjayBtZW1vcnkgYm91bmRzIgorMGQxOWZiZmYgcmVtb3ZlIHNvbWUgLVdzaGFkb3cgd2FybmluZ3MKK2NkMjJmNjU1IGFkZCBhbiBleHRyYSBhc3NlcnQgdG8gY2hlY2sgbWVtb3J5IGJvdW5kcworODE4OWZlZGEgTWVyZ2UgIkFkZCBkZXRhaWxzIGFuZCByZWZlcmVuY2UgYWJvdXQgdGhlIFlVVi0+UkdCIGNvbnZlcnNpb24iCisxZDI3MDJiMSBNZXJnZSAiRm9ybWF0dGluZyBmaXhlcyBpbiBsb3NzbGVzcyBiaXRzdHJlYW0gc3BlYyIKKzg0MjVhYWVlIEZvcm1hdHRpbmcgZml4ZXMgaW4gbG9zc2xlc3MgYml0c3RyZWFtIHNwZWMKK2E1NTZjYjFhIEFkZCBkZXRhaWxzIGFuZCByZWZlcmVuY2UgYWJvdXQgdGhlIFlVVi0+UkdCIGNvbnZlcnNpb24KK2Q4ZjIxZTBiIGFkZCBsaW5rIHRvIFNTSU0gZGVzY3JpcHRpb24gb24gV2lraXBlZGlhCisxOGU5MTY3ZSBNZXJnZSAiV2ViUC1sb3NzbGVzcyBzcGVjIGNsYXJpZmljYXRpb25zOiIKKzk4ZTI1YjliIE1lcmdlICJjd2VicDogYWRkIC1tZXRhZGF0YSBvcHRpb24iCitmMDFjMmE1MyBXZWJQLWxvc3NsZXNzIHNwZWMgY2xhcmlmaWNhdGlvbnM6CitmNGE5Nzk3MCBNZXJnZSAiRGlzdG80eDQgYW5kIERpc3RvMTZ4MTYgaW4gTkVPTiIKKzQ3YjdiMGJhIERpc3RvNHg0IGFuZCBEaXN0bzE2eDE2IGluIE5FT04KKzdlYWVlOWYxIGN3ZWJwOiBhZGQgLW1ldGFkYXRhIG9wdGlvbgorMzZjNTJjMmMgdGlmZmRlYzogdXNlIHRvZmZfdCBmb3IgZXhpZiBpZmQgb2Zmc2V0Cis3YzgxMTFlNCBNZXJnZSAiY3dlYnAvdGlmZmRlYzogYWRkIFRJRkYgbWV0YWRhdGEgZXh0cmFjdGlvbiIKK2U2NDA5YWRjIFJlbW92ZSByZWR1bmRhbnQgaW5jbHVkZSBmcm9tIGRzcC9sb3NzbGVzcyBjb2RlLgorMWFiNWIzYTcgTWVyZ2UgImNvbmZpZ3VyZTogZml4IC0td2l0aC1naWZpbmNsdWRlZGlyIgorMDNjNzQ5ZWIgY29uZmlndXJlOiBmaXggLS13aXRoLWdpZmluY2x1ZGVkaXIKKzhiNjUwNjM1IG11bHRpcGxlIGxpYmdpZiB2ZXJzaW9ucyBzdXBwb3J0IGZvciBnaWYyd2VicAorNDc2ZTI5M2YgZ2lmMndlYnA6IFVzZSBER2lmT3BlbkZpbGVOYW1lKCkKK2I1MGYyNzdiIHRpZmZkZWM6IGNvcnJlY3QgZm9ybWF0IHN0cmluZworMmI5MDQ4ZTMgTWVyZ2UgInRpZmZkZWM6IGNoZWNrIGVycm9yIHJldHVybnMgZm9yIHdpZHRoL2hlaWdodCIKK2ExYjVhOWEzIE1lcmdlICJjd2VicC90aWZmOiB1c2UgdGhlIGZpcnN0IGltYWdlIGRpcmVjdG9yeSIKKzA3OTQyM2Y1IHRpZmZkZWM6IGNoZWNrIGVycm9yIHJldHVybnMgZm9yIHdpZHRoL2hlaWdodAorZDYyODI0YWYgTWVyZ2UgImN3ZWJwL2pwZWdkZWM6IGFkZCBKUEVHIG1ldGFkYXRhIGV4dHJhY3Rpb24iCiswM2FmYWNhNCBNZXJnZSAiY3dlYnA6IGFkZCBQTkcgbWV0YWRhdGEgZXh0cmFjdGlvbiIKKzJjNzI0OTY4IGN3ZWJwL2pwZWdkZWM6IGFkZCBKUEVHIG1ldGFkYXRhIGV4dHJhY3Rpb24KK2RiYTY0ZDkxIGN3ZWJwOiBhZGQgUE5HIG1ldGFkYXRhIGV4dHJhY3Rpb24KKzFmMDc1Zjg5IExvc3NsZXNzIHNwZWMgY29ycmVjdGlvbnMvcmV3b3JkaW5nL2NsYXJpZmljYXRpb25zCisyOTE0ZWNmZCBjd2VicC90aWZmZGVjOiBhZGQgVElGRiBtZXRhZGF0YSBleHRyYWN0aW9uCitkODJhM2UzMyBNb3JlIGNvcnJlY3Rpb25zL2NsYXJpZmljYXRpb25zIGluIGxvc3NsZXNzIHNwZWM6CitiZDAwMjU1NyBjd2VicC90aWZmOiB1c2UgdGhlIGZpcnN0IGltYWdlIGRpcmVjdG9yeQorZGY3YWEwNzYgTWVyZ2UgIkNsZWFudXAgYXJvdW5kIGpwZWdkZWMiCiswZjU3ZGNjMyBkZWNvZGluZyBzcGVlZC11cCAofjElKQorYmNlYzMzOWIgTG9zc2xlc3MgYml0c3RyZWFtIGNsYXJpZmljYXRpb246Cis2YmYyMDg3NCBhZGQgZXhhbXBsZXMvbWV0YWRhdGEuYworMjA3Zjg5YzAgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIGxpYndlYnBkZW11eCBzdGF0dXMgdG8gc3VtbWFyeSIKKzFiZDI4N2E2IENsZWFudXAgYXJvdW5kIGpwZWdkZWMKKzkxNDU1Njc5IE1lcmdlICJjb3NtZXRpY3M6IHVzZSAnPT0gMCcgaW4gc2l6ZSBjaGVja3MiCitkNmI4OGI3NiBjb3NtZXRpY3M6IHVzZSAnPT0gMCcgaW4gc2l6ZSBjaGVja3MKK2QzZGFjZTJmIGNvc21ldGljczoganBlZ2RlYworMmY2OWFmNzMgY29uZmlndXJlOiBhZGQgbGlid2VicGRlbXV4IHN0YXR1cyB0byBzdW1tYXJ5CisxYzFjNTY0NiBjd2VicDogZXh0cmFjdCB0aWZmIGRlY29kaW5nIHRvIGl0cyBvd24gbW9kdWxlCis2YTg3MWQ2NiBjd2VicDogZXh0cmFjdCBqcGVnIGRlY29kaW5nIHRvIGl0cyBvd24gbW9kdWxlCisyZWUyMjhmOSBjd2VicDogZXh0cmFjdCBwbmcgZGVjb2RpbmcgdG8gaXRzIG93biBtb2R1bGUKKzQ2NzlkYjAwIE1lcmdlICJjd2VicDogYWRkIG1ldGFkYXRhIGZyYW1ld29yayIKKzYzYWJhM2FlIGN3ZWJwOiBhZGQgbWV0YWRhdGEgZnJhbWV3b3JrCis5MzFiZDUxNiBsb3NzbGVzcyBiaXRzdHJlYW06IGJsb2NrIHNpemUgYml0cyBjb3JyZWN0aW9uCitlNGZjNGMxYyBsb3NzbGVzcyBiaXRzdHJlYW06IGJsb2NrIHNpemUgYml0cyBjb3JyZWN0aW9uCitkNjVlYzY3OCBmaXggYnVpbGQsIG1vdmUgdG9rZW4uYyB0byBzcmMvZW5jLworNjU3ZjVjOTEgbW92ZSB0b2tlbiBidWZmZXIgdG8gaXRzIG93biBmaWxlICh0b2tlbi5jKQorYzM0YTM3NTggaW50cm9kdWNlIEdldExhcmdlVmFsdWUoKSB0byBzbGltLWZhc3QgR2V0Q29lZmZzKCkuCitkNTgzOGNkNSBmYXN0ZXIgbm9uLXRyYW5zcG9zaW5nIFNTRTIgNHg0IEZUcmFuc2Zvcm0KK2Y3NjE5MWY5IHNwZWVkIHVwIEdldFJlc2lkdWFsQ29zdCgpCitiYTJhYTBmZCBBZGQgc3VwcG9ydCBmb3IgQklUUz0yNCBjYXNlCisyZTdmNmU4ZSBtYWtlZmlsZS51bml4OiBEZXBlbmRlbmN5IG9uIGxpYnJhcmllcworZGNhODQyMTkgTWVyZ2UgIlNlcGFyYXRlIG91dCBtdXggYW5kIGRlbXV4IGNvZGUgYW5kIGxpYnJhcmllczoiCisyMzc4MmY5NSBTZXBhcmF0ZSBvdXQgbXV4IGFuZCBkZW11eCBjb2RlIGFuZCBsaWJyYXJpZXM6CitiZDU2YTAxZiBjb25maWd1cmU6IGFkZCBzdW1tYXJ5IG91dHB1dAorOTBlNWUzMTkgZHdlYnAgbWFudWFsOiBwb2ludCB0byB3ZWJwbXV4LCBnaWYyd2VicC4KKzU0MDc5MGNhIGdpZjJ3ZWJwLmM6IGFkZCBhIG5vdGUgYWJvdXQgcHJlcmVxdWlzaXRlcworZDFlZGY2OTcgY3dlYnAgbWFuIHBhZ2U6IG1lYW5pbmcgb2YgJy1xJyBmb3IgbG9zc3kvbG9zc2xlc3MKKzc5ZWZhMWQwIEFkZCBtYW4gcGFnZSBmb3IgZ2lmMndlYnAgdXRpbGl0eQorMjI0M2U0MGMgTWVyZ2UgImdpZjJ3ZWJwIGJ1aWxkIHN1cHBvcnQgd2l0aCBhdXRvY29uZiB0b29scyIKK2M0MGVmY2ExIGdpZjJ3ZWJwIGJ1aWxkIHN1cHBvcnQgd2l0aCBhdXRvY29uZiB0b29scworNjUyM2UyZDQgV2ViUCBDb250YWluZXI6Cis0ZGE3ODhkYSBNZXJnZSAic2ltcGxpZnkgdGhlIGZ3ZCB0cmFuc2Zvcm0iCis0MmMzYjU1MCBzaW1wbGlmeSB0aGUgZndkIHRyYW5zZm9ybQorNDFhNmNlZDkgdXNlciBHTGZsb2F0IGluc3RlYWQgb2YgZmxvYXQKK2I1NDI2MTE5IGZpeCBpbmRlbnRhdGlvbgorNjhmMjgyZjcgKiBoYW5kbGUgb2Zmc2V0IGluIGFuaW0gdmlld2VyICd2d2VicCcgKiBmaXggZ2lmMndlYnAgdG8gaGFuZGxlIGRpc3Bvc2FsIG1ldGhvZCBhbmQgb2RkIG9mZnNldCBjb3JyZWN0bHkKKzExOGNiMzEyIE1lcmdlICJhZGQgU1NFMiB2ZXJzaW9uIG9mIFN1bSBvZiBTcXVhcmUgZXJyb3IgZm9yIDE2eDE2LCAxNng4IGFuZCA4eDggY2FzZSIKKzhhN2MzY2M4IE1lcmdlICJDaGFuZ2UgdGhlIG9yZGVyIG9mIC1mcmFtZSBhcmd1bWVudCB0byBiZSBtb3JlIG5hdHVyYWwiCis5OWUwYTcwNyBNZXJnZSAiU2ltcGxpZnkgdGhlIHRleHR1cmUgZXZhbHVhdGlvbiBEaXN0bzR4NCgpIgorMGY5MjNjM2YgbWFrZSB0aGUgYnVuZGxpbmcgd29yayBpbiBhIHRtcCBidWZmZXIKK2U1YzNiM2Y1IFNpbXBsaWZ5IHRoZSB0ZXh0dXJlIGV2YWx1YXRpb24gRGlzdG80eDQoKQorNDg2MDAwODQgQ2hhbmdlIHRoZSBvcmRlciBvZiAtZnJhbWUgYXJndW1lbnQgdG8gYmUgbW9yZSBuYXR1cmFsCiszNWJmZDRjMCBhZGQgU1NFMiB2ZXJzaW9uIG9mIFN1bSBvZiBTcXVhcmUgZXJyb3IgZm9yIDE2eDE2LCAxNng4IGFuZCA4eDggY2FzZQorYTczMDVjMmUgQ2xhcmlmaWNhdGlvbiBmb3IgdW5rbm93biBjaHVua3MKKzRjNDM5OGUyIFJlZmluZSBXZWJQIENvbnRhaW5lciBTcGVjIHdydCB1bmtub3duIGNodW5rcy4KKzJjYTY0MmUwIFJlY3RpZnkgV2ViUE11eEdldEZlYXR1cmVzOgorN2NhYWIxZDggU29tZSBjb3NtZXRpYy9jb21tZW50IGZpeGVzLgorNjBiMjY1MWEgTWVyZ2UgIldyaXRlIGEgR0lGIHRvIFdlYlAgY29udmVydGVyIGJhc2VkIG9uIGxpYmdpZi4iCitjNzEyN2E0ZCBNZXJnZSAiQWRkIE5FT04gdmVyc2lvbiBvZiBGVHJhbnNmb3JtV0hUIgorMTFiMjcyMTIgV3JpdGUgYSBHSUYgdG8gV2ViUCBjb252ZXJ0ZXIgYmFzZWQgb24gbGliZ2lmLgorZTlhMTVhMzcgRXhVdGlsV3JpdGVGaWxlKCkgdG8gd3JpdGUgbWVtb3J5IHNlZ21lbnQgdG8gZmlsZQorNzQzNTZlYjUgQWRkIGEgc2ltcGxlIGNsZWFudXAgc3RlcCBpbiBtdXggYXNzZW1ibHk6Cis1MWJiMWU1ZCBtdXguaDogY29ycmVjdCBXZWJQRGVtdXhTZWxlY3RGcmFnbWVudCgpIHByb3RvdHlwZQorMjJhMGZkOWQgQWRkIE5FT04gdmVyc2lvbiBvZiBGVHJhbnNmb3JtV0hUCitmYTMwYzg2MyBVcGRhdGUgbXV4IGNvZGUgdG8gbWF0Y2ggdGhlIHNwZWMgd3J0IGFuaW1hdGlvbgorZDljNWZiZWYgYnktcGFzcyBBbmFseXNpcyBwYXNzIGluIGNhc2Ugc2VnbWVudHM9MQorZDJhZDQ0NTAgTWVyZ2UgY2hhbmdlcyBJYmVjY2ZmYzMsSWQxNTg1YjE2Cis1YzhiZTI1MSBNZXJnZSAiQ2h1bmsgZm91ckNDcyBmb3IgWE1QL0VYSUYiCithMDBhM2RhZiBVc2UgJ2ZyZ20nIGluc3RlYWQgb2YgJ3RpbGUnIGluIHdlYnBtdXggcGFyYW1ldGVycworODFiOGE3NDEgRGVzaWduIGNoYW5nZSBpbiBBTk1GIGFuZCBGUkdNIGNodW5rczoKK2Y5MDNjYmFiIENodW5rIGZvdXJDQ3MgZm9yIFhNUC9FWElGCis4MTI5MzNkNiBUdW5lIHBlcmZvcm1hbmNlIG9mIEhpc3RvZ3JhbUNvbWJpbmUKKzUyYWQxOTc5IEFuaW1hdGlvbiBzcGVjaWZpY2F0aW9uIGluIGNvbnRhaW5lciBzcGVjCiswMDFiOTMwMiBJbWFnZSBmcmFnbWVudCBzcGVjaWZpY2F0aW9uIGluIGNvbnRhaW5lciBzcGVjCiszOTFmOWRiOSBPcmRlcmluZyBvZiBkZXNjcmlwdGlvbiBvZiBiaXRzIGluIGNvbnRhaW5lciBzcGVjCitkNTczNTc3NiBNZXRhZGF0YSBzcGVjaWZpY2F0aW9uIGluIGNvbnRhaW5lciBzcGVjCisxYzQ2MDliMSBNZXJnZSBjb21taXQgJ3YwLjIuMScKKzBjYTU4NGNiIE1lcmdlICJDb2xvciBwcm9maWxlIHNwZWNpZmljYXRpb24gaW4gY29udGFpbmVyIHNwZWMiCitlOGI0MWFkMSBhZGQgTkVPTiBhc20gdmVyc2lvbiBmb3IgV0hUIGludmVyc2UgdHJhbnNmb3JtCithZjZmMGRiMiBDb2xvciBwcm9maWxlIHNwZWNpZmljYXRpb24gaW4gY29udGFpbmVyIHNwZWMKK2E2MWE4MjRiIE1lcmdlICJBZGQgTlVMTCBjaGVjayBpbiBjaHVuayBBUElzIgorMGU4YjdlZWQgZml4IFdlYlBQaWN0dXJlVmlldygpIHVuYXNzaWduZWQgc3RyaWRlcworNzVlNWYxN2UgQVJNL05FT046IDMwJSBlbmNvZGluZyBzcGVlZC11cAorMDJiNDM1NjggQWRkIE5VTEwgY2hlY2sgaW4gY2h1bmsgQVBJcworYTA3NzA3MjcgbXV4IHN0cnVjdCBuYW1pbmcKKzZjNjZkZGU4IE1lcmdlICJUdW5lIExvc3NsZXNzIGVuY29kZXIiCithYjVlYTIxNyBUdW5lIExvc3NsZXNzIGVuY29kZXIKKzc0ZmVmYzhjIFVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMi4xLCBvcmlnaW4vMC4yLjAsIDAuMi4wKQorOTJmODA1OWMgUmVuYW1lIHNvbWUgY2h1bmtzOgorM2JiNGJiZWIgTWVyZ2UgIk11eCBBUEkgY2hhbmdlOiIKK2QwYzc5ZjA1IE11eCBBUEkgY2hhbmdlOgorYWJjMDYwNDQgTWVyZ2UgInVwZGF0ZSBORVdTIiBpbnRvIDAuMi4wCis1N2NmMzEzYiB1cGRhdGUgTkVXUworMjVmNTg1YzQgYnVtcCB2ZXJzaW9uIHRvIDAuMi4xCitmZWQ3YzA0OCBsaWJ3ZWJwOiB2YWxpZGF0ZSBjaHVuayBzaXplIGluIFBhcnNlT3B0aW9uYWxDaHVua3MKKzU1MmNkOWJjIGN3ZWJwICh3aW5kb3dzKTogZml4IGFscGhhIGltYWdlIGltcG9ydCBvbiBYUAorYjE0ZmVhOTkgYXV0b2NvbmYvbGlid2VicDogZW5hYmxlIGRsbCBidWlsZHMgZm9yIG1pbmd3Cis0YThmYjI3MiBbY2Rdd2VicDogYWx3YXlzIG91dHB1dCB3aW5kb3dzIGVycm9ycworZDY2MjE1ODAgZml4IGRvdWJsZSB0byBmbG9hdCBjb252ZXJzaW9uIHdhcm5pbmcKKzcyYjk2YTY5IGN3ZWJwOiBmaXgganBnIGVuY29kZXMgb24gWFAKKzczNGY3NjJhIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldDogZml4IG92ZXJmbG93IGluIHNpemUgY2FsY3VsYXRpb24KK2Y5Y2I1OGZiIEdldEhpc3RvQml0czogZml4IGludGVnZXIgb3ZlcmZsb3cKK2IzMGFkZDIwIEVuY29kZUltYWdlSW50ZXJuYWw6IGZpeCB1bmluaXRpYWxpemVkIGZyZWUKKzNkZTU4ZDc3IGZpeCB0aGUgLWcvTzMgZGlzY3JlcGFuY3kgZm9yIDMyYml0IGNvbXBpbGUKKzc3YWE3ZDUwIGZpeCB0aGUgQklUUz04IGNhc2UKK2U1OTcwYmRhIE1ha2UgKkluaXRTU0UyKCkgZnVuY3Rpb25zIGJlIGVtcHR5IG9uIG5vbi1TU0UyIHBsYXRmb3JtCitlZjVjYzQ3ZSBtYWtlICpJbml0U1NFMigpIGZ1bmN0aW9ucyBiZSBlbXB0eSBvbiBub24tU1NFMiBwbGF0Zm9ybQorYzRlYTI1OWQgbWFrZSBWUDhEc3BJbml0TkVPTigpIHB1YmxpYworODM0NGVhZGYgTWVyZ2UgImxpYndlYnA6IHZhbGlkYXRlIGNodW5rIHNpemUgaW4gUGFyc2VPcHRpb25hbENodW5rcyIKKzQ4MjhiYjkzIE1lcmdlICJjd2VicCAod2luZG93cyk6IGZpeCBhbHBoYSBpbWFnZSBpbXBvcnQgb24gWFAiCiszMDc2MzMzMyBsaWJ3ZWJwOiB2YWxpZGF0ZSBjaHVuayBzaXplIGluIFBhcnNlT3B0aW9uYWxDaHVua3MKKzcwNDgxODk4IEFjY3VtdWxhdGVMU0lNOiBmaXggZG91YmxlIC0+IGZsb2F0IHdhcm5pbmdzCitlZGE4ZWU0YiBjd2VicCAod2luZG93cyk6IGZpeCBhbHBoYSBpbWFnZSBpbXBvcnQgb24gWFAKK2M2ZTk4NjU4IE1lcmdlICJhZGQgRVhQRVJJTUVOVEFMIGNvZGUgZm9yIFlVVi1KUEVHIGNvbG9yc3BhY2UiCitmMDM2MGI0ZiBhZGQgRVhQRVJJTUVOVEFMIGNvZGUgZm9yIFlVVi1KUEVHIGNvbG9yc3BhY2UKK2Y4NmU2YWJlIGFkZCBMU0lNIG1ldHJpYyB0byBXZWJQUGljdHVyZURpc3RvcnRpb24oKQorYzNhYTIxNWEgU3BlZWQgdXAgSGlzdG9ncmFtQ29tYmluZSBmb3IgbG93ZXIgcXVhbGl0aWVzLgorMTc2NWNiMWMgTWVyZ2UgImF1dG9jb25mL2xpYndlYnA6IGVuYWJsZSBkbGwgYnVpbGRzIGZvciBtaW5ndyIKK2ExMzU2MmU4IGF1dG9jb25mL2xpYndlYnA6IGVuYWJsZSBkbGwgYnVpbGRzIGZvciBtaW5ndworOWY0NjliNTcgdHlwbzogbm9fZmFuY3kgLT4gbm9fZmFuY3lfdXBzYW1wbGluZworMWEyN2YyZjggTWVyZ2UgImZpeCBkb3VibGUgdG8gZmxvYXQgY29udmVyc2lvbiB3YXJuaW5nIgorY2YxZTkwZGUgTWVyZ2UgImN3ZWJwOiBmaXgganBnIGVuY29kZXMgb24gWFAiCitmMmI1ZDE5YiBbY2Rdd2VicDogYWx3YXlzIG91dHB1dCB3aW5kb3dzIGVycm9ycworZTg1NTIwOGMgZml4IGRvdWJsZSB0byBmbG9hdCBjb252ZXJzaW9uIHdhcm5pbmcKK2VjZDY2Zjc3IGN3ZWJwOiBmaXgganBnIGVuY29kZXMgb24gWFAKKzdiM2ViMzcyIFR1bmUgbG9zc2xlc3MgY29tcHJlc3Npb24gdG8gZ2V0IGJldHRlciBnYWlucy4KK2NlOGJmZjQ1IE1lcmdlICJWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQ6IGZpeCBvdmVyZmxvdyBpbiBzaXplIGNhbGN1bGF0aW9uIgorYWI1YjY3YTEgTWVyZ2UgIkVuY29kZUltYWdlSW50ZXJuYWw6IGZpeCB1bmluaXRpYWxpemVkIGZyZWUiCis3ZmVlNWQxMiBNZXJnZSAiR2V0SGlzdG9CaXRzOiBmaXggaW50ZWdlciBvdmVyZmxvdyIKK2E2YWUwNGQ0IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldDogZml4IG92ZXJmbG93IGluIHNpemUgY2FsY3VsYXRpb24KKzgwMjM3YzQzIEdldEhpc3RvQml0czogZml4IGludGVnZXIgb3ZlcmZsb3cKKzhhOTk3MjM1IEVuY29kZUltYWdlSW50ZXJuYWw6IGZpeCB1bmluaXRpYWxpemVkIGZyZWUKKzBiOWU2ODI5IG1pbm9yIGNvc21ldGljcworYTc5MmI5MTMgZml4IHRoZSAtZy9PMyBkaXNjcmVwYW5jeSBmb3IgMzJiaXQgY29tcGlsZQorNzNiYTQzNTcgTWVyZ2UgImRldGVjdCBhbmQgbWVyZ2Ugc2ltaWxhciBzZWdtZW50cyIKK2ZlZTY2Mjc1IGRldGVjdCBhbmQgbWVyZ2Ugc2ltaWxhciBzZWdtZW50cworMGM0NGY0MTUgc3JjL3dlYnAvKi5oOiBkb24ndCBmb3J3YXJkIGRlY2xhcmUgZW51bXMgaW4gQysrCitkN2E1YWM4NiB2d2VicDogdXNlIGRlbXV4IGludGVyZmFjZQorOTMxZTBlYTEgTWVyZ2UgInJlcGxhY2UgJ3R5cGVkZWYgc3RydWN0IHt9IFg7IiBieSAidHlwZWRlZiBzdHJ1Y3QgWCBYOyBzdHJ1Y3QgWCB7fTsiIgorOGYyMTZmN2UgcmVtb3ZlIGNhc2VzIG9mIGVxdWFsIGNvbXBhcmlzb24gZm9yIHFzb3J0KCkKKzI4ZDI1YzgyIHJlcGxhY2UgJ3R5cGVkZWYgc3RydWN0IHt9IFg7IiBieSAidHlwZWRlZiBzdHJ1Y3QgWCBYOyBzdHJ1Y3QgWCB7fTsiCisyYWZlZTYwYSBzcGVlZCB1cCBmb3IgQVJNIHVzaW5nIDhiaXQgZm9yIGJvb2xlYW4gZGVjb2RlcgorNTcyNWNhYmEgbmV3IHNlZ21lbnRhdGlvbiBhbGdvcml0aG0KKzJjZjFmODE1IE1lcmdlICJmaXggdGhlIEJJVFM9OCBjYXNlIgorMTJmNzhhZWMgZml4IHRoZSBCSVRTPTggY2FzZQorNjkyMGM3MWYgZml4IE1TVkMgd2FybmluZ3MgcmVnYXJkaW5nIGltcGxpY2l0IHVpbnQ2NCB0byB1aW50MzIgY29udmVyc2lvbnMKK2Y2YzA5NmFhIHdlYnBtdXggYmluYXJ5OiBSZW5hbWUgJ3htcCcgb3B0aW9uIHRvICdtZXRhJworZGRmZTg3MWEgd2VicG11eCBoZWxwIGNvcnJlY3Rpb24KK2I3YzU1NDQyIE1lcmdlICJNYWtlICpJbml0U1NFMigpIGZ1bmN0aW9ucyBiZSBlbXB0eSBvbiBub24tU1NFMiBwbGF0Zm9ybSIKKzFjMDRhMGQ0IENvbW1vbiBBUElzIGZvciBjaHVua3MgbWV0YWRhdGEgYW5kIGNvbG9yIHByb2ZpbGUuCisyYTMxMTdhMSBNZXJnZSAiQ3JlYXRlIFdlYlBNdXhGcmFtZUluZm8gc3RydWN0IGZvciBNdXggQVBJcyIKKzVjM2E3MjMxIE1ha2UgKkluaXRTU0UyKCkgZnVuY3Rpb25zIGJlIGVtcHR5IG9uIG5vbi1TU0UyIHBsYXRmb3JtCis3YzZlNjBmNCBtYWtlICpJbml0U1NFMigpIGZ1bmN0aW9ucyBiZSBlbXB0eSBvbiBub24tU1NFMiBwbGF0Zm9ybQorYzdlYjQ1NzYgbWFrZSBWUDhEc3BJbml0TkVPTigpIHB1YmxpYworYWIzMjM0YWUgQ3JlYXRlIFdlYlBNdXhGcmFtZUluZm8gc3RydWN0IGZvciBNdXggQVBJcworZTM5OTBmZDggQWxpZ25tZW50IGZpeGVzCitlNTVmYmQ2ZCBNZXJnZSBicmFuY2ggJzAuMi4wJworNDIzOGJjMGEgVXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4yLjApCitjNjU1MzgwYyBkZWMvaW8uYzogY29zbWV0aWNzCitmZTE5NThmMSBSR0JBNDQ0NDogaGFybW9uaXplIGxvc3NsZXNzL2xvc3N5IGFscGhhIHZhbHVlcworNjgxY2IzMGEgZml4IFJHQkE0NDQ0IG91dHB1dCB3L2ZhbmN5IHVwc2FtcGxpbmcKK2YwNmMxZDhmIE1lcmdlICJBbGlnbm1lbnQgZml4IiBpbnRvIDAuMi4wCitmNTZlOThmZCBBbGlnbm1lbnQgZml4Cis2ZmU4NDNiYSBhdm9pZCByZ2ItcHJlbXVsdGlwbHkgaWYgdGhlcmUncyBvbmx5IHRyaXZpYWwgYWxwaGEgdmFsdWVzCis1MjhhMTFhZiBmaXggdGhlIEFSR0I0NDQ0IHByZW11bHRpcGx5IGFyaXRobWV0aWMKK2EwYTQ4ODU1IExvc3NsZXNzIGRlY29kZXIgZml4IGZvciBhIHNwZWNpYWwgdHJhbnNmb3JtIG9yZGVyCis2MmRkOWJiMiBVcGRhdGUgZW5jb2RpbmcgaGV1cmlzdGljIHcuci50IHBhbGV0dGUgY29sb3JzLgorNmY0MjcyYjAgcmVtb3ZlIHVudXNlZCBBcHBseUludmVyc2VUcmFuc2Zvcm0oKQorOTNiZjBmYWEgVXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4yLjAtcmMxKQorNTkzNGZjNTkgdXBkYXRlIEFVVEhPUlMKKzAxNGE3MTFkIHVwZGF0ZSBORVdTCis0M2IwZDYxMCBhZGQgc3VwcG9ydCBmb3IgQVJHQiAtPiBZVVZBIGNvbnZlcnNpb24gZm9yIGxvc3NsZXNzIGRlY29kZXIKKzMzNzA1Y2EwIGJ1bXAgdmVyc2lvbiB0byAwLjIuMAorYzQwZDdlZjEgZml4IGFscGhhLXBsYW5lIGNoZWNrICsgYWRkIGV4dHJhIGNoZWNrcworYTA2ZjgwMjMgTU9ERV9ZVVZBOiBzZXQgYWxwaGEgdG8gb3BhcXVlIGlmIHRoZSBpbWFnZSBoYXMgbm9uZQorNTJhODdkZDcgTWVyZ2UgInNpbGVuY2Ugb25lIG1vcmUgd2FybmluZyIgaW50byAwLjIuMAorM2IwMjMwOTMgc2lsZW5jZSBvbmUgbW9yZSB3YXJuaW5nCitmOTRiMDRmMCBtb3ZlIHNvbWUgUkdCLT5ZVVYgZnVuY3Rpb25zIHRvIHl1di5oCis0YjcxYmEwMyBSRUFETUU6IHN5bmMgW2NkXXdlYnAgaGVscCBvdXRwdXQKK2M5YWU1N2Y1IG1hbi9kd2VicC4xOiBhZGQgbGlua3MgdG8gb3V0cHV0IGZpbGUgZm9ybWF0IGRldGFpbHMKKzI5MmVjNWNjIHF1aWV0IGEgZmV3ICd1bmluaXRpYWxpemVkJyB3YXJuaW5ncworNGFmM2Y2YzQgZml4IGluZGVudGF0aW9uCis5YjI2MWJmNSByZW1vdmUgdGhlIGxhc3QgTk9UX0hBVkVfTE9HMiBpbnN0YW5jZXMKKzMyM2RjNGQ5IHJlbW92ZSB1c2Ugb2YgbG9nMigpLiBVc2UgVlA4TEZhc3RMb2cyKCkgaW5zdGVhZC4KKzhjNTE1ZDU0IE1lcmdlICJoYXJuZXNzIHNvbWUgbWFsbG9jL2NhbGxvYyB0byB1c2UgV2ViUFNhZmVNYWxsb2MgYW5kIFdlYlBTYWZlQ2FsbG9jIiBpbnRvIDAuMi4wCitkNGI0YmIwMiBNZXJnZSBjaGFuZ2VzIEk0NjA5MDYyOCxJMWE0MWIyY2UgaW50byAwLjIuMAorYmZmMzRhYzEgaGFybmVzcyBzb21lIG1hbGxvYy9jYWxsb2MgdG8gdXNlIFdlYlBTYWZlTWFsbG9jIGFuZCBXZWJQU2FmZUNhbGxvYworYTNjMDYzYzcgTWVyZ2UgImV4dHJhIHNpemUgY2hlY2sgZm9yIHNlY3VyaXR5IiBpbnRvIDAuMi4wCis1ZTc5NjMwMCBNZXJnZSAiV2ViUEVuY29kZTogY2xlYXIgc3RhdHMgYXQgdGhlIHN0YXJ0IG9mIGVuY29kZSIgaW50byAwLjIuMAorZjFlZGY2MmYgTWVyZ2UgInJhdGlvbmFsaXplIHVzZSBvZiBjb2xvci1jYWNoZSIgaW50byAwLjIuMAorYzE5MzMzMTcgZXh0cmEgc2l6ZSBjaGVjayBmb3Igc2VjdXJpdHkKKzkwNmJlNjU3IHJhdGlvbmFsaXplIHVzZSBvZiBjb2xvci1jYWNoZQorZGQxYzM4NzMgQWRkIGltYWdlLWhpbnQgZm9yIGxvdy1jb2xvciBpbWFnZXMuCis0ZWI3YWE2NCBNZXJnZSAiV2ViUENoZWNrTWFsbG9jKCkgYW5kIFdlYlBDaGVja0NhbGxvYygpOiIgaW50byAwLjIuMAorODBjYzczMDMgV2ViUENoZWNrTWFsbG9jKCkgYW5kIFdlYlBDaGVja0NhbGxvYygpOgorMTgzY2JhODMgY2hlY2sgVlA4TEJpdFdyaXRlckluaXQgcmV0dXJuCitjYmZhOWVlYyBsb3NzbGVzczogZml4IGNyYXNoIG9uIHVzZXIgYWJvcnQKKzI1NmFmZWZhIGN3ZWJwOiBleGl0IGltbWVkaWF0ZWx5IG9uIHZlcnNpb24gbWlzbWF0Y2gKKzQ3NWQ4N2Q3IFdlYlBFbmNvZGU6IGNsZWFyIHN0YXRzIGF0IHRoZSBzdGFydCBvZiBlbmNvZGUKK2E3Y2M3MjkxIGZpeCB0eXBlIGFuZCBjb252ZXJzaW9uIHdhcm5pbmdzCis3ZDg1M2Q3OSBhZGQgc3RhdHMgZm9yIGxvc3NsZXNzCitkMzkxNzdiNyBtYWtlIFF1YW50aXplTGV2ZWxzKCkgc3RvcmUgdGhlIHN1bSBvZiBzcXVhcmVkIGVycm9yCis1OTU1Y2Y1ZSByZXBsYWNlIHgqMTU1LzEwMCBieSB4KjEwMTU4MT4+MTYKKzdkNzMyZjkwIG1ha2UgUXVhbnRpemVMZXZlbHMoKSBzdG9yZSB0aGUgc3VtIG9mIHNxdWFyZWQgZXJyb3IKK2U0NWE0NDZhIHJlcGxhY2UgeCoxNTUvMTAwIGJ5IHgqMTAxNTgxPj4xNgorMTU5Yjc1ZDMgY3dlYnAgb3V0cHV0IHNpemUgY29uc2lzdGVuY3k6CitjYmVlNTllYiBNZXJnZSBjb21taXQgJ3YwLjEuOTknCisxODg5ZTliNiBkd2VicDogcmVwb3J0IC1hbHBoYSBvcHRpb24KKzNiYzNmN2MwIE1lcmdlICJkd2VicDogYWRkIFBBTSBvdXRwdXQgc3VwcG9ydCIgaW50byAwLjIuMAorZDkxOWVkMDYgZHdlYnA6IGFkZCBQQU0gb3V0cHV0IHN1cHBvcnQKKzg1ZTIxNWQzIFJFQURNRS9tYW5wYWdlcy9jb25maWd1cmU6IHVwZGF0ZSB3ZWJzaXRlIGxpbmsKK2MzYTIwN2I5IFVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMS45OSkKK2QxZmQ3ODI2IE1lcmdlICJhZGQgZXh0cmEgcHJlY2lzaW9uIGFib3V0IGRlZmF1bHQgdmFsdWVzIGFuZCBiZWhhdmlvdXIiIGludG8gMC4yLjAKK2VmYzgyNmUwIGFkZCBleHRyYSBwcmVjaXNpb24gYWJvdXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGJlaGF2aW91cgorOWYyOTYzNWQgaGVhZGVyL2RvYyBjbGVhbiB1cAorZmY5ZmQxYmEgTWFrZWZpbGUudmM6IGZpeCB3ZWJwbXV4LmV4ZSAqLWR5bmFtaWMgYnVpbGRzCis4YWFjYzdiMCByZW1vdmUgSU5BTSwgSUNPUCwgLi4uIGNodW5rcyBmcm9tIHRoZSB0ZXN0IHdlYnAgZmlsZS4KKzJmYzEzMDE1IGhhcm1vbml6ZSBhdXRob3JzIGFzICJOYW1lIChtYWlsQGFkZHJlc3MpIgorNGE5ZjM3YjcgTWVyZ2UgInVwZGF0ZSBORVdTIiBpbnRvIDAuMi4wCis3NDE1YWUxMyBtYWtlZmlsZS51bml4OiBwcm92aWRlIGV4YW1wbGVzL3dlYnBtdXggdGFyZ2V0CitjZTgyY2VkYyB1cGRhdGUgTkVXUworNjQxZTI4ZTggTWVyZ2UgIm1hbi9jd2VicC4xOiB3b3JkaW5nLCBjaGFuZ2UgdGhlIGRhdGUiIGludG8gMC4yLjAKK2MzN2MyM2U1IFJFQURNRTogY29zbWV0aWNzCiszOTc2ZGNkNSBtYW4vY3dlYnAuMTogd29yZGluZywgY2hhbmdlIHRoZSBkYXRlCiszZTViYmUxYyBNZXJnZSAicmVuYW1lICd1c2VfYXJnYl9pbnB1dCcgdG8gJ3VzZV9hcmdiJyIgaW50byAwLjIuMAorY2U5MDg0N2EgTWVyZ2UgImFkZCBzb21lIHBhZGRpbmcgYnl0ZXMgYXJlYXMgZm9yIGxhdGVyIHVzZSIgaW50byAwLjIuMAorMjM5MGRhYmMgTWVyZ2UgImZpeGluZyB0aGUgZmluZGluZ3MgYnkgRnJlZGVyaWMgS2F5c2VyIHRvIHRoZSBiaXRzdHJlYW0gc3BlYyIgaW50byAwLjIuMAorMDI3NTE1OTEgYWRkIGEgdmVyeSBjcnVkZSBwcm9ncmVzcyByZXBvcnQgZm9yIGxvc3NsZXNzCithNGI5YjFjNiBSZW1vdmUgc29tZSB1bnVzZWQgZW51bSB2YWx1ZXMuCitkZDEwODE3NiByZW5hbWUgJ3VzZV9hcmdiX2lucHV0JyB0byAndXNlX2FyZ2InCis5MDUxNmFlOCBhZGQgc29tZSBwYWRkaW5nIGJ5dGVzIGFyZWFzIGZvciBsYXRlciB1c2UKK2QwM2IyNTAzIGZpeGluZyB0aGUgZmluZGluZ3MgYnkgRnJlZGVyaWMgS2F5c2VyIHRvIHRoZSBiaXRzdHJlYW0gc3BlYworY2UxNTZhZmMgYWRkIG1pc3NpbmcgQUJJIGNvbXBhdGliaWxpdHkgY2hlY2tzCis5ZDQ1NDE2YSBNZXJnZSAiRG9jOiBjb250YWluZXIgc3BlYyB0ZXh0IHR3ZWFrcyIgaW50byAwLjIuMAorNGUyZTBhOGMgRG9jOiBjb250YWluZXIgc3BlYyB0ZXh0IHR3ZWFrcworZjdmMTZhMjkgYWRkIEFCSSBjb21wYXRpYmlsaXR5IGNoZWNrCisyYTc3NTU3MCBNZXJnZSAic3dpZzogYWRkIFdlYlBFbmNvZGVMb3NzbGVzcyogd3JhcHBlcnMiIGludG8gMC4yLjAKK2EzZWM2MjI1IG11eC5oOiByZW1vdmUgJyogY29uc3QnIGZyb20gZnVuY3Rpb24gcGFyYW1ldGVycworMzE0MjZlYmEgZW5jb2RlLmg6IHJlbW92ZSAnKiBjb25zdCcgZnJvbSBmdW5jdGlvbiBwYXJhbWV0ZXJzCis5ODM4ZTVkNSBkZWNvZGUuaDogcmVtb3ZlICcqIGNvbnN0JyBmcm9tIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKzQ5NzIzMDJkIHN3aWc6IGFkZCBXZWJQRW5jb2RlTG9zc2xlc3MqIHdyYXBwZXJzCis5ZmYwMGNhZSBidW1wIGVuY29kZXIvZGVjb2RlciB2ZXJzaW9ucworYzI0MTZjOWIgYWRkIGxvc3NsZXNzIHF1aWNrIGVuY29kaW5nIGZ1bmN0aW9ucyB0byB0aGUgcHVibGljIEFQSQorNGMxZjVkNjQgTWVyZ2UgIk5FV1M6IG1lbnRpb24gZGVjb2RlX3ZwOC5oIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQiIGludG8gMC4yLjAKKzZjYjIyNzdkIE5FV1M6IG1lbnRpb24gZGVjb2RlX3ZwOC5oIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQKK2Q1ZTVhZDYzIG1vdmUgZGVjb2RlX3ZwOC5oIGZyb20gd2VicC8gdG8gZGVjLworOGQzYjA0YTIgTWVyZ2UgImhlYWRlciBjbGVhbi11cCIgaW50byAwLjIuMAorMDIyMDFjMzUgTWVyZ2UgInJlbW92ZSBvbmUgbWFsbG9jKCkgYnkgbWFraW5nIGNvbG9yX2NhY2hlIG5vbiBkeW5hbWljIiBpbnRvIDAuMi4wCitkNzA4ZWMxNCBNZXJnZSAibW92ZSBNSU4vTUFYX0hJU1RPX0JJVFMgdG8gZm9ybWF0X2NvbnN0YW50cy5oIiBpbnRvIDAuMi4wCithYjJkYTNlOSBNZXJnZSAiYWRkIGEgbWFsbG9jKCkgY2hlY2siIGludG8gMC4yLjAKKzJkNTcxYmQ4IGFkZCBhIG1hbGxvYygpIGNoZWNrCis3ZjBjMTc4ZSByZW1vdmUgb25lIG1hbGxvYygpIGJ5IG1ha2luZyBjb2xvcl9jYWNoZSBub24gZHluYW1pYworNjU2OWNkN2MgTWVyZ2UgIlZQOExGaWxsQml0V2luZG93OiB1c2UgNjQtYml0IHBhdGggZm9yIG1zdmMgeDY0IGJ1aWxkcyIgaW50byAwLjIuMAorMjNkMzRmMzEgaGVhZGVyIGNsZWFuLXVwCisyYTNhYjZmOSBtb3ZlIE1JTi9NQVhfSElTVE9fQklUUyB0byBmb3JtYXRfY29uc3RhbnRzLmgKKzk4NWQzZGE2IE1lcmdlICJzaHVmZmxlIHZhcmlhYmxlcyBpbiBIYXNoQ2hhaW5GaW5kQ29weSIgaW50byAwLjIuMAorY2RmODg1YzYgc2h1ZmZsZSB2YXJpYWJsZXMgaW4gSGFzaENoYWluRmluZENvcHkKK2MzYjAxNGRiIEFuZHJvaWQubWs6IGFkZCBtaXNzaW5nIGxvc3NsZXNzIGZpbGVzCis4YzFjYzZiNSBtYWtlZmlsZS51bml4IGRpc3Q6IGV4cGxpY2l0bHkgbmFtZSBpbnN0YWxsZWQgaW5jbHVkZXMKKzdmNDY0N2VlIE1lcmdlICJjbGFyaWZ5IHRoZSBjb2xvcnNwYWNlIG5hbWluZyBhbmQgYnl0ZSBvcmRlcmluZyBvZiBkZWNvZGVkIHNhbXBsZXMiIGludG8gMC4yLjAKK2NiZjY5NzI0IGNsYXJpZnkgdGhlIGNvbG9yc3BhY2UgbmFtaW5nIGFuZCBieXRlIG9yZGVyaW5nIG9mIGRlY29kZWQgc2FtcGxlcworODU3NjUwYzggTXV4OiBBZGQgV2ViUERhdGFJbml0KCkgYW5kIHJlbW92ZSBXZWJQSW1hZ2VJbmZvCitmZjc3MWU3NyBkb24ndCBpbnN0YWxsIHdlYnAvZGVjb2RlX3ZwOC5oCis1OTZkZmY3OCBWUDhMRmlsbEJpdFdpbmRvdzogdXNlIDY0LWJpdCBwYXRoIGZvciBtc3ZjIHg2NCBidWlsZHMKKzNjYTdjZTk4IE1lcmdlICJkb2M6IHJlbW92ZSBub24tZmluYWxpemVkIGNodW5rIHJlZmVyZW5jZXMiIGludG8gMC4yLjAKKzFlZmFhNWEzIE1lcmdlICJidW1wIHZlcnNpb25zIiBpbnRvIDAuMi4wCis1MWZhMTNlMSBNZXJnZSAiUkVBRE1FOiB1cGRhdGUgY3dlYnAgaGVscCBvdXRwdXQiIGludG8gMC4yLjAKKzEyZjlhZWRlIFJFQURNRTogdXBkYXRlIGN3ZWJwIGhlbHAgb3V0cHV0CitmMGI1ZGVmYiBidW1wIHZlcnNpb25zCis0YzQyYTYxYiB1cGRhdGUgQVVUSE9SUworNjQzMWExY2UgZG9jOiByZW1vdmUgbm9uLWZpbmFsaXplZCBjaHVuayByZWZlcmVuY2VzCis4MTMwYzRjYyBNZXJnZSAiYnVpbGQ6IHJlbW92ZSBsaWJ3ZWJwbXV4IGZyb20gZGVmYXVsdCB0YXJnZXRzL2NvbmZpZyIKKzIzYjQ0NDM4IE1lcmdlICJjb25maWd1cmU6IGJyb2FkZW4gdGVzdCBmb3IgbGlicG5nLWNvbmZpZyIKKzg1YmZmMmNkIE1lcmdlICJkb2M6IGNvcnJlY3QgbG9zc2xlc3MgcHJlZml4IGNvZGluZyB0YWJsZSAmIGNvZGUiCiswNTEwOGY2ZSBNZXJnZSAiTW9yZSBzcGVjL2NvZGUgbWF0Y2hpbmcgaW4gbXV4OiIKKzY4MDhlNjlkIE1vcmUgc3BlYy9jb2RlIG1hdGNoaW5nIGluIG11eDoKK2JkMmI0NmY1IE1lcmdlICJkb2Mvd2VicC1jb250YWluZXItc3BlYzogbGlnaHQgY29zbWV0aWNzIgorMjBlYWQzMjkgZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IGxpZ2h0IGNvc21ldGljcworMWQ0MGE4YmMgY29uZmlndXJlOiBhZGQgcHRocmVhZCBkZXRlY3Rpb24KK2I1ZTkwNjdhIGZpeCBzb21lIGludCA8LT4gc2l6ZV90IG1peCBmb3IgYnVmZmVyIHNpemVzCitlNDFhNzU5NiBidWlsZDogcmVtb3ZlIGxpYndlYnBtdXggZnJvbSBkZWZhdWx0IHRhcmdldHMvY29uZmlnCiswZmMyYmFhZSBjb25maWd1cmU6IGJyb2FkZW4gdGVzdCBmb3IgbGlicG5nLWNvbmZpZworNDViODI3MmMgTWVyZ2UgInJlc3RvcmUgYXV0aG9yc2hpcCB0byBsb3NzbGVzcyBiaXRzdHJlYW0gZG9jIgorMDZiYTA1OTAgcmVzdG9yZSBhdXRob3JzaGlwIHRvIGxvc3NsZXNzIGJpdHN0cmVhbSBkb2MKKzQ0YTA5YTNjIGFkZCBtaXNzaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSBhbHBoYSBmaWx0ZXJpbmcgbWV0aG9kcworNjNkYjg3ZGQgTWVyZ2UgInZ3ZWJwOiBhZGQgY2hlY2tib2FyZCBiYWNrZ3JvdW5kIGZvciBhbHBoYSBkaXNwbGF5IgorYTczYjg5NzggdndlYnA6IGFkZCBjaGVja2JvYXJkIGJhY2tncm91bmQgZm9yIGFscGhhIGRpc3BsYXkKKzkzOTE1OGNlIE1lcmdlICJ2d2VicDogZml4IGluZm8gZGlzcGxheSIKK2IzNWMwN2Q5IHZ3ZWJwOiBmaXggaW5mbyBkaXNwbGF5Cis0OGIzOWViMSBmaXggdW5kZXJmbG93IGZvciB2ZXJ5IHNob3J0IGJpdHN0cmVhbXMKKzdlNjIyOTg0IGNvc21ldGljczogcGFyYW0gYWxpZ25tZW50LCBtYW5wYWdlIHdvcmRpbmcKKzFiZDdkZDUwIE1lcmdlIGNoYW5nZXMgSTdiMGFmYjBkLEk3ZWNjOTcwOAorYWM2OWU2M2UgTWVyZ2UgIlVwZGF0ZWQgY3dlYnAgbWFuJ3MgaGVscCBmb3IgQWxwaGEgJiBMb3NzbGVzcy4iCitjMGU4ODU5ZCBHZXQgcmlkIG9mIGltYWdlX2luZm9fIGZyb20gV2ViUENodW5rIHN0cnVjdC4KKzEzNWNhNjllIFdlYlAgQ29udGFpbmVyIFNwZWM6CitlYjZmOWI4YSBVcGRhdGVkIGN3ZWJwIG1hbidzIGhlbHAgZm9yIEFscGhhICYgTG9zc2xlc3MuCiswZmE4NDRmYiBjb3NtZXRpYyBmaXhlcyBvbiBhc3NlcnQgYW5kICdjb25zdCcgd2hlcmUgYXBwbGljYWJsZQorN2YyMmJkMjUgY2hlY2sgbGltaXQgb2Ygd2lkdGggKiBoZWlnaHQgaXMgMzIgYml0cworMTZjNDZlODMgYXV0b2NvbmYvbWFrZTogY29zbWV0aWNzOiBicmVhayBsb25nIGxpbmVzCithYjIyYTA3YSBjb25maWd1cmU6IGFkZCBoZWxwZXIgbWFjcm8gdG8gZGVmaW5lIC0td2l0aC0qCitjMTc2OTliMyBjb25maWd1cmU6IGFkZCBsaWJ0aWZmIHRlc3QKKzBlMDk3MzJjIE1lcmdlICJjd2VicDogZml4IGNyYXNoIHdpdGggeXV2IGlucHV0ICsgbG9zc2xlc3MiCis4OGE1MTBmZiBNZXJnZSAiZml4IGJpZy1lbmRpYW4gVlA4TFdyaXRlQml0cyIKK2RhOTllM2JmIE1lcmdlICJNYWtlZmlsZS52Yzogc3BsaXQgbXV4IGludG8gc2VwYXJhdGUgbGliIgorN2JkYTM5MmIgY3dlYnA6IGZpeCBjcmFzaCB3aXRoIHl1diBpbnB1dCArIGxvc3NsZXNzCitmNTZhMzY5YSBmaXggYmlnLWVuZGlhbiBWUDhMV3JpdGVCaXRzCis1NDE2OWQ2YyBNZXJnZSAiY3dlYnA6IG5hbWUgSW5wdXRGaWxlRm9ybWF0IG1lbWJlcnMgY29uc2lzdGVudGx5IgorZTJmZWVmYTkgTWFrZWZpbGUudmM6IHNwbGl0IG11eCBpbnRvIHNlcGFyYXRlIGxpYgorMjdjYWE1YWEgTWVyZ2UgImN3ZWJwOiBhZGQgYmFzaWMgVElGRiBzdXBwb3J0IgorZDg5MjFkZDQgY3dlYnA6IG5hbWUgSW5wdXRGaWxlRm9ybWF0IG1lbWJlcnMgY29uc2lzdGVudGx5Cis2Zjc2ZDI0NiBjd2VicDogYWRkIGJhc2ljIFRJRkYgc3VwcG9ydAorNDY5MTQwN2IgTWVyZ2UgY2hhbmdlcyBJZjM5YWI3ZjUsSTM2NThiNWFlCitjY2E3YzdiOCBGaXhlZCBuaXQ6IDEwIC0+IDEwLmYKKzVkMDlhMjQ0IFdlYlBNdXhDcmVhdGUoKSBlcnJvciBoYW5kbGluZzoKKzc3NzM0MWMzIEZpeCBhIG1lbWxlYWsgaW4gV2ViUE11eENyZWF0ZSgpCis2MWM5ZDE2MSBkb2M6IGNvcnJlY3QgbG9zc2xlc3MgcHJlZml4IGNvZGluZyB0YWJsZSAmIGNvZGUKKzRjMzk3NTc5IE1lcmdlICJtYXJrIFZQOHssTH17R2V0SW5mbyxDaGVja1NpZ25hdHVyZX0gYXMgV0VCUF9FWFRFUk4iCitlNGUzNmNjNiBNZXJnZSAiTXV4OiBBbGxvdyBvbmx5IHNvbWUgZnJhbWVzL3RpbGVzIHRvIGhhdmUgYWxwaGEuIgorYWQyYWFkM2MgTWVyZ2UgIldlYlAgRGVjb2RpbmcgZXJyb3IgaGFuZGxpbmc6IgorOTc2NDljOGYgTXV4OiBBbGxvdyBvbmx5IHNvbWUgZnJhbWVzL3RpbGVzIHRvIGhhdmUgYWxwaGEuCitmODY0YmUzYiBMb3dlciB0aGUgcXVhbGl0eSBzZXR0aW5ncyBmb3IgQWxwaGEgZW5jb2RpbmcuCiszYmE4MWJiZSBXZWJQIERlY29kaW5nIGVycm9yIGhhbmRsaW5nOgorZmNjNjk5MjMgYWRkIGF1dG9tYXRpYyBZVVZBL0FSR0IgY29udmVyc2lvbiBkdXJpbmcgV2ViUEVuY29kZSgpCis4MDJlMDEyYSBmaXggY29tcGlsYXRpb24gaW4gbm9uLUZBTkNZX1VQU0FNUExJTkcgbW9kZQorZTAxMmRmZDkgbWFrZSB3aWR0aC9oZWlnaHQgY29kaW5nIG1hdGNoIHRoZSBzcGVjCisyMjhkOTZhNSBtYXJrIFZQOHssTH17R2V0SW5mbyxDaGVja1NpZ25hdHVyZX0gYXMgV0VCUF9FWFRFUk4KKzYzN2EzMTRmIHJlbW92ZSB0aGUgbm93IHVudXNlZCAqS2VlcEEgdmFyaWFudHMKK2QxMWY2ZmNjIHdlYnBtdXggcmV0dXJucyBlcnJvciBzdHJpbmdzIHJhdGhlciB0aGFuIG51bWJlcnMKK2ZjZWMwNTkzIG1ha2VmaWxlLnVuaXg6IGN3ZWJwOiBmaXggT1NYIGxpbmsKKzZiODExZjFiIE1lcmdlICJkb2M6IHJlbW92ZSBsb3NzbGVzcyBwZGYiCitjOTYzNDgyMSBkb2M6IHJlbW92ZSBsb3NzbGVzcyBwZGYKK2I5YWU0ZjBkIGNvc21ldGljcyBhZnRlciBtdXggY2hhbmdlcyBiNzRlZDZlLCBiNDk0YWQ1CitiNDk0YWQ1MCBNdXg6IG9ubHkgYWxsb3cgYWRkaW5nIGZyYW1lL3RpbGVzIGF0IHRoZSBlbmQuCisyYzM0MWIwZSBNZXJnZSAiQWRkZWQgaW1hZ2UgY2hhcmFjdGVyaXN0aWMgaGludCBmb3IgdGhlIGNvZGVjLiIKK2QzNzMwNzZhIEFkZGVkIGltYWdlIGNoYXJhY3RlcmlzdGljIGhpbnQgZm9yIHRoZSBjb2RlYy4KKzJlZDJhZGI1IE1lcmdlICJtc3ZjOiBhZGQgaW50cmluc2ljIGJhc2VkIEJpdHNMb2cyRmxvb3IiCitlNTk1ZTdjNSBNZXJnZSAiYWRkIGRlbXV4LmMgdG8gdGhlIG1ha2VmaWxlcyIKK2RhNDdiNWJkIE1lcmdlICJkZW11eDogYWRkIHtOZXh0LFByZXZ9Q2h1bmsiCitlNWY0Njc0MiBhZGQgZGVtdXguYyB0byB0aGUgbWFrZWZpbGVzCis0NzA4MzkzYyBkZW11eDogYWRkIHtOZXh0LFByZXZ9Q2h1bmsKK2U4YTBhODIxIGRlbXV4OiBxdWlldCBtc3ZjIHdhcm5pbmdzCis3Zjg0NzJhNiBVcGRhdGUgdGhlIFdlYlAgQ29udGFpbmVyIFNwZWMuCiszMWI2OGZlNiBjbGVhbnVwIFdlYlBQaWN0dXJlIHN0cnVjdCBhbmQgQVBJCis5MTQ0YTE4NiBhZGQgb3ZlcmZsb3cgY2hlY2sgYmVmb3JlIGNhbGxpbmcgbWFsbG9jKCkKKzgxNzIwYzkxIGNvbnNpc3RlbmN5IGNvc21ldGljcworMmViZTgzOTQgTWVyZ2UgIkFkZCBrcmFtZG93biB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIFJFQURNRSIKKzcxNDQzMDg0IGVuYy92cDhsLmM6IGZpeCBidWlsZAorYjdhYzE5ZmUgQWRkIGtyYW1kb3duIHZlcnNpb24gaW5mb3JtYXRpb24gdG8gUkVBRE1FCitlZmRjYjY2NyBNZXJnZSAiRWRpdCBmb3IgY29uc2lzdGVuY3ksIHVzYWdlIGFuZCBncmFtbWFyLiIKKzA4MjIwMTAyIEVuYWJsZSBhbHBoYSBpbiB2dndlYnAKKzhkZTlhMDg0IE1lcmdlICJNdXggQVBJIGNoYW5nZToiCitiNzRlZDZlNyBNdXggQVBJIGNoYW5nZToKKzIzM2E1ODllIHRha2UgcGljdHVyZS0+YXJnYl9zdHJpZGUgaW50byBhY2NvdW50IGZvciBsb3NzbGVzcyBjb2RpbmcKKzA0ZTMzZjE3IEVkaXQgZm9yIGNvbnNpc3RlbmN5LCB1c2FnZSBhbmQgZ3JhbW1hci4KK2E1NzViNGJjIE1lcmdlICJjb3NtZXRpY3M6IGFkZCBtaXNzaW5nIGNvbnN0IgorOGQ5OWIwZjQgTWVyZ2UgImNvc21ldGljczogcmVtb3ZlIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gcHJvdG8iCis2OWQwMjIxNyBjb3NtZXRpY3M6IGFkZCBtaXNzaW5nIGNvbnN0Cis1YjA4MzE4YiBjb3NtZXRpY3M6IHJlbW92ZSB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHByb3RvCitiN2ZiMGVkNSBMb2cgd2FybmluZyBmb3IgdW5zdXBwb3J0ZWQgb3B0aW9ucyBmb3IgbG9zc2xlc3MuCitlMWY3NjlmZSBtc3ZjOiBhZGQgaW50cmluc2ljIGJhc2VkIEJpdHNMb2cyRmxvb3IKKzhhNjljN2Q4IEJ1Zy1maXg6IENsYW1wIGJhY2t3YXJkIGRpc3QgdG8gMS4KK2I1YjZhYzk3IE1lcmdlICJCcmluZyB0aGUgc3BlY2lhbCB3cml0ZXIgJ1dlYlBNZW1vcnlXcml0ZXInIHRvIHB1YmxpYyBBUEkiCithNmExOTA5ZiBNZXJnZSAiRml4IGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiB3aXRoIGN3ZWJwIC1wcm9ncmVzcyIKK2YyY2VlMDY3IEZpeCBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gd2l0aCBjd2VicCAtcHJvZ3Jlc3MKKzkxYjdhOGM3IEJyaW5nIHRoZSBzcGVjaWFsIHdyaXRlciAnV2ViUE1lbW9yeVdyaXRlcicgdG8gcHVibGljIEFQSQorMzEwZTI5NzIgc3VwcG9ydCByZXNpemUgYW5kIGNyb3AgZm9yIFJHQkEgaW5wdXQKK2E4OTgzNWQzIE1lcmdlIGNoYW5nZXMgSWNlNjYyOTYwLEllOGQ3YWE5MCxJMmQ5OTZkNWUsSTAxYzA0NzcyCitjZTYxNGMwYyBNZXJnZSAiZGVjL3ZwODogYXZvaWQgc2V0dGluZyBkZWNvZGVyIHN0YXR1cyB0d2ljZSIKKzkwMDI4NWRhIGRlYy92cDg6IGF2b2lkIHNldHRpbmcgZGVjb2RlciBzdGF0dXMgdHdpY2UKKzgyMjdhZGM4IE1lcmdlIGNoYW5nZXMgSTZmMDJiMGQwLEk1Y2JjOWMwYSxJOWRkOWQ0ZWQsSWQ2ODRkMmExCitkY2RhNTljMSBNZXJnZSAiZGVtdXg6IHJlbmFtZSBTZXRUaWxlIHRvIFNlbGVjdFRpbGUiCis2MjJlZjEyZSBkZW11eDogcmVuYW1lIFNldFRpbGUgdG8gU2VsZWN0VGlsZQorODFlYmQzNzUgTWVyZ2UgImRlbXV4OiBhZGQge05leHQsUHJldn1GcmFtZSIKKzAyZGQzN2EyIGRlbXV4OiBhZGQge05leHQsUHJldn1GcmFtZQorNGI3OWZhNTkgTWVyZ2UgIkxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgaHVmZm1hbiBJbWFnZSB0byAxNk1CLiIKKzlhYTM0YjM0IE1hbnVhbGx5IG51bWJlciAiY2hhcHRlcnMsIiBhcyBjaGFwdGVyIG51bWJlcnMgYXJlIHVzZWQgaW4gdGhlIG5hcnJhdGl2ZS4KKzJhNGM2YzI5IFJlLXdyYXAgYXQgPD0gNzIgY29sdW1ucworYTQ1YWRjMTkgQXBwbHkgaW5saW5lIGVtcGhhc2lzIGFuZCBtb25vc3BhY2luZywgcGVyIGdkb2MgLyBQREYKKzkxMDExMjA2IEluY29ycG9yYXRlIGdkb2MgY2hhbmdlcyB0aHJvdWdoIDIwMTItMDYtMDgKKzdhMTgyNDg3IFJlbW92ZWQgQ29kZVJheSBzeW50YXggZGVjbGFyYXRpb25zIC4uLgorYjNlYzE4YzUgUHJvdmlkZSBmb3IgY29kZS1ibG9jayBzeW50YXggaGlnaGxpZ2h0aW5nLgorNzA5ZDc3MDIgUmVwbGFjZSBoaWdoIEFTQ0lJIGFydGlmYWN0cyAoY3VybHkgcXVvdGVzLCBldGMuKS4KKzkzMGU4YWJiIExvc3NsZXNzIFdlYlAgZG9jIGxhcmdlbHkgcG9ydGVkIHRvIG1hcmtkb3duIHRleHQuCisxOGNhZTM3YiBtc3ZjOiBzaWxlbmNlIHNvbWUgYnVpbGQgd2FybmluZ3MKK2IzOTIzMDg0IExpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgaHVmZm1hbiBJbWFnZSB0byAxNk1CLgorZjE4MGRmMmEgTWVyZ2UgImxpYndlYnAvZGVtdXg6IGFkZCBGcmFtZS9DaHVuayBpdGVyYXRpb24iCisyYmJlMWM5YSBNZXJnZSAiRW5hYmxlIGxvc3NsZXNzIGVuY29kZXIgY29kZSIKK2QwNjAxYjAxIE1lcmdlIGNoYW5nZXMgSTFkOTdhNjMzLEk4MWM1OTA5MworNzhmM2UzNDUgRW5hYmxlIGxvc3NsZXNzIGVuY29kZXIgY29kZQorZDk3NGE5Y2MgTWVyZ2UgImxpYndlYnAvZGVtdXg6IGFkZCBzaW1wbGUgZm9ybWF0IHBhcnNpbmciCisyNmJmMjIzMiBNZXJnZSAibGlid2VicDogYWRkIFdlYlBEZW11eCBzdHViIGZ1bmN0aW9ucyIKKzJmNjY2Njg4IE1lcmdlICJtb2RpZnkgV2ViUFBhcnNlSGVhZGVycyB0byBhbGxvdyByZXVzZSBieSBHZXRGZWF0dXJlcyIKK2I0MDJiMWZiIGxpYndlYnAvZGVtdXg6IGFkZCBGcmFtZS9DaHVuayBpdGVyYXRpb24KK2FkOWFkYTNiIGxpYndlYnAvZGVtdXg6IGFkZCBXZWJQRGVtdXhHZXRJCisyZjJkNGQ1OCBsaWJ3ZWJwL2RlbXV4OiBhZGQgZXh0ZW5kZWQgZm9ybWF0IHBhcnNpbmcKKzk2MmRjZWY2IGxpYndlYnAvZGVtdXg6IGFkZCBzaW1wbGUgZm9ybWF0IHBhcnNpbmcKK2Y4Zjk0MDgxIGxpYndlYnA6IGFkZCBXZWJQRGVtdXggc3R1YiBmdW5jdGlvbnMKK2ZiNDdiYjVjIE1lcmdlICJOdW1OYW1lZEVsZW1lbnRzKCkgc2hvdWxkIHRha2UgYW4gZW51bSBwYXJhbS4iCis3YzY4OTgwNSBGaXggYXNzZXJ0cyBpbiBQYWxldHRlIGFuZCBCYWNrd2FyZFJlZmVyZW5jZSBjb2RlLgorZmJkY2I3ZWEgTnVtTmFtZWRFbGVtZW50cygpIHNob3VsZCB0YWtlIGFuIGVudW0gcGFyYW0uCitmYjQ5NDNiZCBtb2RpZnkgV2ViUFBhcnNlSGVhZGVycyB0byBhbGxvdyByZXVzZSBieSBHZXRGZWF0dXJlcworMzY5N2I1Y2Ugd3JpdGUgYW4gYWQtaG9jIEVuY29kZUltYWdlSW50ZXJuYWwgdmFyaWFudAorZWFlZTllNzkgQnVnLUZpeDogRGVjb2RlIHNtYWxsIChsZXNzIHRoYW4gMzIgYnl0ZXMpIGltYWdlcy4KKzBiY2VhZTQ4IE1lcmdlICJjd2VicDogZml4IGFscGhhIHJlcG9ydGluZyBpbiBzdGF0cyBvdXRwdXQiCiswNDI0YjFlZiBSZWJhc2UgZGVmYXVsdCBlbmNvZGluZyBzZXR0aW5ncy4KK2M3MWZmOWUzIGN3ZWJwOiBmaXggYWxwaGEgcmVwb3J0aW5nIGluIHN0YXRzIG91dHB1dAorZTJmZmU0NDYgTWVyZ2UgIlN0b3AgaW5kZWZpbml0ZSByZWN1cnNpb24gZm9yIEh1ZmZtYW4gSW1hZ2UuIgorNzBlYjJiZDYgU3RvcCBpbmRlZmluaXRlIHJlY3Vyc2lvbiBmb3IgSHVmZm1hbiBJbWFnZS4KK2YzYmFiOGViIFVwZGF0ZSB2d2VicAorNmQ1Yzc5N2MgUmVtb3ZlIHN1cHBvcnQgZm9yIHBhcnRpYWwgZmlsZXMgaW4gTXV4LgorZjFkZjU1ODcgV2ViUE11eEFzc2VtYmxlKCkgcmV0dXJucyBXZWJQRGF0YSouCis4MTRhMDYzOSBSZW5hbWUgJ0FkZCcgQVBJcyB0byAnU2V0Jy4KK2JiYjAyMThmIFVwZGF0ZSBNdXggcHN1ZWRvLWNvZGUgZXhhbXBsZXMuCis0ZmM0YTQ3ZiBVc2UgV2ViUERhdGEgaW4gTVVYIHNldCBBUElzCitjNjdiYzk3OSBNZXJnZSAiYWRkIFdlYlBQaWN0dXJlSW1wb3J0UkdCWCgpIGFuZCBXZWJQUGljdHVyZUltcG9ydEJHUlgoKSIKKzI3NTE5YmMyIGFkZCBXZWJQUGljdHVyZUltcG9ydFJHQlgoKSBhbmQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKCkKK2Y4MGNkMjdlIGZhY3Rvcml6ZSBjb2RlIGluIEltcG9ydCgpCis5YjcxNTAyNiBoaXN0b2dyYW06IGFkZCBsb2cyIHdyYXBwZXIKKzhjMzQzNzhmIE1lcmdlICJmaXggc29tZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MiCis0MmY2ZGY5ZCBmaXggc29tZSBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MKKzI1MGMxNmUzIE1lcmdlICJkb2M6IHVwZGF0ZSBsb3NzbGVzcyBwZGYiCis5ZDlkYWJhNCBNZXJnZSAiYWRkIGEgUERGIG9mIHRoZSBsb3NzbGVzcyBzcGVjIgorOGZiYjkxODggcHJlZmVyIHdlYnAvdHlwZXMuaCBvdmVyIHN0ZGludC5oCiswY2ExNzBjMiBkb2M6IHVwZGF0ZSBsb3NzbGVzcyBwZGYKKzA4NjJhYzZlIGFkZCBhIFBERiBvZiB0aGUgbG9zc2xlc3Mgc3BlYworNDM3OTk5ZmIgaW50cm9kdWNlIGEgZ2VuZXJpYyBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeSgpIGZ1bmN0aW9uCitkMmI2YzZjMCBjb3NtZXRpYyBmaXhlcyBhZnRlciBJZGFiYTI4MWEKK2I0ZTY2NDVjIE1lcmdlICJhZGQgY29sb3JzcGFjZSBmb3IgcHJlbXVsdGlwbGllZCBhbHBoYSIKKzQ4ZjgyNzU3IGFkZCBjb2xvcnNwYWNlIGZvciBwcmVtdWx0aXBsaWVkIGFscGhhCiswNjlmOTAzYSBDaGFuZ2UgaW4gbG9zc2xlc3MgYml0LXN0cmVhbS4KKzVmN2JiM2Y1IE1lcmdlICJXZWJQUmVwb3J0UHJvZ3Jlc3M6IHVzZSBub24tZW5jb2RlciBzcGVjaWZpYyBwYXJhbXMiCitmMTgyODFmZiBXZWJQUmVwb3J0UHJvZ3Jlc3M6IHVzZSBub24tZW5jb2RlciBzcGVjaWZpYyBwYXJhbXMKKzllZjMyMjgzIEFkZCBzdXBwb3J0IGZvciByYXcgbG9zc2xlc3MgYml0c3RyZWFtIGluIGRlY29kZXIuCis3Y2JlZTI5YSBGaXggYnVnOiBJbml0SW8gcmVzZXRpbmcgZmFuY3lfdXBzYW1wbGluZyBmbGFnLgorODgwZmQ5OGMgdndlYnA6IGZpeCBleGl0IHcvZnJlZWdsdXQKKzE4NzVkOTI2IHRyYXAgdHdvIHVuY2hlY2tlZCBlcnJvciBjb25kaXRpb25zCis4N2I0YTkwOCBubyBuZWVkIHRvIGhhdmUgbXV4LmggYXMgbm9pbnN0IGNsYXVzZSBpbiBlbmMvCis4OGY0MWVjNiBkb2M6IGZpeCBiaXQgYWxpZ25tZW50IGluIFZQOFggY2h1bmsKKzUyZjVhNGVmIE1lcmdlICJmaXggYnVnIHdpdGggbG9zc3ktYWxwaGEgb3V0cHV0IHN0cmlkZSIKKzNiZGUyMmQ3IGZpeCBidWcgd2l0aCBsb3NzeS1hbHBoYSBvdXRwdXQgc3RyaWRlCis0MmQ2MWI2ZCB1cGRhdGUgdGhlIHNwZWMgZm9yIHRoZSBsb3NzeS1hbHBoYSBjb21wcmVzc2lvbiBtZXRob2RzLgorZTc1ZGM4MDUgTW92ZSBzb21lIG1vcmUgZGVmaW5lcyB0byBmb3JtYXRfY29uc3RhbnRzLmgKK2MxM2Y2NjMyIE1vdmUgY29uc3RzIHRvIGludGVybmFsIGhlYWRlciBmb3JtYXRfY29uc3RhbnRzLmgKKzdmMmRmYzkyIHVzZSBhIGJpdC1zZXQgdHJhbnNmb3Jtc19zZWVuXyBpbnN0ZWFkIG9mIGxvb3BpbmcKKzE4ZGExZjUzIG1vZHVsYXRlIGFscGhhLWNvbXByZXNzaW9uIGVmZm9ydCBhY2NvcmRpbmcgdG8gY29uZmlnLm1ldGhvZAorZjVmMmZmZjYgTWVyZ2UgIkFscGhhIGZsYWcgZml4IGZvciBsb3NzbGVzcy4iCitjOTc1YzQ0ZSBBbHBoYSBmbGFnIGZpeCBmb3IgbG9zc2xlc3MuCis0ZjA2N2ZiMiBNZXJnZSAiQW5kcm9pZDogb25seSBidWlsZCBkZWNfbmVvbiB3aXRoIE5FT04gc3VwcG9ydCIKKzI1NWM2NmI0IEFuZHJvaWQ6IG9ubHkgYnVpbGQgZGVjX25lb24gd2l0aCBORU9OIHN1cHBvcnQKKzhmOTExN2E5IGNvc21ldGljczogc2lnbmF0dXJlIGZpeGVzCiszOWJmNWQ2NCB1c2UgaGVhZGVyLWxlc3MgbG9zc2xlc3MgYml0c3RyZWFtIGZvciBhbHBoYSBjaGFubmVsCis3NWQ3ZjNiMiBNZXJnZSAibWFrZSBpbnB1dCBkYXRhIGJlICdjb25zdCcgZm9yIFZQOExJbnZlcnNlVHJhbnNmb3JtKCkiCis5YTcyMWM2ZCBtYWtlIGlucHV0IGRhdGEgYmUgJ2NvbnN0JyBmb3IgVlA4TEludmVyc2VUcmFuc2Zvcm0oKQorOWZjNjRlZGMgRGlzYWxsb3cgcmUtdXNlIG9mIHNhbWUgdHJhbnNmb3JtYXRpb24uCis5OGVjNzE3ZiAgdXNlIGEgZnVuY3Rpb24gcG9pbnRlciBmb3IgUHJvY2Vzc1Jvd3MoKQorZjdhZTVlMzcgY29zbWV0aWNzOiBqb2luIGxpbmUKKzE0MGI4OWEzIGZhY3RvciBvdXQgYnVmZmVyIGFsbG9jIGluIEFsbG9jYXRlQVJHQkJ1ZmZlcnMoKQorYTEwN2RmYTggUmVjdGlmeSBXZWJQUGFyc2VPcHRpb25hbENodW5rcygpLgorMjM3ZWFiNjcgQWRkIHR3byBtb3JlIGNvbG9yLXNwYWNlcyBmb3IgbG9zc2xlc3MgZGVjb2RpbmcuCisyN2Y0MTdhYiBmaXggb3J0aG9ncmFwaGljIHR5cG8KKzQ4OWVjMzM1IGFkZCBWUDhMRW5jb2RlU3RyZWFtKCkgdG8gY29tcHJlc3MgbG9zc2xlc3MgaW1hZ2Ugc3RyZWFtCitmYThiYzNkYiBtYWtlIFdlYlBFbmNvZGluZ1NldEVycm9yKCkgdGFrZSBhIGNvbnN0IHBpY3R1cmUKKzYzODUyOGNkIGJpdHN0cmVhbSB1cGRhdGUgZm9yIGxvc3N5IGFscGhhIGNvbXByZXNzaW9uCitkNzNlNjNhNyBhZGQgRGVxdWFudGl6ZUxldmVscygpIHBsYWNlaG9sZGVyCitlYzEyMmUwOSByZW1vdmUgYXJjaC1kZXBlbmRlbnQgcmFuZCgpCitkNDBlNzY1MyBmaXggYWxpZ25tZW50CisxZGQ2YThiNiBNZXJnZSAicmVtb3ZlIHRjb2Rlciwgc3dpdGNoIGFscGhhLXBsYW5lIGNvbXByZXNzaW9uIHRvIGxvc3NsZXNzIgorM2U4NjNkZGEgcmVtb3ZlIHRjb2Rlciwgc3dpdGNoIGFscGhhLXBsYW5lIGNvbXByZXNzaW9uIHRvIGxvc3NsZXNzCis4ZDc3ZGMyOSBBZGQgc3VwcG9ydCBmb3IgbG9zc2xlc3MgaW4gbXV4OgorODMxYmQxMzEgTWFrZSB0aWxlIHNpemUgYSBmdW5jdGlvbiBvZiBlbmNvZGluZyBtZXRob2QuCis3NzhjNTIyOCBNZXJnZSAicmVtb3ZlIHNvbWUgdmFyaWFibGUgc2hhZG93aW5nIgorODE3YzlkY2UgRmV3IG1vcmUgSHVmZm1hblRyZWVUb2tlbiBjb252ZXJzaW9ucy4KKzM3YTc3YTZiIHJlbW92ZSBzb21lIHZhcmlhYmxlIHNoYWRvd2luZworODljMDdjOTYgTWVyZ2UgIm5vcm1hbGl6ZSBleGFtcGxlIGhlYWRlciBpbmNsdWRlcyIKKzRhZmY0MTFmIE1lcmdlICJhZGQgZXhhbXBsZV91dGlsLltoY10iCiswMGIyOWUyOCBub3JtYWxpemUgZXhhbXBsZSBoZWFkZXIgaW5jbHVkZXMKKzA2MTI2M2E3IGFkZCBleGFtcGxlX3V0aWwuW2hjXQorYzY4ODJjNDkgbWVyZ2UgYWxsIHRyZWUgcHJvY2Vzc2luZyBpbnRvIGEgc2luZ2xlIFZQOExQcm9jZXNzVHJlZSgpCis5YzdhM2NmNSBmaXggVlA4TEhpc3RvZ3JhbU51bUNvZGVzIHRvIGhhbmRsZSB0aGUgY2FzZSBwYWxldHRlX2NvZGVfYml0cyA9PSAwCitiNTU1MWQyZSBNZXJnZSAiQWRkZWQgSHVmZm1hblRyZWVDb2RlIFN0cnVjdCBmb3IgdHJlZSBjb2Rlcy4iCis4Yjg1ZDAxYyBBZGRlZCBIdWZmbWFuVHJlZUNvZGUgU3RydWN0IGZvciB0cmVlIGNvZGVzLgorMDkzZjc2ZDggTWVyZ2UgIkFsbG9jYXRlIHNpbmdsZSBtZW1vcnkgaW4gR2V0SHVmZkJpdExlbmd0aHNBbmRDb2Rlcy4iCis0MWQ4MDQ5NCBBbGxvY2F0ZSBzaW5nbGUgbWVtb3J5IGluIEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMuCisxYjA0ZjZkMiBDb3JyZWN0IHNpemUgaW4gVlA4TCBoZWFkZXIuCisyOTI0YTVhZSBNYWtlZmlsZS52Yzogc3BsaXQgb2JqZWN0IGxpc3RzIGJhc2VkIG9uIGRpcmVjdG9yeQorYzhmMjQxNjUgTWVyZ2UgImFkZCBhc3NlcnQodG9rZW5zKSIKKzQzMjM5OTQ3IGFkZCBhc3NlcnQodG9rZW5zKQorOWY1NDc0NTAgQ2F0Y2ggYW4gZXJyb3IgaW4gRGVjb2RlSW1hZ2VEYXRhKCkuCithYzhlNWU0MiBtaW5vciB0eXBvIGFuZCBzdHlsZSBmaXgKKzlmNTY2ZDFkIGNsZWFuLXVwIGFyb3VuZCBIdWZmbWFuLWVuY29kZQorYzU3OWE3MTAgSW50cm9kdWNlIENIVU5LX1NJWkVfQllURVMgaW4gbXV4aS5oLgorMTQ3NTdmOGEgTWFrZSBzdXJlIGh1ZmZtYW4gdHJlZXMgYWx3YXlzIGhhdmUgdmFsaWQgc3ltYm9scworNDEwNTA2MTggbWFrZWZpbGUudW5peDogYWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHZ3ZWJwCis0OGIzNzcyMSBNZXJnZSAiZml4ZWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZyIKKzU3ZjY5NmRhIE1lcmdlICJFbmNvZGVJbWFnZUludGVybmFsOiBmaXggcG90ZW50aWFsIGxlYWsiCitkOTcyY2RmMiBFbmNvZGVJbWFnZUludGVybmFsOiBmaXggcG90ZW50aWFsIGxlYWsKKzVjZDEyYzNkIGZpeGVkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmcKK2NkY2EzMGQwIE1lcmdlICJjb3NtZXRpY3M6IHNob3J0ZW4gbG9uZyBsaW5lIgorZTAyNWZiNTUgY29zbWV0aWNzOiBzaG9ydGVuIGxvbmcgbGluZQorMjI2NzFlZDYgTWVyZ2UgImVuYy92cDhsOiBmaXggZG91YmxlIGZyZWUgb24gZXJyb3IiCitlMWI5YjA1MiBNZXJnZSAiY29zbWV0aWNzOiBWUDhMQ3JlYXRlSHVmZm1hblRyZWU6IGZpeCBpbmRlbnQiCithOGU3MjVmOCBlbmMvdnA4bDogZml4IGRvdWJsZSBmcmVlIG9uIGVycm9yCisyNzU0MWZiZCBjb3NtZXRpY3M6IFZQOExDcmVhdGVIdWZmbWFuVHJlZTogZml4IGluZGVudAorMWQzOGIyNTggY3dlYnAvd2luZG93czogdXNlIE1BS0VfUkVGR1VJRCB3aGVyZSBhcHByb3ByaWF0ZQorODE3ZWY2ZTkgTWVyZ2UgImN3ZWJwOiBmaXggV0lDL01pY3Jvc29mdCBTREsgY29tcGF0aWJpbGl0eSBpc3N1ZSIKKzkwMmQzZTNiIGN3ZWJwOiBmaXggV0lDL01pY3Jvc29mdCBTREsgY29tcGF0aWJpbGl0eSBpc3N1ZQorODlkODAzYzQgTWVyZ2UgIkZpeCBhIGNyYXNoIGR1ZSB0byB3cm9uZyBwb2ludGVyLWludGVnZXIgYXJpdGhtZXRpYy4iCitjYjFiZDc0MSBNZXJnZSAiRml4IGEgY3Jhc2ggaW4gbG9zc2xlc3MgZGVjb2Rlci4iCitkZTJmZTIwMiBNZXJnZSAiU29tZSBjbGVhbnVwIGluIFZQOExDcmVhdGVIdWZmbWFuVHJlZSgpIChhbmQgcmVsYXRlZCBmdW5jdGlvbnMgQ29tcGFyZUh1ZmZtYW5UcmVlcygpIGFuZCBTZXRCaXREZXB0aHMoKSk6IC0gTW92ZSAndHJlZV9zaXplJyBpbml0aWFsaXphdGlvbiBhbmQgbWFsbG9jIGZvciAndHJlZSArIHRyZWVfcG9vbCcgICBvdXRzaWRlIHRoZSBsb29wLiAtIFNvbWUgcmVuYW1lcy90d2Vha3MgZm9yIHJlYWRhYmlsaXR5LiIKK2NlNjkxNzdhIEZpeCBhIGNyYXNoIGR1ZSB0byB3cm9uZyBwb2ludGVyLWludGVnZXIgYXJpdGhtZXRpYy4KK2U0MGEzNjg0IEZpeCBhIGNyYXNoIGluIGxvc3NsZXNzIGRlY29kZXIuCiszOTI3ZmYzYSByZW1vdmUgdW5uZWVkZWQgZXJyb3IgY29uZGl0aW9uIGZvciBXZWJQTXV4TnVtTmFtZWRFbGVtZW50cygpCisyYzE0MGUxMSBTb21lIGNsZWFudXAgaW4gVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKCkgKGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBDb21wYXJlSHVmZm1hblRyZWVzKCkgYW5kIFNldEJpdERlcHRocygpKTogLSBNb3ZlICd0cmVlX3NpemUnIGluaXRpYWxpemF0aW9uIGFuZCBtYWxsb2MgZm9yICd0cmVlICsgdHJlZV9wb29sJyAgIG91dHNpZGUgdGhlIGxvb3AuIC0gU29tZSByZW5hbWVzL3R3ZWFrcyBmb3IgcmVhZGFiaWxpdHkuCis4NjFhNWI3YiBhZGQgc3VwcG9ydCBmb3IgYW5pbWF0aW9uCitlYjVjMTZjYyBNZXJnZSAiU2V0IGNvcnJlY3QgZW5jb2RlIHNpemUgaW4gZW5jb2RlcidzIHN0YXRzLiIKKzRhYmUwNGEyIGZpeCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBoYW5kbGUgbWlzc2luZyBpbnB1dCBmaWxlIGNhc2UuCisyZmFmYjg1NSBTZXQgY29ycmVjdCBlbmNvZGUgc2l6ZSBpbiBlbmNvZGVyJ3Mgc3RhdHMuCitlNzE2N2EyYiBQcm92aWRlIG9uZSBlbnRyeSBwb2ludCBmb3IgYmFja3dhcmQgcmVmZXJlbmNlcy4KK2M0Y2NhYjY0IFByaW50IHJlbGV2YW50IGxvc3NsZXNzIGVuY29kaW5nIHN0YXRzIGluIGN3ZWJwLgorZTMzMDJjZmQgR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlczogcmVkdWNlIGxldmVsIG9mIGluZGlyZWN0aW9uCitiNWYyYTllZCBlbmMvdnA4bDogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgd2FybmluZworNzg4NWY4YjIgbWFrZWZpbGUudW5peDogYWRkIGxvc3NsZXNzIGVuY29kZXIgZmlsZXMKKzEyNjFhNGM4IE1lcmdlICJjb3NtZXRpY3MiCiszOTI2YjViZSBNZXJnZSAiZHNwL2NwdS5jOiBBbmRyb2lkOiBmaXggY3Jhc2ggb24gbm9uLW5lb24gYXJtIGJ1aWxkcyIKKzgzNGY5MzdmIGRzcC9jcHUuYzogQW5kcm9pZDogZml4IGNyYXNoIG9uIG5vbi1uZW9uIGFybSBidWlsZHMKKzEyNmUxNjA2IGNvc21ldGljcworZTM4NjAyZDIgTWVyZ2UgYnJhbmNoICdsb3NzbGVzc19lbmNvZGVyJworZThkM2Q2YTAgc3BsaXQgU3RvcmVIdWZmbWFuQ29kZSgpIGludG8gc21hbGxlciBmdW5jdGlvbnMKK2QwZDg4OTkwIG1vcmUgY29uc29saWRhdGlvbjogaW50cm9kdWNlIFZQOExIaXN0b2dyYW1TZXQKKzFhMjEwZWYxIGJpZyBjb2RlIGNsZWFuLXVwIGFuZCByZWZhY3RvcmluZyBhbmQgb3B0aW1pemF0aW9uCis0MWI1YzhmZiBTb21lIGNvc21ldGljcyBpbiBoaXN0b2dyYW0uYworYWRhNmZmNzcgQXBwcm94aW1hdGUgRmFzdExvZyBiZXR3ZWVuIHZhbHVlIHJhbmdlIFsyNTYsIDgxOTJdCitlYzEyM2NhMyBGb3Jnb3QgdG8gdXBkYXRlIG91dF9iaXRfY29zdHMgdG8gc3ltYm9sX2JpdF9jb3N0cyBhdCBvbmUgaW5zdGFuY2UuCitjZjMzY2NkMSBFdmFsdWF0ZSBvdXRwdXQgY2x1c3RlcidzIGJpdF9jb3N0cyBvbmNlIGluIEhpc3RvZ3JhbVJlZmluZS4KKzc4MWMwMWY0IFNpbXBsZSBIdWZmbWFuIGNvZGUgY2hhbmdlcy4KK2EyODQ5YmM1IExvc3NsZXNzIGRlY29kZXI6IHJlbW92ZSBhbiB1bm5lZWRlZCBwYXJhbSBpbiBSZWFkSHVmZm1hbkNvZGVMZW5ndGhzKCkuCitiMzllNzQ4NyBSZWR1Y2luZyBlbWVyZ2luZyBwYWxldHRlIHNpemUgZnJvbSAxMSB0byA5IGJpdHMuCitiZmM3M2RiNCBNb3ZlIEdldEhpc3RJbWFnZVN5bWJvbHMgdG8gaGlzdG9ncmFtLmMKKzg4OWE1Nzg2IEltcHJvdmUgcHJlZGljdCB2cyBuby1wcmVkaWN0IGhldXJpc3RpYy4KKzAxZjUwNjYzIGNvZGUtbW92aW5nIGFuZCBjbGVhbi11cAorMzEwMzVmM2IgcmVkdWNlIG1lbW9yeSB1c2FnZSBieSBhbGxvY2F0aW5nIG9ubHkgb25lIGhpc3RvCitmYmI1MDFiOCBSZXN0cmljdCBoaXN0b19iaXRzIHRvIGVuc3VyZSBoaXN0b19pbWFnZSBzaXplIGlzIHVuZGVyIDMyTUIKKzg0MTVkZGYzIGZ1cnRoZXIgc2ltcGxpZmljYXRpb24gZm9yIHRoZSBtZXRhLUh1ZmZtYW4gY29kaW5nCitlNDkxNzI5OSBBIHF1aWNrIHBhc3Mgb2YgY2xlYW51cCBpbiBiYWNrd2FyZCByZWZlcmVuY2UgY29kZQorODMzMzJiM2MgTWFrZSB0cmFuc2Zvcm0gYml0cyBhIGZ1bmN0aW9uIG9mIGVuY29kZSBtZXRob2QgKC1tKS4KKzcyOTIwY2FhIGludHJvZHVjZSAtbG9zc2xlc3Mgb3B0aW9uLCBwcm90ZWN0ZWQgYnkgVVNFX0xPU1NMRVNTX0VOQ09ERVIKK2M2YWM0ZGZiIFJ1biBUcmFjZUJhY2t3YXJkcyBmb3IgaGlnaGVyIHF1YWxpdGllcy4KKzQxMjIyMmM4IE1ha2UgaGlzdG9fYml0cyBhbmQgdHJhbnNmb3JtX2JpdHMgZnVuY3Rpb24gb2YgcXVhbGl0eS4KKzE0OWI1MDk4IFVwZGF0ZSBsb3NzbGVzcyBlbmNvZGVyIHN0cmF0ZWd5OgorMGU2ZmEwNjUgY2FjaGVfYml0cyBwYXNzZWQgdG8gRW5jb2RlSW1hZ2VJbnRlcm5hbCgpCitlMzhiNDBhOSBGYWN0b3JpemUgY29kZSBmb3IgY2xlYXJpbmcgSHRyZWVHcm91cC4KKzZmNGExNmVhIFJlbW92aW5nIHRoZSBpbmRpcmVjdGlvbiBvZiBtZXRhLWh1ZmZtYW4gdGFibGVzLgorM2QzM2VjZDEgU29tZSByZW5hbWluZy9jb21tZW50cyByZWxhdGVkIHRvIHBhbGV0dGUgaW4gbG9zc2xlc3MgZW5jb2Rlci4KKzRkMDJkNTg2IExvc3NsZXNzIGVuY29kZXI6IGNvcnJlY3Rpb24gaW4gUGFsZXR0ZSBzdG9yYWdlCis0YTYzNjIzNSBmaXggYSBtZW1sZWFrIGluIEVuY29kZUltYWdlSW50ZXJuYWwoKQorMDk5M2E2MTEgRnVsbCBhbmQgZmluYWwgZml4IGZvciBwcmVkaWN0aW9uIHRyYW5zZm9ybQorYWZkMjEwMmYgRml4IGNyb3NzLWNvbG9yIHRyYW5zZm9ybSBpbiBsb3NzbGVzcyBlbmNvZGVyCitiOTZkODc0MCBOZWVkIHRvIHdyaXRlIGEgJzAnIGJpdCBhdCB0aGUgZW5kIG9mIHRyYW5zZm9ybXMuCis1NGRhZDdlNSBDb2xvciBjYWNoZSBzaXplIHNob3VsZCBiZSBjb3VudGVkIGFzIDAgd2hlbiBjYWNoZSBiaXRzID0gMAorNGYwYzVjYWYgRml4IHByZWRpY3Rpb24gdHJhbnNmb3JtIGluIGxvc3NsZXNzIGVuY29kZXIuCiszNmRhYmRhZCBGaXggbWVtb3J5IGxlYWsgaW4gbWV0aG9kIEVuY29kZUltYWdlSW50ZXJuYWwgZm9yIGhpc3RvZ3JhbV9pbWFnZS4KKzM1MmE0ZjQ5IEdldCByaWQgb2YgUGFja0xpdGVyYWxCaXRMZW5ndGhzKCkKK2Q2NzNiNmI5IENoYW5nZSB0aGUgcHJlZGljdG9yIGZ1bmN0aW9uIHRvIHBhc3MgbGVmdCBwaXhlbAorYjJmOTk0NjUgRml4IENvcHlUaWxlV2l0aFByZWRpY3Rpb24oKQorODQ1NDdmNTQgQWRkIEVuY29kZUltYWdlSW50ZXJuYWwoKSBtZXRob2QuCis2YjM4Mzc4YSBHdWFyZCB0aGUgbG9zc2xlc3MgZW5jb2RlciAoaW4gZmx1eCkgdW5kZXIgYSBmbGFnCiswOWY3NTMyYyBGaXggZmV3IG5pdHMgKGNvbnN0IHF1YWxpZmllcnMpCis2NDhiZTM5MyBBZGRlZCBpbXBsZW1lbnRhdGlvbiBmb3IgdmFyaW91cyBsb3NzbGVzcyBmdW5jdGlvbnMKKzMyNzE0Y2UzIEFkZCBWUDhMIHByZWZpeCB0byBiYWNrd2FyZCByZWYgJiBoaXN0b2dyYW0gbWV0aG9kcy4KK2ZjYmE3YmUyIEZpeGVkIGhlYWRlciBmaWxlIHRhZyAoV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9IXykKK2JjNzAzNzQ2IEFkZCBiYWNrd2FyZF9yZWYsIGhpc3RvZ3JhbSAmIGh1ZmZtYW4gZW5jb2RlIG1vZHVsZXMgZnJvbSBsb3NzbGVzcy4KK2ZkY2NhYWRkIEZpeGluZyBuaXRzCisyMjcxMTBjNCBsaWJ3ZWJwIGludGVyZmFjZSBjaGFuZ2VzIGZvciBsb3NzbGVzcyBlbmNvZGluZy4KKzUwNjc5YWNmIG1pbm9yIHN0eWxlIGZpeGVzCitiMzhkZmNjZiByZW1vdmUgdW5uZWVkZWQgcmVmZXJlbmNlIHRvIE5VTV9MSVRFUkFMX0NPREVTCis4OTc5Njc1YiBoYXJtb25pemUgaGVhZGVyIGRlc2NyaXB0aW9uCitjMDRlYjdiZSB0Y29kZXIuYzogZGVmaW5lIE5PVF9IQVZFX0xPRzIgZm9yIE1TVkMgYnVpbGRzCis5YTIxNGZhMSBNZXJnZSAiVlA4W0xdR2V0SW5mbzogY2hlY2sgaW5wdXQgcG9pbnRlcnMiCis1YzViZThiYSBWUDhbTF1HZXRJbmZvOiBjaGVjayBpbnB1dCBwb2ludGVycworMGMxODhmZWMgTWVyZ2UgY2hhbmdlcyBJNDMxYWNkZmUsSTcxMzY1OWI3CitiMzUxNWM2MiBtdXg6IGRyb3AgJ2NodW5rJyBmcm9tIENodW5rSW5mbyBtZW1iZXIgbmFtZXMKK2FlYTc5MjNjIG11eGkuaDogcmVtb3ZlIHNvbWUgdW51c2VkIGRlZmluZXMKKzAxNDIyNDkyIHVwZGF0ZSBORVdTIGZpbGUgZm9yIG5leHQgcmVsZWFzZQorMjllM2Y3ZWMgTWVyZ2UgImRlYzogcmVtb3ZlIGRlcHJlY2F0ZWQgV2ViUElOZXcoKSIKKzQ3MThlNDQ5IE1lcmdlICJtdXhlZGl0OiBhIGZldyBtb3JlIHNpemVfdCBjaGFuZ2VzIgorODI2NTRmOTYgTWVyZ2UgIm11eGVkaXQ6IHJlbW92ZSBhIGZldyByZWR1bmRhbnQgTlVMTCBjaGVja3MiCiswMmYyN2ZiZCBkZWM6IHJlbW92ZSBkZXByZWNhdGVkIFdlYlBJTmV3KCkKK2NjZGRiM2ZjIG11eGVkaXQ6IHJlbW92ZSBhIGZldyByZWR1bmRhbnQgTlVMTCBjaGVja3MKK2E2Y2RmNzEwIG11eGVkaXQ6IGEgZmV3IG1vcmUgc2l6ZV90IGNoYW5nZXMKK2EzODQ2ODkyIE1lcmdlICJtdXg6IHJlbW92ZSB1bnVzZWQgTElTVF9JRCIKKzExYWU0NmFlIGFscGhhLmM6IHF1aWV0IHNvbWUgc2l6ZV90IC0+IGludCBjb252ZXJzaW9uIHdhcm5pbmdzCitkZWU0NjY5MiBtdXg6IHJlbW92ZSB1bnVzZWQgTElTVF9JRAorMDNmMWY0OTMgbXV4OiBhZGQgdmVyc2lvbiBjaGVja2VkIGVudHJ5IHBvaW50cworNmEwYWJkYWEgTWVyZ2UgImRvYzogdGlsZS9hbHBoYSBjb3JyZWN0aW9ucyIKK2M4MTM5ZmJlIE1lcmdlICJmZXcgY29zbWV0aWNzIgorNjgzMzg3MzcgTWVyZ2UgImxvc3NsZXNzOiByZW1vdmUgc29tZSBzaXplX3QgLT4gaW50IGNvbnZlcnNpb25zIgorNTI0OWU5NGEgZG9jOiB0aWxlL2FscGhhIGNvcnJlY3Rpb25zCitkOTZlNzIyYiBodWZmbWFuOiBxdWlldCBpbnQ2NCAtPiBpbnQgY29udmVyc2lvbiB3YXJuaW5nCis1MzIwMjBmMiBsb3NzbGVzczogcmVtb3ZlIHNvbWUgc2l6ZV90IC0+IGludCBjb252ZXJzaW9ucworMjNiZTZlZGYgZmV3IGNvc21ldGljcworMTM0OWVkYWQgTWVyZ2UgImNvbmZpZ3VyZTogQUNfQVJHXyogdXNlIEFTX0hFTFBfU1RSSU5HIgorYmZiY2M2MGEgY29uZmlndXJlOiBBQ19BUkdfKiB1c2UgQVNfSEVMUF9TVFJJTkcKKzE0MjdjYThlIE1lcmdlICJNYWtlZmlsZS5hbTogaGVhZGVyIGZpbGUgbWFpbnRlbmFuY2UiCiswODczMzJlMyBNZXJnZSAicmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgJ3JvdW5kJyBmcm9tIENhbGNQcm9iYSgpIgorOTYzMGUxNjggcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgJ3JvdW5kJyBmcm9tIENhbGNQcm9iYSgpCis5MjA5MmVhYSBNZXJnZSAiYml0X3JlYWRlci5oOiBjb3JyZWN0IGluY2x1ZGUiCithODdmYzNmNiBNZXJnZSAibXV4OiBlbnN1cmUgIyBpbWFnZXMgPSAjIHRpbGVzIgorNTNhZjk5YjEgTWVyZ2UgIm11eDogdXNlIHNpemVfdCBjb25zaXN0ZW50bHkiCiszOWE1N2RhZSBNYWtlZmlsZS5hbTogaGVhZGVyIGZpbGUgbWFpbnRlbmFuY2UKKzFiZDBiZDBkIGJpdF9yZWFkZXIuaDogY29ycmVjdCBpbmNsdWRlCiszMjZhM2M2YiBtdXg6IGVuc3VyZSAjIGltYWdlcyA9ICMgdGlsZXMKKzk1NjY3YjhkIG11eDogdXNlIHNpemVfdCBjb25zaXN0ZW50bHkKKzIzMWVjMWZiIFJlbW92aW5nIHRoZSBpbmRpcmVjdGlvbiBvZiBtZXRhLWh1ZmZtYW4gdGFibGVzLgorMTVlYmNiYWEgY2hlY2sgcmV0dXJuIHBvaW50ZXIgZnJvbSBNdXhJbWFnZUdldExpc3RGcm9tSWQKK2IwZDZjNGE3IE1lcmdlICJjb25maWd1cmU6IHJlbW92ZSB0ZXN0IGZvciB6bGliLmgiCis4Y2NjYWM1MCBNZXJnZSAiZHNwL2xvc3NsZXNzOiBzaWxlbmNlIHNvbWUgYnVpbGQgd2FybmluZ3MiCitiMDg4MTlhNiBkc3AvbG9zc2xlc3M6IHNpbGVuY2Ugc29tZSBidWlsZCB3YXJuaW5ncworN2FlMjI1MjEgQW5kcm9pZC5tazogU1NFMiAmIE5FT04gdXBkYXRlcworMGE0OWUzZjMgTWVyZ2UgIm1ha2VmaWxlLnVuaXggYWRkIG1pc3NpbmcgaGVhZGVyIGZpbGVzIgorMmU3NWE5YTEgTWVyZ2UgImRlY29kZS5oOiB1c2Ugc2l6ZV90IGNvbnNpc3RlbnRseSIKK2ZhMTMwMzVlIGNvbmZpZ3VyZTogcmVtb3ZlIHRlc3QgZm9yIHpsaWIuaAorZDNhZGM4MWQgbWFrZWZpbGUudW5peCBhZGQgbWlzc2luZyBoZWFkZXIgZmlsZXMKKzI2MmZlMDFiIE1lcmdlICJtYWtlZmlsZS51bml4ICYgQW5kcm9pZC5tazogY29zbWV0aWNzIgorNGNjZTEzN2UgTWVyZ2UgImVuY19zc2UyIGFkZCBtaXNzaW5nIHN0ZGxpYi5oIGluY2x1ZGUiCis4MDI1NmI4NSBlbmNfc3NlMiBhZGQgbWlzc2luZyBzdGRsaWIuaCBpbmNsdWRlCis5YjNkMWYzYSBkZWNvZGUuaDogdXNlIHNpemVfdCBjb25zaXN0ZW50bHkKKzY0MDgzZDNjIE1lcmdlICJNYWtlZmlsZS5hbTogY29zbWV0aWNzIgorZGNlYjhiNGQgTWVyZ2UgY2hhbmdlcyBJZjEzMzFkM2MsSTg2ZmUzODQ3CiswZTMzZDdiZiBNZXJnZSAid2VicC9kZWNvZGUuaDogZml4IHByb3RvdHlwZXMiCitmYWMwZjEyZSByZW5hbWUgQml0UmVhZGVyIHRvIFZQOExCaXRSZWFkZXIKK2ZiZDgyYjVhIHR5cGVzLmg6IGNlbnRyYWxpemUgdXNlIG9mIHN0ZGRlZi5oCisyMTU0ODM1ZiBNYWtlZmlsZS5hbTogY29zbWV0aWNzCisxYzkyYmQzNyB2cDhpbzogdXNlIHNpemVfdCBmb3IgYnVmZmVyIHNpemUKKzkwZWFkNzEwIGZpeCBzb21lIG1vcmUgdWludDMyX3QgLT4gc2l6ZV90IHR5cGluZworY2JlNzA1Yzcgd2VicC9kZWNvZGUuaDogZml4IHByb3RvdHlwZXMKKzNmOGVjMWMyIG1ha2VmaWxlLnVuaXggJiBBbmRyb2lkLm1rOiBjb3NtZXRpY3MKKzIxN2VjN2Y0IFJlbW92ZSB0YWJzIGluIGNvbmZpZ3VyZS5hYworYjNkMzVmYzEgTWVyZ2UgIkFuZHJvaWQubWsgJiBNYWtlZmlsZS52YzogYWRkIG5ldyBmaWxlcyIKKzBkZjA0YjllIEFuZHJvaWQubWsgJiBNYWtlZmlsZS52YzogYWRkIG5ldyBmaWxlcworZTRmMjBjNWIgTWVyZ2UgImF1dG9tYWtlOiByZXBsYWNlICdzaWxlbnQtcnVsZXMnIHcvQU1fU0lMRU5UX1JVTEVTIgorOGQyNTRhMDkgY29zbWV0aWNzCis2ODYwYzJlYSBmaXggc29tZSB1aW50MzJfdCAtPiBzaXplX3QgdHlwaW5nCis0YWYxODU4YSBGaXggYSBjcmFzaCBkdWUgdG8gbWF4IHN5bWJvbCBpbiBhIHRyZWUgPj0gYWxwaGFiZXQgc2l6ZQorNmYwMWI4MzAgc3BsaXQgdGhlIFZQOCBhbmQgVlA4TCBkZWNvZGluZyBwcm9wZXJseQorZjI2MjNkYmUgZW5hYmxlIGxvc3NsZXNzIGRlY29kZXIKK2I5NmVmZDdkIGFkZCBkZWMvdnA4aS5oIGNoYW5nZXMgZnJvbSBleHBlcmltZW50YWwKKzE5ZjYzOThlIGFkZCBkZWMvdnA4bHtpLmgsLmN9IGZyb20gZXhwZXJpbWVudGFsCitjNGFlNTNjOCBhZGQgdXRpbHMvYml0X3JlYWRlci5baGNdIGNoYW5nZXMgZnJvbSBleHBlcmltZW50YWwKKzUxNGQwMDg5IGFkZCBkc3AvbG9zc2xlc3MuW2hjXSBmcm9tIGV4cGVyaW1lbnRhbAorOWM2NzI5MWQgYWRkIHV0aWxzL2h1ZmZtYW4uW2hjXSBmcm9tIGV4cGVyaW1lbnRhbAorMzM3OTE0YTAgYWRkIHV0aWxzL2NvbG9yX2NhY2hlLltoY10gZnJvbSBleHBlcmltZW50YWwKK2IzYmY4ZmU3IHRoZSByZWFkLW92ZXJmbG93IGNvZGUtcGF0aCB3YXNuJ3QgcmVwb3J0aW5nIGFzIGFuIGVycm9yCisxZGI4ODhiYSB0YWtlIGNvbG9yc3BhY2UgaW50byBhY2NvdW50IHdoZW4gY3JvcHBpbmcKKzYxYzJkNTFmIG1vdmUgdGhlIHJlc2NhbGluZyBjb2RlIGludG8gaXRzIG93biBmaWxlIGFuZCBtYWtlIGVuYy8gYW5kIGRlYy8gdXNlIGl0LgorZWZjMjAxNmEgTWFrZSByZXNjYWxlciBtZXRob2RzIGdlbmVyaWMKKzNlYWNlZTgxIE1vdmUgcmVzY2FsZXIgbWV0aG9kcyBvdXQgb2YgaW8uYy4KK2E2OWI4OTNkIGF1dG9tYWtlOiByZXBsYWNlICdzaWxlbnQtcnVsZXMnIHcvQU1fU0lMRU5UX1JVTEVTCis2ZjdiZjY0NSBpc3N1ZSAxMTE6IGZpeCBsaXR0bGUtZW5kaWFuIHByb2JsZW0gaW4gYml0LXJlYWRlcgorZWQyNzhlMjIgUmVtb3ZlZCB1bm5lY2Vzc2FyeSBsb29rdXAKK2NkOGMzYmE3IGZpeCBzb21lIHdhcm5pbmdzOiBkb3duLWNhc3QgYW5kIHBvc3NpYmx5LXVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKzBhNzEwMmJhIH4xJSBpbXByb3ZlbWVudCBvZiBhbHBoYSBjb21wcmVzc2lvbgorM2JjMWIxNDEgTWVyZ2UgIlJlZm9ybWF0IGNvbnRhaW5lciBkb2MiCitkYzE3YWJkYyBtdXg6IGNvc21ldGljcworY2I1ODEwZGYgTWVyZ2UgIldlYlBNdXhHZXRJbWFnZTogYWxsb3cgaW1hZ2UgcGFyYW0gdG8gYmUgTlVMTCIKKzUwNmE0YWYyIG11eDogY29zbWV0aWNzCisxMzVlOGIxOSBXZWJQTXV4R2V0SW1hZ2U6IGFsbG93IGltYWdlIHBhcmFtIHRvIGJlIE5VTEwKK2RlNTU2YjY4IE1lcmdlICJSRUFETUUubXV4OiByZXdvcmQgc29tZSBkZXNjcmlwdGlvbnMiCiswZWUyYWViOSBNYWtlZmlsZS52YzogdXNlIGJhdGNoIG1vZGUgcnVsZXMKK2Q5YWNkZGMwIG1zdmM6IG1vdmUge2kscH1kYiBjcmVhdGlvbiB0byBvYmplY3QgZGlyZWN0b3J5CisyMzdjOWFhNyBNZXJnZSAiZXhwb3NlIFdlYlBGcmVlIGZ1bmN0aW9uIGZvciBETEwgYnVpbGRzIgorYjNlNDA1NGYgc2lsZW5jZSBtc3ZjIGRlYnVnIGJ1aWxkIHdhcm5pbmcKKzQ1ZmViNTVkIGV4cG9zZSBXZWJQRnJlZSBmdW5jdGlvbiBmb3IgRExMIGJ1aWxkcworMTEzMTZkODQgUkVBRE1FLm11eDogcmV3b3JkIHNvbWUgZGVzY3JpcHRpb25zCis0YmU1MmY0YSBmYWN0b3JpemUgV2ViUE11eFZhbGlkYXRlCisxNGY2YjlmNiBtdXg6IGxpZ2h0IGNsZWFudXAKKzVlOTZhNWRiIGFkZCBtb3JlIHBhcmFtIGNoZWNrcyB0byBXZWJQUGljdHVyZURpc3RvcnRpb24oKQorOGFiYWY4MjAgTWVyZ2UgInNpbGVuY2Ugc29tZSB0eXBlIHNpemUgcmVsYXRlZCB3YXJuaW5ncyIKKzE2MDFhMzliIHNpbGVuY2Ugc29tZSB0eXBlIHNpemUgcmVsYXRlZCB3YXJuaW5ncworZjNhYmU1MjAgTWVyZ2UgImlkZWM6IHNpbXBsaWZ5IGJ1ZmZlciBzaXplIGNhbGN1bGF0aW9uIgorYTljNWNkNGMgaWRlYzogc2ltcGxpZnkgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24KKzdiMDZiZDdmIE1lcmdlICJjb25maWd1cmUvYXV0b21ha2U6IGFkZCBzaWxlbnQtcnVsZXMgb3B0aW9uIgorZTlhN2QxNDUgUmVmb3JtYXQgY29udGFpbmVyIGRvYworZDRlNWM3ZjMgY29uZmlndXJlL2F1dG9tYWtlOiBhZGQgc2lsZW50LXJ1bGVzIG9wdGlvbgorNTA4MWRiNzggY29uZmlndXJlL2F1dG9tYWtlOiBubyAtdmVyc2lvbi1pbmZvIGZvciBjb252ZW5pZW5jZSBsaWJzCis4NWI2ZmY2OCBNZXJnZSAiaWRlYzogZml4IFdlYlBJVXBkYXRlIGZhaWx1cmUiCis3YmI2YTljYyBpZGVjOiBmaXggaW50ZXJuYWwgc3RhdGUgY29ycnVwdGlvbgorODljZDFiYjggaWRlYzogZml4IFdlYlBJVXBkYXRlIGZhaWx1cmUKKzAxYjYzODA2IDQtNSUgZmFzdGVyIGRlY29kaW5nLCBvcHRpbWl6ZWQgYnl0ZSBsb2FkcyBpbiBhcml0aG1ldGljIGRlY29kZXIuCis2MzExMTdlYSBNZXJnZSAiY29zbWV0aWNzICYgd2FybmluZ3MiCithMGIyNzM2ZCBjb3NtZXRpY3MgJiB3YXJuaW5ncworZjczOTQ3ZjQgdXNlIDMyYml0IGZvciBzdG9yaW5nIGRlcXVhbnQgY29lZmZzLCBpbnN0ZWFkIG9mIDE2Yi4KK2I5NjAwMzA4IE1lcmdlICJzdG9yZSBwcmVkaWN0aW9uIG1vZGUgYXJyYXkgYXMgdWludDhfdFsxNl0sIG5vdCBpbnRbMTZdLiIKKzdiNjc4ODFhIHN0b3JlIHByZWRpY3Rpb24gbW9kZSBhcnJheSBhcyB1aW50OF90WzE2XSwgbm90IGludFsxNl0uCitjYWI4ZDRkYyBNZXJnZSAiTkVPTiBUcmFuc2Zvcm1PbmUiCitiYTUwM2ZkYSBORU9OIFRyYW5zZm9ybU9uZQorOWY3NDBlM2IgTWVyZ2UgImdjYyB3YXJuaW5nIGZpeDogcmVtb3ZlIHRoZSAnY29uc3QnIHF1YWxpZmllci4iCitmNzZkMzU4NyBnY2Mgd2FybmluZyBmaXg6IHJlbW92ZSB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIuCitlNzg0NzhkNiBNZXJnZSAid2VicG11eDogbWFrZSBtb3JlIHVzZSBvZiBXZWJQRGF0YSIKK2Y4NWJiYTNkIE1lcmdlICJtYW5wYWdlczogYWRkIEJVR1Mgc2VjdGlvbiIKKzQ4YTQzYmJmIE1lcmdlICJtYWtlZmlsZS51bml4OiB2YXJpYWJsZSBjb3NtZXRpY3MiCitjMjc0ZGM5NiBtYWtlZmlsZS51bml4OiB2YXJpYWJsZSBjb3NtZXRpY3MKKzFmN2I4NTk1IHJlLW9yZ2FuaXplIHRoZSBlcnJvci1oYW5kbGluZyBpbiB0aGUgbWFpbiBsb29wIGEgYml0CisxMzM2ZmE3MSBPbmx5IHJlY29tcHV0ZSBsZXZlbF9jb3N0X1tdIHdoZW4gbmVlZGVkCis3NzFlZTQ0OSBtYW5wYWdlczogYWRkIEJVR1Mgc2VjdGlvbgorMGY3ODIwZTYgd2VicG11eDogbWFrZSBtb3JlIHVzZSBvZiBXZWJQRGF0YQorOTc0YWFmZjMgZXhhbXBsZXM6IGxvZ2dpbmcgdXBkYXRlcworNmMxNGFhZGQgTWVyZ2UgImJldHRlciB0b2tlbiBidWZmZXIgY29kZSIKK2Y0MDU0MjUwIGJldHRlciB0b2tlbiBidWZmZXIgY29kZQorMThkOTU5ZmEgTWVyZ2UgIm11eDogYWRkIFdlYlBEYXRhIHR5cGUiCitlZWM0Yjg3NyBtdXg6IGFkZCBXZWJQRGF0YSB0eXBlCiswZGUzMDk2YiB1c2UgMTZiaXQgY291bnRlcnMgZm9yIHJlY29yZGluZyBwcm9iYSBjb3VudHMKKzdmMjM2NzhkIGZpeCBmb3IgTGV2ZWxDb3N0ICsgbGl0dGxlIHNwZWVkLXVwCis3MTA3ZDU0NCBmdXJ0aGVyIHNwZWVkLXVwL2NsZWFudXAgb2YgUmVjb3JkQ29lZmZzKCkgYW5kIEdldFJlc2lkdWFsQ29zdCgpCitmZDIyMTA0MCBJbnRyb2R1Y2UgVG9rZW4gYnVmZmVyICh1bnVzZWQgZm9yIG5vdykKKzVmYTE0OGY0IE1lcmdlICJzcGVlZC11cCBHZXRSZXNpZHVhbENvc3QoKSIKKzI4YTlkOWI0IHNwZWVkLXVwIEdldFJlc2lkdWFsQ29zdCgpCisxMWU3ZGFkZCBNZXJnZSAibWlzYyBjb3NtZXRpY3MiCiszNzgwODZiZCBtaXNjIGNvc21ldGljcworZDYxNDc5ZjkgYWRkIC1wcmludF9wc25yIGFuZCAtcHJpbnRfc3NpbSBvcHRpb25zIHRvIGN3ZWJwLgorMmUzZThiMmUgYWRkIGEgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoKSBtZXRob2QKKzU1MmMxMjE3IE1lcmdlICJtdXg6IHBsdWcgc29tZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IiCithMmE4MWY3ZCBNZXJnZSAiZml4IE1hY2gtTyBzaGFyZWQgbGlicmFyeSBidWlsZCIKK2IzNDgyYzQzIE1lcmdlICJmaXggZ2NjLTQuMCBhcHBsZSAzMi1iaXQgYnVpbGQiCitlNGUzZWMxOSBmaXggZ2NjLTQuMCBhcHBsZSAzMi1iaXQgYnVpbGQKK2IwZDJmZWNmIG11eDogcGx1ZyBzb21lIG1lbW9yeSBsZWFrcyBvbiBlcnJvcgorZjBkMmM3YTcgcGFzcyBvZiBjb3NtZXRpY3MKK2IzMDlhNmY5IGZpeCBNYWNoLU8gc2hhcmVkIGxpYnJhcnkgYnVpbGQKKzI0MWRkZDM4IGRvYzogZGVsZXRlIG11eCBjb250YWluZXIgcGRmCis4YjFiYTI3MiBkb2M6IHVwZGF0ZSBWUDggZGVjb2RlIGd1aWRlIGxpbmsKKzdlNDM3MWM1IFdlYlBNdXhDcmVhdGU6IGZpeCB1bmNoZWNrZWQgbWFsbG9jCitlYjQyNTU4NiBNZXJnZSAiaGF2ZSBtYWtlZmlsZS51bml4IGNsZWFuIHVwIHNyYy93ZWJwLyp+IHRvbyIKK2E4NWMzNjMxIE1lcmdlICJjb3JyZWN0IEVuY29kZUFscGhhIGRvY3VtZW50YXRpb24iCithMzM4NDJmZCBNZXJnZSAiVXBkYXRlIHdlYnAgY29udGFpbmVyIHNwZWMgd2l0aCBhbHBoYSBmaWx0ZXIgb3B0aW9ucy4iCis4ZDY0OTBkYSBJbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBzb21lIG9mIHRoZSBtdXggQVBJcy4KK2I4Mzc1YWJkIGhhdmUgbWFrZWZpbGUudW5peCBjbGVhbiB1cCBzcmMvd2VicC8qfiB0b28KK2I1ODU1ZmM3IGNvcnJlY3QgRW5jb2RlQWxwaGEgZG9jdW1lbnRhdGlvbgorZGJhMzdmZWEgVXBkYXRlIHdlYnAgY29udGFpbmVyIHNwZWMgd2l0aCBhbHBoYSBmaWx0ZXIgb3B0aW9ucy4KKzJlNzRlYzhiIGZpeCBjb21waWxlIHVuZGVyIE1JTkdXCis3MTZkMWQ3ZiBmaXggc3Vib3B0aW1hbCBNQVhfTEVOIGN1dC1vZmYgbGltaXQKKzU3Y2FiN2I4IEhhcm1vbml6ZSB0aGUgYWxwaGEtZmlsdGVyIHByZWRpY3Rpb25zIGF0IGJvdW5kYXJ5CiszYTk4OTUzNCBNZXJnZSAiRml4IGJ1ZyBmb3IgQWxwaGEgaW4gUkdCQV80NDQ0IGNvbG9yLW1vZGUuIgorOGNhMjA3NmQgSW50cm9kdWNlIGEgJ2Zhc3QnIGFscGhhIG1vZGUKKzIyMWEwNmJiIEZpeCBidWcgZm9yIEFscGhhIGluIFJHQkFfNDQ0NCBjb2xvci1tb2RlLgorYWQxZTE2M2EgY29zbWV0aWNzOiBub3JtYWxpemUgY29weXJpZ2h0IGhlYWRlcnMKK2M3NzQyNGQ3IGNvc21ldGljczogbGlnaHQgaW5jbHVkZSBjbGVhbnVwCis5ZDBlMTdjOSBmaXggbXN2YyBidWlsZCBicmVha2FnZSBhZnRlciAyNTIwMjhhCis3YzRjMTc3YyBTb21lIHJlYWRhYmlsaXR5IGZpeGVzIGZvciBtdXggbGlicmFyeQorZDhhNDdlNjYgTWVyZ2UgIkFkZCBwcmVkaWN0aXZlIGZpbHRlcmluZyBvcHRpb24gZm9yIEFscGhhLiIKKzI1MjAyOGFhIEFkZCBwcmVkaWN0aXZlIGZpbHRlcmluZyBvcHRpb24gZm9yIEFscGhhLgorOWI2OWJlMWMgTWVyZ2UgIlNpbXBsaWZ5IG11eCBsaWJyYXJ5IGNvZGUiCithMDU2MTcwZSBTaW1wbGlmeSBtdXggbGlicmFyeSBjb2RlCis5OTIxODdhMyBpbXByb3ZlIGxvZzIgdGVzdAorZTg1MmY4MzIgdXBkYXRlIEFuZHJvaWQubWsgZmlsZSBsaXN0CithOTBjYjJiZSByZWR1Y2UgbnVtYmVyIG9mIGNvcGllcyBhbmQgbWFsbG9jcyBpbiBhbHBoYSBwbGFuZSBlbmMvZGVjCitiMTY2MmIwNSBmaXggc29tZSBtb3JlIHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncyB3L01TVkMKKzIyM2Q4YzYwIGZpeCBzb21lIHVpbnQ2NF90IC0+IGludCBjb252ZXJzaW9uIHdhcm5pbmdzIHdpdGggTVNDCitjMWEwNDM3YiBNZXJnZSAic2ltcGxpZnkgY2hlY2tzIGZvciBlbmFibGluZyBTU0UyIGNvZGUiCitmMDY4MTdhYSBzaW1wbGlmeSBjaGVja3MgZm9yIGVuYWJsaW5nIFNTRTIgY29kZQorOTQ4ZDRmZTkgc2lsZW5jZSBhIG1zdmMgYnVpbGQgd2FybmluZworOTExNzk1NDkgdndlYnA6IG1zdmMgYnVpbGQgdHdlYWtzCis3OTM3YjQwOSBzaW1wbGUgV2ViUCB2aWV3ZXIsIGJhc2VkIG9uIE9wZW5HTAorNmFhYzFkZjEgYWRkIGEgYnVuY2ggb2YgbWlzc2luZyAnZXh0ZXJuICJDIicKKzQyMWViOTlkIE1lcmdlICJSZW1vdmUgYXNzaWduZWQtYnV0LW5vdC11c2VkIHZhcmlhYmxlICJiciIiCis5MWUyN2Y0NSBiZXR0ZXIgZml0dGluZyBuYW1lcyBmb3IgdXBzYW1wbGluZyBmdW5jdGlvbnMKK2E1ZDdlZDVjIFJlbW92ZSBhc3NpZ25lZC1idXQtbm90LXVzZWQgdmFyaWFibGUgImJyIgorZjYyZDJjOTQgcmVtb3ZlIHVudXNlZCAnaGFzX2FscGhhJyBmcm9tIFZQOEdldEluZm8oKSBzaWduYXR1cmUKKzA4ZTg2NTgyIHRyYXAgYWxwaGEtZGVjb2RpbmcgZXJyb3IKK2IzNjFlY2ExIGFkZCBjdXQtb2ZmIHRvIGFyaXRoIGNvZGVyIHByb2JhYmlsaXR5IHVwZGF0ZS4KKzg2NjZhOTNhIFNvbWUgYnVnLWZpeGVzIGZvciBpbWFnZXMgd2l0aCBhbHBoYS4KKzI3M2ExMmEwIGZpeCBvZmYtYnktMSBkaWZmIGluIGNhc2UgY3JvcHBpbmcgYW5kIHNpbXBsZSBmaWx0ZXJpbmcKKzJmNzQxZDFlIHdlYnBtdXg6IFJlYWRJbWFnZTogZml4IHB0ciBmcmVlIGluIGVycm9yIGNhc2UKKzcyMWYzZjQ4IGZpeCBhbHBoYSBkZWNvZGUKKzYwOTQyYzhjIGZpeCB0aGUgaGFzX2FscGhhXyBvcmRlcgorMzA5NzFjOWUgSW1wbGVtZW50IHByb2dyZXNzIHJlcG9ydCAoYW5kIHVzZXIgYWJvcnQpCitlZGE1MjBhOSBjb3NtZXRpY3MgYWZ0ZXIgOTUyM2YyYQorMzhiZDViYjUgTWVyZ2UgIkJldHRlciBhbHBoYSBzdXBwb3J0IGluIHdlYnBtdXggYmluYXJ5IgorY2NiYWViZmUgTWVyZ2UgIlVwZGF0ZWQgdGhlIGluY2x1ZGVzIHRvIHJlbGF0aXZlIHBhdGhzLiIKK2Q3MWZiZGNjIGZpeCBzbWFsbCB0eXBvIGluIGVycm9yIG1lc3NhZ2UgYXJyYXkKK2NkZjk3YWEyIEJldHRlciBhbHBoYSBzdXBwb3J0IGluIHdlYnBtdXggYmluYXJ5Cis4ODVmMjViYyBVcGRhdGVkIHRoZSBpbmNsdWRlcyB0byByZWxhdGl2ZSBwYXRocy4KK2EwZWM5YWFjIFVwZGF0ZSBXZWJQIGVuY29kZXIgKGN3ZWJwKSB0byBzdXBwb3J0IEFscGhhLgorNjY3Yjc2OWEgRml4ZWQgdGhlIGluY2x1ZGUgZm9yIHR5cGVzLmggd2l0aGluIG11eC5oCis5NTIzZjJhNSBBZGQgQWxwaGEgRW5jb2RlIHN1cHBvcnQgZnJvbSBXZWJQRW5jb2RlLgorMTY2MTJkZGQgTWVyZ2UgIkFkZCBBbHBoYSBEZWNvZGUgc3VwcG9ydCBmcm9tIFdlYlBEZWNvZGUuIgorZDExN2E5NDAgQWRkIEFscGhhIERlY29kZSBzdXBwb3J0IGZyb20gV2ViUERlY29kZS4KKzY3MjI4NzM0IGNvc21ldGljcyBhZnRlciBlMTk0N2E5CitlMTk0N2E5MiBBZGQgQWxwaGEgZW5jb2RlL2RlY29kZSBjb2RlLgorYWZjNGM1ZDYgc2ltcGxpZnkgY29kZSBieSBpbnRyb2R1Y2luZyBhIENvcHlQbGFuZSgpIGhlbHBlciBmdW5jCisxMTNiMzEyOCBNZXJnZSAiTVVYIEFQSSBVcGRhdGVzIgorYzM5OGY1OTUgTVVYIEFQSSBVcGRhdGVzCis1YWNmMDRlZiByZW1vdmUgb3JwaGFuIHNvdXJjZSBmaWxlCiswNTlmMDNlZiBNZXJnZSAiZGVjOiB2YWxpZGF0ZSBjb2xvcnNwYWNlIGJlZm9yZSB1c2luZyBhcyBhcnJheSBpbmRleCIKKzcwYTAzOTg5IE1lcmdlICJmYWN0b3JpemUgc29tZSBjb2RlIgorOWIyNDNiM2QgZmFjdG9yaXplIHNvbWUgY29kZQorMzcyZTJiNDYgQ29ycmVjdCBhIGJ1ZyBpbiBSZWFkUE5HKCkgd2l0aCBHUkFZX0FMUEhBIGltYWdlcworNDY5ZDZlYjkgTWVyZ2UgIk1ha2VmaWxlLmFtOiByZW1vdmUgcmVkdW5kYW50IG5vaW5zdF9IRUFERVJTIgorOWZlMzM3MmYgZGVjOiB2YWxpZGF0ZSBjb2xvcnNwYWNlIGJlZm9yZSB1c2luZyBhcyBhcnJheSBpbmRleAorODk2MjAzMGYgcmVtb3ZlIG9ycGhhbiBzb3VyY2UgZmlsZQorY2VkM2UzZjQgTWFrZWZpbGUuYW06IHJlbW92ZSByZWR1bmRhbnQgbm9pbnN0X0hFQURFUlMKKzk2NDM4N2VkIHVzZSBXRUJQX0lOTElORSBmb3IgaW5saW5lIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworOTA4ODBhMTEgTWVyZ2UgIm1hbnBhZ2VzOiBicmVhayBsb25nIGxpbmVzIgorYjU5MTA4OTUgTWVyZ2UgIm1hbnBhZ2VzOiBtaW5vciBmb3JtYXR0aW5nIHVwZGF0ZXMiCis0YzQ1MWU0YSBNZXJnZSAiUmVjdGlmeSB0aGUgQ2h1bmsgcGFyc2luZyBsb2dpYy4iCiswNGU4NGNmMSBleGFtcGxlczogc2xpZ2h0IGNsZWFudXAKKzA5OTcxN2NlIG1hbnBhZ2VzOiBicmVhayBsb25nIGxpbmVzCisxZGFmMzliYiBtYW5wYWdlczogbWlub3IgZm9ybWF0dGluZyB1cGRhdGVzCithYmQwMzBiNSBmaXggbWlzc2luZyAiKHZvaWQpIiBpbiBmdW5jdGlvbiBzaWduYXR1cmUKK2Y2YTdkNzU4IHJlbW92ZSB1c2VsZXNzIHRlc3QKK2YwN2IyMTM4IFJlY3RpZnkgdGhlIENodW5rIHBhcnNpbmcgbG9naWMuCitiODYzNGY3ZCB3ZWJwbXV4OiBmaXggbGliIGxpbmsgb3JkZXIKKzQyYzJlNjgyIEZpeCBtaXNzaW5nIGNvbWEgKG9uIHVuY29tcGlsZWQgY29kZSkKK2Q4MzI5ZDQxIEFuZHJvaWQubWs6IGFkZCBtaXNzaW5nIHNvdXJjZSBmaWxlcworMTNhNTRkZjUgTWVyZ2UgIk1vcmUgYWdncmVzc2l2ZSBjb3B5LWVkaXQ7IGFkZCBUT0RPOyB2YWxpZGF0ZSBIVE1MNSIKKzg2OGI5NmFlIE1vcmUgYWdncmVzc2l2ZSBjb3B5LWVkaXQ7IGFkZCBUT0RPOyB2YWxpZGF0ZSBIVE1MNQorNzY3YWZlYTIgY29uZmlndXJlOiBjaGVjayBmb3IgYSBzeW1ib2wgY29udGFpbmVkIGluIGxpYnBuZworNDA4Yjg5MTggTWVyZ2UgIkxpbmV3cmFwIGF0IDcyIGNvbHMuIENhc3VhbCBjb3B5LWVkaXQuIgorM2FlMzE4YzcgTWVyZ2UgIlJlc3RvcmUgKG1vc3QpIGVtcGhhc2lzOyBhZGQgZW1waGFzaXMgdG8gbm9ybWF0aXZlIFJGQyAyMTE5IHRlcm1zIChNVVNULCBldGMuKSIKKzkxOGViMmQ4IE1lcmdlICJCYXNpYyBjb250YWluZXIgZG9jIHNvdXJjZSBjbGVhbi11cDsgZml4IGxpc3RzIGFuZCBwc2V1ZG9jb2RlIGJsb2Nrcy4iCiswM2JlYzllMCBMaW5ld3JhcCBhdCA3MiBjb2xzLiBDYXN1YWwgY29weS1lZGl0LgorMjY3OGQ4MTkgUmVzdG9yZSAobW9zdCkgZW1waGFzaXM7IGFkZCBlbXBoYXNpcyB0byBub3JtYXRpdmUgUkZDIDIxMTkgdGVybXMgKE1VU1QsIGV0Yy4pCis0Mjg2NzRkYSBCYXNpYyBjb250YWluZXIgZG9jIHNvdXJjZSBjbGVhbi11cDsgZml4IGxpc3RzIGFuZCBwc2V1ZG9jb2RlIGJsb2Nrcy4KKzZhNzdkOTI4IE1lcmdlICJNYWtlZmlsZS52YzogY29zbWV0aWNzIgorMjhjMzhlOGMgTWVyZ2UgIk1ha2VmaWxlLnZjOiBjb25kZW5zZSBkaXJlY3RvcnkgY3JlYXRpb24gcnVsZXMiCis1NWJlMmNmOCBJbml0aWFsIGltcG9ydCBvZiBjb250YWluZXIgc3BlYyBkb2N1bWVudCwgZnJvbSBwZGZ0b3RleHQgdHJhbnNmb3JtLgorYTgyYTc4OGIgTWFrZWZpbGUudmM6IGNvc21ldGljcworYzhmNDFjZTUgTWFrZWZpbGUudmM6IGNvbmRlbnNlIGRpcmVjdG9yeSBjcmVhdGlvbiBydWxlcworMmI4NzdjZDAgU29tZSBmaXhlcyB0byBNYWtlZmlsZS52YyB0byBzdXBwb3J0IHRoZSBzcmNcbXV4IGRpcmVjdG9yeS4KKzNlYjk2OWIzIE1lcmdlICJBZGQgTWFrZWZpbGUudmMgZm9yIE11eCBsaWJyYXJ5ICYgYmluYXJ5LiIKK2U3OGU5NzFlIEFkZCBNYWtlZmlsZS52YyBmb3IgTXV4IGxpYnJhcnkgJiBiaW5hcnkuCis2YWVkZGU1OCBBZGQgbWFudWFsIGZvciBXZWJQTXV4IHRvb2wuCis4YTM2MGQwYSBNZXJnZSAiQWRkZWQgV2ViUE11eCBCaW5hcnkuIgorYTRmMzJjYWUgQWRkZWQgV2ViUE11eCBCaW5hcnkuCitmM2JmNGM3NiBBZGRlZCBNdXggQ29udGFpbmVyIFNwZWMgJiBSRUFETUUgZm9yIE1VWC1BUEkuCis5Zjc2MWNmYSBDaGFuZ2VkIGZ1bmN0aW9uIHNpZ25hdHVyZSBmb3IgV2ViUE11eENyZWF0ZQorNWYzMWI1ZWMgTWVyZ2UgIkFkZCBNdXggbGlicmFyeSBmb3IgbWFuaXB1bGF0aW5nIFdlYlAgY29udGFpbmVyLiIKKzIzMTU3ODVmIEFkZCBNdXggbGlicmFyeSBmb3IgbWFuaXB1bGF0aW5nIFdlYlAgY29udGFpbmVyLgorN2UxOThhYmIgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4xLjMpCitkZmM5YzFlYSBIYXJtb25pemUgdGhlIGRhdGVzCisyOGFkNzBjNSBGaXggUE5HIGRlY29kaW5nIGJ1ZworODQ2ZTkzYzUgVXBkYXRlIEFVVEhPUlMgJiBhZGQgLm1haWxtYXAKKzU2M2U1MmQ2IGNvc21ldGljcyBhZnRlciAnNzYwMzZmNSBSZWZhY3RvciBkZWNvZGVyIGxpYnJhcnknCis3NjAzNmY1NCBSZWZhY3RvciBkZWNvZGVyIGxpYnJhcnkKKzM3N2VmNDNjIGNvbmZpZ3VyZS5hYzogdXBkYXRlIEFDX0lOSVQgcGFyYW1zCis3YThkODc2MiB1c2UgYSB1c2VyLXZpc2libGUgTUFDUk8gZm9yIG1heCB3aWR0aC9oZWlnaHQuCitkNGU5ZjU1OSBORU9OIGRlY29kZSBzdXBwb3J0IGluIFdlYlAKKzBlZTY4M2I1IHVwZGF0ZSBsaWJ0b29sIHZlcnNpb24taW5mbworZmRiZTAyYzUgd2luZG93czogbWF0Y2ggX2NvbmRfZGVzdHJveSBsb2dpYyB3L3JldHVybiB2YXJpYWJsZSBuYW1lCisyMDZiNjg2YiBSRUFETUU6IGNvcnJlY3QgYWR2YW5jZWQgZGVjb2RlIGFwaSBwc2V1ZG8tY29kZQorNmEzMmEwZjUgbWFrZSBWUDhCaXRSZWFkZXIgYSB0eXBlZGVmLCBmb3IgYmV0dGVyIHJlLXVzZQorYjExMmU4MzYgY3JlYXRlIGEgbGlid2VicHV0aWxzIHVuZGVyIHNyYy91dGlscworZWU2OTdkOWYgaGFybW9uaXplIHRoZSBpbmNsdWRlIGd1YXJkcyBhbmQgI2VuZGlmIGNvbW1lbnRzCithMWVjMDdhNiBGaXhpbmcgY29tcGlsZXIgZXJyb3IgaW4gbm9uIHg4NiBhcmNoLgorZGNmYTUwOWEgRml4ZWQgcmVjdXJzaXZlIGluY2x1c2lvbiBvZiBiaXRfd3JpdGVyLmggYW5kIHZwOGVuY2kuaC4KK2UwNmFjMDg4IGNyZWF0ZSBhIHNlcGFyYXRlIGxpYndlYnBkc3AgdW5kZXIgc3JjL2RzcAorZWJlYjQxMmEgdXNlIHVuc2lnbmVkIGludCBmb3IgYml0ZmllbGRzCiszNDFjYzU2YSBtYWtlIGtOZXdSYW5nZSBhIHN0YXRpYyBhcnJheQorMjI3YTkxZTUgUkVBRE1FOiBtaW5vciB3b3JkaW5nIHVwZGF0ZQorMDViZDhlNmEgYWRkIG1hbiBwYWdlcyB0byBkaXN0Cis4MTJkZmExYSBidW1wIHVwIHZlcnNpb25zIGluIHByZXBhcmF0aW9ucyBmb3IgMC4xLjMKK2E1Yjc4YzgxIHdyYXAgYWxwaGEtcmVsYXRlZCBvcHRpb25zIHVuZGVyIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTIGZsYWcKKzM0ZGM3OTA3IHJlZ2VuIENoYW5nZUxvZyBmb3IgMC4xLjMtcmMyCis3YzQzNjYzMCBTaWxlbmNlIHNvbWUgKG1vcmUpIFZpc3VhbCBTdHVkaW8gd2FybmluZ3MuCis2MDMwNmU4YyBhZGQgdG9wLWxldmVsIGdpdGF0dHJpYnV0ZXMKKzJhYTZiODBlIFNsaWVuY2Ugc29tZSBWaXN1YWwgU3R1ZGlvIHdhcm5pbmdzLgorNGNiYmIyOTAgTWVyZ2UgImJ1bXAgdXAgdmVyc2lvbiBmb3IgbmV4dCBmcmVlemUiCithMzI5MTY3NCBidW1wIHVwIHZlcnNpb24gZm9yIG5leHQgZnJlZXplCitjN2U4NmFiYSBjb3NtZXRpY3M6IGZpeCBjb21tZW50IGxpbmUgbGVuZ3RocworYzllMDM3YWIgbWFrZWZpbGUudW5peDogYWRkIHNpbXBsZSBkaXN0IHRhcmdldAorODdkNThjZTkgbWFrZWZpbGUudW5peDogcnVsZSBtYWludGVuYW5jZQorZDQ3N2RlNzcgbWVuZAorZmFjMTVlYzcgVXBkYXRlIE5FV1MgJiBSRUFETUUgZm9yIG5leHQgcmVsZWFzZSBWMC4xLjMKKzYyMTU1OTVjIE1lcmdlICJhZGQgYSAtcGFydGl0aW9uX2xpbWl0IG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBieSBpbnRyYTR4NCIKKzM4MTRiNzZjIE1lcmdlICJyZW9yZ2FuaXplIGNodW5rLXBhcnNpbmcgY29kZSIKKzkwMDI4NmUwIGFkZCBhIC1wYXJ0aXRpb25fbGltaXQgb3B0aW9uIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IGludHJhNHg0CitjZDEyYjRiMCBhZGQgdGhlIG1pc3NpbmcgY29zdCBmb3IgSTQvSTE2IG1vZGUgc2VsZWN0aW9uCitkZmNjMjEzNiByZW9yZ2FuaXplIGNodW5rLXBhcnNpbmcgY29kZQorM2NmMjAzMDYgaW5pdGlhbGl6ZSBwb2ludGVycyB0byBmdW5jdGlvbiB3aXRoaW4gVlA4RHNwSW5pdCgpCitkMjFiNDc5NSBNZXJnZSAid2luZG93czogYWRkIGRlY29kZSB0aHJlYWRpbmcgc3VwcG9ydCIKKzQ3M2FlOTUzIGZpeCBoYW5nIG9uIHRocmVhZCBjcmVhdGlvbiBmYWlsdXJlCitmY2NjYTQyMCB3aW5kb3dzOiBhZGQgZGVjb2RlIHRocmVhZGluZyBzdXBwb3J0CithMzFmODQzYSBVc2UgdGhlIGV4YWN0IFBOR19JTkNMVURFUy9QTkdfTElCUyB3aGVuIHRlc3RpbmcgZm9yIC1scG5nCithZDliNDVmMSBNZXJnZSAiTWFrZWZpbGUudmM6IHJ1bGUgbWFpbnRlbmFuY2UiCis1NjVhMmNhYiBNYWtlZmlsZS52YzogcnVsZSBtYWludGVuYW5jZQorMmQwZGE2ODEgbWFrZWZpbGUudW5peDogZGlzYWJsZSBXdmxhIGJ5IGRlZmF1bHQKK2ZjNzgxNWQ2IG11bHRpLXRocmVhZCBkZWNvZGluZzogfjI1LTMwJSBmYXN0ZXIKK2FjZDhiYTQyIGlvLT50ZWFyZG93bigpIHdhcyBub3QgYWx3YXlzIGNhbGxlZCB1cG9uIGVycm9yCitjODU1MjdiMSBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBETEwgY29uZmlncyIKK2UxZTliZTM1IGNvc21ldGljczogc3BlbGxpbmcvZ3JhbW1hciBpbiBSRUFETUUgYW5kIGxpYiBoZWFkZXJzCitiNGQwZWY4ZiBNYWtlZmlsZS52YzogYWRkIERMTCBjb25maWdzCis5OTg3NTRhNyByZW1vdmUgdW51c2VkIG5iX2k0XyBhbmQgbmJfaTE2XyBmaWVsZHMuCis5ZjAxY2UzYSByZW5hbWUgV2ViUERlY0J1ZmZlcjo6bWVtb3J5IC0+IHByaXZhdGVfbWVtb3J5CitmYjVkNjU5YiBmaXggYW4gb3ZlcmZsb3cgYnVnIGluIExVVCBjYWxjdWxhdGlvbgorZDY0NmQ1Yzcgc3dpZzogYWRkIFdlYlBEZWNvZGVBUkdCCis3OGFlZWQ0MCBhZGQgbWlzc2luZyBXZWJQRGVjb2RlQVJHQkludG8oKSBhbmQgc3dpdGNoIEFSR0I0NDQ0IHRvIFJHQkE0NDQ0IGFzIHdhcyBpbnRlbmRlZAorY2Q3YzUyOTIgZXhwbGljaXRseSBtYXJrIGxpYnJhcnkgZnVuY3Rpb25zIGFzIGV4dGVybgorMTlkYjU5ZjggYWRkIHN1cHBvcnQgZm9yIFJHQjU2NSwgQVJHQjQ0NDQgYW5kIEFSR0IgY29sb3JzcGFjZSAoZGVjb2RlcikKK2M5MTVmYjJhIGVuY29kZXIgc3BlZWQtdXA6IGhhcmRjb2RlIHNwZWNpYWwgbGV2ZWwgdmFsdWVzCitjNTU4YmRhZCBSZW5hbWUgYW5kIGltcHJvdmUgdGhlIEFQSSB0byByZXRyaWV2ZSBkZWNvZGVkIGFyZWEKK2JmNTk5ZDc0IE1lcmdlICJtYWtlZmlsZS51bml4OiBkaXNhYmxlIC1XdmxhIGJ5IGRlZmF1bHQiCitjOWVhMDNkNyBTU0UyIHZlcnNpb24gb2Ygc3Ryb25nIGZpbHRlcmluZworOTkzYWYzZTIgbWFrZWZpbGUudW5peDogZGlzYWJsZSAtV3ZsYSBieSBkZWZhdWx0CiszODI3ZTFiYyBNZXJnZSAiZXhhbXBsZXM6ICh3aW5kb3dzL1dJQykgYWRkIGFscGhhIHN1cHBvcnQiCitlMjkxZmFlMCBTU0UyIGZ1bmN0aW9ucyBmb3IgdGhlIGZhbmN5IHVwc2FtcGxlci4KK2EwNmJiZTJlIGFkZCBXZWJQSVNldElPSG9va3MoKSB0byBzZXQgc29tZSBjdXN0b20gaG9va3Mgb24gdGhlIGluY3JlbWVudGFsIGRlY29kZXIgb2JqZWN0LgorNzY0M2E2ZjIgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IHVzZSB1bmFtZSB0byBkZXRlY3QgT1NYIGVudmlyb25tZW50IgorNTE0MmEwYmUgZXhwb3J0IGFscGhhIGNoYW5uZWwgKGlmIHByZXNlbnQpIHdoZW4gZHVtcGluZyB0byBQR00gZm9ybWF0CisxNGQ1NzMxYyBtYWtlZmlsZS51bml4OiB1c2UgdW5hbWUgdG8gZGV0ZWN0IE9TWCBlbnZpcm9ubWVudAorMDgwNTcwNjIgZXhhbXBsZXM6IHF1aWV0IHdhcm5pbmdzCiszY2ZlMDg4OCBleGFtcGxlczogKHdpbmRvd3MvV0lDKSBhZGQgYWxwaGEgc3VwcG9ydAorMTNlZDk0YjggYWRkIGNvbXBpbGUgd2FybmluZyBmb3IgdmFyaWFibGUtbGVuZ3RoLWFycmF5Cis1YTE4ZWIxYSBNZXJnZSAiYWRkIEFkdmFuY2VkIERlY29kaW5nIEludGVyZmFjZSIKKzVjNGYyN2Y5IGFkZCBtaXNzaW5nIFxuCitmNGM0ZTQxNiA4MCBjb2xzIGZpeAorZDI2MDMxMDUgYWRkIEFkdmFuY2VkIERlY29kaW5nIEludGVyZmFjZQorYmQyZjY1ZjYgc3NlMiB2ZXJzaW9uIG9mIHRoZSBjb21wbGV4IGZpbHRlcgorOTZlZDljZTAgcGVyZm9ybSB0d28gaWRjdCB0cmFuc2Zvcm1zIGF0IGEgdGltZSB3aGVuIHBvc3NpYmxlCiswMWFmN2I2OSB1c2UgYWxpZ25lZCBzdG9yZWQKKzBlMWQxZmRmIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIGV4cGVyaW1lbnRhbCB0YXJnZXQiCisyYTEyOTJhNiBNYWtlZmlsZS52YzogYWRkIGV4cGVyaW1lbnRhbCB0YXJnZXQKKzIzYmYzNTFlIEVuYWJsZSBkZWNvZGUgU1NFMiBmb3IgVmlzdWFsIFN0dWRpbworMTMxYTRiN2IgZGVjL2RzcF9zc2UyOiBmaXggdmlzdWFsIHN0dWRpbyBjb21waWxlCiswMGQ5ZDY4MCBzd2lnOiBmaWxlIHJlb3JnYW5pemF0aW9uCis3ZmM3ZTBkOSBNZXJnZSAic3dpZy9qYXZhOiBiYXNpYyBlbmNvZGUgc3VwcG9ydCIKKzNiZTU3YjE2IGZpeCBNU1ZDIGNvbXBpbGUgZm9yIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCis0MGE3ZTM0NyBkZWMvZHNwOiBkaXNhYmxlIHNzZTIgZm9yIFZpc3VhbCBTdHVkaW8gYnVpbGRzCitlNGQ1NDBjOCBhZGQgU1NFMiBjb2RlIGZvciB0cmFuc2Zvcm0KKzU0ZjIxNzBhIHN3aWcvamF2YTogYmFzaWMgZW5jb2RlIHN1cHBvcnQKK2M1ZDQ1ODRiIGNhbGwgZnVuY3Rpb24gcG9pbnRlcnMgaW5zdGVhZCBvZiBDLXZlcnNpb24KK2VhNDNmMDQ1IE1lcmdlICJjb25maWd1cmU6IG1pbmd3MzIgdGFyZ2V0czogdGVzdCBmb3IgV0lDIHN1cHBvcnQiCithMTEwMDlkNyBTU0UyIHZlcnNpb24gb2Ygc2ltcGxlIGluLWxvb3AgZmlsdGVyaW5nCis0MjU0OGRhOSBzaGF2ZSBvbmUgdW5uZWVkZWQgZmlsdGVyLWNhY2hlIGxpbmUKKzMxZjlkYzZmIGNvbmZpZ3VyZTogbWluZ3czMiB0YXJnZXRzOiB0ZXN0IGZvciBXSUMgc3VwcG9ydAorMTk1NTk2OTkgTWVyZ2UgInNwbGl0IGV4cHJlc3Npb24gaW4gdHdvLiIKKzQxNWRiZTQ2IHNwbGl0IGV4cHJlc3Npb24gaW4gdHdvLgorZTI5MDcyYTggY29uZmlndXJlOiB0ZXN0IGZvciB6bGliIG9ubHkgdy8tLWVuYWJsZS1leHBlcmltZW50YWwKK2IyYjAwOTBiIFNpbXBsaWZ5IFZpc3VhbCBTdHVkaW8gaWZkZWZzCitjYTdhMmZkNiBBZGQgZXJyb3IgcmVwb3J0aW5nIGZyb20gZW5jb2RpbmcgZmFpbHVyZXMuCis2Yzk0MDVkYiBNZXJnZSAiTWFrZWZpbGUudmM6IHJlcXVpcmUgQ0ZHIHdpdGggY2xlYW4gdGFyZ2V0IgorMDQyNGVjZDkgTWFrZWZpbGUudmM6IHJlcXVpcmUgQ0ZHIHdpdGggY2xlYW4gdGFyZ2V0CiswMDM0MTdjNyBFbmFibGUgU1NFMiBmb3IgVmlzdWFsIFN0dWRpbyBidWlsZHMKK2FmMTBkYjRhIGxpdHRsZSBzcGVlZCB1cCBmb3IgVlA4Qml0VXBkYXRlKCkKK2U3MTQxOGY4IG1vcmUgTVNWQyBmaWxlcyB0byBpZ25vcmUKKzQ2ZDkwMzYzIGNvc21ldGljcworZWRmNTlhYjMgdHlwbyBmaXgKKzcyMjI5ZjVmIEFkZCBzdXBwb3J0IGZvciB4NjQgYW5kIFNTRTIgYnVpbGRzIHVuZGVyIFdpbmRvd3MuCis5MmU1YzZlMSBWUDhHZXRJbmZvKCkgKyBXZWJQUmVzZXREZWNQYXJhbXMoKQorNDE2YjdhNmIgcmFpc2UgdGhlIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgdGhlIHJlc2NhbGVyCithYTg3ZTRlMCBmaXggYWxpZ25tZW50CitlYjY2NjcwYyBkaXNhYmxlIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCitjNWFlN2Y2NSB0eXBvIGZpeDogVVNFXyA9PiBXRUJQXworZDA0MWVmYWUgc3dpZzogYWRkIGxpYndlYnAuamFyL2xpYndlYnBfamF2YV93cmFwLmMKK2Y2ZmIzODc3IGFkZCBzd2lnIGludGVyZmFjZQorZTkyNzM5MDIgYWxpZ24gYnVmZmVyIGZvciBkb3VibGUgdG9vCis4NDJjMDA5YiBmaXggLXN0cm9uZyBvcHRpb24KK2QwYTcwMzg3IE1lcmdlICJjb3NtZXRpY3MiCitmYzBhMDJlNSBmaXggdGhlIGRpY2hvdG9teSBsb29wCiszODM2OWMwMyBjb3NtZXRpY3MKKzhkZmM0YzZmIGZhY3Rvcml6ZSBhbmQgdW5pZnkgR2V0QWxwaGEoKSBiZXR3ZWVuIHRoZSBDIGFuZCBTU0UyIHZlcnNpb24KKzZkMGU2NmMyIHByZXBhcmUgZXhwZXJpbWVudGF0aW9uIHdpdGggeXV2NDQ0IC8gNDIyCis3OWNjNDlmNSBhZGQgYSAtLWVuYWJsZS1leHBlcmltZW50YWwgb3B0aW9uIHRvICcuL2NvbmZpZ3VyZScKK2Q3NTc1MjM4IHNzZTIgdmVyc2lvbiBvZiBDb2xsZWN0SGlzdG9ncmFtKCkKK2MxYzcyOGQ2IGFkZCBhbiBleHRyYSAjaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMgdG8gYXZvaWQgJ3VudXNlZCB2YXJpYWJsZScgd2FybmluZworNjBjNjFkMmQgYWx3YXlzIGNhbGwgVlAqRW5jRGVsZXRlQWxwaGEoKSB1bmNvbmRpdGlvbm5hbGx5LCBmb3Igc2ltcGxpY2l0eQorMGY4YzYzODQgc2ltcGx5IGRvbid0IGNhbGwgV3JpdGVFeHRlbnNpb25zKCkgaWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMgaXMgbm90IGRlZmluZWQKKzQ3YzY2MWQ1IHJlbmFtZSBzd2FwIC0+IHN3YXBfcmIKKzEwZDU1YmJiIG1vdmUgY2h1bmtbXSBkZWNsYXJhdGlvbiBvdXQgb2YgdGhlIGZvcigpIGxvb3AKKzUxN2NlYzIxIGZpeCBpbmRlbnRhdGlvbgorZjdkOWUyNjEgZml4IG1lcmdlIHByb2JsZW1zCis4ZmQ0MmIzYSBhZGQgYSBzdHJpZGUgJ2Ffc3RyaWRlJyBmb3IgdGhlIGFscGhhIHBsYW5lCitiOGRjYmYyZiBmaXggYWxwaGEtcGxhbmUgY29weSBhbmQgY3JvcCBtZXRob2RzCitjZGVmODlkZSBmaXggc29tZSAndW51c2VkIHZhcmlhYmxlJyB3YXJuaW5nCitmYjI5YzI2MiBTU0UyIHZlcnNpb24gb2YgdGhlIGZ3ZCB0cmFuc2Zvcm0gYW5kIHRoZSBzcXVhcmVkIHN1bSBtZXRyaWMKKzJhYjRiNzJmIEVYUEVSSU1FTlRBTDogYWRkIHN1cHBvcnQgZm9yIGFscGhhIGNoYW5uZWwKK2NmYmY4OGE2IGFkZCBTU0UyIGZ1bmN0aW9ucy4gfjJ4IGZhc3RlciBlbmNvZGluZyBvbiBhdmVyYWdlLgorZTdmZjNmOWEgbWVyZ2UgdHdvIElUcmFuc2Zvcm1zIHRvZ2V0aGVyIHdoZW4gYXBwbGljYWJsZSBhbmQgY2hhbmdlIHRoZSBUVHJhbnNmb3JtIHRvIHJldHVybiB0aGUgc3VtIGRpcmVjdGx5LgorY2E1NTQxMzcgZml4IFdlYlBJRGVjR2V0UkdCKCkgdG8gYWNjZXB0IGFueSBSR0IoQSkgbW9kZSwgbm90IGp1c3QgTU9ERV9SR0IKKzhhYTUwZWZkIGZpeCBzb21lICdtYW4nIHR5cG9zCitkM2YzYmRkYSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjEuMikKK2Q3ZTlhNjljIHVwZGF0ZSBjb250cmlidXRvciBsaXN0CisyNjFhYmI4ZSBhZGQgYSAnc3VwZXJjbGVhbicgc2VjdGlvbgorMjc2YWU4MjUgUmVtb3ZlIGZpbGVzIG5vdCBtZWFuIHRvIGJlIGluIGdpdCwgYW5kIHVwZGF0ZSAuZ2l0aWdub3JlCisyNDg2ODQ1NSBidWlsZDogcHJlcGFyZSBsaWJ3ZWJwLnBjCisxNGNlYjZlOCBhZGQgIi12ZXJzaW9uIiBkZXNjcmlwdGlvbiB0byBtYW4gcGFnZXMKK2IyNDdhM2IyIENyZWF0ZSB0aGUgbTQgZGlyZWN0b3J5LCBhbmQgYWxzbyBwbGFjZSAuZ2l0aWdub3JlIGluIHRoZXJlIGZvciBsaWJ0b29sLgorY2RkNzM0YzkgUmVzb2x2ZSBhdXRvbWFrZSB3YXJuaW5ncworYzVmYTcyNmUgYnVpbGQ6IGFkZCBwa2djb25maWcgZmlsZXMKK2IyMGFhY2EyIGJ1aWxkOiBqdXN0IHVzZSBhdXRvcmVjb25mLCBhdm9pZCBjYWxsaW5nIHRvb2xzIG1hbnVhbGx5Cis0YjBiMGQ2NiBjd2VicDogdXNlIG1vZGVybiBmdW5jdGlvbnMKK2VmYmM2YzQxIHVwZGF0ZSBBbmRyb2lkLm1rCis3Nzc3NTcwYiBiZXR0ZXIgdmVyc2lvbiBvZiBDaGFuZ2VMb2cKK2ZhNzBkMmI3IHVwZGF0ZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgRE9DCitmOGRiNWQ1ZCBtb3JlIEM4OS1maXhlcworMGRlMDEzYjMgZml4IHR5cG9zCis2NTBmZmEzYiBhZGQgdmVyc2lvbiBnZXR0ZXJzIGZvciBkZWNvZGVyIGFuZCBlbmNvZGVyCitiZTQ4NjdkMiBkb2MgZm9yIGluY3JlbWVudGFsIGRlY29kaW5nCis1NjczMmExYiBhZGQgaWRlYy5vYmogaW4gTVNWQyBtYWtlZmlsZQorMjA4YWZiNWUgYWRkIGMrKyBndWFyZHMKKzhiZjc2ZmUwIGFkZCBpbmNyZW1lbnRhbCBkZWNvZGluZworMWYyODgzMjggJ2lubGluZScgaXNuJ3QgZGVmaW5lZCBpbiBzdHJpY3QgYW5zaSBjODkKKzhiNzdjNjMyIG1vdmUgdGhlIHF1YW50aXphdGlvbiBmdW5jdGlvbiB0byBkc3AuYworYjJjMzU3NWMgYWRkIGEgJ2xhc3RfeScgZmllbGQgdG8gV2ViUERlY1BhcmFtcworMjY1NGMzZGEgY29ycmVjdGx5IHBhc3MgYWxvbmcgdGhlIGV4YWN0IHNhbWUgc3RhdHVzIHJldHVybmVkIGZyb20gUGFyc2VQYXJ0aXRpb25zCis0NzA0MTQ2YSBhZGQgbWlzc2luZyBwcmVjaXNpb24gaW4gdGhlIG1hbgorNmQ5NzhhNmMgYWRkIGVycm9yIG1lc3NhZ2VzCis2NDYzZTZhYiBhZGQgc29tZSBpbnN0YWxsIGluc3RydWN0aW9ucywgYW5kIGZpeCBpbnRlbC1tYWMgZmxhZ3MKKzA1ZmI3YmZjIE1lcmdlICIuZ2l0aWdub3JlOiBpbml0aWFsIHZlcnNpb24iCitjMzNmMDE5NSAuZ2l0aWdub3JlOiBpbml0aWFsIHZlcnNpb24KK2U1MzJiOWFiIE1ha2VmaWxlOiBhbGxvdyBvdXQgb2YgdHJlZSBidWlsZHMKKzRjMGRhN2FhIGVuYWJsZSBzcGFyc2UgZGMvYWMgdHJhbnNmb3JtcworMDdkYmI4ZDUgY2xhcmlmeSB0aGUgcmV0dXJuIGxvZ2ljCis1YzY5ZTFiYiBmaXggYmlnZ2VyLWJ5LTEgYXJyYXkKKzdjNTI2N2UzIGZpeCBhIChoYXJtbGVzcykgdHlwbzogbm9uX3plcm9fIC0+IG5vbl96ZXJvX2FjXworYmM3NTIxMzUgZml4IG1pc3NpbmcgZnJlZSgpCithZjNlMmFhYSByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisxM2U1MGRhNiBtYWtlIHRoZSBiaXRyZWFkZXIgcHJlbG9hZCBhdCBsZWFzdCA4Yml0cywgaW5zdGVhZCBvZiBwb3N0LWxvYWQgdGhlbSAodGhpcyBtYWtlcyBpbml0aWFsaXphdGlvbiBlYXNpZXIgYW5kIHdpbGwgYmUgaGVscGZ1bCBmb3IgaW5jcmVtZW50YWwgZGVjb2RpbmcpLiBNb2RpZnkgUGFyc2VQYXJ0aXRpb25zKCkgdG8gYWNjb21tb2RhdGUgZm9yIHRydW5jYXRlZCBpbnB1dC4KK2Y0ODg4Zjc3IGVtaXQgOSAtIG5iX2JpdHMgdHJhaWxpbmcgemVyb3MgaW5zdGVhZCBvZiA4CiszZGI2NTI1NSBzZXBhcmF0ZSBibG9jay1wYXJzaW5nIGludG8gYSB2aXNpYmxlIFZQOERlY29kZU1CKCkKK2E4NzFkZTAyIGFkZCBtaXNzaW5nIGV4dGVybiAiQyIKK2IzY2U4YzUyIHJlbW92ZSBhIGdjYyB3YXJuaW5nIGFib3V0IHR5cGUgcHVuIGJ5IHVzaW5nIGEgcHJvcGVyIHVuaW9uJ2QgdHlwZQorZTE4NjM3MTUgdXBkYXRlIGFmdGVyIGFkZGl0aW9uIG9mIHdlYnBpLmgKKzNlODU2ZTJkIEV4dHJhY3Qgc29tZSB1c2VmdWwgZnVuY3Rpb25zIGFyb3VuZCBkZWNvZGluZyBidWZmZXIgV2ViUERlY1BhcmFtcy4KK2Q1YmMwNWE0IG1ha2UgdGhlIGZpbHRlcmluZyBwcm9jZXNzIG1hdGNoIGxpYnZweCBhbmQgZmZ2cDgKK2RkNjAxMzhkIGFkZCBtYW4gcGFnZXMgZm9yIGN3ZWJwKDEpIGFuZCBkd2VicCgxKQorYzRmYTM2NDQgZml4IGhlYWRlcgorNWI3MGIzNzggKiBhZGQgYW4gb3B0aW9uIHRvIGJ5cGFzc19maWx0ZXJpbmcgaW4gVlA4SW8uCitiOTdhNDAwMyBzaW1wbGlmeSBRdWFudGl6ZUJsb2NrIGNvZGUgYSBiaXQKKzg0YjU4ZWJiIGFkZCBtb3JlIGNoZWNrcyBhcm91bmQgcGljdHVyZSBhbGxvY2F0aW9uCitiNjVhM2UxMCAgICAgcmVtb3ZlIGFic29sdXRlX2RlbHRhXyBmaWVsZCBhbmQgc3ludGF4IGNvZGUKKzA3NDRlODQyIERvbnQnIG9wZW4gb3V0cHV0IGZpbGUgdW50aWwgd2UncmUgc3VyZSB0aGUgaW5wdXQgZmlsZSBpcyB2YWxpZAorZDViZDU0YzcgZml4IHR5cG8gYW5kIGJ1Z2d5IGxpbmUKK2Y3YTk1NDlkIEFkZCBhIHNpbXBsZSB0b3AtbGV2ZWwgbWFrZWZpbGUudW5peCBmb3IgcXVpY2sgJiBlYXN5IGJ1aWxkLgorNWYzNmI5NDQgdXBkYXRlIHRoZSBkb2MgZm9yIHRoZSAtZiBvcHRpb24KK2Y2MWQxNGFhIGEgV2ViUCBlbmNvZGVyIGNvbnZlcnRzIFBORyAmIEpQRUcgdG8gV2ViUAorODFjOTY2MjEgb29wczogZm9yZ290dGVuIGNhbGwgdG8gSW5pdGlhbGl6ZSgpICsgbW92ZSB0aGUgZXJyb3IgbWVzc2FnZSB0byBhIG1vcmUgdXNlZnVsIHBsYWNlCis4N2ZmYTAwNSB0eXBvOiBmaXggYSBtaXNzaW5nICdSJywgd2FzIGNvbmZ1c2luZy4KK2IwNGI4NTdhICogYWRkIGRlY29kaW5nIG1lYXN1cmVtZW50IHVzaW5nIHN0b3B3YXRjaC5oICh1c2UgLXYgb3B0aW9uKSAqIHN1cHBvcnQgUE5HIG91dHB1dCB0aHJvdWdoIFdJQyBvbiBXaW4zMgorNzQ2YTQ4MjAgKiBtYWtlICgqcHV0KSgpIGhvb2sgcmV0dXJuIGEgYm9vbCBmb3IgYWJvcnQgcmVxdWVzdC4gKiBhZGQgYW4gZW51bSBmb3IgVlA4U3RhdHVzKCkgdG8gbWFrZSB0aGluZ3MgY2xlYXJlcgorNzNjOTczZTYgKiBzdHJlbmd0aGVuIHJpZmYvY2h1bmsgc2l6ZSBjaGVja3MgKiBkb24ndCBjb25zaWRlciBvZGQtc2l6ZWQgY2h1bmtzIGJlaW5nIGFuIGVycm9yCisxZGM0NjExYSBhZGQgc3VwcG9ydCBmb3IgUE5HIG91dHB1dCAoZGVmYXVsdCkgcmVndWxhcml6ZSBpbmNsdWRlIGd1YXJkcworODYwNjQxZGYgZml4IGEgdHlwbzogc2l6ZW9mKGtZTW9kZVByb2JhSW50ZXIwKSA9PiBzaXplb2Yoa1VWTW9kZVByb2JhSW50ZXIwKQorMzI1NGZjNTIgZml4IHNvbWUgcGV0dHkgY29uc3RuZXNzIGZpeCB0aGUgLi9jb25maWd1cmUgZmlsZSB0b28KKzUwNGQzMzkzIGZpeCBlb2ZfIG1pcy1pbml0aWFsaXphdGlvbgorMmJjMDc3OGYgbGVmdG92ZXIgTWFrZWZpbGUuKiBmcm9tIHByZXZpb3VzIGNvbW1pdAorZDJjZjA0ZTQgbW92ZSBNYWtlZmlsZS5hbSBvbmUgbGV2ZWwgYmVsb3csIHRvIHNyYy9kZWMgZml4IHR5cG9zIGhlcmUgYW5kIHRoZXJlIGR3ZWJwIGlzIG5vdyBhbiBpbnN0YWxsZWQgcHJvZ3JhbQorYWRlOTJkZTggdHlwbzogdnA4LmggLT4gZGVjb2RlX3ZwOC5oCitkNzI0MTI0MSBmb3Jnb3QgdG8gZGVjbGFyZSB0eXBlcy5oIHRvIGJlIGluc3RhbGxlZAorNjQyMWE3YTQgbW92ZSB0aGUgZGVjb2RlciBzb3VyY2V0cmVlIHRvIGEgc3ViLWxvY2F0aW9uIHNyYy9kZWMgdG8gbWFrZSByb29tIGZvciBmdXR1cmUgbGlicyBzb3VyY2VzCithOWIzZWFiNiBjb3JyZWN0IGxheW91dCBuYW1lIGlzIElNQzQuCisyMzMwNTIyYyBoYW5kbGUgY29ybmVyIGNhc2Ugb2YgemVyby1kaW1lbnNpb25zCisyODBjMzY1OCBtYWtlIFZQOEluaXQoKSBoYW5kbGUgc2hvcnQgYnVmZmVycyAoPCAyIGJ5dGVzKSBjb3JyZWN0bHkKK2IxYzllOGI0IGhhbmRsZSBlcnJvciBjYXNlcyBtb3JlIHJvYnVzdGx5CiswZTk0OTM1YyBNZXJnZSAidGFibGUtbGVzcyB2ZXJzaW9uIG9mIGNsaXBfOGIoKSIKKzFlMGEyZDI1IHRhYmxlLWxlc3MgdmVyc2lvbiBvZiBjbGlwXzhiKCkKK2UxMjEwOWVlIGR3ZWJwOiBjaGFuZ2UgLXl1diBvcHRpb24gdG8gLXJhdyBjaGFuZ2UgdGhlIGxheW91dCB0byBJTUMyCitkNzIxODBhNCBzcGVlZC11cCBmYW5jeSB1cHNjYWxlcgorOTE0NWYzYmMgcmVzZXQgZW9mXyBhdCBjb25zdHJ1Y3Rpb24gdGltZQorYTdlZTA1NTkgc2ltcGxpZnkgdGhlIGxvZ2ljIG9mIEdldENvZWZmcygpCitmNjdiNTkzOSBsb3Qgb2YgY29zbWV0aWNzCitlYTI3ZDdjNiBmaXggZW5kaWFuIHByb2JsZW0gb24gUG93ZXJQQworYmViMGExYmEgZml4IHNpZ25hdHVyZSBvZiBWUDhTdG9yZUJsb2NrCitiMTI4YzVlMiBNZXJnZSAiZmFuY3kgY2hyb21hIHVwc2NhbGluZyIKKzZhMzdhMmFhIGZhbmN5IGNocm9tYSB1cHNjYWxpbmcKK2ZmNTY1ZWRjIGZpeCB0d28gbnVtZXJpYyB0eXBvcworNWE5MzZhMGEgdXNlIHVpbnRwdHJfdCBmb3IgY2FzdGluZyBwb2ludGVycyB0byBpbnRzCitlMTRhMDMwMSBmb3IgY3Jvc3NfY29tcGlsaW5nPXllcyB0byBwcmV2ZW50IGV4ZWN1dGluZyBhbnkgYmluYXJ5Cis4M2I1NDVlZSBhZGQgdmM5KyBtYWtlZmlsZQorMjk2ZjY5MTQgZml4IG91dHB1dCBsb29wIGZvciBzbWFsbCBoZWlnaHQKK2NiZmJiNWMzIGNvbnZlcnQgdG8gcGxhaW4tQworZjA5Zjk2ZWUgRml4IGRlY2xhcmF0aW9uIGFmdGVyIHN0YXRlbWVudCB3YXJuaW5nCis1OTgxZWU1NSBGaXggVVYgcGxhbmUgYWMvZGMgcXVhbnRpemVyIHRyYW5zcG9zaXRpb24KK2M4ZDE1ZWZhIGNvbnZlcnQgdG8gQU5TSS1DCitjM2Y0MWNiNCBJbml0aWFsIGNvbW1pdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTElDRU5TRSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzk1YzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgIGRpc3RyaWJ1dGlvbi4KLQotICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLSAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi1EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLVRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotQWRkaXRpb25hbCBJUCBSaWdodHMgR3JhbnQgKFBhdGVudHMpCi0KLSJUaGlzIGltcGxlbWVudGF0aW9uIiBtZWFucyB0aGUgY29weXJpZ2h0YWJsZSB3b3JrcyBkaXN0cmlidXRlZCBieQotR29vZ2xlIGFzIHBhcnQgb2YgdGhlIFdlYk0gUHJvamVjdC4KLQotR29vZ2xlIGhlcmVieSBncmFudHMgdG8geW91IGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsCi1uby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKQotcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwKLXRyYW5zZmVyLCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZCBwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMKLWltcGxlbWVudGF0aW9uIG9mIFZQOCwgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQKLWNsYWltcywgYm90aCBjdXJyZW50bHkgb3duZWQgYnkgR29vZ2xlIGFuZCBhY3F1aXJlZCBpbiB0aGUgZnV0dXJlLAotbGljZW5zYWJsZSBieSBHb29nbGUgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoaXMKLWltcGxlbWVudGF0aW9uIG9mIFZQOC4gVGhpcyBncmFudCBkb2VzIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlCi1pbmZyaW5nZWQgb25seSBhcyBhIGNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoaXMKLWltcGxlbWVudGF0aW9uLiBJZiB5b3Ugb3IgeW91ciBhZ2VudCBvciBleGNsdXNpdmUgbGljZW5zZWUgaW5zdGl0dXRlIG9yCi1vcmRlciBvciBhZ3JlZSB0byB0aGUgaW5zdGl0dXRpb24gb2YgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkKLWVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcKLXRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBWUDggb3IgYW55IGNvZGUgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGlzCi1pbXBsZW1lbnRhdGlvbiBvZiBWUDggY29uc3RpdHV0ZXMgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQKLWluZnJpbmdlbWVudCwgb3IgaW5kdWNlbWVudCBvZiBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQKLXJpZ2h0cyBncmFudGVkIHRvIHlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgVlA4Ci1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjczYjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorU1VCRElSUyA9IHNyYyBpbWFnZWlvIG1hbgorRVhUUkFfRElTVCA9IENPUFlJTkcgYXV0b2dlbi5zaAorCitpZiBXQU5UX0VYVFJBUworICBTVUJESVJTICs9IGV4dHJhcworZW5kaWYKKworU1VCRElSUyArPSBleGFtcGxlcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUudmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS52YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFiZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUudmMKQEAgLTAsMCArMSw1MTcgQEAKKyMKKyMgU3RlbSBmb3Igc3RhdGljIGxpYnMgYW5kIERMTHMKKyMKK0xJQldFQlBERUNPREVSX0JBU0VOQU1FID0gbGlid2VicGRlY29kZXIKK0xJQldFQlBfQkFTRU5BTUUgPSBsaWJ3ZWJwCitMSUJXRUJQTVVYX0JBU0VOQU1FID0gbGlid2VicG11eAorTElCV0VCUERFTVVYX0JBU0VOQU1FID0gbGlid2VicGRlbXV4CisKKyFJRk5ERUYgQVJDSAorIUlGICEgWyBjbCAyPiYxIHwgZmluZCAieDg2IiA+IE5VTCBdCitBUkNIID0geDg2CishRUxTRSBJRiAhIFsgY2wgMj4mMSB8IGZpbmQgIng2NCIgPiBOVUwgXQorQVJDSCA9IHg2NAorIUVMU0UgSUYgISBbIGNsIDI+JjEgfCBmaW5kICJBUk0iID4gTlVMIF0KK0FSQ0ggPSBBUk0KKyFFTFNFCishRVJST1IgVW5hYmxlIHRvIGF1dG8tZGV0ZWN0IHRvb2xjaGFpbiBhcmNoaXRlY3R1cmUhIFwKK0lmIGNsLmV4ZSBpcyBpbiB5b3VyIFBBVEggcmVydW4gbm1ha2Ugd2l0aCBBUkNIPTxhcmNoPi4KKyFFTkRJRgorIUVORElGCisKKyFJRiAiJChBUkNIKSIgPT0gIng4NiIKK1BMQVRGT1JNX0xERkxBR1MgPSAvU0FGRVNFSAorIUVORElGCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE5vdGhpbmcgbW9yZSB0byBkbyBiZWxvdyB0aGlzIGxpbmUhCisKK05PTE9HTyAgICAgPSAvbm9sb2dvCitDQ05PREJHICAgID0gY2wuZXhlICQoTk9MT0dPKSAvTzIgL0ROREVCVUcKK0NDREVCVUcgICAgPSBjbC5leGUgJChOT0xPR08pIC9PZCAvR20gL1ppIC9EX0RFQlVHIC9SVEMxCitDRkxBR1MgICAgID0gL0kuIC9Jc3JjICQoTk9MT0dPKSAvVzMgL0VIc2MgL2MKK0NGTEFHUyAgICAgPSAkKENGTEFHUykgL0RXSU4zMiAvRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC9EV0lOMzJfTEVBTl9BTkRfTUVBTgorTERGTEFHUyAgICA9IC9MQVJHRUFERFJFU1NBV0FSRSAvTUFOSUZFU1QgL05YQ09NUEFUIC9EWU5BTUlDQkFTRQorTERGTEFHUyAgICA9ICQoTERGTEFHUykgJChQTEFURk9STV9MREZMQUdTKQorTE5LRExMICAgICA9IGxpbmsuZXhlIC9ETEwgJChOT0xPR08pCitMTktFWEUgICAgID0gbGluay5leGUgJChOT0xPR08pCitMTktMSUIgICAgID0gbGliLmV4ZSAkKE5PTE9HTykKK01UICAgICAgICAgPSBtdC5leGUgJChOT0xPR08pCitSQ05PREJHICAgID0gcmMuZXhlICQoTk9MT0dPKSAvbCIweDA0MDkiICAjIDB4NDA5ID0gVS5TLiBFbmdsaXNoCitSQ0RFQlVHICAgID0gJChSQ05PREJHKSAvRF9ERUJVRworCishSUYgIiQoQVJDSCkiID09ICJBUk0iCitDRkxBR1MgPSAkKENGTEFHUykgL0RXSU5BUElfRkFNSUxZPVdJTkFQSV9GQU1JTFlfUEhPTkVfQVBQIC9EV0VCUF9VU0VfVEhSRUFECishRUxTRQorQ0ZMQUdTID0gJChDRkxBR1MpIC9ESEFWRV9XSU5DT0RFQ19IIC9EV0VCUF9VU0VfVEhSRUFECishRU5ESUYKKworQ0ZHU0VUICAgICA9IEZBTFNFCishSUYgIiQoT0JKRElSKSIgPT0gIiIKK09VVERJUiA9IC4uXG9ialwKKyFFTFNFCitPVVRESVIgPSAkKE9CSkRJUikKKyFFTkRJRgorCishSUYgIiQoSEFWRV9BVlgyKSIgPT0gIjEiCitDRkxBR1MgPSAkKENGTEFHUykgL0RXRUJQX0hBVkVfQVZYMgorQVZYMl9GTEFHUyA9IC9hcmNoOkFWWDIKKyFFTkRJRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSdW50aW1lIGxpYnJhcnkgY29uZmlndXJhdGlvbgorIUlGICIkKFJUTElCQ0ZHKSIgPT0gInN0YXRpYyIKK1JUTElCICA9IC9NVAorUlRMSUJEID0gL01UZAorIUVMU0UgSUYgIiQoUlRMSUJDRkcpIiA9PSAibGVnYWN5IgorUlRMSUJDRkcgPSBzdGF0aWMKK1JUTElCICA9IC9NVAorUlRMSUJEID0gL01UZAorQ0ZMQUdTID0gJChDRkxBR1MpIC9HUy0gL2FyY2g6SUEzMgorIUVMU0UKK1JUTElCICAgPSAvTUQKK1JUTElCRCAgPSAvTURkCishRU5ESUYKK0RJUkJBU0UgPSAkKE9VVERJUilcJChDRkcpXCQoQVJDSCkKK0RJUk9CSiA9ICQoRElSQkFTRSlcb2JqCitESVJMSUIgPSAkKERJUkJBU0UpXGxpYgorRElSSU5DID0gJChESVJCQVNFKVxpbmNsdWRlCitESVJCSU4gPSAkKERJUkJBU0UpXGJpbgorTElCV0VCUF9QREJOQU1FID0gJChESVJPQkopXCQoTElCV0VCUF9CQVNFTkFNRSkucGRiCitPVVRQVVRfRElSUyA9ICQoRElSQklOKSAkKERJUklOQykgJChESVJMSUIpIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGRlYyBcCisgICAgICAgICAgICAgICQoRElST0JKKVxkZW11eCBcCisgICAgICAgICAgICAgICQoRElST0JKKVxkc3AgXAorICAgICAgICAgICAgICAkKERJUk9CSilcZW5jIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGV4YW1wbGVzIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGV4dHJhcyBcCisgICAgICAgICAgICAgICQoRElST0JKKVxpbWFnZWlvIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXG11eCBcCisgICAgICAgICAgICAgICQoRElST0JKKVx1dGlscyBcCisKKyMgVGFyZ2V0IGNvbmZpZ3VyYXRpb24KKyFJRiAiJChDRkcpIiA9PSAicmVsZWFzZS1zdGF0aWMiCitDQyAgICAgICAgICAgICA9ICQoQ0NOT0RCRykKK1NUQVRJQ0xJQkJVSUxEID0gVFJVRQorIUVMU0UgSUYgIiQoQ0ZHKSIgPT0gImRlYnVnLXN0YXRpYyIKK0NDICAgICAgICAgICAgID0gJChDQ0RFQlVHKQorUlRMSUIgICAgICAgICAgPSAkKFJUTElCRCkKK1NUQVRJQ0xJQkJVSUxEID0gVFJVRQorTElCV0VCUERFQ09ERVJfQkFTRU5BTUUgPSAkKExJQldFQlBERUNPREVSX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUF9CQVNFTkFNRSA9ICQoTElCV0VCUF9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBNVVhfQkFTRU5BTUUgPSAkKExJQldFQlBNVVhfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQREVNVVhfQkFTRU5BTUUgPSAkKExJQldFQlBERU1VWF9CQVNFTkFNRSlfZGVidWcKKyFFTFNFIElGICIkKENGRykiID09ICJyZWxlYXNlLWR5bmFtaWMiCitDQyAgICAgICAgPSAkKENDTk9EQkcpCitSQyAgICAgICAgPSAkKFJDTk9EQkcpCitETExCVUlMRCAgPSBUUlVFCishRUxTRSBJRiAiJChDRkcpIiA9PSAiZGVidWctZHluYW1pYyIKK0NDICAgICAgICA9ICQoQ0NERUJVRykKK1JDICAgICAgICA9ICQoUkNERUJVRykKK1JUTElCICAgICA9ICQoUlRMSUJEKQorRExMQlVJTEQgID0gVFJVRQorTElCV0VCUERFQ09ERVJfQkFTRU5BTUUgPSAkKExJQldFQlBERUNPREVSX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUF9CQVNFTkFNRSA9ICQoTElCV0VCUF9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBNVVhfQkFTRU5BTUUgPSAkKExJQldFQlBNVVhfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQREVNVVhfQkFTRU5BTUUgPSAkKExJQldFQlBERU1VWF9CQVNFTkFNRSlfZGVidWcKKyFFTkRJRgorCishSUYgIiQoU1RBVElDTElCQlVJTEQpIiA9PSAiVFJVRSIKK0NDICAgICA9ICQoQ0MpICQoUlRMSUIpCitDRkdTRVQgPSBUUlVFCitMSUJXRUJQREVDT0RFUiA9ICQoRElSTElCKVwkKExJQldFQlBERUNPREVSX0JBU0VOQU1FKS5saWIKK0xJQldFQlAgPSAkKERJUkxJQilcJChMSUJXRUJQX0JBU0VOQU1FKS5saWIKK0xJQldFQlBNVVggPSAkKERJUkxJQilcJChMSUJXRUJQTVVYX0JBU0VOQU1FKS5saWIKK0xJQldFQlBERU1VWCA9ICQoRElSTElCKVwkKExJQldFQlBERU1VWF9CQVNFTkFNRSkubGliCishRUxTRSBJRiAiJChETExCVUlMRCkiID09ICJUUlVFIgorRExMSU5DID0gd2VicF9kbGwuaAorQ0MgICAgID0gJChDQykgL0kkKERJUk9CSikgL0ZJJChETExJTkMpICQoUlRMSUIpIC9EV0VCUF9ETEwKK0xJQldFQlBERUNPREVSID0gJChESVJMSUIpXCQoTElCV0VCUERFQ09ERVJfQkFTRU5BTUUpX2RsbC5saWIKK0xJQldFQlAgPSAkKERJUkxJQilcJChMSUJXRUJQX0JBU0VOQU1FKV9kbGwubGliCitMSUJXRUJQTVVYID0gJChESVJMSUIpXCQoTElCV0VCUE1VWF9CQVNFTkFNRSlfZGxsLmxpYgorTElCV0VCUERFTVVYID0gJChESVJMSUIpXCQoTElCV0VCUERFTVVYX0JBU0VOQU1FKV9kbGwubGliCitMSUJXRUJQX1BEQk5BTUUgPSAkKERJUk9CSilcJChMSUJXRUJQX0JBU0VOQU1FKV9kbGwucGRiCitDRkdTRVQgPSBUUlVFCishRU5ESUYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVXNhZ2UKKyMKKyFJRiAiJChDRkdTRVQpIiA9PSAiRkFMU0UiCishTUVTU0FHRSBVc2FnZTogbm1ha2UgL2YgTWFrZWZpbGUudmMgW0NGRz08Y29uZmlnPl0KKyFNRVNTQUdFIC4gICAgICAgICAgW09CSkRJUj08cGF0aD5dIFtSVExJQkNGRz08cnRsaWI+XSBbPHRhcmdldD5dCishTUVTU0FHRQorIU1FU1NBR0Ugd2hlcmUgPGNvbmZpZz4gaXMgb25lIG9mOgorIU1FU1NBR0UgLSAgcmVsZWFzZS1zdGF0aWMgICAgICAgICAgICAgICAgLSByZWxlYXNlIHN0YXRpYyBsaWJyYXJ5CishTUVTU0FHRSAtICBkZWJ1Zy1zdGF0aWMgICAgICAgICAgICAgICAgICAtIGRlYnVnIHN0YXRpYyBsaWJyYXJ5CishTUVTU0FHRSAtICByZWxlYXNlLWR5bmFtaWMgICAgICAgICAgICAgICAtIHJlbGVhc2UgZHluYW1pYyBsaW5rIGxpYnJhcnkgKERMTCkKKyFNRVNTQUdFIC0gIGRlYnVnLWR5bmFtaWMgICAgICAgICAgICAgICAgIC0gZGVidWcgZHluYW1pYyBsaW5rIGxpYnJhcnkgKERMTCkKKyFNRVNTQUdFCishTUVTU0FHRSA8dGFyZ2V0PiBtYXkgYmU6CishTUVTU0FHRSAtICBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAtIHBlcmZvcm0gYSBjbGVhbiBmb3IgQ0ZHCishTUVTU0FHRSAtICBleHBlcmltZW50YWwgICAgICAgICAgICAgICAgICAtIGJ1aWxkIENGRyB3aXRoIGV4cGVyaW1lbnRhbAorIU1FU1NBR0UgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyBlbmFibGVkLgorIU1FU1NBR0UgLSAoZW1wdHkpICAgICAgICAgICAgICAgICAgICAgICAgLSBidWlsZCBsaWJ3ZWJwLWJhc2VkIHRhcmdldHMgZm9yIENGRworIU1FU1NBR0UgLSBhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBidWlsZCAoZGUpbXV4LWJhc2VkIHRhcmdldHMgZm9yIENGRworIU1FU1NBR0UgLSBnaWYyd2VicCAgICAgICAgICAgICAgICAgICAgICAgLSByZXF1aXJlcyBsaWJnaWYgJiA+PSBWUzIwMTMKKyFNRVNTQUdFIC0gYW5pbV9kaWZmICAgICAgICAgICAgICAgICAgICAgIC0gcmVxdWlyZXMgbGliZ2lmICYgPj0gVlMyMDEzCishTUVTU0FHRSAtIGFuaW1fZHVtcAorIU1FU1NBR0UKKyFNRVNTQUdFIFJUTElCQ0ZHIGNvbnRyb2xzIHRoZSBydW50aW1lIGxpYnJhcnkgbGlua2FnZSAtICdzdGF0aWMnIG9yICdkeW5hbWljJy4KKyFNRVNTQUdFICAgJ2xlZ2FjeScgd2lsbCBwcm9kdWNlIGEgV2luZG93cyAyMDAwIGNvbXBhdGlibGUgbGlicmFyeS4KKyFNRVNTQUdFIE9CSkRJUiBpcyB0aGUgcGF0aCB3aGVyZSB5b3UgbGlrZSB0byBidWlsZCAob2JqLCBiaW5zLCBldGMuKSwKKyFNRVNTQUdFICAgZGVmYXVsdHMgdG8gLi5cb2JqCisKKyFJRiAiJChDRkcpIiAhPSAiIgorIU1FU1NBR0UKKyFFUlJPUiBwbGVhc2UgY2hvb3NlIGEgdmFsaWQgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mICIkKENGRykiCishRU5ESUYKKyFFTkRJRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSdWxlcworIworIUlGICIkKENGR1NFVCkiID09ICJUUlVFIgorIyBBIGNvbmZpZyB3YXMgcHJvdmlkZWQsIHNvIHRoZSBsaWJyYXJ5IGNhbiBiZSBidWlsdC4KKyMKKworREVDX09CSlMgPSBcCisgICAgJChESVJPQkopXGRlY1xhbHBoYV9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXGJ1ZmZlcl9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXGZyYW1lX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcaWRlY19kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXGlvX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNccXVhbnRfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1x0cmVlX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcdnA4X2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcdnA4bF9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXHdlYnBfZGVjLm9iaiBcCisKK0RFTVVYX09CSlMgPSBcCisgICAgJChESVJPQkopXGRlbXV4XGFuaW1fZGVjb2RlLm9iaiBcCisgICAgJChESVJPQkopXGRlbXV4XGRlbXV4Lm9iaiBcCisKK0RTUF9ERUNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZHNwXGFscGhhX3Byb2Nlc3Npbmcub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGFscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGFscGhhX3Byb2Nlc3NpbmdfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcYWxwaGFfcHJvY2Vzc2luZ19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxhbHBoYV9wcm9jZXNzaW5nX3NzZTQxLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxjcHUub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlYy5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX2NsaXBfdGFibGVzLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX3NzZTQxLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxmaWx0ZXJzLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxmaWx0ZXJzX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxmaWx0ZXJzX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcZmlsdGVyc19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxmaWx0ZXJzX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlci5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXJfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlcl9taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXJfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlcl9uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlcl9zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZ19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmdfc3NlNDEub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1di5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2X21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2X21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXZfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2X3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1dl9zc2U0MS5vYmogXAorCitEU1BfRU5DX09CSlMgPSBcCisgICAgJChESVJPQkopXGRzcFxjb3N0Lm9iaiBcCisgICAgJChESVJPQkopXGRzcFxjb3N0X21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcY29zdF9taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcY29zdF9zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmMub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19hdngyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX3NzZTQxLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfc3NlNDEub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHNzaW0ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHNzaW1fc3NlMi5vYmogXAorCitFWF9BTklNX1VUSUxfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZXhhbXBsZXNcYW5pbV91dGlsLm9iaiBcCisKK0lNQUdFSU9fREVDX09CSlMgPSBcCisgICAgJChESVJPQkopXGltYWdlaW9caW1hZ2VfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9canBlZ2RlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXG1ldGFkYXRhLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9ccG5nZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9ccG5tZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9cdGlmZmRlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXHdlYnBkZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1x3aWNkZWMub2JqIFwKKworSU1BR0VJT19FTkNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xpbWFnZV9lbmMub2JqIFwKKworRVhfR0lGX0RFQ19PQkpTID0gXAorICAgICQoRElST0JKKVxleGFtcGxlc1xnaWZkZWMub2JqIFwKKworRVhfVVRJTF9PQkpTID0gXAorICAgICQoRElST0JKKVxleGFtcGxlc1xleGFtcGxlX3V0aWwub2JqIFwKKworRU5DX09CSlMgPSBcCisgICAgJChESVJPQkopXGVuY1xhbHBoYV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGFuYWx5c2lzX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcYmFja3dhcmRfcmVmZXJlbmNlc19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGNvbmZpZ19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGNvc3RfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xmaWx0ZXJfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xmcmFtZV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGhpc3RvZ3JhbV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGl0ZXJhdG9yX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcbmVhcl9sb3NzbGVzc19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHBpY3R1cmVfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwaWN0dXJlX2NzcF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHBpY3R1cmVfcHNucl9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHBpY3R1cmVfcmVzY2FsZV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHBpY3R1cmVfdG9vbHNfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwcmVkaWN0b3JfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xxdWFudF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHN5bnRheF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHRva2VuX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcdHJlZV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHZwOGxfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1x3ZWJwX2VuYy5vYmogXAorCitFWFRSQVNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZXh0cmFzXGV4dHJhcy5vYmogXAorICAgICQoRElST0JKKVxleHRyYXNccXVhbGl0eV9lc3RpbWF0ZS5vYmogXAorCitJTUFHRUlPX1VUSUxfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xpbWFnZWlvX3V0aWwub2JqIFwKKworTVVYX09CSlMgPSBcCisgICAgJChESVJPQkopXG11eFxhbmltX2VuY29kZS5vYmogXAorICAgICQoRElST0JKKVxtdXhcbXV4ZWRpdC5vYmogXAorICAgICQoRElST0JKKVxtdXhcbXV4aW50ZXJuYWwub2JqIFwKKyAgICAkKERJUk9CSilcbXV4XG11eHJlYWQub2JqIFwKKworVVRJTFNfREVDX09CSlMgPSBcCisgICAgJChESVJPQkopXHV0aWxzXGJpdF9yZWFkZXJfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcY29sb3JfY2FjaGVfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcZmlsdGVyc191dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xodWZmbWFuX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHF1YW50X2xldmVsc19kZWNfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNccmVzY2FsZXJfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNccmFuZG9tX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHRocmVhZF91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1x1dGlscy5vYmogXAorCitVVElMU19FTkNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcdXRpbHNcYml0X3dyaXRlcl91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xodWZmbWFuX2VuY29kZV91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xxdWFudF9sZXZlbHNfdXRpbHMub2JqIFwKKworTElCV0VCUERFQ09ERVJfT0JKUyA9ICQoREVDX09CSlMpICQoRFNQX0RFQ19PQkpTKSAkKFVUSUxTX0RFQ19PQkpTKQorTElCV0VCUF9PQkpTID0gJChMSUJXRUJQREVDT0RFUl9PQkpTKSAkKEVOQ19PQkpTKSAkKERTUF9FTkNfT0JKUykgXAorICAgICAgICAgICAgICAgJChVVElMU19FTkNfT0JKUykgJChETExfT0JKUykKK0xJQldFQlBNVVhfT0JKUyA9ICQoTVVYX09CSlMpICQoTElCV0VCUE1VWF9PQkpTKQorTElCV0VCUERFTVVYX09CSlMgPSAkKERFTVVYX09CSlMpICQoTElCV0VCUERFTVVYX09CSlMpCisKK09VVF9MSUJTID0gJChMSUJXRUJQREVDT0RFUikgJChMSUJXRUJQKQorIUlGICIkKEFSQ0gpIiA9PSAiQVJNIgorZXg6ICQoT1VUX0xJQlMpCithbGw6IGV4CishRUxTRQorT1VUX0VYQU1QTEVTID0gJChESVJCSU4pXGN3ZWJwLmV4ZSAkKERJUkJJTilcZHdlYnAuZXhlCitFWFRSQV9FWEFNUExFUyA9ICQoRElSQklOKVx2d2VicC5leGUgJChESVJCSU4pXHdlYnBtdXguZXhlIFwKKyAgICAgICAgICAgICAgICAgJChESVJCSU4pXGltZzJ3ZWJwLmV4ZSAkKERJUkJJTilcZ2V0X2Rpc3RvLmV4ZSBcCisgICAgICAgICAgICAgICAgICQoRElSQklOKVx3ZWJwX3F1YWxpdHkuZXhlICQoRElSQklOKVx2d2VicF9zZGwuZXhlIFwKKyAgICAgICAgICAgICAgICAgJChESVJCSU4pXHdlYnBpbmZvLmV4ZQorCitleDogJChPVVRfTElCUykgJChPVVRfRVhBTVBMRVMpCithbGw6IGV4ICQoRVhUUkFfRVhBTVBMRVMpCisjIE5COiBnaWYyd2VicC5leGUgYW5kIGFuaW1fZGlmZi5leGUgYXJlIGV4Y2x1ZGVkIGZyb20gJ2FsbCcgYXMgbGliZ2lmIHJlcXVpcmVzCisjIEM5OSBzdXBwb3J0IHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIGZyb20gVlMyMDEzIG9ud2FyZC4KK2dpZjJ3ZWJwOiAkKERJUkJJTilcZ2lmMndlYnAuZXhlCithbmltX2RpZmY6ICQoRElSQklOKVxhbmltX2RpZmYuZXhlCithbmltX2R1bXA6ICQoRElSQklOKVxhbmltX2R1bXAuZXhlCisKKyQoRElSQklOKVxhbmltX2RpZmYuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcYW5pbV9kaWZmLm9iaiAkKEVYX0FOSU1fVVRJTF9PQkpTKQorJChESVJCSU4pXGFuaW1fZGlmZi5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGFuaW1fZGlmZi5leGU6ICQoRVhfR0lGX0RFQ19PQkpTKSAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorJChESVJCSU4pXGFuaW1fZHVtcC5leGU6ICQoRElST0JKKVxleGFtcGxlc1xhbmltX2R1bXAub2JqICQoRVhfQU5JTV9VVElMX09CSlMpCiskKERJUkJJTilcYW5pbV9kdW1wLmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcYW5pbV9kdW1wLmV4ZTogJChFWF9HSUZfREVDX09CSlMpICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCiskKERJUkJJTilcYW5pbV9kdW1wLmV4ZTogJChJTUFHRUlPX0VOQ19PQkpTKQorJChESVJCSU4pXGN3ZWJwLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGN3ZWJwLm9iaiAkKElNQUdFSU9fREVDX09CSlMpCiskKERJUkJJTilcY3dlYnAuZXhlOiAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGN3ZWJwLmV4ZTogJChMSUJXRUJQREVNVVgpCiskKERJUkJJTilcZHdlYnAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcZHdlYnAub2JqICQoSU1BR0VJT19ERUNfT0JKUykKKyQoRElSQklOKVxkd2VicC5leGU6ICQoSU1BR0VJT19FTkNfT0JKUykKKyQoRElSQklOKVxkd2VicC5leGU6ICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcZHdlYnAuZXhlOiAkKExJQldFQlBERU1VWCkKKyQoRElSQklOKVxnaWYyd2VicC5leGU6ICQoRElST0JKKVxleGFtcGxlc1xnaWYyd2VicC5vYmogJChFWF9HSUZfREVDX09CSlMpCiskKERJUkJJTilcZ2lmMndlYnAuZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykgJChMSUJXRUJQTVVYKQorJChESVJCSU4pXGdpZjJ3ZWJwLmV4ZTogJChMSUJXRUJQKQorJChESVJCSU4pXHZ3ZWJwLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXHZ3ZWJwLm9iaiAkKEVYX1VUSUxfT0JKUykKKyQoRElSQklOKVx2d2VicC5leGU6ICQoSU1BR0VJT19VVElMX09CSlMpICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCiskKERJUkJJTilcdndlYnBfc2RsLmV4ZTogJChESVJPQkopXGV4dHJhc1x2d2VicF9zZGwub2JqCiskKERJUkJJTilcdndlYnBfc2RsLmV4ZTogJChESVJPQkopXGV4dHJhc1x3ZWJwX3RvX3NkbC5vYmoKKyQoRElSQklOKVx2d2VicF9zZGwuZXhlOiAkKElNQUdFSU9fVVRJTF9PQkpTKSAkKExJQldFQlApCiskKERJUkJJTilcd2VicG11eC5leGU6ICQoRElST0JKKVxleGFtcGxlc1x3ZWJwbXV4Lm9iaiAkKExJQldFQlBNVVgpCiskKERJUkJJTilcd2VicG11eC5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKSAkKExJQldFQlApCiskKERJUkJJTilcaW1nMndlYnAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcaW1nMndlYnAub2JqICQoTElCV0VCUE1VWCkKKyQoRElSQklOKVxpbWcyd2VicC5leGU6ICQoSU1BR0VJT19ERUNfT0JKUykKKyQoRElSQklOKVxpbWcyd2VicC5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGltZzJ3ZWJwLmV4ZTogJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKyQoRElSQklOKVxnZXRfZGlzdG8uZXhlOiAkKERJUk9CSilcZXh0cmFzXGdldF9kaXN0by5vYmoKKyQoRElSQklOKVxnZXRfZGlzdG8uZXhlOiAkKElNQUdFSU9fREVDX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcZ2V0X2Rpc3RvLmV4ZTogJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKyQoRElSQklOKVx3ZWJwX3F1YWxpdHkuZXhlOiAkKERJUk9CSilcZXh0cmFzXHdlYnBfcXVhbGl0eS5vYmoKKyQoRElSQklOKVx3ZWJwX3F1YWxpdHkuZXhlOiAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXHdlYnBfcXVhbGl0eS5leGU6ICQoRVhUUkFTX09CSlMpICQoTElCV0VCUCkKKyQoRElSQklOKVx3ZWJwaW5mby5leGU6ICQoRElST0JKKVxleGFtcGxlc1x3ZWJwaW5mby5vYmoKKyQoRElSQklOKVx3ZWJwaW5mby5leGU6ICQoSU1BR0VJT19ERUNfT0JKUykKKyQoRElSQklOKVx3ZWJwaW5mby5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXHdlYnBpbmZvLmV4ZTogJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKworJChPVVRfRVhBTVBMRVMpOiAkKEVYX1VUSUxfT0JKUykgJChMSUJXRUJQKQorJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpOiAkKE9VVFBVVF9ESVJTKQorJChJTUFHRUlPX0RFQ19PQkpTKSAkKElNQUdFSU9fRU5DX09CSlMpICQoRVhUUkFTX09CSlMpOiAkKE9VVFBVVF9ESVJTKQorIUVORElGICAjIEFSQ0ggPT0gQVJNCisKKyQoTElCV0VCUERFQ09ERVIpOiAkKExJQldFQlBERUNPREVSX09CSlMpCiskKExJQldFQlApOiAkKExJQldFQlBfT0JKUykKKyQoTElCV0VCUE1VWCk6ICQoTElCV0VCUE1VWF9PQkpTKQorJChMSUJXRUJQREVNVVgpOiAkKExJQldFQlBERU1VWF9PQkpTKQorCiskKExJQldFQlBfT0JKUykgJChMSUJXRUJQTVVYX09CSlMpICQoTElCV0VCUERFTVVYX09CSlMpOiAkKE9VVFBVVF9ESVJTKQorCishSUYgIiQoRExMQlVJTEQpIiA9PSAiVFJVRSIKKyQoTElCV0VCUF9PQkpTKSAkKExJQldFQlBNVVhfT0JKUykgJChMSUJXRUJQREVNVVhfT0JKUyk6IFwKKyAgICAkKERJUk9CSilcJChETExJTkMpCisKK3skKERJUk9CSil9LmN7JChESVJPQkopfS5vYmo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kQCAgJDwKKwore3NyY30ucmN7JChESVJPQkopfS5yZXM6CisJJChSQykgL2ZvJEAgJDwKK3tzcmNcZGVtdXh9LnJjeyQoRElST0JKKVxkZW11eH0ucmVzOgorCSQoUkMpIC9mbyRAICQ8Cit7c3JjXG11eH0ucmN7JChESVJPQkopXG11eH0ucmVzOgorCSQoUkMpIC9mbyRAICQ8CisKKyQoTElCV0VCUCk6ICQoRElST0JKKVwkKExJQldFQlBfQkFTRU5BTUU6X2RlYnVnPSkucmVzCiskKExJQldFQlBERUNPREVSKTogJChESVJPQkopXCQoTElCV0VCUERFQ09ERVJfQkFTRU5BTUU6X2RlYnVnPSkucmVzCiskKExJQldFQlBNVVgpOiAkKExJQldFQlApICQoRElST0JKKVxtdXhcJChMSUJXRUJQTVVYX0JBU0VOQU1FOl9kZWJ1Zz0pLnJlcworJChMSUJXRUJQREVNVVgpOiAkKExJQldFQlApICQoRElST0JKKVxkZW11eFwkKExJQldFQlBERU1VWF9CQVNFTkFNRTpfZGVidWc9KS5yZXMKKworJChMSUJXRUJQREVDT0RFUikgJChMSUJXRUJQKSAkKExJQldFQlBNVVgpICQoTElCV0VCUERFTVVYKToKKwkkKExOS0RMTCkgL291dDokKERJUkJJTilcJChAQjpfZGxsPS5kbGwpIC9pbXBsaWI6JEAgJChMRkxBR1MpICQqKgorCS14Y29weSAkKERJUk9CSilcKi5wZGIgJChESVJMSUIpIC95CisKK2NsZWFuOjoKKwlALWVyYXNlIC9zICQoRElST0JKKVwkKERMTElOQykgMj4gTlVMCishRUxTRQorJChMSUJXRUJQREVDT0RFUikgJChMSUJXRUJQKSAkKExJQldFQlBNVVgpICQoTElCV0VCUERFTVVYKToKKwkkKExOS0xJQikgL291dDokQCAkKioKKwkteGNvcHkgJChESVJPQkopXCoucGRiICQoRElSTElCKSAveQorIUVORElGCisKKyQoT1VUUFVUX0RJUlMpOgorCUBpZiBub3QgZXhpc3QgIiQoQCkiIG1rZGlyICIkKEApIgorCisjIGdlbmVyYXRlIGEgaGVscGVyIGluY2x1ZGUgdG8gZGVmaW5lIFdFQlBfRVhURVJOIHN1aXRhYmxlIGZvciB0aGUgRExMIGJ1aWxkCiskKERJUk9CSilcJChETExJTkMpOgorCUBlY2hvICNpZm5kZWYgV0VCUF9ETExfSF8gPiAkQAorCUBlY2hvICNkZWZpbmUgV0VCUF9ETExfSF8gPj4gJEAKKwlAZWNobyAjZGVmaW5lIFdFQlBfRVhURVJOIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSA+PiAkQAorCUBlY2hvICNlbmRpZiAgLyogV0VCUF9ETExfSF8gKi8gPj4gJEAKKworLlNVRkZJWEVTOiAuYyAub2JqIC5yZXMgLmV4ZQorIyBGaWxlLXNwZWNpZmljIGZsYWcgYnVpbGRzLiBOb3RlIGJhdGNoIHJ1bGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHdpbGRjYXJkcywKKyMgc28gZm9yIG5vdyBuYW1lIGVhY2ggZmlsZSBpbmRpdmlkdWFsbHkuCiskKERJUk9CSilcZHNwXGVuY19hdngyLm9iajogc3JjXGRzcFxlbmNfYXZ4Mi5jCisJJChDQykgJChDRkxBR1MpICQoQVZYMl9GTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxkc3BcIFwKKwkgIHNyY1xkc3BcJChAQikuYworJChESVJPQkopXGV4YW1wbGVzXGFuaW1fZGlmZi5vYmo6IGV4YW1wbGVzXGFuaW1fZGlmZi5jCisJJChDQykgJChDRkxBR1MpIC9EV0VCUF9IQVZFX0dJRiAvRmQkKExJQldFQlBfUERCTkFNRSkgXAorCSAgL0ZvJChESVJPQkopXGV4YW1wbGVzXCBleGFtcGxlc1wkKEBCKS5jCiskKERJUk9CSilcZXhhbXBsZXNcYW5pbV9kdW1wLm9iajogZXhhbXBsZXNcYW5pbV9kdW1wLmMKKwkkKENDKSAkKENGTEFHUykgL0RXRUJQX0hBVkVfR0lGIC9GZCQoTElCV0VCUF9QREJOQU1FKSBcCisJICAvRm8kKERJUk9CSilcZXhhbXBsZXNcIGV4YW1wbGVzXCQoQEIpLmMKKyQoRElST0JKKVxleGFtcGxlc1xhbmltX3V0aWwub2JqOiBleGFtcGxlc1xhbmltX3V0aWwuYworCSQoQ0MpICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9HSUYgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIFwKKwkgIC9GbyQoRElST0JKKVxleGFtcGxlc1wgZXhhbXBsZXNcJChAQikuYworJChESVJPQkopXGV4YW1wbGVzXGdpZjJ3ZWJwLm9iajogZXhhbXBsZXNcZ2lmMndlYnAuYworCSQoQ0MpICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9HSUYgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIFwKKwkgIC9GbyQoRElST0JKKVxleGFtcGxlc1wgZXhhbXBsZXNcJChAQikuYworJChESVJPQkopXGV4YW1wbGVzXGdpZmRlYy5vYmo6IGV4YW1wbGVzXGdpZmRlYy5jCisJJChDQykgJChDRkxBR1MpIC9EV0VCUF9IQVZFX0dJRiAvRmQkKExJQldFQlBfUERCTkFNRSkgXAorCSAgL0ZvJChESVJPQkopXGV4YW1wbGVzXCBleGFtcGxlc1wkKEBCKS5jCisjIEJhdGNoIHJ1bGVzCit7ZXhhbXBsZXN9LmN7JChESVJPQkopXGV4YW1wbGVzfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKERJUk9CSilcZXhhbXBsZXNcIC9GbyQoRElST0JKKVxleGFtcGxlc1wgJDwKK3tleHRyYXN9LmN7JChESVJPQkopXGV4dHJhc30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChESVJPQkopXGV4dHJhc1wgL0ZvJChESVJPQkopXGV4dHJhc1wgJDwKK3tpbWFnZWlvfS5jeyQoRElST0JKKVxpbWFnZWlvfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKERJUk9CSilcaW1hZ2Vpb1wgL0ZvJChESVJPQkopXGltYWdlaW9cICQ8Cit7c3JjXGRlY30uY3skKERJUk9CSilcZGVjfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXGRlY1wgJDwKK3tzcmNcZGVtdXh9LmN7JChESVJPQkopXGRlbXV4fS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXGRlbXV4XCAkPAore3NyY1xkc3B9LmN7JChESVJPQkopXGRzcH0ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxkc3BcICQ8Cit7c3JjXGVuY30uY3skKERJUk9CSilcZW5jfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXGVuY1wgJDwKK3tzcmNcbXV4fS5jeyQoRElST0JKKVxtdXh9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcbXV4XCAkPAore3NyY1x1dGlsc30uY3skKERJUk9CSilcdXRpbHN9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcdXRpbHNcICQ8CisKK3skKERJUk9CSilcZXhhbXBsZXN9Lm9ianskKERJUkJJTil9LmV4ZToKKwkkKExOS0VYRSkgJChMREZMQUdTKSAvT1VUOiRAICQqKiBcCisJICAgIG9sZTMyLmxpYiB3aW5kb3dzY29kZWNzLmxpYiBzaGx3YXBpLmxpYgorCSQoTVQpIC1tYW5pZmVzdCAkQC5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JEA7MQorCWRlbCAkQC5tYW5pZmVzdAorCit7JChESVJPQkopXGV4dHJhc30ub2JqeyQoRElSQklOKX0uZXhlOgorCSQoTE5LRVhFKSAkKExERkxBR1MpIC9PVVQ6JEAgJCoqIFwKKwkgICAgb2xlMzIubGliIHdpbmRvd3Njb2RlY3MubGliIHNobHdhcGkubGliCisJJChNVCkgLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCisJZGVsICRALm1hbmlmZXN0CisKK2NsZWFuOjoKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLmRsbCAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLmV4cCAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLmlkYiAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLmxpYiAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLm9iaiAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLnBjaCAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLnBkYiAyPiBOVUwKKwlALWVyYXNlIC9zICQoRElST0JKKVwqLnJlcyAyPiBOVUwKKworIUVORElGICAjIEVuZCBvZiBjYXNlIHdoZXJlIGEgY29uZmlnIHdhcyBwcm92aWRlZC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL05FV1MgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ORVdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGNiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ORVdTCkBAIC0wLDAgKzEsMTk5IEBACistIDQvMi8yMDE4OiB2ZXJzaW9uIDEuMC4wCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIGxvc3N5IGVuY29kZXIgaW1wcm92ZW1lbnRzIHRvIGF2b2lkIGNocm9tYSBzaGlmdHMgaW4gdmFyaW91cyBjaXJjdW1zdGFuY2VzCisgICAgKGlzc3VlcyAjMzA4LCAjMzQwKQorICAqIGJpZy1lbmRpYW4gZml4ZXMgZm9yIGRlY29kZSwgUkdCQSBpbXBvcnQgYW5kIFdlYlBQaWN0dXJlRGlzdG9ydGlvbgorICBUb29sIHVwZGF0ZXM6CisgICAgZ2lmd2VicCwgYW5pbV9kaWZmIC0gZGVmYXVsdCBkdXJhdGlvbiBiZWhhdmlvciAoPD0gMTBtcykgY2hhbmdlZCB0byBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgIHdlYiBicm93c2VycywgdHJhbnNjb2RpbmcgdG9vbHMgKGlzc3VlICMzNzkpCisgICAgaW1nMndlYnAsIHdlYnBtdXggLSBhbGxvdyBvcHRpb25zIHRvIGJlIHBhc3NlZCBpbiB2aWEgYSBmaWxlIChpc3N1ZSAjMzU1KQorCistIDExLzI0LzIwMTc6IHZlcnNpb24gMC42LjEKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogbG9zc2xlc3MgcGVyZm9ybWFuY2UgYW5kIGNvbXByZXNzaW9uIGltcHJvdmVtZW50cyArIGEgbmV3ICdjcnVuY2hlcicgbW9kZQorICAgICgtbSA2IC1xIDEwMCkKKyAgKiBBUk0gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHdpdGggY2xhbmcgKDE1LTIwJSB3L25kayByMTVjLCBpc3N1ZSAjMzM5KQorICAqIHdlYnAtanM6IGVtc2NyaXB0ZW4vd2ViYXNzZW1ibHkgYmFzZWQgamF2YXNjcmlwdCBkZWNvZGVyCisgICogbWlzY2VsbGFuZW91cyBidWcgJiBidWlsZCBmaXhlcyAoaXNzdWUgIzMyOSwgIzMzMiwgIzM0MywgIzM1MywgIzM2MCwgIzM2MSwKKyAgICAjMzYzKQorICBUb29sIHVwZGF0ZXMgLyBhZGRpdGlvbnM6CisgICAgYWRkZWQgd2VicGluZm8gLSBwcmludHMgZmlsZSBmb3JtYXQgaW5mb3JtYXRpb24gKGlzc3VlICMzMzApCisgICAgZ2lmMndlYnAgLSBsb29wIGJlaGF2aW9yIG1vZGlmaWVkIHRvIG1hdGNoIENocm9tZSBNNjMrIChjcmJ1Zy5jb20vNjQ5MjY0KTsKKyAgICAgICAgICAgICAgICctbG9vcF9jb21wYXRpYmlsaXR5JyBjYW4gYmUgdXNlZCBmb3IgdGhlIG9sZCBiZWhhdmlvcgorCistIDEvMjYvMjAxNzogdmVyc2lvbiAwLjYuMAorICAqIGxvc3NsZXNzIHBlcmZvcm1hbmNlIGFuZCBjb21wcmVzc2lvbiBpbXByb3ZlbWVudHMKKyAgKiBtaXNjZWxsYW5lb3VzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoU1NFMiwgTkVPTiwgTVNBKQorICAqIHdlYnBtdXggZ2FpbmVkIGEgLWR1cmF0aW9uIG9wdGlvbiBhbGxvd2luZyBmb3IgZnJhbWUgdGltaW5nIG1vZGlmaWNhdGlvbgorICAqIG5ldyBpbWcyd2VicCB1dGlsaXR5IGFsbG93aW5nIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzIHRvIGJlIGNvbnZlcnRlZCB0bworICAgIGFuaW1hdGVkIHdlYnAKKyAgKiBBUEkgY2hhbmdlczoKKyAgICAtIGxpYndlYnA6CisgICAgICBXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQQorICAgICAgV2ViUFBsYW5lRGlzdG9ydGlvbgorICAgIC0gbGlid2VicG11eCAvIGdpZjJ3ZWJwOgorICAgICAgV2ViUEFuaW1FbmNvZGVyT3B0aW9uczoga21heCA8PSAwIG5vdyBkaXNhYmxlcyBrZXlmcmFtZXMsIGttYXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VzIGFsbCBrZXlmcmFtZXMuIFNlZSBtdXguaCBhbmQgdGhlIGdpZjJ3ZWJwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5wYWdlIGZvciBkZXRhaWxzLgorCistIDEyLzEzLzIwMTY6IHZlcnNpb24gMC41LjIKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgIFRoaXMgcmVsZWFzZSBjb3ZlcnMgQ1ZFLTIwMTYtODg4OCBhbmQgQ1ZFLTIwMTYtOTA4NS4KKyAgKiBmdXJ0aGVyIHNlY3VyaXR5IHJlbGF0ZWQgaGFyZGVuaW5nIGluIHRoZSB0b29sczsgZml4ZXMgdG8KKyAgICBnaWYyd2VicC9BbmltRW5jb2RlciAoaXNzdWVzICMzMTAsICMzMTQsICMzMTYsICMzMjIpLCBjd2VicC9saWJ3ZWJwIChpc3N1ZQorICAgICMzMTIpCisgICogZnVsbCBsaWJ3ZWJwIChlbmNvZGVyICYgZGVjb2RlcikgaU9TIGZyYW1ld29yazsgbGlid2VicGRlY29kZXIKKyAgICBXZWJQLmZyYW1ld29yayByZW5hbWVkIHRvIFdlYlBEZWNvZGVyLmZyYW1ld29yayAoaXNzdWUgIzMwNykKKyAgKiBDTWFrZSBzdXBwb3J0IGZvciBBbmRyb2lkIFN0dWRpbyAoMi4yKQorICAqIG1pc2NlbGxhbmVvdXMgYnVpbGQgcmVsYXRlZCBmaXhlcyAoaXNzdWUgIzMwNiwgIzMxMykKKyAgKiBtaXNjZWxsYW5lb3VzIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpc3N1ZSAjMjI1KQorICAqIG1pbm9yIGxvc3N5IGVuY29kZXIgZml4ZXMgYW5kIGltcHJvdmVtZW50cworCistIDYvMTQvMjAxNjogdmVyc2lvbiAwLjUuMQorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBtaXNjZWxsYW5lb3VzIGJ1ZyBmaXhlcyAoaXNzdWVzICMyODAsICMyODkpCisgICogcmV2ZXJ0ZWQgYWxwaGEgcGxhbmUgZW5jb2Rpbmcgd2l0aCBjb2xvciBjYWNoZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgbGlid2VicCAwLjQuMC0+MC40LjMgKGlzc3VlcyAjMjkxLCAjMjk4KQorICAqIGxvc3NsZXNzIGVuY29kaW5nIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cworICAqIG1lbW9yeSByZWR1Y3Rpb24gaW4gYm90aCBsb3NzbGVzcyBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAgKiBmb3JjZSBtdXggb3V0cHV0IHRvIGJlIGluIHRoZSBleHRlbmRlZCBmb3JtYXQgKFZQOFgpIHdoZW4gdW5kZWZpbmVkIGNodW5rcworICAgIGFyZSBwcmVzZW50IChpc3N1ZSAjMjk0KQorICAqIGdyYWRsZSwgY21ha2UgYnVpbGQgc3VwcG9ydAorICAqIHdvcmthcm91bmQgZm9yIGNvbXBpbGVyIGJ1ZyBjYXVzaW5nIDY0LWJpdCBkZWNvZGUgZmFpbHVyZXMgb24gYW5kcm9pZAorICAgIGRldmljZXMgdXNpbmcgY2xhbmctMy44IGluIHRoZSByMTFjIE5ESworICAqIHZhcmlvdXMgV2ViUEFuaW1FbmNvZGVyIGltcHJvdmVtZW50cworCistIDEyLzE3LzIwMTU6IHZlcnNpb24gMC41LjAKKyAgKiBtaXNjZWxsYW5lb3VzIGJ1ZyAmIGJ1aWxkIGZpeGVzIChpc3N1ZXMgIzIzNCwgIzI1OCwgIzI3NCwgIzI3NSwgIzI3OCkKKyAgKiBlbmNvZGVyICYgZGVjb2RlciBzcGVlZC11cHMgb24geDg2L0FSTS9NSVBTIGZvciBsb3NzeSAmIGxvc3NsZXNzCisgICAgLSBub3RlISBZVVYtPlJHQiBjb252ZXJzaW9uIHdhcyBzcGVkLXVwLCBidXQgdGhlIHJlc3VsdHMgd2lsbCBiZSBzbGlnaHRseQorICAgICAgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgcmVsZWFzZXMKKyAgKiB2YXJpb3VzIGxvc3NsZXNzIGVuY29kZXIgaW1wcm92ZW1lbnRzCisgICogZ2lmMndlYnAgaW1wcm92ZW1lbnRzLCAtbWluX3NpemUgb3B0aW9uIGFkZGVkCisgICogdG9vbHMgZnVsbHkgc3VwcG9ydCBpbnB1dCBmcm9tIHN0ZGluIGFuZCBvdXRwdXQgdG8gc3Rkb3V0IChpc3N1ZSAjMTY4KQorICAqIE5ldyBXZWJQQW5pbUVuY29kZXIgQVBJIGZvciBjcmVhdGluZyBhbmltYXRpb25zCisgICogTmV3IFdlYlBBbmltRGVjb2RlciBBUEkgZm9yIGRlY29kaW5nIGFuaW1hdGlvbnMKKyAgKiBvdGhlciBBUEkgY2hhbmdlczoKKyAgICAtIGxpYndlYnA6CisgICAgICBXZWJQUGljdHVyZVNtYXJ0QVJHQlRvWVVWQSgpICgtcHJlIDQgaW4gY3dlYnApCisgICAgICBXZWJQQ29uZmlnOjpleGFjdCAoLWV4YWN0IGluIGN3ZWJwOyAtYWxwaGFfY2xlYW51cCBpcyBub3cgdGhlIGRlZmF1bHQpCisgICAgICBXZWJQQ29uZmlnOjpuZWFyX2xvc3NsZXNzICgtbmVhcl9sb3NzbGVzcyBpbiBjd2VicCkKKyAgICAgIFdlYlBGcmVlKCkgKGZyZWUnaW5nIHdlYnAgYWxsb2NhdGVkIG1lbW9yeSBpbiBvdGhlciBsYW5ndWFnZXMpCisgICAgICBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoKQorICAgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCkKKyAgICAtIGxpYndlYnBkZW11eDogcmVtb3ZlZCBleHBlcmltZW50YWwgZnJhZ21lbnQgcmVsYXRlZCBmaWVsZHMgYW5kIGZ1bmN0aW9ucworICAgIC0gbGlid2VicG11eDogV2ViUE11eFNldENhbnZhc1NpemUoKQorICAqIG5ldyBsaWJ3ZWJwZXh0cmFzIGxpYnJhcnkgd2l0aCBzb21lIHVuY29tbW9uIGltcG9ydCBmdW5jdGlvbnM6CisgICAgV2ViUEltcG9ydEdyYXkvV2ViUEltcG9ydFJHQjU2NS9XZWJQSW1wb3J0UkdCNDQ0NAorCistIDEwLzE1LzE1OiB2ZXJzaW9uIDAuNC40CisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIHJlc2NhbGluZyBvdXQtb2YtYm91bmRzIHJlYWQgZml4IChpc3N1ZSAjMjU0KQorICAqIHZhcmlvdXMgYnVpbGQgZml4ZXMgYW5kIGltcHJvdmVtZW50cyAoaXNzdWVzICMyNTMsICMyNTksICMyNjIsICMyNjcsICMyNjgpCisgICogY29udGFpbmVyIGRvY3VtZW50YXRpb24gdXBkYXRlCisgICogZ2lmMndlYnAgdHJhbnNwYXJlbmN5IGZpeCAoaXNzdWUgIzI0NSkKKworLSAzLzMvMTU6IHZlcnNpb24gMC40LjMKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogQW5kcm9pZCAvIGdjYyAvIGlPUyAvIE1TVlMgYnVpbGQgZml4ZXMgYW5kIGltcHJvdmVtZW50cworICAqIGxvc3NsZXNzIGRlY29kZSBmaXggKGlzc3VlICMyMzkgLS0gc2luY2UgMC40LjApCisgICogZG9jdW1lbnRhdGlvbiAvIHZ3ZWJwIHVwZGF0ZXMgZm9yIGFuaW1hdGlvbgorICAqIG11bHRpLXRocmVhZGluZyBmaXggKGlzc3VlICMyMzQpCisKKy0gMTAvMTMvMTQ6IHZlcnNpb24gMC40LjIKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogQW5kcm9pZCAvIGdjYyBidWlsZCBmaXhlcworICAqIChXaW5kb3dzKSBmaXggcmVhZGluZyBmcm9tIHN0ZGluIGFuZCB3cml0aW5nIHRvIHN0ZG91dAorICAqIGdpZjJ3ZWJwOiBtaXNjZWxsYW5lb3VzIGZpeGVzCisgICogZml4ICdhbHBoYS1sZWFrJyB3aXRoIGxvc3N5IGNvbXByZXNzaW9uIChpc3N1ZSAjMjIwKQorICAqIHRoZSBsb3NzbGVzcyBiaXRzdHJlYW0gc3BlYyBoYXMgYmVlbiBhbWVuZGVkIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgY29kZQorCistIDcvMjQvMTQ6IHZlcnNpb24gMC40LjEKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogQUFyY2g2NCAoYXJtNjQpICYgTUlQUyBzdXBwb3J0L29wdGltaXphdGlvbnMKKyAgKiBORU9OIGFzc2VtYmx5IGFkZGl0aW9uczoKKyAgICAtIH4yNSUgZmFzdGVyIGxvc3N5IGRlY29kZSAvIGVuY29kZSAoLW0gNCkKKyAgICAtIH4xMCUgZmFzdGVyIGxvc3NsZXNzIGRlY29kZQorICAgIC0gfjUtMTAlIGZhc3RlciBsb3NzbGVzcyBlbmNvZGUgKC1tIDMvNCkKKyAgKiBkd2VicC92d2VicCBjYW4gcmVhZCBmcm9tIHN0ZGluCisgICogY3dlYnAvZ2lmMndlYnAgY2FuIHdyaXRlIHRvIHN0ZG91dAorICAqIGN3ZWJwIGNhbiByZWFkIHdlYnAgZmlsZXM7IHVzZWZ1bCBpZiBzdG9yaW5nIHNvdXJjZXMgYXMgd2VicCBsb3NzbGVzcworCistIDEyLzE5LzEzOiB2ZXJzaW9uIDAuNC4wCisgICogaW1wcm92ZWQgZ2lmMndlYnAgdG9vbAorICAqIG51bWVyb3VzIGZpeGVzLCBjb21wcmVzc2lvbiBpbXByb3ZlbWVudCBhbmQgc3BlZWQtdXAKKyAgKiBkaXRoZXIgb3B0aW9uIGFkZGVkIHRvIGRlY29kZXIgKGR3ZWJwIC1kaXRoZXIgNTAgLi4uKQorICAqIGltcHJvdmVkIG11bHRpLXRocmVhZGVkIG1vZGVzICgtbXQgb3B0aW9uKQorICAqIGltcHJvdmVkIGZpbHRlcmluZyBzdHJlbmd0aCBkZXRlcm1pbmF0aW9uCisgICogTmV3IGZ1bmN0aW9uOiBXZWJQTXV4R2V0Q2FudmFzU2l6ZQorICAqIEJNUCBhbmQgVElGRiBmb3JtYXQgb3V0cHV0IGFkZGVkIHRvICdkd2VicCcKKyAgKiBTaWduaWZpY2FudCBtZW1vcnkgcmVkdWN0aW9uIGZvciBkZWNvZGluZyBsb3NzeSBpbWFnZXMgd2l0aCBhbHBoYS4KKyAgKiBJbnRlcnR3aW5lZCBkZWNvZGluZyBvZiBSR0IgYW5kIGFscGhhIGZvciBhIHNob3J0ZXIKKyAgICB0aW1lLXRvLWZpcnN0LWRlY29kZWQtcGl4ZWwuCisgICogV2ViUEl0ZXJhdG9yIGhhcyBhIG5ldyBtZW1iZXIgJ2hhc19hbHBoYScgZGVub3Rpbmcgd2hldGhlciB0aGUgZnJhbWUKKyAgICBjb250YWlucyB0cmFuc3BhcmVuY3kuCisgICogQ29udGFpbmVyIHNwZWMgYW1lbmRlZCB3aXRoIG5ldyAnYmxlbmRpbmcgbWV0aG9kJyBmb3IgYW5pbWF0aW9uLgorCistIDYvMTMvMTM6IHZlcnNpb24gMC4zLjEKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogQWRkIGluY3JlbWVudGFsIGRlY29kaW5nIHN1cHBvcnQgZm9yIGltYWdlcyBjb250YWluaW5nIEFMUEggYW5kIElDQ1AgY2h1bmtzLgorICAqIFB5dGhvbiBiaW5kaW5ncyB2aWEgc3dpZyBmb3IgdGhlIHNpbXBsZSBlbmNvZGUvZGVjb2RlIGludGVyZmFjZXMgc2ltaWxhciB0bworICAgIEphdmEuCisKKy0gMy8yMC8xMzogdmVyc2lvbiAwLjMuMAorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBXZWJQSU5ld1JHQi9XZWJQSU5ld1lVVkEgYWNjZXB0IGJlaW5nIHBhc3NlZCBhIE5VTEwgb3V0cHV0IGJ1ZmZlcgorICAgIGFuZCB3aWxsIHBlcmZvcm0gYXV0by1hbGxvY2F0aW9uLgorICAqIGRlZmF1bHQgZmlsdGVyIG9wdGlvbiBpcyBub3cgJy1zdHJvbmcgLWYgNjAnCisgICogZW5jb2Rpbmcgc3BlZWQtdXAgZm9yIGxvc3N5IG1ldGhvZHMgMyB0byA2CisgICogYWxwaGEgZW5jb2RpbmcgY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwgdG8gbG9zc3kgdXNpbmcgJ2N3ZWJwIC1tdCAuLi4nCisgICogY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEgKFhNUC9FWElGKSBhbmQgYW5pbWF0aW9uIHN1cHBvcnQgZmluYWxpemVkIGluIHRoZQorICAgIGNvbnRhaW5lci4KKyAgKiB2YXJpb3VzIE5FT04gYXNzZW1ibHkgYWRkaXRpb25zCisgIFRvb2wgdXBkYXRlcyAvIGFkZGl0aW9uczoKKyAgICAqIGdpZjJ3ZWJwIGFkZGVkCisgICAgKiB2d2VicCBnaXZlbiBjb2xvciBwcm9maWxlICYgYW5pbWF0aW9uIHN1cHBvcnQKKyAgICAqIGN3ZWJwIGNhbiBwcmVzZXJ2ZSBjb2xvciBwcm9maWxlIC8gbWV0YWRhdGEgd2l0aCAnLW1ldGFkYXRhJworCistIDEwLzMwLzEyOiB2ZXJzaW9uIDAuMi4xCisgICogVmFyaW91cyBzZWN1cml0eSByZWxhdGVkIGZpeGVzCisgICogY3dlYnAuZXhlOiBmaXggaW1wb3J0IGVycm9ycyBvbiBXaW5kb3dzIFhQCisgICogZW5hYmxlIERMTCBidWlsZHMgZm9yIG1pbmd3IHRhcmdldHMKKworLSA4LzMvMTI6IHZlcnNpb24gMC4yLjAKKyAgKiBBZGQgc3VwcG9ydCBmb3IgQVJHQiAtPiBZVVZBIGNvbnZlcnNpb24gZm9yIGxvc3NsZXNzIGRlY29kZXIKKyAgICBOZXcgZnVuY3Rpb25zOiBXZWJQSU5ld1lVVkEsIFdlYlBJRGVjR2V0WVVWQQorICAqIEFkZCBzdGF0cyBmb3IgbG9zc2xlc3MgYW5kIGFscGhhIGVuY29kaW5nCisgICogU2VjdXJpdHkgcmVsYXRlZCBoYXJkZW5pbmc6IGFsbG9jYXRpb24gYW5kIHNpemUgY2hlY2tzCisgICogQWRkIFBBTSBvdXRwdXQgc3VwcG9ydCB0byBkd2VicAorCistIDcvMTkvMTI6IHZlcnNpb24gMC4xLjk5CisgICogVGhpcyBpcyBhIHByZS1yZWxlYXNlIG9mIDAuMi4wLCBub3QgYW4gcmMgdG8gYWxsb3cgZm9yIGZ1cnRoZXIKKyAgICBpbmNvbXBhdGlibGUgY2hhbmdlcyBiYXNlZCBvbiB1c2VyIGZlZWRiYWNrLgorICAqIEFscGhhIGNoYW5uZWwgZW5jb2RlL2RlY29kZSBzdXBwb3J0LgorICAqIExvc3NsZXNzIGVuY29kZXIvZGVjb2Rlci4KKyAgKiBBZGQgVElGRiBpbnB1dCBzdXBwb3J0IHRvIGN3ZWJwLgorICBJbmNvbXBhdGlibGUgY2hhbmdlczoKKyAgICAqIFRoZSBlbmNvZGUgQUJJIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgYWxwaGEgZW5jb2RpbmcuCisgICAgKiBEZXByZWNhdGVkIGZ1bmN0aW9uIFdlYlBJTmV3KCkgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAqIERlY29kZSBmdW5jdGlvbiBzaWduYXR1cmVzIGhhdmUgY2hhbmdlZCB0byBjb25zaXN0ZW50bHkgdXNlIHNpemVfdCBvdmVyCisgICAgICBpbnQvdWludDMyX3QuCisgICAgKiBkZWNvZGVfdnA4LmggaXMgbm8gbG9uZ2VyIGluc3RhbGxlZCBzeXN0ZW0td2lkZS4KKyAgICAqIGN3ZWJwIHdpbGwgZW5jb2RlIHRoZSBhbHBoYSBjaGFubmVsIGlmIHByZXNlbnQuCisKKy0gOS8xOS8xMTogdmVyc2lvbiAwLjEuMworICAqIEFkdmFuY2VkIGRlY29kaW5nIEFQSXMuCisgICogT24tdGhlLWZseSBjcm9wcGluZyBhbmQgcmVzY2FsaW5nIG9mIGltYWdlcy4KKyAgKiBTU0UyIGluc3RydWN0aW9ucyBmb3IgZGVjb2RpbmcgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBvbiB4ODYgYmFzZWQKKyAgICBwbGF0Zm9ybXMuCisgICogU3VwcG9ydCBNdWx0aS10aHJlYWRlZCBkZWNvZGluZy4KKyAgKiA0MCUgaW1wcm92ZW1lbnQgaW4gRGVjb2RpbmcgcGVyZm9ybWFuY2UuCisgICogQWRkIHN1cHBvcnQgZm9yIFJHQjU2NSwgUkdCQTQ0NDQgJiBBUkdCIGltYWdlIGNvbG9yc3BhY2UuCisgICogQmV0dGVyIGhhbmRsaW5nIG9mIGxhcmdlIHBpY3R1cmUgZW5jb2RpbmcuCisKKy0gMy8yNS8xMTogdmVyc2lvbiAwLjEuMgorICAqIEluY3JlbWVudGFsIGRlY29kaW5nOiBwaWN0dXJlIGNhbiBiZSBkZWNvZGVkIGJ5dGUtYnktYnl0ZSBpZiBuZWVkcyBiZS4KKyAgKiBsb3Qgb2YgYnVnLWZpeGVzLCBjb25zb2xpZGF0aW9uIGFuZCBzdGFiaWxpemF0aW9uCisKKy0gMi8yMy8xMTogaW5pdGlhbCByZWxlYXNlIG9mIHZlcnNpb24gMC4xLCB3aXRoIHRoZSBuZXcgZW5jb2RlcgorLSA5LzMwLzEwOiBpbml0aWFsIHJlbGVhc2UgdmVyc2lvbiB3aXRoIG9ubHkgdGhlIGxpZ2h0d2VpZ2h0IGRlY29kZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1BBVEVOVFMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9QQVRFTlRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWRmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9QQVRFTlRTCkBAIC0wLDAgKzEsMjMgQEAKK0FkZGl0aW9uYWwgSVAgUmlnaHRzIEdyYW50IChQYXRlbnRzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyJUaGVzZSBpbXBsZW1lbnRhdGlvbnMiIG1lYW5zIHRoZSBjb3B5cmlnaHRhYmxlIHdvcmtzIHRoYXQgaW1wbGVtZW50IHRoZSBXZWJNCitjb2RlY3MgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIFdlYk0gUHJvamVjdC4KKworR29vZ2xlIGhlcmVieSBncmFudHMgdG8geW91IGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKK3JveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0bworbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgdHJhbnNmZXIsIGFuZCBvdGhlcndpc2UKK3J1biwgbW9kaWZ5IGFuZCBwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNLCB3aGVyZQorc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zLCBib3RoIGN1cnJlbnRseSBvd25lZCBieQorR29vZ2xlIGFuZCBhY3F1aXJlZCBpbiB0aGUgZnV0dXJlLCBsaWNlbnNhYmxlIGJ5IEdvb2dsZSB0aGF0IGFyZSBuZWNlc3NhcmlseQoraW5mcmluZ2VkIGJ5IHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNLiBUaGlzIGdyYW50IGRvZXMgbm90IGluY2x1ZGUgY2xhaW1zCit0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlc2UKK2ltcGxlbWVudGF0aW9ucy4gSWYgeW91IG9yIHlvdXIgYWdlbnQgb3IgZXhjbHVzaXZlIGxpY2Vuc2VlIGluc3RpdHV0ZSBvciBvcmRlcgorb3IgYWdyZWUgdG8gdGhlIGluc3RpdHV0aW9uIG9mIHBhdGVudCBsaXRpZ2F0aW9uIG9yIGFueSBvdGhlciBwYXRlbnQKK2VuZm9yY2VtZW50IGFjdGl2aXR5IGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IKK2NvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgYW55IG9mIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNCitvciBhbnkgY29kZSBpbmNvcnBvcmF0ZWQgd2l0aGluIGFueSBvZiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTQorY29uc3RpdHV0ZSBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIG9yIGluZHVjZW1lbnQgb2YKK3BhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCByaWdodHMgZ3JhbnRlZCB0byB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlCitmb3IgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0gc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2YjM3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRQpAQCAtMCwwICsxLDc4MiBAQAorICAgICAgICAgIF9fICAgX18gIF9fX18gIF9fX18gIF9fX18KKyAgICAgICAgIC8gIFxcLyAgXC8gIF8gXC8gIF8gKS8gIF8gXAorICAgICAgICAgXCAgICAgICAvICAgX18vICBfICBcICAgX18vCisgICAgICAgICAgXF9fXF9fL1xfX19fL1xfX19fXy9fXy8gX19fXyAgX19fCisgICAgICAgICAgICAgICAgLyBfLyAvICAgIFwgICAgXCAvICBfIFwvIF8vCisgICAgICAgICAgICAgICAvICBcXy8gICAvIC8gICBcIFwgICBfXy8gIFxfXworICAgICAgICAgICAgICAgXF9fX18vX19fXy9cX19fX18vX19fX18vX19fXy92MS4wLjAKKworRGVzY3JpcHRpb246Cis9PT09PT09PT09PT0KKworV2ViUCBjb2RlYzogbGlicmFyeSB0byBlbmNvZGUgYW5kIGRlY29kZSBpbWFnZXMgaW4gV2ViUCBmb3JtYXQuIFRoaXMgcGFja2FnZQorY29udGFpbnMgdGhlIGxpYnJhcnkgdGhhdCBjYW4gYmUgdXNlZCBpbiBvdGhlciBwcm9ncmFtcyB0byBhZGQgV2ViUCBzdXBwb3J0LAorYXMgd2VsbCBhcyB0aGUgY29tbWFuZCBsaW5lIHRvb2xzICdjd2VicCcgYW5kICdkd2VicCcuCisKK1NlZSBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAKKworVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKworSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgV2ViTSBwcm9qZWN0LgorU2VlIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2xpY2Vuc2Uvc29mdHdhcmUvIG9yIHRoZQorIkNPUFlJTkciIGZpbGUgZm9yIGRldGFpbHMuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlIFBBVEVOVFMuCisKK0J1aWxkaW5nOgorPT09PT09PT09CisKK1dpbmRvd3MgYnVpbGQ6CistLS0tLS0tLS0tLS0tLQorCitCeSBydW5uaW5nOgorCisgIG5tYWtlIC9mIE1ha2VmaWxlLnZjIENGRz1yZWxlYXNlLXN0YXRpYyBSVExJQkNGRz1zdGF0aWMgT0JKRElSPW91dHB1dAorCit0aGUgZGlyZWN0b3J5IG91dHB1dFxyZWxlYXNlLXN0YXRpY1woeDY0fHg4NilcYmluIHdpbGwgY29udGFpbiB0aGUgdG9vbHMKK2N3ZWJwLmV4ZSBhbmQgZHdlYnAuZXhlLiBUaGUgZGlyZWN0b3J5IG91dHB1dFxyZWxlYXNlLXN0YXRpY1woeDY0fHg4NilcbGliIHdpbGwKK2NvbnRhaW4gdGhlIGxpYndlYnAgc3RhdGljIGxpYnJhcnkuCitUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoeDg2L3g2NCkgaXMgZGV0ZWN0ZWQgYnkgTWFrZWZpbGUudmMgZnJvbSB0aGUgVmlzdWFsCitTdHVkaW8gY29tcGlsZXIgKGNsLmV4ZSkgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gcGF0aC4KKworVW5peCBidWlsZCB1c2luZyBtYWtlZmlsZS51bml4OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbiBwbGF0Zm9ybXMgd2l0aCBHTlUgdG9vbHMgaW5zdGFsbGVkIChnY2MgYW5kIG1ha2UpLCBydW5uaW5nCisKKyAgbWFrZSAtZiBtYWtlZmlsZS51bml4CisKK3dpbGwgYnVpbGQgdGhlIGJpbmFyaWVzIGV4YW1wbGVzL2N3ZWJwIGFuZCBleGFtcGxlcy9kd2VicCwgYWxvbmcKK3dpdGggdGhlIHN0YXRpYyBsaWJyYXJ5IHNyYy9saWJ3ZWJwLmEuIE5vIHN5c3RlbS13aWRlIGluc3RhbGxhdGlvbgoraXMgc3VwcGxpZWQsIGFzIHRoaXMgaXMgYSBzaW1wbGUgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgaW5zdGFsbGF0aW9uCitzeXN0ZW0gYmFzZWQgb24gdGhlIGF1dG9jb25mIHRvb2xzIChzZWUgYmVsb3cpLgorUGxlYXNlIHJlZmVyIHRvIG1ha2VmaWxlLnVuaXggZm9yIGFkZGl0aW9uYWwgZGV0YWlscyBhbmQgY3VzdG9taXphdGlvbnMuCisKK1VzaW5nIGF1dG9jb25mIHRvb2xzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQcmVyZXF1aXNpdGVzOgorQSBjb21waWxlciAoZS5nLiwgZ2NjKSwgbWFrZSwgYXV0b2NvbmYsIGF1dG9tYWtlLCBsaWJ0b29sLgorT24gYSBEZWJpYW4tbGlrZSBzeXN0ZW0gdGhlIGZvbGxvd2luZyBzaG91bGQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdSBuZWVkIGZvciBhCittaW5pbWFsIGJ1aWxkOgorJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBnY2MgbWFrZSBhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sCisKK1doZW4gYnVpbGRpbmcgZnJvbSBnaXQgc291cmNlcywgeW91IHdpbGwgbmVlZCB0byBydW4gYXV0b2dlbi5zaCB0byBnZW5lcmF0ZSB0aGUKK2NvbmZpZ3VyZSBzY3JpcHQuCisKKy4vY29uZmlndXJlCittYWtlCittYWtlIGluc3RhbGwKKworc2hvdWxkIGJlIGFsbCB5b3UgbmVlZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZmlsZXMKKworL3Vzci9sb2NhbC9pbmNsdWRlL3dlYnAvZGVjb2RlLmgKKy91c3IvbG9jYWwvaW5jbHVkZS93ZWJwL2VuY29kZS5oCisvdXNyL2xvY2FsL2luY2x1ZGUvd2VicC90eXBlcy5oCisvdXNyL2xvY2FsL2xpYi9saWJ3ZWJwLioKKy91c3IvbG9jYWwvYmluL2N3ZWJwCisvdXNyL2xvY2FsL2Jpbi9kd2VicAorCitpbnN0YWxsZWQuCisKK05vdGU6IEEgZGVjb2RlLW9ubHkgbGlicmFyeSwgbGlid2VicGRlY29kZXIsIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUKKyctLWVuYWJsZS1saWJ3ZWJwZGVjb2RlcicgZmxhZy4gVGhlIGVuY29kZSBsaWJyYXJ5IGlzIGJ1aWx0IHNlcGFyYXRlbHkgYW5kIGNhbgorYmUgaW5zdGFsbGVkIGluZGVwZW5kZW50bHkgdXNpbmcgYSBtaW5vciBtb2RpZmljYXRpb24gaW4gdGhlIGNvcnJlc3BvbmRpbmcKK01ha2VmaWxlLmFtIGNvbmZpZ3VyZSBmaWxlcyAoc2VlIGNvbW1lbnRzIHRoZXJlKS4gU2VlICcuL2NvbmZpZ3VyZSAtLWhlbHAnIGZvcgorbW9yZSBvcHRpb25zLgorCitCdWlsZGluZyBmb3IgTUlQUyBMaW51eDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUlQUyBMaW51eCB0b29sY2hhaW4gc3RhYmxlIGF2YWlsYWJsZSByZWxlYXNlcyBjYW4gYmUgZm91bmQgYXQ6CitodHRwczovL2NvbW11bml0eS5pbWd0ZWMuY29tL2RldmVsb3BlcnMvbWlwcy90b29scy9jb2Rlc2NhcGUtbWlwcy1zZGsvYXZhaWxhYmxlLXJlbGVhc2VzLworCisjIEFkZCB0b29sY2hhaW4gdG8gUEFUSAorZXhwb3J0IFBBVEg9JFBBVEg6L3BhdGgvdG8vdG9vbGNoYWluL2JpbgorCisjIDMyLWJpdCBidWlsZCBmb3IgbWlwczMycjUgKHA1NjAwKQorSE9TVD1taXBzLW10aS1saW51eC1nbnUKK01JUFNfQ0ZMQUdTPSItTzMgLW1pcHMzMnI1IC1tYWJpPTMyIC1tdHVuZT1wNTYwMCAtbW1zYSAtbWZwNjQgXAorICAtbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMgLWZQSUUiCitNSVBTX0xERkxBR1M9Ii1taXBzMzJyNSAtbWFiaT0zMiAtbW1zYSAtbWZwNjQgLXBpZSIKKworIyA2NC1iaXQgYnVpbGQgZm9yIG1pcHM2NHI2IChpNjQwMCkKK0hPU1Q9bWlwcy1pbWctbGludXgtZ251CitNSVBTX0NGTEFHUz0iLU8zIC1taXBzNjRyNiAtbWFiaT02NCAtbXR1bmU9aTY0MDAgLW1tc2EgLW1mcDY0IFwKKyAgLW1zY2hlZC13ZWlnaHQgLW1sb2FkLXN0b3JlLXBhaXJzIC1mUElFIgorTUlQU19MREZMQUdTPSItbWlwczY0cjYgLW1hYmk9NjQgLW1tc2EgLW1mcDY0IC1waWUiCisKKy4vY29uZmlndXJlIC0taG9zdD0ke0hPU1R9IC0tYnVpbGQ9YGNvbmZpZy5ndWVzc2AgXAorICBDQz0iJHtIT1NUfS1nY2MgLUVMIiBcCisgIENGTEFHUz0iJE1JUFNfQ0ZMQUdTIiBcCisgIExERkxBR1M9IiRNSVBTX0xERkxBR1MiCittYWtlCittYWtlIGluc3RhbGwKKworQ01ha2U6CistLS0tLS0KK1dpdGggQ01ha2UsIHlvdSBjYW4gY29tcGlsZSBsaWJ3ZWJwLCBjd2VicCwgZHdlYnAsIGdpZjJ3ZWIsIGltZzJ3ZWJwLCB3ZWJwaW5mbworYW5kIHRoZSBKUyBiaW5kaW5ncy4KKworUHJlcmVxdWlzaXRlczoKK0EgY29tcGlsZXIgKGUuZy4sIGdjYyB3aXRoIGF1dG90b29scykgYW5kIENNYWtlLgorT24gYSBEZWJpYW4tbGlrZSBzeXN0ZW0gdGhlIGZvbGxvd2luZyBzaG91bGQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdSBuZWVkIGZvciBhCittaW5pbWFsIGJ1aWxkOgorJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBidWlsZC1lc3NlbnRpYWwgY21ha2UKKworV2hlbiBidWlsZGluZyBmcm9tIGdpdCBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBjbWFrZSB0byBnZW5lcmF0ZSB0aGUKK21ha2VmaWxlcy4KKworbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQgJiYgY21ha2UgLi4vCittYWtlCittYWtlIGluc3RhbGwKKworSWYgeW91IGFsc28gd2FudCBhbnkgb2YgdGhlIGV4ZWN1dGFibGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGVuYWJsZSB0aGVtIHRocm91Z2gKK0NNYWtlLCBlLmcuOgorCitjbWFrZSAtRFdFQlBfQlVJTERfQ1dFQlA9T04gLURXRUJQX0JVSUxEX0RXRUJQPU9OIC4uLworCitvciB0aHJvdWdoIHlvdXIgZmF2b3JpdGUgaW50ZXJmYWNlIChsaWtlIGNjbWFrZSBvciBjbWFrZS1xdC1ndWkpLgorCitGaW5hbGx5LCBvbmNlIGluc3RhbGxlZCwgeW91IGNhbiBhbHNvIHVzZSBXZWJQIGluIHlvdXIgQ01ha2UgcHJvamVjdCBieSBkb2luZzoKKworZmluZF9wYWNrYWdlKFdlYlApCisKK3doaWNoIHdpbGwgZGVmaW5lIHRoZSBDTWFrZSB2YXJpYWJsZXMgV2ViUF9JTkNMVURFX0RJUlMgYW5kIFdlYlBfTElCUkFSSUVTLgorCitHcmFkbGU6CistLS0tLS0tCitUaGUgc3VwcG9ydCBmb3IgR3JhZGxlIGlzIG1pbmltYWw6IGl0IG9ubHkgaGVscHMgeW91IGNvbXBpbGUgbGlid2VicCwgY3dlYnAgYW5kCitkd2VicCBhbmQgd2VicG11eF9leGFtcGxlLgorCitQcmVyZXF1aXNpdGVzOgorQSBjb21waWxlciAoZS5nLiwgZ2NjIHdpdGggYXV0b3Rvb2xzKSBhbmQgZ3JhZGxlLgorT24gYSBEZWJpYW4tbGlrZSBzeXN0ZW0gdGhlIGZvbGxvd2luZyBzaG91bGQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdSBuZWVkIGZvciBhCittaW5pbWFsIGJ1aWxkOgorJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBidWlsZC1lc3NlbnRpYWwgZ3JhZGxlCisKK1doZW4gYnVpbGRpbmcgZnJvbSBnaXQgc291cmNlcywgeW91IHdpbGwgbmVlZCB0byBydW4gdGhlIEdyYWRsZSB3cmFwcGVyIHdpdGggdGhlCithcHByb3ByaWF0ZSB0YXJnZXQsIGUuZy4gOgorCisuL2dyYWRsZXcgYnVpbGRBbGxFeGVjdXRhYmxlcworCitTV0lHIGJpbmRpbmdzOgorLS0tLS0tLS0tLS0tLS0KKworVG8gZ2VuZXJhdGUgbGFuZ3VhZ2UgYmluZGluZ3MgZnJvbSBzd2lnL2xpYndlYnAuc3dpZyBhdCBsZWFzdCBzd2lnLTEuMworKGh0dHA6Ly93d3cuc3dpZy5vcmcpIGlzIHJlcXVpcmVkLgorCitDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG1hcHBlZDoKK0RlY29kZToKKyAgV2ViUEdldERlY29kZXJWZXJzaW9uCisgIFdlYlBHZXRJbmZvCisgIFdlYlBEZWNvZGVSR0JBCisgIFdlYlBEZWNvZGVBUkdCCisgIFdlYlBEZWNvZGVCR1JBCisgIFdlYlBEZWNvZGVCR1IKKyAgV2ViUERlY29kZVJHQgorCitFbmNvZGU6CisgIFdlYlBHZXRFbmNvZGVyVmVyc2lvbgorICBXZWJQRW5jb2RlUkdCQQorICBXZWJQRW5jb2RlQkdSQQorICBXZWJQRW5jb2RlUkdCCisgIFdlYlBFbmNvZGVCR1IKKyAgV2ViUEVuY29kZUxvc3NsZXNzUkdCQQorICBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBCisgIFdlYlBFbmNvZGVMb3NzbGVzc1JHQgorICBXZWJQRW5jb2RlTG9zc2xlc3NCR1IKKworU2VlIHN3aWcvUkVBRE1FIGZvciBtb3JlIGRldGFpbGVkIGJ1aWxkIGluc3RydWN0aW9ucy4KKworSmF2YSBiaW5kaW5nczoKKworVG8gYnVpbGQgdGhlIHN3aWctZ2VuZXJhdGVkIEpOSSB3cmFwcGVyIGNvZGUgYXQgbGVhc3QgSkRLLTEuNSAob3IgZXF1aXZhbGVudCkKK2lzIG5lY2Vzc2FyeSBmb3IgZW51bSBzdXBwb3J0LiBUaGUgb3V0cHV0IGlzIGludGVuZGVkIHRvIGJlIGEgc2hhcmVkIG9iamVjdCAvCitETEwgdGhhdCBjYW4gYmUgbG9hZGVkIHZpYSBTeXN0ZW0ubG9hZExpYnJhcnkoIndlYnBfam5pIikuCisKK1B5dGhvbiBiaW5kaW5nczoKKworVG8gYnVpbGQgdGhlIHN3aWctZ2VuZXJhdGVkIFB5dGhvbiBleHRlbnNpb24gY29kZSBhdCBsZWFzdCBQeXRob24gMi42IGlzCityZXF1aXJlZC4gUHl0aG9uIDwgMi42IG1heSBidWlsZCB3aXRoIHNvbWUgbWlub3IgY2hhbmdlcyB0byBsaWJ3ZWJwLnN3aWcgb3IgdGhlCitnZW5lcmF0ZWQgY29kZSwgYnV0IGlzIHVudGVzdGVkLgorCitFbmNvZGluZyB0b29sOgorPT09PT09PT09PT09PT0KKworVGhlIGV4YW1wbGVzLyBkaXJlY3RvcnkgY29udGFpbnMgdG9vbHMgZm9yIGVuY29kaW5nIChjd2VicCkgYW5kCitkZWNvZGluZyAoZHdlYnApIGltYWdlcy4KKworVGhlIGVhc2llc3QgdXNlIHNob3VsZCBsb29rIGxpa2U6CisgIGN3ZWJwIGlucHV0LnBuZyAtcSA4MCAtbyBvdXRwdXQud2VicAord2hpY2ggd2lsbCBjb252ZXJ0IHRoZSBpbnB1dCBmaWxlIHRvIGEgV2ViUCBmaWxlIHVzaW5nIGEgcXVhbGl0eSBmYWN0b3Igb2YgODAKK29uIGEgMC0+MTAwIHNjYWxlICgwIGJlaW5nIHRoZSBsb3dlc3QgcXVhbGl0eSwgMTAwIGJlaW5nIHRoZSBiZXN0LiBEZWZhdWx0Cit2YWx1ZSBpcyA3NSkuCitZb3UgbWlnaHQgd2FudCB0byB0cnkgdGhlIC1sb3NzbGVzcyBmbGFnIHRvbywgd2hpY2ggd2lsbCBjb21wcmVzcyB0aGUgc291cmNlCisoaW4gUkdCQSBmb3JtYXQpIHdpdGhvdXQgYW55IGxvc3MuIFRoZSAtcSBxdWFsaXR5IHBhcmFtZXRlciB3aWxsIGluIHRoaXMgY2FzZQorY29udHJvbCB0aGUgYW1vdW50IG9mIHByb2Nlc3NpbmcgdGltZSBzcGVudCB0cnlpbmcgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgYXMKK3NtYWxsIGFzIHBvc3NpYmxlLgorCitBIGxvbmdlciBsaXN0IG9mIG9wdGlvbnMgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSAtbG9uZ2hlbHAgY29tbWFuZCBsaW5lIGZsYWc6CisKKz4gY3dlYnAgLWxvbmdoZWxwCitVc2FnZToKKyBjd2VicCBbLXByZXNldCA8Li4uPl0gW29wdGlvbnNdIGluX2ZpbGUgWy1vIG91dF9maWxlXQorCitJZiBpbnB1dCBzaXplICgtcykgZm9yIGFuIGltYWdlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzCithc3N1bWVkIHRvIGJlIGEgUE5HLCBKUEVHLCBUSUZGIG9yIFdlYlAgZmlsZS4KKworT3B0aW9uczoKKyAgLWggLyAtaGVscCAuLi4uLi4uLi4uLi4uIHNob3J0IGhlbHAKKyAgLUggLyAtbG9uZ2hlbHAgLi4uLi4uLi4uIGxvbmcgaGVscAorICAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uLi4gcXVhbGl0eSBmYWN0b3IgKDA6c21hbGwuLjEwMDpiaWcpLCBkZWZhdWx0PTc1CisgIC1hbHBoYV9xIDxpbnQ+IC4uLi4uLi4uLiB0cmFuc3BhcmVuY3ktY29tcHJlc3Npb24gcXVhbGl0eSAoMC4uMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MTAwCisgIC1wcmVzZXQgPHN0cmluZz4gLi4uLi4uLiBwcmVzZXQgc2V0dGluZywgb25lIG9mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIHBob3RvLCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdpbmcsIGljb24sIHRleHQKKyAgICAgLXByZXNldCBtdXN0IGNvbWUgZmlyc3QsIGFzIGl0IG92ZXJ3cml0ZXMgb3RoZXIgcGFyYW1ldGVycworICAteiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gYWN0aXZhdGVzIGxvc3NsZXNzIHByZXNldCB3aXRoIGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBpbiBbMDpmYXN0LCAuLi4sIDk6c2xvd2VzdF0KKworICAtbSA8aW50PiAuLi4uLi4uLi4uLi4uLi4gY29tcHJlc3Npb24gbWV0aG9kICgwPWZhc3QsIDY9c2xvd2VzdCksIGRlZmF1bHQ9NAorICAtc2VnbWVudHMgPGludD4gLi4uLi4uLi4gbnVtYmVyIG9mIHNlZ21lbnRzIHRvIHVzZSAoMS4uNCksIGRlZmF1bHQ9NAorICAtc2l6ZSA8aW50PiAuLi4uLi4uLi4uLi4gdGFyZ2V0IHNpemUgKGluIGJ5dGVzKQorICAtcHNuciA8ZmxvYXQ+IC4uLi4uLi4uLi4gdGFyZ2V0IFBTTlIgKGluIGRCLiB0eXBpY2FsbHk6IDQyKQorCisgIC1zIDxpbnQ+IDxpbnQ+IC4uLi4uLi4uLiBpbnB1dCBzaXplICh3aWR0aCB4IGhlaWdodCkgZm9yIFlVVgorICAtc25zIDxpbnQ+IC4uLi4uLi4uLi4uLi4gc3BhdGlhbCBub2lzZSBzaGFwaW5nICgwOm9mZiwgMTAwOm1heCksIGRlZmF1bHQ9NTAKKyAgLWYgPGludD4gLi4uLi4uLi4uLi4uLi4uIGZpbHRlciBzdHJlbmd0aCAoMD1vZmYuLjEwMCksIGRlZmF1bHQ9NjAKKyAgLXNoYXJwbmVzcyA8aW50PiAuLi4uLi4uIGZpbHRlciBzaGFycG5lc3MgKDA6bW9zdCAuLiA3OmxlYXN0IHNoYXJwKSwgZGVmYXVsdD0wCisgIC1zdHJvbmcgLi4uLi4uLi4uLi4uLi4uLiB1c2Ugc3Ryb25nIGZpbHRlciBpbnN0ZWFkIG9mIHNpbXBsZSAoZGVmYXVsdCkKKyAgLW5vc3Ryb25nIC4uLi4uLi4uLi4uLi4uIHVzZSBzaW1wbGUgZmlsdGVyIGluc3RlYWQgb2Ygc3Ryb25nCisgIC1zaGFycF95dXYgLi4uLi4uLi4uLi4uLiB1c2Ugc2hhcnBlciAoYW5kIHNsb3dlcikgUkdCLT5ZVVYgY29udmVyc2lvbgorICAtcGFydGl0aW9uX2xpbWl0IDxpbnQ+IC4gbGltaXQgcXVhbGl0eSB0byBmaXQgdGhlIDUxMmsgbGltaXQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBwYXJ0aXRpb24gKDA9bm8gZGVncmFkYXRpb24gLi4uIDEwMD1mdWxsKQorICAtcGFzcyA8aW50PiAuLi4uLi4uLi4uLi4gYW5hbHlzaXMgcGFzcyBudW1iZXIgKDEuLjEwKQorICAtY3JvcCA8eD4gPHk+IDx3PiA8aD4gLi4gY3JvcCBwaWN0dXJlIHdpdGggdGhlIGdpdmVuIHJlY3RhbmdsZQorICAtcmVzaXplIDx3PiA8aD4gLi4uLi4uLi4gcmVzaXplIHBpY3R1cmUgKGFmdGVyIGFueSBjcm9wcGluZykKKyAgLW10IC4uLi4uLi4uLi4uLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcgaWYgYXZhaWxhYmxlCisgIC1sb3dfbWVtb3J5IC4uLi4uLi4uLi4uLiByZWR1Y2UgbWVtb3J5IHVzYWdlIChzbG93ZXIgZW5jb2RpbmcpCisgIC1tYXAgPGludD4gLi4uLi4uLi4uLi4uLiBwcmludCBtYXAgb2YgZXh0cmEgaW5mbworICAtcHJpbnRfcHNuciAuLi4uLi4uLi4uLi4gcHJpbnRzIGF2ZXJhZ2VkIFBTTlIgZGlzdG9ydGlvbgorICAtcHJpbnRfc3NpbSAuLi4uLi4uLi4uLi4gcHJpbnRzIGF2ZXJhZ2VkIFNTSU0gZGlzdG9ydGlvbgorICAtcHJpbnRfbHNpbSAuLi4uLi4uLi4uLi4gcHJpbnRzIGxvY2FsLXNpbWlsYXJpdHkgZGlzdG9ydGlvbgorICAtZCA8ZmlsZS5wZ20+IC4uLi4uLi4uLi4gZHVtcCB0aGUgY29tcHJlc3NlZCBvdXRwdXQgKFBHTSBmaWxlKQorICAtYWxwaGFfbWV0aG9kIDxpbnQ+IC4uLi4gdHJhbnNwYXJlbmN5LWNvbXByZXNzaW9uIG1ldGhvZCAoMC4uMSksIGRlZmF1bHQ9MQorICAtYWxwaGFfZmlsdGVyIDxzdHJpbmc+IC4gcHJlZGljdGl2ZSBmaWx0ZXJpbmcgZm9yIGFscGhhIHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mOiBub25lLCBmYXN0IChkZWZhdWx0KSBvciBiZXN0CisgIC1leGFjdCAuLi4uLi4uLi4uLi4uLi4uLiBwcmVzZXJ2ZSBSR0IgdmFsdWVzIGluIHRyYW5zcGFyZW50IGFyZWEsIGRlZmF1bHQ9b2ZmCisgIC1ibGVuZF9hbHBoYSA8aGV4PiAuLi4uLiBibGVuZCBjb2xvcnMgYWdhaW5zdCBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgUkdCIHZhbHVlcyB3cml0dGVuIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhhZGVjaW1hbCwgZS5nLiAweGMwZTBkMCBmb3IgcmVkPTB4YzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuPTB4ZTAgYW5kIGJsdWU9MHhkMAorICAtbm9hbHBoYSAuLi4uLi4uLi4uLi4uLi4gZGlzY2FyZCBhbnkgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uCisgIC1sb3NzbGVzcyAuLi4uLi4uLi4uLi4uLiBlbmNvZGUgaW1hZ2UgbG9zc2xlc3NseSwgZGVmYXVsdD1vZmYKKyAgLW5lYXJfbG9zc2xlc3MgPGludD4gLi4uIHVzZSBuZWFyLWxvc3NsZXNzIGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzaW5nICgwLi4xMDA9b2ZmKSwgZGVmYXVsdD0xMDAKKyAgLWhpbnQgPHN0cmluZz4gLi4uLi4uLi4uIHNwZWNpZnkgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIGhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Y6IHBob3RvLCBwaWN0dXJlIG9yIGdyYXBoCisKKyAgLW1ldGFkYXRhIDxzdHJpbmc+IC4uLi4uIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogYWxsLCBub25lIChkZWZhdWx0KSwgZXhpZiwgaWNjLCB4bXAKKworICAtc2hvcnQgLi4uLi4uLi4uLi4uLi4uLi4gY29uZGVuc2UgcHJpbnRlZCBtZXNzYWdlCisgIC1xdWlldCAuLi4uLi4uLi4uLi4uLi4uLiBkb24ndCBwcmludCBhbnl0aGluZworICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgLW5vYXNtIC4uLi4uLi4uLi4uLi4uLi4uIGRpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnMKKyAgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2UsIGUuZy4gcHJpbnQgZW5jb2RpbmcvZGVjb2RpbmcgdGltZXMKKyAgLXByb2dyZXNzIC4uLi4uLi4uLi4uLi4uIHJlcG9ydCBlbmNvZGluZyBwcm9ncmVzcworCitFeHBlcmltZW50YWwgT3B0aW9uczoKKyAgLWpwZWdfbGlrZSAuLi4uLi4uLi4uLi4uIHJvdWdobHkgbWF0Y2ggZXhwZWN0ZWQgSlBFRyBzaXplCisgIC1hZiAuLi4uLi4uLi4uLi4uLi4uLi4uLiBhdXRvLWFkanVzdCBmaWx0ZXIgc3RyZW5ndGgKKyAgLXByZSA8aW50PiAuLi4uLi4uLi4uLi4uIHByZS1wcm9jZXNzaW5nIGZpbHRlcgorCitUaGUgbWFpbiBvcHRpb25zIHlvdSBtaWdodCB3YW50IHRvIHRyeSBpbiBvcmRlciB0byBmdXJ0aGVyIHR1bmUgdGhlCit2aXN1YWwgcXVhbGl0eSBhcmU6CisgLXByZXNldAorIC1zbnMKKyAtZgorIC1tCisKK05hbWVseToKKyAgKiAncHJlc2V0JyB3aWxsIHNldCB1cCBhIGRlZmF1bHQgZW5jb2RpbmcgY29uZmlndXJhdGlvbiB0YXJnZXRpbmcgYQorICAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgaW5wdXQuIEl0IHNob3VsZCBhcHBlYXIgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucywKKyAgICAgc28gdGhhdCBzdWJzZXF1ZW50IG9wdGlvbnMgY2FuIHRha2UgZWZmZWN0IG9uIHRvcCBvZiB0aGlzIHByZXNldC4KKyAgICAgRGVmYXVsdCB2YWx1ZSBpcyAnZGVmYXVsdCcuCisgICogJ3Nucycgd2lsbCBwcm9ncmVzc2l2ZWx5IHR1cm4gb24gKHdoZW4gZ29pbmcgZnJvbSAwIHRvIDEwMCkgc29tZSBhZGRpdGlvbmFsCisgICAgIHZpc3VhbCBvcHRpbWl6YXRpb25zIChsaWtlOiBzZWdtZW50YXRpb24gbWFwIHJlLWVuZm9yY2VtZW50KS4gVGhpcyBvcHRpb24KKyAgICAgd2lsbCBiYWxhbmNlIHRoZSBiaXQgYWxsb2NhdGlvbiBkaWZmZXJlbnRseS4gSXQgdHJpZXMgdG8gdGFrZSBiaXRzIGZyb20gdGhlCisgICAgICJlYXN5IiBwYXJ0cyBvZiB0aGUgcGljdHVyZSBhbmQgdXNlIHRoZW0gaW4gdGhlICJkaWZmaWN1bHQiIG9uZXMgaW5zdGVhZC4KKyAgICAgVXN1YWxseSwgcmFpc2luZyB0aGUgc25zIHZhbHVlIChhdCBmaXhlZCAtcSB2YWx1ZSkgbGVhZHMgdG8gbGFyZ2VyIGZpbGVzLAorICAgICBidXQgd2l0aCBiZXR0ZXIgcXVhbGl0eS4KKyAgICAgVHlwaWNhbCB2YWx1ZSBpcyBhcm91bmQgJzc1Jy4KKyAgKiAnZicgb3B0aW9uIGRpcmVjdGx5IGxpbmtzIHRvIHRoZSBmaWx0ZXJpbmcgc3RyZW5ndGggdXNlZCBieSB0aGUgY29kZWMncworICAgICBpbi1sb29wIHByb2Nlc3NpbmcuIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgc21vb3RoZXIgdGhlCisgICAgIGhpZ2hseS1jb21wcmVzc2VkIGFyZWEgd2lsbCBsb29rLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBhaW1pbmcKKyAgICAgYXQgdmVyeSBzbWFsbCBmaWxlcy4gVHlwaWNhbCB2YWx1ZXMgYXJlIGFyb3VuZCAyMC0zMC4gTm90ZSB0aGF0IHVzaW5nIHRoZQorICAgICBvcHRpb24gLXN0cm9uZy8tbm9zdHJvbmcgd2lsbCBjaGFuZ2UgdGhlIHR5cGUgb2YgZmlsdGVyaW5nLiBVc2UgIi1mIDAiIHRvCisgICAgIHR1cm4gZmlsdGVyaW5nIG9mZi4KKyAgKiAnbScgY29udHJvbHMgdGhlIHRyYWRlLW9mZiBiZXR3ZWVuIGVuY29kaW5nIHNwZWVkIGFuZCBxdWFsaXR5LiBEZWZhdWx0IGlzIDQuCisgICAgIFlvdSBjYW4gdHJ5IC1tIDUgb3IgLW0gNiB0byBleHBsb3JlIG1vcmUgKHRpbWUtY29uc3VtaW5nKSBlbmNvZGluZworICAgICBwb3NzaWJpbGl0aWVzLiBBIGxvd2VyIHZhbHVlIHdpbGwgcmVzdWx0IGluIGZhc3RlciBlbmNvZGluZyBhdCB0aGUgZXhwZW5zZQorICAgICBvZiBxdWFsaXR5LgorCitEZWNvZGluZyB0b29sOgorPT09PT09PT09PT09PT0KKworVGhlcmUgaXMgYSBkZWNvZGluZyBzYW1wbGUgaW4gZXhhbXBsZXMvZHdlYnAuYyB3aGljaCB3aWxsIHRha2UKK2EgLndlYnAgZmlsZSBhbmQgZGVjb2RlIGl0IHRvIGEgUE5HIGltYWdlIGZpbGUgKGFtb25nc3Qgb3RoZXIgZm9ybWF0cykuCitUaGlzIGlzIHNpbXBseSB0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBBUEkuIFlvdSBjYW4gdmVyaWZ5IHRoZQorZmlsZSB0ZXN0LndlYnAgZGVjb2RlcyB0byBleGFjdGx5IHRoZSBzYW1lIGFzIHRlc3RfcmVmLnBwbSBieSB1c2luZzoKKworIGNkIGV4YW1wbGVzCisgLi9kd2VicCB0ZXN0LndlYnAgLXBwbSAtbyB0ZXN0LnBwbQorIGRpZmYgdGVzdC5wcG0gdGVzdF9yZWYucHBtCisKK1RoZSBmdWxsIGxpc3Qgb2Ygb3B0aW9ucyBpcyBhdmFpbGFibGUgdXNpbmcgLWg6CisKKz4gZHdlYnAgLWgKK1VzYWdlOiBkd2VicCBpbl9maWxlIFtvcHRpb25zXSBbLW8gb3V0X2ZpbGVdCisKK0RlY29kZXMgdGhlIFdlYlAgaW1hZ2UgZmlsZSB0byBQTkcgZm9ybWF0IFtEZWZhdWx0XQorVXNlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnZlcnQgaW50byBhbHRlcm5hdGUgaW1hZ2UgZm9ybWF0czoKKyAgLXBhbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFJHQkEgc2FtcGxlcyBhcyBhIGNvbG9yIFBBTQorICAtcHBtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgUkdCIHNhbXBsZXMgYXMgYSBjb2xvciBQUE0KKyAgLWJtcCAuLi4uLi4uLi4gc2F2ZSBhcyB1bmNvbXByZXNzZWQgQk1QIGZvcm1hdAorICAtdGlmZiAuLi4uLi4uLiBzYXZlIGFzIHVuY29tcHJlc3NlZCBUSUZGIGZvcm1hdAorICAtcGdtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgWVVWIHNhbXBsZXMgYXMgYSBncmF5c2NhbGUgUEdNCisgICAgICAgICAgICAgICAgIGZpbGUgd2l0aCBJTUM0IGxheW91dAorICAteXV2IC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgWVVWIHNhbXBsZXMgaW4gZmxhdCBsYXlvdXQKKworIE90aGVyIG9wdGlvbnMgYXJlOgorICAtdmVyc2lvbiAuLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAtbm9mYW5jeSAuLi4uLiBkb24ndCB1c2UgdGhlIGZhbmN5IFlVVjQyMCB1cHNjYWxlcgorICAtbm9maWx0ZXIgLi4uLiBkaXNhYmxlIGluLWxvb3AgZmlsdGVyaW5nCisgIC1ub2RpdGhlciAuLi4uIGRpc2FibGUgZGl0aGVyaW5nCisgIC1kaXRoZXIgPGQ+IC4uIGRpdGhlcmluZyBzdHJlbmd0aCAoaW4gMC4uMTAwKQorICAtYWxwaGFfZGl0aGVyICB1c2UgYWxwaGEtcGxhbmUgZGl0aGVyaW5nIGlmIG5lZWRlZAorICAtbXQgLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nCisgIC1jcm9wIDx4PiA8eT4gPHc+IDxoPiAuLi4gY3JvcCBvdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlCisgIC1yZXNpemUgPHc+IDxoPiAuLi4uLi4uLi4gc2NhbGUgdGhlIG91dHB1dCAoKmFmdGVyKiBhbnkgY3JvcHBpbmcpCisgIC1mbGlwIC4uLi4uLi4uIGZsaXAgdGhlIG91dHB1dCB2ZXJ0aWNhbGx5CisgIC1hbHBoYSAuLi4uLi4uIG9ubHkgc2F2ZSB0aGUgYWxwaGEgcGxhbmUKKyAgLWluY3JlbWVudGFsIC4gdXNlIGluY3JlbWVudGFsIGRlY29kaW5nICh1c2VmdWwgZm9yIHRlc3RzKQorICAtaCAuLi4uLi4uLi4uLiB0aGlzIGhlbHAgbWVzc2FnZQorICAtdiAuLi4uLi4uLi4uLiB2ZXJib3NlIChlLmcuIHByaW50IGVuY29kaW5nL2RlY29kaW5nIHRpbWVzKQorICAtcXVpZXQgLi4uLi4uLiBxdWlldCBtb2RlLCBkb24ndCBwcmludCBhbnl0aGluZworICAtbm9hc20gLi4uLi4uLiBkaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zCisKK1dlYlAgZmlsZSBhbmFseXNpcyB0b29sOgorPT09PT09PT09PT09PT09PT09PT09PT09CisKKyd3ZWJwaW5mbycgY2FuIGJlIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSBjaHVuayBsZXZlbCBzdHJ1Y3R1cmUgYW5kIGJpdHN0cmVhbQoraGVhZGVyIGluZm9ybWF0aW9uIG9mIFdlYlAgZmlsZXMuIEl0IGNhbiBhbHNvIGNoZWNrIGlmIHRoZSBmaWxlcyBhcmUgb2YgdmFsaWQKK1dlYlAgZm9ybWF0LgorCitVc2FnZTogd2VicGluZm8gW29wdGlvbnNdIGluX2ZpbGVzCitOb3RlOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbnB1dCBmaWxlczsKKyAgICAgIG9wdGlvbnMgbXVzdCBjb21lIGJlZm9yZSBpbnB1dCBmaWxlcy4KK09wdGlvbnM6CisgIC12ZXJzaW9uIC4uLi4uLi4uLi4uIFByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgorICAtcXVpZXQgLi4uLi4uLi4uLi4uLiBEbyBub3Qgc2hvdyBjaHVuayBwYXJzaW5nIGluZm9ybWF0aW9uLgorICAtZGlhZyAuLi4uLi4uLi4uLi4uLiBTaG93IHBhcnNpbmcgZXJyb3IgZGlhZ25vc2lzLgorICAtc3VtbWFyeSAuLi4uLi4uLi4uLiBTaG93IGNodW5rIHN0YXRzIHN1bW1hcnkuCisgIC1iaXRzdHJlYW1faW5mbyAuLi4uIFBhcnNlIGJpdHN0cmVhbSBoZWFkZXIuCisKK1Zpc3VhbGl6YXRpb24gdG9vbDoKKz09PT09PT09PT09PT09PT09PT0KKworVGhlcmUncyBhIGxpdHRsZSBzZWxmLXNlcnZlIHZpc3VhbGl6YXRpb24gdG9vbCBjYWxsZWQgJ3Z3ZWJwJyB1bmRlciB0aGUKK2V4YW1wbGVzLyBkaXJlY3RvcnkuIEl0IHVzZXMgT3BlbkdMIHRvIG9wZW4gYSBzaW1wbGUgZHJhd2luZyB3aW5kb3cgYW5kIHNob3cKK2EgZGVjb2RlZCBXZWJQIGZpbGUuIEl0J3Mgbm90IHlldCBpbnRlZ3JhdGVkIGluIHRoZSBhdXRvbWFrZSBidWlsZCBzeXN0ZW0sIGJ1dAoreW91IGNhbiB0cnkgdG8gbWFudWFsbHkgY29tcGlsZSBpdCB1c2luZyB0aGUgcmVjb21tZW5kYXRpb25zIGJlbG93LgorCitVc2FnZTogdndlYnAgaW5fZmlsZSBbb3B0aW9uc10KKworRGVjb2RlcyB0aGUgV2ViUCBpbWFnZSBmaWxlIGFuZCB2aXN1YWxpemUgaXQgdXNpbmcgT3BlbkdMCitPcHRpb25zIGFyZToKKyAgLXZlcnNpb24gLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgLW5vaWNjIC4uLi4uLi4gZG9uJ3QgdXNlIHRoZSBpY2MgcHJvZmlsZSBpZiBwcmVzZW50CisgIC1ub2ZhbmN5IC4uLi4uIGRvbid0IHVzZSB0aGUgZmFuY3kgWVVWNDIwIHVwc2NhbGVyCisgIC1ub2ZpbHRlciAuLi4uIGRpc2FibGUgaW4tbG9vcCBmaWx0ZXJpbmcKKyAgLWRpdGhlciA8aW50PiAgZGl0aGVyaW5nIHN0cmVuZ3RoICgwLi4xMDApLCBkZWZhdWx0PTUwCisgIC1ub2FscGhhZGl0aGVyIGRpc2FibGUgYWxwaGEgcGxhbmUgZGl0aGVyaW5nCisgIC1tdCAuLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcKKyAgLWluZm8gLi4uLi4uLi4gcHJpbnQgaW5mbworICAtaCAuLi4uLi4uLi4uLiB0aGlzIGhlbHAgbWVzc2FnZQorCitLZXlib2FyZCBzaG9ydGN1dHM6CisgICdjJyAuLi4uLi4uLi4uLi4uLi4uIHRvZ2dsZSB1c2Ugb2YgY29sb3IgcHJvZmlsZQorICAnaScgLi4uLi4uLi4uLi4uLi4uLiBvdmVybGF5IGZpbGUgaW5mb3JtYXRpb24KKyAgJ2QnIC4uLi4uLi4uLi4uLi4uLi4gZGlzYWJsZSBibGVuZGluZyAmIGRpc3Bvc2FsIChkZWJ1ZykKKyAgJ3EnIC8gJ1EnIC8gRVNDIC4uLi4gcXVpdAorCitCdWlsZGluZzoKKy0tLS0tLS0tLQorCitQcmVyZXF1aXNpdGVzOgorMSkgT3BlbkdMICYgT3BlbkdMIFV0aWxpdHkgVG9vbGtpdCAoR0xVVCkKKyAgTGludXg6CisgICAgJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBmcmVlZ2x1dDMtZGV2IG1lc2EtY29tbW9uLWRldgorICBNYWMgKyBYQ29kZToKKyAgICAtIFRoZXNlIGxpYnJhcmllcyBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBPcGVuR0wgLyBHTFVUIGZyYW1ld29ya3MuCisgIFdpbmRvd3M6CisgICAgaHR0cDovL2ZyZWVnbHV0LnNvdXJjZWZvcmdlLm5ldC9pbmRleC5waHAjZG93bmxvYWQKKworMikgKE9wdGlvbmFsKSBxY21zIChRdWljayBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbSkKKyAgaS4gRG93bmxvYWQgcWNtcyBmcm9tIE1vemlsbGEgLyBDaHJvbWl1bToKKyAgICBodHRwOi8vaGcubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL2ZpbGUvMGU3NjM5ZTNiZGZiL2dmeC9xY21zCisgICAgaHR0cDovL3NyYy5jaHJvbWl1bS5vcmcvdmlld3ZjL2Nocm9tZS90cnVuay9zcmMvdGhpcmRfcGFydHkvcWNtcworICBpaS4gQnVpbGQgYW5kIGFyY2hpdmUgdGhlIHNvdXJjZSBmaWxlcyBhcyBsaWJxY21zLmEgLyBxY21zLmxpYgorICBpaWkuIFVwZGF0ZSBtYWtlZmlsZS51bml4IC8gTWFrZWZpbGUudmMKKyAgICBhKSBEZWZpbmUgV0VCUF9IQVZFX1FDTVMKKyAgICBiKSBVcGRhdGUgaW5jbHVkZSAvIGxpYnJhcnkgcGF0aHMgdG8gcmVmZXJlbmNlIHRoZSBxY21zIGRpcmVjdG9yeS4KKworQnVpbGQgdXNpbmcgbWFrZWZpbGUudW5peCAvIE1ha2VmaWxlLnZjOgorJCBtYWtlIC1mIG1ha2VmaWxlLnVuaXggZXhhbXBsZXMvdndlYnAKKz4gbm1ha2UgL2YgTWFrZWZpbGUudmMgQ0ZHPXJlbGVhc2Utc3RhdGljIFwKKyAgICAuLi9vYmoveDY0L3JlbGVhc2Utc3RhdGljL2Jpbi92d2VicC5leGUKKworQW5pbWF0aW9uIGNyZWF0aW9uIHRvb2w6Cis9PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSB1dGlsaXR5ICdpbWcyd2VicCcgY2FuIHR1cm4gYSBzZXF1ZW5jZSBvZiBpbnB1dCBpbWFnZXMgKFBORywgSlBFRywgLi4uKQoraW50byBhbiBhbmltYXRlZCBXZWJQIGZpbGUuIEl0IG9mZmVycyBmaW5lIGNvbnRyb2wgb3ZlciBkdXJhdGlvbiwgZW5jb2RpbmcKK21vZGVzLCBldGMuCisKK1VzYWdlOgorCisgIGltZzJ3ZWJwIFtmaWxlLWxldmVsIG9wdGlvbnNdIFtpbWFnZSBmaWxlcy4uLl0gW3Blci1mcmFtZSBvcHRpb25zLi4uXQorCitGaWxlLWxldmVsIG9wdGlvbnMgKG9ubHkgdXNlZCBhdCB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24pOgorIC1taW5fc2l6ZSAuLi4uLi4uLi4uLi4gbWluaW1pemUgc2l6ZQorIC1sb29wIDxpbnQ+IC4uLi4uLi4uLi4gbG9vcCBjb3VudCAoZGVmYXVsdDogMCwgPSBpbmZpbml0ZSBsb29wKQorIC1rbWF4IDxpbnQ+IC4uLi4uLi4uLi4gbWF4aW11bSBudW1iZXIgb2YgZnJhbWUgYmV0d2VlbiBrZXktZnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAoMD1vbmx5IGtleWZyYW1lcykKKyAta21pbiA8aW50PiAuLi4uLi4uLi4uIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lIGJldHdlZW4ga2V5LWZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgKDA9ZGlzYWJsZSBrZXktZnJhbWVzIGFsdG9nZXRoZXIpCisgLW1peGVkIC4uLi4uLi4uLi4uLi4uLiB1c2UgbWl4ZWQgbG9zc3kvbG9zc2xlc3MgYXV0b21hdGljIG1vZGUKKyAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2UgbW9kZQorIC1oIC4uLi4uLi4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwCisgLXZlcnNpb24gLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorCitQZXItZnJhbWUgb3B0aW9ucyAob25seSB1c2VkIGZvciBzdWJzZXF1ZW50IGltYWdlcyBpbnB1dCk6CisgLWQgPGludD4gLi4uLi4uLi4uLi4uLiBmcmFtZSBkdXJhdGlvbiBpbiBtcyAoZGVmYXVsdDogMTAwKQorIC1sb3NzbGVzcyAgLi4uLi4uLi4uLi4gdXNlIGxvc3NsZXNzIG1vZGUgKGRlZmF1bHQpCisgLWxvc3N5IC4uLiAuLi4uLi4uLi4uLiB1c2UgbG9zc3kgbW9kZQorIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4gcXVhbGl0eQorIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4gbWV0aG9kIHRvIHVzZQorCitleGFtcGxlOiBpbWcyd2VicCAtbG9vcCAyIGluMC5wbmcgLWxvc3N5IGluMS5qcGcKKyAgICAgICAgICAgICAgICAgIC1kIDgwIGluMi50aWZmIC1vIG91dC53ZWJwCisKK0FuaW1hdGVkIEdJRiBjb252ZXJzaW9uOgorPT09PT09PT09PT09PT09PT09PT09PT09CitBbmltYXRlZCBHSUYgZmlsZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBXZWJQIGZpbGVzIHdpdGggYW5pbWF0aW9uIHVzaW5nIHRoZQorZ2lmMndlYnAgdXRpbGl0eSBhdmFpbGFibGUgdW5kZXIgZXhhbXBsZXMvLiBUaGUgZmlsZXMgY2FuIHRoZW4gYmUgdmlld2VkIHVzaW5nCit2d2VicC4KKworVXNhZ2U6CisgZ2lmMndlYnAgW29wdGlvbnNdIGdpZl9maWxlIC1vIHdlYnBfZmlsZQorT3B0aW9uczoKKyAgLWggLyAtaGVscCAuLi4uLi4uLi4uLi4uIHRoaXMgaGVscAorICAtbG9zc3kgLi4uLi4uLi4uLi4uLi4uLi4gZW5jb2RlIGltYWdlIHVzaW5nIGxvc3N5IGNvbXByZXNzaW9uCisgIC1taXhlZCAuLi4uLi4uLi4uLi4uLi4uLiBmb3IgZWFjaCBmcmFtZSBpbiB0aGUgaW1hZ2UsIHBpY2sgbG9zc3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvc3NsZXNzIGNvbXByZXNzaW9uIGhldXJpc3RpY2FsbHkKKyAgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLi4uIHF1YWxpdHkgZmFjdG9yICgwOnNtYWxsLi4xMDA6YmlnKQorICAtbSA8aW50PiAuLi4uLi4uLi4uLi4uLi4gY29tcHJlc3Npb24gbWV0aG9kICgwPWZhc3QsIDY9c2xvd2VzdCkKKyAgLW1pbl9zaXplIC4uLi4uLi4uLi4uLi4uIG1pbmltaXplIG91dHB1dCBzaXplIChkZWZhdWx0Om9mZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3NsZXNzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQ7IGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQgd2l0aCAtcSwgLW0sIC1sb3NzeSBvciAtbWl4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMKKyAgLWttaW4gPGludD4gLi4uLi4uLi4uLi4uIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIGtleSBmcmFtZXMKKyAgLWttYXggPGludD4gLi4uLi4uLi4uLi4uIG1heCBkaXN0YW5jZSBiZXR3ZWVuIGtleSBmcmFtZXMKKyAgLWYgPGludD4gLi4uLi4uLi4uLi4uLi4uIGZpbHRlciBzdHJlbmd0aCAoMD1vZmYuLjEwMCkKKyAgLW1ldGFkYXRhIDxzdHJpbmc+IC4uLi4uIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzOiBhbGwsIG5vbmUsIGljYywgeG1wIChkZWZhdWx0KQorICAtbG9vcF9jb21wYXRpYmlsaXR5IC4uLi4gdXNlIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgQ2hyb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIHByaW9yIHRvIE02MiAoaW5jbHVzaXZlKQorICAtbXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZyBpZiBhdmFpbGFibGUKKworICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2UKKyAgLXF1aWV0IC4uLi4uLi4uLi4uLi4uLi4uIGRvbid0IHByaW50IGFueXRoaW5nCisKK0J1aWxkaW5nOgorLS0tLS0tLS0tCitXaXRoIHRoZSBsaWJnaWYgZGV2ZWxvcG1lbnQgZmlsZXMgaW5zdGFsbGVkLCBnaWYyd2VicCBjYW4gYmUgYnVpbHQgdXNpbmcKK21ha2VmaWxlLnVuaXg6CiskIG1ha2UgLWYgbWFrZWZpbGUudW5peCBleGFtcGxlcy9naWYyd2VicAorCitvciB1c2luZyBhdXRvY29uZjoKKyQgLi9jb25maWd1cmUgLS1lbmFibGUtZXZlcnl0aGluZworJCBtYWtlCisKK0NvbXBhcmlzb24gb2YgYW5pbWF0ZWQgaW1hZ2VzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUZXN0IHV0aWxpdHkgYW5pbV9kaWZmIHVuZGVyIGV4YW1wbGVzLyBjYW4gYmUgdXNlZCB0byBjb21wYXJlIHR3byBhbmltYXRlZAoraW1hZ2VzIChlYWNoIGNhbiBiZSBHSUYgb3IgV2ViUCkuCisKK1VzYWdlOiBhbmltX2RpZmYgPGltYWdlMT4gPGltYWdlMj4gW29wdGlvbnNdCisKK09wdGlvbnM6CisgIC1kdW1wX2ZyYW1lcyA8Zm9sZGVyPiBkdW1wIGRlY29kZWQgZnJhbWVzIGluIFBBTSBmb3JtYXQKKyAgLW1pbl9wc25yIDxmbG9hdD4gLi4uIG1pbmltdW0gcGVyLWZyYW1lIFBTTlIKKyAgLXJhd19jb21wYXJpc29uIC4uLi4uIGlmIHRoaXMgZmxhZyBpcyBub3QgdXNlZCwgUkdCIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBsaWVkIGJlZm9yZSBjb21wYXJpc29uCisgIC1tYXhfZGlmZiA8aW50PiAuLi4uLiBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBwZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiBzdWJzZXF1ZW50CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMKKyAgLWggLi4uLi4uLi4uLi4uLi4uLi4uIHRoaXMgaGVscAorICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKworQnVpbGRpbmc6CistLS0tLS0tLS0KK1dpdGggdGhlIGxpYmdpZiBkZXZlbG9wbWVudCBmaWxlcyBhbmQgYSBDKysgY29tcGlsZXIgaW5zdGFsbGVkLCBhbmltX2RpZmYgY2FuCitiZSBidWlsdCB1c2luZyBtYWtlZmlsZS51bml4OgorJCBtYWtlIC1mIG1ha2VmaWxlLnVuaXggZXhhbXBsZXMvYW5pbV9kaWZmCisKK29yIHVzaW5nIGF1dG9jb25mOgorJCAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1ldmVyeXRoaW5nCiskIG1ha2UKKworRW5jb2RpbmcgQVBJOgorPT09PT09PT09PT09PQorCitUaGUgbWFpbiBlbmNvZGluZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgaGVhZGVyIHNyYy93ZWJwL2VuY29kZS5oCitUaGUgcmVhZHktdG8tdXNlIG9uZXMgYXJlOgorc2l6ZV90IFdlYlBFbmNvZGVSR0IoY29uc3QgdWludDhfdCogcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZUJHUihjb25zdCB1aW50OF90KiBiZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlUkdCQShjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CisKK1RoZXkgd2lsbCBjb252ZXJ0IHJhdyBSR0Igc2FtcGxlcyB0byBhIFdlYlAgZGF0YS4gVGhlIG9ubHkgY29udHJvbCBzdXBwbGllZAoraXMgdGhlIHF1YWxpdHkgZmFjdG9yLgorCitUaGVyZSBhcmUgc29tZSB2YXJpYW50cyBmb3IgdXNpbmcgdGhlIGxvc3NsZXNzIGZvcm1hdDoKKworc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc1JHQihjb25zdCB1aW50OF90KiByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoY29uc3QgdWludDhfdCogYmdyYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCoqIG91dHB1dCk7CisKK09mIGNvdXJzZSBpbiB0aGlzIGNhc2UsIG5vIHF1YWxpdHkgZmFjdG9yIGlzIG5lZWRlZCBzaW5jZSB0aGUgY29tcHJlc3Npb24KK29jY3VycyB3aXRob3V0IGxvc3Mgb2YgdGhlIGlucHV0IHZhbHVlcywgYXQgdGhlIGV4cGVuc2Ugb2YgbGFyZ2VyIG91dHB1dCBzaXplcy4KKworQWR2YW5jZWQgZW5jb2RpbmcgQVBJOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIG1vcmUgYWR2YW5jZWQgQVBJIGlzIGJhc2VkIG9uIHRoZSBXZWJQQ29uZmlnIGFuZCBXZWJQUGljdHVyZSBzdHJ1Y3R1cmVzLgorCitXZWJQQ29uZmlnIGNvbnRhaW5zIHRoZSBlbmNvZGluZyBzZXR0aW5ncyBhbmQgaXMgbm90IHRpZWQgdG8gYSBwYXJ0aWN1bGFyCitwaWN0dXJlLgorV2ViUFBpY3R1cmUgY29udGFpbnMgaW5wdXQgZGF0YSwgb24gd2hpY2ggc29tZSBXZWJQQ29uZmlnIHdpbGwgYmUgdXNlZCBmb3IKK2NvbXByZXNzaW9uLgorVGhlIGVuY29kaW5nIGZsb3cgbG9va3MgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU4gUFNFVURPIEVYQU1QTEUKKworI2luY2x1ZGUgPHdlYnAvZW5jb2RlLmg+CisKKyAgLy8gU2V0dXAgYSBjb25maWcsIHN0YXJ0aW5nIGZvcm0gYSBwcmVzZXQgYW5kIHR1bmluZyBzb21lIGFkZGl0aW9uYWwKKyAgLy8gcGFyYW1ldGVycworICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgaWYgKCFXZWJQQ29uZmlnUHJlc2V0KCZjb25maWcsIFdFQlBfUFJFU0VUX1BIT1RPLCBxdWFsaXR5X2ZhY3RvcikpCisgICAgcmV0dXJuIDA7ICAgLy8gdmVyc2lvbiBlcnJvcgorICB9CisgIC8vIC4uLiBhZGRpdGlvbmFsIHR1bmluZworICBjb25maWcuc25zX3N0cmVuZ3RoID0gOTA7CisgIGNvbmZpZy5maWx0ZXJfc2hhcnBuZXNzID0gNjsKKyAgY29uZmlnX2Vycm9yID0gV2ViUFZhbGlkYXRlQ29uZmlnKCZjb25maWcpOyAgLy8gbm90IG1hbmRhdG9yeSwgYnV0IHVzZWZ1bAorCisgIC8vIFNldHVwIHRoZSBpbnB1dCBkYXRhCisgIFdlYlBQaWN0dXJlIHBpYzsKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnBpYykpIHsKKyAgICByZXR1cm4gMDsgIC8vIHZlcnNpb24gZXJyb3IKKyAgfQorICBwaWMud2lkdGggPSB3aWR0aDsKKyAgcGljLmhlaWdodCA9IGhlaWdodDsKKyAgLy8gYWxsb2NhdGVkIHBpY3R1cmUgb2YgZGltZW5zaW9uIHdpZHRoIHggaGVpZ2h0CisgIGlmICghV2ViUFBpY3R1cmVBbGxvY2F0ZSgmcGljKSkgeworICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgorICB9CisgIC8vIGF0IHRoaXMgcG9pbnQsICdwaWMnIGhhcyBiZWVuIGluaXRpYWxpemVkIGFzIGEgY29udGFpbmVyLAorICAvLyBhbmQgY2FuIHJlY2VpdmUgdGhlIFkvVS9WIHNhbXBsZXMuCisgIC8vIEFsdGVybmF0aXZlbHksIG9uZSBjb3VsZCB1c2UgcmVhZHktbWFkZSBpbXBvcnQgZnVuY3Rpb25zIGxpa2UKKyAgLy8gV2ViUFBpY3R1cmVJbXBvcnRSR0IoKSwgd2hpY2ggd2lsbCB0YWtlIGNhcmUgb2YgbWVtb3J5IGFsbG9jYXRpb24uCisgIC8vIEluIGFueSBjYXNlLCBwYXN0IHRoaXMgcG9pbnQsIG9uZSB3aWxsIGhhdmUgdG8gY2FsbAorICAvLyBXZWJQUGljdHVyZUZyZWUoJnBpYykgdG8gcmVjbGFpbSBtZW1vcnkuCisKKyAgLy8gU2V0IHVwIGEgYnl0ZS1vdXRwdXQgd3JpdGUgbWV0aG9kLiBXZWJQTWVtb3J5V3JpdGVyLCBmb3IgaW5zdGFuY2UuCisgIFdlYlBNZW1vcnlXcml0ZXIgd3J0OworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmd3J0KTsgICAgIC8vIGluaXRpYWxpemUgJ3dydCcKKworICBwaWMud3JpdGVyID0gTXlGaWxlV3JpdGVyOworICBwaWMuY3VzdG9tX3B0ciA9IG15X29wYXF1ZV9zdHJ1Y3R1cmVfdG9fbWFrZV9NeUZpbGVXcml0ZXJfd29yazsKKworICAvLyBDb21wcmVzcyEKKyAgaW50IG9rID0gV2ViUEVuY29kZSgmY29uZmlnLCAmcGljKTsgICAvLyBvayA9IDAgPT4gZXJyb3Igb2NjdXJyZWQhCisgIFdlYlBQaWN0dXJlRnJlZSgmcGljKTsgIC8vIG11c3QgYmUgY2FsbGVkIGluZGVwZW5kZW50bHkgb2YgdGhlICdvaycgcmVzdWx0LgorCisgIC8vIG91dHB1dCBkYXRhIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBieSB0aGUgd3JpdGVyIGF0IHRoYXQgcG9pbnQuCisgIC8vIC0+IGNvbXByZXNzZWQgZGF0YSBpcyB0aGUgbWVtb3J5IGJ1ZmZlciBkZXNjcmliZWQgYnkgd3J0Lm1lbSAvIHdydC5zaXplCisKKyAgLy8gZGVhbGxvY2F0ZSB0aGUgbWVtb3J5IHVzZWQgYnkgY29tcHJlc3NlZCBkYXRhCisgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmd3J0KTsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBTRVVETyBFWEFNUExFCisKK0RlY29kaW5nIEFQSToKKz09PT09PT09PT09PT0KKworVGhpcyBpcyBtYWlubHkganVzdCBvbmUgZnVuY3Rpb24gdG8gY2FsbDoKKworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCit1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBmaWxlIHNyYy93ZWJwL2RlY29kZS5oIGZvciB0aGUgZGV0YWlscy4KK1RoZXJlIGFyZSB2YXJpYW50cyBmb3IgZGVjb2RpbmcgaW4gQkdSL1JHQkEvQVJHQi9CR1JBIG9yZGVyLCBhbG9uZyB3aXRoCitkZWNvZGluZyB0byByYXcgWSdDYkNyIHNhbXBsZXMuIE9uZSBjYW4gYWxzbyBkZWNvZGUgdGhlIGltYWdlIGRpcmVjdGx5IGludG8gYQorcHJlLWFsbG9jYXRlZCBidWZmZXIuCisKK1RvIGRldGVjdCBhIFdlYlAgZmlsZSBhbmQgZ2F0aGVyIHRoZSBwaWN0dXJlJ3MgZGltZW5zaW9ucywgdGhlIGZ1bmN0aW9uOgorICBpbnQgV2ViUEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK2lzIHN1cHBsaWVkLiBObyBkZWNvZGluZyBpcyBpbnZvbHZlZCB3aGVuIHVzaW5nIGl0LgorCitJbmNyZW1lbnRhbCBkZWNvZGluZyBBUEk6Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0luIHRoZSBjYXNlIHdoZW4gZGF0YSBpcyBiZWluZyBwcm9ncmVzc2l2ZWx5IHRyYW5zbWl0dGVkLCBwaWN0dXJlcyBjYW4gc3RpbGwKK2JlIGluY3JlbWVudGFsbHkgZGVjb2RlZCB1c2luZyBhIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgQVBJLiBEZWNvZGVyIHN0YXRlCitpcyBzdG9yZWQgaW50byBhbiBpbnN0YW5jZSBvZiB0aGUgV2ViUElEZWNvZGVyIG9iamVjdC4gVGhpcyBvYmplY3QgY2FuIGJlCitjcmVhdGVkIHdpdGggdGhlIHB1cnBvc2Ugb2YgZGVjb2RpbmcgZWl0aGVyIFJHQiBvciBZJ0NiQ3Igc2FtcGxlcy4KK0ZvciBpbnN0YW5jZToKKworICBXZWJQRGVjQnVmZmVyIGJ1ZmZlcjsKKyAgV2ViUEluaXREZWNCdWZmZXIoJmJ1ZmZlcik7CisgIGJ1ZmZlci5jb2xvcnNwYWNlID0gTU9ERV9CR1I7CisgIC4uLgorICBXZWJQSURlY29kZXIqIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoJmJ1ZmZlcik7CisKK0FzIGRhdGEgaXMgbWFkZSBwcm9ncmVzc2l2ZWx5IGF2YWlsYWJsZSwgdGhpcyBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdAorY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBwaWN0dXJlIGZ1cnRoZXIuIFRoZXJlIGFyZSB0d28gKG11dHVhbGx5IGV4Y2x1c2l2ZSkKK3dheXMgdG8gcGFzcyBmcmVzaGx5IGFycml2ZWQgZGF0YToKKworZWl0aGVyIGJ5IGFwcGVuZGluZyB0aGUgZnJlc2ggYnl0ZXM6CisKKyAgV2ViUElBcHBlbmQoaWRlYywgZnJlc2hfZGF0YSwgc2l6ZV9vZl9mcmVzaF9kYXRhKTsKKworb3IgYnkganVzdCBtZW50aW9uaW5nIHRoZSBuZXcgc2l6ZSBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YToKKworICBXZWJQSVVwZGF0ZShpZGVjLCBidWZmZXIsIHNpemVfb2ZfdHJhbnNtaXR0ZWRfYnVmZmVyKTsKKworTm90ZSB0aGF0ICdidWZmZXInIGNhbiBiZSBtb2RpZmllZCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBXZWJQSVVwZGF0ZSwgaW4KK3BhcnRpY3VsYXIgd2hlbiB0aGUgYnVmZmVyIGlzIHJlc2l6ZWQgdG8gYWNjb21tb2RhdGUgbGFyZ2VyIGRhdGEuCisKK1RoZXNlIGZ1bmN0aW9ucyB3aWxsIHJldHVybiB0aGUgZGVjb2Rpbmcgc3RhdHVzOiBlaXRoZXIgVlA4X1NUQVRVU19TVVNQRU5ERUQgaWYKK2RlY29kaW5nIGlzIG5vdCBmaW5pc2hlZCB5ZXQgb3IgVlA4X1NUQVRVU19PSyB3aGVuIGRlY29kaW5nIGlzIGRvbmUuIEFueSBvdGhlcgorc3RhdHVzIGlzIGFuIGVycm9yIGNvbmRpdGlvbi4KKworVGhlICdpZGVjJyBvYmplY3QgbXVzdCBhbHdheXMgYmUgcmVsZWFzZWQgKGV2ZW4gdXBvbiBhbiBlcnJvciBjb25kaXRpb24pIGJ5CitjYWxsaW5nOiBXZWJQRGVsZXRlKGlkZWMpLgorCitUbyByZXRyaWV2ZSBwYXJ0aWFsbHkgZGVjb2RlZCBwaWN0dXJlIHNhbXBsZXMsIG9uZSBtdXN0IHVzZSB0aGUgY29ycmVzcG9uZGluZworbWV0aG9kOiBXZWJQSURlY0dldFJHQiBvciBXZWJQSURlY0dldFlVVkEuCitJdCB3aWxsIHJldHVybiB0aGUgbGFzdCBkaXNwbGF5YWJsZSBwaXhlbCByb3cuCisKK0xhc3RseSwgbm90ZSB0aGF0IGRlY29kaW5nIGNhbiBhbHNvIGJlIHBlcmZvcm1lZCBpbnRvIGEgcHJlLWFsbG9jYXRlZCBwaXhlbAorYnVmZmVyLiBUaGlzIGJ1ZmZlciBtdXN0IGJlIHBhc3NlZCB3aGVuIGNyZWF0aW5nIGEgV2ViUElEZWNvZGVyLCBjYWxsaW5nCitXZWJQSU5ld1JHQigpIG9yIFdlYlBJTmV3WVVWQSgpLgorCitQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIHNyYy93ZWJwL2RlY29kZS5oIGhlYWRlciBmb3IgZnVydGhlciBkZXRhaWxzLgorCitBZHZhbmNlZCBEZWNvZGluZyBBUEk6Cis9PT09PT09PT09PT09PT09PT09PT09CisKK1dlYlAgZGVjb2Rpbmcgc3VwcG9ydHMgYW4gYWR2YW5jZWQgQVBJIHdoaWNoIHByb3ZpZGVzIG9uLXRoZS1mbHkgY3JvcHBpbmcgYW5kCityZXNjYWxpbmcsIHNvbWV0aGluZyBvZiBncmVhdCB1c2VmdWxuZXNzIG9uIG1lbW9yeS1jb25zdHJhaW5lZCBlbnZpcm9ubWVudHMgbGlrZQorbW9iaWxlIHBob25lcy4gQmFzaWNhbGx5LCB0aGUgbWVtb3J5IHVzYWdlIHdpbGwgc2NhbGUgd2l0aCB0aGUgb3V0cHV0J3Mgc2l6ZSwKK25vdCB0aGUgaW5wdXQncywgd2hlbiBvbmUgb25seSBuZWVkcyBhIHF1aWNrIHByZXZpZXcgb3IgYSB6b29tZWQgaW4gcG9ydGlvbiBvZgorYW4gb3RoZXJ3aXNlIHRvby1sYXJnZSBwaWN0dXJlLiBTb21lIENQVSBjYW4gYmUgc2F2ZWQgdG9vLCBpbmNpZGVudGFsbHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOIFBTRVVETyBFWEFNUExFCisgICAgIC8vIEEpIEluaXQgYSBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgICAgIENIRUNLKFdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSk7CisKKyAgICAgLy8gQikgb3B0aW9uYWw6IHJldHJpZXZlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcy4KKyAgICAgQ0hFQ0soV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy5pbnB1dCkgPT0gVlA4X1NUQVRVU19PSyk7CisKKyAgICAgLy8gQykgQWRqdXN0ICdjb25maWcnIG9wdGlvbnMsIGlmIG5lZWRlZAorICAgICBjb25maWcub3B0aW9ucy5ub19mYW5jeV91cHNhbXBsaW5nID0gMTsKKyAgICAgY29uZmlnLm9wdGlvbnMudXNlX3NjYWxpbmcgPSAxOworICAgICBjb25maWcub3B0aW9ucy5zY2FsZWRfd2lkdGggPSBzY2FsZWRXaWR0aCgpOworICAgICBjb25maWcub3B0aW9ucy5zY2FsZWRfaGVpZ2h0ID0gc2NhbGVkSGVpZ2h0KCk7CisgICAgIC8vIGV0Yy4KKworICAgICAvLyBEKSBTcGVjaWZ5ICdjb25maWcnIG91dHB1dCBvcHRpb25zIGZvciBzcGVjaWZ5aW5nIG91dHB1dCBjb2xvcnNwYWNlLgorICAgICAvLyBPcHRpb25hbGx5IHRoZSBleHRlcm5hbCBpbWFnZSBkZWNvZGUgYnVmZmVyIGNhbiBhbHNvIGJlIHNwZWNpZmllZC4KKyAgICAgY29uZmlnLm91dHB1dC5jb2xvcnNwYWNlID0gTU9ERV9CR1JBOworICAgICAvLyBPcHRpb25hbGx5LCB0aGUgY29uZmlnLm91dHB1dCBjYW4gYmUgcG9pbnRlZCB0byBhbiBleHRlcm5hbCBidWZmZXIgYXMKKyAgICAgLy8gd2VsbCBmb3IgZGVjb2RpbmcgdGhlIGltYWdlLiBUaGlzIGV4dGVybmFsbHkgc3VwcGxpZWQgbWVtb3J5IGJ1ZmZlcgorICAgICAvLyBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBzdG9yZSB0aGUgZGVjb2RlZCBwaWN0dXJlLgorICAgICBjb25maWcub3V0cHV0LnUuUkdCQS5yZ2JhID0gKHVpbnQ4X3QqKSBtZW1vcnlfYnVmZmVyOworICAgICBjb25maWcub3V0cHV0LnUuUkdCQS5zdHJpZGUgPSBzY2FubGluZV9zdHJpZGU7CisgICAgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnNpemUgPSB0b3RhbF9zaXplX29mX3RoZV9tZW1vcnlfYnVmZmVyOworICAgICBjb25maWcub3V0cHV0LmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisKKyAgICAgLy8gRSkgRGVjb2RlIHRoZSBXZWJQIGltYWdlLiBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzIHcuci50IGRlY29kaW5nIGltYWdlLgorICAgICAvLyBUaGUgZmlyc3Qgb25lIChFLjEpIGRlY29kZXMgdGhlIGZ1bGwgaW1hZ2UgYW5kIHRoZSBzZWNvbmQgb25lIChFLjIpIGlzCisgICAgIC8vIHVzZWQgdG8gaW5jcmVtZW50YWxseSBkZWNvZGUgdGhlIGltYWdlIHVzaW5nIHNtYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgIC8vIEFueSBvbmUgb2YgdGhlc2Ugc3RlcHMgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBXZWJQIGltYWdlLgorCisgICAgIC8vIEUuMSkgRGVjb2RlIGZ1bGwgaW1hZ2UuCisgICAgIENIRUNLKFdlYlBEZWNvZGUoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnKSA9PSBWUDhfU1RBVFVTX09LKTsKKworICAgICAvLyBFLjIpIERlY29kZSBpbWFnZSBpbmNyZW1lbnRhbGx5LgorICAgICBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMgPSBXZWJQSURlY29kZShOVUxMLCBOVUxMLCAmY29uZmlnKTsKKyAgICAgQ0hFQ0soaWRlYyAhPSBOVUxMKTsKKyAgICAgd2hpbGUgKGJ5dGVzX3JlbWFpbmluZyA+IDApIHsKKyAgICAgICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFdlYlBJQXBwZW5kKGlkZWMsIGlucHV0LCBieXRlc19yZWFkKTsKKyAgICAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0sgfHwgc3RhdHVzID09IFZQOF9TVEFUVVNfU1VTUEVOREVEKSB7CisgICAgICAgICBieXRlc19yZW1haW5pbmcgLT0gYnl0ZXNfcmVhZDsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICB9CisgICAgIFdlYlBJRGVsZXRlKGlkZWMpOworCisgICAgIC8vIEYpIERlY29kZWQgaW1hZ2UgaXMgbm93IGluIGNvbmZpZy5vdXRwdXQgKGFuZCBjb25maWcub3V0cHV0LnUuUkdCQSkuCisgICAgIC8vIEl0IGNhbiBiZSBzYXZlZCwgZGlzcGxheWVkIG9yIG90aGVyd2lzZSBwcm9jZXNzZWQuCisKKyAgICAgLy8gRykgUmVjbGFpbSBtZW1vcnkgYWxsb2NhdGVkIGluIGNvbmZpZydzIG9iamVjdC4gSXQncyBzYWZlIHRvIGNhbGwKKyAgICAgLy8gdGhpcyBmdW5jdGlvbiBldmVuIGlmIHRoZSBtZW1vcnkgaXMgZXh0ZXJuYWwgYW5kIHdhc24ndCBhbGxvY2F0ZWQKKyAgICAgLy8gYnkgV2ViUERlY29kZSgpLgorICAgICBXZWJQRnJlZURlY0J1ZmZlcigmY29uZmlnLm91dHB1dCk7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBQU0VVRE8gRVhBTVBMRQorCitCdWdzOgorPT09PT0KKworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKKyAgICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgorICAgIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nLXBhdGNoZXMvCisKK0Rpc2N1c3M6Cis9PT09PT09PQorCitFbWFpbDogd2VicC1kaXNjdXNzQHdlYm1wcm9qZWN0Lm9yZworV2ViOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS93ZWJtcHJvamVjdC5vcmcvZ3JvdXAvd2VicC1kaXNjdXNzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUuY2hyb21pdW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUuY2hyb21pdW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2ExY2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLmNocm9taXVtCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTmFtZTogV2ViUCBpbWFnZSBlbmNvZGVyL2RlY29kZXIKLVNob3J0IE5hbWU6IGxpYndlYnAKLVVSTDogaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwCi1WZXJzaW9uOiB2MC4zLjEKLUxpY2Vuc2U6IEJTRAotTGljZW5zZSBGaWxlOiBMSUNFTlNFCi1TZWN1cml0eSBDcml0aWNhbDogWWVzCi0KLURlc2NyaXB0aW9uOgotU291cmNlIGFyY2hpdmU6Ci0gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC93ZWJwL2Rvd25sb2Fkcy9kZXRhaWw/bmFtZT1saWJ3ZWJwLTAuMy4xLnRhci5negotCi1XZWJQIGlzIGFuIGltYWdlIGZvcm1hdCB0aGF0IGRvZXMgYm90aCBsb3NzeSBhbmQgbG9zc2xlc3MgY29tcHJlc3Npb24gb2YKLWRpZ2l0YWwgcGhvdG9ncmFwaGljIGltYWdlcy4gV2ViUCBjb25zaXN0cyBvZiBhIGNvZGVjIGJhc2VkIG9uIFZQOCwgdGhhdCBHb29nbGUKLW9wZW4tc291cmNlZCBpbiBNYXkgMjAxMCBhbmQgYSBjb250YWluZXIgYmFzZWQgb24gUklGRi4gV2VibWFzdGVycywgd2ViCi1kZXZlbG9wZXJzIGFuZCBicm93c2VyIGRldmVsb3BlcnMgY2FuIHVzZSBXZWJQIHRvIGNvbXByZXNzLCBhcmNoaXZlIGFuZAotZGlzdHJpYnV0ZSBkaWdpdGFsIGltYWdlcyBtb3JlIGVmZmljaWVudGx5LgotCi1Mb2NhbCBjaGFuZ2VzOgotICogUmVtb3ZlZCBleGFtcGxlcy8sIGRvY3VtZW50YXRpb24gYW5kIGJ1aWxkIHJlbGF0ZWQgZmlsZXMsIGtlZXBpbmcgb25seQotICAgdGhlIGNvbnRlbnRzIG9mIHNyYy8gbGVzcyBtdXgvIHdoaWNoIGlzIHVudXNlZC4KLSAqIE1lcmdlZCBDT1BZSU5HL1BBVEVOVFMgdG8gTElDRU5TRQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLm11eCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5tdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0ZjkyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5tdXgKQEAgLTAsMCArMSwyMjcgQEAKK++7vyAgICAgICAgICBfXyAgIF9fICBfX19fICBfX19fICBfX19fICBfXyBfXyAgXyAgICAgX18gX18KKyAgICAgICAgIC8gIFxcLyAgXC8gIF8gXC8gIF8gXC8gIF8gXC8gIFwgIFwvIFxfX18vXyAvIF9cCisgICAgICAgICBcICAgICAgIC8gICBfXy8gIF8gIFwgICBfXy8gICAgICAvICAvICAoXy8gIC9fXworICAgICAgICAgIFxfX1xfXy9cX19fX18vX19fX18vX18vICBcX18vL18vXF9fX19fL19fL19fXy92MS4wLjAKKworCitEZXNjcmlwdGlvbjoKKz09PT09PT09PT09PQorCitXZWJQTXV4OiBzZXQgb2YgdHdvIGxpYnJhcmllcyAnTXV4JyBhbmQgJ0RlbXV4JyBmb3IgY3JlYXRpb24sIGV4dHJhY3Rpb24gYW5kCittYW5pcHVsYXRpb24gb2YgYW4gZXh0ZW5kZWQgZm9ybWF0IFdlYlAgZmlsZSwgd2hpY2ggY2FuIGhhdmUgZmVhdHVyZXMgbGlrZQorY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEgYW5kIGFuaW1hdGlvbi4gUmVmZXJlbmNlIGNvbW1hbmQtbGluZSB0b29scyAnd2VicG11eCcKK2FuZCAndndlYnAnIGFzIHdlbGwgYXMgdGhlIFdlYlAgY29udGFpbmVyIHNwZWNpZmljYXRpb24KKydkb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQnIGFyZSBhbHNvIHByb3ZpZGVkIGluIHRoaXMgcGFja2FnZS4KKworV2ViUCBNdXggdG9vbDoKKz09PT09PT09PT09PT09CisKK1RoZSBleGFtcGxlcy8gZGlyZWN0b3J5IGNvbnRhaW5zIGEgdG9vbCAod2VicG11eCkgZm9yIG1hbmlwdWxhdGluZyBXZWJQCitmaWxlcy4gVGhlIHdlYnBtdXggdG9vbCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gZXh0ZW5kZWQgZm9ybWF0IFdlYlAgZmlsZSBhbmQKK2Fsc28gdG8gZXh0cmFjdCBvciBzdHJpcCByZWxldmFudCBkYXRhIGZyb20gc3VjaCBhIGZpbGUuCisKK0EgbGlzdCBvZiBvcHRpb25zIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgLWhlbHAgY29tbWFuZCBsaW5lIGZsYWc6CisKKz4gd2VicG11eCAtaGVscAorVXNhZ2U6IHdlYnBtdXggLWdldCBHRVRfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVQKKyAgICAgICB3ZWJwbXV4IC1zZXQgU0VUX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUCisgICAgICAgd2VicG11eCAtZHVyYXRpb24gRFVSQVRJT05fT1BUSU9OUyBbLWR1cmF0aW9uIC4uLl0KKyAgICAgICAgICAgICAgIElOUFVUIC1vIE9VVFBVVAorICAgICAgIHdlYnBtdXggLXN0cmlwIFNUUklQX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUCisgICAgICAgd2VicG11eCAtZnJhbWUgRlJBTUVfT1BUSU9OUyBbLWZyYW1lLi4uXSBbLWxvb3AgTE9PUF9DT1VOVF0KKyAgICAgICAgICAgICAgIFstYmdjb2xvciBCQUNLR1JPVU5EX0NPTE9SXSAtbyBPVVRQVVQKKyAgICAgICB3ZWJwbXV4IC1pbmZvIElOUFVUCisgICAgICAgd2VicG11eCBbLWh8LWhlbHBdCisgICAgICAgd2VicG11eCAtdmVyc2lvbgorICAgICAgIHdlYnBtdXggYXJndW1lbnRfZmlsZV9uYW1lCisKK0dFVF9PUFRJT05TOgorIEV4dHJhY3QgcmVsZXZhbnQgZGF0YToKKyAgIGljYyAgICAgICBnZXQgSUNDIHByb2ZpbGUKKyAgIGV4aWYgICAgICBnZXQgRVhJRiBtZXRhZGF0YQorICAgeG1wICAgICAgIGdldCBYTVAgbWV0YWRhdGEKKyAgIGZyYW1lIG4gICBnZXQgbnRoIGZyYW1lCisKK1NFVF9PUFRJT05TOgorIFNldCBjb2xvciBwcm9maWxlL21ldGFkYXRhOgorICAgaWNjICBmaWxlLmljYyAgICAgc2V0IElDQyBwcm9maWxlCisgICBleGlmIGZpbGUuZXhpZiAgICBzZXQgRVhJRiBtZXRhZGF0YQorICAgeG1wICBmaWxlLnhtcCAgICAgc2V0IFhNUCBtZXRhZGF0YQorICAgd2hlcmU6ICAgICdmaWxlLmljYycgY29udGFpbnMgdGhlIElDQyBwcm9maWxlIHRvIGJlIHNldCwKKyAgICAgICAgICAgICAnZmlsZS5leGlmJyBjb250YWlucyB0aGUgRVhJRiBtZXRhZGF0YSB0byBiZSBzZXQKKyAgICAgICAgICAgICAnZmlsZS54bXAnIGNvbnRhaW5zIHRoZSBYTVAgbWV0YWRhdGEgdG8gYmUgc2V0CisKK0RVUkFUSU9OX09QVElPTlM6CisgU2V0IGR1cmF0aW9uIG9mIHNlbGVjdGVkIGZyYW1lczoKKyAgIGR1cmF0aW9uICAgICAgICAgICAgc2V0IGR1cmF0aW9uIGZvciBlYWNoIGZyYW1lcworICAgZHVyYXRpb24sZnJhbWUgICAgICBzZXQgZHVyYXRpb24gb2YgYSBwYXJ0aWN1bGFyIGZyYW1lCisgICBkdXJhdGlvbixzdGFydCxlbmQgIHNldCBkdXJhdGlvbiBvZiBmcmFtZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCBbc3RhcnQsZW5kXSkKKyAgIHdoZXJlOiAnZHVyYXRpb24nIGlzIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAnc3RhcnQnIGlzIHRoZSBzdGFydCBmcmFtZSBpbmRleAorICAgICAgICAgICdlbmQnIGlzIHRoZSBpbmNsdXNpdmUgZW5kIGZyYW1lIGluZGV4CisgICAgICAgICAgIFRoZSBzcGVjaWFsICdlbmQnIHZhbHVlICcwJyBtZWFuczogbGFzdCBmcmFtZS4KKworU1RSSVBfT1BUSU9OUzoKKyBTdHJpcCBjb2xvciBwcm9maWxlL21ldGFkYXRhOgorICAgaWNjICAgICAgIHN0cmlwIElDQyBwcm9maWxlCisgICBleGlmICAgICAgc3RyaXAgRVhJRiBtZXRhZGF0YQorICAgeG1wICAgICAgIHN0cmlwIFhNUCBtZXRhZGF0YQorCitGUkFNRV9PUFRJT05TKGkpOgorIENyZWF0ZSBhbmltYXRpb246CisgICBmaWxlX2kgK2RpK1t4aSt5aVsrbWlbYmldXV0KKyAgIHdoZXJlOiAgICAnZmlsZV9pJyBpcyB0aGUgaSd0aCBhbmltYXRpb24gZnJhbWUgKFdlYlAgZm9ybWF0KSwKKyAgICAgICAgICAgICAnZGknIGlzIHRoZSBwYXVzZSBkdXJhdGlvbiBiZWZvcmUgbmV4dCBmcmFtZSwKKyAgICAgICAgICAgICAneGknLCd5aScgc3BlY2lmeSB0aGUgaW1hZ2Ugb2Zmc2V0IGZvciB0aGlzIGZyYW1lLAorICAgICAgICAgICAgICdtaScgaXMgdGhlIGRpc3Bvc2UgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgwIG9yIDEpLAorICAgICAgICAgICAgICdiaScgaXMgdGhlIGJsZW5kaW5nIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoK2Igb3IgLWIpCisKK0xPT1BfQ09VTlQ6CisgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uLgorIFZhbGlkIHJhbmdlIGlzIDAgdG8gNjU1MzUgW0RlZmF1bHQ6IDAgKGluZmluaXRlKV0uCisKK0JBQ0tHUk9VTkRfQ09MT1I6CisgQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLgorICBBLFIsRyxCCisgIHdoZXJlOiAgICAnQScsICdSJywgJ0cnIGFuZCAnQicgYXJlIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDI1NSBzcGVjaWZ5aW5nCisgICAgICAgICAgICB0aGUgQWxwaGEsIFJlZCwgR3JlZW4gYW5kIEJsdWUgY29tcG9uZW50IHZhbHVlcyByZXNwZWN0aXZlbHkKKyAgICAgICAgICAgIFtEZWZhdWx0OiAyNTUsMjU1LDI1NSwyNTVdCisKK0lOUFVUICYgT1VUUFVUIGFyZSBpbiBXZWJQIGZvcm1hdC4KKworTm90ZTogVGhlIG5hdHVyZSBvZiBFWElGLCBYTVAgYW5kIElDQyBkYXRhIGlzIG5vdCBjaGVja2VkIGFuZCBpcyBhc3N1bWVkIHRvIGJlCit2YWxpZC4KKworTm90ZTogaWYgYSBzaW5nbGUgZmlsZSBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgYXJndW1lbnQsIHRoZSBhcmd1bWVudHMgd2lsbCBiZQordG9rZW5pemVkIGZyb20gdGhpcyBmaWxlLiBUaGUgZmlsZSBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggdGhlIGNoYXJhY3RlciAnLScuCisKK1Zpc3VhbGl6YXRpb24gdG9vbDoKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIGV4YW1wbGVzLyBkaXJlY3RvcnkgYWxzbyBjb250YWlucyBhIHRvb2wgKHZ3ZWJwKSBmb3Igdmlld2luZyBXZWJQIGZpbGVzLgorSXQgZGVjb2RlcyB0aGUgaW1hZ2UgYW5kIHZpc3VhbGl6ZXMgaXQgdXNpbmcgT3BlbkdMLiBTZWUgdGhlIGxpYndlYnAgUkVBRE1FCitmb3IgZGV0YWlscyBvbiBidWlsZGluZyBhbmQgcnVubmluZyB0aGlzIHByb2dyYW0uCisKK011eCBBUEk6Cis9PT09PT09PQorVGhlIE11eCBBUEkgY29udGFpbnMgbWV0aG9kcyBmb3IgYWRkaW5nIGRhdGEgdG8gYW5kIHJlYWRpbmcgZGF0YSBmcm9tIFdlYlAKK2ZpbGVzLiBUaGlzIEFQSSBjdXJyZW50bHkgc3VwcG9ydHMgWE1QL0VYSUYgbWV0YWRhdGEsIElDQyBwcm9maWxlIGFuZCBhbmltYXRpb24uCitPdGhlciBmZWF0dXJlcyBtYXkgYmUgYWRkZWQgaW4gc3Vic2VxdWVudCByZWxlYXNlcy4KKworRXhhbXBsZSMxIChwc2V1ZG8gY29kZSk6IENyZWF0aW5nIGEgV2ViUE11eCBvYmplY3Qgd2l0aCBpbWFnZSBkYXRhLCBjb2xvcgorcHJvZmlsZSBhbmQgWE1QIG1ldGFkYXRhLgorCisgIGludCBjb3B5X2RhdGEgPSAwOworICBXZWJQTXV4KiBtdXggPSBXZWJQTXV4TmV3KCk7CisgIC8vIC4uLiAoUHJlcGFyZSBpbWFnZSBkYXRhKS4KKyAgV2ViUE11eFNldEltYWdlKG11eCwgJmltYWdlLCBjb3B5X2RhdGEpOworICAvLyAuLi4gKFByZXBhcmUgSUNDIHByb2ZpbGUgZGF0YSkuCisgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlLCBjb3B5X2RhdGEpOworICAvLyAuLi4gKFByZXBhcmUgWE1QIG1ldGFkYXRhKS4KKyAgV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wLCBjb3B5X2RhdGEpOworICAvLyBHZXQgZGF0YSBmcm9tIG11eCBpbiBXZWJQIFJJRkYgZm9ybWF0LgorICBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIC8vIC4uLiAoQ29uc3VtZSBvdXRwdXRfZGF0YTsgZS5nLiB3cml0ZSBvdXRwdXRfZGF0YS5ieXRlcyB0byBmaWxlKS4KKyAgV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOworCisKK0V4YW1wbGUjMiAocHNldWRvIGNvZGUpOiBHZXQgaW1hZ2UgYW5kIGNvbG9yIHByb2ZpbGUgZGF0YSBmcm9tIGEgV2ViUCBmaWxlLgorCisgIGludCBjb3B5X2RhdGEgPSAwOworICAvLyAuLi4gKFJlYWQgZGF0YSBmcm9tIGZpbGUpLgorICBXZWJQTXV4KiBtdXggPSBXZWJQTXV4Q3JlYXRlKCZkYXRhLCBjb3B5X2RhdGEpOworICBXZWJQTXV4R2V0RnJhbWUobXV4LCAxLCAmaW1hZ2UpOworICAvLyAuLi4gKENvbnN1bWUgaW1hZ2U7IGUuZy4gY2FsbCBXZWJQRGVjb2RlKCkgdG8gZGVjb2RlIHRoZSBkYXRhKS4KKyAgV2ViUE11eEdldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUpOworICAvLyAuLi4gKENvbnN1bWUgaWNjX3Byb2ZpbGUpLgorICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIGZyZWUoZGF0YSk7CisKKworRm9yIGEgZGV0YWlsZWQgTXV4IEFQSSByZWZlcmVuY2UsIHBsZWFzZSByZWZlciB0byB0aGUgaGVhZGVyIGZpbGUKKyhzcmMvd2VicC9tdXguaCkuCisKK0RlbXV4IEFQSToKKz09PT09PT09PT0KK1RoZSBEZW11eCBBUEkgZW5hYmxlcyBleHRyYWN0aW9uIG9mIGltYWdlcyBhbmQgZXh0ZW5kZWQgZm9ybWF0IGRhdGEgZnJvbQorV2ViUCBmaWxlcy4gVGhpcyBBUEkgY3VycmVudGx5IHN1cHBvcnRzIHJlYWRpbmcgb2YgWE1QL0VYSUYgbWV0YWRhdGEsIElDQworcHJvZmlsZSBhbmQgYW5pbWF0ZWQgaW1hZ2VzLiBPdGhlciBmZWF0dXJlcyBtYXkgYmUgYWRkZWQgaW4gc3Vic2VxdWVudAorcmVsZWFzZXMuCisKK0NvZGUgZXhhbXBsZTogRGVtdXhpbmcgV2ViUCBkYXRhIHRvIGV4dHJhY3QgYWxsIHRoZSBmcmFtZXMsIElDQyBwcm9maWxlCithbmQgRVhJRi9YTVAgbWV0YWRhdGEuCisKKyAgV2ViUERlbXV4ZXIqIGRlbXV4ID0gV2ViUERlbXV4KCZ3ZWJwX2RhdGEpOworICB1aW50MzJfdCB3aWR0aCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKKyAgdWludDMyX3QgaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKKyAgLy8gLi4uIChHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZlYXR1cmVzIHByZXNlbnQgaW4gdGhlIFdlYlAgZmlsZSkuCisgIHVpbnQzMl90IGZsYWdzID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpOworCisgIC8vIC4uLiAoSXRlcmF0ZSBvdmVyIGFsbCBmcmFtZXMpLgorICBXZWJQSXRlcmF0b3IgaXRlcjsKKyAgaWYgKFdlYlBEZW11eEdldEZyYW1lKGRlbXV4LCAxLCAmaXRlcikpIHsKKyAgICBkbyB7CisgICAgICAvLyAuLi4gKENvbnN1bWUgJ2l0ZXInOyBlLmcuIERlY29kZSAnaXRlci5mcmFnbWVudCcgd2l0aCBXZWJQRGVjb2RlKCksCisgICAgICAvLyAuLi4gYW5kIGdldCBvdGhlciBmcmFtZSBwcm9wZXJ0aWVzIGxpa2Ugd2lkdGgsIGhlaWdodCwgb2Zmc2V0cyBldGMuCisgICAgICAvLyAuLi4gc2VlICdzdHJ1Y3QgV2ViUEl0ZXJhdG9yJyBiZWxvdyBmb3IgbW9yZSBpbmZvKS4KKyAgICB9IHdoaWxlIChXZWJQRGVtdXhOZXh0RnJhbWUoJml0ZXIpKTsKKyAgICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJml0ZXIpOworICB9CisKKyAgLy8gLi4uIChFeHRyYWN0IG1ldGFkYXRhKS4KKyAgV2ViUENodW5rSXRlcmF0b3IgY2h1bmtfaXRlcjsKKyAgaWYgKGZsYWdzICYgSUNDUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIklDQ1AiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgSUNDIHByb2ZpbGUgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBpZiAoZmxhZ3MgJiBFWElGX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiRVhJRiIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBFWElGIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgaWYgKGZsYWdzICYgWE1QX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiWE1QICIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBYTVAgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBXZWJQRGVtdXhEZWxldGUoZGVtdXgpOworCisKK0ZvciBhIGRldGFpbGVkIERlbXV4IEFQSSByZWZlcmVuY2UsIHBsZWFzZSByZWZlciB0byB0aGUgaGVhZGVyIGZpbGUKKyhzcmMvd2VicC9kZW11eC5oKS4KKworQW5pbUVuY29kZXIgQVBJOgorPT09PT09PT09PT09PT09PQorVGhlIEFuaW1FbmNvZGVyIEFQSSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5pbWF0ZWQgV2ViUCBpbWFnZXMuCisKK0NvZGUgZXhhbXBsZToKKworICBXZWJQQW5pbUVuY29kZXJPcHRpb25zIGVuY19vcHRpb25zOworICBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdCgmZW5jX29wdGlvbnMpOworICAvLyAuLi4gKFR1bmUgJ2VuY19vcHRpb25zJyBhcyBuZWVkZWQpLgorICBXZWJQQW5pbUVuY29kZXIqIGVuYyA9IFdlYlBBbmltRW5jb2Rlck5ldyh3aWR0aCwgaGVpZ2h0LCAmZW5jX29wdGlvbnMpOworICB3aGlsZSg8dGhlcmUgYXJlIG1vcmUgZnJhbWVzPikgeworICAgIFdlYlBDb25maWcgY29uZmlnOworICAgIFdlYlBDb25maWdJbml0KCZjb25maWcpOworICAgIC8vIC4uLiAoVHVuZSAnY29uZmlnJyBhcyBuZWVkZWQpLgorICAgIFdlYlBBbmltRW5jb2RlckFkZChlbmMsIGZyYW1lLCBkdXJhdGlvbiwgJmNvbmZpZyk7CisgIH0KKyAgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoZW5jLCB3ZWJwX2RhdGEpOworICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKyAgLy8gLi4uIChXcml0ZSB0aGUgJ3dlYnBfZGF0YScgdG8gYSBmaWxlLCBvciByZS1tdXggaXQgZnVydGhlcikuCisKKworRm9yIGEgZGV0YWlsZWQgQW5pbUVuY29kZXIgQVBJIHJlZmVyZW5jZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBoZWFkZXIgZmlsZQorKHNyYy93ZWJwL211eC5oKS4KKworCitCdWdzOgorPT09PT0KKworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKKyAgICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgorICAgIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nLXBhdGNoZXMvCisKK0Rpc2N1c3M6Cis9PT09PT09PQorCitFbWFpbDogd2VicC1kaXNjdXNzQHdlYm1wcm9qZWN0Lm9yZworV2ViOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS93ZWJtcHJvamVjdC5vcmcvZ3JvdXAvd2VicC1kaXNjdXNzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUud2VicF9qcyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS53ZWJwX2pzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDUzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUud2VicF9qcwpAQCAtMCwwICsxLDc2IEBACisgICAgIF9fICAgX18gX19fXyBfX19fIF9fX18gICAgIF9fICBfX19fCisgICAgLyAgXFwvICBcICBfIFwgIF8gXCAgXyBcICAgKF9fKS8gIF9fXAorICAgIFwgICAgICAgLyAgX18vIF8gIFwgIF9fLyAgIF8pICBcXyAgIFwKKyAgICAgXF9fXF9fL19fX19fL19fX18vXy8gICAgIC9fX19fL19fX18vCisKK0Rlc2NyaXB0aW9uOgorPT09PT09PT09PT09CisKK1RoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGNvbXBpbGF0aW9uIG9mIGxpYndlYnAgaW50byBhIEphdmFTY3JpcHQgZGVjb2RlcgordXNpbmcgRW1zY3JpcHRlbiBhbmQgQ01ha2UuCisKKyAtIGluc3RhbGwgdGhlIEVtc2NyaXB0ZW4gU0RLIGZvbGxvd2luZyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBhdDoKKyAgIGh0dHBzOi8va3JpcGtlbi5naXRodWIuaW8vZW1zY3JpcHRlbi1zaXRlL2RvY3MvZ2V0dGluZ19zdGFydGVkL2Rvd25sb2Fkcy5odG1sCisgICBBZnRlciBpbnN0YWxsYXRpb24sIHlvdSBzaG91bGQgaGF2ZSBzb21lIGdsb2JhbCB2YXJpYWJsZSBwb3NpdGlvbmVkIHRvIHRoZQorICAgbG9jYXRpb24gb2YgdGhlIFNESy4gSW4gcGFydGljdWxhciwgJEVNU0NSSVBURU4gc2hvdWxkIHBvaW50IHRvIHRoZQorICAgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIEVtc2NyaXB0ZW4gdG9vbHMuCisKKyAtIG1ha2Ugc3VyZSB0aGUgZmlsZSAkRU1TQ1JJUFRFTi9jbWFrZS9Nb2R1bGVzL1BsYXRmb3JtL0Vtc2NyaXB0ZW4uY21ha2UgaXMKKyAgIGFjY2Vzc2libGUuIFRoaXMgaXMgdGhlIHRvb2xjaGFpbiBmaWxlIHVzZWQgYnkgQ01ha2UgdG8gaW52b2tlIEVtc2NyaXB0ZW4uCisKKyAtIGNvbmZpZ3VyZSB0aGUgcHJvamVjdCAnV0VCUF9KUycgd2l0aCBDTWFrZSB1c2luZzoKKworIGNkIHdlYnBfanMgJiYgXAorIGNtYWtlIC1EV0VCUF9CVUlMRF9XRUJQX0pTPU9OIFwKKyAgICAgICAtREVNU0NSSVBURU5fR0VORVJBVEVfQklUQ09ERV9TVEFUSUNfTElCUkFSSUVTPTEgXAorICAgICAgIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9JEVNU0NSSVBURU4vY21ha2UvTW9kdWxlcy9QbGF0Zm9ybS9FbXNjcmlwdGVuLmNtYWtlIFwKKyAgICAgICAuLi8KKworIC0gY29tcGlsZSB3ZWJwLmpzIHVzaW5nICdtYWtlJy4KKworIC0gdGhhdCdzIGl0ISBVcG9uIGNvbXBsZXRpb24sIHlvdSBzaG91bGQgaGF2ZSB0aGUgd2VicC5qcyBhbmQKKyAgIHdlYnAuanMubWVtIGZpbGVzIGdlbmVyYXRlZC4KKworVGhlIGNhbGxhYmxlIEphdmFTY3JpcHQgZnVuY3Rpb24gaXMgV2ViUFRvU0RMKCksIHdoaWNoIGRlY29kZXMgYSByYXcgV2ViUAorYml0c3RyZWFtIGludG8gYSBjYW52YXMuIFNlZSB3ZWJwX2pzL2luZGV4Lmh0bWwgZm9yIGEgc2ltcGxlIHVzYWdlIHNhbXBsZQorKHNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zKS4KKworRGVtbyBIVE1MIHBhZ2U6Cis9PT09PT09PT09PT09PT0KKworICAgVGhlIEhUTUwgcGFnZSB3ZWJwX2pzL2luZGV4Lmh0bWwgcmVxdWlyZXMgYW4gSFRUUCBzZXJ2ZXIgdG8gc2VydmUgdGhlIFdlYlAKKyAgIGltYWdlIGV4YW1wbGUuIEl0J3MgZWFzeSB0byBqdXN0IHVzZSBQeXRob24gZm9yIHRoYXQuCisKK2NkIHdlYnBfanMgJiYgcHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgODA4MAorCithbmQgdGhlbiBuYXZpZ2F0ZSB0byBodHRwOi8vbG9jYWxob3N0OjgwODAgaW4geW91ciBmYXZvcml0ZSBicm93c2VyLgorCisKK1dlYi1Bc3NlbWJseSAoV0FTTSkgdmVyc2lvbjoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBDTWFrZUxpc3RzLnR4dCBpcyBjb25maWd1cmVkIHRvIGJ1aWxkIHRoZSBXQVNNIHZlcnNpb24gd2hlbiB1c2luZworICB0aGUgb3B0aW9uIFdFQlBfQlVJTERfV0VCUF9KUz1PTi4gVGhlIGNvbXBpbGF0aW9uIHN0ZXAgd2lsbCBhc3NlbWJsZQorICB0aGUgZmlsZXMgJ3dlYnBfd2FzbS5qcycsICd3ZWJwX3dhc20ud2FzbScgaW4gdGhlIHdlYnBfanMvIGRpcmVjdG9yeS4KKyAgU2VlIHdlYnBfanMvaW5kZXhfd2FzbS5odG1sIGZvciBhIHNpbXBsZSBkZW1vIHBhZ2UgdXNpbmcgdGhlIFdBU00gdmVyc2lvbgorICBvZiB0aGUgbGlicmFyeS4KKworICBZb3Ugd2lsbCBuZWVkIGEgZmFpcmx5IHJlY2VudCB2ZXJzaW9uIG9mIEVtc2NyaXB0ZW4gKGF0IGxlYXN0IDEuMzcuOCkgYW5kIG9mCisgIHlvdXIgV0FTTS1lbmFibGVkIGJyb3dzZXIgdG8gcnVuIHRoaXMgdmVyc2lvbi4gQ29uc2lkZXIgaXQgdmVyeSBleHBlcmltZW50YWwhCisKK0NhdmVhdDoKKz09PT09PT0KKworICAtIEZpcnN0IGRlY29kaW5nIHVzaW5nIHRoZSBsaWJyYXJ5IGlzIHVzdWFsbHkgc2xvd2VyLCBkdWUgdG8ganVzdC1pbi10aW1lCisgICAgY29tcGlsYXRpb24uCisKKyAgLSBTb21lIHZlcnNpb25zIG9mIGxsdm0gcHJvZHVjZSB0aGUgZm9sbG93aW5nIGNvbXBpbGUgZXJyb3Igd2hlbiBTU0UyIGlzCisgICAgZW5hYmxlZC4KKworIlVuc3VwcG9ydGVkOiAgICU1MTYgPSBiaXRjYXN0IDw4IHggaTE2PiAlNDgxIHRvIGkxMjgKKyBMTFZNIEVSUk9SOiBCaXRDYXN0IEluc3RydWN0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBpbnRlZ2VyIHR5cGVzIGxhcmdlciB0aGFuIDY0IGJpdHMiCisKKyAgICBUaGUgY29ycmVzcG9uZGluZyBFbXNjcmlwdGVuIGJ1ZyBpcyBhdDoKKyAgICBodHRwczovL2dpdGh1Yi5jb20va3JpcGtlbi9lbXNjcmlwdGVuL2lzc3Vlcy8zNzg4CisKKyAgICBUaGVyZWZvcmUsIFNTRTIgb3B0aW1pemF0aW9uIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBpbiBDTWFrZUxpc3RzLnR4dC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2F1dG9nZW4uc2ggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlZjliYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9hdXRvZ2VuLnNoCkBAIC0wLDAgKzEsMiBAQAorIyEgL2Jpbi9zaCAtZQorZXhlYyBhdXRvcmVjb25mIC1maQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYnVpbGQuZ3JhZGxlIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWQxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSw0MzkgQEAKKy8vIERlZmluZSBkZXBlbmRlbmNpZXMuCitidWlsZHNjcmlwdCB7CisgIHJlcG9zaXRvcmllcyB7CisgICAgbWF2ZW4geworICAgICAgdXJsICJodHRwczovL2pjZW50ZXIuYmludHJheS5jb20iCisgICAgfQorICB9CisgIGRlcGVuZGVuY2llcyB7CisgICAgY2xhc3NwYXRoICJjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6JHtBTkRST0lEX0dSQURMRV9QTFVHSU5fVkVSU0lPTn0iCisgIH0KK30KKworLy8gRGVmaW5lIHZlcnNpb25zIGluIHRoZSBwcm9qZWN0LgorcHJvamVjdC5leHQgeworICBidWlsZFRvb2xzVmVyc2lvbiA9ICIke0JVSUxEX1RPT0xTX1ZFUlNJT059IgorICBjb21waWxlU2RrVmVyc2lvbiA9IENPTVBJTEVfU0RLX1ZFUlNJT04udG9JbnRlZ2VyKCkKK30KKworLy8gQ29yZSBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzLgorYXBwbHkgcGx1Z2luOiAiYyIKK2RlZiBORU9OCittb2RlbCB7CisgIGJ1aWxkVHlwZXMgeworICAgIGRlYnVnCisgICAgcmVsZWFzZQorICB9CisgIHBsYXRmb3JtcyB7CisgICAgYXJtIHsKKyAgICAgIGFyY2hpdGVjdHVyZSAiYXJtIgorICAgIH0KKyAgICBhcm02NCB7CisgICAgICBhcmNoaXRlY3R1cmUgImFybTY0IgorICAgIH0KKyAgICB4ODYgeworICAgICAgYXJjaGl0ZWN0dXJlICJ4ODYiCisgICAgfQorICAgIHg2NCB7CisgICAgICBhcmNoaXRlY3R1cmUgIng4Nl82NCIKKyAgICB9CisgICAgbWlwczMycjIKKyAgICBtaXBzMzJyNQorICAgIG1pcHM2NHI2CisgIH0KKyAgdG9vbENoYWlucyB7CisgICAgZ2NjKEdjYykgeworICAgICAgdGFyZ2V0KCJtaXBzMzJyMiIpIHsKKyAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1taXBzMzJyMiIKKyAgICAgIH0KKyAgICAgIHRhcmdldCgibWlwczMycjUiKSB7CisgICAgICAgIGNDb21waWxlci5hcmdzICItbWlwczMycjUiCisgICAgICB9CisgICAgICB0YXJnZXQoIm1pcHM2NHI2IikgeworICAgICAgICBjQ29tcGlsZXIuYXJncyAiLW1pcHM2NHI2IgorICAgICAgfQorICAgIH0KKyAgfQorICBiaW5hcmllcyB7CisgICAgYWxsIHsKKyAgICAgIGlmICh0b29sQ2hhaW4gaW4gR2NjKSB7CisgICAgICAgIGNDb21waWxlci5hcmdzICItZlBJQyIKKyAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1XYWxsIgorICAgICAgICBjQ29tcGlsZXIuZGVmaW5lICJBTkRST0lEIgorICAgICAgICBjQ29tcGlsZXIuZGVmaW5lICJIQVZFX01BTExPQ19IIgorICAgICAgfQorICAgICAgLy8gT3B0aW1pemF0aW9ucy4KKyAgICAgIGlmIChidWlsZFR5cGUgPT0gYnVpbGRUeXBlcy5yZWxlYXNlKSB7CisgICAgICAgIGlmICh0b29sQ2hhaW4gaW4gR2NjKSB7CisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1maW5saW5lLWZ1bmN0aW9ucyIKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZmYXN0LW1hdGgiCisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1mZnVuY3Rpb24tc2VjdGlvbnMiCisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1mZGF0YS1zZWN0aW9ucyIKKyAgICAgICAgfQorICAgICAgICBpZiAodG9vbENoYWluIGluIENsYW5nKSB7CisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1mcmVuYW1lLXJlZ2lzdGVycyAtcyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gbWlwczMyIGZhaWxzIHRvIGJ1aWxkIHdpdGggY2xhbmcgZnJvbSByMTRiCisgICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicC9pc3N1ZXMvZGV0YWlsP2lkPTM0MworICAgICAgaWYgKHRvb2xDaGFpbiBpbiBDbGFuZykgeworICAgICAgICBpZiAoZ2V0VGFyZ2V0UGxhdGZvcm0oKSA9PSAibWlwcyIpIHsKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLW5vLWludGVncmF0ZWQtYXMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIENoZWNrIGZvciBORU9OIHVzYWdlLgorICAgICAgaWYgKGdldFRhcmdldFBsYXRmb3JtKCkgPT0gImFybSIpIHsKKyAgICAgICAgTkVPTiA9ICJjLm5lb24iCisgICAgICAgIGNDb21waWxlci5kZWZpbmUgIkhBVkVfQ1BVX0ZFQVRVUkVTX0giCisgICAgICB9IGVsc2UgeworICAgICAgICBORU9OID0gImMiCisgICAgICB9CisKKyAgICAgIGNDb21waWxlci5hcmdzICItSSIgKyBmaWxlKCIuIikuYWJzb2x1dGVQYXRoCisgICAgfQorICAgIC8vIExpbmsgdG8gcHRocmVhZCBmb3Igc2hhcmVkIGxpYnJhcmllcy4KKyAgICB3aXRoVHlwZShTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgeworICAgICAgaWYgKHRvb2xDaGFpbiBpbiBHY2MpIHsKKyAgICAgICAgY0NvbXBpbGVyLmRlZmluZSAiSEFWRV9QVEhSRUFEIgorICAgICAgICBjQ29tcGlsZXIuZGVmaW5lICJXRUJQX1VTRV9USFJFQUQiCisgICAgICAgIGxpbmtlci5hcmdzICItcHRocmVhZCIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgY29tcG9uZW50cyB7CisgICAgd2VicChOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgInNyYy9kZWMiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImJ1ZmZlcl9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZyYW1lX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaWRlY19kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImlvX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicXVhbnRfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ0cmVlX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidnA4X2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidnA4bF9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIndlYnBfZGVjLmMiCisgICAgICAgICAgICBzcmNEaXIgInNyYy9kc3AiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9wcm9jZXNzaW5nLmMiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9wcm9jZXNzaW5nX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNwdS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfY2xpcF90YWJsZXMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX3NzZTQxLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyc19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyc19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzcy5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl9taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl9tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl9zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZ19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZ19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nX3NzZTQxLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ5dXYuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1dl9taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1dl9taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2X25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJ5dXZfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2X3NzZTQxLmMiCisgICAgICAgICAgICBzcmNEaXIgInNyYy91dGlscyIKKyAgICAgICAgICAgIGluY2x1ZGUgImJpdF9yZWFkZXJfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvbG9yX2NhY2hlX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJodWZmbWFuX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJxdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyYW5kb21fdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ0aHJlYWRfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInV0aWxzLmMiCisgICAgICAgICAgICBzcmNEaXIgInNyYy9kc3AiCisgICAgICAgICAgICBpbmNsdWRlICJjb3N0LmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb3N0X21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29zdF9taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29zdF9zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19hdngyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19zc2U0MS5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19zc2U0MS5jIgorICAgICAgICAgICAgaW5jbHVkZSAic3NpbS5jIgorICAgICAgICAgICAgaW5jbHVkZSAic3NpbV9zc2UyLmMiCisgICAgICAgICAgICBzcmNEaXIgInNyYy9lbmMiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFuYWx5c2lzX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvbmZpZ19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvc3RfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmcmFtZV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImhpc3RvZ3JhbV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIml0ZXJhdG9yX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAibmVhcl9sb3NzbGVzc19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBpY3R1cmVfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwaWN0dXJlX2NzcF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBpY3R1cmVfcHNucl9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBpY3R1cmVfcmVzY2FsZV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBpY3R1cmVfdG9vbHNfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwcmVkaWN0b3JfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJxdWFudF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInN5bnRheF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInRva2VuX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidHJlZV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInZwOGxfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ3ZWJwX2VuYy5jIgorICAgICAgICAgICAgc3JjRGlyICJzcmMvdXRpbHMiCisgICAgICAgICAgICBpbmNsdWRlICJiaXRfd3JpdGVyX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJodWZmbWFuX2VuY29kZV91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicXVhbnRfbGV2ZWxzX3V0aWxzLmMiCisgICAgICAgICAgfQorICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7CisgICAgICAgICAgICBzcmNEaXIgInNyYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB3ZWJwZGVtdXgoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICJzcmMvZGVtdXgiCisgICAgICAgICAgICBpbmNsdWRlICJhbmltX2RlY29kZS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVtdXguYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB3ZWJwbXV4KE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAic3JjL211eC8iCisgICAgICAgICAgICBpbmNsdWRlICJhbmltX2VuY29kZS5jIgorICAgICAgICAgICAgaW5jbHVkZSAibXV4ZWRpdC5jIgorICAgICAgICAgICAgaW5jbHVkZSAibXV4aW50ZXJuYWwuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIm11eHJlYWQuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFeGVjdXRhYmxlcyBmcm9tIGV4YW1wbGVzLgorICAgIGV4YW1wbGVfdXRpbChOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgaW5jbHVkZSAiZXhhbXBsZV91dGlsLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW1hZ2Vpb191dGlsKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vaW1hZ2VpbyIKKyAgICAgICAgICAgIGluY2x1ZGUgImltYWdlaW9fdXRpbC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGltYWdlZGVjKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwZGVtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2ltYWdlaW8iCisgICAgICAgICAgICBpbmNsdWRlICJpbWFnZV9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImpwZWdkZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIm1ldGFkYXRhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwbmdkZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBubWRlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidGlmZmRlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAid2VicGRlYy5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGltYWdlZW5jKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2ltYWdlaW8iCisgICAgICAgICAgICBpbmNsdWRlICJpbWFnZV9lbmMuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjd2VicChOYXRpdmVFeGVjdXRhYmxlU3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiZXhhbXBsZV91dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlZGVjIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwZGVtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgaW5jbHVkZSAiY3dlYnAuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBkd2VicChOYXRpdmVFeGVjdXRhYmxlU3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiZXhhbXBsZV91dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlZGVjIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlZW5jIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwZGVtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgICAgaW5jbHVkZSAiZHdlYnAuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB3ZWJwbXV4X2V4YW1wbGUoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogImV4YW1wbGVfdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicG11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgIGluY2x1ZGUgIndlYnBtdXguYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbWcyd2VicF9leGFtcGxlKE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJleGFtcGxlX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2VkZWMiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicGRlbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgaW5jbHVkZSAiaW1nMndlYnAuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB3ZWJwaW5mb19leGFtcGxlKE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJleGFtcGxlX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgaW5jbHVkZSAid2VicGluZm8uYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdGFza3MgeworICAgIC8vIFRhc2sgdG8gdGVzdCBhbGwgcG9zc2libGUgY29uZmlndXJhdGlvbnMuCisgICAgYnVpbGRBbGxFeGVjdXRhYmxlcyhUYXNrKSB7CisgICAgICBkZXBlbmRzT24gJC5iaW5hcmllcy5maW5kQWxsIHsgaXQuYnVpbGRhYmxlIH0KKyAgICB9CisgIH0KK30KKworLy8gVGFzayB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlci4KK3Rhc2sgd3JhcHBlcih0eXBlOiBXcmFwcGVyKSB7CisgIGdyYWRsZVZlcnNpb24gPSAnMi4xMycKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL1dlYlBDb25maWcuY21ha2UuaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9XZWJQQ29uZmlnLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmM2RmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9XZWJQQ29uZmlnLmNtYWtlLmluCkBAIC0wLDAgKzEsNiBAQAorQFBBQ0tBR0VfSU5JVEAKKworc2V0KFdlYlBfSU5DTFVERV9ESVJTICJ3ZWJwIikKK3NldChXRUJQX0lOQ0xVREVfRElSUyAke1dlYlBfSU5DTFVERV9ESVJTfSkKK3NldChXZWJQX0xJQlJBUklFUyAiQElOU1RBTExFRF9MSUJSQVJJRVNAIikKK3NldChXRUJQX0xJQlJBUklFUyAiJHtXZWJQX0xJQlJBUklFU30iKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY29uZmlnLmguaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg0YWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxNTYgQEAKKy8qIEFkYXB0ZWQgZnJvbSB0aGUgYXV0b3Rvb2xzIHNyYy93ZWJwL2NvbmZpZy5oLmluLiAgKi8KKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworLyogVE9ETzogaGFuZGxlIHByb3Blcmx5IGluIENNYWtlICovCisjY21ha2VkZWZpbmUgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEIDEKKworLyogU2V0IHRvIDEgaWYgX19idWlsdGluX2Jzd2FwMTYgaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQMTYgMQorCisvKiBTZXQgdG8gMSBpZiBfX2J1aWx0aW5fYnN3YXAzMiBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVAzMiAxCisKKy8qIFNldCB0byAxIGlmIF9fYnVpbHRpbl9ic3dhcDY0IGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDY0IDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjcHUtZmVhdHVyZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9DUFVfRkVBVFVSRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxHTFVUL2dsdXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9HTFVUX0dMVVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8R0wvZ2x1dC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dMX0dMVVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8T3BlbkdML2dsdXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9PUEVOR0xfR0xVVF9IIDEKKworLyogSGF2ZSBQVEhSRUFEX1BSSU9fSU5IRVJJVC4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUIEBIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUQAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNobHdhcGkuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TSExXQVBJX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3aW5jb2RlYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1dJTkNPREVDX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdpbmRvd3MuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9XSU5ET1dTX0ggMQorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgorICAgKi8KKy8qIFRPRE86IGhhbmRsZSBwcm9wZXJseSBpbiBDTWFrZSAqLworI2NtYWtlZGVmaW5lIExUX09CSkRJUiAiQExUX09CSkRJUkAiCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0UgIkBQUk9KRUNUX05BTUVAIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiQFBBQ0tBR0VfQlVHUkVQT1JUQCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfTkFNRSAiQFBBQ0tBR0VfTkFNRUAiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1NUUklORyAiQFBBQ0tBR0VfU1RSSU5HQCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiQFBBQ0tBR0VfVEFSTkFNRUAiCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9VUkwgIkBQQUNLQUdFX1VSTEAiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKKworLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KKyAgIHlvdXIgc3lzdGVtLiAqLworI2NtYWtlZGVmaW5lIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjY21ha2VkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2NtYWtlZGVmaW5lIFZFUlNJT04gIkBWRVJTSU9OQCIKKworLyogU2V0IHRvIDEgaWYgQVZYMiBpcyBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfQVZYMiAxCisKKy8qIFNldCB0byAxIGlmIEdJRiBsaWJyYXJ5IGlzIGluc3RhbGxlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9HSUYgMQorCisvKiBTZXQgdG8gMSBpZiBPcGVuR0wgaXMgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX0dMIDEKKworLyogU2V0IHRvIDEgaWYgSlBFRyBsaWJyYXJ5IGlzIGluc3RhbGxlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9KUEVHIDEKKworLyogU2V0IHRvIDEgaWYgTkVPTiBpcyBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfTkVPTgorCisvKiBTZXQgdG8gMSBpZiBydW50aW1lIGRldGVjdGlvbiBvZiBORU9OIGlzIGVuYWJsZWQgKi8KKy8qIFRPRE86IGhhbmRsZSBwcm9wZXJseSBpbiBDTWFrZSAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9ORU9OX1JUQ0QKKworLyogU2V0IHRvIDEgaWYgUE5HIGxpYnJhcnkgaXMgaW5zdGFsbGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX1BORyAxCisKKy8qIFNldCB0byAxIGlmIFNETCBsaWJyYXJ5IGlzIGluc3RhbGxlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9TREwgMQorCisvKiBTZXQgdG8gMSBpZiBTU0UyIGlzIHN1cHBvcnRlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9TU0UyIDEKKworLyogU2V0IHRvIDEgaWYgU1NFNC4xIGlzIHN1cHBvcnRlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9TU0U0MSAxCisKKy8qIFNldCB0byAxIGlmIFRJRkYgbGlicmFyeSBpcyBpbnN0YWxsZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfVElGRiAxCisKKy8qIEVuYWJsZSBuZWFyIGxvc3NsZXNzIGVuY29kaW5nICovCisjY21ha2VkZWZpbmUgV0VCUF9ORUFSX0xPU1NMRVNTIDEKKworLyogVW5kZWZpbmUgdGhpcyB0byBkaXNhYmxlIHRocmVhZCBzdXBwb3J0LiAqLworI2NtYWtlZGVmaW5lIFdFQlBfVVNFX1RIUkVBRCAxCisKKy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY3B1LmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY3B1LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTFiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jcHUuY21ha2UKQEAgLTAsMCArMSwxMjUgQEAKKyMjIENoZWNrIGZvciBTSU1EIGV4dGVuc2lvbnMuCitpbmNsdWRlKENNYWtlUHVzaENoZWNrU3RhdGUpCisKK2Z1bmN0aW9uKHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZyBXRUJQX1NJTURfRkxBRyBFTkFCTEVfU0lNRCkKKyAgaWYoTk9UIEVOQUJMRV9TSU1EKQorICAgIG1lc3NhZ2UoU1RBVFVTICJEaXNhYmxpbmcgJHtXRUJQX1NJTURfRkxBR30gb3B0aW1pemF0aW9uLiIpCisgICAgc2V0KFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSAwIFBBUkVOVF9TQ09QRSkKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisgIHVuc2V0KFdFQlBfSEFWRV9GTEFHXyR7V0VCUF9TSU1EX0ZMQUd9IENBQ0hFKQorICBjbWFrZV9wdXNoX2NoZWNrX3N0YXRlKCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgICAgI2luY2x1ZGUgXCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9Ly4uL3NyYy9kc3AvZHNwLmhcIgorICAgICAgaW50IG1haW4odm9pZCkgeworICAgICAgICAjaWYgIWRlZmluZWQoV0VCUF9VU0VfJHtXRUJQX1NJTURfRkxBR30pCisgICAgICAgIHRoaXMgaXMgbm90IHZhbGlkIGNvZGUKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICIgV0VCUF9IQVZFX0ZMQUdfJHtXRUJQX1NJTURfRkxBR30KKyAgKQorICBjbWFrZV9wb3BfY2hlY2tfc3RhdGUoKQorICBpZihXRUJQX0hBVkVfRkxBR18ke1dFQlBfU0lNRF9GTEFHfSkKKyAgICBzZXQoV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9IDEgUEFSRU5UX1NDT1BFKQorICBlbHNlKCkKKyAgICBzZXQoV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9IDAgUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdGhvc2UgYXJlIGluY2x1ZGVkIGluIHRoZSBuYW1lcyBvZiBXRUJQX1VTRV8qIGluIGMrKyBjb2RlLgorc2V0KFdFQlBfU0lNRF9GTEFHUyAiU1NFMjtTU0U0MTtBVlgyO01JUFMzMjtNSVBTX0RTUF9SMjtORU9OO01TQSIpCitzZXQoV0VCUF9TSU1EX0ZJTEVfRVhURU5TSU9OUyAiX3NzZTIuYztfc3NlNDEuYztfYXZ4Mi5jO19taXBzMzIuYztfbWlwc19kc3BfcjIuYztfbmVvbi5jO19tc2EuYyIpCitpZihNU1ZDKQorICAjIE1TVkMgZG9lcyBub3QgaGF2ZSBhIFNTRTQgZmxhZyBidXQgQVZYMiBzdXBwb3J0IGltcGxpZXMKKyAgIyBTU0U0IHN1cHBvcnQuCisgIHNldChTSU1EX0VOQUJMRV9GTEFHUyAiL2FyY2g6U1NFMjsvYXJjaDpBVlgyOy9hcmNoOkFWWDI7Ozs7IikKKyAgc2V0KFNJTURfRElTQUJMRV9GTEFHUykKK2Vsc2UoKQorICBzZXQoU0lNRF9FTkFCTEVfRkxBR1MgIi1tc3NlMjstbXNzZTQuMTstbWF2eDI7LW1pcHMzMjstbWRzcHIyOy1tZnB1PW5lb247LW1tc2EiKQorICBzZXQoU0lNRF9ESVNBQkxFX0ZMQUdTICItbW5vLXNzZTI7LW1uby1zc2U0LjE7LW1uby1hdngyOzstbW5vLWRzcHIyOzstbW5vLW1zYSIpCitlbmRpZigpCisKK3NldChXRUJQX1NJTURfRklMRVNfVE9fTk9UX0lOQ0xVREUpCitzZXQoV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREUpCitzZXQoV0VCUF9TSU1EX0ZMQUdTX1RPX0lOQ0xVREUpCisKK2lmKCR7QU5EUk9JRH0pCisgIGlmKCR7QU5EUk9JRF9BQkl9IFNUUkVRVUFMICJhcm1lYWJpLXY3YSIpCisgICAgIyBUaGlzIGlzIGJlY2F1c2UgQW5kcm9pZCBzdHVkaW8gdXNlcyB0aGUgY29uZmlndXJhdGlvbgorICAgICMgIi1tYXJjaD1hcm12Ny1hIC1tZmxvYXQtYWJpPXNvZnRmcCAtbWZwdT12ZnB2My1kMTYiCisgICAgIyB0aGF0IGRvZXMgbm90IHRyaWdnZXIgbmVvbiBvcHRpbWl6YXRpb25zIGJ1dCBzaG91bGQKKyAgICAjIChhcyB0aGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QgYW55bW9yZSkuCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLW1mcHU9bmVvbiAiKQorICBlbmRpZigpCitlbmRpZigpCisKK2xpc3QoTEVOR1RIIFdFQlBfU0lNRF9GTEFHUyBXRUJQX1NJTURfRkxBR1NfTEVOR1RIKQorbWF0aChFWFBSIFdFQlBfU0lNRF9GTEFHU19SQU5HRSAiJHtXRUJQX1NJTURfRkxBR1NfTEVOR1RIfSAtIDEiKQorCitmb3JlYWNoKElfU0lNRCBSQU5HRSAke1dFQlBfU0lNRF9GTEFHU19SQU5HRX0pCisgIGxpc3QoR0VUIFdFQlBfU0lNRF9GTEFHUyAke0lfU0lNRH0gV0VCUF9TSU1EX0ZMQUcpCisKKyAgIyBGaXJzdCB0cnkgd2l0aCBubyBleHRyYSBmbGFnIGFkZGVkIGFzIHRoZSBjb21waWxlciBtaWdodCBoYXZlIGRlZmF1bHQgZmxhZ3MKKyAgIyAoZXNwZWNpYWxseSBvbiBBbmRyb2lkKS4KKyAgdW5zZXQoV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9IENBQ0hFKQorICBjbWFrZV9wdXNoX2NoZWNrX3N0YXRlKCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQorICB3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcoJHtXRUJQX1NJTURfRkxBR30gJHtXRUJQX0VOQUJMRV9TSU1EfSkKKyAgaWYoTk9UIFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSkKKyAgICBsaXN0KEdFVCBTSU1EX0VOQUJMRV9GTEFHUyAke0lfU0lNRH0gU0lNRF9DT01QSUxFX0ZMQUcpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICR7U0lNRF9DT01QSUxFX0ZMQUd9KQorICAgIHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZygke1dFQlBfU0lNRF9GTEFHfSAke1dFQlBfRU5BQkxFX1NJTUR9KQorICBlbHNlKCkKKyAgICBzZXQoU0lNRF9DT01QSUxFX0ZMQUcgIiAiKQorICBlbmRpZigpCisgICMgQ2hlY2sgd2hpY2ggZmlsZXMgd2Ugc2hvdWxkIGluY2x1ZGUgb3Igbm90LgorICBsaXN0KEdFVCBXRUJQX1NJTURfRklMRV9FWFRFTlNJT05TICR7SV9TSU1EfSBXRUJQX1NJTURfRklMRV9FWFRFTlNJT04pCisgIGZpbGUoR0xPQiBTSU1EX0ZJTEVTICIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9Ly4uLyIKKyAgICAic3JjL2RzcC8qJHtXRUJQX1NJTURfRklMRV9FWFRFTlNJT059IgorICApCisgIGlmKFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSkKKyAgICAjIE1lbW9yaXplIHRoZSBmaWxlIGFuZCBmbGFncy4KKyAgICBmb3JlYWNoKEZJTEUgJHtTSU1EX0ZJTEVTfSkKKyAgICAgIGxpc3QoQVBQRU5EIFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFICR7RklMRX0pCisgICAgICBsaXN0KEFQUEVORCBXRUJQX1NJTURfRkxBR1NfVE9fSU5DTFVERSAke1NJTURfQ09NUElMRV9GTEFHfSkKKyAgICBlbmRmb3JlYWNoKCkKKyAgZWxzZSgpCisgICAgIyBSZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgbGlzdC4KKyAgICBmb3JlYWNoKEZJTEUgJHtTSU1EX0ZJTEVTfSkKKyAgICAgIGxpc3QoQVBQRU5EIFdFQlBfU0lNRF9GSUxFU19OT1RfVE9fSU5DTFVERSAke0ZJTEV9KQorICAgIGVuZGZvcmVhY2goKQorICAgICMgRXhwbGljaXRseSBkaXNhYmxlIFNJTUQuCisgICAgaWYoU0lNRF9ESVNBQkxFX0ZMQUdTKQorICAgICAgbGlzdChHRVQgU0lNRF9ESVNBQkxFX0ZMQUdTICR7SV9TSU1EfSBTSU1EX0NPTVBJTEVfRkxBRykKKyAgICAgIGluY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQorICAgICAgaWYoU0lNRF9DT01QSUxFX0ZMQUcpCisgICAgICAgIHVuc2V0KEhBU19DT01QSUxFX0ZMQUcgQ0FDSEUpCisgICAgICAgIGNoZWNrX2NfY29tcGlsZXJfZmxhZygke1NJTURfQ09NUElMRV9GTEFHfSBIQVNfQ09NUElMRV9GTEFHKQorICAgICAgICBpZihIQVNfQ09NUElMRV9GTEFHKQorICAgICAgICAgICMgRG8gb25lIG1vcmUgY2hlY2sgZm9yIENsYW5nIHRvIGNpcmN1bXZlbnQgQ01ha2UgaXNzdWUgMTMxOTQuCisgICAgICAgICAgaWYoQ09NTUFORCBjaGVja19jb21waWxlcl9mbGFnX2NvbW1vbl9wYXR0ZXJucykKKyAgICAgICAgICAgICMgT25seSBpbiBDTWFrZSAzLjAgYW5kIGFib3ZlLgorICAgICAgICAgICAgY2hlY2tfY29tcGlsZXJfZmxhZ19jb21tb25fcGF0dGVybnMoQ09NTU9OX1BBVFRFUk5TKQorICAgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgc2V0KENPTU1PTl9QQVRURVJOUykKKyAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICR7U0lNRF9DT01QSUxFX0ZMQUd9KQorICAgICAgICAgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCJpbnQgbWFpbih2b2lkKSB7cmV0dXJuIDA7fSIKKyAgICAgICAgICAgIEZMQUdfJHtTSU1EX0NPTVBJTEVfRkxBR30KKyAgICAgICAgICAgIEZBSUxfUkVHRVggIndhcm5pbmc6IGFyZ3VtZW50IHVudXNlZCBkdXJpbmcgY29tcGlsYXRpb246IgorICAgICAgICAgICAgJHtDT01NT05fUEFUVEVSTlN9CisgICAgICAgICAgKQorICAgICAgICAgIGlmKE5PVCBGTEFHXyR7U0lNRF9DT01QSUxFX0ZMQUd9KQorICAgICAgICAgICAgdW5zZXQoSEFTX0NPTVBJTEVfRkxBRyBDQUNIRSkKKyAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoSEFTX0NPTVBJTEVfRkxBRykKKyAgICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke1NJTURfQ09NUElMRV9GTEFHfSIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgY21ha2VfcG9wX2NoZWNrX3N0YXRlKCkKK2VuZGZvcmVhY2goKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvZGVwcy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2RlcHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZDEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2RlcHMuY21ha2UKQEAgLTAsMCArMSwxNjYgQEAKKyMgR2VuZXJhdGUgdGhlIGNvbmZpZy5oIHRvIGNvbXBpbGUgd2l0aCBzcGVjaWZpYyBpbnRyaW5zaWNzIC8gbGlicy4KKworIyMgQ2hlY2sgZm9yIGNvbXBpbGVyIG9wdGlvbnMuCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQorY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICh2b2lkKV9fYnVpbHRpbl9ic3dhcDE2KDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAiCisgIEhBVkVfQlVJTFRJTl9CU1dBUDE2CispCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgaW50IG1haW4odm9pZCkgeworICAgICAgKHZvaWQpX19idWlsdGluX2Jzd2FwMzIoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICIKKyAgSEFWRV9CVUlMVElOX0JTV0FQMzIKKykKK2NoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAodm9pZClfX2J1aWx0aW5fYnN3YXA2NCgwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgIgorICBIQVZFX0JVSUxUSU5fQlNXQVA2NAorKQorCisjIyBDaGVjayBmb3IgbGlicmFyaWVzLgorZmluZF9wYWNrYWdlKFRocmVhZHMpCitpZihUaHJlYWRzX0ZPVU5EKQorICBpZihDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtcHRocmVhZCIpCisgIGVuZGlmKCkKKyAgZm9yZWFjaChQVEhSRUFEX1RFU1QgSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVCBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEKQorICAgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICAgICAgI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyAgICAgICAgaW50IG1haW4gKHZvaWQpIHsKKyAgICAgICAgICBpbnQgYXR0ciA9ICR7UFRIUkVBRF9URVNUfTsKKyAgICAgICAgICByZXR1cm4gYXR0cjsKKyAgICAgICAgfQorICAgICAgIiAke1BUSFJFQURfVEVTVH0KKyAgICApCisgIGVuZGZvcmVhY2goKQorICBsaXN0KEFQUEVORCBXRUJQX0RFUF9MSUJSQVJJRVMgJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKK2VuZGlmKCkKK3NldChXRUJQX1VTRV9USFJFQUQgJHtUaHJlYWRzX0ZPVU5EfSkKKworIyBUT0RPOiB0aGlzIHNlZW1zIHVudXNlZCwgY2hlY2sgd2l0aCBhdXRvdG9vbHMuCitzZXQoTFRfT0JKRElSICIubGlicy8iKQorCisjIE9ubHkgdXNlZnVsIGZvciB2d2VicCwgc28gdXNlbGVzcyBmb3Igbm93LgorIyBmaW5kX3BhY2thZ2UoT3BlbkdMKQorIyBzZXQoV0VCUF9IQVZFX0dMICR7T1BFTkdMX0ZPVU5EfSkKKyMgc2V0KFdFQlBfREVQX0lOQ0xVREVfRElSUyAke1dFQlBfREVQX0lOQ0xVREVfRElSU30gJHtPUEVOR0xfSU5DTFVERV9ESVJTfSkKKyMgc2V0KFdFQlBfREVQX0xJQlJBUklFUyAke1dFQlBfREVQX0xJQlJBUklFU30gJHtPUEVOR0xfTElCUkFSSUVTfSkKKworIyBGaW5kIHRoZSBzdGFuZGFyZCBDIG1hdGggbGlicmFyeS4KK2ZpbmRfbGlicmFyeShNQVRIX0xJQlJBUlkgTkFNRVMgbSkKK2lmKE1BVEhfTElCUkFSWSkKKyAgbGlzdChBUFBFTkQgV0VCUF9ERVBfTElCUkFSSUVTICR7TUFUSF9MSUJSQVJZfSkKK2VuZGlmKCkKKworIyBGaW5kIHRoZSBzdGFuZGFyZCBpbWFnZSBsaWJyYXJpZXMuCitzZXQoV0VCUF9ERVBfSU1HX0xJQlJBUklFUykKK3NldChXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTKQorZm9yZWFjaChJX0xJQiBQTkcgSlBFRyBUSUZGKQorICBmaW5kX3BhY2thZ2UoJHtJX0xJQn0pCisgIHNldChXRUJQX0hBVkVfJHtJX0xJQn0gJHske0lfTElCfV9GT1VORH0pCisgIGlmKCR7SV9MSUJ9X0ZPVU5EKQorICAgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0lNR19MSUJSQVJJRVMgJHske0lfTElCfV9MSUJSQVJJRVN9KQorICAgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0lNR19JTkNMVURFX0RJUlMKKyAgICAgICAgICR7JHtJX0xJQn1fSU5DTFVERV9ESVJ9ICR7JHtJX0xJQn1fSU5DTFVERV9ESVJTfSkKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCitpZihXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTKQorICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFdFQlBfREVQX0lNR19JTkNMVURFX0RJUlMpCitlbmRpZigpCisKKyMgR0lGIGRldGVjdGlvbiwgZ2lmZGVjIGlzbid0IHBhcnQgb2YgdGhlIGltYWdlaW8gbGliLgoraW5jbHVkZShDTWFrZVB1c2hDaGVja1N0YXRlKQorc2V0KFdFQlBfREVQX0dJRl9MSUJSQVJJRVMpCitzZXQoV0VCUF9ERVBfR0lGX0lOQ0xVREVfRElSUykKK2ZpbmRfcGFja2FnZShHSUYpCitzZXQoV0VCUF9IQVZFX0dJRiAke0dJRl9GT1VORH0pCitpZihHSUZfRk9VTkQpCisgICMgR0lGIGZpbmRfcGFja2FnZSBvbmx5IGxvY2F0ZXMgdGhlIGhlYWRlciBhbmQgbGlicmFyeSwgaXQgZG9lc24ndCBmYWlsCisgICMgY29tcGlsZSB0ZXN0cyB3aGVuIGRldGVjdGluZyB0aGUgdmVyc2lvbiwgYnV0IGZhbGxzIGJhY2sgdG8gMyAoYXMgb2YgYXQKKyAgIyBsZWFzdCBjbWFrZSAzLjcuMikuIE1ha2Ugc3VyZSB0aGUgbGlicmFyeSBsaW5rcyB0byBhdm9pZCBpbmNvcnJlY3QKKyAgIyBkZXRlY3Rpb24gd2hlbiBjcm9zcyBjb21waWxpbmcuCisgIGNtYWtlX3B1c2hfY2hlY2tfc3RhdGUoKQorICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7R0lGX0xJQlJBUklFU30pCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0dJRl9JTkNMVURFX0RJUn0pCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICAgICNpbmNsdWRlIDxnaWZfbGliLmg+CisgICAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAgICh2b2lkKURHaWZPcGVuRmlsZUhhbmRsZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICAiIEdJRl9DT01QSUxFUworICApCisgIGNtYWtlX3BvcF9jaGVja19zdGF0ZSgpCisgIGlmKEdJRl9DT01QSUxFUykKKyAgICBsaXN0KEFQUEVORCBXRUJQX0RFUF9HSUZfTElCUkFSSUVTICR7R0lGX0xJQlJBUklFU30pCisgICAgbGlzdChBUFBFTkQgV0VCUF9ERVBfR0lGX0lOQ0xVREVfRElSUyAke0dJRl9JTkNMVURFX0RJUn0pCisgIGVsc2UoKQorICAgIHVuc2V0KEdJRl9GT1VORCkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIyBDaGVjayBmb3Igc3BlY2lmaWMgaGVhZGVycy4KK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitjaGVja19pbmNsdWRlX2ZpbGVzKCJzdGRsaWIuaDtzdGRhcmcuaDtzdHJpbmcuaDtmbG9hdC5oIiBTVERDX0hFQURFUlMpCitjaGVja19pbmNsdWRlX2ZpbGVzKGRsZmNuLmggSEFWRV9ETEZDTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhHTFVUL2dsdXQuaCBIQVZFX0dMVVRfR0xVVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhHTC9nbHV0LmggSEFWRV9HTF9HTFVUX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKGludHR5cGVzLmggSEFWRV9JTlRUWVBFU19IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhtZW1vcnkuaCBIQVZFX01FTU9SWV9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhPcGVuR0wvZ2x1dC5oIEhBVkVfT1BFTkdMX0dMVVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc2hsd2FwaS5oIEhBVkVfU0hMV0FQSV9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzdGRpbnQuaCBIQVZFX1NURElOVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzdGRsaWIuaCBIQVZFX1NURExJQl9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzdHJpbmdzLmggSEFWRV9TVFJJTkdTX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN0cmluZy5oIEhBVkVfU1RSSU5HX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN5cy9zdGF0LmggSEFWRV9TWVNfU1RBVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzeXMvdHlwZXMuaCBIQVZFX1NZU19UWVBFU19IKQorY2hlY2tfaW5jbHVkZV9maWxlcyh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyh3aW5jb2RlYy5oIEhBVkVfV0lOQ09ERUNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMod2luZG93cy5oIEhBVkVfV0lORE9XU19IKQorCisjIFdpbmRvd3Mgc3BlY2lmaWNzCitpZihIQVZFX1dJTkNPREVDX0gpCisgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0xJQlJBUklFUyBzaGx3YXBpIG9sZTMyIHdpbmRvd3Njb2RlY3MpCitlbmRpZigpCisKKyMjIENoZWNrIGZvciBTSU1EIGV4dGVuc2lvbnMuCitpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vY3B1LmNtYWtlKQorCisjIyBEZWZpbmUgZXh0cmEgaW5mby4KK3NldChQQUNLQUdFICR7UFJPSkVDVF9OQU1FfSkKK3NldChQQUNLQUdFX05BTUUgJHtQUk9KRUNUX05BTUV9KQorCisjIFJlYWQgZnJvbSBjb25maWd1cmUuYWMuCitmaWxlKFJFQUQgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbmZpZ3VyZS5hYyBDT05GSUdVUkVfQUMpCitzdHJpbmcoUkVHRVggTUFUQ0hBTEwgIlxcWyhbMC05YS16XFwuOi9dKilcXF0iCisgIENPTkZJR1VSRV9BQ19QQUNLQUdFX0lORk8gJHtDT05GSUdVUkVfQUN9CispCitmdW5jdGlvbihzdHJpcF9icmFja2V0IFZBUikKKyAgc3RyaW5nKExFTkdUSCAkeyR7VkFSfX0gVE1QX0xFTikKKyAgbWF0aChFWFBSIFRNUF9MRU4gJHtUTVBfTEVOfS0yKQorICBzdHJpbmcoU1VCU1RSSU5HICR7JHtWQVJ9fSAxICR7VE1QX0xFTn0gVE1QX1NVQikKKyAgc2V0KCR7VkFSfSAke1RNUF9TVUJ9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworbGlzdChHRVQgQ09ORklHVVJFX0FDX1BBQ0tBR0VfSU5GTyAxIFBBQ0tBR0VfVkVSU0lPTikKK3N0cmlwX2JyYWNrZXQoUEFDS0FHRV9WRVJTSU9OKQorbGlzdChHRVQgQ09ORklHVVJFX0FDX1BBQ0tBR0VfSU5GTyAyIFBBQ0tBR0VfQlVHUkVQT1JUKQorc3RyaXBfYnJhY2tldChQQUNLQUdFX0JVR1JFUE9SVCkKK2xpc3QoR0VUIENPTkZJR1VSRV9BQ19QQUNLQUdFX0lORk8gMyBQQUNLQUdFX1VSTCkKK3N0cmlwX2JyYWNrZXQoUEFDS0FHRV9VUkwpCisKKyMgQnVpbGQgbW9yZSBpbmZvLgorc2V0KFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfTkFNRX0gJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldChQQUNLQUdFX1RBUk5BTUUgJHtQQUNLQUdFX05BTUV9KQorc2V0KFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY29uZmlndXJlLmFjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NmU1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jb25maWd1cmUuYWMKQEAgLTAsMCArMSw4MDIgQEAKK0FDX0lOSVQoW2xpYndlYnBdLCBbMS4wLjBdLAorICAgICAgICBbaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnBdLCwKKyAgICAgICAgW2h0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicF0pCitBQ19DQU5PTklDQUxfSE9TVAorQUNfUFJFUkVRKFsyLjYwXSkKK0FNX0lOSVRfQVVUT01BS0UoWy1XYWxsIGZvcmVpZ24gc3ViZGlyLW9iamVjdHNdKQorCitkbmwgPT09IGF1dG9tYWtlID49IDEuMTIgcmVxdWlyZXMgdGhpcyBmb3IgJ3VudXN1YWwgYXJjaGl2ZXJzJyBzdXBwb3J0LgorZG5sID09PSBpdCBtdXN0IG9jY3VyIGJlZm9yZSBMVF9JTklUIChBQ19QUk9HX0xJQlRPT0wpLgorbTRfaWZkZWYoW0FNX1BST0dfQVJdLCBbQU1fUFJPR19BUl0pCisKK0FDX1BST0dfTElCVE9PTAorQUNfUFJPR19TRUQKK0FNX1BST0dfQ0NfQ19PCisKK2RubCA9PT0gRW5hYmxlIGxlc3MgdmVyYm9zZSBvdXRwdXQgd2hlbiBidWlsZGluZy4KK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCA9PSB0ZXN0IGVuZGlhbm5lc3MKK0FDX0NfQklHRU5ESUFOCisKK2RubCA9PT0gU0VUX0lGX1VOU0VUKHNoZWxsX3ZhciwgdmFsdWUpCitkbmwgPT09ICAgU2V0IHRoZSBzaGVsbCB2YXJpYWJsZSAnc2hlbGxfdmFyJyB0byAndmFsdWUnIGlmIGl0IGlzIHVuc2V0LgorQUNfREVGVU4oW1NFVF9JRl9VTlNFVF0sIFt0ZXN0ICIkeyQxK3NldH0iID0gInNldCIgfHwgJDE9JDJdKQorCitBQ19BUkdfRU5BQkxFKFtldmVyeXRoaW5nXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWV2ZXJ5dGhpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRW5hYmxlIGFsbCBvcHRpb25hbCB0YXJnZXRzLiBUaGVzZSBjYW4gc3RpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIHdpdGggLS1kaXNhYmxlLXRhcmdldF0pLAorICAgICAgICAgICAgICBbU0VUX0lGX1VOU0VUKFtlbmFibGVfbGlid2VicGRlY29kZXJdLCBbJGVuYWJsZXZhbF0pCisgICAgICAgICAgICAgICBTRVRfSUZfVU5TRVQoW2VuYWJsZV9saWJ3ZWJwZGVtdXhdLCBbJGVuYWJsZXZhbF0pCisgICAgICAgICAgICAgICBTRVRfSUZfVU5TRVQoW2VuYWJsZV9saWJ3ZWJwZXh0cmFzXSwgWyRlbmFibGV2YWxdKQorICAgICAgICAgICAgICAgU0VUX0lGX1VOU0VUKFtlbmFibGVfbGlid2VicG11eF0sIFskZW5hYmxldmFsXSldKQorCitkbmwgPT09IElmIC0tZW5hYmxlLWFzc2VydHMgaXMgbm90IGRlZmluZWQsIGRlZmluZSBOREVCVUcKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgYXNzZXJ0cyBhcmUgZW5hYmxlZCkKK0FDX0FSR19FTkFCTEUoW2Fzc2VydHNdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYXNzZXJ0c10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFbmFibGUgYXNzZXJ0IGNoZWNrc10pKQoraWYgdGVzdCAieCR7ZW5hYmxlX2Fzc2VydHMtbm99IiA9ICJ4bm8iOyB0aGVuCisgIEFNX0NQUEZMQUdTPSIke0FNX0NQUEZMQUdTfSAtRE5ERUJVRyIKK2ZpCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX2Fzc2VydHMtbm99KQorQUNfU1VCU1QoW0FNX0NQUEZMQUdTXSkKKworQUNfQVJHX1dJVEgoW3BrZ2NvbmZpZ2Rpcl0sIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtcGtnY29uZmlnZGlyPURJUl0sCisgICAgICAgICAgICBbUGF0aCB0byB0aGUgcGtnY29uZmlnIGRpcmVjdG9yeSBAPDpATElCRElSL3BrZ2NvbmZpZ0A6PkBdKSwKKyAgICAgICAgICAgIFtwa2djb25maWdkaXI9IiR3aXRodmFsIl0sIFtwa2djb25maWdkaXI9JyR7bGliZGlyfS9wa2djb25maWcnXSkKK0FDX1NVQlNUKFtwa2djb25maWdkaXJdKQorCitkbmwgPT09IFRFU1RfQU5EX0FERF9DRkxBR1ModmFyLCBmbGFnKQorZG5sID09PSAgIENoZWNrcyB3aGV0aGVyICRDQyBzdXBwb3J0cyAnZmxhZycgYW5kIGFkZHMgaXQgdG8gJ3ZhcicKK2RubCA9PT0gICBvbiBzdWNjZXNzLgorQUNfREVGVU4oW1RFU1RfQU5EX0FERF9DRkxBR1NdLAorICAgICAgICAgW1NBVkVEX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgICBDRkxBR1M9Ii1XZXJyb3IgJDIiCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICRDQyBzdXBwb3J0cyAkMl0pCisgICAgICAgICAgZG5sIE5vdGUgQUNfTEFOR19QUk9HUkFNKFtdKSB1c2VzIGFuIG9sZC1zdHlsZSBtYWluIGRlZmluaXRpb24uCisgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9XSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgU2ltcGx5IGFwcGVuZCB0aGUgdmFyaWFibGUgYXZvaWRpbmcgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRubCBjb21wYXRpYmlsaXR5IGlmZGVmIGZvciBBU19WQVJfQVBQRU5EIGFzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgdmFyaWFibGUgc2hvdWxkbid0IGdyb3cgYWxsIHRoYXQgbGFyZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyQxPSIkeyQxfSAkMiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICAgICAgICBDRkxBR1M9IiRTQVZFRF9DRkxBR1MiXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstZnZpc2liaWxpdHk9aGlkZGVuXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2FsbF0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdjb25zdGFudC1jb252ZXJzaW9uXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudF0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdleHRyYV0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdmbG9hdC1jb252ZXJzaW9uXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2Zvcm1hdCAtV2Zvcm1hdC1ub25saXRlcmFsXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2Zvcm1hdCAtV2Zvcm1hdC1zZWN1cml0eV0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdtaXNzaW5nLWRlY2xhcmF0aW9uc10pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdtaXNzaW5nLXByb3RvdHlwZXNdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1Xb2xkLXN0eWxlLWRlZmluaXRpb25dKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XcGFyZW50aGVzZXMtZXF1YWxpdHldKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1Xc2hhZG93XSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3Nob3J0ZW4tNjQtdG8tMzJdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XdW5kZWZdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XdW5yZWFjaGFibGUtY29kZV0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZV0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVd1bnVzZWRdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XdmxhXSkKKyMgaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjIwNDAKKyMgaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjE2MjIKK0FTX0lGKFt0ZXN0ICIkR0NDIiA9ICJ5ZXMiIF0sIFsKKyAgICAgICBnY2NfdmVyc2lvbj1gJENDIC1kdW1wdmVyc2lvbmAKKyAgICAgICBnY2Nfd2h0X2J1Zz0iIgorICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgIGFhcmNoNjR8YXJtNjQpCisgICAgICAgICAgY2FzZSAiJGdjY192ZXJzaW9uIiBpbgorICAgICAgICAgICAgNC45fDQuOS4wfDQuOS4xKSBnY2Nfd2h0X2J1Zz15ZXMgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgZXNhYworICAgICAgIEFTX0lGKFt0ZXN0ICIkZ2NjX3dodF9idWciID0gInllcyJdLCBbCisgICAgICAgICAgICAgIFRFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstZnJlbmFtZS1yZWdpc3RlcnNdKV0pXSkKKyMgVXNlIC1mbGF4LXZlY3Rvci1jb252ZXJzaW9ucywgaWYgYXZhaWxhYmxlLCB3aGVuIGJ1aWxkaW5nIGludHJpbnNpY3Mgd2l0aAorIyBvbGRlciB2ZXJzaW9ucyBvZiBnY2MuIFRoZSBmbGFnIGFwcGVhcmVkIGluIDQuMy54LCBidXQgaWYgYmFja3BvcnRlZCwgYW5kCisjIC1mbm8tbGF4LXZlY3Rvci1jb252ZXJzaW9ucyBpcyBzZXQsIGVycm9ycyBtYXkgb2NjdXIgd2l0aCB0aGUgaW50cmluc2ljcworIyBmaWxlcyBhbG9uZyB3aXRoIHRoZSBvbGRlciBzeXN0ZW0gaW5jbHVkZXMsIGUuZy4sIGVtbWludHJpbi5oLgorIyBPcmlnaW5hbGx5IG9ic2VydmVkIHdpdGggY2MgKEdDQykgNC4yLjEgMjAwNzA4MzEgcGF0Y2hlZCBbRnJlZUJTRF0gKDkuMykuCisjIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwL2lzc3Vlcy9kZXRhaWw/aWQ9Mjc0CitBU19JRihbdGVzdCAiJEdDQyIgPSAieWVzIiBdLCBbCisgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgICAgYW1kNjR8aT84Nnx4ODZfNjQpCisgICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAorICAgICAgICAgICAgIGRubCBvbmx5IGNoZWNrIGZvciAtZmxheC12ZWN0b3ItY29udmVyc2lvbnMgd2l0aCBvbGRlciBnY2MsIHNraXAKKyAgICAgICAgICAgICBkbmwgY2xhbmcgYXMgaXQgcmVwb3J0cyBpdHNlbGYgYXMgNC4yLjEsIGJ1dCB0aGUgZmxhZyBpc24ndCBuZWVkZWQuCisgICAgICAgICAgICAgW0FDX0xBTkdfU09VUkNFKFsjaWYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dOVUNfXyA8PCA4KSB8IF9fR05VQ19NSU5PUl9fKSA8IDB4NDAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZXJyb3Igb2xkIGdjYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXSwsCisgICAgICAgICAgICAgIFtURVNUX0FORF9BRERfQ0ZMQUdTKFtJTlRSSU5TSUNTX0NGTEFHU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFstZmxheC12ZWN0b3ItY29udmVyc2lvbnNdKV0pCisgICAgICAgICAgIDs7CisgICAgICAgZXNhY10pCitBQ19TVUJTVChbQU1fQ0ZMQUdTXSkKKworZG5sID09PSBDaGVjayBmb3IgbWFjaGluZSBzcGVjaWZpYyBmbGFncworQUNfQVJHX0VOQUJMRShbYXZ4Ml0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYXZ4Ml0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBBVlgyIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCisKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9hdngyIiAhPSAieG5vIiAtYSAieCRlbmFibGVfc3NlNF8xIiAhPSAieG5vIiBcCisgICAgICAgICAtYSAieCRlbmFibGVfc3NlMiIgIT0gInhubyJdLCBbCisgIEFWWDJfQ0ZMQUdTPSIkSU5UUklOU0lDU19DRkxBR1MgJEFWWDJfRkxBR1MiCisgIFRFU1RfQU5EX0FERF9DRkxBR1MoW0FWWDJfRkxBR1NdLCBbLW1hdngyXSkKKyAgQVNfSUYoW3Rlc3QgLW4gIiRBVlgyX0ZMQUdTIl0sIFsKKyAgICBTQVZFRF9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAkQVZYMl9GTEFHUyIKKyAgICBBQ19DSEVDS19IRUFERVIoW2ltbWludHJpbi5oXSwKKyAgICAgICAgICAgICAgICAgICAgW0FDX0RFRklORShXRUJQX0hBVkVfQVZYMiwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIEFWWDIgaXMgc3VwcG9ydGVkXSldLAorICAgICAgICAgICAgICAgICAgICBbQVZYMl9GTEFHUz0iIl0sCisgICAgICAgICAgICAgICAgICAgIGRubCBpdCdzIGlsbGVnYWwgdG8gZGlyZWN0bHkgaW5jbHVkZSBhdngyaW50cmluLmgsIGJ1dCBpdCdzCisgICAgICAgICAgICAgICAgICAgIGRubCBpbmNsdWRlZCBjb25kaXRpb25hbGx5IGluIGltbWludHJpbi5oLCB0cmlja3khCisgICAgICAgICAgICAgICAgICAgIFsjaWZuZGVmIF9fQVZYMl9fCisgICAgICAgICAgICAgICAgICAgICAjZXJyb3IgYXZ4MiBpcyBub3QgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIF0pCisgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1NdKQorICBBQ19TVUJTVChbQVZYMl9GTEFHU10pXSkKKworQUNfQVJHX0VOQUJMRShbc3NlNC4xXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1zc2U0LjFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgU1NFNC4xIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCisKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9zc2U0XzEiICE9ICJ4bm8iIC1hICJ4JGVuYWJsZV9zc2UyIiAhPSAieG5vIl0sIFsKKyAgU1NFNDFfRkxBR1M9IiRJTlRSSU5TSUNTX0NGTEFHUyAkU1NFNDFfRkxBR1MiCisgIFRFU1RfQU5EX0FERF9DRkxBR1MoW1NTRTQxX0ZMQUdTXSwgWy1tc3NlNC4xXSkKKyAgQVNfSUYoW3Rlc3QgLW4gIiRTU0U0MV9GTEFHUyJdLCBbCisgICAgU0FWRURfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFNTRTQxX0ZMQUdTIgorICAgIEFDX0NIRUNLX0hFQURFUihbc21taW50cmluLmhdLAorICAgICAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFdFQlBfSEFWRV9TU0U0MSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIFNTRTQuMSBpcyBzdXBwb3J0ZWRdKV0sCisgICAgICAgICAgICAgICAgICAgIFtTU0U0MV9GTEFHUz0iIl0pCisgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1NdKQorICBBQ19TVUJTVChbU1NFNDFfRkxBR1NdKV0pCisKK0FDX0FSR19FTkFCTEUoW3NzZTJdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNzZTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgU1NFMiBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorCitBU19JRihbdGVzdCAieCRlbmFibGVfc3NlMiIgIT0gInhubyJdLCBbCisgIFNTRTJfRkxBR1M9IiRJTlRSSU5TSUNTX0NGTEFHUyAkU1NFMl9GTEFHUyIKKyAgVEVTVF9BTkRfQUREX0NGTEFHUyhbU1NFMl9GTEFHU10sIFstbXNzZTJdKQorICBBU19JRihbdGVzdCAtbiAiJFNTRTJfRkxBR1MiXSwgWworICAgIFNBVkVEX0NGTEFHUz0kQ0ZMQUdTCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRTU0UyX0ZMQUdTIgorICAgIEFDX0NIRUNLX0hFQURFUihbZW1taW50cmluLmhdLAorICAgICAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFdFQlBfSEFWRV9TU0UyLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgU1NFMiBpcyBzdXBwb3J0ZWRdKV0sCisgICAgICAgICAgICAgICAgICAgIFtTU0UyX0ZMQUdTPSIiXSkKKyAgICBDRkxBR1M9JFNBVkVEX0NGTEFHU10pCisgIEFDX1NVQlNUKFtTU0UyX0ZMQUdTXSldKQorCitBQ19BUkdfRU5BQkxFKFtuZW9uXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1uZW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIE5FT04gc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKKworQUNfQVJHX0VOQUJMRShbbmVvbl9ydGNkXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1uZW9uLXJ0Y2RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBydW50aW1lIGRldGVjdGlvbiBvZiBORU9OIHN1cHBvcnQgdmlhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcHJvYy9jcHVpbmZvIG9uIExpbnV4IGhvc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorIyBGb3IgQVJNKDcpIGhvc3RzOgorIyBCb3RoIE5FT04gZmxhZ3MgdW5zZXQgYW5kIE5FT04gc3VwcG9ydCBkZXRlY3RlZCA9IGJ1aWxkIGFsbCBtb2R1bGVzIHdpdGggTkVPTgorIyBORU9OIGRldGVjdGVkIHdpdGggdGhlIHVzZSBvZiAtbWZwdT1uZW9uID0gYnVpbGQgb25seSBORU9OIG1vZHVsZXMgd2l0aCBORU9OCitBU19JRihbdGVzdCAieCRlbmFibGVfbmVvbiIgIT0gInhubyJdLCBbCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICBhcm18YXJtdjcqKQorICAgICAgIyBUZXN0IGZvciBORU9OIHN1cHBvcnQgd2l0aG91dCBmbGFncyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIC1tZnB1PW5lb24KKyAgICAgIGZvciBmbGFnIGluICcnICctbWZwdT1uZW9uJzsgZG8KKyAgICAgICAgTE9DQUxfTkVPTl9GTEFHUz0iJElOVFJJTlNJQ1NfQ0ZMQUdTICRORU9OX0ZMQUdTIgorICAgICAgICBURVNUX0FORF9BRERfQ0ZMQUdTKFtMT0NBTF9ORU9OX0ZMQUdTXSwgWyRmbGFnXSkKKyAgICAgICAgU0FWRURfQ0ZMQUdTPSRDRkxBR1MKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRMT0NBTF9ORU9OX0ZMQUdTIgorCisgICAgICAgIGRubCBOb3RlIEFDX0xBTkdfUFJPR1JBTShbXSkgdXNlcyBhbiBvbGQtc3R5bGUgbWFpbiBkZWZpbml0aW9uLgorICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoWworICAgICAgICAgICNpbmNsdWRlIDxhcm1fbmVvbi5oPgorICAgICAgICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICAgICAgIGludDh4OF90IHYgPSB2ZHVwX25fczgoMCk7CisgICAgICAgICAgICAodm9pZCl2OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfV0pXSwKKyAgICAgICAgICBbTkVPTl9GTEFHUz0iJChlY2hvICRMT0NBTF9ORU9OX0ZMQUdTIHwgJFNFRCAncy9eICovLycpIgorICAgICAgICAgICBBU19JRihbdGVzdCAtbiAiJE5FT05fRkxBR1MiXSwgWworICAgICAgICAgICAgIEFTX0lGKFt0ZXN0ICIke2hvc3Rfb3MlJS0qfSIgPSAibGludXgiIC1vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAieCRlbmFibGVfbmVvbl9ydGNkIiA9ICJ4bm8iXSwgWworICAgICAgICAgICAgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1MKKyAgICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfTkVPTiwgWzFdLCBbU2V0IHRvIDEgaWYgTkVPTiBpcyBzdXBwb3J0ZWRdKQorICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICAgIEFDX01TR19XQVJOKG00X25vcm1hbGl6ZShbTkVPTiBydW50aW1lIGNwdS1kZXRlY3Rpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUgZm9yICR7aG9zdF9vcyUlLSp9LiBGb3JjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIENGTEFHUz0tbWZwdT1uZW9uIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1uZW9uLXJ0Y2QuXSkpCisgICAgICAgICAgICAgICBlbmFibGVfbmVvbl9ydGNkPW5vCisgICAgICAgICAgICAgICBORU9OX0ZMQUdTPSIiCisgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1MKKyAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX05FT04sIFsxXSwgW1NldCB0byAxIGlmIE5FT04gaXMgc3VwcG9ydGVkXSkKKyAgICAgICAgICAgICBicmVhaworICAgICAgICAgICBdKV0pCisgICAgICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTCisgICAgICBkb25lCisKKyAgICAgIEFTX0lGKFt0ZXN0IC1uICIkTkVPTl9GTEFHUyJdLCBbCisgICAgICAgICMgSWYgTkVPTiBpcyBhdmFpbGFibGUgYW5kIHJ0Y2QgaXMgZGlzYWJsZWQgYXBwbHkgTkVPTl9GTEFHUyBnbG9iYWxseS4KKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkZW5hYmxlX25lb25fcnRjZCIgPSAieG5vIl0sIFsKKyAgICAgICAgICBBTV9DRkxBR1M9IiRBTV9DRkxBR1MgJE5FT05fRkxBR1MiCisgICAgICAgICAgTkVPTl9GTEFHUz0iIl0sCisgICAgICAgICAgW0FDX0RFRklORShXRUJQX0hBVkVfTkVPTl9SVENELCBbMV0sCisgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgcnVudGltZSBkZXRlY3Rpb24gb2YgTkVPTiBpcyBlbmFibGVkXSldKV0pCisKKyAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgICAqYW5kcm9pZCopIEFDX0NIRUNLX0hFQURFUlMoW2NwdS1mZWF0dXJlcy5oXSkgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgIGVzYWMKKyAgQUNfU1VCU1QoW05FT05fRkxBR1NdKV0pCisKK2RubCA9PT0gQ0xFQVJfTElCVkFSUyhbdmFyX3BmeF0pCitkbmwgPT09ICAgQ2xlYXJzIDx2YXJfcGZ4Pl97SU5DTFVERVMsTElCU30uCitBQ19ERUZVTihbQ0xFQVJfTElCVkFSU10sIFskMV9JTkNMVURFUz0iIjsgJDFfTElCUz0iIl0pCisKK2RubCA9PT0gV0lUSExJQl9PUFRJT04oW29wdF9wZnhdLCBbb3V0dmFyX3BmeF0pCitkbmwgPT09ICAgRGVmaW5lcyAtLXdpdGgtPG9wdF9wZng+e2luY2x1ZGUsbGlifWRpciBvcHRpb25zIHdoaWNoIHNldAorZG5sID09PSAgIHRoZSB2YXJpYWJsZXMgPG91dHZhcl9wZng+X3tJTkNMVURFUyxMSUJTfS4KK0FDX0RFRlVOKFtXSVRITElCX09QVElPTl0sCisgIFtBQ19BUkdfV0lUSChbJDFpbmNsdWRlZGlyXSwKKyAgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtJDFpbmNsdWRlZGlyPURJUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlICQyIGluY2x1ZGVzIGZyb20gRElSXSksCisgICAgICAgICAgICAgICAkMl9JTkNMVURFUz0iLUkkd2l0aHZhbCIpCisgICBBQ19BUkdfV0lUSChbJDFsaWJkaXJdLAorICAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC0kMWxpYmRpcj1ESVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZSAkMiBsaWJyYXJpZXMgZnJvbSBESVJdKSwKKyAgICAgICAgICAgICAgIFskMl9MSUJTPSItTCR3aXRodmFsIl0pXSkKKworZG5sID09PSBMSUJDSEVDS19QUk9MT0dVRShbdmFyX3BmeF0pCitkbmwgPT09ICAgQ2FjaGVzIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBDUFBGTEFHUy9MSUJTIGluIFNBVkVEXyogdGhlbgorZG5sID09PSAgIHByZXBlbmRzIHRoZSBjdXJyZW50IHZhbHVlcyB3aXRoIDx2YXJfcGZ4Pl97SU5DTFVERVMsTElCU30uCitBQ19ERUZVTihbTElCQ0hFQ0tfUFJPTE9HVUVdLAorICAgICAgICAgW1NBVkVEX0NQUEZMQUdTPSRDUFBGTEFHUworICAgICAgICAgIFNBVkVEX0xJQlM9JExJQlMKKyAgICAgICAgICBDUFBGTEFHUz0iJCQxX0lOQ0xVREVTICRDUFBGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkJDFfTElCUyAkTElCUyJdKQorCitkbmwgPT09IExJQkNIRUNLX0VQSUxPR1VFKFt2YXJfcGZ4XSkKK2RubCA9PT0gICBSZXN0b3JlcyB0aGUgdmFsdWVzIG9mIENQUEZMQUdTL0xJQlMgZnJvbSBTQVZFRF8qIGFuZCBleHBvcnRzCitkbmwgPT09ICAgPHZhcl9wZng+X3tJTkNMVURFUyxMSUJTfSB3aXRoIEFDX1NVQlNULgorQUNfREVGVU4oW0xJQkNIRUNLX0VQSUxPR1VFXSwKKyAgICAgICAgIFtBQ19TVUJTVCgkMV9MSUJTKQorICAgICAgICAgIEFDX1NVQlNUKCQxX0lOQ0xVREVTKQorICAgICAgICAgIENQUEZMQUdTPSRTQVZFRF9DUFBGTEFHUworICAgICAgICAgIExJQlM9JFNBVkVEX0xJQlNdKQorCitkbmwgPT09IENoZWNrIGZvciBnY2MgYnVpbHRpbnMKKworZG5sID09PSBDSEVDS19GT1JfQlVJTFRJTihbYnVpbHRpbl0sIFtwYXJhbV0sIFtkZWZpbmVdKQorZG5sID09PSAgIGxpbmtzIGEgQyBBQ19MQU5HX1BST0dSQU0sIHdpdGggPGJ1aWx0aW4+KDxwYXJhbT4pCitkbmwgPT09ICAgQUNfREVGSU5FJ2luZyA8ZGVmaW5lPiBpZiBzdWNjZXNzZnVsLgorQUNfREVGVU4oW0NIRUNLX0ZPUl9CVUlMVElOXSwKKyAgICAgICAgIFtBQ19MQU5HX1BVU0goW0NdKQorICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yICQxXSkKKyAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbKHZvaWQpJDEoJDIpXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoWyQzXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmICQxIGlzIGF2YWlsYWJsZV0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pLAorICAgICAgICAgIEFDX0xBTkdfUE9QXSkKKworZG5sIEFDX0NIRUNLX0ZVTkMgZG9lc24ndCB3b3JrIHdpdGggYnVpbHRpbidzLgorQ0hFQ0tfRk9SX0JVSUxUSU4oW19fYnVpbHRpbl9ic3dhcDE2XSwgWzF1IDw8IDE1XSwgW0hBVkVfQlVJTFRJTl9CU1dBUDE2XSkKK0NIRUNLX0ZPUl9CVUlMVElOKFtfX2J1aWx0aW5fYnN3YXAzMl0sIFsxdSA8PCAzMV0sIFtIQVZFX0JVSUxUSU5fQlNXQVAzMl0pCitDSEVDS19GT1JfQlVJTFRJTihbX19idWlsdGluX2Jzd2FwNjRdLCBbMXVsbCA8PCA2M10sIFtIQVZFX0JVSUxUSU5fQlNXQVA2NF0pCisKK2RubCA9PT0gQ2hlY2sgZm9yIHB0aHJlYWQgc3VwcG9ydAorQUNfQVJHX0VOQUJMRShbdGhyZWFkaW5nXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS10aHJlYWRpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgdGhyZWFkIHN1cHBvcnRdKSwsCisgICAgICAgICAgICAgIFtlbmFibGVfdGhyZWFkaW5nPXllc10pCitpZiB0ZXN0ICIkZW5hYmxlX3RocmVhZGluZyIgPSAieWVzIjsgdGhlbgorICBBQ19NU0dfTk9USUNFKFtjaGVja2luZyBmb3IgdGhyZWFkaW5nIHN1cHBvcnQuLi5dKQorICBBWF9QVEhSRUFEKFtBQ19ERUZJTkUoW1dFQlBfVVNFX1RIUkVBRF0sIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtVbmRlZmluZSB0aGlzIHRvIGRpc2FibGUgdGhyZWFkIHN1cHBvcnQuXSkKKyAgICAgICAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgICAgICAgQ0M9IiRQVEhSRUFEX0NDIgorICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgW0FDX0NIRUNLX0ZVTkMoW19iZWdpbnRocmVhZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFtXRUJQX1VTRV9USFJFQURdLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVW5kZWZpbmUgdGhpcyB0byBkaXNhYmxlIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVfdGhyZWFkaW5nPW5vXSldKQorZmkKK0FDX01TR19OT1RJQ0UoW2NoZWNraW5nIGlmIHRocmVhZGluZyBpcyBlbmFibGVkLi4uICR7ZW5hYmxlX3RocmVhZGluZy1ub31dKQorCitkbmwgPT09IGNoZWNrIGZvciBPcGVuR0wvR0xVVCBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFtnbF0sIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZ2xdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgT3BlbkdMIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfZ2wiICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtHTF0pCisgIFdJVEhMSUJfT1BUSU9OKFtnbF0sIFtHTF0pCisKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW0dMXSkKKworICBnbHV0X2NmbGFncz0ibm9uZSIKKyAgZ2x1dF9sZGZsYWdzPSJub25lIgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikKKyAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBPU1ggYnVpbGRzLiBBcHBlbmQgdGhlc2UgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0bworICAgICAgIyBvdmVycmlkZSB3aXRoIC0td2l0aC1nbCoKKyAgICAgIGdsdXRfY2ZsYWdzPSIkZ2x1dF9jZmxhZ3N8LWZyYW1ld29yayBHTFVUIC1mcmFtZXdvcmsgT3BlbkdMIgorICAgICAgZ2x1dF9sZGZsYWdzPSIkZ2x1dF9sZGZsYWdzfC1mcmFtZXdvcmsgR0xVVCAtZnJhbWV3b3JrIE9wZW5HTCIKKyAgICAgICMgcXVpZXQgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIGdsdXQKKyAgICAgIFRFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXSkKKyAgICAgIDs7CisgIGVzYWMKKworICBHTFVUX1NBVkVEX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgIFNBVkVEX0lGUz0iJElGUyIKKyAgSUZTPSJ8IgorICBmb3IgZmxhZyBpbiAkZ2x1dF9jZmxhZ3M7IGRvCisgICAgIyByZXN0b3JlIElGUyBpbW1lZGlhdGVseSBhcyB0aGUgYXV0b2NvbmYgbWFjcm9zIG1heSBuZWVkIHRoZSBkZWZhdWx0LgorICAgIElGUz0iJFNBVkVEX0lGUyIKKyAgICB1bnNldCBhY19jdl9oZWFkZXJfR0xfZ2x1dF9oCisgICAgdW5zZXQgYWNfY3ZfaGVhZGVyX09wZW5HTF9nbHV0X2gKKworICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgIG5vbmUpIDs7CisgICAgICAqKSBDUFBGTEFHUz0iJGZsYWcgJENQUEZMQUdTIjs7CisgICAgZXNhYworICAgIEFDX0NIRUNLX0hFQURFUlMoW0dML2dsdXQuaCBHTFVUL2dsdXQuaCBPcGVuR0wvZ2x1dC5oXSwKKyAgICAgICAgICAgICAgICAgICAgIFtnbHV0X2hlYWRlcnM9eWVzOworICAgICAgICAgICAgICAgICAgICAgIHRlc3QgIiRmbGFnIiA9ICJub25lIiB8fCBHTF9JTkNMVURFUz0iJENQUEZMQUdTIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVha10pCisgICAgQ1BQRkxBR1M9IiRHTFVUX1NBVkVEX0NQUEZMQUdTIgorICAgIHRlc3QgIiRnbHV0X2hlYWRlcnMiID0gInllcyIgJiYgYnJlYWsKKyAgZG9uZQorICBJRlM9IiRTQVZFRF9JRlMiCisKKyAgaWYgdGVzdCAiJGdsdXRfaGVhZGVycyIgPSAieWVzIjsgdGhlbgorICAgIEFDX0xBTkdfUFVTSChbQ10pCisgICAgR0xVVF9TQVZFRF9MREZMQUdTPSIkTERGTEFHUyIKKyAgICBTQVZFRF9JRlM9IiRJRlMiCisgICAgSUZTPSJ8IgorICAgIGZvciBmbGFnIGluICRnbHV0X2xkZmxhZ3M7IGRvCisgICAgICAjIHJlc3RvcmUgSUZTIGltbWVkaWF0ZWx5IGFzIHRoZSBhdXRvY29uZiBtYWNyb3MgbWF5IG5lZWQgdGhlIGRlZmF1bHQuCisgICAgICBJRlM9IiRTQVZFRF9JRlMiCisgICAgICB1bnNldCBhY19jdl9zZWFyY2hfZ2xCZWdpbgorCisgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgIG5vbmUpIDs7CisgICAgICAgICopIExERkxBR1M9IiRmbGFnICRMREZMQUdTIjs7CisgICAgICBlc2FjCisKKyAgICAgICMgZmluZCBsaWJHTAorICAgICAgR0xfU0FWRURfTElCUz0iJExJQlMiCisgICAgICBBQ19TRUFSQ0hfTElCUyhbZ2xCZWdpbl0sIFtHTCBPcGVuR0wgb3BlbmdsMzJdKQorICAgICAgTElCUz0iJEdMX1NBVkVEX0xJQlMiCisKKyAgICAgICMgQSBkaXJlY3QgbGluayB0byBsaWJHTCBtYXkgbm90IGJlIG5lY2Vzc2FyeSBvbiBlLmcuLCBsaW51eC4KKyAgICAgIEdMVVRfU0FWRURfTElCUz0iJExJQlMiCisgICAgICBmb3IgbGliIGluICIiICItbGdsdXQiICItbGdsdXQgJGFjX2N2X3NlYXJjaF9nbEJlZ2luIjsgZG8KKyAgICAgICAgTElCUz0iJGxpYiIKKyAgICAgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbCisgICAgICAgICAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgICAgICAgIyBkZWZpbmUgRVhURVJOX0MgZXh0ZXJuICJDIgorICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIyBkZWZpbmUgRVhURVJOX0MKKyAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICBFWFRFUk5fQyBjaGFyIGdsT3J0aG8oKTsKKyAgICAgICAgICAgICBFWFRFUk5fQyBjaGFyIGdsdXRNYWluTG9vcCgpOworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgZ2xPcnRobygpOworICAgICAgICAgICAgIGdsdXRNYWluTG9vcCgpOworICAgICAgICAgICAgXSkKKyAgICAgICAgICBdLAorICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfR0wsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIE9wZW5HTCBpcyBzdXBwb3J0ZWRdKQorICAgICAgICAgIFtnbHV0X3N1cHBvcnQ9eWVzXSwgW10KKyAgICAgICAgKQorICAgICAgICBpZiB0ZXN0ICIkZ2x1dF9zdXBwb3J0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgR0xfTElCUz0iJExERkxBR1MgJGxpYiIKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgTElCUz0iJEdMVVRfU0FWRURfTElCUyIKKyAgICAgIExERkxBR1M9IiRHTFVUX1NBVkVEX0xERkxBR1MiCisgICAgICB0ZXN0ICIkZ2x1dF9zdXBwb3J0IiA9ICJ5ZXMiICYmIGJyZWFrCisgICAgZG9uZQorICAgIElGUz0iJFNBVkVEX0lGUyIKKyAgICBBQ19MQU5HX1BPUAorICBmaQorCisgIExJQkNIRUNLX0VQSUxPR1VFKFtHTF0pCisKKyAgaWYgdGVzdCAiJGdsdXRfc3VwcG9ydCIgPSAieWVzIiAtYSAiJGVuYWJsZV9saWJ3ZWJwZGVtdXgiID0gInllcyI7IHRoZW4KKyAgICBidWlsZF92d2VicD15ZXMKKyAgZmkKK10pCitBTV9DT05ESVRJT05BTChbQlVJTERfVldFQlBdLCBbdGVzdCAiJGJ1aWxkX3Z3ZWJwIiA9ICJ5ZXMiXSkKKworZG5sID09PSBjaGVjayBmb3IgU0RMIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW3NkbF0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc2RsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIFNETCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3NkbCIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW1NETF0pCisgIEFDX1BBVEhfUFJPR1MoW0xJQlNETF9DT05GSUddLCBbc2RsLWNvbmZpZ10pCisgIGlmIHRlc3QgLW4gIiRMSUJTRExfQ09ORklHIjsgdGhlbgorICAgIFNETF9JTkNMVURFUz1gJExJQlNETF9DT05GSUcgLS1jZmxhZ3NgCisgICAgU0RMX0xJQlM9ImAkTElCU0RMX0NPTkZJRyAtLWxpYnNgIgorICBmaQorCisgIFdJVEhMSUJfT1BUSU9OKFtzZGxdLCBbU0RMXSkKKworICBzZGxfaGVhZGVyPSJubyIKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW1NETF0pCisgIEFDX0NIRUNLX0hFQURFUihbU0RML1NETC5oXSwgW3NkbF9oZWFkZXI9IlNETC9TREwuaCJdLAorICAgICAgICAgICAgICAgICAgW0FDX0NIRUNLX0hFQURFUihbU0RMLmhdLCBbc2RsX2hlYWRlcj0iU0RMLmgiXSwKKyAgICAgICAgICAgICAgICAgIFtBQ19NU0dfV0FSTihTREwgbGlicmFyeSBub3QgYXZhaWxhYmxlIC0gbm8gc2RsLmgpXSldKQorICBpZiB0ZXN0IHgiJHNkbF9oZWFkZXIiICE9ICJ4bm8iOyB0aGVuCisgICAgQUNfTEFOR19QVVNIKEMpCisgICAgU0RMX1NBVkVEX0xJQlM9IiRMSUJTIgorICAgIGZvciBsaWIgaW4gIiIgIi1sU0RMIiAiLWxTRExtYWluIC1sU0RMIjsgZG8KKyAgICAgIExJQlM9IiRTRExfU0FWRURfTElCUyAkbGliIgorICAgICAgIyBQZXJmb3JtIGEgZnVsbCBsaW5rIHRvIGVuc3VyZSBTRExfbWFpbiBpcyByZXNvbHZlZCBpZiBuZWVkZWQuCisgICAgICBBQ19MSU5LX0lGRUxTRSgKKyAgICAgICAgW0FDX0xBTkdfU09VUkNFKFsKKyAgICAgICAgICAgI2luY2x1ZGUgPCRzZGxfaGVhZGVyPgorICAgICAgICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICAgICAgICAgICBTRExfSW5pdCgwKTsKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgfV0pXSwKKyAgICAgICAgW1NETF9MSUJTPSIkTERGTEFHUyAkTElCUyIKKyAgICAgICAgIFNETF9JTkNMVURFUz0iJFNETF9JTkNMVURFUyAtRFdFQlBfSEFWRV9TREwiCisgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX1NETCwgWzFdLAorICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBTREwgbGlicmFyeSBpcyBpbnN0YWxsZWRdKQorICAgICAgICAgc2RsX3N1cHBvcnQ9eWVzXQorICAgICAgKQorICAgICAgaWYgdGVzdCB4IiRzZGxfc3VwcG9ydCIgPSAieHllcyI7IHRoZW4KKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgICMgTElCUyBpcyByZXN0b3JlZCBieSBMSUJDSEVDS19FUElMT0dVRQorICAgIEFDX0xBTkdfUE9QCisgICAgaWYgdGVzdCB4IiRzZGxfaGVhZGVyIiA9ICJ4U0RMLmgiOyB0aGVuCisgICAgICBTRExfSU5DTFVERVM9IiRTRExfSU5DTFVERVMgLURXRUJQX0hBVkVfSlVTVF9TRExfSCIKKyAgICBmaQorICBmaQorICBMSUJDSEVDS19FUElMT0dVRShbU0RMXSkKKworICBpZiB0ZXN0IHgiJHNkbF9zdXBwb3J0IiA9ICJ4eWVzIjsgdGhlbgorICAgIGJ1aWxkX3Z3ZWJwX3NkbD15ZXMKKyAgZWxzZQorICAgIEFDX01TR19XQVJOKE9wdGlvbmFsIFNETCBsaWJyYXJ5IG5vdCBmb3VuZCkKKyAgZmkKK10pCisKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9WV0VCUF9TRExdLCBbdGVzdCAiJGJ1aWxkX3Z3ZWJwX3NkbCIgPSAieWVzIl0pCisKK2RubCA9PT0gY2hlY2sgZm9yIFBORyBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFtwbmddLCBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXBuZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgUE5HIGZvcm1hdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9wbmciICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtQTkddKQorICBBQ19QQVRIX1BST0dTKFtMSUJQTkdfQ09ORklHXSwKKyAgICAgICAgICAgICAgICBbbGlicG5nLWNvbmZpZyBsaWJwbmcxNi1jb25maWcgbGlicG5nMTUtY29uZmlnIGxpYnBuZzE0LWNvbmZpZyBcCisgICAgICAgICAgICAgICAgIGxpYnBuZzEyLWNvbmZpZ10pCisgIGlmIHRlc3QgLW4gIiRMSUJQTkdfQ09ORklHIjsgdGhlbgorICAgIFBOR19JTkNMVURFUz1gJExJQlBOR19DT05GSUcgLS1jZmxhZ3NgCisgICAgUE5HX0xJQlM9ImAkTElCUE5HX0NPTkZJRyAtLWxkZmxhZ3NgIgorICBmaQorCisgIFdJVEhMSUJfT1BUSU9OKFtwbmddLCBbUE5HXSkKKworICBMSUJDSEVDS19QUk9MT0dVRShbUE5HXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKHBuZy5oLAorICAgIEFDX1NFQVJDSF9MSUJTKHBuZ19nZXRfbGlicG5nX3ZlciwgW3BuZ10sCisgICAgICAgICAgICAgICAgICAgW3Rlc3QgIiRhY19jdl9zZWFyY2hfcG5nX2dldF9saWJwbmdfdmVyIiA9ICJub25lIHJlcXVpcmVkIiBcCisgICAgICAgICAgICAgICAgICAgICAgfHwgUE5HX0xJQlM9IiRQTkdfTElCUyAkYWNfY3Zfc2VhcmNoX3BuZ19nZXRfbGlicG5nX3ZlciIKKyAgICAgICAgICAgICAgICAgICAgUE5HX0lOQ0xVREVTPSIkUE5HX0lOQ0xVREVTIC1EV0VCUF9IQVZFX1BORyIKKyAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9QTkcsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBQTkcgbGlicmFyeSBpcyBpbnN0YWxsZWRdKQorICAgICAgICAgICAgICAgICAgICBwbmdfc3VwcG9ydD15ZXMKKyAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfV0FSTihPcHRpb25hbCBwbmcgbGlicmFyeSBub3QgZm91bmQpCisgICAgICAgICAgICAgICAgICAgIFBOR19MSUJTPSIiCisgICAgICAgICAgICAgICAgICAgIFBOR19JTkNMVURFUz0iIgorICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgWyRNQVRIX0xJQlNdKSwKKyAgICBbQUNfTVNHX1dBUk4ocG5nIGxpYnJhcnkgbm90IGF2YWlsYWJsZSAtIG5vIHBuZy5oKQorICAgICBQTkdfTElCUz0iIgorICAgICBQTkdfSU5DTFVERVM9IiIKKyAgICBdLAorICApCisgIExJQkNIRUNLX0VQSUxPR1VFKFtQTkddKQorXSkKKworZG5sID09PSBjaGVjayBmb3IgSlBFRyBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFtqcGVnXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1qcGVnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIEpQRUcgZm9ybWF0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfanBlZyIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW0pQRUddKQorICBXSVRITElCX09QVElPTihbanBlZ10sIFtKUEVHXSkKKworICBMSUJDSEVDS19QUk9MT0dVRShbSlBFR10pCisgIEFDX0NIRUNLX0hFQURFUihqcGVnbGliLmgsCisgICAgQUNfQ0hFQ0tfTElCKGpwZWcsIGpwZWdfc2V0X2RlZmF1bHRzLAorICAgICAgICAgICAgICAgICBbSlBFR19MSUJTPSIkSlBFR19MSUJTIC1sanBlZyIKKyAgICAgICAgICAgICAgICAgIEpQRUdfSU5DTFVERVM9IiRKUEVHX0lOQ0xVREVTIC1EV0VCUF9IQVZFX0pQRUciCisgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX0pQRUcsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgSlBFRyBsaWJyYXJ5IGlzIGluc3RhbGxlZF0pCisgICAgICAgICAgICAgICAgICBqcGVnX3N1cHBvcnQ9eWVzCisgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKE9wdGlvbmFsIGpwZWcgbGlicmFyeSBub3QgZm91bmQpLAorICAgICAgICAgICAgICAgICBbJE1BVEhfTElCU10pLAorICAgIEFDX01TR19XQVJOKGpwZWcgbGlicmFyeSBub3QgYXZhaWxhYmxlIC0gbm8ganBlZ2xpYi5oKQorICApCisgIExJQkNIRUNLX0VQSUxPR1VFKFtKUEVHXSkKK10pCisKK2RubCA9PT0gY2hlY2sgZm9yIFRJRkYgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbdGlmZl0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGlmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBUSUZGIGZvcm1hdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3RpZmYiICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtUSUZGXSkKKyAgV0lUSExJQl9PUFRJT04oW3RpZmZdLCBbVElGRl0pCisKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW1RJRkZdKQorICBBQ19DSEVDS19IRUFERVIodGlmZmlvLmgsCisgICAgQUNfQ0hFQ0tfTElCKHRpZmYsIFRJRkZHZXRWZXJzaW9uLAorICAgICAgICAgICAgICAgICBbVElGRl9MSUJTPSIkVElGRl9MSUJTIC1sdGlmZiIKKyAgICAgICAgICAgICAgICAgIFRJRkZfSU5DTFVERVM9IiRUSUZGX0lOQ0xVREVTIC1EV0VCUF9IQVZFX1RJRkYiCisgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX1RJRkYsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgVElGRiBsaWJyYXJ5IGlzIGluc3RhbGxlZF0pCisgICAgICAgICAgICAgICAgICB0aWZmX3N1cHBvcnQ9eWVzCisgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKE9wdGlvbmFsIHRpZmYgbGlicmFyeSBub3QgZm91bmQpLAorICAgICAgICAgICAgICAgICBbJE1BVEhfTElCU10pLAorICAgIEFDX01TR19XQVJOKHRpZmYgbGlicmFyeSBub3QgYXZhaWxhYmxlIC0gbm8gdGlmZmlvLmgpCisgICkKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW1RJRkZdKQorXSkKKworZG5sID09PSBjaGVjayBmb3IgR0lGIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW2dpZl0sIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZ2lmXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBHSUYgZm9ybWF0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX2dpZiIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW0dJRl0pCisgIFdJVEhMSUJfT1BUSU9OKFtnaWZdLCBbR0lGXSkKKworICBMSUJDSEVDS19QUk9MT0dVRShbR0lGXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKGdpZl9saWIuaCwKKyAgICBBQ19DSEVDS19MSUIoW2dpZl0sIFtER2lmT3BlbkZpbGVIYW5kbGVdLAorICAgICAgICAgICAgICAgICBbR0lGX0xJQlM9IiRHSUZfTElCUyAtbGdpZiIKKyAgICAgICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfR0lGLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIEdJRiBsaWJyYXJ5IGlzIGluc3RhbGxlZF0pCisgICAgICAgICAgICAgICAgICBnaWZfc3VwcG9ydD15ZXMKKyAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oT3B0aW9uYWwgZ2lmIGxpYnJhcnkgbm90IGZvdW5kKSwKKyAgICAgICAgICAgICAgICAgWyRNQVRIX0xJQlNdKSwKKyAgICBBQ19NU0dfV0FSTihnaWYgbGlicmFyeSBub3QgYXZhaWxhYmxlIC0gbm8gZ2lmX2xpYi5oKQorICApCisgIExJQkNIRUNLX0VQSUxPR1VFKFtHSUZdKQorCisgIGlmIHRlc3QgIiRnaWZfc3VwcG9ydCIgPSAieWVzIiAtYSBcCisgICAgICAgICAgIiRlbmFibGVfbGlid2VicGRlbXV4IiA9ICJ5ZXMiOyB0aGVuCisgICAgYnVpbGRfYW5pbV9kaWZmPXllcworICBmaQorCisgIGlmIHRlc3QgIiRnaWZfc3VwcG9ydCIgPSAieWVzIiAtYSBcCisgICAgICAgICAgIiRlbmFibGVfbGlid2VicG11eCIgPSAieWVzIjsgdGhlbgorICAgIGJ1aWxkX2dpZjJ3ZWJwPXllcworICBmaQorXSkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9BTklNRElGRl0sIFt0ZXN0ICIke2J1aWxkX2FuaW1fZGlmZn0iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX0dJRjJXRUJQXSwgW3Rlc3QgIiR7YnVpbGRfZ2lmMndlYnB9IiA9ICJ5ZXMiXSkKKworaWYgdGVzdCAiJGVuYWJsZV9saWJ3ZWJwZGVtdXgiID0gInllcyIgLWEgIiRlbmFibGVfbGlid2VicG11eCIgPSAieWVzIjsgdGhlbgorICBidWlsZF9pbWcyd2VicD15ZXMKK2ZpCitBTV9DT05ESVRJT05BTChbQlVJTERfSU1HMldFQlBdLCBbdGVzdCAiJHtidWlsZF9pbWcyd2VicH0iID0gInllcyJdKQorCitpZiB0ZXN0ICIkZW5hYmxlX2xpYndlYnBtdXgiID0gInllcyI7IHRoZW4KKyAgYnVpbGRfd2VicGluZm89eWVzCitmaQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX1dFQlBJTkZPXSwgW3Rlc3QgIiR7YnVpbGRfd2VicGluZm99IiA9ICJ5ZXMiXSkKKworZG5sID09PSBjaGVjayBmb3IgV0lDIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW3dpY10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtd2ljXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoV0lDKSBkZXRlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pLCwKKyAgICAgICAgICAgICAgW2VuYWJsZV93aWM9eWVzXSkKKworY2FzZSAkaG9zdF9vcyBpbgorbWluZ3cqKQoraWYgdGVzdCAiJGVuYWJsZV93aWMiID0gInllcyI7IHRoZW4KKyAgQUNfQ0hFQ0tfSEVBREVSUyhbd2luY29kZWMuaCBzaGx3YXBpLmggd2luZG93cy5oXSkKKyAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl93aW5jb2RlY19oIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IHN1cHBvcnQpCisgICAgU0FWRURfTElCUz0kTElCUworICAgIExJQlM9Ii1sc2hsd2FwaSAtbG9sZTMyICRMSUJTIgorICAgICMgbWF0Y2ggaW5jbHVkZSBzdHJ1Y3R1cmUgZnJvbSBbY2Rdd2VicC5jCisgICAgd2ljX2hlYWRlcnM9IgorICAgICAgI2RlZmluZSBJTklUR1VJRAorICAgICAgI2RlZmluZSBDSU5URVJGQUNFCisgICAgICAjZGVmaW5lIENPQkpNQUNST1MKKyAgICAgICNkZWZpbmUgX1dJTjMyX0lFIDB4NTAwCisKKyAgICAgICNpbmNsdWRlIDxzaGx3YXBpLmg+CisgICAgICAjaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAgI2luY2x1ZGUgPHdpbmNvZGVjLmg+CisgICAgICAiCisgICAgIyB0ZXN0IGZvciBmdW5jdGlvbnMgZnJvbSBlYWNoIGxpYiBhbmQgdGhlIEdVSUQgaXMgY3JlYXRlZCBwcm9wZXJseQorICAgIHdpY19tYWluPSIKKyAgICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICAgQ0xTSURfV0lDSW1hZ2luZ0ZhY3Rvcnk7CisgICAgICAgIENvSW5pdGlhbGl6ZShOVUxMKTsKKyAgICAgICAgU0hDcmVhdGVTdHJlYW1PbkZpbGUoTlVMTCwgMCwgTlVMTCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgIgorICAgIEFDX0xBTkdfUFVTSChDKQorICAgIEFDX0xJTktfSUZFTFNFKAorICAgICAgW0FDX0xBTkdfU09VUkNFKFsKKyAgICAgICAgICR3aWNfaGVhZGVycworICAgICAgICAgJHdpY19tYWluXSldLAorICAgICAgW3dpY19zdXBwb3J0PXllc10sCisgICAgICBbd2ljX3N1cHBvcnQ9bm9dCisgICAgKQorICAgIEFDX0xBTkdfUE9QCisKKyAgICB0ZXN0ICIkd2ljX3N1cHBvcnQiID0gInllcyIgfHwgTElCUz0kU0FWRURfTElCUworICAgIEFDX01TR19SRVNVTFQoJHt3aWNfc3VwcG9ydC1ub30pCisgIGZpCitmaQorZXNhYworCitkbmwgPT09IElmIC0tZW5hYmxlLXN3YXAtMTZiaXQtY3NwIGlzIGRlZmluZWQsIGFkZCAtRFdFQlBfU1dBUF8xNkJJVF9DU1A9MQorCitVU0VfU1dBUF8xNkJJVF9DU1A9IiIKK0FDX01TR19DSEVDS0lORyhpZiAtLWVuYWJsZS1zd2FwLTE2Yml0LWNzcCBvcHRpb24gaXMgc3BlY2lmaWVkKQorQUNfQVJHX0VOQUJMRShbc3dhcC0xNmJpdC1jc3BdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3dhcC0xNmJpdC1jc3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRW5hYmxlIGJ5dGUgc3dhcCBmb3IgMTYgYml0IGNvbG9yc3BhY2VzXSkpCitpZiB0ZXN0ICIkZW5hYmxlX3N3YXBfMTZiaXRfY3NwIiA9ICJ5ZXMiOyB0aGVuCisgIFVTRV9TV0FQXzE2QklUX0NTUD0iLURXRUJQX1NXQVBfMTZCSVRfQ1NQPTEiCitmaQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9zd2FwXzE2Yml0X2NzcC1ub30pCitBQ19TVUJTVChVU0VfU1dBUF8xNkJJVF9DU1ApCisKK2RubCA9PT0gSWYgLS1kaXNhYmxlLW5lYXItbG9zc2xlc3MgaXMgZGVmaW5lZCwgYWRkIC1EV0VCUF9ORUFSX0xPU1NMRVNTPTAKKworQUNfREVGSU5FKFdFQlBfTkVBUl9MT1NTTEVTUywgWzFdLCBbRW5hYmxlIG5lYXIgbG9zc2xlc3MgZW5jb2RpbmddKQorQUNfTVNHX0NIRUNLSU5HKGlmIC0tZGlzYWJsZS1uZWFyLWxvc3NsZXNzIG9wdGlvbiBpcyBzcGVjaWZpZWQpCitBQ19BUkdfRU5BQkxFKFtuZWFyX2xvc3NsZXNzXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1uZWFyLWxvc3NsZXNzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgbmVhciBsb3NzbGVzcyBlbmNvZGluZ10pLAorICAgICAgICAgICAgICBbXSwgW2VuYWJsZV9uZWFyX2xvc3NsZXNzPXllc10pCitpZiB0ZXN0ICIkZW5hYmxlX25lYXJfbG9zc2xlc3MiID0gIm5vIjsgdGhlbgorICBBQ19ERUZJTkUoV0VCUF9ORUFSX0xPU1NMRVNTLCBbMF0sIFtFbmFibGUgbmVhciBsb3NzbGVzcyBlbmNvZGluZ10pCisgIEFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisgIEFDX01TR19SRVNVTFQoW25vXSkKK2ZpCisKK2RubCA9PT0gQ2hlY2sgd2hldGhlciBsaWJ3ZWJwbXV4IHNob3VsZCBiZSBidWlsdAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbGlid2VicG11eCBpcyB0byBiZSBidWlsdCkKK0FDX0FSR19FTkFCTEUoW2xpYndlYnBtdXhdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlid2VicG11eF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCdWlsZCBsaWJ3ZWJwbXV4IEA8OkBkZWZhdWx0PW5vQDo+QF0pKQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9saWJ3ZWJwbXV4LW5vfSkKK0FNX0NPTkRJVElPTkFMKFtXQU5UX01VWF0sIFt0ZXN0ICIkZW5hYmxlX2xpYndlYnBtdXgiID0gInllcyJdKQorCitkbmwgPT09IENoZWNrIHdoZXRoZXIgbGlid2VicGRlbXV4IHNob3VsZCBiZSBidWlsdAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbGlid2VicGRlbXV4IGlzIHRvIGJlIGJ1aWx0KQorQUNfQVJHX0VOQUJMRShbbGlid2VicGRlbXV4XSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ3ZWJwZGVtdXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBsaWJ3ZWJwZGVtdXggQDw6QGRlZmF1bHQ9bm9AOj5AXSksCisgICAgICAgICAgICAgIFtdLCBbZW5hYmxlX2xpYndlYnBkZW11eD15ZXNdKQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9saWJ3ZWJwZGVtdXgtbm99KQorQU1fQ09ORElUSU9OQUwoW1dBTlRfREVNVVhdLCBbdGVzdCAiJGVuYWJsZV9saWJ3ZWJwZGVtdXgiID0gInllcyJdKQorCitkbmwgPT09IENoZWNrIHdoZXRoZXIgZGVjb2RlciBsaWJyYXJ5IHNob3VsZCBiZSBidWlsdC4KK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGRlY29kZXIgbGlicmFyeSBpcyB0byBiZSBidWlsdCkKK0FDX0FSR19FTkFCTEUoW2xpYndlYnBkZWNvZGVyXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYndlYnBkZWNvZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0J1aWxkIGxpYndlYnBkZWNvZGVyIEA8OkBkZWZhdWx0PW5vQDo+QF0pKQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9saWJ3ZWJwZGVjb2Rlci1ub30pCitBTV9DT05ESVRJT05BTChbQlVJTERfTElCV0VCUERFQ09ERVJdLCBbdGVzdCAiJGVuYWJsZV9saWJ3ZWJwZGVjb2RlciIgPSAieWVzIl0pCisKK2RubCA9PT0gQ2hlY2sgd2hldGhlciBsaWJ3ZWJwZXh0cmFzIHNob3VsZCBiZSBidWlsdAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbGlid2VicGV4dHJhcyBpcyB0byBiZSBidWlsdCkKK0FDX0FSR19FTkFCTEUoW2xpYndlYnBleHRyYXNdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlid2VicGV4dHJhc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCdWlsZCBsaWJ3ZWJwZXh0cmFzIEA8OkBkZWZhdWx0PW5vQDo+QF0pKQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9saWJ3ZWJwZXh0cmFzLW5vfSkKK0FNX0NPTkRJVElPTkFMKFtXQU5UX0VYVFJBU10sIFt0ZXN0ICIkZW5hYmxlX2xpYndlYnBleHRyYXMiID0gInllcyJdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PQorCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCitBQ19DT05GSUdfSEVBREVSUyhbc3JjL3dlYnAvY29uZmlnLmhdKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBzcmMvTWFrZWZpbGUgbWFuL01ha2VmaWxlIFwKKyAgICAgICAgICAgICAgICAgZXhhbXBsZXMvTWFrZWZpbGUgZXh0cmFzL01ha2VmaWxlIGltYWdlaW8vTWFrZWZpbGUgXAorICAgICAgICAgICAgICAgICBzcmMvZGVjL01ha2VmaWxlIHNyYy9lbmMvTWFrZWZpbGUgc3JjL2RzcC9NYWtlZmlsZSBcCisgICAgICAgICAgICAgICAgIHNyYy9kZW11eC9NYWtlZmlsZSBzcmMvbXV4L01ha2VmaWxlIFwKKyAgICAgICAgICAgICAgICAgc3JjL3V0aWxzL01ha2VmaWxlIFwKKyAgICAgICAgICAgICAgICAgc3JjL2xpYndlYnAucGMgc3JjL2xpYndlYnBkZWNvZGVyLnBjIFwKKyAgICAgICAgICAgICAgICAgc3JjL2RlbXV4L2xpYndlYnBkZW11eC5wYyBzcmMvbXV4L2xpYndlYnBtdXgucGNdKQorCisKK0FDX09VVFBVVAorCitBQ19NU0dfTk9USUNFKFsKK1dlYlAgQ29uZmlndXJhdGlvbiBTdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaGFyZWQgbGlicmFyaWVzOiAke2VuYWJsZV9zaGFyZWR9CitTdGF0aWMgbGlicmFyaWVzOiAke2VuYWJsZV9zdGF0aWN9CitUaHJlYWRpbmcgc3VwcG9ydDogJHtlbmFibGVfdGhyZWFkaW5nLW5vfQorbGlid2VicDogeWVzCitsaWJ3ZWJwZGVjb2RlcjogJHtlbmFibGVfbGlid2VicGRlY29kZXItbm99CitsaWJ3ZWJwZGVtdXg6ICR7ZW5hYmxlX2xpYndlYnBkZW11eC1ub30KK2xpYndlYnBtdXg6ICR7ZW5hYmxlX2xpYndlYnBtdXgtbm99CitsaWJ3ZWJwZXh0cmFzOiAke2VuYWJsZV9saWJ3ZWJwZXh0cmFzLW5vfQorCitUb29sczoKK2N3ZWJwIDogJHtlbmFibGVfbGlid2VicGRlbXV4LW5vfQorICBJbnB1dCBmb3JtYXQgc3VwcG9ydAorICA9PT09PT09PT09PT09PT09PT09PQorICBKUEVHIDogJHtqcGVnX3N1cHBvcnQtbm99CisgIFBORyAgOiAke3BuZ19zdXBwb3J0LW5vfQorICBUSUZGIDogJHt0aWZmX3N1cHBvcnQtbm99CisgIFdJQyAgOiAke3dpY19zdXBwb3J0LW5vfQorZHdlYnAgOiAke2VuYWJsZV9saWJ3ZWJwZGVtdXgtbm99CisgIE91dHB1dCBmb3JtYXQgc3VwcG9ydAorICA9PT09PT09PT09PT09PT09PT09PT0KKyAgUE5HICA6ICR7cG5nX3N1cHBvcnQtbm99CisgIFdJQyAgOiAke3dpY19zdXBwb3J0LW5vfQorR0lGIHN1cHBvcnQgOiAke2dpZl9zdXBwb3J0LW5vfQorYW5pbV9kaWZmICAgOiAke2J1aWxkX2FuaW1fZGlmZi1ub30KK2dpZjJ3ZWJwICAgIDogJHtidWlsZF9naWYyd2VicC1ub30KK2ltZzJ3ZWJwICAgIDogJHtidWlsZF9pbWcyd2VicC1ub30KK3dlYnBtdXggICAgIDogJHtlbmFibGVfbGlid2VicG11eC1ub30KK3Z3ZWJwICAgICAgIDogJHtidWlsZF92d2VicC1ub30KK3dlYnBpbmZvICAgIDogJHtidWlsZF93ZWJwaW5mby1ub30KK1NETCBzdXBwb3J0IDogJHtzZGxfc3VwcG9ydC1ub30KK3Z3ZWJwX3NkbCAgIDogJHtidWlsZF92d2VicF9zZGwtbm99CitdKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2FscGhhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxYzQ4MS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQWxwaGEtcGxhbmUgZGVjb21wcmVzc2lvbi4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvZmlsdGVycy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNvZGVzIHRoZSBjb21wcmVzc2VkIGRhdGEgJ2RhdGEnIG9mIHNpemUgJ2RhdGFfc2l6ZScgaW50byB0aGUgJ291dHB1dCcuCi0vLyBUaGUgJ291dHB1dCcgYnVmZmVyIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkIGFuZCBtdXN0IGJlIG9mIHRoZSBzYW1lCi0vLyBkaW1lbnNpb24gJ2hlaWdodCd4J3dpZHRoJywgYXMgdGhhdCBvZiB0aGUgaW1hZ2UuCi0vLwotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3NmdWxseSBkZWNvZGluZyB0aGUgY29tcHJlc3NlZCBhbHBoYSBhbmQKLS8vICAgICAgICAgMCBpZiBlaXRoZXI6Ci0vLyAgICAgICAgICAgZXJyb3IgaW4gYml0LXN0cmVhbSBoZWFkZXIgKGludmFsaWQgY29tcHJlc3Npb24gbW9kZSBvciBmaWx0ZXIpLCBvcgotLy8gICAgICAgICAgIGVycm9yIHJldHVybmVkIGJ5IGFwcHJvcHJpYXRlIGNvbXByZXNzaW9uIG1ldGhvZC4KLQotc3RhdGljIGludCBEZWNvZGVBbHBoYShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQ4X3QqIG91dHB1dCkgewotICBXRUJQX0ZJTFRFUl9UWVBFIGZpbHRlcjsKLSAgaW50IHByZV9wcm9jZXNzaW5nOwotICBpbnQgcnNydjsKLSAgaW50IG9rID0gMDsKLSAgaW50IG1ldGhvZDsKLSAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGFfZGF0YSA9IGRhdGEgKyBBTFBIQV9IRUFERVJfTEVOOwotICBjb25zdCBzaXplX3QgYWxwaGFfZGF0YV9zaXplID0gZGF0YV9zaXplIC0gQUxQSEFfSEVBREVSX0xFTjsKLQotICBTQl9EQ0hFQ0sod2lkdGggPiAwICYmIGhlaWdodCA+IDApOwotICBTQl9EQ0hFQ0soZGF0YSAhPSBOVUxMICYmIG91dHB1dCAhPSBOVUxMKTsKLQotICBpZiAoZGF0YV9zaXplIDw9IEFMUEhBX0hFQURFUl9MRU4pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIG1ldGhvZCA9IChkYXRhWzBdID4+IDApICYgMHgwMzsKLSAgZmlsdGVyID0gKGRhdGFbMF0gPj4gMikgJiAweDAzOwotICBwcmVfcHJvY2Vzc2luZyA9IChkYXRhWzBdID4+IDQpICYgMHgwMzsKLSAgcnNydiA9IChkYXRhWzBdID4+IDYpICYgMHgwMzsKLSAgaWYgKG1ldGhvZCA8IEFMUEhBX05PX0NPTVBSRVNTSU9OIHx8Ci0gICAgICBtZXRob2QgPiBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTiB8fAotICAgICAgZmlsdGVyID49IFdFQlBfRklMVEVSX0xBU1QgfHwKLSAgICAgIHByZV9wcm9jZXNzaW5nID4gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUyB8fAotICAgICAgcnNydiAhPSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAobWV0aG9kID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGFscGhhX2RlY29kZWRfc2l6ZSA9IGhlaWdodCAqIHdpZHRoOwotICAgIG9rID0gKGFscGhhX2RhdGFfc2l6ZSA+PSBhbHBoYV9kZWNvZGVkX3NpemUpOwotICAgIGlmIChvaykgU2JNZW1vcnlDb3B5KG91dHB1dCwgYWxwaGFfZGF0YSwgYWxwaGFfZGVjb2RlZF9zaXplKTsKLSAgfSBlbHNlIHsKLSAgICBvayA9IFZQOExEZWNvZGVBbHBoYUltYWdlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGFscGhhX2RhdGEsIGFscGhhX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0gIH0KLQotICBpZiAob2spIHsKLSAgICBXZWJQVW5maWx0ZXJGdW5jIHVuZmlsdGVyX2Z1bmMgPSBXZWJQVW5maWx0ZXJzW2ZpbHRlcl07Ci0gICAgaWYgKHVuZmlsdGVyX2Z1bmMgIT0gTlVMTCkgewotICAgICAgLy8gVE9ETyh2aWthcyk6IEltcGxlbWVudCBvbi10aGUtZmx5IGRlY29kaW5nICYgZmlsdGVyIG1lY2hhbmlzbSB0byBkZWNvZGUKLSAgICAgIC8vIGFuZCBhcHBseSBmaWx0ZXIgcGVyIGltYWdlLXJvdy4KLSAgICAgIHVuZmlsdGVyX2Z1bmMod2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dHB1dCk7Ci0gICAgfQotICAgIGlmIChwcmVfcHJvY2Vzc2luZyA9PSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTKSB7Ci0gICAgICBvayA9IERlcXVhbnRpemVMZXZlbHMob3V0cHV0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHVpbnQ4X3QqIFZQOERlY29tcHJlc3NBbHBoYVJvd3MoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MpIHsKLSAgY29uc3QgaW50IHdpZHRoID0gZGVjLT5waWNfaGRyXy53aWR0aF87Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBkZWMtPnBpY19oZHJfLmhlaWdodF87Ci0KLSAgaWYgKHJvdyA8IDAgfHwgbnVtX3Jvd3MgPCAwIHx8IHJvdyArIG51bV9yb3dzID4gaGVpZ2h0KSB7Ci0gICAgcmV0dXJuIE5VTEw7ICAgIC8vIHNhbml0eSBjaGVjay4KLSAgfQotCi0gIGlmIChyb3cgPT0gMCkgewotICAgIC8vIERlY29kZSBldmVyeXRoaW5nIGR1cmluZyB0aGUgZmlyc3QgY2FsbC4KLSAgICBTQl9EQ0hFQ0soIWRlYy0+aXNfYWxwaGFfZGVjb2RlZF8pOwotICAgIGlmICghRGVjb2RlQWxwaGEoZGVjLT5hbHBoYV9kYXRhXywgKHNpemVfdClkZWMtPmFscGhhX2RhdGFfc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBkZWMtPmFscGhhX3BsYW5lXykpIHsKLSAgICAgIHJldHVybiBOVUxMOyAgLy8gRXJyb3IuCi0gICAgfQotICAgIGRlYy0+aXNfYWxwaGFfZGVjb2RlZF8gPSAxOwotICB9Ci0KLSAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWNvZGVkIHJvdy4KLSAgcmV0dXJuIGRlYy0+YWxwaGFfcGxhbmVfICsgcm93ICogd2lkdGg7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2J1ZmZlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU4YWJiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRXZlcnl0aGluZyBhYm91dCBXZWJQRGVjQnVmZmVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXZWJQRGVjQnVmZmVyCi0KLS8vIE51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgZm9yIHRoZSBkaWZmZXJlbnQgY29sb3Itc3BhY2VzLgotc3RhdGljIGNvbnN0IGludCBrTW9kZUJwcFtNT0RFX0xBU1RdID0gewotICAzLCA0LCAzLCA0LCA0LCAyLCAyLAotICA0LCA0LCA0LCAyLCAgICAvLyBwcmUtbXVsdGlwbGllZCBtb2RlcwotICAxLCAxIH07Ci0KLS8vIENoZWNrIHRoYXQgd2VicF9jc3BfbW9kZSBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiBXRUJQX0NTUF9NT0RFLgotLy8gQ29udmVydCB0byBhbiBpbnRlZ2VyIHRvIGhhbmRsZSBib3RoIHRoZSB1bnNpZ25lZC9zaWduZWQgZW51bSBjYXNlcwotLy8gd2l0aG91dCB0aGUgbmVlZCBmb3IgY2FzdGluZyB0byByZW1vdmUgdHlwZSBsaW1pdCB3YXJuaW5ncy4KLXN0YXRpYyBpbnQgSXNWYWxpZENvbG9yc3BhY2UoaW50IHdlYnBfY3NwX21vZGUpIHsKLSAgcmV0dXJuICh3ZWJwX2NzcF9tb2RlID49IE1PREVfUkdCICYmIHdlYnBfY3NwX21vZGUgPCBNT0RFX0xBU1QpOwotfQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBDaGVja0RlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKLSAgaW50IG9rID0gMTsKLSAgY29uc3QgV0VCUF9DU1BfTU9ERSBtb2RlID0gYnVmZmVyLT5jb2xvcnNwYWNlOwotICBjb25zdCBpbnQgd2lkdGggPSBidWZmZXItPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7Ci0gIGlmICghSXNWYWxpZENvbG9yc3BhY2UobW9kZSkpIHsKLSAgICBvayA9IDA7Ci0gIH0gZWxzZSBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsgICAvLyBZVVYgY2hlY2tzCi0gICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKLSAgICBjb25zdCB1aW50NjRfdCB5X3NpemUgPSAodWludDY0X3QpYnVmLT55X3N0cmlkZSAqIGhlaWdodDsKLSAgICBjb25zdCB1aW50NjRfdCB1X3NpemUgPSAodWludDY0X3QpYnVmLT51X3N0cmlkZSAqICgoaGVpZ2h0ICsgMSkgLyAyKTsKLSAgICBjb25zdCB1aW50NjRfdCB2X3NpemUgPSAodWludDY0X3QpYnVmLT52X3N0cmlkZSAqICgoaGVpZ2h0ICsgMSkgLyAyKTsKLSAgICBjb25zdCB1aW50NjRfdCBhX3NpemUgPSAodWludDY0X3QpYnVmLT5hX3N0cmlkZSAqIGhlaWdodDsKLSAgICBvayAmPSAoeV9zaXplIDw9IGJ1Zi0+eV9zaXplKTsKLSAgICBvayAmPSAodV9zaXplIDw9IGJ1Zi0+dV9zaXplKTsKLSAgICBvayAmPSAodl9zaXplIDw9IGJ1Zi0+dl9zaXplKTsKLSAgICBvayAmPSAoYnVmLT55X3N0cmlkZSA+PSB3aWR0aCk7Ci0gICAgb2sgJj0gKGJ1Zi0+dV9zdHJpZGUgPj0gKHdpZHRoICsgMSkgLyAyKTsKLSAgICBvayAmPSAoYnVmLT52X3N0cmlkZSA+PSAod2lkdGggKyAxKSAvIDIpOwotICAgIG9rICY9IChidWYtPnkgIT0gTlVMTCk7Ci0gICAgb2sgJj0gKGJ1Zi0+dSAhPSBOVUxMKTsKLSAgICBvayAmPSAoYnVmLT52ICE9IE5VTEwpOwotICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgewotICAgICAgb2sgJj0gKGJ1Zi0+YV9zdHJpZGUgPj0gd2lkdGgpOwotICAgICAgb2sgJj0gKGFfc2l6ZSA8PSBidWYtPmFfc2l6ZSk7Ci0gICAgICBvayAmPSAoYnVmLT5hICE9IE5VTEwpOwotICAgIH0KLSAgfSBlbHNlIHsgICAgLy8gUkdCIGNoZWNrcwotICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7Ci0gICAgY29uc3QgdWludDY0X3Qgc2l6ZSA9ICh1aW50NjRfdClidWYtPnN0cmlkZSAqIGhlaWdodDsKLSAgICBvayAmPSAoc2l6ZSA8PSBidWYtPnNpemUpOwotICAgIG9rICY9IChidWYtPnN0cmlkZSA+PSB3aWR0aCAqIGtNb2RlQnBwW21vZGVdKTsKLSAgICBvayAmPSAoYnVmLT5yZ2JhICE9IE5VTEwpOwotICB9Ci0gIHJldHVybiBvayA/IFZQOF9TVEFUVVNfT0sgOiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci19Ci0KLXN0YXRpYyBWUDhTdGF0dXNDb2RlIEFsbG9jYXRlQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgewotICBjb25zdCBpbnQgdyA9IGJ1ZmZlci0+d2lkdGg7Ci0gIGNvbnN0IGludCBoID0gYnVmZmVyLT5oZWlnaHQ7Ci0gIGNvbnN0IFdFQlBfQ1NQX01PREUgbW9kZSA9IGJ1ZmZlci0+Y29sb3JzcGFjZTsKLQotICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCAhSXNWYWxpZENvbG9yc3BhY2UobW9kZSkpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICB9Ci0KLSAgaWYgKCFidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSAmJiBidWZmZXItPnByaXZhdGVfbWVtb3J5ID09IE5VTEwpIHsKLSAgICB1aW50OF90KiBvdXRwdXQ7Ci0gICAgaW50IHV2X3N0cmlkZSA9IDAsIGFfc3RyaWRlID0gMDsKLSAgICB1aW50NjRfdCB1dl9zaXplID0gMCwgYV9zaXplID0gMCwgdG90YWxfc2l6ZTsKLSAgICAvLyBXZSBuZWVkIG1lbW9yeSBhbmQgaXQgaGFzbid0IGJlZW4gYWxsb2NhdGVkIHlldC4KLSAgICAvLyA9PiBpbml0aWFsaXplIG91dHB1dCBidWZmZXIsIG5vdyB0aGF0IGRpbWVuc2lvbnMgYXJlIGtub3duLgotICAgIGNvbnN0IGludCBzdHJpZGUgPSB3ICoga01vZGVCcHBbbW9kZV07Ci0gICAgY29uc3QgdWludDY0X3Qgc2l6ZSA9ICh1aW50NjRfdClzdHJpZGUgKiBoOwotCi0gICAgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7Ci0gICAgICB1dl9zdHJpZGUgPSAodyArIDEpIC8gMjsKLSAgICAgIHV2X3NpemUgPSAodWludDY0X3QpdXZfc3RyaWRlICogKChoICsgMSkgLyAyKTsKLSAgICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgewotICAgICAgICBhX3N0cmlkZSA9IHc7Ci0gICAgICAgIGFfc2l6ZSA9ICh1aW50NjRfdClhX3N0cmlkZSAqIGg7Ci0gICAgICB9Ci0gICAgfQotICAgIHRvdGFsX3NpemUgPSBzaXplICsgMiAqIHV2X3NpemUgKyBhX3NpemU7Ci0KLSAgICAvLyBTZWN1cml0eS9zYW5pdHkgY2hlY2tzCi0gICAgb3V0cHV0ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqb3V0cHV0KSk7Ci0gICAgaWYgKG91dHB1dCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSAgICBidWZmZXItPnByaXZhdGVfbWVtb3J5ID0gb3V0cHV0OwotCi0gICAgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7ICAgLy8gWVVWQSBpbml0aWFsaXphdGlvbgotICAgICAgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKLSAgICAgIGJ1Zi0+eSA9IG91dHB1dDsKLSAgICAgIGJ1Zi0+eV9zdHJpZGUgPSBzdHJpZGU7Ci0gICAgICBidWYtPnlfc2l6ZSA9IChzaXplX3Qpc2l6ZTsKLSAgICAgIGJ1Zi0+dSA9IG91dHB1dCArIHNpemU7Ci0gICAgICBidWYtPnVfc3RyaWRlID0gdXZfc3RyaWRlOwotICAgICAgYnVmLT51X3NpemUgPSAoc2l6ZV90KXV2X3NpemU7Ci0gICAgICBidWYtPnYgPSBvdXRwdXQgKyBzaXplICsgdXZfc2l6ZTsKLSAgICAgIGJ1Zi0+dl9zdHJpZGUgPSB1dl9zdHJpZGU7Ci0gICAgICBidWYtPnZfc2l6ZSA9IChzaXplX3QpdXZfc2l6ZTsKLSAgICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgewotICAgICAgICBidWYtPmEgPSBvdXRwdXQgKyBzaXplICsgMiAqIHV2X3NpemU7Ci0gICAgICB9Ci0gICAgICBidWYtPmFfc2l6ZSA9IChzaXplX3QpYV9zaXplOwotICAgICAgYnVmLT5hX3N0cmlkZSA9IGFfc3RyaWRlOwotICAgIH0gZWxzZSB7ICAvLyBSR0JBIGluaXRpYWxpemF0aW9uCi0gICAgICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOwotICAgICAgYnVmLT5yZ2JhID0gb3V0cHV0OwotICAgICAgYnVmLT5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgICBidWYtPnNpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBDaGVja0RlY0J1ZmZlcihidWZmZXIpOwotfQotCi1WUDhTdGF0dXNDb2RlIFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXQpIHsKLSAgaWYgKG91dCA9PSBOVUxMIHx8IHcgPD0gMCB8fCBoIDw9IDApIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICB9Ci0gIGlmIChvcHRpb25zICE9IE5VTEwpIHsgICAgLy8gRmlyc3QsIGFwcGx5IG9wdGlvbnMgaWYgdGhlcmUgaXMgYW55LgotICAgIGlmIChvcHRpb25zLT51c2VfY3JvcHBpbmcpIHsKLSAgICAgIGNvbnN0IGludCBjdyA9IG9wdGlvbnMtPmNyb3Bfd2lkdGg7Ci0gICAgICBjb25zdCBpbnQgY2ggPSBvcHRpb25zLT5jcm9wX2hlaWdodDsKLSAgICAgIGNvbnN0IGludCB4ID0gb3B0aW9ucy0+Y3JvcF9sZWZ0ICYgfjE7Ci0gICAgICBjb25zdCBpbnQgeSA9IG9wdGlvbnMtPmNyb3BfdG9wICYgfjE7Ci0gICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgY3cgPD0gMCB8fCBjaCA8PSAwIHx8IHggKyBjdyA+IHcgfHwgeSArIGNoID4gaCkgewotICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOyAgIC8vIG91dCBvZiBmcmFtZSBib3VuZGFyeS4KLSAgICAgIH0KLSAgICAgIHcgPSBjdzsKLSAgICAgIGggPSBjaDsKLSAgICB9Ci0gICAgaWYgKG9wdGlvbnMtPnVzZV9zY2FsaW5nKSB7Ci0gICAgICBpZiAob3B0aW9ucy0+c2NhbGVkX3dpZHRoIDw9IDAgfHwgb3B0aW9ucy0+c2NhbGVkX2hlaWdodCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gICAgICB9Ci0gICAgICB3ID0gb3B0aW9ucy0+c2NhbGVkX3dpZHRoOwotICAgICAgaCA9IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQ7Ci0gICAgfQotICB9Ci0gIG91dC0+d2lkdGggPSB3OwotICBvdXQtPmhlaWdodCA9IGg7Ci0KLSAgLy8gVGhlbiwgYWxsb2NhdGUgYnVmZmVyIGZvciByZWFsCi0gIHJldHVybiBBbGxvY2F0ZUJ1ZmZlcihvdXQpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29uc3RydWN0b3JzIC8gZGVzdHJ1Y3RvcnMKLQotaW50IFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoV2ViUERlY0J1ZmZlciogYnVmZmVyLCBpbnQgdmVyc2lvbikgewotICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTikpIHsKLSAgICByZXR1cm4gMDsgIC8vIHZlcnNpb24gbWlzbWF0Y2gKLSAgfQotICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAwOwotICBTYk1lbW9yeVNldChidWZmZXIsIDAsIHNpemVvZigqYnVmZmVyKSk7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIFdlYlBGcmVlRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlcikgewotICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICBpZiAoIWJ1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5KQotICAgICAgU2JNZW1vcnlEZWFsbG9jYXRlKGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkpOwotICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOwotICB9Ci19Ci0KLXZvaWQgV2ViUENvcHlEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKLSAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7Ci0gICAgKmRzdCA9ICpzcmM7Ci0gICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgewotICAgICAgZHN0LT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIGRzdCBidWZmZXIgZG9lc24ndCBvd24gdGhlIG1lbW9yeS4KLSAgICAgIGRzdC0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOwotICAgIH0KLSAgfQotfQotCi0vLyBDb3B5IGFuZCB0cmFuc2ZlciBvd25lcnNoaXAgZnJvbSBzcmMgdG8gZHN0IChiZXdhcmUgb2YgcGFyYW1ldGVyIG9yZGVyISkKLXZvaWQgV2ViUEdyYWJEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLCBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKLSAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7Ci0gICAgKmRzdCA9ICpzcmM7Ci0gICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgewotICAgICAgc3JjLT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIHNyYyByZWxpbnF1aXNoZXMgb3duZXJzaGlwCi0gICAgICBzcmMtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvZnJhbWUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9mcmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM1MjhhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9mcmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBGcmFtZS1yZWNvbnN0cnVjdGlvbiBmdW5jdGlvbi4gTWVtb3J5IGFsbG9jYXRpb24uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgQUxJR05fTUFTSyAoMzIgLSAxKQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmlsdGVyaW5nCi0KLS8vIGtGaWx0ZXJFeHRyYVJvd3NbXSA9IEhvdyBtYW55IGV4dHJhIGxpbmVzIGFyZSBuZWVkZWQgb24gdGhlIE1CIGJvdW5kYXJ5Ci0vLyBmb3IgY2FjaGluZywgZ2l2ZW4gYSBmaWx0ZXJpbmcgbGV2ZWwuCi0vLyBTaW1wbGUgZmlsdGVyOiAgdXAgdG8gMiBsdW1hIHNhbXBsZXMgYXJlIHJlYWQgYW5kIDEgaXMgd3JpdHRlbi4KLS8vIENvbXBsZXggZmlsdGVyOiB1cCB0byA0IGx1bWEgc2FtcGxlcyBhcmUgcmVhZCBhbmQgMyBhcmUgd3JpdHRlbi4gU2FtZSBmb3IKLS8vICAgICAgICAgICAgICAgICBVL1YsIHNvIGl0J3MgOCBzYW1wbGVzIHRvdGFsIChiZWNhdXNlIG9mIHRoZSAyeCB1cHNhbXBsaW5nKS4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtGaWx0ZXJFeHRyYVJvd3NbM10gPSB7IDAsIDIsIDggfTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXZfdGhyZXNoX2Zyb21fbGV2ZWwoaW50IGxldmVsLCBpbnQga2V5ZnJhbWUpIHsKLSAgaWYgKGtleWZyYW1lKSB7Ci0gICAgcmV0dXJuIChsZXZlbCA+PSA0MCkgPyAyIDogKGxldmVsID49IDE1KSA/IDEgOiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiAobGV2ZWwgPj0gNDApID8gMyA6IChsZXZlbCA+PSAyMCkgPyAyIDogKGxldmVsID49IDE1KSA/IDEgOiAwOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IG1iX3gsIGludCBtYl95KSB7Ci0gIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOwotICBjb25zdCBpbnQgeV9icHMgPSBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgVlA4RkluZm8qIGNvbnN0IGZfaW5mbyA9IGN0eC0+Zl9pbmZvXyArIG1iX3g7Ci0gIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gZGVjLT5jYWNoZV95XyArIGN0eC0+aWRfICogMTYgKiB5X2JwcyArIG1iX3ggKiAxNjsKLSAgY29uc3QgaW50IGxldmVsID0gZl9pbmZvLT5mX2xldmVsXzsKLSAgY29uc3QgaW50IGlsZXZlbCA9IGZfaW5mby0+Zl9pbGV2ZWxfOwotICBjb25zdCBpbnQgbGltaXQgPSAyICogbGV2ZWwgKyBpbGV2ZWw7Ci0gIGlmIChsZXZlbCA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChkZWMtPmZpbHRlcl90eXBlXyA9PSAxKSB7ICAgLy8gc2ltcGxlCi0gICAgaWYgKG1iX3ggPiAwKSB7Ci0gICAgICBWUDhTaW1wbGVIRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQpOwotICAgIH0KLSAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgewotICAgICAgVlA4U2ltcGxlSEZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0KTsKLSAgICB9Ci0gICAgaWYgKG1iX3kgPiAwKSB7Ci0gICAgICBWUDhTaW1wbGVWRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQpOwotICAgIH0KLSAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgewotICAgICAgVlA4U2ltcGxlVkZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0KTsKLSAgICB9Ci0gIH0gZWxzZSB7ICAgIC8vIGNvbXBsZXgKLSAgICBjb25zdCBpbnQgdXZfYnBzID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICAgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gZGVjLT5jYWNoZV91XyArIGN0eC0+aWRfICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OwotICAgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gZGVjLT5jYWNoZV92XyArIGN0eC0+aWRfICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OwotICAgIGNvbnN0IGludCBoZXZfdGhyZXNoID0KLSAgICAgICAgaGV2X3RocmVzaF9mcm9tX2xldmVsKGxldmVsLCBkZWMtPmZybV9oZHJfLmtleV9mcmFtZV8pOwotICAgIGlmIChtYl94ID4gMCkgewotICAgICAgVlA4SEZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgICAgVlA4SEZpbHRlcjgodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICB9Ci0gICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKLSAgICAgIFZQOEhGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICAgIFZQOEhGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgfQotICAgIGlmIChtYl95ID4gMCkgewotICAgICAgVlA4VkZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgICAgVlA4VkZpbHRlcjgodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICB9Ci0gICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKLSAgICAgIFZQOFZGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICAgIFZQOFZGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEZpbHRlciB0aGUgZGVjb2RlZCBtYWNyb2Jsb2NrIHJvdyAoaWYgbmVlZGVkKQotc3RhdGljIHZvaWQgRmlsdGVyUm93KGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpbnQgbWJfeDsKLSAgY29uc3QgaW50IG1iX3kgPSBkZWMtPnRocmVhZF9jdHhfLm1iX3lfOwotICBTQl9EQ0hFQ0soZGVjLT50aHJlYWRfY3R4Xy5maWx0ZXJfcm93Xyk7Ci0gIGZvciAobWJfeCA9IGRlYy0+dGxfbWJfeF87IG1iX3ggPCBkZWMtPmJyX21iX3hfOyArK21iX3gpIHsKLSAgICBEb0ZpbHRlcihkZWMsIG1iX3gsIG1iX3kpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcmVjb21wdXRlIHRoZSBmaWx0ZXJpbmcgc3RyZW5ndGggZm9yIGVhY2ggc2VnbWVudCBhbmQgZWFjaCBpNHg0L2kxNngxNiBtb2RlLgotCi1zdGF0aWMgdm9pZCBQcmVjb21wdXRlRmlsdGVyU3RyZW5ndGhzKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSB7Ci0gICAgaW50IHM7Ci0gICAgY29uc3QgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZGVjLT5maWx0ZXJfaGRyXzsKLSAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKLSAgICAgIGludCBpNHg0OwotICAgICAgLy8gRmlyc3QsIGNvbXB1dGUgdGhlIGluaXRpYWwgbGV2ZWwKLSAgICAgIGludCBiYXNlX2xldmVsOwotICAgICAgaWYgKGRlYy0+c2VnbWVudF9oZHJfLnVzZV9zZWdtZW50XykgewotICAgICAgICBiYXNlX2xldmVsID0gZGVjLT5zZWdtZW50X2hkcl8uZmlsdGVyX3N0cmVuZ3RoX1tzXTsKLSAgICAgICAgaWYgKCFkZWMtPnNlZ21lbnRfaGRyXy5hYnNvbHV0ZV9kZWx0YV8pIHsKLSAgICAgICAgICBiYXNlX2xldmVsICs9IGhkci0+bGV2ZWxfOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBiYXNlX2xldmVsID0gaGRyLT5sZXZlbF87Ci0gICAgICB9Ci0gICAgICBmb3IgKGk0eDQgPSAwOyBpNHg0IDw9IDE7ICsraTR4NCkgewotICAgICAgICBWUDhGSW5mbyogY29uc3QgaW5mbyA9ICZkZWMtPmZzdHJlbmd0aHNfW3NdW2k0eDRdOwotICAgICAgICBpbnQgbGV2ZWwgPSBiYXNlX2xldmVsOwotICAgICAgICBpZiAoaGRyLT51c2VfbGZfZGVsdGFfKSB7Ci0gICAgICAgICAgLy8gVE9ETyhza2FsKTogb25seSBDVVJSRU5UIGlzIGhhbmRsZWQgZm9yIG5vdy4KLSAgICAgICAgICBsZXZlbCArPSBoZHItPnJlZl9sZl9kZWx0YV9bMF07Ci0gICAgICAgICAgaWYgKGk0eDQpIHsKLSAgICAgICAgICAgIGxldmVsICs9IGhkci0+bW9kZV9sZl9kZWx0YV9bMF07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxldmVsID0gKGxldmVsIDwgMCkgPyAwIDogKGxldmVsID4gNjMpID8gNjMgOiBsZXZlbDsKLSAgICAgICAgaW5mby0+Zl9sZXZlbF8gPSBsZXZlbDsKLQotICAgICAgICBpZiAoaGRyLT5zaGFycG5lc3NfID4gMCkgewotICAgICAgICAgIGlmIChoZHItPnNoYXJwbmVzc18gPiA0KSB7Ci0gICAgICAgICAgICBsZXZlbCA+Pj0gMjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV2ZWwgPj49IDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsZXZlbCA+IDkgLSBoZHItPnNoYXJwbmVzc18pIHsKLSAgICAgICAgICAgIGxldmVsID0gOSAtIGhkci0+c2hhcnBuZXNzXzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+Zl9pbGV2ZWxfID0gKGxldmVsIDwgMSkgPyAxIDogbGV2ZWw7Ci0gICAgICAgIGluZm8tPmZfaW5uZXJfID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgcm93IG9mIG1hY3JvYmxvY2tzIGlzIGZpbmlzaGVkIGRlY29kaW5nLgotLy8gSXQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0vLyAgKiBJbiBjYXNlIG9mIGluLWxvb3AgZmlsdGVyaW5nLCB3ZSBtdXN0IGhvbGQgb2ZmIHNlbmRpbmcgc29tZSBvZiB0aGUgYm90dG9tCi0vLyAgICBwaXhlbHMgYXMgdGhleSBhcmUgeWV0IHVuZmlsdGVyZWQuIFRoZXkgd2lsbCBiZSB3aGVuIHRoZSBuZXh0IG1hY3JvYmxvY2sKLS8vICAgIHJvdyBpcyBkZWNvZGVkLiBNZWFud2hpbGUsIHdlIG11c3QgcHJlc2VydmUgdGhlbSBieSByb3RhdGluZyB0aGVtIGluIHRoZQotLy8gICAgY2FjaGUgYXJlYS4gVGhpcyBkb2Vzbid0IGhvbGQgZm9yIHRoZSB2ZXJ5IGJvdHRvbSByb3cgb2YgdGhlIHVuY3JvcHBlZAotLy8gICAgcGljdHVyZSBvZiBjb3Vyc2UuCi0vLyAgKiB3ZSBtdXN0IGNsaXAgdGhlIHJlbWFpbmluZyBwaXhlbHMgYWdhaW5zdCB0aGUgY3JvcHBpbmcgYXJlYS4gVGhlIFZQOElvCi0vLyAgICBzdHJ1Y3QgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZmllbGRzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgcHV0KCk6Ci0KLSNkZWZpbmUgTUFDUk9CTE9DS19WUE9TKG1iX3kpICAoKG1iX3kpICogMTYpICAgIC8vIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGEgTUIKLQotLy8gRmluYWxpemUgYW5kIHRyYW5zbWl0IGEgY29tcGxldGUgcm93LiBSZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiB1c2VyLWFib3J0Lgotc3RhdGljIGludCBGaW5pc2hSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgaW50IG9rID0gMTsKLSAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87Ci0gIGNvbnN0IGludCBleHRyYV95X3Jvd3MgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKLSAgY29uc3QgaW50IHlzaXplID0gZXh0cmFfeV9yb3dzICogZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gIGNvbnN0IGludCB1dnNpemUgPSAoZXh0cmFfeV9yb3dzIC8gMikgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gIGNvbnN0IGludCB5X29mZnNldCA9IGN0eC0+aWRfICogMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgY29uc3QgaW50IHV2X29mZnNldCA9IGN0eC0+aWRfICogOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgdWludDhfdCogY29uc3QgeWRzdCA9IGRlYy0+Y2FjaGVfeV8gLSB5c2l6ZSArIHlfb2Zmc2V0OwotICB1aW50OF90KiBjb25zdCB1ZHN0ID0gZGVjLT5jYWNoZV91XyAtIHV2c2l6ZSArIHV2X29mZnNldDsKLSAgdWludDhfdCogY29uc3QgdmRzdCA9IGRlYy0+Y2FjaGVfdl8gLSB1dnNpemUgKyB1dl9vZmZzZXQ7Ci0gIGNvbnN0IGludCBmaXJzdF9yb3cgPSAoY3R4LT5tYl95XyA9PSAwKTsKLSAgY29uc3QgaW50IGxhc3Rfcm93ID0gKGN0eC0+bWJfeV8gPj0gZGVjLT5icl9tYl95XyAtIDEpOwotICBpbnQgeV9zdGFydCA9IE1BQ1JPQkxPQ0tfVlBPUyhjdHgtPm1iX3lfKTsKLSAgaW50IHlfZW5kID0gTUFDUk9CTE9DS19WUE9TKGN0eC0+bWJfeV8gKyAxKTsKLQotICBpZiAoY3R4LT5maWx0ZXJfcm93XykgewotICAgIEZpbHRlclJvdyhkZWMpOwotICB9Ci0KLSAgaWYgKGlvLT5wdXQpIHsKLSAgICBpZiAoIWZpcnN0X3JvdykgewotICAgICAgeV9zdGFydCAtPSBleHRyYV95X3Jvd3M7Ci0gICAgICBpby0+eSA9IHlkc3Q7Ci0gICAgICBpby0+dSA9IHVkc3Q7Ci0gICAgICBpby0+diA9IHZkc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlvLT55ID0gZGVjLT5jYWNoZV95XyArIHlfb2Zmc2V0OwotICAgICAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfICsgdXZfb2Zmc2V0OwotICAgICAgaW8tPnYgPSBkZWMtPmNhY2hlX3ZfICsgdXZfb2Zmc2V0OwotICAgIH0KLQotICAgIGlmICghbGFzdF9yb3cpIHsKLSAgICAgIHlfZW5kIC09IGV4dHJhX3lfcm93czsKLSAgICB9Ci0gICAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7Ci0gICAgICB5X2VuZCA9IGlvLT5jcm9wX2JvdHRvbTsgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IG9uIGxhc3Qgcm93LgotICAgIH0KLSAgICBpby0+YSA9IE5VTEw7Ci0gICAgaWYgKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCAmJiB5X3N0YXJ0IDwgeV9lbmQpIHsKLSAgICAgIC8vIFRPRE8oc2thbCk6IHNldmVyYWwgdGhpbmdzIHRvIGNvcnJlY3QgaGVyZToKLSAgICAgIC8vICogdGVzdGluZyBwcmVzZW5jZSBvZiBhbHBoYSB3aXRoIGRlYy0+YWxwaGFfZGF0YV8gaXMgbm90IGEgZ29vZCBpZGVhCi0gICAgICAvLyAqIHdlJ3JlIGFjdHVhbGx5IGRlY29tcHJlc3NpbmcgdGhlIGZ1bGwgcGxhbmUgb25seSBvbmNlLiBJdCBzaG91bGQgYmUKLSAgICAgIC8vICAgbW9yZSBvYnZpb3VzIGZyb20gc2lnbmF0dXJlLgotICAgICAgLy8gKiB3ZSBjb3VsZCBmcmVlIGFscGhhX2RhdGFfIHJpZ2h0IGFmdGVyIHRoaXMgY2FsbCwgYnV0IHdlIGRvbid0IG93bi4KLSAgICAgIGlvLT5hID0gVlA4RGVjb21wcmVzc0FscGhhUm93cyhkZWMsIHlfc3RhcnQsIHlfZW5kIC0geV9zdGFydCk7Ci0gICAgICBpZiAoaW8tPmEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVjb2RlIGFscGhhIGRhdGEuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh5X3N0YXJ0IDwgaW8tPmNyb3BfdG9wKSB7Ci0gICAgICBjb25zdCBpbnQgZGVsdGFfeSA9IGlvLT5jcm9wX3RvcCAtIHlfc3RhcnQ7Ci0gICAgICB5X3N0YXJ0ID0gaW8tPmNyb3BfdG9wOwotICAgICAgU0JfRENIRUNLKCEoZGVsdGFfeSAmIDEpKTsKLSAgICAgIGlvLT55ICs9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfICogZGVsdGFfeTsKLSAgICAgIGlvLT51ICs9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyAqIChkZWx0YV95ID4+IDEpOwotICAgICAgaW8tPnYgKz0gZGVjLT5jYWNoZV91dl9zdHJpZGVfICogKGRlbHRhX3kgPj4gMSk7Ci0gICAgICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgICAgICBpby0+YSArPSBpby0+d2lkdGggKiBkZWx0YV95OwotICAgICAgfQotICAgIH0KLSAgICBpZiAoeV9zdGFydCA8IHlfZW5kKSB7Ci0gICAgICBpby0+eSArPSBpby0+Y3JvcF9sZWZ0OwotICAgICAgaW8tPnUgKz0gaW8tPmNyb3BfbGVmdCA+PiAxOwotICAgICAgaW8tPnYgKz0gaW8tPmNyb3BfbGVmdCA+PiAxOwotICAgICAgaWYgKGlvLT5hICE9IE5VTEwpIHsKLSAgICAgICAgaW8tPmEgKz0gaW8tPmNyb3BfbGVmdDsKLSAgICAgIH0KLSAgICAgIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKLSAgICAgIGlvLT5tYl93ID0gaW8tPmNyb3BfcmlnaHQgLSBpby0+Y3JvcF9sZWZ0OwotICAgICAgaW8tPm1iX2ggPSB5X2VuZCAtIHlfc3RhcnQ7Ci0gICAgICBvayA9IGlvLT5wdXQoaW8pOwotICAgIH0KLSAgfQotICAvLyByb3RhdGUgdG9wIHNhbXBsZXMgaWYgbmVlZGVkCi0gIGlmIChjdHgtPmlkXyArIDEgPT0gZGVjLT5udW1fY2FjaGVzXykgewotICAgIGlmICghbGFzdF9yb3cpIHsKLSAgICAgIFNiTWVtb3J5Q29weShkZWMtPmNhY2hlX3lfIC0geXNpemUsIHlkc3QgKyAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfLCB5c2l6ZSk7Ci0gICAgICBTYk1lbW9yeUNvcHkoZGVjLT5jYWNoZV91XyAtIHV2c2l6ZSwgdWRzdCArIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHV2c2l6ZSk7Ci0gICAgICBTYk1lbW9yeUNvcHkoZGVjLT5jYWNoZV92XyAtIHV2c2l6ZSwgdmRzdCArIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHV2c2l6ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG9rOwotfQotCi0jdW5kZWYgTUFDUk9CTE9DS19WUE9TCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhQcm9jZXNzUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCBvayA9IDE7Ci0gIFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOwotICBpZiAoIWRlYy0+dXNlX3RocmVhZHNfKSB7Ci0gICAgLy8gY3R4LT5pZF8gYW5kIGN0eC0+Zl9pbmZvXyBhcmUgYWxyZWFkeSBzZXQKLSAgICBjdHgtPm1iX3lfID0gZGVjLT5tYl95XzsKLSAgICBjdHgtPmZpbHRlcl9yb3dfID0gZGVjLT5maWx0ZXJfcm93XzsKLSAgICBvayA9IEZpbmlzaFJvdyhkZWMsIGlvKTsKLSAgfSBlbHNlIHsKLSAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZGVjLT53b3JrZXJfOwotICAgIC8vIEZpbmlzaCBwcmV2aW91cyBqb2IgKmJlZm9yZSogdXBkYXRpbmcgY29udGV4dAotICAgIG9rICY9IFdlYlBXb3JrZXJTeW5jKHdvcmtlcik7Ci0gICAgU0JfRENIRUNLKHdvcmtlci0+c3RhdHVzXyA9PSBPSyk7Ci0gICAgaWYgKG9rKSB7ICAgLy8gc3Bhd24gYSBuZXcgZGVibG9ja2luZy9vdXRwdXQgam9iCi0gICAgICBjdHgtPmlvXyA9ICppbzsKLSAgICAgIGN0eC0+aWRfID0gZGVjLT5jYWNoZV9pZF87Ci0gICAgICBjdHgtPm1iX3lfID0gZGVjLT5tYl95XzsKLSAgICAgIGN0eC0+ZmlsdGVyX3Jvd18gPSBkZWMtPmZpbHRlcl9yb3dfOwotICAgICAgaWYgKGN0eC0+ZmlsdGVyX3Jvd18pIHsgICAgLy8ganVzdCBzd2FwIGZpbHRlciBpbmZvCi0gICAgICAgIFZQOEZJbmZvKiBjb25zdCB0bXAgPSBjdHgtPmZfaW5mb187Ci0gICAgICAgIGN0eC0+Zl9pbmZvXyA9IGRlYy0+Zl9pbmZvXzsKLSAgICAgICAgZGVjLT5mX2luZm9fID0gdG1wOwotICAgICAgfQotICAgICAgV2ViUFdvcmtlckxhdW5jaCh3b3JrZXIpOwotICAgICAgaWYgKCsrZGVjLT5jYWNoZV9pZF8gPT0gZGVjLT5udW1fY2FjaGVzXykgewotICAgICAgICBkZWMtPmNhY2hlX2lkXyA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIgb25jZSB1c2VyJ3Mgc2V0dXAoKSBpcyBjYWxsZWQuCi0KLVZQOFN0YXR1c0NvZGUgVlA4RW50ZXJDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICAvLyBDYWxsIHNldHVwKCkgZmlyc3QuIFRoaXMgbWF5IHRyaWdnZXIgYWRkaXRpb25hbCBkZWNvZGluZyBmZWF0dXJlcyBvbiAnaW8nLgotICAvLyBOb3RlOiBBZnRlcndhcmQsIHdlIG11c3QgY2FsbCB0ZWFyZG93bigpIG5vdCBtYXR0ZXIgd2hhdC4KLSAgaWYgKGlvLT5zZXR1cCAmJiAhaW8tPnNldHVwKGlvKSkgewotICAgIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiRnJhbWUgc2V0dXAgZmFpbGVkIik7Ci0gICAgcmV0dXJuIGRlYy0+c3RhdHVzXzsKLSAgfQotCi0gIC8vIERpc2FibGUgZmlsdGVyaW5nIHBlciB1c2VyIHJlcXVlc3QKLSAgaWYgKGlvLT5ieXBhc3NfZmlsdGVyaW5nKSB7Ci0gICAgZGVjLT5maWx0ZXJfdHlwZV8gPSAwOwotICB9Ci0gIC8vIFRPRE8oc2thbCk6IGZpbHRlciB0eXBlIC8gc3RyZW5ndGggLyBzaGFycG5lc3MgZm9yY2luZwotCi0gIC8vIERlZmluZSB0aGUgYXJlYSB3aGVyZSB3ZSBjYW4gc2tpcCBpbi1sb29wIGZpbHRlcmluZywgaW4gY2FzZSBvZiBjcm9wcGluZy4KLSAgLy8KLSAgLy8gJ1NpbXBsZScgZmlsdGVyIHJlYWRzIHR3byBsdW1hIHNhbXBsZXMgb3V0c2lkZSBvZiB0aGUgbWFjcm9ibG9jayBhbmQKLSAgLy8gYW5kIGZpbHRlcnMgb25lLiBJdCBkb2Vzbid0IGZpbHRlciB0aGUgY2hyb21hIHNhbXBsZXMuIEhlbmNlLCB3ZSBjYW4KLSAgLy8gYXZvaWQgZG9pbmcgdGhlIGluLWxvb3AgZmlsdGVyaW5nIGJlZm9yZSBjcm9wX3RvcC9jcm9wX2xlZnQgcG9zaXRpb24uCi0gIC8vIEZvciB0aGUgJ0NvbXBsZXgnIGZpbHRlciwgMyBzYW1wbGVzIGFyZSByZWFkIGFuZCB1cCB0byAzIGFyZSBmaWx0ZXJlZC4KLSAgLy8gTWVhbnM6IHRoZXJlJ3MgYSBkZXBlbmRlbmN5IGNoYWluIHRoYXQgZ29lcyBhbGwgdGhlIHdheSB1cCB0byB0aGUKLSAgLy8gdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwaWN0dXJlIChNQiAjMCkuIFdlIG11c3QgZmlsdGVyIGFsbCB0aGUgcHJldmlvdXMKLSAgLy8gbWFjcm9ibG9ja3MuCi0gIC8vIFRPRE8oc2thbCk6IGFkZCBhbiAnYXBwcm94aW1hdGVfZGVjb2RpbmcnIG9wdGlvbiwgdGhhdCB3b24ndCBwcm9kdWNlCi0gIC8vIGEgMToxIGJpdC1leGFjdG5lc3MgZm9yIGNvbXBsZXggZmlsdGVyaW5nPwotICB7Ci0gICAgY29uc3QgaW50IGV4dHJhX3BpeGVscyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOwotICAgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA9PSAyKSB7Ci0gICAgICAvLyBGb3IgY29tcGxleCBmaWx0ZXIsIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGRlcGVuZGVuY3kgY2hhaW4uCi0gICAgICBkZWMtPnRsX21iX3hfID0gMDsKLSAgICAgIGRlYy0+dGxfbWJfeV8gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBGb3Igc2ltcGxlIGZpbHRlciwgd2UgY2FuIGZpbHRlciBvbmx5IHRoZSBjcm9wcGVkIHJlZ2lvbi4KLSAgICAgIC8vIFdlIGluY2x1ZGUgJ2V4dHJhX3BpeGVscycgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGJvdW5kYXJ5LCBzaW5jZQotICAgICAgLy8gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBmaWx0ZXJpbmcgb2YgdGhlIHByZXZpb3VzIG1hY3JvYmxvY2sgY2FuCi0gICAgICAvLyBtb2RpZnkgc29tZSBhYnV0dGluZyBwaXhlbHMuCi0gICAgICBkZWMtPnRsX21iX3hfID0gKGlvLT5jcm9wX2xlZnQgLSBleHRyYV9waXhlbHMpID4+IDQ7Ci0gICAgICBkZWMtPnRsX21iX3lfID0gKGlvLT5jcm9wX3RvcCAtIGV4dHJhX3BpeGVscykgPj4gNDsKLSAgICAgIGlmIChkZWMtPnRsX21iX3hfIDwgMCkgZGVjLT50bF9tYl94XyA9IDA7Ci0gICAgICBpZiAoZGVjLT50bF9tYl95XyA8IDApIGRlYy0+dGxfbWJfeV8gPSAwOwotICAgIH0KLSAgICAvLyBXZSBuZWVkIHNvbWUgJ2V4dHJhJyBwaXhlbHMgb24gdGhlIHJpZ2h0L2JvdHRvbS4KLSAgICBkZWMtPmJyX21iX3lfID0gKGlvLT5jcm9wX2JvdHRvbSArIDE1ICsgZXh0cmFfcGl4ZWxzKSA+PiA0OwotICAgIGRlYy0+YnJfbWJfeF8gPSAoaW8tPmNyb3BfcmlnaHQgKyAxNSArIGV4dHJhX3BpeGVscykgPj4gNDsKLSAgICBpZiAoZGVjLT5icl9tYl94XyA+IGRlYy0+bWJfd18pIHsKLSAgICAgIGRlYy0+YnJfbWJfeF8gPSBkZWMtPm1iX3dfOwotICAgIH0KLSAgICBpZiAoZGVjLT5icl9tYl95XyA+IGRlYy0+bWJfaF8pIHsKLSAgICAgIGRlYy0+YnJfbWJfeV8gPSBkZWMtPm1iX2hfOwotICAgIH0KLSAgfQotICBQcmVjb21wdXRlRmlsdGVyU3RyZW5ndGhzKGRlYyk7Ci0gIHJldHVybiBWUDhfU1RBVFVTX09LOwotfQotCi1pbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCBvayA9IDE7Ci0gIGlmIChkZWMtPnVzZV90aHJlYWRzXykgewotICAgIG9rID0gV2ViUFdvcmtlclN5bmMoJmRlYy0+d29ya2VyXyk7Ci0gIH0KLQotICBpZiAoaW8tPnRlYXJkb3duKSB7Ci0gICAgaW8tPnRlYXJkb3duKGlvKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGb3IgbXVsdGktdGhyZWFkZWQgZGVjb2Rpbmcgd2UgbmVlZCB0byB1c2UgMyByb3dzIG9mIDE2IHBpeGVscyBhcyBkZWxheSBsaW5lLgotLy8KLS8vIFJlYXNvbiBpczogdGhlIGRlYmxvY2tpbmcgZmlsdGVyIGNhbm5vdCBkZWJsb2NrIHRoZSBib3R0b20gaG9yaXpvbnRhbCBlZGdlcwotLy8gaW1tZWRpYXRlbHksIGFuZCBuZWVkcyB0byB3YWl0IGZvciBmaXJzdCBmZXcgcm93cyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrIHRvCi0vLyBiZSBkZWNvZGVkLiBIZW5jZSwgZGVibG9ja2luZyBpcyBsYWdnaW5nIGJlaGluZCBieSA0IG9yIDggcGl4ZWxzIChkZXBlbmRpbmcKLS8vIG9uIHN0cmVuZ3RoKS4KLS8vIFdpdGggdHdvIHRocmVhZHMsIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbnMgb2YgdGhlIHJvd3MgYmVpbmcgZGVjb2RlZCBhcmU6Ci0vLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bNDguLjYzXVs2NC4uNzldWy4uLgotLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjddWzI4Li40M11bNDQuLjU5XVsuLi4KLS8vIElmIHdlIHVzZSB0d28gdGhyZWFkcyBhbmQgdHdvIGNhY2hlcyBvZiAxNiBwaXhlbHMsIHRoZSBzZXF1ZW5jZSB3b3VsZCBiZToKLS8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1ISFdWzE2Li4zMV1bIDAuLjE1XVsuLi4KLS8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3ISFdWy00Li4xMV1bMTIuLjI3XVsuLi4KLS8vIFRoZSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcm93IFsxMi4uMTUhIV0gdGhhdCBib3RoIHRoZSBkZWNvZGluZyBhbmQKLS8vIGRlYmxvY2tpbmcgdGhyZWFkcyBhcmUgd3JpdGluZyBzaW11bHRhbmVvdXNseS4KLS8vIFdpdGggMyBjYWNoZSBsaW5lcywgb25lIGdldCBhIHNhZmUgd3JpdGUgcGF0dGVybjoKLS8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVswLi4KLS8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3XVsyOC4uNDNdWy00Li4xMV1bMTIuLjI3XVsyOC4uLgotLy8gTm90ZSB0aGF0IG11bHRpLXRocmVhZGVkIG91dHB1dCBfd2l0aG91dF8gZGVibG9ja2luZyBjYW4gbWFrZSB1c2Ugb2YgdHdvCi0vLyBjYWNoZSBsaW5lcyBvZiAxNiBwaXhlbHMgb25seSwgc2luY2UgdGhlcmUncyBubyBsYWdnaW5nIGJlaGluZC4gVGhlIGRlY29kaW5nCi0vLyBhbmQgb3V0cHV0IHByb2Nlc3MgaGF2ZSBub24tY29uY3VycmVudCB3cml0aW5nOgotLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTVdWzE2Li4zMV1bLi4uCi0vLyBpby0+cHV0OiAgICAgICAgIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1XVsuLi4KLQotI2RlZmluZSBNVF9DQUNIRV9MSU5FUyAzCi0jZGVmaW5lIFNUX0NBQ0hFX0xJTkVTIDEgICAvLyAxIGNhY2hlIHJvdyBvbmx5IGZvciBzaW5nbGUtdGhyZWFkZWQgY2FzZQotCi0vLyBJbml0aWFsaXplIG11bHRpL3NpbmdsZS10aHJlYWQgd29ya2VyCi1zdGF0aWMgaW50IEluaXRUaHJlYWRDb250ZXh0KFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBkZWMtPmNhY2hlX2lkXyA9IDA7Ci0gIGlmIChkZWMtPnVzZV90aHJlYWRzXykgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZkZWMtPndvcmtlcl87Ci0gICAgaWYgKCFXZWJQV29ya2VyUmVzZXQod29ya2VyKSkgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiIpOwotICAgIH0KLSAgICB3b3JrZXItPmRhdGExID0gZGVjOwotICAgIHdvcmtlci0+ZGF0YTIgPSAodm9pZCopJmRlYy0+dGhyZWFkX2N0eF8uaW9fOwotICAgIHdvcmtlci0+aG9vayA9IChXZWJQV29ya2VySG9vaylGaW5pc2hSb3c7Ci0gICAgZGVjLT5udW1fY2FjaGVzXyA9Ci0gICAgICAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSA/IE1UX0NBQ0hFX0xJTkVTIDogTVRfQ0FDSEVfTElORVMgLSAxOwotICB9IGVsc2UgewotICAgIGRlYy0+bnVtX2NhY2hlc18gPSBTVF9DQUNIRV9MSU5FUzsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotI3VuZGVmIE1UX0NBQ0hFX0xJTkVTCi0jdW5kZWYgU1RfQ0FDSEVfTElORVMKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lbW9yeSBzZXR1cAotCi1zdGF0aWMgaW50IEFsbG9jYXRlTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBjb25zdCBpbnQgbnVtX2NhY2hlcyA9IGRlYy0+bnVtX2NhY2hlc187Ci0gIGNvbnN0IGludCBtYl93ID0gZGVjLT5tYl93XzsKLSAgLy8gTm90ZTogd2UgdXNlICdzaXplX3QnIHdoZW4gdGhlcmUncyBubyBvdmVyZmxvdyByaXNrLCB1aW50NjRfdCBvdGhlcndpc2UuCi0gIGNvbnN0IHNpemVfdCBpbnRyYV9wcmVkX21vZGVfc2l6ZSA9IDQgKiBtYl93ICogc2l6ZW9mKHVpbnQ4X3QpOwotICBjb25zdCBzaXplX3QgdG9wX3NpemUgPSAoMTYgKyA4ICsgOCkgKiBtYl93OwotICBjb25zdCBzaXplX3QgbWJfaW5mb19zaXplID0gKG1iX3cgKyAxKSAqIHNpemVvZihWUDhNQik7Ci0gIGNvbnN0IHNpemVfdCBmX2luZm9fc2l6ZSA9Ci0gICAgICAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSA/Ci0gICAgICAgICAgbWJfdyAqIChkZWMtPnVzZV90aHJlYWRzXyA/IDIgOiAxKSAqIHNpemVvZihWUDhGSW5mbykKLSAgICAgICAgOiAwOwotICBjb25zdCBzaXplX3QgeXV2X3NpemUgPSBZVVZfU0laRSAqIHNpemVvZigqZGVjLT55dXZfYl8pOwotICBjb25zdCBzaXplX3QgY29lZmZzX3NpemUgPSAzODQgKiBzaXplb2YoKmRlYy0+Y29lZmZzXyk7Ci0gIGNvbnN0IHNpemVfdCBjYWNoZV9oZWlnaHQgPSAoMTYgKiBudW1fY2FjaGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXSkgKiAzIC8gMjsKLSAgY29uc3Qgc2l6ZV90IGNhY2hlX3NpemUgPSB0b3Bfc2l6ZSAqIGNhY2hlX2hlaWdodDsKLSAgLy8gYWxwaGFfc2l6ZSBpcyB0aGUgb25seSBvbmUgdGhhdCBzY2FsZXMgYXMgd2lkdGggeCBoZWlnaHQuCi0gIGNvbnN0IHVpbnQ2NF90IGFscGhhX3NpemUgPSAoZGVjLT5hbHBoYV9kYXRhXyAhPSBOVUxMKSA/Ci0gICAgICAodWludDY0X3QpZGVjLT5waWNfaGRyXy53aWR0aF8gKiBkZWMtPnBpY19oZHJfLmhlaWdodF8gOiAwVUxMOwotICBjb25zdCB1aW50NjRfdCBuZWVkZWQgPSAodWludDY0X3QpaW50cmFfcHJlZF9tb2RlX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wX3NpemUgKyBtYl9pbmZvX3NpemUgKyBmX2luZm9fc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyB5dXZfc2l6ZSArIGNvZWZmc19zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlX3NpemUgKyBhbHBoYV9zaXplICsgQUxJR05fTUFTSzsKLSAgdWludDhfdCogbWVtOwotCi0gIGlmIChuZWVkZWQgIT0gKHNpemVfdCluZWVkZWQpIHJldHVybiAwOyAgLy8gY2hlY2sgZm9yIG92ZXJmbG93Ci0gIGlmIChuZWVkZWQgPiBkZWMtPm1lbV9zaXplXykgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShkZWMtPm1lbV8pOwotICAgIGRlYy0+bWVtX3NpemVfID0gMDsKLSAgICBkZWMtPm1lbV8gPSBXZWJQU2FmZU1hbGxvYyhuZWVkZWQsIHNpemVvZih1aW50OF90KSk7Ci0gICAgaWYgKGRlYy0+bWVtXyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbW9yeSBkdXJpbmcgZnJhbWUgaW5pdGlhbGl6YXRpb24uIik7Ci0gICAgfQotICAgIC8vIGRvd24tY2FzdCBpcyBvaywgdGhhbmtzIHRvIFdlYlBTYWZlQWxsb2MoKSBhYm92ZS4KLSAgICBkZWMtPm1lbV9zaXplXyA9IChzaXplX3QpbmVlZGVkOwotICB9Ci0KLSAgbWVtID0gKHVpbnQ4X3QqKWRlYy0+bWVtXzsKLSAgZGVjLT5pbnRyYV90XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBpbnRyYV9wcmVkX21vZGVfc2l6ZTsKLQotICBkZWMtPnlfdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gMTYgKiBtYl93OwotICBkZWMtPnVfdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gOCAqIG1iX3c7Ci0gIGRlYy0+dl90XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSA4ICogbWJfdzsKLQotICBkZWMtPm1iX2luZm9fID0gKChWUDhNQiopbWVtKSArIDE7Ci0gIG1lbSArPSBtYl9pbmZvX3NpemU7Ci0KLSAgZGVjLT5mX2luZm9fID0gZl9pbmZvX3NpemUgPyAoVlA4RkluZm8qKW1lbSA6IE5VTEw7Ci0gIG1lbSArPSBmX2luZm9fc2l6ZTsKLSAgZGVjLT50aHJlYWRfY3R4Xy5pZF8gPSAwOwotICBkZWMtPnRocmVhZF9jdHhfLmZfaW5mb18gPSBkZWMtPmZfaW5mb187Ci0gIGlmIChkZWMtPnVzZV90aHJlYWRzXykgewotICAgIC8vIHNlY29uZGFyeSBjYWNoZSBsaW5lLiBUaGUgZGVibG9ja2luZyBwcm9jZXNzIG5lZWQgdG8gbWFrZSB1c2Ugb2YgdGhlCi0gICAgLy8gZmlsdGVyaW5nIHN0cmVuZ3RoIGZyb20gcHJldmlvdXMgbWFjcm9ibG9jayByb3csIHdoaWxlIHRoZSBuZXcgb25lcwotICAgIC8vIGFyZSBiZWluZyBkZWNvZGVkIGluIHBhcmFsbGVsLiBXZSdsbCBqdXN0IHN3YXAgdGhlIHBvaW50ZXJzLgotICAgIGRlYy0+dGhyZWFkX2N0eF8uZl9pbmZvXyArPSBtYl93OwotICB9Ci0KLSAgbWVtID0gKHVpbnQ4X3QqKSgodWludHB0cl90KShtZW0gKyBBTElHTl9NQVNLKSAmIH5BTElHTl9NQVNLKTsKLSAgU0JfRENIRUNLKCh5dXZfc2l6ZSAmIEFMSUdOX01BU0spID09IDApOwotICBkZWMtPnl1dl9iXyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSB5dXZfc2l6ZTsKLQotICBkZWMtPmNvZWZmc18gPSAoaW50MTZfdCopbWVtOwotICBtZW0gKz0gY29lZmZzX3NpemU7Ci0KLSAgZGVjLT5jYWNoZV95X3N0cmlkZV8gPSAxNiAqIG1iX3c7Ci0gIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyA9IDggKiBtYl93OwotICB7Ci0gICAgY29uc3QgaW50IGV4dHJhX3Jvd3MgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKLSAgICBjb25zdCBpbnQgZXh0cmFfeSA9IGV4dHJhX3Jvd3MgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgICBjb25zdCBpbnQgZXh0cmFfdXYgPSAoZXh0cmFfcm93cyAvIDIpICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICAgIGRlYy0+Y2FjaGVfeV8gPSAoKHVpbnQ4X3QqKW1lbSkgKyBleHRyYV95OwotICAgIGRlYy0+Y2FjaGVfdV8gPSBkZWMtPmNhY2hlX3lfCi0gICAgICAgICAgICAgICAgICArIDE2ICogbnVtX2NhY2hlcyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfICsgZXh0cmFfdXY7Ci0gICAgZGVjLT5jYWNoZV92XyA9IGRlYy0+Y2FjaGVfdV8KLSAgICAgICAgICAgICAgICAgICsgOCAqIG51bV9jYWNoZXMgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKyBleHRyYV91djsKLSAgICBkZWMtPmNhY2hlX2lkXyA9IDA7Ci0gIH0KLSAgbWVtICs9IGNhY2hlX3NpemU7Ci0KLSAgLy8gYWxwaGEgcGxhbmUKLSAgZGVjLT5hbHBoYV9wbGFuZV8gPSBhbHBoYV9zaXplID8gKHVpbnQ4X3QqKW1lbSA6IE5VTEw7Ci0gIG1lbSArPSBhbHBoYV9zaXplOwotICBTQl9EQ0hFQ0sobWVtIDw9ICh1aW50OF90KilkZWMtPm1lbV8gKyBkZWMtPm1lbV9zaXplXyk7Ci0KLSAgLy8gbm90ZTogbGVmdC1pbmZvIGlzIGluaXRpYWxpemVkIG9uY2UgZm9yIGFsbC4KLSAgU2JNZW1vcnlTZXQoZGVjLT5tYl9pbmZvXyAtIDEsIDAsIG1iX2luZm9fc2l6ZSk7Ci0KLSAgLy8gaW5pdGlhbGl6ZSB0b3AKLSAgU2JNZW1vcnlTZXQoZGVjLT5pbnRyYV90XywgQl9EQ19QUkVELCBpbnRyYV9wcmVkX21vZGVfc2l6ZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEluaXRJbyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBpbykgewotICAvLyBwcmVwYXJlICdpbycKLSAgaW8tPm1iX3kgPSAwOwotICBpby0+eSA9IGRlYy0+Y2FjaGVfeV87Ci0gIGlvLT51ID0gZGVjLT5jYWNoZV91XzsKLSAgaW8tPnYgPSBkZWMtPmNhY2hlX3ZfOwotICBpby0+eV9zdHJpZGUgPSBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgaW8tPnV2X3N0cmlkZSA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgaW8tPmEgPSBOVUxMOwotfQotCi1pbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7Ci0gIGlmICghSW5pdFRocmVhZENvbnRleHQoZGVjKSkgcmV0dXJuIDA7ICAvLyBjYWxsIGZpcnN0LiBTZXRzIGRlYy0+bnVtX2NhY2hlc18uCi0gIGlmICghQWxsb2NhdGVNZW1vcnkoZGVjKSkgcmV0dXJuIDA7Ci0gIEluaXRJbyhkZWMsIGlvKTsKLSAgVlA4RHNwSW5pdCgpOyAgLy8gSW5pdCBjcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycyBhbmQgbG9vay11cCB0YWJsZXMuCi0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbi4KLQotc3RhdGljIGNvbnN0IGludCBrU2NhblsxNl0gPSB7Ci0gIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAotICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKLSAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCi0gIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTCi19OwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IENoZWNrTW9kZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCBtb2RlKSB7Ci0gIGlmIChtb2RlID09IEJfRENfUFJFRCkgewotICAgIGlmIChkZWMtPm1iX3hfID09IDApIHsKLSAgICAgIHJldHVybiAoZGVjLT5tYl95XyA9PSAwKSA/IEJfRENfUFJFRF9OT1RPUExFRlQgOiBCX0RDX1BSRURfTk9MRUZUOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gKGRlYy0+bWJfeV8gPT0gMCkgPyBCX0RDX1BSRURfTk9UT1AgOiBCX0RDX1BSRUQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtb2RlOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5MzJiKHVpbnQ4X3QqIGRzdCwgdWludDhfdCogc3JjKSB7Ci0gICoodWludDMyX3QqKWRzdCA9ICoodWludDMyX3QqKXNyYzsKLX0KLQotdm9pZCBWUDhSZWNvbnN0cnVjdEJsb2NrKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpbnQgajsKLSAgdWludDhfdCogY29uc3QgeV9kc3QgPSBkZWMtPnl1dl9iXyArIFlfT0ZGOwotICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+eXV2X2JfICsgVV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gZGVjLT55dXZfYl8gKyBWX09GRjsKLQotICAvLyBSb3RhdGUgaW4gdGhlIGxlZnQgc2FtcGxlcyBmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9jay4gV2UgbW92ZSBmb3VyCi0gIC8vIHBpeGVscyBhdCBhIHRpbWUgZm9yIGFsaWdubWVudCByZWFzb24sIGFuZCBiZWNhdXNlIG9mIGluLWxvb3AgZmlsdGVyLgotICBpZiAoZGVjLT5tYl94XyA+IDApIHsKLSAgICBmb3IgKGogPSAtMTsgaiA8IDE2OyArK2opIHsKLSAgICAgIENvcHkzMmIoJnlfZHN0W2ogKiBCUFMgLSA0XSwgJnlfZHN0W2ogKiBCUFMgKyAxMl0pOwotICAgIH0KLSAgICBmb3IgKGogPSAtMTsgaiA8IDg7ICsraikgewotICAgICAgQ29weTMyYigmdV9kc3RbaiAqIEJQUyAtIDRdLCAmdV9kc3RbaiAqIEJQUyArIDRdKTsKLSAgICAgIENvcHkzMmIoJnZfZHN0W2ogKiBCUFMgLSA0XSwgJnZfZHN0W2ogKiBCUFMgKyA0XSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7Ci0gICAgICB5X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7Ci0gICAgfQotICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKLSAgICAgIHVfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKLSAgICAgIHZfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKLSAgICB9Ci0gICAgLy8gSW5pdCB0b3AtbGVmdCBzYW1wbGUgb24gbGVmdCBjb2x1bW4gdG9vCi0gICAgaWYgKGRlYy0+bWJfeV8gPiAwKSB7Ci0gICAgICB5X2RzdFstMSAtIEJQU10gPSB1X2RzdFstMSAtIEJQU10gPSB2X2RzdFstMSAtIEJQU10gPSAxMjk7Ci0gICAgfQotICB9Ci0gIHsKLSAgICAvLyBicmluZyB0b3Agc2FtcGxlcyBpbnRvIHRoZSBjYWNoZQotICAgIHVpbnQ4X3QqIGNvbnN0IHRvcF95ID0gZGVjLT55X3RfICsgZGVjLT5tYl94XyAqIDE2OwotICAgIHVpbnQ4X3QqIGNvbnN0IHRvcF91ID0gZGVjLT51X3RfICsgZGVjLT5tYl94XyAqIDg7Ci0gICAgdWludDhfdCogY29uc3QgdG9wX3YgPSBkZWMtPnZfdF8gKyBkZWMtPm1iX3hfICogODsKLSAgICBjb25zdCBpbnQxNl90KiBjb2VmZnMgPSBkZWMtPmNvZWZmc187Ci0gICAgaW50IG47Ci0KLSAgICBpZiAoZGVjLT5tYl95XyA+IDApIHsKLSAgICAgIFNiTWVtb3J5Q29weSh5X2RzdCAtIEJQUywgdG9wX3ksIDE2KTsKLSAgICAgIFNiTWVtb3J5Q29weSh1X2RzdCAtIEJQUywgdG9wX3UsIDgpOwotICAgICAgU2JNZW1vcnlDb3B5KHZfZHN0IC0gQlBTLCB0b3BfdiwgOCk7Ci0gICAgfSBlbHNlIGlmIChkZWMtPm1iX3hfID09IDApIHsKLSAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluaXQgb25jZSBhdCBibG9jayAoMCwwKS4KLSAgICAgIC8vIEFmdGVyd2FyZCwgaXQgcmVtYWlucyB2YWxpZCBmb3IgdGhlIHdob2xlIHRvcG1vc3Qgcm93LgotICAgICAgU2JNZW1vcnlTZXQoeV9kc3QgLSBCUFMgLSAxLCAxMjcsIDE2ICsgNCArIDEpOwotICAgICAgU2JNZW1vcnlTZXQodV9kc3QgLSBCUFMgLSAxLCAxMjcsIDggKyAxKTsKLSAgICAgIFNiTWVtb3J5U2V0KHZfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7Ci0gICAgfQotCi0gICAgLy8gcHJlZGljdCBhbmQgYWRkIHJlc2lkdWFscwotCi0gICAgaWYgKGRlYy0+aXNfaTR4NF8pIHsgICAvLyA0eDQKLSAgICAgIHVpbnQzMl90KiBjb25zdCB0b3BfcmlnaHQgPSAodWludDMyX3QqKSh5X2RzdCAtIEJQUyArIDE2KTsKLQotICAgICAgaWYgKGRlYy0+bWJfeV8gPiAwKSB7Ci0gICAgICAgIGlmIChkZWMtPm1iX3hfID49IGRlYy0+bWJfd18gLSAxKSB7ICAgIC8vIG9uIHJpZ2h0bW9zdCBib3JkZXIKLSAgICAgICAgICB0b3BfcmlnaHRbMF0gPSB0b3BfeVsxNV0gKiAweDAxMDEwMTAxdTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTYk1lbW9yeUNvcHkodG9wX3JpZ2h0LCB0b3BfeSArIDE2LCBzaXplb2YoKnRvcF9yaWdodCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyByZXBsaWNhdGUgdGhlIHRvcC1yaWdodCBwaXhlbHMgYmVsb3cKLSAgICAgIHRvcF9yaWdodFtCUFNdID0gdG9wX3JpZ2h0WzIgKiBCUFNdID0gdG9wX3JpZ2h0WzMgKiBCUFNdID0gdG9wX3JpZ2h0WzBdOwotCi0gICAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1ZXMgZm9yIGFsbCA0eDQgYmxvY2tzIGluIHR1cm4uCi0gICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4rKykgewotICAgICAgICB1aW50OF90KiBjb25zdCBkc3QgPSB5X2RzdCArIGtTY2FuW25dOwotICAgICAgICBWUDhQcmVkTHVtYTRbZGVjLT5pbW9kZXNfW25dXShkc3QpOwotICAgICAgICBpZiAoZGVjLT5ub25femVyb19hY18gJiAoMSA8PCBuKSkgewotICAgICAgICAgIFZQOFRyYW5zZm9ybShjb2VmZnMgKyBuICogMTYsIGRzdCwgMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVjLT5ub25femVyb18gJiAoMSA8PCBuKSkgeyAgLy8gb25seSBEQyBpcyBwcmVzZW50Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtREMoY29lZmZzICsgbiAqIDE2LCBkc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsgICAgLy8gMTZ4MTYKLSAgICAgIGNvbnN0IGludCBwcmVkX2Z1bmMgPSBDaGVja01vZGUoZGVjLCBkZWMtPmltb2Rlc19bMF0pOwotICAgICAgVlA4UHJlZEx1bWExNltwcmVkX2Z1bmNdKHlfZHN0KTsKLSAgICAgIGlmIChkZWMtPm5vbl96ZXJvXykgewotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4rKykgewotICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHlfZHN0ICsga1NjYW5bbl07Ci0gICAgICAgICAgaWYgKGRlYy0+bm9uX3plcm9fYWNfICYgKDEgPDwgbikpIHsKLSAgICAgICAgICAgIFZQOFRyYW5zZm9ybShjb2VmZnMgKyBuICogMTYsIGRzdCwgMCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChkZWMtPm5vbl96ZXJvXyAmICgxIDw8IG4pKSB7ICAvLyBvbmx5IERDIGlzIHByZXNlbnQKLSAgICAgICAgICAgIFZQOFRyYW5zZm9ybURDKGNvZWZmcyArIG4gKiAxNiwgZHN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgewotICAgICAgLy8gQ2hyb21hCi0gICAgICBjb25zdCBpbnQgcHJlZF9mdW5jID0gQ2hlY2tNb2RlKGRlYywgZGVjLT51dm1vZGVfKTsKLSAgICAgIFZQOFByZWRDaHJvbWE4W3ByZWRfZnVuY10odV9kc3QpOwotICAgICAgVlA4UHJlZENocm9tYThbcHJlZF9mdW5jXSh2X2RzdCk7Ci0KLSAgICAgIGlmIChkZWMtPm5vbl96ZXJvXyAmIDB4MGYwMDAwKSB7ICAgLy8gY2hyb21hLVUKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgdV9jb2VmZnMgPSBkZWMtPmNvZWZmc18gKyAxNiAqIDE2OwotICAgICAgICBpZiAoZGVjLT5ub25femVyb19hY18gJiAweDBmMDAwMCkgewotICAgICAgICAgIFZQOFRyYW5zZm9ybVVWKHVfY29lZmZzLCB1X2RzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtRENVVih1X2NvZWZmcywgdV9kc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZGVjLT5ub25femVyb18gJiAweGYwMDAwMCkgeyAgIC8vIGNocm9tYS1WCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IHZfY29lZmZzID0gZGVjLT5jb2VmZnNfICsgMjAgKiAxNjsKLSAgICAgICAgaWYgKGRlYy0+bm9uX3plcm9fYWNfICYgMHhmMDAwMDApIHsKLSAgICAgICAgICBWUDhUcmFuc2Zvcm1VVih2X2NvZWZmcywgdl9kc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZQOFRyYW5zZm9ybURDVVYodl9jb2VmZnMsIHZfZHN0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdGFzaCBhd2F5IHRvcCBzYW1wbGVzIGZvciBuZXh0IGJsb2NrCi0gICAgICBpZiAoZGVjLT5tYl95XyA8IGRlYy0+bWJfaF8gLSAxKSB7Ci0gICAgICAgIFNiTWVtb3J5Q29weSh0b3BfeSwgeV9kc3QgKyAxNSAqIEJQUywgMTYpOwotICAgICAgICBTYk1lbW9yeUNvcHkodG9wX3UsIHVfZHN0ICsgIDcgKiBCUFMsICA4KTsKLSAgICAgICAgU2JNZW1vcnlDb3B5KHRvcF92LCB2X2RzdCArICA3ICogQlBTLCAgOCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIFRyYW5zZmVyIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBmcm9tIHl1dl9iXyBjYWNoZSB0byBmaW5hbCBkZXN0aW5hdGlvbi4KLSAgewotICAgIGNvbnN0IGludCB5X29mZnNldCA9IGRlYy0+Y2FjaGVfaWRfICogMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gZGVjLT5jYWNoZV9pZF8gKiA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICAgIHVpbnQ4X3QqIGNvbnN0IHlfb3V0ID0gZGVjLT5jYWNoZV95XyArIGRlYy0+bWJfeF8gKiAxNiArIHlfb2Zmc2V0OwotICAgIHVpbnQ4X3QqIGNvbnN0IHVfb3V0ID0gZGVjLT5jYWNoZV91XyArIGRlYy0+bWJfeF8gKiA4ICsgdXZfb2Zmc2V0OwotICAgIHVpbnQ4X3QqIGNvbnN0IHZfb3V0ID0gZGVjLT5jYWNoZV92XyArIGRlYy0+bWJfeF8gKiA4ICsgdXZfb2Zmc2V0OwotICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkoeV9vdXQgKyBqICogZGVjLT5jYWNoZV95X3N0cmlkZV8sIHlfZHN0ICsgaiAqIEJQUywgMTYpOwotICAgIH0KLSAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkodV9vdXQgKyBqICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1X2RzdCArIGogKiBCUFMsIDgpOwotICAgICAgU2JNZW1vcnlDb3B5KHZfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdl9kc3QgKyBqICogQlBTLCA4KTsKLSAgICB9Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvbGF5ZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9sYXllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTcwNDJmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9sYXllci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEVuaGFuY2VtZW50IGxheWVyIChmb3IgWVVWNDQ0LzQyMikKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgVlA4RGVjb2RlTGF5ZXIoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIFNCX0RDSEVDSyhkZWMpOwotICBTQl9EQ0hFQ0soZGVjLT5sYXllcl9kYXRhX3NpemVfID4gMCk7Ci0gICh2b2lkKWRlYzsKLQotICAvLyBUT0RPOiBoYW5kbGUgZW5oYW5jZW1lbnQgbGF5ZXIgaGVyZS4KLQotICByZXR1cm4gMTsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2FlMjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBtYWluIGVudHJ5IGZvciB0aGUgZGVjb2RlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfcmVhZGVyLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpIHsKLSAgcmV0dXJuIChERUNfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKERFQ19NSU5fVkVSU0lPTiA8PCA4KSB8IERFQ19SRVZfVkVSU0lPTjsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOERlY29kZXIKLQotc3RhdGljIHZvaWQgU2V0T2soVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT0s7Ci0gIGRlYy0+ZXJyb3JfbXNnXyA9ICJPSyI7Ci19Ci0KLWludCBWUDhJbml0SW9JbnRlcm5hbChWUDhJbyogY29uc3QgaW8sIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgLy8gbWlzbWF0Y2ggZXJyb3IKLSAgfQotICBpZiAoaW8gIT0gTlVMTCkgewotICAgIFNiTWVtb3J5U2V0KGlvLCAwLCBzaXplb2YoKmlvKSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLVZQOERlY29kZXIqIFZQOE5ldyh2b2lkKSB7Ci0gIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmRlYykpOwotICBpZiAoZGVjICE9IE5VTEwpIHsKLSAgICBTZXRPayhkZWMpOwotICAgIFdlYlBXb3JrZXJJbml0KCZkZWMtPndvcmtlcl8pOwotICAgIGRlYy0+cmVhZHlfID0gMDsKLSAgICBkZWMtPm51bV9wYXJ0c18gPSAxOwotICB9Ci0gIHJldHVybiBkZWM7Ci19Ci0KLVZQOFN0YXR1c0NvZGUgVlA4U3RhdHVzKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpZiAoIWRlYykgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgcmV0dXJuIGRlYy0+c3RhdHVzXzsKLX0KLQotY29uc3QgY2hhciogVlA4U3RhdHVzTWVzc2FnZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gIm5vIG9iamVjdCI7Ci0gIGlmICghZGVjLT5lcnJvcl9tc2dfKSByZXR1cm4gIk9LIjsKLSAgcmV0dXJuIGRlYy0+ZXJyb3JfbXNnXzsKLX0KLQotdm9pZCBWUDhEZWxldGUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmIChkZWMgIT0gTlVMTCkgewotICAgIFZQOENsZWFyKGRlYyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYyk7Ci0gIH0KLX0KLQotaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpIHsKLSAgLy8gVE9ETyBUaGlzIGNoZWNrIHdvdWxkIGJlIHVubmVjZXNzYXJ5IGlmIGFscGhhIGRlY29tcHJlc3Npb24gd2FzIHNlcGFyYXRlZAotICAvLyBmcm9tIFZQOFByb2Nlc3NSb3cvRmluaXNoUm93LiBUaGlzIGF2b2lkcyBzZXR0aW5nICdkZWMtPnN0YXR1c18nIHRvCi0gIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIG9uIGFscGhhIGRlY29tcHJlc3Npb24KLSAgLy8gZmFpbHVyZS4KLSAgaWYgKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gZXJyb3I7Ci0gICAgZGVjLT5lcnJvcl9tc2dfID0gbXNnOwotICAgIGRlYy0+cmVhZHlfID0gMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgcmV0dXJuIChkYXRhX3NpemUgPj0gMyAmJgotICAgICAgICAgIGRhdGFbMF0gPT0gMHg5ZCAmJiBkYXRhWzFdID09IDB4MDEgJiYgZGF0YVsyXSA9PSAweDJhKTsKLX0KLQotaW50IFZQOEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IGNodW5rX3NpemUsCi0gICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgewotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgewotICAgIHJldHVybiAwOyAgICAgICAgIC8vIG5vdCBlbm91Z2ggZGF0YQotICB9Ci0gIC8vIGNoZWNrIHNpZ25hdHVyZQotICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGRhdGEgKyAzLCBkYXRhX3NpemUgLSAzKSkgewotICAgIHJldHVybiAwOyAgICAgICAgIC8vIFdyb25nIHNpZ25hdHVyZS4KLSAgfSBlbHNlIHsKLSAgICBjb25zdCB1aW50MzJfdCBiaXRzID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOwotICAgIGNvbnN0IGludCBrZXlfZnJhbWUgPSAhKGJpdHMgJiAxKTsKLSAgICBjb25zdCBpbnQgdyA9ICgoZGF0YVs3XSA8PCA4KSB8IGRhdGFbNl0pICYgMHgzZmZmOwotICAgIGNvbnN0IGludCBoID0gKChkYXRhWzldIDw8IDgpIHwgZGF0YVs4XSkgJiAweDNmZmY7Ci0KLSAgICBpZiAoIWtleV9mcmFtZSkgeyAgIC8vIE5vdCBhIGtleWZyYW1lLgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCgoYml0cyA+PiAxKSAmIDcpID4gMykgewotICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gdW5rbm93biBwcm9maWxlCi0gICAgfQotICAgIGlmICghKChiaXRzID4+IDQpICYgMSkpIHsKLSAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIGZpcnN0IGZyYW1lIGlzIGludmlzaWJsZSEKLSAgICB9Ci0gICAgaWYgKCgoYml0cyA+PiA1KSkgPj0gY2h1bmtfc2l6ZSkgeyAgLy8gcGFydGl0aW9uX2xlbmd0aAotICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gaW5jb25zaXN0ZW50IHNpemUgaW5mb3JtYXRpb24uCi0gICAgfQotCi0gICAgaWYgKHdpZHRoKSB7Ci0gICAgICAqd2lkdGggPSB3OwotICAgIH0KLSAgICBpZiAoaGVpZ2h0KSB7Ci0gICAgICAqaGVpZ2h0ID0gaDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVhZGVyIHBhcnNpbmcKLQotc3RhdGljIHZvaWQgUmVzZXRTZWdtZW50SGVhZGVyKFZQOFNlZ21lbnRIZWFkZXIqIGNvbnN0IGhkcikgewotICBTQl9EQ0hFQ0soaGRyICE9IE5VTEwpOwotICBoZHItPnVzZV9zZWdtZW50XyA9IDA7Ci0gIGhkci0+dXBkYXRlX21hcF8gPSAwOwotICBoZHItPmFic29sdXRlX2RlbHRhXyA9IDE7Ci0gIFNiTWVtb3J5U2V0KGhkci0+cXVhbnRpemVyXywgMCwgc2l6ZW9mKGhkci0+cXVhbnRpemVyXykpOwotICBTYk1lbW9yeVNldChoZHItPmZpbHRlcl9zdHJlbmd0aF8sIDAsIHNpemVvZihoZHItPmZpbHRlcl9zdHJlbmd0aF8pKTsKLX0KLQotLy8gUGFyYWdyYXBoIDkuMwotc3RhdGljIGludCBQYXJzZVNlZ21lbnRIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFNlZ21lbnRIZWFkZXIqIGhkciwgVlA4UHJvYmEqIHByb2JhKSB7Ci0gIFNCX0RDSEVDSyhiciAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGhkciAhPSBOVUxMKTsKLSAgaGRyLT51c2Vfc2VnbWVudF8gPSBWUDhHZXQoYnIpOwotICBpZiAoaGRyLT51c2Vfc2VnbWVudF8pIHsKLSAgICBoZHItPnVwZGF0ZV9tYXBfID0gVlA4R2V0KGJyKTsKLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSBkYXRhCi0gICAgICBpbnQgczsKLSAgICAgIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gVlA4R2V0KGJyKTsKLSAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICBoZHItPnF1YW50aXplcl9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDcpIDogMDsKLSAgICAgIH0KLSAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICBoZHItPmZpbHRlcl9zdHJlbmd0aF9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpIDogMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGhkci0+dXBkYXRlX21hcF8pIHsKLSAgICAgIGludCBzOwotICAgICAgZm9yIChzID0gMDsgcyA8IE1CX0ZFQVRVUkVfVFJFRV9QUk9CUzsgKytzKSB7Ci0gICAgICAgIHByb2JhLT5zZWdtZW50c19bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0VmFsdWUoYnIsIDgpIDogMjU1dTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaGRyLT51cGRhdGVfbWFwXyA9IDA7Ci0gIH0KLSAgcmV0dXJuICFici0+ZW9mXzsKLX0KLQotLy8gUGFyYWdyYXBoIDkuNQotLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIFZQOF9TVEFUVVNfU1VTUEVOREVEIGlmIHdlIGRvbid0IGhhdmUgYWxsIHRoZQotLy8gbmVjZXNzYXJ5IGRhdGEgaW4gJ2J1ZicuCi0vLyBUaGlzIGNhc2UgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIChmb3IgaW5jcmVtZW50YWwgZGVjb2RpbmcpLgotLy8gU3RpbGwsIG5vIGJpdHJlYWRlciBpcyBldmVyIGluaXRpYWxpemVkIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZAotLy8gdW5hdmFpbGFibGUgbWVtb3J5LgotLy8gSWYgd2UgZG9uJ3QgZXZlbiBoYXZlIHRoZSBwYXJ0aXRpb25zJyBzaXplcywgdGhhbiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQQotLy8gaXMgcmV0dXJuZWQsIGFuZCB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCi0vLyBJZiB0aGUgcGFydGl0aW9ucyB3ZXJlIHBvc2l0aW9uZWQgb2ssIFZQOF9TVEFUVVNfT0sgaXMgcmV0dXJuZWQuCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVBhcnRpdGlvbnMoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKLSAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgY29uc3QgdWludDhfdCogc3ogPSBidWY7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmQgPSBidWYgKyBzaXplOwotICBjb25zdCB1aW50OF90KiBwYXJ0X3N0YXJ0OwotICBpbnQgbGFzdF9wYXJ0OwotICBpbnQgcDsKLQotICBkZWMtPm51bV9wYXJ0c18gPSAxIDw8IFZQOEdldFZhbHVlKGJyLCAyKTsKLSAgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfIC0gMTsKLSAgcGFydF9zdGFydCA9IGJ1ZiArIGxhc3RfcGFydCAqIDM7Ci0gIGlmIChidWZfZW5kIDwgcGFydF9zdGFydCkgewotICAgIC8vIHdlIGNhbid0IGV2ZW4gcmVhZCB0aGUgc2l6ZXMgd2l0aCBzeltdISBUaGF0J3MgYSBmYWlsdXJlLgotICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKLSAgfQotICBmb3IgKHAgPSAwOyBwIDwgbGFzdF9wYXJ0OyArK3ApIHsKLSAgICBjb25zdCB1aW50MzJfdCBwc2l6ZSA9IHN6WzBdIHwgKHN6WzFdIDw8IDgpIHwgKHN6WzJdIDw8IDE2KTsKLSAgICBjb25zdCB1aW50OF90KiBwYXJ0X2VuZCA9IHBhcnRfc3RhcnQgKyBwc2l6ZTsKLSAgICBpZiAocGFydF9lbmQgPiBidWZfZW5kKSBwYXJ0X2VuZCA9IGJ1Zl9lbmQ7Ci0gICAgVlA4SW5pdEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIHBhcnRfc3RhcnQsIHBhcnRfZW5kKTsKLSAgICBwYXJ0X3N0YXJ0ID0gcGFydF9lbmQ7Ci0gICAgc3ogKz0gMzsKLSAgfQotICBWUDhJbml0Qml0UmVhZGVyKGRlYy0+cGFydHNfICsgbGFzdF9wYXJ0LCBwYXJ0X3N0YXJ0LCBidWZfZW5kKTsKLSAgcmV0dXJuIChwYXJ0X3N0YXJ0IDwgYnVmX2VuZCkgPyBWUDhfU1RBVFVTX09LIDoKLSAgICAgICAgICAgVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAgLy8gSW5pdCBpcyBvaywgYnV0IHRoZXJlJ3Mgbm90IGVub3VnaCBkYXRhCi19Ci0KLS8vIFBhcmFncmFwaCA5LjQKLXN0YXRpYyBpbnQgUGFyc2VGaWx0ZXJIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+ZmlsdGVyX2hkcl87Ci0gIGhkci0+c2ltcGxlXyAgICA9IFZQOEdldChicik7Ci0gIGhkci0+bGV2ZWxfICAgICA9IFZQOEdldFZhbHVlKGJyLCA2KTsKLSAgaGRyLT5zaGFycG5lc3NfID0gVlA4R2V0VmFsdWUoYnIsIDMpOwotICBoZHItPnVzZV9sZl9kZWx0YV8gPSBWUDhHZXQoYnIpOwotICBpZiAoaGRyLT51c2VfbGZfZGVsdGFfKSB7Ci0gICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgbGYtZGVsdGE/Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVGX0xGX0RFTFRBUzsgKytpKSB7Ci0gICAgICAgIGlmIChWUDhHZXQoYnIpKSB7Ci0gICAgICAgICAgaGRyLT5yZWZfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01PREVfTEZfREVMVEFTOyArK2kpIHsKLSAgICAgICAgaWYgKFZQOEdldChicikpIHsKLSAgICAgICAgICBoZHItPm1vZGVfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGRlYy0+ZmlsdGVyX3R5cGVfID0gKGhkci0+bGV2ZWxfID09IDApID8gMCA6IGhkci0+c2ltcGxlXyA/IDEgOiAyOwotICByZXR1cm4gIWJyLT5lb2ZfOwotfQotCi0vLyBUb3Btb3N0IGNhbGwKLWludCBWUDhHZXRIZWFkZXJzKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKLSAgc2l6ZV90IGJ1Zl9zaXplOwotICBWUDhGcmFtZUhlYWRlciogZnJtX2hkcjsKLSAgVlA4UGljdHVyZUhlYWRlciogcGljX2hkcjsKLSAgVlA4Qml0UmVhZGVyKiBicjsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7Ci0gIFdlYlBIZWFkZXJTdHJ1Y3R1cmUgaGVhZGVyczsKLQotICBpZiAoZGVjID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBTZXRPayhkZWMpOwotICBpZiAoaW8gPT0gTlVMTCkgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgVlA4SW8gcGFzc2VkIHRvIFZQOEdldEhlYWRlcnMoKSIpOwotICB9Ci0KLSAgLy8gUHJvY2VzcyBQcmUtVlA4IGNodW5rcy4KLSAgaGVhZGVycy5kYXRhID0gaW8tPmRhdGE7Ci0gIGhlYWRlcnMuZGF0YV9zaXplID0gaW8tPmRhdGFfc2l6ZTsKLSAgc3RhdHVzID0gV2ViUFBhcnNlSGVhZGVycygmaGVhZGVycyk7Ci0gIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIHN0YXR1cywgIkluY29ycmVjdC9pbmNvbXBsZXRlIGhlYWRlci4iKTsKLSAgfQotICBpZiAoaGVhZGVycy5pc19sb3NzbGVzcykgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBsb3NzbGVzcyBmb3JtYXQgZW5jb3VudGVyZWQuIik7Ci0gIH0KLQotICBpZiAoZGVjLT5hbHBoYV9kYXRhXyA9PSBOVUxMKSB7Ci0gICAgU0JfRENIRUNLKGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9PSAwKTsKLSAgICAvLyBXZSBoYXZlIE5PVCBzZXQgYWxwaGEgZGF0YSB5ZXQuIFNldCBpdCBub3cuCi0gICAgLy8gKFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgZGVjLT5hbHBoYV9kYXRhXyBpcyBOT1QgcmVzZXQgdG8gTlVMTCBpZgotICAgIC8vIFdlYlBQYXJzZUhlYWRlcnMoKSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGFzIGluIGluY3JlbWVudGFsIGRlY29kaW5nCi0gICAgLy8gY2FzZS4pCi0gICAgZGVjLT5hbHBoYV9kYXRhXyA9IGhlYWRlcnMuYWxwaGFfZGF0YTsKLSAgICBkZWMtPmFscGhhX2RhdGFfc2l6ZV8gPSBoZWFkZXJzLmFscGhhX2RhdGFfc2l6ZTsKLSAgfQotCi0gIC8vIFByb2Nlc3MgdGhlIFZQOCBmcmFtZSBoZWFkZXIuCi0gIGJ1ZiA9IGhlYWRlcnMuZGF0YSArIGhlYWRlcnMub2Zmc2V0OwotICBidWZfc2l6ZSA9IGhlYWRlcnMuZGF0YV9zaXplIC0gaGVhZGVycy5vZmZzZXQ7Ci0gIFNCX0RDSEVDSyhoZWFkZXJzLmRhdGFfc2l6ZSA+PSBoZWFkZXJzLm9mZnNldCk7ICAvLyBXZWJQUGFyc2VIZWFkZXJzJyBndWFyYW50ZWUKLSAgaWYgKGJ1Zl9zaXplIDwgNCkgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGVkIGhlYWRlci4iKTsKLSAgfQotCi0gIC8vIFBhcmFncmFwaCA5LjEKLSAgewotICAgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSBidWZbMF0gfCAoYnVmWzFdIDw8IDgpIHwgKGJ1ZlsyXSA8PCAxNik7Ci0gICAgZnJtX2hkciA9ICZkZWMtPmZybV9oZHJfOwotICAgIGZybV9oZHItPmtleV9mcmFtZV8gPSAhKGJpdHMgJiAxKTsKLSAgICBmcm1faGRyLT5wcm9maWxlXyA9IChiaXRzID4+IDEpICYgNzsKLSAgICBmcm1faGRyLT5zaG93XyA9IChiaXRzID4+IDQpICYgMTsKLSAgICBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA9IChiaXRzID4+IDUpOwotICAgIGlmIChmcm1faGRyLT5wcm9maWxlXyA+IDMpCi0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGtleWZyYW1lIHBhcmFtZXRlcnMuIik7Ci0gICAgaWYgKCFmcm1faGRyLT5zaG93XykKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWUgbm90IGRpc3BsYXlhYmxlLiIpOwotICAgIGJ1ZiArPSAzOwotICAgIGJ1Zl9zaXplIC09IDM7Ci0gIH0KLQotICBwaWNfaGRyID0gJmRlYy0+cGljX2hkcl87Ci0gIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7Ci0gICAgLy8gUGFyYWdyYXBoIDkuMgotICAgIGlmIChidWZfc2l6ZSA8IDcpIHsKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgcGljdHVyZSBoZWFkZXIiKTsKLSAgICB9Ci0gICAgaWYgKCFWUDhDaGVja1NpZ25hdHVyZShidWYsIGJ1Zl9zaXplKSkgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBjb2RlIHdvcmQiKTsKLSAgICB9Ci0gICAgcGljX2hkci0+d2lkdGhfID0gKChidWZbNF0gPDwgOCkgfCBidWZbM10pICYgMHgzZmZmOwotICAgIHBpY19oZHItPnhzY2FsZV8gPSBidWZbNF0gPj4gNjsgICAvLyByYXRpbzogMSwgNS80IDUvMyBvciAyCi0gICAgcGljX2hkci0+aGVpZ2h0XyA9ICgoYnVmWzZdIDw8IDgpIHwgYnVmWzVdKSAmIDB4M2ZmZjsKLSAgICBwaWNfaGRyLT55c2NhbGVfID0gYnVmWzZdID4+IDY7Ci0gICAgYnVmICs9IDc7Ci0gICAgYnVmX3NpemUgLT0gNzsKLQotICAgIGRlYy0+bWJfd18gPSAocGljX2hkci0+d2lkdGhfICsgMTUpID4+IDQ7Ci0gICAgZGVjLT5tYl9oXyA9IChwaWNfaGRyLT5oZWlnaHRfICsgMTUpID4+IDQ7Ci0gICAgLy8gU2V0dXAgZGVmYXVsdCBvdXRwdXQgYXJlYSAoY2FuIGJlIGxhdGVyIG1vZGlmaWVkIGR1cmluZyBpby0+c2V0dXAoKSkKLSAgICBpby0+d2lkdGggPSBwaWNfaGRyLT53aWR0aF87Ci0gICAgaW8tPmhlaWdodCA9IHBpY19oZHItPmhlaWdodF87Ci0gICAgaW8tPnVzZV9zY2FsaW5nICA9IDA7Ci0gICAgaW8tPnVzZV9jcm9wcGluZyA9IDA7Ci0gICAgaW8tPmNyb3BfdG9wICA9IDA7Ci0gICAgaW8tPmNyb3BfbGVmdCA9IDA7Ci0gICAgaW8tPmNyb3BfcmlnaHQgID0gaW8tPndpZHRoOwotICAgIGlvLT5jcm9wX2JvdHRvbSA9IGlvLT5oZWlnaHQ7Ci0gICAgaW8tPm1iX3cgPSBpby0+d2lkdGg7ICAgLy8gc2FuaXR5IGNoZWNrCi0gICAgaW8tPm1iX2ggPSBpby0+aGVpZ2h0OyAgLy8gZGl0dG8KLQotICAgIFZQOFJlc2V0UHJvYmEoJmRlYy0+cHJvYmFfKTsKLSAgICBSZXNldFNlZ21lbnRIZWFkZXIoJmRlYy0+c2VnbWVudF9oZHJfKTsKLSAgICBkZWMtPnNlZ21lbnRfID0gMDsgICAgLy8gZGVmYXVsdCBmb3IgaW50cmEKLSAgfQotCi0gIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHRoZSBwYXJ0aXRpb24gIzAgYXZhaWxhYmxlLCBhbmQgaW5pdGlhbGl6ZSBkZWMtPmJyXwotICAvLyB0byByZWFkIHRoaXMgcGFydGl0aW9uIChhbmQgdGhpcyBwYXJ0aXRpb24gb25seSkuCi0gIGlmIChmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA+IGJ1Zl9zaXplKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFydGl0aW9uIGxlbmd0aCIpOwotICB9Ci0KLSAgYnIgPSAmZGVjLT5icl87Ci0gIFZQOEluaXRCaXRSZWFkZXIoYnIsIGJ1ZiwgYnVmICsgZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF8pOwotICBidWYgKz0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87Ci0gIGJ1Zl9zaXplIC09IGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfOwotCi0gIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7Ci0gICAgcGljX2hkci0+Y29sb3JzcGFjZV8gPSBWUDhHZXQoYnIpOwotICAgIHBpY19oZHItPmNsYW1wX3R5cGVfID0gVlA4R2V0KGJyKTsKLSAgfQotICBpZiAoIVBhcnNlU2VnbWVudEhlYWRlcihiciwgJmRlYy0+c2VnbWVudF9oZHJfLCAmZGVjLT5wcm9iYV8pKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2Ugc2VnbWVudCBoZWFkZXIiKTsKLSAgfQotICAvLyBGaWx0ZXIgc3BlY3MKLSAgaWYgKCFQYXJzZUZpbHRlckhlYWRlcihiciwgZGVjKSkgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHBhcnNlIGZpbHRlciBoZWFkZXIiKTsKLSAgfQotICBzdGF0dXMgPSBQYXJzZVBhcnRpdGlvbnMoZGVjLCBidWYsIGJ1Zl9zaXplKTsKLSAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgc3RhdHVzLCAiY2Fubm90IHBhcnNlIHBhcnRpdGlvbnMiKTsKLSAgfQotCi0gIC8vIHF1YW50aXplciBjaGFuZ2UKLSAgVlA4UGFyc2VRdWFudChkZWMpOwotCi0gIC8vIEZyYW1lIGJ1ZmZlciBtYXJraW5nCi0gIGlmICghZnJtX2hkci0+a2V5X2ZyYW1lXykgewotICAgIC8vIFBhcmFncmFwaCA5LjcKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gICAgZGVjLT5idWZmZXJfZmxhZ3NfID0gVlA4R2V0KGJyKSA8PCAwOyAgIC8vIHVwZGF0ZSBnb2xkZW4KLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0KGJyKSA8PCAxOyAgLy8gdXBkYXRlIGFsdCByZWYKLSAgICBpZiAoIShkZWMtPmJ1ZmZlcl9mbGFnc18gJiAxKSkgewotICAgICAgZGVjLT5idWZmZXJfZmxhZ3NfIHw9IFZQOEdldFZhbHVlKGJyLCAyKSA8PCAyOwotICAgIH0KLSAgICBpZiAoIShkZWMtPmJ1ZmZlcl9mbGFnc18gJiAyKSkgewotICAgICAgZGVjLT5idWZmZXJfZmxhZ3NfIHw9IFZQOEdldFZhbHVlKGJyLCAyKSA8PCA0OwotICAgIH0KLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0KGJyKSA8PCA2OyAgICAvLyBzaWduIGJpYXMgZ29sZGVuCi0gICAgZGVjLT5idWZmZXJfZmxhZ3NfIHw9IFZQOEdldChicikgPDwgNzsgICAgLy8gc2lnbiBiaWFzIGFsdCByZWYKLSNlbHNlCi0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAiTm90IGEga2V5IGZyYW1lLiIpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZGVjLT5idWZmZXJfZmxhZ3NfID0gMHgwMDMgfCAweDEwMDsKLSAgfQotCi0gIC8vIFBhcmFncmFwaCA5LjgKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIGRlYy0+dXBkYXRlX3Byb2JhXyA9IFZQOEdldChicik7Ci0gIGlmICghZGVjLT51cGRhdGVfcHJvYmFfKSB7ICAgIC8vIHNhdmUgZm9yIGxhdGVyIHJlc3RvcmUKLSAgICBkZWMtPnByb2JhX3NhdmVkXyA9IGRlYy0+cHJvYmFfOwotICB9Ci0gIGRlYy0+YnVmZmVyX2ZsYWdzXyAmPSAxIDw8IDg7Ci0gIGRlYy0+YnVmZmVyX2ZsYWdzXyB8PQotICAgICAgKGZybV9oZHItPmtleV9mcmFtZV8gfHwgVlA4R2V0KGJyKSkgPDwgODsgICAgLy8gcmVmcmVzaCBsYXN0IGZyYW1lCi0jZWxzZQotICBWUDhHZXQoYnIpOyAgIC8vIGp1c3QgaWdub3JlIHRoZSB2YWx1ZSBvZiB1cGRhdGVfcHJvYmFfCi0jZW5kaWYKLQotICBWUDhQYXJzZVByb2JhKGJyLCBkZWMpOwotCi0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgLy8gRXh0ZW5zaW9ucwotICBpZiAoZGVjLT5waWNfaGRyXy5jb2xvcnNwYWNlXykgewotICAgIGNvbnN0IHNpemVfdCBrVHJhaWxlclNpemUgPSA4OwotICAgIGNvbnN0IHVpbnQ4X3Qga1RyYWlsZXJNYXJrZXIgPSAweDAxOwotICAgIGNvbnN0IHVpbnQ4X3QqIGV4dF9idWYgPSBidWYgLSBrVHJhaWxlclNpemU7Ci0gICAgc2l6ZV90IHNpemU7Ci0KLSAgICBpZiAoZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF8gPCBrVHJhaWxlclNpemUgfHwKLSAgICAgICAgZXh0X2J1ZltrVHJhaWxlclNpemUgLSAxXSAhPSBrVHJhaWxlck1hcmtlcikgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlJJRkY6IEluY29uc2lzdGVudCBleHRyYSBpbmZvcm1hdGlvbi4iKTsKLSAgICB9Ci0KLSAgICAvLyBMYXllcgotICAgIHNpemUgPSAoZXh0X2J1ZlswXSA8PCAwKSB8IChleHRfYnVmWzFdIDw8IDgpIHwgKGV4dF9idWZbMl0gPDwgMTYpOwotICAgIGRlYy0+bGF5ZXJfZGF0YV9zaXplXyA9IHNpemU7Ci0gICAgZGVjLT5sYXllcl9kYXRhXyA9IE5VTEw7ICAvLyB3aWxsIGJlIHNldCBsYXRlcgotICAgIGRlYy0+bGF5ZXJfY29sb3JzcGFjZV8gPSBleHRfYnVmWzNdOwotICB9Ci0jZW5kaWYKLQotICAvLyBzYW5pdGl6ZWQgc3RhdGUKLSAgZGVjLT5yZWFkeV8gPSAxOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlc2lkdWFsIGRlY29kaW5nIChQYXJhZ3JhcGggMTMuMiAvIDEzLjMpCi0KLXN0YXRpYyBjb25zdCBpbnQga0JhbmRzWzE2ICsgMV0gPSB7Ci0gIDAsIDEsIDIsIDMsIDYsIDQsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDcsCi0gIDAgIC8vIGV4dHJhIGVudHJ5IGFzIHNlbnRpbmVsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrQ2F0M1tdID0geyAxNzMsIDE0OCwgMTQwLCAwIH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrQ2F0NFtdID0geyAxNzYsIDE1NSwgMTQwLCAxMzUsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ1W10gPSB7IDE4MCwgMTU3LCAxNDEsIDEzNCwgMTMwLCAwIH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrQ2F0NltdID0KLSAgeyAyNTQsIDI1NCwgMjQzLCAyMzAsIDE5NiwgMTc3LCAxNTMsIDE0MCwgMTMzLCAxMzAsIDEyOSwgMCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGtDYXQzNDU2W10gPSB7IGtDYXQzLCBrQ2F0NCwga0NhdDUsIGtDYXQ2IH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKLSAgMCwgMSwgNCwgOCwgIDUsIDIsIDMsIDYsICA5LCAxMiwgMTMsIDEwLCAgNywgMTEsIDE0LCAxNQotfTsKLQotdHlwZWRlZiBjb25zdCB1aW50OF90ICgqUHJvYmFBcnJheSlbTlVNX0NUWF1bTlVNX1BST0JBU107ICAvLyBmb3IgY29uc3QtY2FzdGluZwotdHlwZWRlZiBjb25zdCB1aW50OF90ICgqUHJvYmFDdHhBcnJheSlbTlVNX1BST0JBU107Ci0KLS8vIFNlZSBzZWN0aW9uIDEzLTI6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYzODYjc2VjdGlvbi0xMy4yCi1zdGF0aWMgaW50IEdldExhcmdlVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgY29uc3QgdWludDhfdCogY29uc3QgcCkgewotICBpbnQgdjsKLSAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbM10pKSB7Ci0gICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNF0pKSB7Ci0gICAgICB2ID0gMjsKLSAgICB9IGVsc2UgewotICAgICAgdiA9IDMgKyBWUDhHZXRCaXQoYnIsIHBbNV0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoIVZQOEdldEJpdChiciwgcFs2XSkpIHsKLSAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzddKSkgewotICAgICAgICB2ID0gNSArIFZQOEdldEJpdChiciwgMTU5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHYgPSA3ICsgMiAqIFZQOEdldEJpdChiciwgMTY1KTsKLSAgICAgICAgdiArPSBWUDhHZXRCaXQoYnIsIDE0NSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKLSAgICAgIGNvbnN0IGludCBiaXQxID0gVlA4R2V0Qml0KGJyLCBwWzhdKTsKLSAgICAgIGNvbnN0IGludCBiaXQwID0gVlA4R2V0Qml0KGJyLCBwWzkgKyBiaXQxXSk7Ci0gICAgICBjb25zdCBpbnQgY2F0ID0gMiAqIGJpdDEgKyBiaXQwOwotICAgICAgdiA9IDA7Ci0gICAgICBmb3IgKHRhYiA9IGtDYXQzNDU2W2NhdF07ICp0YWI7ICsrdGFiKSB7Ci0gICAgICAgIHYgKz0gdiArIFZQOEdldEJpdChiciwgKnRhYik7Ci0gICAgICB9Ci0gICAgICB2ICs9IDMgKyAoOCA8PCBjYXQpOwotICAgIH0KLSAgfQotICByZXR1cm4gdjsKLX0KLQotLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmYgcGx1cyBvbmUKLS8vIChhbmQgMCBpZiB0aGVyZSdzIG5vIGNvZWZmIGF0IGFsbCkKLXN0YXRpYyBpbnQgR2V0Q29lZmZzKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFByb2JhQXJyYXkgcHJvYiwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjdHgsIGNvbnN0IHF1YW50X3QgZHEsIGludCBuLCBpbnQxNl90KiBvdXQpIHsKLSAgLy8gbiBpcyBlaXRoZXIgMCBvciAxIGhlcmUuIGtCYW5kc1tuXSBpcyBub3QgbmVjZXNzYXJ5IGZvciBleHRyYWN0aW5nICcqcCcuCi0gIGNvbnN0IHVpbnQ4X3QqIHAgPSBwcm9iW25dW2N0eF07Ci0gIGlmICghVlA4R2V0Qml0KGJyLCBwWzBdKSkgeyAgIC8vIGZpcnN0IEVPQiBpcyBtb3JlIGEgJ0NCUCcgYml0LgotICAgIHJldHVybiAwOwotICB9Ci0gIGZvciAoOyBuIDwgMTY7ICsrbikgewotICAgIGNvbnN0IFByb2JhQ3R4QXJyYXkgcF9jdHggPSBwcm9iW2tCYW5kc1tuICsgMV1dOwotICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzFdKSkgewotICAgICAgcCA9IHBfY3R4WzBdOwotICAgIH0gZWxzZSB7ICAvLyBub24gemVybyBjb2VmZgotICAgICAgaW50IHY7Ci0gICAgICBpZiAoIVZQOEdldEJpdChiciwgcFsyXSkpIHsKLSAgICAgICAgdiA9IDE7Ci0gICAgICAgIHAgPSBwX2N0eFsxXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHYgPSBHZXRMYXJnZVZhbHVlKGJyLCBwKTsKLSAgICAgICAgcCA9IHBfY3R4WzJdOwotICAgICAgfQotICAgICAgb3V0W2taaWd6YWdbbl1dID0gVlA4R2V0U2lnbmVkKGJyLCB2KSAqIGRxW24gPiAwXTsKLSAgICAgIGlmIChuIDwgMTUgJiYgIVZQOEdldEJpdChiciwgcFswXSkpIHsgICAvLyBFT0IKLSAgICAgICAgcmV0dXJuIG4gKyAxOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMTY7Ci19Ci0KLS8vIEFsaWFzLXNhZmUgd2F5IG9mIGNvbnZlcnRpbmcgNGJ5dGVzIHRvIDMyYml0cy4KLXR5cGVkZWYgdW5pb24gewotICB1aW50OF90ICBpOFs0XTsKLSAgdWludDMyX3QgaTMyOwotfSBQYWNrZWROejsKLQotLy8gVGFibGUgdG8gdW5wYWNrIGZvdXIgYml0cyBpbnRvIGZvdXIgYnl0ZXMKLXN0YXRpYyBjb25zdCBQYWNrZWROeiBrVW5wYWNrVGFiWzE2XSA9IHsKLSAge3swLCAwLCAwLCAwfX0sICB7ezEsIDAsIDAsIDB9fSwgIHt7MCwgMSwgMCwgMH19LCAge3sxLCAxLCAwLCAwfX0sCi0gIHt7MCwgMCwgMSwgMH19LCAge3sxLCAwLCAxLCAwfX0sICB7ezAsIDEsIDEsIDB9fSwgIHt7MSwgMSwgMSwgMH19LAotICB7ezAsIDAsIDAsIDF9fSwgIHt7MSwgMCwgMCwgMX19LCAge3swLCAxLCAwLCAxfX0sICB7ezEsIDEsIDAsIDF9fSwKLSAge3swLCAwLCAxLCAxfX0sICB7ezEsIDAsIDEsIDF9fSwgIHt7MCwgMSwgMSwgMX19LCAge3sxLCAxLCAxLCAxfX0gfTsKLQotLy8gTWFjcm8gdG8gcGFjayBmb3VyIExTQiBvZiBmb3VyIGJ5dGVzIGludG8gZm91ciBiaXRzLgotI2lmIGRlZmluZWQoX19QUENfXykgfHwgZGVmaW5lZChfTV9QUEMpIHx8IGRlZmluZWQoX0FSQ0hfUFBDKSB8fCBcCi0gICAgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSNkZWZpbmUgUEFDS19DU1QgMHgwODA0MDIwMVUKLSNlbHNlCi0jZGVmaW5lIFBBQ0tfQ1NUIDB4MDEwMjA0MDhVCi0jZW5kaWYKLSNkZWZpbmUgUEFDSyhYLCBTKSAoKCgoWCkuaTMyICogUEFDS19DU1QpICYgMHhmZjAwMDAwMCkgPj4gKFMpKQotCi1zdGF0aWMgdm9pZCBQYXJzZVJlc2lkdWFscyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNQiogY29uc3QgbWIsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKLSAgaW50IG91dF90X256LCBvdXRfbF9ueiwgZmlyc3Q7Ci0gIFByb2JhQXJyYXkgYWNfcHJvYjsKLSAgY29uc3QgVlA4UXVhbnRNYXRyaXgqIHEgPSAmZGVjLT5kcW1fW2RlYy0+c2VnbWVudF9dOwotICBpbnQxNl90KiBkc3QgPSBkZWMtPmNvZWZmc187Ci0gIFZQOE1CKiBjb25zdCBsZWZ0X21iID0gZGVjLT5tYl9pbmZvXyAtIDE7Ci0gIFBhY2tlZE56IG56X2FjLCBuel9kYzsKLSAgUGFja2VkTnogdG56LCBsbno7Ci0gIHVpbnQzMl90IG5vbl96ZXJvX2FjID0gMDsKLSAgdWludDMyX3Qgbm9uX3plcm9fZGMgPSAwOwotICBpbnQgeCwgeSwgY2g7Ci0KLSAgbnpfZGMuaTMyID0gbnpfYWMuaTMyID0gMDsKLSAgU2JNZW1vcnlTZXQoZHN0LCAwLCAzODQgKiBzaXplb2YoKmRzdCkpOwotICBpZiAoIWRlYy0+aXNfaTR4NF8pIHsgICAgLy8gcGFyc2UgREMKLSAgICBpbnQxNl90IGRjWzE2XSA9IHsgMCB9OwotICAgIGNvbnN0IGludCBjdHggPSBtYi0+ZGNfbnpfICsgbGVmdF9tYi0+ZGNfbnpfOwotICAgIG1iLT5kY19uel8gPSBsZWZ0X21iLT5kY19uel8gPQotICAgICAgICAoR2V0Q29lZmZzKHRva2VuX2JyLCAoUHJvYmFBcnJheSlkZWMtPnByb2JhXy5jb2VmZnNfWzFdLAotICAgICAgICAgICAgICAgICAgIGN0eCwgcS0+eTJfbWF0XywgMCwgZGMpID4gMCk7Ci0gICAgZmlyc3QgPSAxOwotICAgIGFjX3Byb2IgPSAoUHJvYmFBcnJheSlkZWMtPnByb2JhXy5jb2VmZnNfWzBdOwotICAgIFZQOFRyYW5zZm9ybVdIVChkYywgZHN0KTsKLSAgfSBlbHNlIHsKLSAgICBmaXJzdCA9IDA7Ci0gICAgYWNfcHJvYiA9IChQcm9iYUFycmF5KWRlYy0+cHJvYmFfLmNvZWZmc19bM107Ci0gIH0KLQotICB0bnogPSBrVW5wYWNrVGFiW21iLT5uel8gJiAweGZdOwotICBsbnogPSBrVW5wYWNrVGFiW2xlZnRfbWItPm56XyAmIDB4Zl07Ci0gIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICBpbnQgbCA9IGxuei5pOFt5XTsKLSAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgY3R4ID0gbCArIHRuei5pOFt4XTsKLSAgICAgIGNvbnN0IGludCBueiA9IEdldENvZWZmcyh0b2tlbl9iciwgYWNfcHJvYiwgY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPnkxX21hdF8sIGZpcnN0LCBkc3QpOwotICAgICAgdG56Lmk4W3hdID0gbCA9IChueiA+IDApOwotICAgICAgbnpfZGMuaThbeF0gPSAoZHN0WzBdICE9IDApOwotICAgICAgbnpfYWMuaThbeF0gPSAobnogPiAxKTsKLSAgICAgIGRzdCArPSAxNjsKLSAgICB9Ci0gICAgbG56Lmk4W3ldID0gbDsKLSAgICBub25femVyb19kYyB8PSBQQUNLKG56X2RjLCAyNCAtIHkgKiA0KTsKLSAgICBub25femVyb19hYyB8PSBQQUNLKG56X2FjLCAyNCAtIHkgKiA0KTsKLSAgfQotICBvdXRfdF9ueiA9IFBBQ0sodG56LCAyNCk7Ci0gIG91dF9sX256ID0gUEFDSyhsbnosIDI0KTsKLQotICB0bnogPSBrVW5wYWNrVGFiW21iLT5uel8gPj4gNF07Ci0gIGxueiA9IGtVbnBhY2tUYWJbbGVmdF9tYi0+bnpfID4+IDRdOwotICBmb3IgKGNoID0gMDsgY2ggPCA0OyBjaCArPSAyKSB7Ci0gICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgewotICAgICAgaW50IGwgPSBsbnouaThbY2ggKyB5XTsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGwgKyB0bnouaThbY2ggKyB4XTsKLSAgICAgICAgY29uc3QgaW50IG56ID0KLSAgICAgICAgICAgIEdldENvZWZmcyh0b2tlbl9iciwgKFByb2JhQXJyYXkpZGVjLT5wcm9iYV8uY29lZmZzX1syXSwKLSAgICAgICAgICAgICAgICAgICAgICBjdHgsIHEtPnV2X21hdF8sIDAsIGRzdCk7Ci0gICAgICAgIHRuei5pOFtjaCArIHhdID0gbCA9IChueiA+IDApOwotICAgICAgICBuel9kYy5pOFt5ICogMiArIHhdID0gKGRzdFswXSAhPSAwKTsKLSAgICAgICAgbnpfYWMuaThbeSAqIDIgKyB4XSA9IChueiA+IDEpOwotICAgICAgICBkc3QgKz0gMTY7Ci0gICAgICB9Ci0gICAgICBsbnouaThbY2ggKyB5XSA9IGw7Ci0gICAgfQotICAgIG5vbl96ZXJvX2RjIHw9IFBBQ0sobnpfZGMsIDggLSBjaCAqIDIpOwotICAgIG5vbl96ZXJvX2FjIHw9IFBBQ0sobnpfYWMsIDggLSBjaCAqIDIpOwotICB9Ci0gIG91dF90X256IHw9IFBBQ0sodG56LCAyMCk7Ci0gIG91dF9sX256IHw9IFBBQ0sobG56LCAyMCk7Ci0gIG1iLT5uel8gPSBvdXRfdF9uejsKLSAgbGVmdF9tYi0+bnpfID0gb3V0X2xfbno7Ci0KLSAgZGVjLT5ub25femVyb19hY18gPSBub25femVyb19hYzsKLSAgZGVjLT5ub25femVyb18gPSBub25femVyb19hYyB8IG5vbl96ZXJvX2RjOwotICBtYi0+c2tpcF8gPSAhZGVjLT5ub25femVyb187Ci19Ci0jdW5kZWYgUEFDSwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBsb29wCi0KLWludCBWUDhEZWNvZGVNQihWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKLSAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgVlA4TUIqIGNvbnN0IGxlZnQgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgVlA4TUIqIGNvbnN0IGluZm8gPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKLQotICAvLyBOb3RlOiB3ZSBkb24ndCBzYXZlIHNlZ21lbnQgbWFwICh5ZXQpLCBhcyB3ZSBkb24ndCBleHBlY3QKLSAgLy8gdG8gZGVjb2RlIG1vcmUgdGhhbiAxIGtleWZyYW1lLgotICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKLSAgICAvLyBIYXJkY29kZWQgdHJlZSBwYXJzaW5nCi0gICAgZGVjLT5zZWdtZW50XyA9ICFWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1swXSkgPwotICAgICAgICBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1sxXSkgOgotICAgICAgICAyICsgVlA4R2V0Qml0KGJyLCBkZWMtPnByb2JhXy5zZWdtZW50c19bMl0pOwotICB9Ci0gIGluZm8tPnNraXBfID0gZGVjLT51c2Vfc2tpcF9wcm9iYV8gPyBWUDhHZXRCaXQoYnIsIGRlYy0+c2tpcF9wXykgOiAwOwotCi0gIFZQOFBhcnNlSW50cmFNb2RlKGJyLCBkZWMpOwotICBpZiAoYnItPmVvZl8pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICghaW5mby0+c2tpcF8pIHsKLSAgICBQYXJzZVJlc2lkdWFscyhkZWMsIGluZm8sIHRva2VuX2JyKTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0LT5uel8gPSBpbmZvLT5uel8gPSAwOwotICAgIGlmICghZGVjLT5pc19pNHg0XykgewotICAgICAgbGVmdC0+ZGNfbnpfID0gaW5mby0+ZGNfbnpfID0gMDsKLSAgICB9Ci0gICAgZGVjLT5ub25femVyb18gPSAwOwotICAgIGRlYy0+bm9uX3plcm9fYWNfID0gMDsKLSAgfQotCi0gIGlmIChkZWMtPmZpbHRlcl90eXBlXyA+IDApIHsgIC8vIHN0b3JlIGZpbHRlciBpbmZvCi0gICAgVlA4RkluZm8qIGNvbnN0IGZpbmZvID0gZGVjLT5mX2luZm9fICsgZGVjLT5tYl94XzsKLSAgICAqZmluZm8gPSBkZWMtPmZzdHJlbmd0aHNfW2RlYy0+c2VnbWVudF9dW2RlYy0+aXNfaTR4NF9dOwotICAgIGZpbmZvLT5mX2lubmVyXyA9ICghaW5mby0+c2tpcF8gfHwgZGVjLT5pc19pNHg0Xyk7Ci0gIH0KLQotICByZXR1cm4gKCF0b2tlbl9ici0+ZW9mXyk7Ci19Ci0KLXZvaWQgVlA4SW5pdFNjYW5saW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOwotICBsZWZ0LT5uel8gPSAwOwotICBsZWZ0LT5kY19uel8gPSAwOwotICBTYk1lbW9yeVNldChkZWMtPmludHJhX2xfLCBCX0RDX1BSRUQsIHNpemVvZihkZWMtPmludHJhX2xfKSk7Ci0gIGRlYy0+ZmlsdGVyX3Jvd18gPQotICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApICYmCi0gICAgKGRlYy0+bWJfeV8gPj0gZGVjLT50bF9tYl95XykgJiYgKGRlYy0+bWJfeV8gPD0gZGVjLT5icl9tYl95Xyk7Ci19Ci0KLXN0YXRpYyBpbnQgUGFyc2VGcmFtZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBpbykgewotICBmb3IgKGRlYy0+bWJfeV8gPSAwOyBkZWMtPm1iX3lfIDwgZGVjLT5icl9tYl95XzsgKytkZWMtPm1iX3lfKSB7Ci0gICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9iciA9Ci0gICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgKGRlYy0+bnVtX3BhcnRzXyAtIDEpXTsKLSAgICBWUDhJbml0U2NhbmxpbmUoZGVjKTsKLSAgICBmb3IgKGRlYy0+bWJfeF8gPSAwOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgIGRlYy0+bWJfeF8rKykgewotICAgICAgaWYgKCFWUDhEZWNvZGVNQihkZWMsIHRva2VuX2JyKSkgewotICAgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kLW9mLWZpbGUgZW5jb3VudGVyZWQuIik7Ci0gICAgICB9Ci0gICAgICAvLyBSZWNvbnN0cnVjdCBhbmQgZW1pdCBzYW1wbGVzLgotICAgICAgVlA4UmVjb25zdHJ1Y3RCbG9jayhkZWMpOwotICAgIH0KLSAgICBpZiAoIVZQOFByb2Nlc3NSb3coZGVjLCBpbykpIHsKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwgIk91dHB1dCBhYm9ydGVkLiIpOwotICAgIH0KLSAgfQotICBpZiAoZGVjLT51c2VfdGhyZWFkc18gJiYgIVdlYlBXb3JrZXJTeW5jKCZkZWMtPndvcmtlcl8pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBGaW5pc2gKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIGlmICghZGVjLT51cGRhdGVfcHJvYmFfKSB7Ci0gICAgZGVjLT5wcm9iYV8gPSBkZWMtPnByb2JhX3NhdmVkXzsKLSAgfQotI2VuZGlmCi0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICBpZiAoZGVjLT5sYXllcl9kYXRhX3NpemVfID4gMCkgewotICAgIGlmICghVlA4RGVjb2RlTGF5ZXIoZGVjKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gMTsKLX0KLQotLy8gTWFpbiBlbnRyeSBwb2ludAotaW50IFZQOERlY29kZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICBpbnQgb2sgPSAwOwotICBpZiAoZGVjID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoaW8gPT0gTlVMTCkgewotICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgVlA4SW8gcGFyYW1ldGVyIGluIFZQOERlY29kZSgpLiIpOwotICB9Ci0KLSAgaWYgKCFkZWMtPnJlYWR5XykgewotICAgIGlmICghVlA4R2V0SGVhZGVycyhkZWMsIGlvKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIFNCX0RDSEVDSyhkZWMtPnJlYWR5Xyk7Ci0KLSAgLy8gRmluaXNoIHNldHRpbmcgdXAgdGhlIGRlY29kaW5nIHBhcmFtZXRlci4gV2lsbCBjYWxsIGlvLT5zZXR1cCgpLgotICBvayA9IChWUDhFbnRlckNyaXRpY2FsKGRlYywgaW8pID09IFZQOF9TVEFUVVNfT0spOwotICBpZiAob2spIHsgICAvLyBnb29kIHRvIGdvLgotICAgIC8vIFdpbGwgYWxsb2NhdGUgbWVtb3J5IGFuZCBwcmVwYXJlIGV2ZXJ5dGhpbmcuCi0gICAgaWYgKG9rKSBvayA9IFZQOEluaXRGcmFtZShkZWMsIGlvKTsKLQotICAgIC8vIE1haW4gZGVjb2RpbmcgbG9vcAotICAgIGlmIChvaykgb2sgPSBQYXJzZUZyYW1lKGRlYywgaW8pOwotCi0gICAgLy8gRXhpdC4KLSAgICBvayAmPSBWUDhFeGl0Q3JpdGljYWwoZGVjLCBpbyk7Ci0gIH0KLQotICBpZiAoIW9rKSB7Ci0gICAgVlA4Q2xlYXIoZGVjKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGRlYy0+cmVhZHlfID0gMDsKLSAgcmV0dXJuIG9rOwotfQotCi12b2lkIFZQOENsZWFyKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpZiAoZGVjID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGRlYy0+dXNlX3RocmVhZHNfKSB7Ci0gICAgV2ViUFdvcmtlckVuZCgmZGVjLT53b3JrZXJfKTsKLSAgfQotICBpZiAoZGVjLT5tZW1fKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYy0+bWVtXyk7Ci0gIH0KLSAgZGVjLT5tZW1fID0gTlVMTDsKLSAgZGVjLT5tZW1fc2l6ZV8gPSAwOwotICBTYk1lbW9yeVNldCgmZGVjLT5icl8sIDAsIHNpemVvZihkZWMtPmJyXykpOwotICBkZWMtPnJlYWR5XyA9IDA7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDI3ZjEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVlA4IGRlY29kZXI6IGludGVybmFsIGhlYWRlci4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfREVDX1ZQOElfSF8KLSNkZWZpbmUgV0VCUF9ERUNfVlA4SV9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgIC8vIGZvciBtZW1jcHkoKQotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvYml0X3JlYWRlci5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3RocmVhZC5oIgotI2luY2x1ZGUgIi4uL2RzcC9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWYXJpb3VzIGRlZmluZXMgYW5kIGVudW1zCi0KLS8vIHZlcnNpb24gbnVtYmVycwotI2RlZmluZSBERUNfTUFKX1ZFUlNJT04gMAotI2RlZmluZSBERUNfTUlOX1ZFUlNJT04gMwotI2RlZmluZSBERUNfUkVWX1ZFUlNJT04gMQotCi0jZGVmaW5lIE9OTFlfS0VZRlJBTUVfQ09ERSAgICAgIC8vIHRvIHJlbW92ZSBhbnkgY29kZSByZWxhdGVkIHRvIFAtRnJhbWVzCi0KLS8vIGludHJhIHByZWRpY3Rpb24gbW9kZXMKLWVudW0geyBCX0RDX1BSRUQgPSAwLCAgIC8vIDR4NCBtb2RlcwotICAgICAgIEJfVE1fUFJFRCwKLSAgICAgICBCX1ZFX1BSRUQsCi0gICAgICAgQl9IRV9QUkVELAotICAgICAgIEJfUkRfUFJFRCwKLSAgICAgICBCX1ZSX1BSRUQsCi0gICAgICAgQl9MRF9QUkVELAotICAgICAgIEJfVkxfUFJFRCwKLSAgICAgICBCX0hEX1BSRUQsCi0gICAgICAgQl9IVV9QUkVELAotICAgICAgIE5VTV9CTU9ERVMgPSBCX0hVX1BSRUQgKyAxIC0gQl9EQ19QUkVELCAgLy8gPSAxMAotCi0gICAgICAgLy8gTHVtYTE2IG9yIFVWIG1vZGVzCi0gICAgICAgRENfUFJFRCA9IEJfRENfUFJFRCwgVl9QUkVEID0gQl9WRV9QUkVELAotICAgICAgIEhfUFJFRCA9IEJfSEVfUFJFRCwgVE1fUFJFRCA9IEJfVE1fUFJFRCwKLSAgICAgICBCX1BSRUQgPSBOVU1fQk1PREVTLCAgIC8vIHJlZmluZWQgSTR4NCBtb2RlCi0KLSAgICAgICAvLyBzcGVjaWFsIG1vZGVzCi0gICAgICAgQl9EQ19QUkVEX05PVE9QID0gNCwKLSAgICAgICBCX0RDX1BSRURfTk9MRUZUID0gNSwKLSAgICAgICBCX0RDX1BSRURfTk9UT1BMRUZUID0gNiwKLSAgICAgICBOVU1fQl9EQ19NT0RFUyA9IDcgfTsKLQotZW51bSB7IE1CX0ZFQVRVUkVfVFJFRV9QUk9CUyA9IDMsCi0gICAgICAgTlVNX01CX1NFR01FTlRTID0gNCwKLSAgICAgICBOVU1fUkVGX0xGX0RFTFRBUyA9IDQsCi0gICAgICAgTlVNX01PREVfTEZfREVMVEFTID0gNCwgICAgLy8gSTR4NCwgWkVSTywgKiwgU1BMSVQKLSAgICAgICBNQVhfTlVNX1BBUlRJVElPTlMgPSA4LAotICAgICAgIC8vIFByb2JhYmlsaXRpZXMKLSAgICAgICBOVU1fVFlQRVMgPSA0LAotICAgICAgIE5VTV9CQU5EUyA9IDgsCi0gICAgICAgTlVNX0NUWCA9IDMsCi0gICAgICAgTlVNX1BST0JBUyA9IDExLAotICAgICAgIE5VTV9NVl9QUk9CQVMgPSAxOSB9OwotCi0vLyBZVVYtY2FjaGUgcGFyYW1ldGVycy4KLS8vIENvbnN0cmFpbnRzIGFyZTogV2UgbmVlZCB0byBzdG9yZSBvbmUgMTZ4MTYgYmxvY2sgb2YgbHVtYSBzYW1wbGVzICh5KSwKLS8vIGFuZCB0d28gOHg4IGNocm9tYSBibG9ja3MgKHUvdikuIFRoZXNlIGFyZSBiZXR0ZXIgYmUgMTYtYnl0ZXMgYWxpZ25lZCwKLS8vIGluIG9yZGVyIHRvIGJlIFNJTUQtZnJpZW5kbHkuIFdlIGFsc28gbmVlZCB0byBzdG9yZSB0aGUgdG9wLCBsZWZ0IGFuZAotLy8gdG9wLWxlZnQgc2FtcGxlcyAoZnJvbSBwcmV2aW91c2x5IGRlY29kZWQgYmxvY2tzKSwgYWxvbmcgd2l0aCBmb3VyCi0vLyBleHRyYSB0b3AtcmlnaHQgc2FtcGxlcyBmb3IgbHVtYSAoaW50cmE0eDQgcHJlZGljdGlvbiBvbmx5KS4KLS8vIE9uZSBwb3NzaWJsZSBsYXlvdXQgaXMsIHVzaW5nIDMyICogKDE3ICsgOSkgYnl0ZXM6Ci0vLwotLy8gICAuKy0tLS0tLSAgIDwtIG9ubHkgMSBwaXhlbCBoaWdoCi0vLyAgIC58eXl5eXQuCi0vLyAgIC58eXl5eXQuCi0vLyAgIC58eXl5eXQuCi0vLyAgIC58eXl5eS4uCi0vLyAgIC4rLS0uKy0tICAgPC0gb25seSAxIHBpeGVsIGhpZ2gKLS8vICAgLnx1dS58dnYKLS8vICAgLnx1dS58dnYKLS8vCi0vLyBFdmVyeSBjaGFyYWN0ZXIgaXMgYSA0eDQgYmxvY2ssIHdpdGggbGVnZW5kOgotLy8gICcuJyA9IHVudXNlZAotLy8gICd5JyA9IHktc2FtcGxlcyAgICd1JyA9IHUtc2FtcGxlcyAgICAgJ3YnID0gdS1zYW1wbGVzCi0vLyAgJ3wnID0gbGVmdCBzYW1wbGUsICAgJy0nID0gdG9wIHNhbXBsZSwgICAgJysnID0gdG9wLWxlZnQgc2FtcGxlCi0vLyAgJ3QnID0gZXh0cmEgdG9wLXJpZ2h0IHNhbXBsZSBmb3IgNHg0IG1vZGVzCi0vLyBXaXRoIHRoaXMgbGF5b3V0LCBCUFMgKD1CeXRlcyBQZXIgU2Nhbi1saW5lKSBpcyBvbmUgY2FjaGVsaW5lIHNpemUuCi0jZGVmaW5lIEJQUyAgICAgICAzMiAgICAvLyB0aGlzIGlzIHRoZSBjb21tb24gc3RyaWRlIHVzZWQgYnkgeXV2W10KLSNkZWZpbmUgWVVWX1NJWkUgKEJQUyAqIDE3ICsgQlBTICogOSkKLSNkZWZpbmUgWV9TSVpFICAgKEJQUyAqIDE3KQotI2RlZmluZSBZX09GRiAgICAoQlBTICogMSArIDgpCi0jZGVmaW5lIFVfT0ZGICAgIChZX09GRiArIEJQUyAqIDE2ICsgQlBTKQotI2RlZmluZSBWX09GRiAgICAoVV9PRkYgKyAxNikKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlYWRlcnMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGtleV9mcmFtZV87Ci0gIHVpbnQ4X3QgcHJvZmlsZV87Ci0gIHVpbnQ4X3Qgc2hvd187Ci0gIHVpbnQzMl90IHBhcnRpdGlvbl9sZW5ndGhfOwotfSBWUDhGcmFtZUhlYWRlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCB3aWR0aF87Ci0gIHVpbnQxNl90IGhlaWdodF87Ci0gIHVpbnQ4X3QgeHNjYWxlXzsKLSAgdWludDhfdCB5c2NhbGVfOwotICB1aW50OF90IGNvbG9yc3BhY2VfOyAgIC8vIDAgPSBZQ2JDcgotICB1aW50OF90IGNsYW1wX3R5cGVfOwotfSBWUDhQaWN0dXJlSGVhZGVyOwotCi0vLyBzZWdtZW50IGZlYXR1cmVzCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB1c2Vfc2VnbWVudF87Ci0gIGludCB1cGRhdGVfbWFwXzsgICAgICAgIC8vIHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBzZWdtZW50IG1hcCBvciBub3QKLSAgaW50IGFic29sdXRlX2RlbHRhXzsgICAgLy8gYWJzb2x1dGUgb3IgZGVsdGEgdmFsdWVzIGZvciBxdWFudGl6ZXIgYW5kIGZpbHRlcgotICBpbnQ4X3QgcXVhbnRpemVyX1tOVU1fTUJfU0VHTUVOVFNdOyAgICAgICAgLy8gcXVhbnRpemF0aW9uIGNoYW5nZXMKLSAgaW50OF90IGZpbHRlcl9zdHJlbmd0aF9bTlVNX01CX1NFR01FTlRTXTsgIC8vIGZpbHRlciBzdHJlbmd0aCBmb3Igc2VnbWVudHMKLX0gVlA4U2VnbWVudEhlYWRlcjsKLQotLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZWdtZW50c19bTUJfRkVBVFVSRV9UUkVFX1BST0JTXTsKLSAgLy8gVHlwZTogMDpJbnRyYTE2LUFDICAxOkludHJhMTYtREMgICAyOkNocm9tYSAgIDM6SW50cmE0Ci0gIHVpbnQ4X3QgY29lZmZzX1tOVU1fVFlQRVNdW05VTV9CQU5EU11bTlVNX0NUWF1bTlVNX1BST0JBU107Ci0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotICB1aW50OF90IHltb2RlX1s0XSwgdXZtb2RlX1szXTsKLSAgdWludDhfdCBtdl9bMl1bTlVNX01WX1BST0JBU107Ci0jZW5kaWYKLX0gVlA4UHJvYmE7Ci0KLS8vIEZpbHRlciBwYXJhbWV0ZXJzCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBzaW1wbGVfOyAgICAgICAgICAgICAgICAgIC8vIDA9Y29tcGxleCwgMT1zaW1wbGUKLSAgaW50IGxldmVsXzsgICAgICAgICAgICAgICAgICAgLy8gWzAuLjYzXQotICBpbnQgc2hhcnBuZXNzXzsgICAgICAgICAgICAgICAvLyBbMC4uN10KLSAgaW50IHVzZV9sZl9kZWx0YV87Ci0gIGludCByZWZfbGZfZGVsdGFfW05VTV9SRUZfTEZfREVMVEFTXTsKLSAgaW50IG1vZGVfbGZfZGVsdGFfW05VTV9NT0RFX0xGX0RFTFRBU107Ci19IFZQOEZpbHRlckhlYWRlcjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEluZm9ybWF0aW9ucyBhYm91dCB0aGUgbWFjcm9ibG9ja3MuCi0KLXR5cGVkZWYgc3RydWN0IHsgIC8vIGZpbHRlciBzcGVjcwotICB1bnNpZ25lZCBpbnQgZl9sZXZlbF86NjsgICAgICAvLyBmaWx0ZXIgc3RyZW5ndGg6IDAuLjYzCi0gIHVuc2lnbmVkIGludCBmX2lsZXZlbF86NjsgICAgIC8vIGlubmVyIGxpbWl0OiAxLi42MwotICB1bnNpZ25lZCBpbnQgZl9pbm5lcl86MTsgICAgICAvLyBkbyBpbm5lciBmaWx0ZXJpbmc/Ci19IFZQOEZJbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7ICAvLyB1c2VkIGZvciBzeW50YXgtcGFyc2luZwotICB1bnNpZ25lZCBpbnQgbnpfOjI0OyAgICAgICAvLyBub24temVybyBBQy9EQyBjb2VmZnMgKDI0Yml0KQotICB1bnNpZ25lZCBpbnQgZGNfbnpfOjE7ICAgICAvLyBub24temVybyBEQyBjb2VmZnMKLSAgdW5zaWduZWQgaW50IHNraXBfOjE7ICAgICAgLy8gYmxvY2sgdHlwZQotfSBWUDhNQjsKLQotLy8gRGVxdWFudGl6YXRpb24gbWF0cmljZXMKLXR5cGVkZWYgaW50IHF1YW50X3RbMl07ICAgICAgLy8gW0RDIC8gQUNdLiAgQ2FuIGJlICd1aW50MTZfdFsyXScgdG9vICh+c2xvd2VyKS4KLXR5cGVkZWYgc3RydWN0IHsKLSAgcXVhbnRfdCB5MV9tYXRfLCB5Ml9tYXRfLCB1dl9tYXRfOwotfSBWUDhRdWFudE1hdHJpeDsKLQotLy8gUGVyc2lzdGVudCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIHBhcmFsbGVsIHByb2Nlc3NpbmcKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGlkXzsgICAgICAgICAgICAvLyBjYWNoZSByb3cgdG8gcHJvY2VzcyAoaW4gWzAuLjJdKQotICBpbnQgbWJfeV87ICAgICAgICAgIC8vIG1hY3JvYmxvY2sgcG9zaXRpb24gb2YgdGhlIHJvdwotICBpbnQgZmlsdGVyX3Jvd187ICAgIC8vIHRydWUgaWYgcm93LWZpbHRlcmluZyBpcyBuZWVkZWQKLSAgVlA4RkluZm8qIGZfaW5mb187ICAvLyBmaWx0ZXIgc3RyZW5ndGhzCi0gIFZQOElvIGlvXzsgICAgICAgICAgLy8gY29weSBvZiB0aGUgVlA4SW8gdG8gcGFzcyB0byBwdXQoKQotfSBWUDhUaHJlYWRDb250ZXh0OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4RGVjb2RlcjogdGhlIG1haW4gb3BhcXVlIHN0cnVjdHVyZSBoYW5kZWQgb3ZlciB0byB1c2VyCi0KLXN0cnVjdCBWUDhEZWNvZGVyIHsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXNfOwotICBpbnQgcmVhZHlfOyAgICAgLy8gdHJ1ZSBpZiByZWFkeSB0byBkZWNvZGUgYSBwaWN0dXJlIHdpdGggVlA4RGVjb2RlKCkKLSAgY29uc3QgY2hhciogZXJyb3JfbXNnXzsgIC8vIHNldCB3aGVuIHN0YXR1c18gaXMgbm90IE9LLgotCi0gIC8vIE1haW4gZGF0YSBzb3VyY2UKLSAgVlA4Qml0UmVhZGVyIGJyXzsKLQotICAvLyBoZWFkZXJzCi0gIFZQOEZyYW1lSGVhZGVyICAgZnJtX2hkcl87Ci0gIFZQOFBpY3R1cmVIZWFkZXIgcGljX2hkcl87Ci0gIFZQOEZpbHRlckhlYWRlciAgZmlsdGVyX2hkcl87Ci0gIFZQOFNlZ21lbnRIZWFkZXIgc2VnbWVudF9oZHJfOwotCi0gIC8vIFdvcmtlcgotICBXZWJQV29ya2VyIHdvcmtlcl87Ci0gIGludCB1c2VfdGhyZWFkc187ICAgIC8vIHVzZSBtdWx0aS10aHJlYWQKLSAgaW50IGNhY2hlX2lkXzsgICAgICAgLy8gY3VycmVudCBjYWNoZSByb3cKLSAgaW50IG51bV9jYWNoZXNfOyAgICAgLy8gbnVtYmVyIG9mIGNhY2hlZCByb3dzIG9mIDE2IHBpeGVscyAoMSwgMiBvciAzKQotICBWUDhUaHJlYWRDb250ZXh0IHRocmVhZF9jdHhfOyAgLy8gVGhyZWFkIGNvbnRleHQKLQotICAvLyBkaW1lbnNpb24sIGluIG1hY3JvYmxvY2sgdW5pdHMuCi0gIGludCBtYl93XywgbWJfaF87Ci0KLSAgLy8gTWFjcm9ibG9jayB0byBwcm9jZXNzL2ZpbHRlciwgZGVwZW5kaW5nIG9uIGNyb3BwaW5nIGFuZCBmaWx0ZXJfdHlwZS4KLSAgaW50IHRsX21iX3hfLCB0bF9tYl95XzsgIC8vIHRvcC1sZWZ0IE1CIHRoYXQgbXVzdCBiZSBpbi1sb29wIGZpbHRlcmVkCi0gIGludCBicl9tYl94XywgYnJfbWJfeV87ICAvLyBsYXN0IGJvdHRvbS1yaWdodCBNQiB0aGF0IG11c3QgYmUgZGVjb2RlZAotCi0gIC8vIG51bWJlciBvZiBwYXJ0aXRpb25zLgotICBpbnQgbnVtX3BhcnRzXzsKLSAgLy8gcGVyLXBhcnRpdGlvbiBib29sZWFuIGRlY29kZXJzLgotICBWUDhCaXRSZWFkZXIgcGFydHNfW01BWF9OVU1fUEFSVElUSU9OU107Ci0KLSAgLy8gYnVmZmVyIHJlZnJlc2ggZmxhZ3MKLSAgLy8gICBiaXQgMDogcmVmcmVzaCBHb2xkLCBiaXQgMTogcmVmcmVzaCBBbHQKLSAgLy8gICBiaXQgMi0zOiBjb3B5IHRvIEdvbGQsIGJpdCA0LTU6IGNvcHkgdG8gQWx0Ci0gIC8vICAgYml0IDY6IEdvbGQgc2lnbiBiaWFzLCBiaXQgNzogQWx0IHNpZ24gYmlhcwotICAvLyAgIGJpdCA4OiByZWZyZXNoIGxhc3QgZnJhbWUKLSAgdWludDMyX3QgYnVmZmVyX2ZsYWdzXzsKLQotICAvLyBkZXF1YW50aXphdGlvbiAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKLSAgVlA4UXVhbnRNYXRyaXggZHFtX1tOVU1fTUJfU0VHTUVOVFNdOwotCi0gIC8vIHByb2JhYmlsaXRpZXMKLSAgVlA4UHJvYmEgcHJvYmFfOwotICBpbnQgdXNlX3NraXBfcHJvYmFfOwotICB1aW50OF90IHNraXBfcF87Ci0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotICB1aW50OF90IGludHJhX3BfLCBsYXN0X3BfLCBnb2xkZW5fcF87Ci0gIFZQOFByb2JhIHByb2JhX3NhdmVkXzsKLSAgaW50IHVwZGF0ZV9wcm9iYV87Ci0jZW5kaWYKLQotICAvLyBCb3VuZGFyeSBkYXRhIGNhY2hlIGFuZCBwZXJzaXN0ZW50IGJ1ZmZlcnMuCi0gIHVpbnQ4X3QqIGludHJhX3RfOyAgICAgLy8gdG9wIGludHJhIG1vZGVzIHZhbHVlczogNCAqIG1iX3dfCi0gIHVpbnQ4X3QgIGludHJhX2xfWzRdOyAgLy8gbGVmdCBpbnRyYSBtb2RlcyB2YWx1ZXMKLSAgdWludDhfdCogeV90XzsgICAgICAgICAvLyB0b3AgbHVtYSBzYW1wbGVzOiAxNiAqIG1iX3dfCi0gIHVpbnQ4X3QqIHVfdF8sICp2X3RfOyAgLy8gdG9wIHUvdiBzYW1wbGVzOiA4ICogbWJfd18gZWFjaAotCi0gIFZQOE1CKiBtYl9pbmZvXzsgICAgICAgLy8gY29udGV4dHVhbCBtYWNyb2Jsb2NrIGluZm8gKG1iX3dfICsgMSkKLSAgVlA4RkluZm8qIGZfaW5mb187ICAgICAvLyBmaWx0ZXIgc3RyZW5ndGggaW5mbwotICB1aW50OF90KiB5dXZfYl87ICAgICAgIC8vIG1haW4gYmxvY2sgZm9yIFkvVS9WIChzaXplID0gWVVWX1NJWkUpCi0gIGludDE2X3QqIGNvZWZmc187ICAgICAgLy8gMzg0IGNvZWZmcyA9ICgxNis4KzgpICogNCo0Ci0KLSAgdWludDhfdCogY2FjaGVfeV87ICAgICAvLyBtYWNyb2Jsb2NrIHJvdyBmb3Igc3RvcmluZyB1bmZpbHRlcmVkIHNhbXBsZXMKLSAgdWludDhfdCogY2FjaGVfdV87Ci0gIHVpbnQ4X3QqIGNhY2hlX3ZfOwotICBpbnQgY2FjaGVfeV9zdHJpZGVfOwotICBpbnQgY2FjaGVfdXZfc3RyaWRlXzsKLQotICAvLyBtYWluIG1lbW9yeSBjaHVuayBmb3IgdGhlIGFib3ZlIGRhdGEuIFBlcnNpc3RlbnQuCi0gIHZvaWQqIG1lbV87Ci0gIHNpemVfdCBtZW1fc2l6ZV87Ci0KLSAgLy8gUGVyIG1hY3JvYmxvY2sgbm9uLXBlcnNpc3RlbnQgaW5mb3MuCi0gIGludCBtYl94XywgbWJfeV87ICAgICAgIC8vIGN1cnJlbnQgcG9zaXRpb24sIGluIG1hY3JvYmxvY2sgdW5pdHMKLSAgdWludDhfdCBpc19pNHg0XzsgICAgICAgLy8gdHJ1ZSBpZiBpbnRyYTR4NAotICB1aW50OF90IGltb2Rlc19bMTZdOyAgICAvLyBvbmUgMTZ4MTYgbW9kZSAoIzApIG9yIHNpeHRlZW4gNHg0IG1vZGVzCi0gIHVpbnQ4X3QgdXZtb2RlXzsgICAgICAgIC8vIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUKLSAgdWludDhfdCBzZWdtZW50XzsgICAgICAgLy8gYmxvY2sncyBzZWdtZW50Ci0KLSAgLy8gYml0LXdpc2UgaW5mbyBhYm91dCB0aGUgY29udGVudCBvZiBlYWNoIHN1Yi00eDQgYmxvY2tzOiB0aGVyZSBhcmUgMTYgYml0cwotICAvLyBmb3IgbHVtYSAoYml0cyAjMC0+IzE1KSwgdGhlbiA0IGJpdHMgZm9yIGNocm9tYS11ICgjMTYtPiMxOSkgYW5kIDQgYml0cyBmb3IKLSAgLy8gY2hyb21hLXYgKCMyMC0+IzIzKSwgZWFjaCBjb3JyZXNwb25kaW5nIHRvIG9uZSA0eDQgYmxvY2sgaW4gZGVjb2Rpbmcgb3JkZXIuCi0gIC8vIElmIHRoZSBiaXQgaXMgc2V0LCB0aGUgNHg0IGJsb2NrIGNvbnRhaW5zIHNvbWUgbm9uLXplcm8gY29lZmZpY2llbnRzLgotICB1aW50MzJfdCBub25femVyb187Ci0gIHVpbnQzMl90IG5vbl96ZXJvX2FjXzsKLQotICAvLyBGaWx0ZXJpbmcgc2lkZS1pbmZvCi0gIGludCBmaWx0ZXJfdHlwZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwPW9mZiwgMT1zaW1wbGUsIDI9Y29tcGxleAotICBpbnQgZmlsdGVyX3Jvd187ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJvdyBmbGFnCi0gIFZQOEZJbmZvIGZzdHJlbmd0aHNfW05VTV9NQl9TRUdNRU5UU11bMl07ICAvLyBwcmVjYWxjdWxhdGVkIHBlci1zZWdtZW50L3R5cGUKLQotICAvLyBleHRlbnNpb25zCi0gIGNvbnN0IHVpbnQ4X3QqIGFscGhhX2RhdGFfOyAgIC8vIGNvbXByZXNzZWQgYWxwaGEgZGF0YSAoaWYgcHJlc2VudCkKLSAgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZV87Ci0gIGludCBpc19hbHBoYV9kZWNvZGVkXzsgIC8vIHRydWUgaWYgYWxwaGFfZGF0YV8gaXMgZGVjb2RlZCBpbiBhbHBoYV9wbGFuZV8KLSAgdWludDhfdCogYWxwaGFfcGxhbmVfOyAgICAgICAgLy8gb3V0cHV0LiBQZXJzaXN0ZW50LCBjb250YWlucyB0aGUgd2hvbGUgZGF0YS4KLQotICBpbnQgbGF5ZXJfY29sb3JzcGFjZV87Ci0gIGNvbnN0IHVpbnQ4X3QqIGxheWVyX2RhdGFfOyAgIC8vIGNvbXByZXNzZWQgbGF5ZXIgZGF0YSAoaWYgcHJlc2VudCkKLSAgc2l6ZV90IGxheWVyX2RhdGFfc2l6ZV87Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgotCi0vLyBpbiB2cDguYwotaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpOwotCi0vLyBpbiB0cmVlLmMKLXZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpOwotdm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci12b2lkIFZQOFBhcnNlSW50cmFNb2RlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpOwotCi0vLyBpbiBxdWFudC5jCi12b2lkIFZQOFBhcnNlUXVhbnQoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8gaW4gZnJhbWUuYwotaW50IFZQOEluaXRGcmFtZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBpbyk7Ci0vLyBQcmVkaWN0IGEgYmxvY2sgYW5kIGFkZCByZXNpZHVhbAotdm9pZCBWUDhSZWNvbnN0cnVjdEJsb2NrKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0vLyBDYWxsIGlvLT5zZXR1cCgpIGFuZCBmaW5pc2ggc2V0dGluZyB1cCBzY2FuIHBhcmFtZXRlcnMuCi0vLyBBZnRlciB0aGlzIGNhbGwgcmV0dXJucywgb25lIG11c3QgYWx3YXlzIGNhbGwgVlA4RXhpdENyaXRpY2FsKCkgd2l0aCB0aGUKLS8vIHNhbWUgcGFyYW1ldGVycy4gQm90aCBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW4gcGFpci4gUmV0dXJucyBWUDhfU1RBVFVTX09LCi0vLyBpZiBvaywgb3RoZXJ3aXNlIHNldHMgYW5kIHJldHVybnMgdGhlIGVycm9yIHN0YXR1cyBvbiAqZGVjLgotVlA4U3RhdHVzQ29kZSBWUDhFbnRlckNyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLS8vIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBpbiBwYWlyIHdpdGggVlA4RW50ZXJDcml0aWNhbCgpLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotaW50IFZQOEV4aXRDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7Ci0vLyBQcm9jZXNzIHRoZSBsYXN0IGRlY29kZWQgcm93IChmaWx0ZXJpbmcgKyBvdXRwdXQpCi1pbnQgVlA4UHJvY2Vzc1JvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7Ci0vLyBUbyBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHNjYW5saW5lLCB0byBpbml0aWFsaXplIHByZWRpY3RvcnMuCi12b2lkIFZQOEluaXRTY2FubGluZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOwotLy8gRGVjb2RlIG9uZSBtYWNyb2Jsb2NrLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YS4KLWludCBWUDhEZWNvZGVNQihWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpOwotCi0vLyBpbiBhbHBoYS5jCi1jb25zdCB1aW50OF90KiBWUDhEZWNvbXByZXNzQWxwaGFSb3dzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKTsKLQotLy8gaW4gbGF5ZXIuYwotaW50IFZQOERlY29kZUxheWVyKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfREVDX1ZQOElfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VhOWUyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBtYWluIGVudHJ5IGZvciB0aGUgZGVjb2RlcgotLy8KLS8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi9kc3AvbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi9kc3AveXV2LmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvaHVmZm1hbi5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE5VTV9BUkdCX0NBQ0hFX1JPV1MgICAgICAgICAgMTYKLQotc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aExpdGVyYWxzID0gMTY7Ci1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSA9IDE2Owotc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aEV4dHJhQml0c1szXSA9IHsgMiwgMywgNyB9Owotc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbM10gPSB7IDMsIDMsIDExIH07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRml2ZSBIdWZmbWFuIGNvZGVzIGFyZSB1c2VkIGF0IGVhY2ggbWV0YSBjb2RlOgotLy8gIDEuIGdyZWVuICsgbGVuZ3RoIHByZWZpeCBjb2RlcyArIGNvbG9yIGNhY2hlIGNvZGVzLAotLy8gIDIuIGFscGhhLAotLy8gIDMuIHJlZCwKLS8vICA0LiBibHVlLCBhbmQsCi0vLyAgNS4gZGlzdGFuY2UgcHJlZml4IGNvZGVzLgotdHlwZWRlZiBlbnVtIHsKLSAgR1JFRU4gPSAwLAotICBSRUQgICA9IDEsCi0gIEJMVUUgID0gMiwKLSAgQUxQSEEgPSAzLAotICBESVNUICA9IDQKLX0gSHVmZkluZGV4OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0FscGhhYmV0U2l6ZVtIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdID0gewotICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsCi0gIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsCi0gIE5VTV9ESVNUQU5DRV9DT0RFUwotfTsKLQotCi0jZGVmaW5lIE5VTV9DT0RFX0xFTkdUSF9DT0RFUyAgICAgICAxOQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NvZGVMZW5ndGhDb2RlT3JkZXJbTlVNX0NPREVfTEVOR1RIX0NPREVTXSA9IHsKLSAgMTcsIDE4LCAwLCAxLCAyLCAzLCA0LCA1LCAxNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQotfTsKLQotI2RlZmluZSBDT0RFX1RPX1BMQU5FX0NPREVTICAgICAgICAxMjAKLXN0YXRpYyBjb25zdCB1aW50OF90IGNvZGVfdG9fcGxhbmVfbHV0W0NPREVfVE9fUExBTkVfQ09ERVNdID0gewotICAweDE4LCAweDA3LCAweDE3LCAweDE5LCAweDI4LCAweDA2LCAweDI3LCAweDI5LCAweDE2LCAweDFhLAotICAweDI2LCAweDJhLCAweDM4LCAweDA1LCAweDM3LCAweDM5LCAweDE1LCAweDFiLCAweDM2LCAweDNhLAotICAweDI1LCAweDJiLCAweDQ4LCAweDA0LCAweDQ3LCAweDQ5LCAweDE0LCAweDFjLCAweDM1LCAweDNiLAotICAweDQ2LCAweDRhLCAweDI0LCAweDJjLCAweDU4LCAweDQ1LCAweDRiLCAweDM0LCAweDNjLCAweDAzLAotICAweDU3LCAweDU5LCAweDEzLCAweDFkLCAweDU2LCAweDVhLCAweDIzLCAweDJkLCAweDQ0LCAweDRjLAotICAweDU1LCAweDViLCAweDMzLCAweDNkLCAweDY4LCAweDAyLCAweDY3LCAweDY5LCAweDEyLCAweDFlLAotICAweDY2LCAweDZhLCAweDIyLCAweDJlLCAweDU0LCAweDVjLCAweDQzLCAweDRkLCAweDY1LCAweDZiLAotICAweDMyLCAweDNlLCAweDc4LCAweDAxLCAweDc3LCAweDc5LCAweDUzLCAweDVkLCAweDExLCAweDFmLAotICAweDY0LCAweDZjLCAweDQyLCAweDRlLCAweDc2LCAweDdhLCAweDIxLCAweDJmLCAweDc1LCAweDdiLAotICAweDMxLCAweDNmLCAweDYzLCAweDZkLCAweDUyLCAweDVlLCAweDAwLCAweDc0LCAweDdjLCAweDQxLAotICAweDRmLCAweDEwLCAweDIwLCAweDYyLCAweDZlLCAweDMwLCAweDczLCAweDdkLCAweDUxLCAweDVmLAotICAweDQwLCAweDcyLCAweDdlLCAweDYxLCAweDZmLCAweDUwLCAweDcxLCAweDdmLCAweDYwLCAweDcwCi19OwotCi1zdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhMQ2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIChzaXplID49IDEpICYmIChkYXRhWzBdID09IFZQOExfTUFHSUNfQllURSk7Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZEltYWdlSW5mbyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc19hbHBoYSkgewotICBjb25zdCB1aW50OF90IHNpZ25hdHVyZSA9IFZQOExSZWFkQml0cyhiciwgOCk7Ci0gIGlmICghVlA4TENoZWNrU2lnbmF0dXJlKCZzaWduYXR1cmUsIDEpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKndpZHRoID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOwotICAqaGVpZ2h0ID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOwotICAqaGFzX2FscGhhID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKLSAgVlA4TFJlYWRCaXRzKGJyLCBWUDhMX1ZFUlNJT05fQklUUyk7ICAvLyBSZWFkL2lnbm9yZSB0aGUgdmVyc2lvbiBudW1iZXIuCi0gIHJldHVybiAxOwotfQotCi1pbnQgVlA4TEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwgaW50KiBjb25zdCBoYXNfYWxwaGEpIHsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhCi0gIH0gZWxzZSB7Ci0gICAgaW50IHcsIGgsIGE7Ci0gICAgVlA4TEJpdFJlYWRlciBicjsKLSAgICBWUDhMSW5pdEJpdFJlYWRlcigmYnIsIGRhdGEsIGRhdGFfc2l6ZSk7Ci0gICAgaWYgKCFSZWFkSW1hZ2VJbmZvKCZiciwgJncsICZoLCAmYSkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gdzsKLSAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBoOwotICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgKmhhc19hbHBoYSA9IGE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRDb3B5RGlzdGFuY2UoaW50IGRpc3RhbmNlX3N5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIGludCBleHRyYV9iaXRzLCBvZmZzZXQ7Ci0gIGlmIChkaXN0YW5jZV9zeW1ib2wgPCA0KSB7Ci0gICAgcmV0dXJuIGRpc3RhbmNlX3N5bWJvbCArIDE7Ci0gIH0KLSAgZXh0cmFfYml0cyA9IChkaXN0YW5jZV9zeW1ib2wgLSAyKSA+PiAxOwotICBvZmZzZXQgPSAoMiArIChkaXN0YW5jZV9zeW1ib2wgJiAxKSkgPDwgZXh0cmFfYml0czsKLSAgcmV0dXJuIG9mZnNldCArIFZQOExSZWFkQml0cyhiciwgZXh0cmFfYml0cykgKyAxOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldENvcHlMZW5ndGgoaW50IGxlbmd0aF9zeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgLy8gTGVuZ3RoIGFuZCBkaXN0YW5jZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkuCi0gIHJldHVybiBHZXRDb3B5RGlzdGFuY2UobGVuZ3RoX3N5bWJvbCwgYnIpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBsYW5lQ29kZVRvRGlzdGFuY2UoaW50IHhzaXplLCBpbnQgcGxhbmVfY29kZSkgewotICBpZiAocGxhbmVfY29kZSA+IENPREVfVE9fUExBTkVfQ09ERVMpIHsKLSAgICByZXR1cm4gcGxhbmVfY29kZSAtIENPREVfVE9fUExBTkVfQ09ERVM7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgaW50IGRpc3RfY29kZSA9IGNvZGVfdG9fcGxhbmVfbHV0W3BsYW5lX2NvZGUgLSAxXTsKLSAgICBjb25zdCBpbnQgeW9mZnNldCA9IGRpc3RfY29kZSA+PiA0OwotICAgIGNvbnN0IGludCB4b2Zmc2V0ID0gOCAtIChkaXN0X2NvZGUgJiAweGYpOwotICAgIGNvbnN0IGludCBkaXN0ID0geW9mZnNldCAqIHhzaXplICsgeG9mZnNldDsKLSAgICByZXR1cm4gKGRpc3QgPj0gMSkgPyBkaXN0IDogMTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVjb2RlcyB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgZnJvbSBiaXQtc3RyZWFtLgotLy8gRmlsbEJpdFdpbmRvdyhicikgbmVlZHMgdG8gYmUgY2FsbGVkIGF0IG1pbmltdW0gZXZlcnkgc2Vjb25kIGNhbGwKLS8vIHRvIFJlYWRTeW1ib2wsIGluIG9yZGVyIHRvIHByZS1mZXRjaCBlbm91Z2ggYml0cy4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUmVhZFN5bWJvbChjb25zdCBIdWZmbWFuVHJlZSogdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgewotICBjb25zdCBIdWZmbWFuVHJlZU5vZGUqIG5vZGUgPSB0cmVlLT5yb290XzsKLSAgaW50IG51bV9iaXRzID0gMDsKLSAgdWludDMyX3QgYml0cyA9IFZQOExQcmVmZXRjaEJpdHMoYnIpOwotICBTQl9EQ0hFQ0sobm9kZSAhPSBOVUxMKTsKLSAgd2hpbGUgKCFIdWZmbWFuVHJlZU5vZGVJc0xlYWYobm9kZSkpIHsKLSAgICBub2RlID0gSHVmZm1hblRyZWVOZXh0Tm9kZShub2RlLCBiaXRzICYgMSk7Ci0gICAgYml0cyA+Pj0gMTsKLSAgICArK251bV9iaXRzOwotICB9Ci0gIFZQOExEaXNjYXJkQml0cyhiciwgbnVtX2JpdHMpOwotICByZXR1cm4gbm9kZS0+c3ltYm9sXzsKLX0KLQotc3RhdGljIGludCBSZWFkSHVmZm1hbkNvZGVMZW5ndGhzKAotICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAotICAgIGludCBudW1fc3ltYm9scywgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMpIHsKLSAgaW50IG9rID0gMDsKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIGludCBzeW1ib2w7Ci0gIGludCBtYXhfc3ltYm9sOwotICBpbnQgcHJldl9jb2RlX2xlbiA9IERFRkFVTFRfQ09ERV9MRU5HVEg7Ci0gIEh1ZmZtYW5UcmVlIHRyZWU7Ci0KLSAgaWYgKCFIdWZmbWFuVHJlZUJ1aWxkSW1wbGljaXQoJnRyZWUsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0NPREVfTEVOR1RIX0NPREVTKSkgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKFZQOExSZWFkQml0cyhiciwgMSkpIHsgICAgLy8gdXNlIGxlbmd0aAotICAgIGNvbnN0IGludCBsZW5ndGhfbmJpdHMgPSAyICsgMiAqIFZQOExSZWFkQml0cyhiciwgMyk7Ci0gICAgbWF4X3N5bWJvbCA9IDIgKyBWUDhMUmVhZEJpdHMoYnIsIGxlbmd0aF9uYml0cyk7Ci0gICAgaWYgKG1heF9zeW1ib2wgPiBudW1fc3ltYm9scykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbWF4X3N5bWJvbCA9IG51bV9zeW1ib2xzOwotICB9Ci0KLSAgc3ltYm9sID0gMDsKLSAgd2hpbGUgKHN5bWJvbCA8IG51bV9zeW1ib2xzKSB7Ci0gICAgaW50IGNvZGVfbGVuOwotICAgIGlmIChtYXhfc3ltYm9sLS0gPT0gMCkgYnJlYWs7Ci0gICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOwotICAgIGNvZGVfbGVuID0gUmVhZFN5bWJvbCgmdHJlZSwgYnIpOwotICAgIGlmIChjb2RlX2xlbiA8IGtDb2RlTGVuZ3RoTGl0ZXJhbHMpIHsKLSAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBjb2RlX2xlbjsKLSAgICAgIGlmIChjb2RlX2xlbiAhPSAwKSBwcmV2X2NvZGVfbGVuID0gY29kZV9sZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IGludCB1c2VfcHJldiA9IChjb2RlX2xlbiA9PSBrQ29kZUxlbmd0aFJlcGVhdENvZGUpOwotICAgICAgY29uc3QgaW50IHNsb3QgPSBjb2RlX2xlbiAtIGtDb2RlTGVuZ3RoTGl0ZXJhbHM7Ci0gICAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IGtDb2RlTGVuZ3RoRXh0cmFCaXRzW3Nsb3RdOwotICAgICAgY29uc3QgaW50IHJlcGVhdF9vZmZzZXQgPSBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbc2xvdF07Ci0gICAgICBpbnQgcmVwZWF0ID0gVlA4TFJlYWRCaXRzKGJyLCBleHRyYV9iaXRzKSArIHJlcGVhdF9vZmZzZXQ7Ci0gICAgICBpZiAoc3ltYm9sICsgcmVwZWF0ID4gbnVtX3N5bWJvbHMpIHsKLSAgICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICAgIGdvdG8gRW5kOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgaW50IGxlbmd0aCA9IHVzZV9wcmV2ID8gcHJldl9jb2RlX2xlbiA6IDA7Ci0gICAgICAgIHdoaWxlIChyZXBlYXQtLSA+IDApIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIG9rID0gMTsKLQotIEVuZDoKLSAgSHVmZm1hblRyZWVSZWxlYXNlKCZ0cmVlKTsKLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZShpbnQgYWxwaGFiZXRfc2l6ZSwgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlKSB7Ci0gIGludCBvayA9IDA7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBjb25zdCBpbnQgc2ltcGxlX2NvZGUgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOwotCi0gIGlmIChzaW1wbGVfY29kZSkgeyAgLy8gUmVhZCBzeW1ib2xzLCBjb2RlcyAmIGNvZGUgbGVuZ3RocyBkaXJlY3RseS4KLSAgICBpbnQgc3ltYm9sc1syXTsKLSAgICBpbnQgY29kZXNbMl07Ci0gICAgaW50IGNvZGVfbGVuZ3Roc1syXTsKLSAgICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPSBWUDhMUmVhZEJpdHMoYnIsIDEpICsgMTsKLSAgICBjb25zdCBpbnQgZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKLSAgICAvLyBUaGUgZmlyc3QgY29kZSBpcyBlaXRoZXIgMSBiaXQgb3IgOCBiaXQgY29kZS4KLSAgICBzeW1ib2xzWzBdID0gVlA4TFJlYWRCaXRzKGJyLCAoZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID09IDApID8gMSA6IDgpOwotICAgIGNvZGVzWzBdID0gMDsKLSAgICBjb2RlX2xlbmd0aHNbMF0gPSBudW1fc3ltYm9scyAtIDE7Ci0gICAgLy8gVGhlIHNlY29uZCBjb2RlIChpZiBwcmVzZW50KSwgaXMgYWx3YXlzIDggYml0IGxvbmcuCi0gICAgaWYgKG51bV9zeW1ib2xzID09IDIpIHsKLSAgICAgIHN5bWJvbHNbMV0gPSBWUDhMUmVhZEJpdHMoYnIsIDgpOwotICAgICAgY29kZXNbMV0gPSAxOwotICAgICAgY29kZV9sZW5ndGhzWzFdID0gbnVtX3N5bWJvbHMgLSAxOwotICAgIH0KLSAgICBvayA9IEh1ZmZtYW5UcmVlQnVpbGRFeHBsaWNpdCh0cmVlLCBjb2RlX2xlbmd0aHMsIGNvZGVzLCBzeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhYmV0X3NpemUsIG51bV9zeW1ib2xzKTsKLSAgfSBlbHNlIHsgIC8vIERlY29kZSBIdWZmbWFuLWNvZGVkIGNvZGUgbGVuZ3Rocy4KLSAgICBpbnQqIGNvZGVfbGVuZ3RocyA9IE5VTEw7Ci0gICAgaW50IGk7Ci0gICAgaW50IGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1tOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07Ci0gICAgY29uc3QgaW50IG51bV9jb2RlcyA9IFZQOExSZWFkQml0cyhiciwgNCkgKyA0OwotICAgIGlmIChudW1fY29kZXMgPiBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29kZV9sZW5ndGhzID0KLSAgICAgICAgKGludCopV2ViUFNhZmVDYWxsb2MoKHVpbnQ2NF90KWFscGhhYmV0X3NpemUsIHNpemVvZigqY29kZV9sZW5ndGhzKSk7Ci0gICAgaWYgKGNvZGVfbGVuZ3RocyA9PSBOVUxMKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZGVzOyArK2kpIHsKLSAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1trQ29kZUxlbmd0aENvZGVPcmRlcltpXV0gPSBWUDhMUmVhZEJpdHMoYnIsIDMpOwotICAgIH0KLSAgICBvayA9IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoZGVjLCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3Rocyk7Ci0gICAgaWYgKG9rKSB7Ci0gICAgICBvayA9IEh1ZmZtYW5UcmVlQnVpbGRJbXBsaWNpdCh0cmVlLCBjb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUpOwotICAgIH0KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoY29kZV9sZW5ndGhzKTsKLSAgfQotICBvayA9IG9rICYmICFici0+ZXJyb3JfOwotICBpZiAoIW9rKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIERlbGV0ZUh0cmVlR3JvdXBzKEhUcmVlR3JvdXAqIGh0cmVlX2dyb3VwcywgaW50IG51bV9odHJlZV9ncm91cHMpIHsKLSAgaWYgKGh0cmVlX2dyb3VwcyAhPSBOVUxMKSB7Ci0gICAgaW50IGksIGo7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9odHJlZV9ncm91cHM7ICsraSkgewotICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IGh0cmVlcyA9IGh0cmVlX2dyb3Vwc1tpXS5odHJlZXNfOwotICAgICAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7Ci0gICAgICAgIEh1ZmZtYW5UcmVlUmVsZWFzZSgmaHRyZWVzW2pdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGh0cmVlX2dyb3Vwcyk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBSZWFkSHVmZm1hbkNvZGVzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcl9jYWNoZV9iaXRzLCBpbnQgYWxsb3dfcmVjdXJzaW9uKSB7Ci0gIGludCBpLCBqOwotICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOwotICB1aW50MzJfdCogaHVmZm1hbl9pbWFnZSA9IE5VTEw7Ci0gIEhUcmVlR3JvdXAqIGh0cmVlX2dyb3VwcyA9IE5VTEw7Ci0gIGludCBudW1faHRyZWVfZ3JvdXBzID0gMTsKLQotICBpZiAoYWxsb3dfcmVjdXJzaW9uICYmIFZQOExSZWFkQml0cyhiciwgMSkpIHsKLSAgICAvLyB1c2UgbWV0YSBIdWZmbWFuIGNvZGVzLgotICAgIGNvbnN0IGludCBodWZmbWFuX3ByZWNpc2lvbiA9IFZQOExSZWFkQml0cyhiciwgMykgKyAyOwotICAgIGNvbnN0IGludCBodWZmbWFuX3hzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeHNpemUsIGh1ZmZtYW5fcHJlY2lzaW9uKTsKLSAgICBjb25zdCBpbnQgaHVmZm1hbl95c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHlzaXplLCBodWZmbWFuX3ByZWNpc2lvbik7Ci0gICAgY29uc3QgaW50IGh1ZmZtYW5fcGl4cyA9IGh1ZmZtYW5feHNpemUgKiBodWZmbWFuX3lzaXplOwotICAgIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0oaHVmZm1hbl94c2l6ZSwgaHVmZm1hbl95c2l6ZSwgMCwgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh1ZmZtYW5faW1hZ2UpKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c18gPSBodWZmbWFuX3ByZWNpc2lvbjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaHVmZm1hbl9waXhzOyArK2kpIHsKLSAgICAgIC8vIFRoZSBodWZmbWFuIGRhdGEgaXMgc3RvcmVkIGluIHJlZCBhbmQgZ3JlZW4gYnl0ZXMuCi0gICAgICBjb25zdCBpbnQgZ3JvdXAgPSAoaHVmZm1hbl9pbWFnZVtpXSA+PiA4KSAmIDB4ZmZmZjsKLSAgICAgIGh1ZmZtYW5faW1hZ2VbaV0gPSBncm91cDsKLSAgICAgIGlmIChncm91cCA+PSBudW1faHRyZWVfZ3JvdXBzKSB7Ci0gICAgICAgIG51bV9odHJlZV9ncm91cHMgPSBncm91cCArIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJyLT5lcnJvcl8pIGdvdG8gRXJyb3I7Ci0KLSAgU0JfRENIRUNLKG51bV9odHJlZV9ncm91cHMgPD0gMHgxMDAwMCk7Ci0gIGh0cmVlX2dyb3VwcyA9Ci0gICAgICAoSFRyZWVHcm91cCopV2ViUFNhZmVDYWxsb2MoKHVpbnQ2NF90KW51bV9odHJlZV9ncm91cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodHJlZV9ncm91cHMpKTsKLSAgaWYgKGh0cmVlX2dyb3VwcyA9PSBOVUxMKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2h0cmVlX2dyb3VwczsgKytpKSB7Ci0gICAgSHVmZm1hblRyZWUqIGNvbnN0IGh0cmVlcyA9IGh0cmVlX2dyb3Vwc1tpXS5odHJlZXNfOwotICAgIGZvciAoaiA9IDA7IGogPCBIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREU7ICsraikgewotICAgICAgaW50IGFscGhhYmV0X3NpemUgPSBrQWxwaGFiZXRTaXplW2pdOwotICAgICAgaWYgKGogPT0gMCAmJiBjb2xvcl9jYWNoZV9iaXRzID4gMCkgewotICAgICAgICBhbHBoYWJldF9zaXplICs9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKLSAgICAgIH0KLSAgICAgIGlmICghUmVhZEh1ZmZtYW5Db2RlKGFscGhhYmV0X3NpemUsIGRlYywgaHRyZWVzICsgaikpIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWxsIE9LLiBGaW5hbGl6ZSBwb2ludGVycyBhbmQgcmV0dXJuLgotICBoZHItPmh1ZmZtYW5faW1hZ2VfID0gaHVmZm1hbl9pbWFnZTsKLSAgaGRyLT5udW1faHRyZWVfZ3JvdXBzXyA9IG51bV9odHJlZV9ncm91cHM7Ci0gIGhkci0+aHRyZWVfZ3JvdXBzXyA9IGh0cmVlX2dyb3VwczsKLSAgcmV0dXJuIDE7Ci0KLSBFcnJvcjoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGh1ZmZtYW5faW1hZ2UpOwotICBEZWxldGVIdHJlZUdyb3VwcyhodHJlZV9ncm91cHMsIG51bV9odHJlZV9ncm91cHMpOwotICByZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNjYWxpbmcuCi0KLXN0YXRpYyBpbnQgQWxsb2NhdGVBbmRJbml0UmVzY2FsZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGNvbnN0IGludCBudW1fY2hhbm5lbHMgPSA0OwotICBjb25zdCBpbnQgaW5fd2lkdGggPSBpby0+bWJfdzsKLSAgY29uc3QgaW50IG91dF93aWR0aCA9IGlvLT5zY2FsZWRfd2lkdGg7Ci0gIGNvbnN0IGludCBpbl9oZWlnaHQgPSBpby0+bWJfaDsKLSAgY29uc3QgaW50IG91dF9oZWlnaHQgPSBpby0+c2NhbGVkX2hlaWdodDsKLSAgY29uc3QgdWludDY0X3Qgd29ya19zaXplID0gMiAqIG51bV9jaGFubmVscyAqICh1aW50NjRfdClvdXRfd2lkdGg7Ci0gIGludDMyX3QqIHdvcms7ICAgICAgICAvLyBSZXNjYWxlciB3b3JrIGFyZWEuCi0gIGNvbnN0IHVpbnQ2NF90IHNjYWxlZF9kYXRhX3NpemUgPSBudW1fY2hhbm5lbHMgKiAodWludDY0X3Qpb3V0X3dpZHRoOwotICB1aW50MzJfdCogc2NhbGVkX2RhdGE7ICAvLyBUZW1wb3Jhcnkgc3RvcmFnZSBmb3Igc2NhbGVkIEJHUkEgZGF0YS4KLSAgY29uc3QgdWludDY0X3QgbWVtb3J5X3NpemUgPSBzaXplb2YoKmRlYy0+cmVzY2FsZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfZGF0YV9zaXplICogc2l6ZW9mKCpzY2FsZWRfZGF0YSk7Ci0gIHVpbnQ4X3QqIG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZUNhbGxvYyhtZW1vcnlfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKLSAgaWYgKG1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIHJldHVybiAwOwotICB9Ci0gIFNCX0RDSEVDSyhkZWMtPnJlc2NhbGVyX21lbW9yeSA9PSBOVUxMKTsKLSAgZGVjLT5yZXNjYWxlcl9tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgZGVjLT5yZXNjYWxlciA9IChXZWJQUmVzY2FsZXIqKW1lbW9yeTsKLSAgbWVtb3J5ICs9IHNpemVvZigqZGVjLT5yZXNjYWxlcik7Ci0gIHdvcmsgPSAoaW50MzJfdCopbWVtb3J5OwotICBtZW1vcnkgKz0gd29ya19zaXplICogc2l6ZW9mKCp3b3JrKTsKLSAgc2NhbGVkX2RhdGEgPSAodWludDMyX3QqKW1lbW9yeTsKLQotICBXZWJQUmVzY2FsZXJJbml0KGRlYy0+cmVzY2FsZXIsIGluX3dpZHRoLCBpbl9oZWlnaHQsICh1aW50OF90KilzY2FsZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIG51bV9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBpbl93aWR0aCwgb3V0X3dpZHRoLCBpbl9oZWlnaHQsIG91dF9oZWlnaHQsIHdvcmspOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEV4cG9ydCB0byBBUkdCCi0KLS8vIFdlIGhhdmUgc3BlY2lhbCAiZXhwb3J0IiBmdW5jdGlvbiBzaW5jZSB3ZSBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCR1JBCi1zdGF0aWMgaW50IEV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UsCi0gICAgICAgICAgICAgICAgICBpbnQgcmdiYV9zdHJpZGUsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IChjb25zdCB1aW50MzJfdCopcmVzY2FsZXItPmRzdDsKLSAgY29uc3QgaW50IGRzdF93aWR0aCA9IHJlc2NhbGVyLT5kc3Rfd2lkdGg7Ci0gIGludCBudW1fbGluZXNfb3V0ID0gMDsKLSAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7Ci0gICAgdWludDhfdCogY29uc3QgZHN0ID0gcmdiYSArIG51bV9saW5lc19vdXQgKiByZ2JhX3N0cmlkZTsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOwotICAgIFZQOExDb252ZXJ0RnJvbUJHUkEoc3JjLCBkc3Rfd2lkdGgsIGNvbG9yc3BhY2UsIGRzdCk7Ci0gICAgKytudW1fbGluZXNfb3V0OwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi0vLyBFbWl0IHNjYWxlZCByb3dzLgotc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRhdGEsIGludCBpbl9zdHJpZGUsIGludCBtYl9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IG91dF9zdHJpZGUpIHsKLSAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gZGVjLT5vdXRwdXRfLT5jb2xvcnNwYWNlOwotICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9IChjb25zdCB1aW50OF90KilkYXRhOwotICBpbnQgbnVtX2xpbmVzX2luID0gMDsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICB3aGlsZSAobnVtX2xpbmVzX2luIDwgbWJfaCkgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvd19pbiA9IGluICsgbnVtX2xpbmVzX2luICogaW5fc3RyaWRlOwotICAgIHVpbnQ4X3QqIGNvbnN0IHJvd19vdXQgPSBvdXQgKyBudW1fbGluZXNfb3V0ICogb3V0X3N0cmlkZTsKLSAgICBudW1fbGluZXNfaW4gKz0gV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIG1iX2ggLSBudW1fbGluZXNfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dfaW4sIGluX3N0cmlkZSk7Ci0gICAgbnVtX2xpbmVzX291dCArPSBFeHBvcnQoZGVjLT5yZXNjYWxlciwgY29sb3JzcGFjZSwgb3V0X3N0cmlkZSwgcm93X291dCk7Ci0gIH0KLSAgcmV0dXJuIG51bV9saW5lc19vdXQ7Ci19Ci0KLS8vIEVtaXQgcm93cyB3aXRob3V0IGFueSBzY2FsaW5nLgotc3RhdGljIGludCBFbWl0Um93cyhXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkYXRhLCBpbnQgaW5fc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdywgaW50IG1iX2gsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IG91dF9zdHJpZGUpIHsKLSAgaW50IGxpbmVzID0gbWJfaDsKLSAgY29uc3QgdWludDhfdCogcm93X2luID0gKGNvbnN0IHVpbnQ4X3QqKWRhdGE7Ci0gIHVpbnQ4X3QqIHJvd19vdXQgPSBvdXQ7Ci0gIHdoaWxlIChsaW5lcy0tID4gMCkgewotICAgIFZQOExDb252ZXJ0RnJvbUJHUkEoKGNvbnN0IHVpbnQzMl90Kilyb3dfaW4sIG1iX3csIGNvbG9yc3BhY2UsIHJvd19vdXQpOwotICAgIHJvd19pbiArPSBpbl9zdHJpZGU7Ci0gICAgcm93X291dCArPSBvdXRfc3RyaWRlOwotICB9Ci0gIHJldHVybiBtYl9oOyAgLy8gTnVtIHJvd3Mgb3V0ID09IG51bSByb3dzIGluLgotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXhwb3J0IHRvIFlVVkEKLQotc3RhdGljIHZvaWQgQ29udmVydFRvWVVWQShjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjLCBpbnQgd2lkdGgsIGludCB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0KSB7Ci0gIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LllVVkE7Ci0gIC8vIGZpcnN0LCB0aGUgbHVtYSBwbGFuZQotICB7Ci0gICAgaW50IGk7Ci0gICAgdWludDhfdCogY29uc3QgeSA9IGJ1Zi0+eSArIHlfcG9zICogYnVmLT55X3N0cmlkZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgcCA9IHNyY1tpXTsKLSAgICAgIHlbaV0gPSBWUDhSR0JUb1koKHAgPj4gMTYpICYgMHhmZiwgKHAgPj4gOCkgJiAweGZmLCAocCA+PiAwKSAmIDB4ZmYpOwotICAgIH0KLSAgfQotCi0gIC8vIHRoZW4gVS9WIHBsYW5lcwotICB7Ci0gICAgdWludDhfdCogY29uc3QgdSA9IGJ1Zi0+dSArICh5X3BvcyA+PiAxKSAqIGJ1Zi0+dV9zdHJpZGU7Ci0gICAgdWludDhfdCogY29uc3QgdiA9IGJ1Zi0+diArICh5X3BvcyA+PiAxKSAqIGJ1Zi0+dl9zdHJpZGU7Ci0gICAgY29uc3QgaW50IHV2X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdXZfd2lkdGg7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzcmNbMiAqIGkgKyAwXTsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHYxID0gc3JjWzIgKiBpICsgMV07Ci0gICAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIGZvdXIgYWNjdW11bGF0ZWQgcGl4ZWxzLiBIZW5jZSB3ZSBuZWVkIHRvCi0gICAgICAvLyBzY2FsZSByL2cvYiB2YWx1ZSBieSBhIGZhY3RvciAyLiBXZSBqdXN0IHNoaWZ0IHYwL3YxIG9uZSBiaXQgbGVzcy4KLSAgICAgIGNvbnN0IGludCByID0gKCh2MCA+PiAxNSkgJiAweDFmZSkgKyAoKHYxID4+IDE1KSAmIDB4MWZlKTsKLSAgICAgIGNvbnN0IGludCBnID0gKCh2MCA+PiAgNykgJiAweDFmZSkgKyAoKHYxID4+ICA3KSAmIDB4MWZlKTsKLSAgICAgIGNvbnN0IGludCBiID0gKCh2MCA8PCAgMSkgJiAweDFmZSkgKyAoKHYxIDw8ICAxKSAmIDB4MWZlKTsKLSAgICAgIGlmICghKHlfcG9zICYgMSkpIHsgIC8vIGV2ZW4gbGluZXM6IHN0b3JlIHZhbHVlcwotICAgICAgICB1W2ldID0gVlA4UkdCVG9VKHIsIGcsIGIpOwotICAgICAgICB2W2ldID0gVlA4UkdCVG9WKHIsIGcsIGIpOwotICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgLy8gb2RkIGxpbmVzOiBhdmVyYWdlIHdpdGggcHJldmlvdXMgdmFsdWVzCi0gICAgICAgIGNvbnN0IGludCB0bXBfdSA9IFZQOFJHQlRvVShyLCBnLCBiKTsKLSAgICAgICAgY29uc3QgaW50IHRtcF92ID0gVlA4UkdCVG9WKHIsIGcsIGIpOwotICAgICAgICAvLyBBcHByb3hpbWF0ZWQgYXZlcmFnZS1vZi1mb3VyLiBCdXQgaXQncyBhbiBhY2NlcHRhYmxlIGRpZmYuCi0gICAgICAgIHVbaV0gPSAodVtpXSArIHRtcF91ICsgMSkgPj4gMTsKLSAgICAgICAgdltpXSA9ICh2W2ldICsgdG1wX3YgKyAxKSA+PiAxOwotICAgICAgfQotICAgIH0KLSAgICBpZiAod2lkdGggJiAxKSB7ICAgICAgIC8vIGxhc3QgcGl4ZWwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHYwID0gc3JjWzIgKiBpICsgMF07Ci0gICAgICBjb25zdCBpbnQgciA9ICh2MCA+PiAxNCkgJiAweDNmYzsKLSAgICAgIGNvbnN0IGludCBnID0gKHYwID4+ICA2KSAmIDB4M2ZjOwotICAgICAgY29uc3QgaW50IGIgPSAodjAgPDwgIDIpICYgMHgzZmM7Ci0gICAgICBpZiAoISh5X3BvcyAmIDEpKSB7ICAvLyBldmVuIGxpbmVzCi0gICAgICAgIHVbaV0gPSBWUDhSR0JUb1UociwgZywgYik7Ci0gICAgICAgIHZbaV0gPSBWUDhSR0JUb1YociwgZywgYik7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAvLyBvZGQgbGluZXMgKG5vdGU6IHdlIGNvdWxkIGp1c3Qgc2tpcCB0aGlzKQotICAgICAgICBjb25zdCBpbnQgdG1wX3UgPSBWUDhSR0JUb1UociwgZywgYik7Ci0gICAgICAgIGNvbnN0IGludCB0bXBfdiA9IFZQOFJHQlRvVihyLCBnLCBiKTsKLSAgICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOwotICAgICAgICB2W2ldID0gKHZbaV0gKyB0bXBfdiArIDEpID4+IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIExhc3RseSwgc3RvcmUgYWxwaGEgaWYgbmVlZGVkLgotICBpZiAoYnVmLT5hICE9IE5VTEwpIHsKLSAgICBpbnQgaTsKLSAgICB1aW50OF90KiBjb25zdCBhID0gYnVmLT5hICsgeV9wb3MgKiBidWYtPmFfc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSBhW2ldID0gKHNyY1tpXSA+PiAyNCk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBFeHBvcnRZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCB5X3BvcykgewotICBXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyID0gZGVjLT5yZXNjYWxlcjsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IChjb25zdCB1aW50MzJfdCopcmVzY2FsZXItPmRzdDsKLSAgY29uc3QgaW50IGRzdF93aWR0aCA9IHJlc2NhbGVyLT5kc3Rfd2lkdGg7Ci0gIGludCBudW1fbGluZXNfb3V0ID0gMDsKLSAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKLSAgICBDb252ZXJ0VG9ZVVZBKHNyYywgZHN0X3dpZHRoLCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKLSAgICArK3lfcG9zOwotICAgICsrbnVtX2xpbmVzX291dDsKLSAgfQotICByZXR1cm4gbnVtX2xpbmVzX291dDsKLX0KLQotc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3N0cmlkZSwgaW50IG1iX2gpIHsKLSAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPSAoY29uc3QgdWludDhfdCopZGF0YTsKLSAgaW50IG51bV9saW5lc19pbiA9IDA7Ci0gIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKLSAgd2hpbGUgKG51bV9saW5lc19pbiA8IG1iX2gpIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCByb3dfaW4gPSBpbiArIG51bV9saW5lc19pbiAqIGluX3N0cmlkZTsKLSAgICBudW1fbGluZXNfaW4gKz0gV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIG1iX2ggLSBudW1fbGluZXNfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dfaW4sIGluX3N0cmlkZSk7Ci0gICAgeV9wb3MgKz0gRXhwb3J0WVVWQShkZWMsIHlfcG9zKTsKLSAgfQotICByZXR1cm4geV9wb3M7Ci19Ci0KLXN0YXRpYyBpbnQgRW1pdFJvd3NZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YSwgaW50IGluX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbnVtX3Jvd3MpIHsKLSAgaW50IHlfcG9zID0gZGVjLT5sYXN0X291dF9yb3dfOwotICBjb25zdCB1aW50OF90KiByb3dfaW4gPSAoY29uc3QgdWludDhfdCopZGF0YTsKLSAgd2hpbGUgKG51bV9yb3dzLS0gPiAwKSB7Ci0gICAgQ29udmVydFRvWVVWQSgoY29uc3QgdWludDMyX3QqKXJvd19pbiwgbWJfdywgeV9wb3MsIGRlYy0+b3V0cHV0Xyk7Ci0gICAgcm93X2luICs9IGluX3N0cmlkZTsKLSAgICArK3lfcG9zOwotICB9Ci0gIHJldHVybiB5X3BvczsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENyb3BwaW5nLgotCi0vLyBTZXRzIGlvLT5tYl95LCBpby0+bWJfaCAmIGlvLT5tYl93IGFjY29yZGluZyB0byBzdGFydCByb3csIGVuZCByb3cgYW5kCi0vLyBjcm9wIG9wdGlvbnMuIEFsc28gdXBkYXRlcyB0aGUgaW5wdXQgZGF0YSBwb2ludGVyLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLS8vIHN0YXJ0IG9mIHRoZSBjcm9wcGVkIHdpbmRvdy4KLS8vIE5vdGUgdGhhdCAncGl4ZWxfc3RyaWRlJyBpcyBpbiB1bml0cyBvZiAndWludDMyX3QnIChhbmQgbm90ICdieXRlcykuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNyb3Agd2luZG93IGlzIG5vdCBlbXB0eS4KLXN0YXRpYyBpbnQgU2V0Q3JvcFdpbmRvdyhWUDhJbyogY29uc3QgaW8sIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqKiBjb25zdCBpbl9kYXRhLCBpbnQgcGl4ZWxfc3RyaWRlKSB7Ci0gIFNCX0RDSEVDSyh5X3N0YXJ0IDwgeV9lbmQpOwotICBTQl9EQ0hFQ0soaW8tPmNyb3BfbGVmdCA8IGlvLT5jcm9wX3JpZ2h0KTsKLSAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7Ci0gICAgeV9lbmQgPSBpby0+Y3JvcF9ib3R0b207ICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgb24gbGFzdCByb3cuCi0gIH0KLSAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKLSAgICBjb25zdCBpbnQgZGVsdGEgPSBpby0+Y3JvcF90b3AgLSB5X3N0YXJ0OwotICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7Ci0gICAgKmluX2RhdGEgKz0gcGl4ZWxfc3RyaWRlICogZGVsdGE7Ci0gIH0KLSAgaWYgKHlfc3RhcnQgPj0geV9lbmQpIHJldHVybiAwOyAgLy8gQ3JvcCB3aW5kb3cgaXMgZW1wdHkuCi0KLSAgKmluX2RhdGEgKz0gaW8tPmNyb3BfbGVmdDsKLQotICBpby0+bWJfeSA9IHlfc3RhcnQgLSBpby0+Y3JvcF90b3A7Ci0gIGlvLT5tYl93ID0gaW8tPmNyb3BfcmlnaHQgLSBpby0+Y3JvcF9sZWZ0OwotICBpby0+bWJfaCA9IHlfZW5kIC0geV9zdGFydDsKLSAgcmV0dXJuIDE7ICAvLyBOb24tZW1wdHkgY3JvcCB3aW5kb3cuCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TWV0YUluZGV4KAotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbWFnZSwgaW50IHhzaXplLCBpbnQgYml0cywgaW50IHgsIGludCB5KSB7Ci0gIGlmIChiaXRzID09IDApIHJldHVybiAwOwotICByZXR1cm4gaW1hZ2VbeHNpemUgKiAoeSA+PiBiaXRzKSArICh4ID4+IGJpdHMpXTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIEhUcmVlR3JvdXAqIEdldEh0cmVlR3JvdXBGb3JQb3MoVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpIHsKLSAgY29uc3QgaW50IG1ldGFfaW5kZXggPSBHZXRNZXRhSW5kZXgoaGRyLT5odWZmbWFuX2ltYWdlXywgaGRyLT5odWZmbWFuX3hzaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXywgeCwgeSk7Ci0gIFNCX0RDSEVDSyhtZXRhX2luZGV4IDwgaGRyLT5udW1faHRyZWVfZ3JvdXBzXyk7Ci0gIHJldHVybiBoZHItPmh0cmVlX2dyb3Vwc18gKyBtZXRhX2luZGV4OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBsb29wLCB3aXRoIGN1c3RvbSByb3ctcHJvY2Vzc2luZyBmdW5jdGlvbgotCi10eXBlZGVmIHZvaWQgKCpQcm9jZXNzUm93c0Z1bmMpKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpOwotCi1zdGF0aWMgdm9pZCBBcHBseUludmVyc2VUcmFuc2Zvcm1zKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBudW1fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJvd3MpIHsKLSAgaW50IG4gPSBkZWMtPm5leHRfdHJhbnNmb3JtXzsKLSAgY29uc3QgaW50IGNhY2hlX3BpeHMgPSBkZWMtPndpZHRoXyAqIG51bV9yb3dzOwotICBjb25zdCBpbnQgc3RhcnRfcm93ID0gZGVjLT5sYXN0X3Jvd187Ci0gIGNvbnN0IGludCBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7Ci0gIGNvbnN0IHVpbnQzMl90KiByb3dzX2luID0gcm93czsKLSAgdWludDMyX3QqIGNvbnN0IHJvd3Nfb3V0ID0gZGVjLT5hcmdiX2NhY2hlXzsKLQotICAvLyBJbnZlcnNlIHRyYW5zZm9ybXMuCi0gIC8vIFRPRE86IG1vc3QgdHJhbnNmb3JtcyBvbmx5IG5lZWQgdG8gb3BlcmF0ZSBvbiB0aGUgY3JvcHBlZCByZWdpb24gb25seS4KLSAgU2JNZW1vcnlDb3B5KHJvd3Nfb3V0LCByb3dzX2luLCBjYWNoZV9waXhzICogc2l6ZW9mKCpyb3dzX291dCkpOwotICB3aGlsZSAobi0tID4gMCkgewotICAgIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfW25dOwotICAgIFZQOExJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgc3RhcnRfcm93LCBlbmRfcm93LCByb3dzX2luLCByb3dzX291dCk7Ci0gICAgcm93c19pbiA9IHJvd3Nfb3V0OwotICB9Ci19Ci0KLS8vIFNwZWNpYWwgbWV0aG9kIGZvciBwYWxldHRlZCBhbHBoYSBkYXRhLgotc3RhdGljIHZvaWQgQXBwbHlJbnZlcnNlVHJhbnNmb3Jtc0FscGhhKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBudW1fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByb3dzKSB7Ci0gIGNvbnN0IGludCBzdGFydF9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgaW50IGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgY29uc3QgdWludDhfdCogcm93c19pbiA9IHJvd3M7Ci0gIHVpbnQ4X3QqIHJvd3Nfb3V0ID0gKHVpbnQ4X3QqKWRlYy0+aW9fLT5vcGFxdWUgKyBkZWMtPmlvXy0+d2lkdGggKiBzdGFydF9yb3c7Ci0gIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfWzBdOwotICBTQl9EQ0hFQ0soZGVjLT5uZXh0X3RyYW5zZm9ybV8gPT0gMSk7Ci0gIFNCX0RDSEVDSyh0cmFuc2Zvcm0tPnR5cGVfID09IENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSk7Ci0gIFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhKHRyYW5zZm9ybSwgc3RhcnRfcm93LCBlbmRfcm93LCByb3dzX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzX291dCk7Ci19Ci0KLS8vIFByb2Nlc3NlcyAodHJhbnNmb3Jtcywgc2NhbGVzICYgY29sb3ItY29udmVydHMpIHRoZSByb3dzIGRlY29kZWQgYWZ0ZXIgdGhlCi0vLyBsYXN0IGNhbGwuCi1zdGF0aWMgdm9pZCBQcm9jZXNzUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCByb3dzID0gZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgaW50IG51bV9yb3dzID0gcm93IC0gZGVjLT5sYXN0X3Jvd187Ci0KLSAgaWYgKG51bV9yb3dzIDw9IDApIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZS4KLSAgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhkZWMsIG51bV9yb3dzLCByb3dzKTsKLQotICAvLyBFbWl0IG91dHB1dC4KLSAgewotICAgIFZQOElvKiBjb25zdCBpbyA9IGRlYy0+aW9fOwotICAgIGNvbnN0IHVpbnQzMl90KiByb3dzX2RhdGEgPSBkZWMtPmFyZ2JfY2FjaGVfOwotICAgIGlmICghU2V0Q3JvcFdpbmRvdyhpbywgZGVjLT5sYXN0X3Jvd18sIHJvdywgJnJvd3NfZGF0YSwgaW8tPndpZHRoKSkgewotICAgICAgLy8gTm90aGluZyB0byBvdXRwdXQgKHRoaXMgdGltZSkuCi0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IGRlYy0+b3V0cHV0XzsKLSAgICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSBpby0+d2lkdGggKiBzaXplb2YoKnJvd3NfZGF0YSk7Ci0gICAgICBpZiAob3V0cHV0LT5jb2xvcnNwYWNlIDwgTU9ERV9ZVVYpIHsgIC8vIGNvbnZlcnQgdG8gUkdCQQotICAgICAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOwotICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhID0gYnVmLT5yZ2JhICsgZGVjLT5sYXN0X291dF9yb3dfICogYnVmLT5zdHJpZGU7Ci0gICAgICAgIGNvbnN0IGludCBudW1fcm93c19vdXQgPSBpby0+dXNlX3NjYWxpbmcgPwotICAgICAgICAgICAgRW1pdFJlc2NhbGVkUm93cyhkZWMsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLCBpby0+bWJfaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSwgYnVmLT5zdHJpZGUpIDoKLSAgICAgICAgICAgIEVtaXRSb3dzKG91dHB1dC0+Y29sb3JzcGFjZSwgcm93c19kYXRhLCBpbl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgaW8tPm1iX2gsIHJnYmEsIGJ1Zi0+c3RyaWRlKTsKLSAgICAgICAgLy8gVXBkYXRlICdsYXN0X291dF9yb3dfJy4KLSAgICAgICAgZGVjLT5sYXN0X291dF9yb3dfICs9IG51bV9yb3dzX291dDsKLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBZVVZBCi0gICAgICAgIGRlYy0+bGFzdF9vdXRfcm93XyA9IGlvLT51c2Vfc2NhbGluZyA/Ci0gICAgICAgICAgICBFbWl0UmVzY2FsZWRSb3dzWVVWQShkZWMsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLCBpby0+bWJfaCkgOgotICAgICAgICAgICAgRW1pdFJvd3NZVVZBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl93LCBpby0+bWJfaCk7Ci0gICAgICB9Ci0gICAgICBTQl9EQ0hFQ0soZGVjLT5sYXN0X291dF9yb3dfIDw9IG91dHB1dC0+aGVpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICAvLyBVcGRhdGUgJ2xhc3Rfcm93XycuCi0gIGRlYy0+bGFzdF9yb3dfID0gcm93OwotICBTQl9EQ0hFQ0soZGVjLT5sYXN0X3Jvd18gPD0gZGVjLT5oZWlnaHRfKTsKLX0KLQotI2RlZmluZSBERUNPREVfREFUQV9GVU5DKEZVTkNfTkFNRSwgVFlQRSwgU1RPUkVfUElYRUwpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBpbnQgRlVOQ19OQU1FKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFRZUEUqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBQcm9jZXNzUm93c0Z1bmMgcHJvY2Vzc19mdW5jKSB7ICAgICAgICAgICAgICAgXAotICBpbnQgb2sgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IGNvbCA9IDAsIHJvdyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXAgPSBoZHItPmh0cmVlX2dyb3Vwc187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRZUEUqIHNyYyA9IGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBUWVBFKiBsYXN0X2NhY2hlZCA9IGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVFlQRSogY29uc3Qgc3JjX2VuZCA9IGRhdGEgKyB3aWR0aCAqIGhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsZW5fY29kZV9saW1pdCA9IE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUzsgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgY29sb3JfY2FjaGVfbGltaXQgPSBsZW5fY29kZV9saW1pdCArIGhkci0+Y29sb3JfY2FjaGVfc2l6ZV87ICAgICAgIFwKLSAgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA+IDApID8gJmhkci0+Y29sb3JfY2FjaGVfIDogTlVMTDsgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbWFzayA9IGhkci0+aHVmZm1hbl9tYXNrXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKGh0cmVlX2dyb3VwICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHdoaWxlICghYnItPmVvc18gJiYgc3JjIDwgc3JjX2VuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBPbmx5IHVwZGF0ZSB3aGVuIGNoYW5naW5nIHRpbGUuIE5vdGUgd2UgY291bGQgdXNlIHRoaXMgdGVzdDogICAgICAgICovICBcCi0gICAgLyogaWYgIigoKChwcmV2X2NvbCBeIGNvbCkgfCBwcmV2X3JvdyBeIHJvdykpID4gbWFzaykiIC0+IHRpbGUgY2hhbmdlZCAqLyAgXAotICAgIC8qIGJ1dCB0aGF0J3MgYWN0dWFsbHkgc2xvd2VyIGFuZCBuZWVkcyBzdG9yaW5nIHRoZSBwcmV2aW91cyBjb2wvcm93LiAgKi8gIFwKLSAgICBpZiAoKGNvbCAmIG1hc2spID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29kZSA9IFJlYWRTeW1ib2woJmh0cmVlX2dyb3VwLT5odHJlZXNfW0dSRUVOXSwgYnIpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8qIExpdGVyYWwqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZWQgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tSRURdLCBicik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ3JlZW4gPSBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBibHVlID0gUmVhZFN5bWJvbCgmaHRyZWVfZ3JvdXAtPmh0cmVlc19bQkxVRV0sIGJyKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYWxwaGEgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tBTFBIQV0sIGJyKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpzcmMgPSBTVE9SRV9QSVhFTChhbHBoYSwgcmVkLCBncmVlbiwgYmx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQWR2YW5jZUJ5T25lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKytzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICsrY29sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoY29sID49IHdpZHRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjb2wgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgocHJvY2Vzc19mdW5jICE9IE5VTEwpICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7ICAgICAgXAotICAgICAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChjb2xvcl9jYWNoZSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIGlmIChjb2RlIDwgbGVuX2NvZGVfbGltaXQpIHsgIC8qIEJhY2t3YXJkIHJlZmVyZW5jZSAqLyAgICAgICAgICAgICAgXAotICAgICAgaW50IGRpc3RfY29kZSwgZGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IGludCBsZW5ndGhfc3ltID0gY29kZSAtIE5VTV9MSVRFUkFMX0NPREVTOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBpbnQgbGVuZ3RoID0gR2V0Q29weUxlbmd0aChsZW5ndGhfc3ltLCBicik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgaW50IGRpc3Rfc3ltYm9sID0gUmVhZFN5bWJvbCgmaHRyZWVfZ3JvdXAtPmh0cmVlc19bRElTVF0sIGJyKTsgICAgIFwKLSAgICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkaXN0X2NvZGUgPSBHZXRDb3B5RGlzdGFuY2UoZGlzdF9zeW1ib2wsIGJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZGlzdCA9IFBsYW5lQ29kZVRvRGlzdGFuY2Uod2lkdGgsIGRpc3RfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChzcmMgLSBkYXRhIDwgZGlzdCB8fCBzcmNfZW5kIC0gc3JjIDwgbGVuZ3RoKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnb3RvIEVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBzcmNbaV0gPSBzcmNbaSAtIGRpc3RdOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNyYyArPSBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbCArPSBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoY29sID49IHdpZHRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjb2wgLT0gd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgocHJvY2Vzc19mdW5jICE9IE5VTEwpICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7ICAgICAgXAotICAgICAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHNyYyA8IHNyY19lbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChjb2xvcl9jYWNoZSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIGlmIChjb2RlIDwgY29sb3JfY2FjaGVfbGltaXQpIHsgIC8qIENvbG9yIGNhY2hlICovICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgaW50IGtleSA9IGNvZGUgLSBsZW5fY29kZV9saW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFNCX0RDSEVDSyhjb2xvcl9jYWNoZSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAobGFzdF9jYWNoZWQgPCBzcmMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqc3JjID0gVlA4TENvbG9yQ2FjaGVMb29rdXAoY29sb3JfY2FjaGUsIGtleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ290byBBZHZhbmNlQnlPbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgeyAgLyogTm90IHJlYWNoZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ290byBFbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb2sgPSAhYnItPmVycm9yXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghb2spIGdvdG8gRW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyByb3dzIGNvcnJlc3BvbmRpbmcgdG8gbGFzdCByb3ctYmxvY2suICovICAgICAgICAgICAgXAotICBpZiAocHJvY2Vzc19mdW5jICE9IE5VTEwpIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLUVuZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChici0+ZXJyb3JfIHx8ICFvayB8fCAoYnItPmVvc18gJiYgc3JjIDwgc3JjX2VuZCkpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkZWMtPnN0YXR1c18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICghYnItPmVvc18pID8gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgOiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgICAgICAgXAotICB9IGVsc2UgaWYgKHNyYyA9PSBzcmNfZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkZWMtPnN0YXRlXyA9IFJFQURfREFUQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gb2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldEFSR0JQaXhlbChpbnQgYWxwaGEsIGludCByZWQsIGludCBncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsdWUpIHsKLSAgcmV0dXJuIChhbHBoYSA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IEdldEFscGhhUGl4ZWwoaW50IGFscGhhLCBpbnQgcmVkLCBpbnQgZ3JlZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibHVlKSB7Ci0gICh2b2lkKWFscGhhOwotICAodm9pZClyZWQ7Ci0gICh2b2lkKWJsdWU7Ci0gIHJldHVybiBncmVlbjsgIC8vIEFscGhhIHZhbHVlIGlzIHN0b3JlZCBpbiBncmVlbiBjaGFubmVsLgotfQotCi1ERUNPREVfREFUQV9GVU5DKERlY29kZUltYWdlRGF0YSwgdWludDMyX3QsIEdldEFSR0JQaXhlbCkKLURFQ09ERV9EQVRBX0ZVTkMoRGVjb2RlQWxwaGFEYXRhLCB1aW50OF90LCBHZXRBbHBoYVBpeGVsKQotCi0jdW5kZWYgREVDT0RFX0RBVEFfRlVOQwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TFRyYW5zZm9ybQotCi1zdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybShWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHRyYW5zZm9ybS0+ZGF0YV8pOwotICB0cmFuc2Zvcm0tPmRhdGFfID0gTlVMTDsKLX0KLQotLy8gRm9yIHNlY3VyaXR5IHJlYXNvbiwgd2UgbmVlZCB0byByZW1hcCB0aGUgY29sb3IgbWFwIHRvIHNwYW4KLS8vIHRoZSB0b3RhbCBwb3NzaWJsZSBidW5kbGVkIHZhbHVlcywgYW5kIG5vdCBqdXN0IHRoZSBudW1fY29sb3JzLgotc3RhdGljIGludCBFeHBhbmRDb2xvck1hcChpbnQgbnVtX2NvbG9ycywgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtKSB7Ci0gIGludCBpOwotICBjb25zdCBpbnQgZmluYWxfbnVtX2NvbG9ycyA9IDEgPDwgKDggPj4gdHJhbnNmb3JtLT5iaXRzXyk7Ci0gIHVpbnQzMl90KiBjb25zdCBuZXdfY29sb3JfbWFwID0KLSAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWZpbmFsX251bV9jb2xvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbmV3X2NvbG9yX21hcCkpOwotICBpZiAobmV3X2NvbG9yX21hcCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDhfdCogY29uc3QgZGF0YSA9ICh1aW50OF90Kil0cmFuc2Zvcm0tPmRhdGFfOwotICAgIHVpbnQ4X3QqIGNvbnN0IG5ld19kYXRhID0gKHVpbnQ4X3QqKW5ld19jb2xvcl9tYXA7Ci0gICAgbmV3X2NvbG9yX21hcFswXSA9IHRyYW5zZm9ybS0+ZGF0YV9bMF07Ci0gICAgZm9yIChpID0gNDsgaSA8IDQgKiBudW1fY29sb3JzOyArK2kpIHsKLSAgICAgIC8vIEVxdWl2YWxlbnQgdG8gQWRkUGl4ZWxFcSgpLCBvbiBhIGJ5dGUtYmFzaXMuCi0gICAgICBuZXdfZGF0YVtpXSA9IChkYXRhW2ldICsgbmV3X2RhdGFbaSAtIDRdKSAmIDB4ZmY7Ci0gICAgfQotICAgIGZvciAoOyBpIDwgNCAqIGZpbmFsX251bV9jb2xvcnM7ICsraSkKLSAgICAgIG5ld19kYXRhW2ldID0gMDsgIC8vIGJsYWNrIHRhaWwuCi0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHRyYW5zZm9ybS0+ZGF0YV8pOwotICAgIHRyYW5zZm9ybS0+ZGF0YV8gPSBuZXdfY29sb3JfbWFwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IFJlYWRUcmFuc2Zvcm0oaW50KiBjb25zdCB4c2l6ZSwgaW50IGNvbnN0KiB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGludCBvayA9IDE7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhMVHJhbnNmb3JtKiB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1tkZWMtPm5leHRfdHJhbnNmb3JtX107Ci0gIGNvbnN0IFZQOExJbWFnZVRyYW5zZm9ybVR5cGUgdHlwZSA9Ci0gICAgICAoVlA4TEltYWdlVHJhbnNmb3JtVHlwZSlWUDhMUmVhZEJpdHMoYnIsIDIpOwotCi0gIC8vIEVhY2ggdHJhbnNmb3JtIHR5cGUgY2FuIG9ubHkgYmUgcHJlc2VudCBvbmNlIGluIHRoZSBzdHJlYW0uCi0gIGlmIChkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gJiAoMVUgPDwgdHlwZSkpIHsKLSAgICByZXR1cm4gMDsgIC8vIEFscmVhZHkgdGhlcmUsIGxldCdzIG5vdCBhY2NlcHQgdGhlIHNlY29uZCBzYW1lIHRyYW5zZm9ybS4KLSAgfQotICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gfD0gKDFVIDw8IHR5cGUpOwotCi0gIHRyYW5zZm9ybS0+dHlwZV8gPSB0eXBlOwotICB0cmFuc2Zvcm0tPnhzaXplXyA9ICp4c2l6ZTsKLSAgdHJhbnNmb3JtLT55c2l6ZV8gPSAqeXNpemU7Ci0gIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOwotICArK2RlYy0+bmV4dF90cmFuc2Zvcm1fOwotICBTQl9EQ0hFQ0soZGVjLT5uZXh0X3RyYW5zZm9ybV8gPD0gTlVNX1RSQU5TRk9STVMpOwotCi0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKLSAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKLSAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKLSAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0oVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS0+Yml0c18pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnlzaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGRlYywgJnRyYW5zZm9ybS0+ZGF0YV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06IHsKLSAgICAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IFZQOExSZWFkQml0cyhiciwgOCkgKyAxOwotICAgICAgIGNvbnN0IGludCBiaXRzID0gKG51bV9jb2xvcnMgPiAxNikgPyAwCi0gICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDQpID8gMQotICAgICAgICAgICAgICAgICAgICAgIDogKG51bV9jb2xvcnMgPiAyKSA/IDIKLSAgICAgICAgICAgICAgICAgICAgICA6IDM7Ci0gICAgICAgKnhzaXplID0gVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIGJpdHMpOwotICAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBiaXRzOwotICAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0obnVtX2NvbG9ycywgMSwgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7Ci0gICAgICAgb2sgPSBvayAmJiBFeHBhbmRDb2xvck1hcChudW1fY29sb3JzLCB0cmFuc2Zvcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfRENIRUNLKDApOyAgICAvLyBjYW4ndCBoYXBwZW4KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIG9rOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TE1ldGFkYXRhCi0KLXN0YXRpYyB2b2lkIEluaXRNZXRhZGF0YShWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgewotICBTQl9EQ0hFQ0soaGRyKTsKLSAgU2JNZW1vcnlTZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwotfQotCi1zdGF0aWMgdm9pZCBDbGVhck1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7Ci0gIFNCX0RDSEVDSyhoZHIpOwotCi0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoZHItPmh1ZmZtYW5faW1hZ2VfKTsKLSAgRGVsZXRlSHRyZWVHcm91cHMoaGRyLT5odHJlZV9ncm91cHNfLCBoZHItPm51bV9odHJlZV9ncm91cHNfKTsKLSAgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGRyLT5jb2xvcl9jYWNoZV8pOwotICBJbml0TWV0YWRhdGEoaGRyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOExEZWNvZGVyCi0KLVZQOExEZWNvZGVyKiBWUDhMTmV3KHZvaWQpIHsKLSAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCpkZWMpKTsKLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgZGVjLT5hY3Rpb25fID0gUkVBRF9ESU07Ci0gIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07Ci0gIHJldHVybiBkZWM7Ci19Ci0KLXZvaWQgVlA4TENsZWFyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaW50IGk7Ci0gIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuOwotICBDbGVhck1ldGFkYXRhKCZkZWMtPmhkcl8pOwotCi0gIFNiTWVtb3J5RGVhbGxvY2F0ZShkZWMtPnBpeGVsc18pOwotICBkZWMtPnBpeGVsc18gPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgZGVjLT5uZXh0X3RyYW5zZm9ybV87ICsraSkgewotICAgIENsZWFyVHJhbnNmb3JtKCZkZWMtPnRyYW5zZm9ybXNfW2ldKTsKLSAgfQotICBkZWMtPm5leHRfdHJhbnNmb3JtXyA9IDA7Ci0gIGRlYy0+dHJhbnNmb3Jtc19zZWVuXyA9IDA7Ci0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYy0+cmVzY2FsZXJfbWVtb3J5KTsKLSAgZGVjLT5yZXNjYWxlcl9tZW1vcnkgPSBOVUxMOwotCi0gIGRlYy0+b3V0cHV0XyA9IE5VTEw7ICAgLy8gbGVhdmUgbm8gdHJhY2UgYmVoaW5kCi19Ci0KLXZvaWQgVlA4TERlbGV0ZShWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmIChkZWMgIT0gTlVMTCkgewotICAgIFZQOExDbGVhcihkZWMpOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShkZWMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFVwZGF0ZURlY29kZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKLSAgY29uc3QgaW50IG51bV9iaXRzID0gaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXzsKLSAgZGVjLT53aWR0aF8gPSB3aWR0aDsKLSAgZGVjLT5oZWlnaHRfID0gaGVpZ2h0OwotCi0gIGhkci0+aHVmZm1hbl94c2l6ZV8gPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgbnVtX2JpdHMpOwotICBoZHItPmh1ZmZtYW5fbWFza18gPSAobnVtX2JpdHMgPT0gMCkgPyB+MCA6ICgxIDw8IG51bV9iaXRzKSAtIDE7Ci19Ci0KLXN0YXRpYyBpbnQgRGVjb2RlSW1hZ2VTdHJlYW0oaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sZXZlbDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgZGVjb2RlZF9kYXRhKSB7Ci0gIGludCBvayA9IDE7Ci0gIGludCB0cmFuc2Zvcm1feHNpemUgPSB4c2l6ZTsKLSAgaW50IHRyYW5zZm9ybV95c2l6ZSA9IHlzaXplOwotICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOwotICB1aW50MzJfdCogZGF0YSA9IE5VTEw7Ci0gIGludCBjb2xvcl9jYWNoZV9iaXRzID0gMDsKLQotICAvLyBSZWFkIHRoZSB0cmFuc2Zvcm1zIChtYXkgcmVjdXJzZSkuCi0gIGlmIChpc19sZXZlbDApIHsKLSAgICB3aGlsZSAob2sgJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgewotICAgICAgb2sgPSBSZWFkVHJhbnNmb3JtKCZ0cmFuc2Zvcm1feHNpemUsICZ0cmFuc2Zvcm1feXNpemUsIGRlYyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29sb3IgY2FjaGUKLSAgaWYgKG9rICYmIFZQOExSZWFkQml0cyhiciwgMSkpIHsKLSAgICBjb2xvcl9jYWNoZV9iaXRzID0gVlA4TFJlYWRCaXRzKGJyLCA0KTsKLSAgICBvayA9IChjb2xvcl9jYWNoZV9iaXRzID49IDEgJiYgY29sb3JfY2FjaGVfYml0cyA8PSBNQVhfQ0FDSEVfQklUUyk7Ci0gICAgaWYgKCFvaykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0KLQotICAvLyBSZWFkIHRoZSBIdWZmbWFuIGNvZGVzIChtYXkgcmVjdXJzZSkuCi0gIG9rID0gb2sgJiYgUmVhZEh1ZmZtYW5Db2RlcyhkZWMsIHRyYW5zZm9ybV94c2l6ZSwgdHJhbnNmb3JtX3lzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfY2FjaGVfYml0cywgaXNfbGV2ZWwwKTsKLSAgaWYgKCFvaykgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgIGdvdG8gRW5kOwotICB9Ci0KLSAgLy8gRmluaXNoIHNldHRpbmcgdXAgdGhlIGNvbG9yLWNhY2hlCi0gIGlmIChjb2xvcl9jYWNoZV9iaXRzID4gMCkgewotICAgIGhkci0+Y29sb3JfY2FjaGVfc2l6ZV8gPSAxIDw8IGNvbG9yX2NhY2hlX2JpdHM7Ci0gICAgaWYgKCFWUDhMQ29sb3JDYWNoZUluaXQoJmhkci0+Y29sb3JfY2FjaGVfLCBjb2xvcl9jYWNoZV9iaXRzKSkgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgICAgb2sgPSAwOwotICAgICAgZ290byBFbmQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGhkci0+Y29sb3JfY2FjaGVfc2l6ZV8gPSAwOwotICB9Ci0gIFVwZGF0ZURlY29kZXIoZGVjLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSk7Ci0KLSAgaWYgKGlzX2xldmVsMCkgeyAgIC8vIGxldmVsIDAgY29tcGxldGUKLSAgICBkZWMtPnN0YXRlXyA9IFJFQURfSERSOwotICAgIGdvdG8gRW5kOwotICB9Ci0KLSAgewotICAgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSAodWludDY0X3QpdHJhbnNmb3JtX3hzaXplICogdHJhbnNmb3JtX3lzaXplOwotICAgIGRhdGEgPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqZGF0YSkpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgICAgIG9rID0gMDsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgfQotCi0gIC8vIFVzZSB0aGUgSHVmZm1hbiB0cmVlcyB0byBkZWNvZGUgdGhlIExaNzcgZW5jb2RlZCBkYXRhLgotICBvayA9IERlY29kZUltYWdlRGF0YShkZWMsIGRhdGEsIHRyYW5zZm9ybV94c2l6ZSwgdHJhbnNmb3JtX3lzaXplLCBOVUxMKTsKLSAgb2sgPSBvayAmJiAhYnItPmVycm9yXzsKLQotIEVuZDoKLQotICBpZiAoIW9rKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRhdGEpOwotICAgIENsZWFyTWV0YWRhdGEoaGRyKTsKLSAgICAvLyBJZiBub3QgZW5vdWdoIGRhdGEgKGJyLmVvc18pIHJlc3VsdGVkIGluIEJJVF9TVFJFQU1fRVJST1IsIHVwZGF0ZSB0aGUKLSAgICAvLyBzdGF0dXMgYXBwcm9wcmlhdGVseS4KLSAgICBpZiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SICYmIGRlYy0+YnJfLmVvc18pIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZGVjb2RlZF9kYXRhICE9IE5VTEwpIHsKLSAgICAgICpkZWNvZGVkX2RhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBXZSBhbGxvY2F0ZSBpbWFnZSBkYXRhIGluIHRoaXMgZnVuY3Rpb24gb25seSBmb3IgdHJhbnNmb3Jtcy4gQXQgbGV2ZWwgMAotICAgICAgLy8gKHRoYXQgaXM6IG5vdCB0aGUgdHJhbnNmb3JtcyksIHdlIHNob3VsZG4ndCBoYXZlIGFsbG9jYXRlZCBhbnl0aGluZy4KLSAgICAgIFNCX0RDSEVDSyhkYXRhID09IE5VTEwpOwotICAgICAgU0JfRENIRUNLKGlzX2xldmVsMCk7Ci0gICAgfQotICAgIGlmICghaXNfbGV2ZWwwKSBDbGVhck1ldGFkYXRhKGhkcik7ICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgZGF0YSBiZWhpbmQuCi0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycyBkZWMtPnBpeGVsc18gYW5kIGRlYy0+YXJnYl9jYWNoZV8uCi1zdGF0aWMgaW50IEFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBmaW5hbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzX3Blcl9waXhlbCkgewotICBjb25zdCBpbnQgYXJnYl9jYWNoZV9uZWVkZWQgPSAoYnl0ZXNfcGVyX3BpeGVsID09IHNpemVvZih1aW50MzJfdCkpOwotICBjb25zdCB1aW50NjRfdCBudW1fcGl4ZWxzID0gKHVpbnQ2NF90KWRlYy0+d2lkdGhfICogZGVjLT5oZWlnaHRfOwotICAvLyBTY3JhdGNoIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRvcC1wcmVkaWN0aW9uIHJvdyBmb3IgdHJhbnNmb3JtaW5nIHRoZQotICAvLyBmaXJzdCByb3cgaW4gdGhlIHJvdy1ibG9ja3MuIE5vdCBuZWVkZWQgZm9yIHBhbGV0dGVkIGFscGhhLgotICBjb25zdCB1aW50NjRfdCBjYWNoZV90b3BfcGl4ZWxzID0KLSAgICAgIGFyZ2JfY2FjaGVfbmVlZGVkID8gKHVpbnQxNl90KWZpbmFsX3dpZHRoIDogMFVMTDsKLSAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIHRlbXBvcmFyeSBCR1JBIHN0b3JhZ2UuIE5vdCBuZWVkZWQgZm9yIHBhbGV0dGVkIGFscGhhLgotICBjb25zdCB1aW50NjRfdCBjYWNoZV9waXhlbHMgPQotICAgICAgYXJnYl9jYWNoZV9uZWVkZWQgPyAodWludDY0X3QpZmluYWxfd2lkdGggKiBOVU1fQVJHQl9DQUNIRV9ST1dTIDogMFVMTDsKLSAgY29uc3QgdWludDY0X3QgdG90YWxfbnVtX3BpeGVscyA9Ci0gICAgICBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVscyArIGNhY2hlX3BpeGVsczsKLQotICBTQl9EQ0hFQ0soZGVjLT53aWR0aF8gPD0gZmluYWxfd2lkdGgpOwotICBkZWMtPnBpeGVsc18gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX251bV9waXhlbHMsIGJ5dGVzX3Blcl9waXhlbCk7Ci0gIGlmIChkZWMtPnBpeGVsc18gPT0gTlVMTCkgewotICAgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCi0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIHJldHVybiAwOwotICB9Ci0gIGRlYy0+YXJnYl9jYWNoZV8gPQotICAgICAgYXJnYl9jYWNoZV9uZWVkZWQgPyBkZWMtPnBpeGVsc18gKyBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVscyA6IE5VTEw7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTcGVjaWFsIHJvdy1wcm9jZXNzaW5nIHRoYXQgb25seSBzdG9yZXMgdGhlIGFscGhhIGRhdGEuCi1zdGF0aWMgdm9pZCBFeHRyYWN0QWxwaGFSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpIHsKLSAgY29uc3QgaW50IG51bV9yb3dzID0gcm93IC0gZGVjLT5sYXN0X3Jvd187Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZGVjLT5sYXN0X3Jvd187Ci0KLSAgaWYgKG51bV9yb3dzIDw9IDApIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZS4KLSAgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhkZWMsIG51bV9yb3dzLCBpbik7Ci0KLSAgLy8gRXh0cmFjdCBhbHBoYSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZSBncmVlbiBwbGFuZSkuCi0gIHsKLSAgICBjb25zdCBpbnQgd2lkdGggPSBkZWMtPmlvXy0+d2lkdGg7ICAgICAgLy8gdGhlIGZpbmFsIHdpZHRoICghPSBkZWMtPndpZHRoXykKLSAgICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IHdpZHRoICogbnVtX3Jvd3M7Ci0gICAgdWludDhfdCogY29uc3QgZHN0ID0gKHVpbnQ4X3QqKWRlYy0+aW9fLT5vcGFxdWUgKyB3aWR0aCAqIGRlYy0+bGFzdF9yb3dfOwotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBkZWMtPmFyZ2JfY2FjaGVfOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjYWNoZV9waXhzOyArK2kpIGRzdFtpXSA9IChzcmNbaV0gPj4gOCkgJiAweGZmOwotICB9Ci0gIGRlYy0+bGFzdF9yb3dfID0gZGVjLT5sYXN0X291dF9yb3dfID0gcm93OwotfQotCi0vLyBSb3ctcHJvY2Vzc2luZyBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3aGVuIGFscGhhIGRhdGEgY29udGFpbnMgb25seSBvbmUKLS8vIHRyYW5zZm9ybTogY29sb3IgaW5kZXhpbmcuCi1zdGF0aWMgdm9pZCBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdykgewotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPQotICAgICAgKHVpbnQ4X3QqKWRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZGVjLT5sYXN0X3Jvd187Ci0gIGlmIChudW1fcm93cyA8PSAwKSByZXR1cm47ICAvLyBOb3RoaW5nIHRvIGJlIGRvbmUuCi0gIEFwcGx5SW52ZXJzZVRyYW5zZm9ybXNBbHBoYShkZWMsIG51bV9yb3dzLCBpbik7Ci0gIGRlYy0+bGFzdF9yb3dfID0gZGVjLT5sYXN0X291dF9yb3dfID0gcm93OwotfQotCi1pbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCkgewotICBWUDhJbyBpbzsKLSAgaW50IG9rID0gMDsKLSAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOExOZXcoKTsKLSAgc2l6ZV90IGJ5dGVzX3Blcl9waXhlbCA9IHNpemVvZih1aW50MzJfdCk7ICAvLyBEZWZhdWx0OiBCR1JBIG1vZGUuCi0gIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgZGVjLT53aWR0aF8gPSB3aWR0aDsKLSAgZGVjLT5oZWlnaHRfID0gaGVpZ2h0OwotICBkZWMtPmlvXyA9ICZpbzsKLQotICBWUDhJbml0SW8oJmlvKTsKLSAgV2ViUEluaXRDdXN0b21JbyhOVUxMLCAmaW8pOyAgICAvLyBKdXN0IGEgc2FuaXR5IEluaXQuIGlvIHdvbid0IGJlIHVzZWQuCi0gIGlvLm9wYXF1ZSA9IG91dHB1dDsKLSAgaW8ud2lkdGggPSB3aWR0aDsKLSAgaW8uaGVpZ2h0ID0gaGVpZ2h0OwotCi0gIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT0s7Ci0gIFZQOExJbml0Qml0UmVhZGVyKCZkZWMtPmJyXywgZGF0YSwgZGF0YV9zaXplKTsKLQotICBkZWMtPmFjdGlvbl8gPSBSRUFEX0hEUjsKLSAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbSh3aWR0aCwgaGVpZ2h0LCAxLCBkZWMsIE5VTEwpKSBnb3RvIEVycjsKLQotICAvLyBTcGVjaWFsIGNhc2U6IGlmIGFscGhhIGRhdGEgdXNlcyBvbmx5IHRoZSBjb2xvciBpbmRleGluZyB0cmFuc2Zvcm0gYW5kCi0gIC8vIGRvZXNuJ3QgdXNlIGNvbG9yIGNhY2hlIChhIGZyZXF1ZW50IGNhc2UpLCB3ZSB3aWxsIHVzZSBEZWNvZGVBbHBoYURhdGEoKQotICAvLyBtZXRob2QgdGhhdCBvbmx5IG5lZWRzIGFsbG9jYXRpb24gb2YgMSBieXRlIHBlciBwaXhlbCAoYWxwaGEgY2hhbm5lbCkuCi0gIGlmIChkZWMtPm5leHRfdHJhbnNmb3JtXyA9PSAxICYmCi0gICAgICBkZWMtPnRyYW5zZm9ybXNfWzBdLnR5cGVfID09IENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSAmJgotICAgICAgZGVjLT5oZHJfLmNvbG9yX2NhY2hlX3NpemVfID09IDApIHsKLSAgICBieXRlc19wZXJfcGl4ZWwgPSBzaXplb2YodWludDhfdCk7Ci0gIH0KLQotICAvLyBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzIChub3RlIHRoYXQgZGVjLT53aWR0aF8gbWF5IGhhdmUgY2hhbmdlZCBoZXJlKS4KLSAgaWYgKCFBbGxvY2F0ZUludGVybmFsQnVmZmVycyhkZWMsIHdpZHRoLCBieXRlc19wZXJfcGl4ZWwpKSBnb3RvIEVycjsKLQotICAvLyBEZWNvZGUgKHdpdGggc3BlY2lhbCByb3cgcHJvY2Vzc2luZykuCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfREFUQTsKLSAgb2sgPSAoYnl0ZXNfcGVyX3BpeGVsID09IHNpemVvZih1aW50OF90KSkgPwotICAgICAgRGVjb2RlQWxwaGFEYXRhKGRlYywgKHVpbnQ4X3QqKWRlYy0+cGl4ZWxzXywgZGVjLT53aWR0aF8sIGRlYy0+aGVpZ2h0XywKLSAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MpIDoKLSAgICAgIERlY29kZUltYWdlRGF0YShkZWMsIGRlYy0+cGl4ZWxzXywgZGVjLT53aWR0aF8sIGRlYy0+aGVpZ2h0XywKLSAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0QWxwaGFSb3dzKTsKLQotIEVycjoKLSAgVlA4TERlbGV0ZShkZWMpOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhMRGVjb2RlSGVhZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICBpbnQgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhOwotCi0gIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChpbyA9PSBOVUxMKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZGVjLT5pb18gPSBpbzsKLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBpby0+ZGF0YSwgaW8tPmRhdGFfc2l6ZSk7Ci0gIGlmICghUmVhZEltYWdlSW5mbygmZGVjLT5icl8sICZ3aWR0aCwgJmhlaWdodCwgJmhhc19hbHBoYSkpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07Ci0gIGlvLT53aWR0aCA9IHdpZHRoOwotICBpby0+aGVpZ2h0ID0gaGVpZ2h0OwotCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfSERSOwotICBpZiAoIURlY29kZUltYWdlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIDEsIGRlYywgTlVMTCkpIGdvdG8gRXJyb3I7Ci0gIHJldHVybiAxOwotCi0gRXJyb3I6Ci0gIFZQOExDbGVhcihkZWMpOwotICBTQl9EQ0hFQ0soZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOwotICByZXR1cm4gMDsKLX0KLQotaW50IFZQOExEZWNvZGVJbWFnZShWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGNvbnN0IHNpemVfdCBieXRlc19wZXJfcGl4ZWwgPSBzaXplb2YodWludDMyX3QpOwotICBWUDhJbyogaW8gPSBOVUxMOwotICBXZWJQRGVjUGFyYW1zKiBwYXJhbXMgPSBOVUxMOwotCi0gIC8vIFNhbml0eSBjaGVja3MuCi0gIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgaW8gPSBkZWMtPmlvXzsKLSAgU0JfRENIRUNLKGlvICE9IE5VTEwpOwotICBwYXJhbXMgPSAoV2ViUERlY1BhcmFtcyopaW8tPm9wYXF1ZTsKLSAgU0JfRENIRUNLKHBhcmFtcyAhPSBOVUxMKTsKLSAgZGVjLT5vdXRwdXRfID0gcGFyYW1zLT5vdXRwdXQ7Ci0gIFNCX0RDSEVDSyhkZWMtPm91dHB1dF8gIT0gTlVMTCk7Ci0KLSAgLy8gSW5pdGlhbGl6YXRpb24uCi0gIGlmICghV2ViUElvSW5pdEZyb21PcHRpb25zKHBhcmFtcy0+b3B0aW9ucywgaW8sIE1PREVfQkdSQSkpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gICAgZ290byBFcnI7Ci0gIH0KLQotICBpZiAoIUFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzKGRlYywgaW8tPndpZHRoLCBieXRlc19wZXJfcGl4ZWwpKSBnb3RvIEVycjsKLQotICBpZiAoaW8tPnVzZV9zY2FsaW5nICYmICFBbGxvY2F0ZUFuZEluaXRSZXNjYWxlcihkZWMsIGlvKSkgZ290byBFcnI7Ci0KLSAgLy8gRGVjb2RlLgotICBkZWMtPmFjdGlvbl8gPSBSRUFEX0RBVEE7Ci0gIGlmICghRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzUm93cykpIHsKLSAgICBnb3RvIEVycjsKLSAgfQotCi0gIC8vIENsZWFudXAuCi0gIHBhcmFtcy0+bGFzdF95ID0gZGVjLT5sYXN0X291dF9yb3dfOwotICBWUDhMQ2xlYXIoZGVjKTsKLSAgcmV0dXJuIDE7Ci0KLSBFcnI6Ci0gIFZQOExDbGVhcihkZWMpOwotICBTQl9EQ0hFQ0soZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOwotICByZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjIzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1JFQURNRQpAQCAtMCwwICsxLDI5IEBACisKK0dlbmVyYXRlIGxpYndlYnAgQ29udGFpbmVyIFNwZWMgRG9jcyBmcm9tIFRleHQgU291cmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIVE1MIGdlbmVyYXRpb24gcmVxdWlyZXMga3JhbWRvd24gWzFdLCBlYXNpbHkgaW5zdGFsbGVkIGFzIGEKK3J1YnlnZW0gWzJdLiAgUnVieWdlbXMgaW5zdGFsbGF0aW9uIHNob3VsZCBzYXRpc2Z5IGRlcGVuZGVuY2llcworYXV0b21hdGljYWxseS4KKworWzFdOiBodHRwOi8va3JhbWRvd24ucnVieWZvcmdlLm9yZy8KK1syXTogaHR0cDovL3J1YnlnZW1zLm9yZy8KKworSFRNTCBnZW5lcmF0aW9uIGNhbiB0aGVuIGJlIGRvbmUgZnJvbSB0aGUgcHJvamVjdCByb290OgorCiskIGtyYW1kb3duIGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dCAtLXRlbXBsYXRlIGRvYy90ZW1wbGF0ZS5odG1sID4gXAorICBkb2Mvb3V0cHV0L3dlYnAtY29udGFpbmVyLXNwZWMuaHRtbAorCitrcmFtZG93biBjYW4gb3B0aW9uYWxseSBzeW50YXggaGlnaGxpZ2h0IGNvZGUgYmxvY2tzLCB1c2luZyBDb2RlUmF5IFszXSwKK2EgZGVwZW5kZW5jeSBvZiBrcmFtZG93biB0aGF0IHJ1YnlnZW1zIHdpbGwgaW5zdGFsbCBhdXRvbWF0aWNhbGx5LiAgVGhlCitmb2xsb3dpbmcgd2lsbCBhcHBseSBpbmxpbmUgQ1NTIHN0eWxpbmc7IGFuIGV4dGVybmFsIHN0eWxlc2hlZXQgaXMgbm90CituZWVkZWQuCisKKyQga3JhbWRvd24gZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0IC0tdGVtcGxhdGUgXAorICBkb2MvdGVtcGxhdGUuaHRtbCAtLWNvZGVyYXktY3NzIHN0eWxlIC0tY29kZXJheS1saW5lLW51bWJlcnMgJyAnIFwKKyAgLS1jb2RlcmF5LWRlZmF1bHQtbGFuZyBjID4gXAorICBkb2Mvb3V0cHV0L3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMuaHRtbAorCitPcHRpbWFsbHksIHVzZSBrcmFtZG93biAwLjEzLjcgb3IgbmV3ZXIgaWYgc3ludGF4IGhpZ2hsaWdodGluZyBkZXNpcmVkLgorCitbM106IGh0dHA6Ly9jb2RlcmF5LnJ1YnljaGFuLmRlLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1RPRE8gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE5MzgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1RPRE8KQEAgLTAsMCArMSwxMyBAQAorPGxvdXF1aWxsaW9AZ29vZ2xlLmNvbT4sIDIwMTExMDA0CisKKyogRGV0ZXJtaW5lIHRoYXQgbm9ybWF0aXZlIFJGQyAyMTE5IHRlcm1zIChNVVNULCBTSE9VTEQsIE1BWSwgZXRjLikgYXJlCisgIHRydWx5IGludGVuZGVkIGluIGFsbCBjYXNlcyB3aGVyZSBjYXBpdGFsaXplZC4KKworKiBTZXZlcmFsIHBhc3NhZ2VzIGNvdWxkIGJlIG1hZGUgY2xlYXJlci4KKworICAqIE92ZXJhbGwgZWRpdCBmb3Igc2NvcGUuICBQb3J0aW9ucyBhcmUgcGhyYXNlZCBhcyBhbiBpbnRyb2R1Y3Rpb24gdG8KKyAgICB0aGUgMC4xLjMgUklGRiBjb250YWluZXIgYWRkaXRpb25zLCByYXRoZXIgdGhhbiBhIGhvbGlzdGljIGd1aWRlIHRvCisgICAgV2ViUC4KKworICAqIFRvIHdpdCwgc3VnZ2VzdCBzL1tzcGVjfHNwZWNpZmljYXRpb25dL2d1aWRlL2cgLiAgIlNwZWMiIGNhbiBpbXBseSBhCisgICAgc3RhbmRhcmRzIHRyYWNrOyBpbiBhbnkgY2FzZSBpdCdzIHRvbyBmb3JtYWwgZm9yIGEgd29yayBpbiBwcm9ncmVzcy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy90ZW1wbGF0ZS5odG1sIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3RlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYzI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy90ZW1wbGF0ZS5odG1sCkBAIC0wLDAgKzEsOTQgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgPHRpdGxlPldlYlAgQ29udGFpbmVyIFNwZWNpZmljYXRpb248L3RpdGxlPgorICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImtyYW1kb3duIDwlPSA6OktyYW1kb3duOjpWRVJTSU9OICU+IiAvPgorICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICBib2R5IHsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgIG1hcmdpbjogMTAlOworICAgIGZvbnQtZmFtaWx5OiAiTGliZXJhdGlvbiBTYW5zIiwgIkRlamFWdSBTYW5zIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgICBsaW5lLWhlaWdodDogMS40OworICB9CisgIGgyIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYzsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgfQorICB0YWJsZSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgfQorICB0aCwgdGQgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CisgICAgcGFkZGluZzogLjVlbSAuN2VtOzsKKyAgfQorICB0aCB7CisgICAgY29sb3I6ICNmZmY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgfQorICB0ZCB7CisgIH0KKyAgaHIgeworICB9CisgIGNvZGUgeworICAgIGNvbG9yOiAjMDAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgICAgcGFkZGluZzogMCAzcHg7CisgICAgZm9udC1mYW1pbHk6ICJMaWJlcmF0aW9uIE1vbm8iLCAiRGVqYVZ1IFNhbnMgTW9ubyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCBDb25zb2xhdGEsIG1vbm9zcGFjZTsKKyAgfQorICBwcmUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgICAgcGFkZGluZzogMWVtOworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgICAgd2lkdGg6IDQyZW07CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgZm9udC1mYW1pbHk6ICJMaWJlcmF0aW9uIE1vbm8iLCAiRGVqYVZ1IFNhbnMgTW9ubyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCBDb25zb2xhdGEsIG1vbm9zcGFjZTsKKyAgfQorICBwcmUgY29kZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgICBwYWRkaW5nOiAwOyAvKiBPbmx5IHdhbnQgcGFkZGluZyBvbiBpbmxpbmUgY29kZSwgbm90IGJsb2NrcyAqLworICB9CisgIHByZS50ZXJtaW5hbCB7CisgICAgY29sb3I6ICNmZmY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgIG1heC1oZWlnaHQ6IDMwZW07CisgIH0KKyAgcHJlLnRlcm1pbmFsIGNvZGUgeworICAgIGNvbG9yOiAjZmZmOworICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7CisgICAgZm9udC1zaXplOiBzbWFsbGVyOworICB9CisgICNtYXJrZG93bi10b2MgdWwgeworICAgIGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgeworICAgIG1hcmdpbi10b3A6IC0xZW07CisgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICAgIC13ZWJraXQtcGFkZGluZy1zdGFydDogMDsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgdWwgeworICAgIHZpc2liaWxpdHk6IHZpc2libGU7CisgIH0KKyAgdWwjbWFya2Rvd24tdG9jIHVsIHVseworICAgIHZpc2liaWxpdHk6IHZpc2libGU7CisgIH0KKyAgdWwjbWFya2Rvd24tdG9jICsgaHIgeworICAgIG1hcmdpbi1ib3R0b206IDRlbTsKKyAgfQorICBvbCBvbCB7IC8qIEZvcm1hdCBuZXN0ZWQgb3JkZXJlZCBsaXN0cyAqLworICAgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7CisgIH0KKyAgZHQgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgfQorICAuY2FwdGlvbiB7CisgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPCU9IEBib2R5ICU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhN2NhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dApAQCAtMCwwICsxLDgyMyBAQAorPCEtLQorCitBbHRob3VnaCB5b3UgbWF5IGJlIHZpZXdpbmcgYW4gYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uLCB0aGlzIGRvY3VtZW50CitpcyBzb3VyY2VkIGluIE1hcmtkb3duLCBhIGxpZ2h0LWR1dHkgbWFya3VwIHNjaGVtZSwgYW5kIGlzIG9wdGltaXplZCBmb3IKK3RoZSBba3JhbWRvd25dKGh0dHA6Ly9rcmFtZG93bi5ydWJ5Zm9yZ2Uub3JnLykgdHJhbnNmb3JtZXIuCisKK1NlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRS4gRXh0ZXJuYWwgbGluayB0YXJnZXRzIGFyZSByZWZlcmVuY2VkIGF0IHRoZQorZW5kIG9mIHRoaXMgZmlsZS4KKworLS0+CisKKworV2ViUCBDb250YWluZXIgU3BlY2lmaWNhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIFRPQyBwbGFjZWhvbGRlcgorezp0b2N9CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworV2ViUCBpcyBhbiBpbWFnZSBmb3JtYXQgdGhhdCB1c2VzIGVpdGhlciAoaSkgdGhlIFZQOCBrZXkgZnJhbWUgZW5jb2RpbmcKK3RvIGNvbXByZXNzIGltYWdlIGRhdGEgaW4gYSBsb3NzeSB3YXksIG9yIChpaSkgdGhlIFdlYlAgbG9zc2xlc3MgZW5jb2RpbmcKKyhhbmQgcG9zc2libHkgb3RoZXIgZW5jb2RpbmdzIGluIHRoZSBmdXR1cmUpLiBUaGVzZSBlbmNvZGluZyBzY2hlbWVzIHNob3VsZAorbWFrZSBpdCBtb3JlIGVmZmljaWVudCB0aGFuIGN1cnJlbnRseSB1c2VkIGZvcm1hdHMuIEl0IGlzIG9wdGltaXplZCBmb3IgZmFzdAoraW1hZ2UgdHJhbnNmZXIgb3ZlciB0aGUgbmV0d29yayAoZS5nLiwgZm9yIHdlYnNpdGVzKS4gVGhlIFdlYlAgZm9ybWF0IGhhcworZmVhdHVyZSBwYXJpdHkgKGNvbG9yIHByb2ZpbGUsIG1ldGFkYXRhLCBhbmltYXRpb24gZXRjKSB3aXRoIG90aGVyIGZvcm1hdHMgYXMKK3dlbGwuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBXZWJQIGZpbGUuCisKK1RoZSBXZWJQIGNvbnRhaW5lciAoaS5lLiwgUklGRiBjb250YWluZXIgZm9yIFdlYlApIGFsbG93cyBmZWF0dXJlIHN1cHBvcnQgb3ZlcgorYW5kIGFib3ZlIHRoZSBiYXNpYyB1c2UgY2FzZSBvZiBXZWJQIChpLmUuLCBhIGZpbGUgY29udGFpbmluZyBhIHNpbmdsZSBpbWFnZQorZW5jb2RlZCBhcyBhIFZQOCBrZXkgZnJhbWUpLiBUaGUgV2ViUCBjb250YWluZXIgcHJvdmlkZXMgYWRkaXRpb25hbCBzdXBwb3J0Citmb3I6CisKKyAgKiAqKkxvc3NsZXNzIGNvbXByZXNzaW9uLioqIEFuIGltYWdlIGNhbiBiZSBsb3NzbGVzc2x5IGNvbXByZXNzZWQsIHVzaW5nIHRoZQorICAgIFdlYlAgTG9zc2xlc3MgRm9ybWF0LgorCisgICogKipNZXRhZGF0YS4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBtZXRhZGF0YSBzdG9yZWQgaW4gRVhJRiBvciBYTVAgZm9ybWF0cy4KKworICAqICoqVHJhbnNwYXJlbmN5LioqIEFuIGltYWdlIG1heSBoYXZlIHRyYW5zcGFyZW5jeSwgaS5lLiwgYW4gYWxwaGEgY2hhbm5lbC4KKworICAqICoqQ29sb3IgUHJvZmlsZS4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBhbiBlbWJlZGRlZCBJQ0MgcHJvZmlsZSBhcyBkZXNjcmliZWQKKyAgICBieSB0aGUgW0ludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bV1baWNjc3BlY10uCisKKyAgKiAqKkFuaW1hdGlvbi4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBtdWx0aXBsZSBmcmFtZXMgd2l0aCBwYXVzZXMgYmV0d2VlbiB0aGVtLAorICAgIG1ha2luZyBpdCBhbiBhbmltYXRpb24uCisKK1RoZSBrZXkgd29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwKKyJTSE9VTEQiLCAiU0hPVUxEIE5PVCIsICJSRUNPTU1FTkRFRCIsICJNQVkiLCBhbmQgIk9QVElPTkFMIiBpbiB0aGlzCitkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFtSRkMgMjExOV1bXS4KKworQml0IG51bWJlcmluZyBpbiBjaHVuayBkaWFncmFtcyBzdGFydHMgYXQgYDBgIGZvciB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQKKygnTVNCIDAnKSBhcyBkZXNjcmliZWQgaW4gW1JGQyAxMTY2XVtdLgorCisqKk5vdGU6KiogT3V0IG9mIHRoZSBmZWF0dXJlcyBtZW50aW9uZWQgYWJvdmUsIGxvc3N5IGNvbXByZXNzaW9uLCBsb3NzbGVzcworY29tcHJlc3Npb24sIHRyYW5zcGFyZW5jeSwgbWV0YWRhdGEsIGNvbG9yIHByb2ZpbGUgYW5kIGFuaW1hdGlvbiBhcmUgZmluYWxpemVkCithbmQgYXJlIHRvIGJlIGNvbnNpZGVyZWQgc3RhYmxlLgorCitUZXJtaW5vbG9neSAmYW1wOyBCYXNpY3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIFdlYlAgZmlsZSBjb250YWlucyBlaXRoZXIgYSBzdGlsbCBpbWFnZSAoaS5lLiwgYW4gZW5jb2RlZCBtYXRyaXggb2YgcGl4ZWxzKQorb3IgYW4gW2FuaW1hdGlvbl0oI2FuaW1hdGlvbikuIE9wdGlvbmFsbHksIGl0IGNhbiBhbHNvIGNvbnRhaW4gdHJhbnNwYXJlbmN5CitpbmZvcm1hdGlvbiwgY29sb3IgcHJvZmlsZSBhbmQgbWV0YWRhdGEuIEluIGNhc2Ugd2UgbmVlZCB0byByZWZlciBvbmx5IHRvIHRoZQorbWF0cml4IG9mIHBpeGVscywgd2Ugd2lsbCBjYWxsIGl0IHRoZSBfY2FudmFzXyBvZiB0aGUgaW1hZ2UuCisKK0JlbG93IGFyZSBhZGRpdGlvbmFsIHRlcm1zIHVzZWQgdGhyb3VnaG91dCB0aGlzIGRvY3VtZW50OgorCitfUmVhZGVyL1dyaXRlcl8KKworOiBDb2RlIHRoYXQgcmVhZHMgV2ViUCBmaWxlcyBpcyByZWZlcnJlZCB0byBhcyBhIF9yZWFkZXJfLCB3aGlsZSBjb2RlIHRoYXQKKyAgd3JpdGVzIHRoZW0gaXMgcmVmZXJyZWQgdG8gYXMgYSBfd3JpdGVyXy4KKworX3VpbnQxNl8KKworOiBBIDE2LWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX3VpbnQyNF8KKworOiBBIDI0LWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX3VpbnQzMl8KKworOiBBIDMyLWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX0ZvdXJDQ18KKworOiBBIF9Gb3VyQ0NfIChmb3VyLWNoYXJhY3RlciBjb2RlKSBpcyBhIF91aW50MzJfIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyBmb3VyCisgIEFTQ0lJIGNoYXJhY3RlcnMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KKworXzEtYmFzZWRfCisKKzogQW4gdW5zaWduZWQgaW50ZWdlciBmaWVsZCBzdG9yaW5nIHZhbHVlcyBvZmZzZXQgYnkgYC0xYC4gZS5nLiwgU3VjaCBhIGZpZWxkCisgIHdvdWxkIHN0b3JlIHZhbHVlIF8yNV8gYXMgXzI0Xy4KKworCitSSUZGIEZpbGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBXZWJQIGZpbGUgZm9ybWF0IGlzIGJhc2VkIG9uIHRoZSBSSUZGIChyZXNvdXJjZSBpbnRlcmNoYW5nZSBmaWxlIGZvcm1hdCkKK2RvY3VtZW50IGZvcm1hdC4KKworVGhlIGJhc2ljIGVsZW1lbnQgb2YgYSBSSUZGIGZpbGUgaXMgYSBfY2h1bmtfLiBJdCBjb25zaXN0cyBvZjoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBDaHVuayBGb3VyQ0MgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rIFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rIFBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0NodW5rIEZvdXJDQzogMzIgYml0cworCis6IEFTQ0lJIGZvdXItY2hhcmFjdGVyIGNvZGUgdXNlZCBmb3IgY2h1bmsgaWRlbnRpZmljYXRpb24uCisKK0NodW5rIFNpemU6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBzaXplIG9mIHRoZSBjaHVuayBub3QgaW5jbHVkaW5nIHRoaXMgZmllbGQsIHRoZSBjaHVuayBpZGVudGlmaWVyIG9yCisgIHBhZGRpbmcuCisKK0NodW5rIFBheWxvYWQ6IF9DaHVuayBTaXplXyBieXRlcworCis6IFRoZSBkYXRhIHBheWxvYWQuIElmIF9DaHVuayBTaXplXyBpcyBvZGQsIGEgc2luZ2xlIHBhZGRpbmcgYnl0ZSAtLSB0aGF0CisgIFNIT1VMRCBiZSBgMGAgLS0gaXMgYWRkZWQuCisKK19DaHVua0hlYWRlcignQUJDRCcpXworCis6IFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgX0ZvdXJDQ18gYW5kIF9DaHVuayBTaXplXyBoZWFkZXIgb2YgaW5kaXZpZHVhbAorICBjaHVua3MsIHdoZXJlICdBQkNEJyBpcyB0aGUgRm91ckNDIGZvciB0aGUgY2h1bmsuIFRoaXMgZWxlbWVudCdzCisgIHNpemUgaXMgOCBieXRlcy4KKworKipOb3RlOioqIFJJRkYgaGFzIGEgY29udmVudGlvbiB0aGF0IGFsbC11cHBlcmNhc2UgY2h1bmsgRm91ckNDcyBhcmUgc3RhbmRhcmQKK2NodW5rcyB0aGF0IGFwcGx5IHRvIGFueSBSSUZGIGZpbGUgZm9ybWF0LCB3aGlsZSBGb3VyQ0NzIHNwZWNpZmljIHRvIGEgZmlsZQorZm9ybWF0IGFyZSBhbGwgbG93ZXJjYXNlLiBXZWJQIGRvZXMgbm90IGZvbGxvdyB0aGlzIGNvbnZlbnRpb24uCisKKworV2ViUCBGaWxlIEhlYWRlcgorLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgJ1InICAgICAgfCAgICAgICdJJyAgICAgIHwgICAgICAnRicgICAgICB8ICAgICAgJ0YnICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAnVycgICAgICB8ICAgICAgJ0UnICAgICAgfCAgICAgICdCJyAgICAgIHwgICAgICAnUCcgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworJ1JJRkYnOiAzMiBiaXRzCisKKzogVGhlIEFTQ0lJIGNoYXJhY3RlcnMgJ1InICdJJyAnRicgJ0YnLgorCitGaWxlIFNpemU6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCA4LiBUaGUgbWF4aW11bSB2YWx1ZSBvZgorICB0aGlzIGZpZWxkIGlzIDJeMzIgbWludXMgMTAgYnl0ZXMgYW5kIHRodXMgdGhlIHNpemUgb2YgdGhlIHdob2xlIGZpbGUgaXMgYXQKKyAgbW9zdCA0R2lCIG1pbnVzIDIgYnl0ZXMuCisKKydXRUJQJzogMzIgYml0cworCis6IFRoZSBBU0NJSSBjaGFyYWN0ZXJzICdXJyAnRScgJ0InICdQJy4KKworQSBXZWJQIGZpbGUgTVVTVCBiZWdpbiB3aXRoIGEgUklGRiBoZWFkZXIgd2l0aCB0aGUgRm91ckNDICdXRUJQJy4gVGhlIGZpbGUgc2l6ZQoraW4gdGhlIGhlYWRlciBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoYXQgZm9sbG93IHBsdXMgYDRgIGJ5dGVzIGZvcgordGhlICdXRUJQJyBGb3VyQ0MuIFRoZSBmaWxlIFNIT1VMRCBOT1QgY29udGFpbiBhbnl0aGluZyBhZnRlciBpdC4gQXMgdGhlIHNpemUKK29mIGFueSBjaHVuayBpcyBldmVuLCB0aGUgc2l6ZSBnaXZlbiBieSB0aGUgUklGRiBoZWFkZXIgaXMgYWxzbyBldmVuLiBUaGUKK2NvbnRlbnRzIG9mIGluZGl2aWR1YWwgY2h1bmtzIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisKKworU2ltcGxlIEZpbGUgRm9ybWF0IChMb3NzeSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgbGF5b3V0IFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBpbWFnZSByZXF1aXJlcyBfbG9zc3lfIGVuY29kaW5nIGFuZCBkb2VzIG5vdAorcmVxdWlyZSB0cmFuc3BhcmVuY3kgb3Igb3RoZXIgYWR2YW5jZWQgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlIGV4dGVuZGVkIGZvcm1hdC4KK0ZpbGVzIHdpdGggdGhpcyBsYXlvdXQgYXJlIHNtYWxsZXIgYW5kIHN1cHBvcnRlZCBieSBvbGRlciBzb2Z0d2FyZS4KKworU2ltcGxlIFdlYlAgKGxvc3N5KSBmaWxlIGZvcm1hdDoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgV2ViUCBmaWxlIGhlYWRlciAoMTIgYnl0ZXMpICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOCBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworVlA4IGNodW5rOgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIENodW5rSGVhZGVyKCdWUDggJykgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitWUDggZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogVlA4IGJpdHN0cmVhbSBkYXRhLgorCitUaGUgVlA4IGJpdHN0cmVhbSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQgW1ZQOCBEYXRhIEZvcm1hdCBhbmQKK0RlY29kaW5nIEd1aWRlXVt2cDhzcGVjXS4gTm90ZSB0aGF0IHRoZSBWUDggZnJhbWUgaGVhZGVyIGNvbnRhaW5zIHRoZSBWUDggZnJhbWUKK3dpZHRoIGFuZCBoZWlnaHQuIFRoYXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2FudmFzLgorCitUaGUgVlA4IHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWNvZGUgdGhlIGltYWdlIGludG8gWSdDYkNyCitmb3JtYXQuIFRvIGNvbnZlcnQgdG8gUkdCLCBSZWMuIDYwMSBTSE9VTEQgYmUgdXNlZC4KKworCitTaW1wbGUgRmlsZSBGb3JtYXQgKExvc3NsZXNzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKipOb3RlOioqIE9sZGVyIHJlYWRlcnMgbWF5IG5vdCBzdXBwb3J0IGZpbGVzIHVzaW5nIHRoZSBsb3NzbGVzcyBmb3JtYXQuCisKK1RoaXMgbGF5b3V0IFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBpbWFnZSByZXF1aXJlcyBfbG9zc2xlc3NfIGVuY29kaW5nICh3aXRoIGFuCitvcHRpb25hbCB0cmFuc3BhcmVuY3kgY2hhbm5lbCkgYW5kIGRvZXMgbm90IHJlcXVpcmUgYWR2YW5jZWQgZmVhdHVyZXMgcHJvdmlkZWQKK2J5IHRoZSBleHRlbmRlZCBmb3JtYXQuCisKK1NpbXBsZSBXZWJQIChsb3NzbGVzcykgZmlsZSBmb3JtYXQ6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgIFdlYlAgZmlsZSBoZWFkZXIgKDEyIGJ5dGVzKSAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1ZQOEwgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1ZQOEwnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1ZQOEwgZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogVlA4TCBiaXRzdHJlYW0gZGF0YS4KKworVGhlIGN1cnJlbnQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgVlA4TCBiaXRzdHJlYW0gY2FuIGJlIGZvdW5kIGF0CitbV2ViUCBMb3NzbGVzcyBCaXRzdHJlYW0gRm9ybWF0XVt3ZWJwbGxzcGVjXS4gTm90ZSB0aGF0IHRoZSBWUDhMIGhlYWRlcgorY29udGFpbnMgdGhlIFZQOEwgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodC4gVGhhdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSB3aWR0aAorYW5kIGhlaWdodCBvZiB0aGUgY2FudmFzLgorCisKK0V4dGVuZGVkIEZpbGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqKk5vdGU6KiogT2xkZXIgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmlsZXMgdXNpbmcgdGhlIGV4dGVuZGVkIGZvcm1hdC4KKworQW4gZXh0ZW5kZWQgZm9ybWF0IGZpbGUgY29uc2lzdHMgb2Y6CisKKyAgKiBBICdWUDhYJyBjaHVuayB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGZlYXR1cmVzIHVzZWQgaW4gdGhlIGZpbGUuCisKKyAgKiBBbiBvcHRpb25hbCAnSUNDUCcgY2h1bmsgd2l0aCBjb2xvciBwcm9maWxlLgorCisgICogQW4gb3B0aW9uYWwgJ0FOSU0nIGNodW5rIHdpdGggYW5pbWF0aW9uIGNvbnRyb2wgZGF0YS4KKworICAqIEltYWdlIGRhdGEuCisKKyAgKiBBbiBvcHRpb25hbCAnRVhJRicgY2h1bmsgd2l0aCBFWElGIG1ldGFkYXRhLgorCisgICogQW4gb3B0aW9uYWwgJ1hNUCAnIGNodW5rIHdpdGggWE1QIG1ldGFkYXRhLgorCisgICogQW4gb3B0aW9uYWwgbGlzdCBvZiBbdW5rbm93biBjaHVua3NdKCN1bmtub3duLWNodW5rcykuIF9cW3N0YXR1czogZXhwZXJpbWVudGFsXF1fCisKK0ZvciBhIF9zdGlsbCBpbWFnZV8sIHRoZSBfaW1hZ2UgZGF0YV8gY29uc2lzdHMgb2YgYSBzaW5nbGUgZnJhbWUsIHdoaWNoIGlzIG1hZGUKK3VwIG9mOgorCisgICogQW4gb3B0aW9uYWwgW2FscGhhIHN1YmNodW5rXSgjYWxwaGEpLgorCisgICogQSBbYml0c3RyZWFtIHN1YmNodW5rXSgjYml0c3RyZWFtLXZwOHZwOGwpLgorCitGb3IgYW4gX2FuaW1hdGVkIGltYWdlXywgdGhlIF9pbWFnZSBkYXRhXyBjb25zaXN0cyBvZiBtdWx0aXBsZSBmcmFtZXMuIE1vcmUKK2RldGFpbHMgYWJvdXQgZnJhbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0FuaW1hdGlvbl0oI2FuaW1hdGlvbikgc2VjdGlvbi4KKworQWxsIGNodW5rcyBTSE9VTEQgYmUgcGxhY2VkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGxpc3RlZCBhYm92ZS4gSWYgYSBjaHVuaworYXBwZWFycyBpbiB0aGUgd3JvbmcgcGxhY2UsIHRoZSBmaWxlIGlzIGludmFsaWQsIGJ1dCByZWFkZXJzIE1BWSBwYXJzZSB0aGUKK2ZpbGUsIGlnbm9yaW5nIHRoZSBjaHVua3MgdGhhdCBjb21lIHRvbyBsYXRlLgorCisqKlJhdGlvbmFsZToqKiBTZXR0aW5nIHRoZSBvcmRlciBvZiBjaHVua3Mgc2hvdWxkIGFsbG93IHF1aWNrZXIgZmlsZQorcGFyc2luZy4gRm9yIGV4YW1wbGUsIGlmIGFuICdBTFBIJyBjaHVuayBkb2VzIG5vdCBhcHBlYXIgaW4gaXRzIHJlcXVpcmVkCitwb3NpdGlvbiwgYSBkZWNvZGVyIGNhbiBjaG9vc2UgdG8gc3RvcCBzZWFyY2hpbmcgZm9yIGl0LiBUaGUgcnVsZSBvZgoraWdub3JpbmcgbGF0ZSBjaHVua3Mgc2hvdWxkIG1ha2UgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGRvIGEgZnVsbCBzZWFyY2gKK2dpdmUgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lcyBzdG9wcGluZyBlYXJseS4KKworRXh0ZW5kZWQgV2ViUCBmaWxlIGhlYWRlcjoKK3s6I2V4dGVuZGVkX2hlYWRlcn0KKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICBXZWJQIGZpbGUgaGVhZGVyICgxMiBieXRlcykgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1ZQOFgnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8UnN2fEl8THxFfFh8QXxSfCAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICBDYW52YXMgV2lkdGggTWludXMgT25lICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuLi4KKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIC4uLiAgQ2FudmFzIEhlaWdodCBNaW51cyBPbmUgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitSZXNlcnZlZCAoUnN2KTogMiBiaXRzCisKKzogU0hPVUxEIGJlIGAwYC4KKworSUNDIHByb2ZpbGUgKEkpOiAxIGJpdAorCis6IFNldCBpZiB0aGUgZmlsZSBjb250YWlucyBhbiBJQ0MgcHJvZmlsZS4KKworQWxwaGEgKEwpOiAxIGJpdAorCis6IFNldCBpZiBhbnkgb2YgdGhlIGZyYW1lcyBvZiB0aGUgaW1hZ2UgY29udGFpbiB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24KKyAgKCJhbHBoYSIpLgorCitFWElGIG1ldGFkYXRhIChFKTogMSBiaXQKKworOiBTZXQgaWYgdGhlIGZpbGUgY29udGFpbnMgRVhJRiBtZXRhZGF0YS4KKworWE1QIG1ldGFkYXRhIChYKTogMSBiaXQKKworOiBTZXQgaWYgdGhlIGZpbGUgY29udGFpbnMgWE1QIG1ldGFkYXRhLgorCitBbmltYXRpb24gKEEpOiAxIGJpdAorCis6IFNldCBpZiB0aGlzIGlzIGFuIGFuaW1hdGVkIGltYWdlLiBEYXRhIGluICdBTklNJyBhbmQgJ0FOTUYnIGNodW5rcyBzaG91bGQgYmUKKyAgdXNlZCB0byBjb250cm9sIHRoZSBhbmltYXRpb24uCisKK1Jlc2VydmVkIChSKTogMSBiaXQKKworOiBTSE9VTEQgYmUgYDBgLgorCitSZXNlcnZlZDogMjQgYml0cworCis6IFNIT1VMRCBiZSBgMGAuCisKK0NhbnZhcyBXaWR0aCBNaW51cyBPbmU6IDI0IGJpdHMKKworOiBfMS1iYXNlZF8gd2lkdGggb2YgdGhlIGNhbnZhcyBpbiBwaXhlbHMuCisgIFRoZSBhY3R1YWwgY2FudmFzIHdpZHRoIGlzICcxICsgQ2FudmFzIFdpZHRoIE1pbnVzIE9uZScKKworQ2FudmFzIEhlaWdodCBNaW51cyBPbmU6IDI0IGJpdHMKKworOiBfMS1iYXNlZF8gaGVpZ2h0IG9mIHRoZSBjYW52YXMgaW4gcGl4ZWxzLgorICBUaGUgYWN0dWFsIGNhbnZhcyBoZWlnaHQgaXMgJzEgKyBDYW52YXMgSGVpZ2h0IE1pbnVzIE9uZScKKworVGhlIHByb2R1Y3Qgb2YgX0NhbnZhcyBXaWR0aF8gYW5kIF9DYW52YXMgSGVpZ2h0XyBNVVNUIGJlIGF0IG1vc3QgYDJeMzIgLSAxYC4KKworRnV0dXJlIHNwZWNpZmljYXRpb25zIE1BWSBhZGQgbW9yZSBmaWVsZHMuCisKKyMjIyBDaHVua3MKKworIyMjIyBBbmltYXRpb24KKworQW4gYW5pbWF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgQU5JTSBhbmQgQU5NRiBjaHVua3MuCisKK0FOSU0gQ2h1bms6Cit7OiNhbmltX2NodW5rfQorCitGb3IgYW4gYW5pbWF0ZWQgaW1hZ2UsIHRoaXMgY2h1bmsgY29udGFpbnMgdGhlIF9nbG9iYWwgcGFyYW1ldGVyc18gb2YgdGhlCithbmltYXRpb24uCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0FOSU0nKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kIENvbG9yICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICBMb29wIENvdW50ICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0JhY2tncm91bmQgQ29sb3I6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcyBpbiBcW0JsdWUsIEdyZWVuLCBSZWQsIEFscGhhXF0KKyAgYnl0ZSBvcmRlci4gVGhpcyBjb2xvciBNQVkgYmUgdXNlZCB0byBmaWxsIHRoZSB1bnVzZWQgc3BhY2Ugb24gdGhlIGNhbnZhcworICBhcm91bmQgdGhlIGZyYW1lcywgYXMgd2VsbCBhcyB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIG9mIHRoZSBmaXJzdCBmcmFtZS4KKyAgQmFja2dyb3VuZCBjb2xvciBpcyBhbHNvIHVzZWQgd2hlbiBkaXNwb3NhbCBtZXRob2QgaXMgYDFgLgorCisqKk5vdGUqKjoKKworICAqIEJhY2tncm91bmQgY29sb3IgTUFZIGNvbnRhaW4gYSB0cmFuc3BhcmVuY3kgdmFsdWUgKGFscGhhKSwgZXZlbiBpZiB0aGUKKyAgICBfQWxwaGFfIGZsYWcgaW4gW1ZQOFggY2h1bmtdKCNleHRlbmRlZF9oZWFkZXIpIGlzIHVuc2V0LgorCisgICogVmlld2VyIGFwcGxpY2F0aW9ucyBTSE9VTEQgdHJlYXQgdGhlIGJhY2tncm91bmQgY29sb3IgdmFsdWUgYXMgYSBoaW50LCBhbmQKKyAgICBhcmUgbm90IHJlcXVpcmVkIHRvIHVzZSBpdC4KKworICAqIFRoZSBjYW52YXMgaXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBsb29wLiBUaGUgYmFja2dyb3VuZCBjb2xvciBNQVkgYmUKKyAgICB1c2VkIHRvIGFjaGlldmUgdGhpcy4KKworTG9vcCBDb3VudDogMTYgYml0cyAoX3VpbnQxNl8pCisKKzogVGhlIG51bWJlciBvZiB0aW1lcyB0byBsb29wIHRoZSBhbmltYXRpb24uIGAwYCBtZWFucyBpbmZpbml0ZWx5LgorCitUaGlzIGNodW5rIE1VU1QgYXBwZWFyIGlmIHRoZSBfQW5pbWF0aW9uXyBmbGFnIGluIHRoZSBWUDhYIGNodW5rIGlzIHNldC4KK0lmIHRoZSBfQW5pbWF0aW9uXyBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoaXMgY2h1bmsgaXMgcHJlc2VudCwgaXQKK1NIT1VMRCBiZSBpZ25vcmVkLgorCitBTk1GIGNodW5rOgorCitGb3IgYW5pbWF0ZWQgaW1hZ2VzLCB0aGlzIGNodW5rIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgX3NpbmdsZV8gZnJhbWUuCitJZiB0aGUgX0FuaW1hdGlvbiBmbGFnXyBpcyBub3Qgc2V0LCB0aGVuIHRoaXMgY2h1bmsgU0hPVUxEIE5PVCBiZSBwcmVzZW50LgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIENodW5rSGVhZGVyKCdBTk1GJykgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuLi4KKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIC4uLiAgICAgICAgICBGcmFtZSBZICAgICAgICAgICAgfCAgIEZyYW1lIFdpZHRoIE1pbnVzIE9uZSAgICAgLi4uCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAuLi4gICAgICAgICAgICAgfCAgICAgICAgICAgRnJhbWUgSGVpZ2h0IE1pbnVzIE9uZSAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgRnJhbWUgRHVyYXRpb24gICAgICAgICAgICAgICAgfCAgUmVzZXJ2ZWQgfEJ8RHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworRnJhbWUgWDogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIGlzIGBGcmFtZSBYICogMmAKKworRnJhbWUgWTogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIGlzIGBGcmFtZSBZICogMmAKKworRnJhbWUgV2lkdGggTWludXMgT25lOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgXzEtYmFzZWRfIHdpZHRoIG9mIHRoZSBmcmFtZS4KKyAgVGhlIGZyYW1lIHdpZHRoIGlzIGAxICsgRnJhbWUgV2lkdGggTWludXMgT25lYAorCitGcmFtZSBIZWlnaHQgTWludXMgT25lOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgXzEtYmFzZWRfIGhlaWdodCBvZiB0aGUgZnJhbWUuCisgIFRoZSBmcmFtZSBoZWlnaHQgaXMgYDEgKyBGcmFtZSBIZWlnaHQgTWludXMgT25lYAorCitGcmFtZSBEdXJhdGlvbjogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgZGlzcGxheWluZyB0aGUgbmV4dCBmcmFtZSwgaW4gMSBtaWxsaXNlY29uZCB1bml0cy4KKyAgTm90ZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZnJhbWUgZHVyYXRpb24gb2YgMCAoYW5kIG9mdGVuIDw9IDEwKSBpcworICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiBNYW55IHRvb2xzIGFuZCBicm93c2VycyBhc3NpZ24gYSBtaW5pbXVtIGR1cmF0aW9uCisgIHNpbWlsYXIgdG8gR0lGLgorCitSZXNlcnZlZDogNiBiaXRzCisKKzogU0hPVUxEIGJlIDAuCisKK0JsZW5kaW5nIG1ldGhvZCAoQik6IDEgYml0CisKKzogSW5kaWNhdGVzIGhvdyB0cmFuc3BhcmVudCBwaXhlbHMgb2YgX3RoZSBjdXJyZW50IGZyYW1lXyBhcmUgdG8gYmUgYmxlbmRlZAorICB3aXRoIGNvcnJlc3BvbmRpbmcgcGl4ZWxzIG9mIHRoZSBwcmV2aW91cyBjYW52YXM6CisKKyAgICAqIGAwYDogVXNlIGFscGhhIGJsZW5kaW5nLiBBZnRlciBkaXNwb3Npbmcgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCByZW5kZXIgdGhlCisgICAgICBjdXJyZW50IGZyYW1lIG9uIHRoZSBjYW52YXMgdXNpbmcgW2FscGhhLWJsZW5kaW5nXSgjYWxwaGEtYmxlbmRpbmcpLiBJZgorICAgICAgdGhlIGN1cnJlbnQgZnJhbWUgZG9lcyBub3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBhc3N1bWUgYWxwaGEgdmFsdWUgb2YKKyAgICAgIDI1NSwgZWZmZWN0aXZlbHkgcmVwbGFjaW5nIHRoZSByZWN0YW5nbGUuCisKKyAgICAqIGAxYDogRG8gbm90IGJsZW5kLiBBZnRlciBkaXNwb3Npbmcgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCByZW5kZXIgdGhlCisgICAgICBjdXJyZW50IGZyYW1lIG9uIHRoZSBjYW52YXMgYnkgb3ZlcndyaXRpbmcgdGhlIHJlY3RhbmdsZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAgY3VycmVudCBmcmFtZS4KKworRGlzcG9zYWwgbWV0aG9kIChEKTogMSBiaXQKKworOiBJbmRpY2F0ZXMgaG93IF90aGUgY3VycmVudCBmcmFtZV8gaXMgdG8gYmUgdHJlYXRlZCBhZnRlciBpdCBoYXMgYmVlbgorICBkaXNwbGF5ZWQgKGJlZm9yZSByZW5kZXJpbmcgdGhlIG5leHQgZnJhbWUpIG9uIHRoZSBjYW52YXM6CisKKyAgICAqIGAwYDogRG8gbm90IGRpc3Bvc2UuIExlYXZlIHRoZSBjYW52YXMgYXMgaXMuCisKKyAgICAqIGAxYDogRGlzcG9zZSB0byBiYWNrZ3JvdW5kIGNvbG9yLiBGaWxsIHRoZSBfcmVjdGFuZ2xlXyBvbiB0aGUgY2FudmFzCisgICAgICBjb3ZlcmVkIGJ5IHRoZSBfY3VycmVudCBmcmFtZV8gd2l0aCBiYWNrZ3JvdW5kIGNvbG9yIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgIFtBTklNIGNodW5rXSgjYW5pbV9jaHVuaykuCisKKyoqTm90ZXMqKjoKKworICAqIFRoZSBmcmFtZSBkaXNwb3NhbCBvbmx5IGFwcGxpZXMgdG8gdGhlIF9mcmFtZSByZWN0YW5nbGVfLCB0aGF0IGlzLCB0aGUKKyAgICByZWN0YW5nbGUgZGVmaW5lZCBieSBfRnJhbWUgWF8sIF9GcmFtZSBZXywgX2ZyYW1lIHdpZHRoXyBhbmQgX2ZyYW1lIGhlaWdodF8uCisgICAgSXQgbWF5IG9yIG1heSBub3QgY292ZXIgdGhlIHdob2xlIGNhbnZhcy4KKworezojYWxwaGEtYmxlbmRpbmd9CisgICogKipBbHBoYS1ibGVuZGluZyoqOgorCisgICAgR2l2ZW4gdGhhdCBlYWNoIG9mIHRoZSBSLCBHLCBCIGFuZCBBIGNoYW5uZWxzIGlzIDgtYml0LCBhbmQgdGhlIFJHQgorICAgIGNoYW5uZWxzIGFyZSBfbm90IHByZW11bHRpcGxpZWRfIGJ5IGFscGhhLCB0aGUgZm9ybXVsYSBmb3IgYmxlbmRpbmcKKyAgICAnZHN0JyBvbnRvICdzcmMnIGlzOgorCit+fn5+fgorICAgIGJsZW5kLkEgPSBzcmMuQSArIGRzdC5BICogKDEgLSBzcmMuQSAvIDI1NSkKKyAgICBpZiBibGVuZC5BID0gMCB0aGVuCisgICAgICBibGVuZC5SR0IgPSAwCisgICAgZWxzZQorICAgICAgYmxlbmQuUkdCID0gKHNyYy5SR0IgKiBzcmMuQSArCisgICAgICAgICAgICAgICAgICAgZHN0LlJHQiAqIGRzdC5BICogKDEgLSBzcmMuQSAvIDI1NSkpIC8gYmxlbmQuQQorfn5+fn4KKworICAqIEFscGhhLWJsZW5kaW5nIFNIT1VMRCBiZSBkb25lIGluIGxpbmVhciBjb2xvciBzcGFjZSwgYnkgdGFraW5nIGludG8gYWNjb3VudAorICAgIHRoZSBbY29sb3IgcHJvZmlsZV0oI2NvbG9yLXByb2ZpbGUpIG9mIHRoZSBpbWFnZS4gSWYgdGhlIGNvbG9yIHByb2ZpbGUgaXMKKyAgICBub3QgcHJlc2VudCwgc1JHQiBpcyB0byBiZSBhc3N1bWVkLiAoTm90ZSB0aGF0IHNSR0IgYWxzbyBuZWVkcyB0byBiZQorICAgIGxpbmVhcml6ZWQgZHVlIHRvIGEgZ2FtbWEgb2YgfjIuMikuCisKK0ZyYW1lIERhdGE6IF9DaHVuayBTaXplXyAtIGAxNmAgYnl0ZXMKKworOiBDb25zaXN0cyBvZjoKKworICAqIEFuIG9wdGlvbmFsIFthbHBoYSBzdWJjaHVua10oI2FscGhhKSBmb3IgdGhlIGZyYW1lLgorCisgICogQSBbYml0c3RyZWFtIHN1YmNodW5rXSgjYml0c3RyZWFtLXZwOHZwOGwpIGZvciB0aGUgZnJhbWUuCisKKyAgKiBBbiBvcHRpb25hbCBsaXN0IG9mIFt1bmtub3duIGNodW5rc10oI3Vua25vd24tY2h1bmtzKS4KKworKipOb3RlKio6IFRoZSAnQU5NRicgcGF5bG9hZCwgX0ZyYW1lIERhdGFfIGFib3ZlLCBjb25zaXN0cyBvZiBpbmRpdmlkdWFsCitfcGFkZGVkXyBjaHVua3MgYXMgZGVzY3JpYmVkIGJ5IHRoZSBbUklGRiBmaWxlIGZvcm1hdF0oI3JpZmYtZmlsZS1mb3JtYXQpLgorCisjIyMjIEFscGhhCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0FMUEgnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8UnN2fCBQIHwgRiB8IEMgfCAgICAgQWxwaGEgQml0c3RyZWFtLi4uICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1Jlc2VydmVkIChSc3YpOiAyIGJpdHMKKworOiBTSE9VTEQgYmUgYDBgLgorCitQcmUtcHJvY2Vzc2luZyAoUCk6IDIgYml0cworCis6IFRoZXNlIElORk9STUFUSVZFIGJpdHMgYXJlIHVzZWQgdG8gc2lnbmFsIHRoZSBwcmUtcHJvY2Vzc2luZyB0aGF0IGhhcworICBiZWVuIHBlcmZvcm1lZCBkdXJpbmcgY29tcHJlc3Npb24uIFRoZSBkZWNvZGVyIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0bworICBlLmcuIGRpdGhlciB0aGUgdmFsdWVzIG9yIHNtb290aCB0aGUgZ3JhZGllbnRzIHByaW9yIHRvIGRpc3BsYXkuCisKKyAgICAqIGAwYDogbm8gcHJlLXByb2Nlc3NpbmcKKyAgICAqIGAxYDogbGV2ZWwgcmVkdWN0aW9uCisKK0ZpbHRlcmluZyBtZXRob2QgKEYpOiAyIGJpdHMKKworOiBUaGUgZmlsdGVyaW5nIG1ldGhvZCB1c2VkOgorCisgICAgKiBgMGA6IE5vbmUuCisgICAgKiBgMWA6IEhvcml6b250YWwgZmlsdGVyLgorICAgICogYDJgOiBWZXJ0aWNhbCBmaWx0ZXIuCisgICAgKiBgM2A6IEdyYWRpZW50IGZpbHRlci4KKworRm9yIGVhY2ggcGl4ZWwsIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnMuCitBc3N1bWUgdGhlIGFscGhhIHZhbHVlcyBzdXJyb3VuZGluZyB0aGUgY3VycmVudCBgWGAgcG9zaXRpb24gYXJlIGxhYmVsZWQgYXM6CisKKyAgICAgQyB8IEIgfAorICAgIC0tLSstLS0rCisgICAgIEEgfCBYIHwKKworV2Ugc2VlayB0byBjb21wdXRlIHRoZSBhbHBoYSB2YWx1ZSBhdCBwb3NpdGlvbiBgWGAuIEZpcnN0LCBhIHByZWRpY3Rpb24gaXMKK21hZGUgZGVwZW5kaW5nIG9uIHRoZSBmaWx0ZXJpbmcgbWV0aG9kOgorCisgICogTWV0aG9kIGAwYDogcHJlZGljdG9yID0gMAorICAqIE1ldGhvZCBgMWA6IHByZWRpY3RvciA9IEEKKyAgKiBNZXRob2QgYDJgOiBwcmVkaWN0b3IgPSBCCisgICogTWV0aG9kIGAzYDogcHJlZGljdG9yID0gY2xpcChBICsgQiAtIEMpCisKK3doZXJlIGBjbGlwKHYpYCBpcyBlcXVhbCB0bzoKKworICAqIDAgICAgaWYgdiA8IDAKKyAgKiAyNTUgIGlmIHYgPiAyNTUKKyAgKiB2ICAgIG90aGVyd2lzZQorCitUaGUgZmluYWwgdmFsdWUgaXMgZGVyaXZlZCBieSBhZGRpbmcgdGhlIGRlY29tcHJlc3NlZCB2YWx1ZSBgWGAgdG8gdGhlCitwcmVkaWN0b3IgYW5kIHVzaW5nIG1vZHVsby0yNTYgYXJpdGhtZXRpYyB0byB3cmFwIHRoZSBcWzI1Ni01MTFcXSByYW5nZQoraW50byB0aGUgXFswLTI1NVxdIG9uZToKKworYGFscGhhID0gKHByZWRpY3RvciArIFgpICUgMjU2YAorCitUaGVyZSBhcmUgc3BlY2lhbCBjYXNlcyBmb3IgbGVmdC1tb3N0IGFuZCB0b3AtbW9zdCBwaXhlbCBwb3NpdGlvbnM6CisKKyAgKiBUb3AtbGVmdCB2YWx1ZSBhdCBsb2NhdGlvbiAoMCwwKSB1c2VzIDAgYXMgcHJlZGljdG9yIHZhbHVlLiBPdGhlcndpc2UsCisgICogRm9yIGhvcml6b250YWwgb3IgZ3JhZGllbnQgZmlsdGVyaW5nIG1ldGhvZHMsIHRoZSBsZWZ0LW1vc3QgcGl4ZWxzIGF0CisgICAgbG9jYXRpb24gKDAsIHkpIGFyZSBwcmVkaWN0ZWQgdXNpbmcgdGhlIGxvY2F0aW9uICgwLCB5LTEpIGp1c3QgYWJvdmUuCisgICogRm9yIHZlcnRpY2FsIG9yIGdyYWRpZW50IGZpbHRlcmluZyBtZXRob2RzLCB0aGUgdG9wLW1vc3QgcGl4ZWxzIGF0CisgICAgbG9jYXRpb24gKHgsIDApIGFyZSBwcmVkaWN0ZWQgdXNpbmcgdGhlIGxvY2F0aW9uICh4LTEsIDApIG9uIHRoZSBsZWZ0LgorCisKK0RlY29kZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gaW4gYW55IHNwZWNpZmllZCB3YXkuCisKK0NvbXByZXNzaW9uIG1ldGhvZCAoQyk6IDIgYml0cworCis6IFRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZDoKKworICAgICogYDBgOiBObyBjb21wcmVzc2lvbi4KKyAgICAqIGAxYDogQ29tcHJlc3NlZCB1c2luZyB0aGUgV2ViUCBsb3NzbGVzcyBmb3JtYXQuCisKK0FscGhhIGJpdHN0cmVhbTogX0NodW5rIFNpemVfIC0gYDFgIGJ5dGVzCisKKzogRW5jb2RlZCBhbHBoYSBiaXRzdHJlYW0uCisKK1RoaXMgb3B0aW9uYWwgY2h1bmsgY29udGFpbnMgZW5jb2RlZCBhbHBoYSBkYXRhIGZvciB0aGlzIGZyYW1lLiBBIGZyYW1lCitjb250YWluaW5nIGEgJ1ZQOEwnIGNodW5rIFNIT1VMRCBOT1QgY29udGFpbiB0aGlzIGNodW5rLgorCisqKlJhdGlvbmFsZSoqOiBUaGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgJ1ZQOEwnCitjaHVuay4KKworVGhlIGFscGhhIGNoYW5uZWwgZGF0YSBpcyBzdG9yZWQgYXMgdW5jb21wcmVzc2VkIHJhdyBkYXRhICh3aGVuCitjb21wcmVzc2lvbiBtZXRob2QgaXMgJzAnKSBvciBjb21wcmVzc2VkIHVzaW5nIHRoZSBsb3NzbGVzcyBmb3JtYXQKKyh3aGVuIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgJzEnKS4KKworICAqIFJhdyBkYXRhOiBjb25zaXN0cyBvZiBhIGJ5dGUgc2VxdWVuY2Ugb2YgbGVuZ3RoIHdpZHRoICogaGVpZ2h0LAorICAgIGNvbnRhaW5pbmcgYWxsIHRoZSA4LWJpdCB0cmFuc3BhcmVuY3kgdmFsdWVzIGluIHNjYW4gb3JkZXIuCisKKyAgKiBMb3NzbGVzcyBmb3JtYXQgY29tcHJlc3Npb246IHRoZSBieXRlIHNlcXVlbmNlIGlzIGEgY29tcHJlc3NlZAorICAgIGltYWdlLXN0cmVhbSAoYXMgZGVzY3JpYmVkIGluIHRoZSBbV2ViUCBMb3NzbGVzcyBCaXRzdHJlYW0gRm9ybWF0XQorICAgIFt3ZWJwbGxzcGVjXSkgb2YgaW1wbGljaXQgZGltZW5zaW9uIHdpZHRoIHggaGVpZ2h0LiBUaGF0IGlzLCB0aGlzCisgICAgaW1hZ2Utc3RyZWFtIGRvZXMgTk9UIGNvbnRhaW4gYW55IGhlYWRlcnMgZGVzY3JpYmluZyB0aGUgaW1hZ2UgZGltZW5zaW9uLgorCisgICAgKipSYXRpb25hbGUqKjogdGhlIGRpbWVuc2lvbiBpcyBhbHJlYWR5IGtub3duIGZyb20gb3RoZXIgc291cmNlcywKKyAgICBzbyBzdG9yaW5nIGl0IGFnYWluIHdvdWxkIGJlIHJlZHVuZGFudCBhbmQgZXJyb3ItcHJvbmUuCisKKyAgICBPbmNlIHRoZSBpbWFnZS1zdHJlYW0gaXMgZGVjb2RlZCBpbnRvIEFSR0IgY29sb3IgdmFsdWVzLCBmb2xsb3dpbmcKKyAgICB0aGUgcHJvY2VzcyBkZXNjcmliZWQgaW4gdGhlIGxvc3NsZXNzIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCB0aGUKKyAgICB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgKmdyZWVuKiBjaGFubmVsCisgICAgb2YgdGhlIEFSR0IgcXVhZHJ1cGxldC4KKworICAgICoqUmF0aW9uYWxlKio6IHRoZSBncmVlbiBjaGFubmVsIGlzIGFsbG93ZWQgZXh0cmEgdHJhbnNmb3JtYXRpb24KKyAgICBzdGVwcyBpbiB0aGUgc3BlY2lmaWNhdGlvbiAtLSB1bmxpa2UgdGhlIG90aGVyIGNoYW5uZWxzIC0tIHRoYXQgY2FuCisgICAgaW1wcm92ZSBjb21wcmVzc2lvbi4KKworIyMjIyBCaXRzdHJlYW0gKFZQOC9WUDhMKQorCitUaGlzIGNodW5rIGNvbnRhaW5zIGNvbXByZXNzZWQgYml0c3RyZWFtIGRhdGEgZm9yIGEgc2luZ2xlIGZyYW1lLgorCitBIGJpdHN0cmVhbSBjaHVuayBtYXkgYmUgZWl0aGVyIChpKSBhIFZQOCBjaHVuaywgdXNpbmcgIlZQOCAiIChub3RlIHRoZQorc2lnbmlmaWNhbnQgZm91cnRoLWNoYXJhY3RlciBzcGFjZSkgYXMgaXRzIHRhZyBfb3JfIChpaSkgYSBWUDhMIGNodW5rLCB1c2luZworIlZQOEwiIGFzIGl0cyB0YWcuCisKK1RoZSBmb3JtYXRzIG9mIFZQOCBhbmQgVlA4TCBjaHVua3MgYXJlIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9ucworW1NpbXBsZSBGaWxlIEZvcm1hdCAoTG9zc3kpXSgjc2ltcGxlLWZpbGUtZm9ybWF0LWxvc3N5KQorYW5kIFtTaW1wbGUgRmlsZSBGb3JtYXQgKExvc3NsZXNzKV0oI3NpbXBsZS1maWxlLWZvcm1hdC1sb3NzbGVzcykgcmVzcGVjdGl2ZWx5LgorCisjIyMjIENvbG9yIHByb2ZpbGUKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignSUNDUCcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgIENvbG9yIFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworQ29sb3IgUHJvZmlsZTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogSUNDIHByb2ZpbGUuCisKK1RoaXMgY2h1bmsgTVVTVCBhcHBlYXIgYmVmb3JlIHRoZSBpbWFnZSBkYXRhLgorCitUaGVyZSBTSE9VTEQgYmUgYXQgbW9zdCBvbmUgc3VjaCBjaHVuay4gSWYgdGhlcmUgYXJlIG1vcmUgc3VjaCBjaHVua3MsIHJlYWRlcnMKK01BWSBpZ25vcmUgYWxsIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLgorU2VlIHRoZSBbSUNDIFNwZWNpZmljYXRpb25dW2ljY3NwZWNdIGZvciBkZXRhaWxzLgorCitJZiB0aGlzIGNodW5rIGlzIG5vdCBwcmVzZW50LCBzUkdCIFNIT1VMRCBiZSBhc3N1bWVkLgorCisjIyMjIE1ldGFkYXRhCisKK01ldGFkYXRhIGNhbiBiZSBzdG9yZWQgaW4gJ0VYSUYnIG9yICdYTVAgJyBjaHVua3MuCisKK1RoZXJlIFNIT1VMRCBiZSBhdCBtb3N0IG9uZSBjaHVuayBvZiBlYWNoIHR5cGUgKCdFWElGJyBhbmQgJ1hNUCAnKS4gSWYgdGhlcmUKK2FyZSBtb3JlIHN1Y2ggY2h1bmtzLCByZWFkZXJzIE1BWSBpZ25vcmUgYWxsIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLiBBbHNvLCBhIGZpbGUKK21heSBwb3NzaWJseSBjb250YWluIGJvdGggJ0VYSUYnIGFuZCAnWE1QICcgY2h1bmtzLgorCitUaGUgY2h1bmtzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK0VYSUYgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0VYSUYnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgRVhJRiBNZXRhZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0VYSUYgTWV0YWRhdGE6IF9DaHVuayBTaXplXyBieXRlcworCis6IGltYWdlIG1ldGFkYXRhIGluIEVYSUYgZm9ybWF0LgorCitYTVAgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1hNUCAnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgWE1QIE1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1hNUCBNZXRhZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogaW1hZ2UgbWV0YWRhdGEgaW4gWE1QIGZvcm1hdC4KKworQWRkaXRpb25hbCBndWlkYW5jZSBhYm91dCBoYW5kbGluZyBtZXRhZGF0YSBjYW4gYmUgZm91bmQgaW4gdGhlCitNZXRhZGF0YSBXb3JraW5nIEdyb3VwJ3MgW0d1aWRlbGluZXMgZm9yIEhhbmRsaW5nIE1ldGFkYXRhXVttZXRhZGF0YV0uCisKKyMjIyMgVW5rbm93biBDaHVua3MgX1xbc3RhdHVzOiBleHBlcmltZW50YWxcXV8KKworQSBSSUZGIGNodW5rIChkZXNjcmliZWQgaW4gW3RoaXNdKCN0ZXJtaW5vbG9neS1hbXAtYmFzaWNzKSBzZWN0aW9uKSB3aG9zZSBfY2h1bmsKK3RhZ18gaXMgZGlmZmVyZW50IGZyb20gYW55IG9mIHRoZSBjaHVua3MgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQsIGlzCitjb25zaWRlcmVkIGFuIF91bmtub3duIGNodW5rXy4KKworKipSYXRpb25hbGUqKjogQWxsb3dpbmcgdW5rbm93biBjaHVua3MgZ2l2ZXMgYSBwcm92aXNpb24gZm9yIGZ1dHVyZSBleHRlbnNpb24KK29mIHRoZSBmb3JtYXQsIGFuZCBhbHNvIGFsbG93cyBzdG9yYWdlIG9mIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhLgorCitBIGZpbGUgTUFZIGNvbnRhaW4gdW5rbm93biBjaHVua3M6CisKKyAgKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIGRlc2NyaWJlZCBpbiBbRXh0ZW5kZWQgV2ViUCBmaWxlCisgICAgaGVhZGVyXSgjZXh0ZW5kZWRfaGVhZGVyKSBzZWN0aW9uLgorICAqIEF0IHRoZSBlbmQgb2YgQU5NRiBjaHVua3MgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgIFtBbmltYXRpb25dKCNhbmltYXRpb24pIHNlY3Rpb24uCisKK1JlYWRlcnMgU0hPVUxEIGlnbm9yZSB0aGVzZSBjaHVua3MuIFdyaXRlcnMgU0hPVUxEIHByZXNlcnZlIHRoZW0gaW4gdGhlaXIKK29yaWdpbmFsIG9yZGVyICh1bmxlc3MgdGhleSBzcGVjaWZpY2FsbHkgaW50ZW5kIHRvIG1vZGlmeSB0aGVzZSBjaHVua3MpLgorCisjIyMgQXNzZW1ibGluZyB0aGUgQ2FudmFzIGZyb20gZnJhbWVzCisKK0hlcmUgd2UgcHJvdmlkZSBhbiBvdmVydmlldyBvZiBob3cgYSByZWFkZXIgc2hvdWxkIGFzc2VtYmxlIGEgY2FudmFzIGluIHRoZQorY2FzZSBvZiBhbiBhbmltYXRlZCBpbWFnZS4gVGhlIG5vdGF0aW9uIF9WUDhYLmZpZWxkXyBtZWFucyB0aGUgZmllbGQgaW4gdGhlCisnVlA4WCcgY2h1bmsgd2l0aCB0aGUgc2FtZSBkZXNjcmlwdGlvbi4KKworRGlzcGxheWluZyBhbiBfYW5pbWF0ZWQgaW1hZ2VfIGNhbnZhcyBNVVNUIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZworcHNldWRvY29kZToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2Fzc2VydCBWUDhYLmZsYWdzLmhhc0FuaW1hdGlvbgorY2FudmFzIOKGkCBuZXcgaW1hZ2Ugb2Ygc2l6ZSBWUDhYLmNhbnZhc1dpZHRoIHggVlA4WC5jYW52YXNIZWlnaHQgd2l0aAorICAgICAgICAgYmFja2dyb3VuZCBjb2xvciBBTklNLmJhY2tncm91bmRfY29sb3IuCitsb29wX2NvdW50IOKGkCBBTklNLmxvb3BDb3VudAorZGlzcG9zZV9tZXRob2Qg4oaQIEFOSU0uZGlzcG9zZU1ldGhvZAoraWYgbG9vcF9jb3VudCA9PSAwOgorICAgIGxvb3BfY291bnQgPSDiiJ4KK2ZyYW1lX3BhcmFtcyDihpAgbmlsCithc3NlcnQgbmV4dCBjaHVuayBpbiBpbWFnZV9kYXRhIGlzIEFOTUYKK2ZvciBsb29wID0gMC4ubG9vcF9jb3VudCAtIDEKKyAgICBjbGVhciBjYW52YXMgdG8gQU5JTS5iYWNrZ3JvdW5kX2NvbG9yIG9yIGFwcGxpY2F0aW9uIGRlZmluZWQgY29sb3IKKyAgICB1bnRpbCBlb2Ygb3Igbm9uLUFOTUYgY2h1bmsKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWCA9IEZyYW1lIFgKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWSA9IEZyYW1lIFkKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lV2lkdGggPSBGcmFtZSBXaWR0aCBNaW51cyBPbmUgKyAxCisgICAgICAgIGZyYW1lX3BhcmFtcy5mcmFtZUhlaWdodCA9IEZyYW1lIEhlaWdodCBNaW51cyBPbmUgKyAxCisgICAgICAgIGZyYW1lX3BhcmFtcy5mcmFtZUR1cmF0aW9uID0gRnJhbWUgRHVyYXRpb24KKyAgICAgICAgZnJhbWVfcmlnaHQgPSBmcmFtZV9wYXJhbXMuZnJhbWVYICsgZnJhbWVfcGFyYW1zLmZyYW1lV2lkdGgKKyAgICAgICAgZnJhbWVfYm90dG9tID0gZnJhbWVfcGFyYW1zLmZyYW1lWSArIGZyYW1lX3BhcmFtcy5mcmFtZUhlaWdodAorICAgICAgICBhc3NlcnQgVlA4WC5jYW52YXNXaWR0aCA+PSBmcmFtZV9yaWdodAorICAgICAgICBhc3NlcnQgVlA4WC5jYW52YXNIZWlnaHQgPj0gZnJhbWVfYm90dG9tCisgICAgICAgIGZvciBzdWJjaHVuayBpbiAnRnJhbWUgRGF0YSc6CisgICAgICAgICAgICBpZiBzdWJjaHVuay50YWcgPT0gIkFMUEgiOgorICAgICAgICAgICAgICAgIGFzc2VydCBhbHBoYSBzdWJjaHVua3Mgbm90IGZvdW5kIGluICdGcmFtZSBEYXRhJyBlYXJsaWVyCisgICAgICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmFscGhhID0gYWxwaGFfZGF0YQorICAgICAgICAgICAgZWxzZSBpZiBzdWJjaHVuay50YWcgPT0gIlZQOCAiIE9SIHN1YmNodW5rLnRhZyA9PSAiVlA4TCI6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGJpdHN0cmVhbSBzdWJjaHVua3Mgbm90IGZvdW5kIGluICdGcmFtZSBEYXRhJyBlYXJsaWVyCisgICAgICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmJpdHN0cmVhbSA9IGJpdHN0cmVhbV9kYXRhCisgICAgICAgIHJlbmRlciBmcmFtZSB3aXRoIGZyYW1lX3BhcmFtcy5hbHBoYSBhbmQgZnJhbWVfcGFyYW1zLmJpdHN0cmVhbSBvbgorICAgICAgICAgICAgY2FudmFzIHdpdGggdG9wLWxlZnQgY29ybmVyIGF0IChmcmFtZV9wYXJhbXMuZnJhbWVYLAorICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWSksIHVzaW5nIGRpc3Bvc2UgbWV0aG9kIGRpc3Bvc2VfbWV0aG9kLgorICAgICAgICBjYW52YXMgY29udGFpbnMgdGhlIGRlY29kZWQgaW1hZ2UuCisgICAgICAgIFNob3cgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMgZm9yIGZyYW1lX3BhcmFtcy5mcmFtZUR1cmF0aW9uICogMW1zLgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCitFeGFtcGxlIEZpbGUgTGF5b3V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBsb3NzeSBlbmNvZGVkIGltYWdlIHdpdGggYWxwaGEgbWF5IGxvb2sgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1JJRkYvV0VCUAorKy0gVlA4WCAoZGVzY3JpcHRpb25zIG9mIGZlYXR1cmVzIHVzZWQpCisrLSBBTFBIIChhbHBoYSBiaXRzdHJlYW0pCisrLSBWUDggKGJpdHN0cmVhbSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0EgbG9zc2xlc3NseSBlbmNvZGVkIGltYWdlIG1heSBsb29rIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitSSUZGL1dFQlAKKystIFZQOFggKGRlc2NyaXB0aW9ucyBvZiBmZWF0dXJlcyB1c2VkKQorKy0gWFlaVyAodW5rbm93biBjaHVuaykKKystIFZQOEwgKGxvc3NsZXNzIGJpdHN0cmVhbSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0EgbG9zc2xlc3MgaW1hZ2Ugd2l0aCBJQ0MgcHJvZmlsZSBhbmQgWE1QIG1ldGFkYXRhIG1heQorbG9vayBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorUklGRi9XRUJQCisrLSBWUDhYIChkZXNjcmlwdGlvbnMgb2YgZmVhdHVyZXMgdXNlZCkKKystIElDQ1AgKGNvbG9yIHByb2ZpbGUpCisrLSBWUDhMIChsb3NzbGVzcyBiaXRzdHJlYW0pCisrLSBYTVAgIChtZXRhZGF0YSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0FuIGFuaW1hdGVkIGltYWdlIHdpdGggRVhJRiBtZXRhZGF0YSBtYXkgbG9vayBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorUklGRi9XRUJQCisrLSBWUDhYIChkZXNjcmlwdGlvbnMgb2YgZmVhdHVyZXMgdXNlZCkKKystIEFOSU0gKGdsb2JhbCBhbmltYXRpb24gcGFyYW1ldGVycykKKystIEFOTUYgKGZyYW1lMSBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lMiBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lMyBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lNCBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEVYSUYgKG1ldGFkYXRhKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW3ZwOHNwZWNdOiAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjM4NgorW3dlYnBsbHNwZWNdOiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwLysvbWFzdGVyL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dAorW2ljY3NwZWNdOiBodHRwOi8vd3d3LmNvbG9yLm9yZy9pY2Nfc3BlY3MyLnhhbHRlcgorW21ldGFkYXRhXTogaHR0cDovL3d3dy5tZXRhZGF0YXdvcmtpbmdncm91cC5vcmcvcGRmL213Z19ndWlkYW5jZS5wZGYKK1tyZmMgMTE2Nl06IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzExNjYKK1tyZmMgMjExOV06IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxMTkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkZGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0CkBAIC0wLDAgKzEsMTA5MCBAQAorPCEtLQorCitBbHRob3VnaCB5b3UgbWF5IGJlIHZpZXdpbmcgYW4gYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uLCB0aGlzIGRvY3VtZW50CitpcyBzb3VyY2VkIGluIE1hcmtkb3duLCBhIGxpZ2h0LWR1dHkgbWFya3VwIHNjaGVtZSwgYW5kIGlzIG9wdGltaXplZCBmb3IKK3RoZSBba3JhbWRvd25dKGh0dHA6Ly9rcmFtZG93bi5ydWJ5Zm9yZ2Uub3JnLykgdHJhbnNmb3JtZXIuCisKK1NlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRS4gRXh0ZXJuYWwgbGluayB0YXJnZXRzIGFyZSByZWZlcmVuY2VkIGF0IHRoZQorZW5kIG9mIHRoaXMgZmlsZS4KKworLS0+CisKK1NwZWNpZmljYXRpb24gZm9yIFdlYlAgTG9zc2xlc3MgQml0c3RyZWFtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitfSnlya2kgQWxha3VpamFsYSwgUGguRC4sIEdvb2dsZSwgSW5jLiwgMjAxMi0wNi0xOV8KKworUGFyYWdyYXBocyBtYXJrZWQgYXMgXFtBTUVOREVEXF0gd2VyZSBhbWVuZGVkIG9uIDIwMTQtMDktMTYuCisKK0Fic3RyYWN0CistLS0tLS0tLQorCitXZWJQIGxvc3NsZXNzIGlzIGFuIGltYWdlIGZvcm1hdCBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gb2YgQVJHQgoraW1hZ2VzLiBUaGUgbG9zc2xlc3MgZm9ybWF0IHN0b3JlcyBhbmQgcmVzdG9yZXMgdGhlIHBpeGVsIHZhbHVlcworZXhhY3RseSwgaW5jbHVkaW5nIHRoZSBjb2xvciB2YWx1ZXMgZm9yIHplcm8gYWxwaGEgcGl4ZWxzLiBUaGUKK2Zvcm1hdCB1c2VzIHN1YnJlc29sdXRpb24gaW1hZ2VzLCByZWN1cnNpdmVseSBlbWJlZGRlZCBpbnRvIHRoZSBmb3JtYXQKK2l0c2VsZiwgZm9yIHN0b3Jpbmcgc3RhdGlzdGljYWwgZGF0YSBhYm91dCB0aGUgaW1hZ2VzLCBzdWNoIGFzIHRoZSB1c2VkCitlbnRyb3B5IGNvZGVzLCBzcGF0aWFsIHByZWRpY3RvcnMsIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24sIGFuZCBjb2xvcgordGFibGUuIExaNzcsIEh1ZmZtYW4gY29kaW5nLCBhbmQgYSBjb2xvciBjYWNoZSBhcmUgdXNlZCBmb3IgY29tcHJlc3Npb24KK29mIHRoZSBidWxrIGRhdGEuIERlY29kaW5nIHNwZWVkcyBmYXN0ZXIgdGhhbiBQTkcgaGF2ZSBiZWVuCitkZW1vbnN0cmF0ZWQsIGFzIHdlbGwgYXMgMjUlIGRlbnNlciBjb21wcmVzc2lvbiB0aGFuIGNhbiBiZSBhY2hpZXZlZAordXNpbmcgdG9kYXkncyBQTkcgZm9ybWF0LgorCisKKyogVE9DIHBsYWNlaG9sZGVyCit7OnRvY30KKworCitOb21lbmNsYXR1cmUKKy0tLS0tLS0tLS0tLQorCitBUkdCCis6IEEgcGl4ZWwgdmFsdWUgY29uc2lzdGluZyBvZiBhbHBoYSwgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgorCitBUkdCIGltYWdlCis6IEEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgQVJHQiBwaXhlbHMuCisKK2NvbG9yIGNhY2hlCis6IEEgc21hbGwgaGFzaC1hZGRyZXNzZWQgYXJyYXkgdG8gc3RvcmUgcmVjZW50bHkgdXNlZCBjb2xvcnMsIHRvIGJlIGFibGUKKyAgdG8gcmVjYWxsIHRoZW0gd2l0aCBzaG9ydGVyIGNvZGVzLgorCitjb2xvciBpbmRleGluZyBpbWFnZQorOiBBIG9uZS1kaW1lbnNpb25hbCBpbWFnZSBvZiBjb2xvcnMgdGhhdCBjYW4gYmUgaW5kZXhlZCB1c2luZyBhIHNtYWxsCisgIGludGVnZXIgKHVwIHRvIDI1NiB3aXRoaW4gV2ViUCBsb3NzbGVzcykuCisKK2NvbG9yIHRyYW5zZm9ybSBpbWFnZQorOiBBIHR3by1kaW1lbnNpb25hbCBzdWJyZXNvbHV0aW9uIGltYWdlIGNvbnRhaW5pbmcgZGF0YSBhYm91dAorICBjb3JyZWxhdGlvbnMgb2YgY29sb3IgY29tcG9uZW50cy4KKworZGlzdGFuY2UgbWFwcGluZworOiBDaGFuZ2VzIExaNzcgZGlzdGFuY2VzIHRvIGhhdmUgdGhlIHNtYWxsZXN0IHZhbHVlcyBmb3IgcGl4ZWxzIGluIDJECisgIHByb3hpbWl0eS4KKworZW50cm9weSBpbWFnZQorOiBBIHR3by1kaW1lbnNpb25hbCBzdWJyZXNvbHV0aW9uIGltYWdlIGluZGljYXRpbmcgd2hpY2ggZW50cm9weSBjb2RpbmcKKyAgc2hvdWxkIGJlIHVzZWQgaW4gYSByZXNwZWN0aXZlIHNxdWFyZSBpbiB0aGUgaW1hZ2UsIGkuZS4sIGVhY2ggcGl4ZWwKKyAgaXMgYSBtZXRhIEh1ZmZtYW4gY29kZS4KKworSHVmZm1hbiBjb2RlCis6IEEgY2xhc3NpYyB3YXkgdG8gZG8gZW50cm9weSBjb2Rpbmcgd2hlcmUgYSBzbWFsbGVyIG51bWJlciBvZiBiaXRzIGFyZQorICB1c2VkIGZvciBtb3JlIGZyZXF1ZW50IGNvZGVzLgorCitMWjc3Cis6IERpY3Rpb25hcnktYmFzZWQgc2xpZGluZyB3aW5kb3cgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRoYXQgZWl0aGVyCisgIGVtaXRzIHN5bWJvbHMgb3IgZGVzY3JpYmVzIHRoZW0gYXMgc2VxdWVuY2VzIG9mIHBhc3Qgc3ltYm9scy4KKworbWV0YSBIdWZmbWFuIGNvZGUKKzogQSBzbWFsbCBpbnRlZ2VyICh1cCB0byAxNiBiaXRzKSB0aGF0IGluZGV4ZXMgYW4gZWxlbWVudCBpbiB0aGUgbWV0YQorICBIdWZmbWFuIHRhYmxlLgorCitwcmVkaWN0b3IgaW1hZ2UKKzogQSB0d28tZGltZW5zaW9uYWwgc3VicmVzb2x1dGlvbiBpbWFnZSBpbmRpY2F0aW5nIHdoaWNoIHNwYXRpYWwKKyAgcHJlZGljdG9yIGlzIHVzZWQgZm9yIGEgcGFydGljdWxhciBzcXVhcmUgaW4gdGhlIGltYWdlLgorCitwcmVmaXggY29kaW5nCis6IEEgd2F5IHRvIGVudHJvcHkgY29kZSBsYXJnZXIgaW50ZWdlcnMgdGhhdCBjb2RlcyBhIGZldyBiaXRzIG9mIHRoZQorICBpbnRlZ2VyIHVzaW5nIGFuIGVudHJvcHkgY29kZSBhbmQgY29kaWZpZXMgdGhlIHJlbWFpbmluZyBiaXRzIHJhdy4KKyAgVGhpcyBhbGxvd3MgZm9yIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIGVudHJvcHkgY29kZXMgdG8gcmVtYWluCisgIHJlbGF0aXZlbHkgc21hbGwgZXZlbiB3aGVuIHRoZSByYW5nZSBvZiBzeW1ib2xzIGlzIGxhcmdlLgorCitzY2FuLWxpbmUgb3JkZXIKKzogQSBwcm9jZXNzaW5nIG9yZGVyIG9mIHBpeGVscywgbGVmdC10by1yaWdodCwgdG9wLXRvLWJvdHRvbSwgc3RhcnRpbmcKKyAgZnJvbSB0aGUgbGVmdC1oYW5kLXRvcCBwaXhlbCwgcHJvY2VlZGluZyB0byB0aGUgcmlnaHQuIE9uY2UgYSByb3cgaXMKKyAgY29tcGxldGVkLCBjb250aW51ZSBmcm9tIHRoZSBsZWZ0LWhhbmQgY29sdW1uIG9mIHRoZSBuZXh0IHJvdy4KKworCisxIEludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvbXByZXNzZWQgZGF0YSByZXByZXNlbnRhdGlvbiBvZiBhIFdlYlAKK2xvc3NsZXNzIGltYWdlLiBJdCBpcyBpbnRlbmRlZCBhcyBhIGRldGFpbGVkIHJlZmVyZW5jZSBmb3IgV2ViUCBsb3NzbGVzcworZW5jb2RlciBhbmQgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KKworSW4gdGhpcyBkb2N1bWVudCwgd2UgZXh0ZW5zaXZlbHkgdXNlIEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3ludGF4IHRvCitkZXNjcmliZSB0aGUgYml0c3RyZWFtLCBhbmQgYXNzdW1lIHRoZSBleGlzdGVuY2Ugb2YgYSBmdW5jdGlvbiBmb3IKK3JlYWRpbmcgYml0cywgYFJlYWRCaXRzKG4pYC4gVGhlIGJ5dGVzIGFyZSByZWFkIGluIHRoZSBuYXR1cmFsIG9yZGVyIG9mCit0aGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlbSwgYW5kIGJpdHMgb2YgZWFjaCBieXRlIGFyZSByZWFkIGluCitsZWFzdC1zaWduaWZpY2FudC1iaXQtZmlyc3Qgb3JkZXIuIFdoZW4gbXVsdGlwbGUgYml0cyBhcmUgcmVhZCBhdCB0aGUKK3NhbWUgdGltZSwgdGhlIGludGVnZXIgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YSBpbiB0aGUKK29yaWdpbmFsIG9yZGVyLiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXR1cm5lZCBpbnRlZ2VyIGFyZQorYWxzbyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBvcmlnaW5hbCBkYXRhLiBUaHVzIHRoZSBzdGF0ZW1lbnQKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitiID0gUmVhZEJpdHMoMik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworaXMgZXF1aXZhbGVudCB3aXRoIHRoZSB0d28gc3RhdGVtZW50cyBiZWxvdzoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitiID0gUmVhZEJpdHMoMSk7CitiIHw9IFJlYWRCaXRzKDEpIDw8IDE7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV2UgYXNzdW1lIHRoYXQgZWFjaCBjb2xvciBjb21wb25lbnQgKGUuZy4gYWxwaGEsIHJlZCwgYmx1ZSBhbmQgZ3JlZW4pIGlzCityZXByZXNlbnRlZCB1c2luZyBhbiA4LWJpdCBieXRlLiBXZSBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBhcwordWludDguIEEgd2hvbGUgQVJHQiBwaXhlbCBpcyByZXByZXNlbnRlZCBieSBhIHR5cGUgY2FsbGVkIHVpbnQzMiwgYW4KK3Vuc2lnbmVkIGludGVnZXIgY29uc2lzdGluZyBvZiAzMiBiaXRzLiBJbiB0aGUgY29kZSBzaG93aW5nIHRoZSBiZWhhdmlvcgorb2YgdGhlIHRyYW5zZm9ybWF0aW9ucywgYWxwaGEgdmFsdWUgaXMgY29kaWZpZWQgaW4gYml0cyAzMS4uMjQsIHJlZCBpbgorYml0cyAyMy4uMTYsIGdyZWVuIGluIGJpdHMgMTUuLjggYW5kIGJsdWUgaW4gYml0cyA3Li4wLCBidXQKK2ltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9ybWF0IGFyZSBmcmVlIHRvIHVzZSBhbm90aGVyIHJlcHJlc2VudGF0aW9uCitpbnRlcm5hbGx5LgorCitCcm9hZGx5LCBhIFdlYlAgbG9zc2xlc3MgaW1hZ2UgY29udGFpbnMgaGVhZGVyIGRhdGEsIHRyYW5zZm9ybQoraW5mb3JtYXRpb24gYW5kIGFjdHVhbCBpbWFnZSBkYXRhLiBIZWFkZXJzIGNvbnRhaW4gd2lkdGggYW5kIGhlaWdodCBvZgordGhlIGltYWdlLiBBIFdlYlAgbG9zc2xlc3MgaW1hZ2UgY2FuIGdvIHRocm91Z2ggZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YKK3RyYW5zZm9ybWF0aW9uIGJlZm9yZSBiZWluZyBlbnRyb3B5IGVuY29kZWQuIFRoZSB0cmFuc2Zvcm0gaW5mb3JtYXRpb24KK2luIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgdGhlIGRhdGEgcmVxdWlyZWQgdG8gYXBwbHkgdGhlIHJlc3BlY3RpdmUKK2ludmVyc2UgdHJhbnNmb3Jtcy4KKworCisyIFJJRkYgSGVhZGVyCistLS0tLS0tLS0tLS0tCisKK1RoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlciBoYXMgdGhlIFJJRkYgY29udGFpbmVyLiBUaGlzIGNvbnNpc3RzIG9mIHRoZQorZm9sbG93aW5nIDIxIGJ5dGVzOgorCisgICAxLiBTdHJpbmcgIlJJRkYiCisgICAyLiBBIGxpdHRsZS1lbmRpYW4gMzIgYml0IHZhbHVlIG9mIHRoZSBibG9jayBsZW5ndGgsIHRoZSB3aG9sZSBzaXplCisgICAgICBvZiB0aGUgYmxvY2sgY29udHJvbGxlZCBieSB0aGUgUklGRiBoZWFkZXIuIE5vcm1hbGx5IHRoaXMgZXF1YWxzCisgICAgICB0aGUgcGF5bG9hZCBzaXplIChmaWxlIHNpemUgbWludXMgOCBieXRlczogNCBieXRlcyBmb3IgdGhlICdSSUZGJworICAgICAgaWRlbnRpZmllciBhbmQgNCBieXRlcyBmb3Igc3RvcmluZyB0aGUgdmFsdWUgaXRzZWxmKS4KKyAgIDMuIFN0cmluZyAiV0VCUCIgKFJJRkYgY29udGFpbmVyIG5hbWUpLgorICAgNC4gU3RyaW5nICJWUDhMIiAoY2h1bmsgdGFnIGZvciBsb3NzbGVzcyBlbmNvZGVkIGltYWdlIGRhdGEpLgorICAgNS4gQSBsaXR0bGUtZW5kaWFuIDMyLWJpdCB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAgbG9zc2xlc3Mgc3RyZWFtLgorICAgNi4gT25lIGJ5dGUgc2lnbmF0dXJlIDB4MmYuCisKK1RoZSBmaXJzdCAyOCBiaXRzIG9mIHRoZSBiaXRzdHJlYW0gc3BlY2lmeSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUKK2ltYWdlLiBXaWR0aCBhbmQgaGVpZ2h0IGFyZSBkZWNvZGVkIGFzIDE0LWJpdCBpbnRlZ2VycyBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBpbWFnZV93aWR0aCA9IFJlYWRCaXRzKDE0KSArIDE7CitpbnQgaW1hZ2VfaGVpZ2h0ID0gUmVhZEJpdHMoMTQpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgMTQtYml0IGR5bmFtaWNzIGZvciBpbWFnZSBzaXplIGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgYSBXZWJQCitsb3NzbGVzcyBpbWFnZSB0byAxNjM4NOKclTE2Mzg0IHBpeGVscy4KKworVGhlIGFscGhhX2lzX3VzZWQgYml0IGlzIGEgaGludCBvbmx5LCBhbmQgc2hvdWxkIG5vdCBpbXBhY3QgZGVjb2RpbmcuCitJdCBzaG91bGQgYmUgc2V0IHRvIDAgd2hlbiBhbGwgYWxwaGEgdmFsdWVzIGFyZSAyNTUgaW4gdGhlIHBpY3R1cmUsIGFuZAorMSBvdGhlcndpc2UuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGFscGhhX2lzX3VzZWQgPSBSZWFkQml0cygxKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgdmVyc2lvbl9udW1iZXIgaXMgYSAzIGJpdCBjb2RlIHRoYXQgbXVzdCBiZSBzZXQgdG8gMC4gQW55IG90aGVyIHZhbHVlCitzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gXFtBTUVOREVEXF0KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgdmVyc2lvbl9udW1iZXIgPSBSZWFkQml0cygzKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKzMgVHJhbnNmb3JtYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLQorCitUcmFuc2Zvcm1hdGlvbnMgYXJlIHJldmVyc2libGUgbWFuaXB1bGF0aW9ucyBvZiB0aGUgaW1hZ2UgZGF0YSB0aGF0IGNhbgorcmVkdWNlIHRoZSByZW1haW5pbmcgc3ltYm9saWMgZW50cm9weSBieSBtb2RlbGluZyBzcGF0aWFsIGFuZCBjb2xvcgorY29ycmVsYXRpb25zLiBUcmFuc2Zvcm1hdGlvbnMgY2FuIG1ha2UgdGhlIGZpbmFsIGNvbXByZXNzaW9uIG1vcmUgZGVuc2UuCisKK0FuIGltYWdlIGNhbiBnbyB0aHJvdWdoIGZvdXIgdHlwZXMgb2YgdHJhbnNmb3JtYXRpb24uIEEgMSBiaXQgaW5kaWNhdGVzCit0aGUgcHJlc2VuY2Ugb2YgYSB0cmFuc2Zvcm0uIEVhY2ggdHJhbnNmb3JtIGlzIGFsbG93ZWQgdG8gYmUgdXNlZCBvbmx5CitvbmNlLiBUaGUgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yIHRoZSBtYWluIGxldmVsIEFSR0IgaW1hZ2U6Cit0aGUgc3VicmVzb2x1dGlvbiBpbWFnZXMgaGF2ZSBubyB0cmFuc2Zvcm1zLCBub3QgZXZlbiB0aGUgMCBiaXQKK2luZGljYXRpbmcgdGhlIGVuZC1vZi10cmFuc2Zvcm1zLgorCitUeXBpY2FsbHkgYW4gZW5jb2RlciB3b3VsZCB1c2UgdGhlc2UgdHJhbnNmb3JtcyB0byByZWR1Y2UgdGhlIFNoYW5ub24KK2VudHJvcHkgaW4gdGhlIHJlc2lkdWFsIGltYWdlLiBBbHNvLCB0aGUgdHJhbnNmb3JtIGRhdGEgY2FuIGJlIGRlY2lkZWQKK2Jhc2VkIG9uIGVudHJvcHkgbWluaW1pemF0aW9uLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3doaWxlIChSZWFkQml0cygxKSkgeyAgLy8gVHJhbnNmb3JtIHByZXNlbnQuCisgIC8vIERlY29kZSB0cmFuc2Zvcm0gdHlwZS4KKyAgZW51bSBUcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybV90eXBlID0gUmVhZEJpdHMoMik7CisgIC8vIERlY29kZSB0cmFuc2Zvcm0gZGF0YS4KKyAgLi4uCit9CisKKy8vIERlY29kZSBhY3R1YWwgaW1hZ2UgZGF0YSAoU2VjdGlvbiA0KS4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiBhIHRyYW5zZm9ybSBpcyBwcmVzZW50IHRoZW4gdGhlIG5leHQgdHdvIGJpdHMgc3BlY2lmeSB0aGUgdHJhbnNmb3JtCit0eXBlLiBUaGVyZSBhcmUgZm91ciB0eXBlcyBvZiB0cmFuc2Zvcm1zLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2VudW0gVHJhbnNmb3JtVHlwZSB7CisgIFBSRURJQ1RPUl9UUkFOU0ZPUk0gICAgICAgICAgICAgPSAwLAorICBDT0xPUl9UUkFOU0ZPUk0gICAgICAgICAgICAgICAgID0gMSwKKyAgU1VCVFJBQ1RfR1JFRU4gICAgICAgICAgICAgICAgICA9IDIsCisgIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSAgICAgICAgPSAzLAorfTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgdHJhbnNmb3JtIHR5cGUgaXMgZm9sbG93ZWQgYnkgdGhlIHRyYW5zZm9ybSBkYXRhLiBUcmFuc2Zvcm0gZGF0YQorY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGFwcGx5IHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBhbmQKK2RlcGVuZHMgb24gdGhlIHRyYW5zZm9ybSB0eXBlLiBOZXh0IHdlIGRlc2NyaWJlIHRoZSB0cmFuc2Zvcm0gZGF0YSBmb3IKK2RpZmZlcmVudCB0eXBlcy4KKworCisjIyMgUHJlZGljdG9yIFRyYW5zZm9ybQorCitUaGUgcHJlZGljdG9yIHRyYW5zZm9ybSBjYW4gYmUgdXNlZCB0byByZWR1Y2UgZW50cm9weSBieSBleHBsb2l0aW5nIHRoZQorZmFjdCB0aGF0IG5laWdoYm9yaW5nIHBpeGVscyBhcmUgb2Z0ZW4gY29ycmVsYXRlZC4gSW4gdGhlIHByZWRpY3RvcgordHJhbnNmb3JtLCB0aGUgY3VycmVudCBwaXhlbCB2YWx1ZSBpcyBwcmVkaWN0ZWQgZnJvbSB0aGUgcGl4ZWxzIGFscmVhZHkKK2RlY29kZWQgKGluIHNjYW4tbGluZSBvcmRlcikgYW5kIG9ubHkgdGhlIHJlc2lkdWFsIHZhbHVlIChhY3R1YWwgLQorcHJlZGljdGVkKSBpcyBlbmNvZGVkLiBUaGUgX3ByZWRpY3Rpb24gbW9kZV8gZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZgorcHJlZGljdGlvbiB0byB1c2UuIFdlIGRpdmlkZSB0aGUgaW1hZ2UgaW50byBzcXVhcmVzIGFuZCBhbGwgdGhlIHBpeGVscworaW4gYSBzcXVhcmUgdXNlIHNhbWUgcHJlZGljdGlvbiBtb2RlLgorCitUaGUgZmlyc3QgMyBiaXRzIG9mIHByZWRpY3Rpb24gZGF0YSBkZWZpbmUgdGhlIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQgaW4KK251bWJlciBvZiBiaXRzLiBUaGUgbnVtYmVyIG9mIGJsb2NrIGNvbHVtbnMsIGBibG9ja194c2l6ZWAsIGlzIHVzZWQgaW4KK2luZGV4aW5nIHR3by1kaW1lbnNpb25hbGx5LgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBzaXplX2JpdHMgPSBSZWFkQml0cygzKSArIDI7CitpbnQgYmxvY2tfd2lkdGggPSAoMSA8PCBzaXplX2JpdHMpOworaW50IGJsb2NrX2hlaWdodCA9ICgxIDw8IHNpemVfYml0cyk7CisjZGVmaW5lIERJVl9ST1VORF9VUChudW0sIGRlbikgKChudW0pICsgKGRlbikgLSAxKSAvIChkZW4pKQoraW50IGJsb2NrX3hzaXplID0gRElWX1JPVU5EX1VQKGltYWdlX3dpZHRoLCAxIDw8IHNpemVfYml0cyk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHRyYW5zZm9ybSBkYXRhIGNvbnRhaW5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2sgb2YgdGhlCitpbWFnZS4gQWxsIHRoZSBgYmxvY2tfd2lkdGggKiBibG9ja19oZWlnaHRgIHBpeGVscyBvZiBhIGJsb2NrIHVzZSBzYW1lCitwcmVkaWN0aW9uIG1vZGUuIFRoZSBwcmVkaWN0aW9uIG1vZGVzIGFyZSB0cmVhdGVkIGFzIHBpeGVscyBvZiBhbiBpbWFnZQorYW5kIGVuY29kZWQgdXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaW4KK1tDaGFwdGVyIDRdKCNpbWFnZS1kYXRhKS4KKworRm9yIGEgcGl4ZWwgX3gsIHlfLCBvbmUgY2FuIGNvbXB1dGUgdGhlIHJlc3BlY3RpdmUgZmlsdGVyIGJsb2NrIGFkZHJlc3MKK2J5OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBibG9ja19pbmRleCA9ICh5ID4+IHNpemVfYml0cykgKiBibG9ja194c2l6ZSArCisgICAgICAgICAgICAgICAgICAoeCA+PiBzaXplX2JpdHMpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXJlIGFyZSAxNCBkaWZmZXJlbnQgcHJlZGljdGlvbiBtb2Rlcy4gSW4gZWFjaCBwcmVkaWN0aW9uIG1vZGUsIHRoZQorY3VycmVudCBwaXhlbCB2YWx1ZSBpcyBwcmVkaWN0ZWQgZnJvbSBvbmUgb3IgbW9yZSBuZWlnaGJvcmluZyBwaXhlbHMKK3dob3NlIHZhbHVlcyBhcmUgYWxyZWFkeSBrbm93bi4KKworV2UgY2hvb3NlIHRoZSBuZWlnaGJvcmluZyBwaXhlbHMgKFRMLCBULCBUUiwgYW5kIEwpIG9mIHRoZSBjdXJyZW50IHBpeGVsCisoUCkgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8KK08gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTworTyAgICBPICAgIE8gICAgTyAgICBUTCAgIFQgICAgVFIgICBPICAgIE8gICAgTyAgICBPCitPICAgIE8gICAgTyAgICBPICAgIEwgICAgUCAgICBYICAgIFggICAgWCAgICBYICAgIFgKK1ggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWAorWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgVEwgbWVhbnMgdG9wLWxlZnQsIFQgdG9wLCBUUiB0b3AtcmlnaHQsIEwgbGVmdCBwaXhlbC4KK0F0IHRoZSB0aW1lIG9mIHByZWRpY3RpbmcgYSB2YWx1ZSBmb3IgUCwgYWxsIHBpeGVscyBPLCBUTCwgVCwgVFIgYW5kIEwKK2hhdmUgYmVlbiBhbHJlYWR5IHByb2Nlc3NlZCwgYW5kIHBpeGVsIFAgYW5kIGFsbCBwaXhlbHMgWCBhcmUgdW5rbm93bi4KKworR2l2ZW4gdGhlIGFib3ZlIG5laWdoYm9yaW5nIHBpeGVscywgdGhlIGRpZmZlcmVudCBwcmVkaWN0aW9uIG1vZGVzIGFyZQorZGVmaW5lZCBhcyBmb2xsb3dzLgorCit8IE1vZGUgICB8IFByZWRpY3RlZCB2YWx1ZSBvZiBlYWNoIGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgICAgfAorfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgIDAgICAgIHwgMHhmZjAwMDAwMCAocmVwcmVzZW50cyBzb2xpZCBibGFjayBjb2xvciBpbiBBUkdCKSAgICAgICB8Cit8ICAxICAgICB8IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgMiAgICAgfCBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDMgICAgIHwgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA0ICAgICB8IFRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgNSAgICAgfCBBdmVyYWdlMihBdmVyYWdlMihMLCBUUiksIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDYgICAgIHwgQXZlcmFnZTIoTCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA3ICAgICB8IEF2ZXJhZ2UyKEwsIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgOCAgICAgfCBBdmVyYWdlMihUTCwgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDkgICAgIHwgQXZlcmFnZTIoVCwgVFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEwICAgICB8IEF2ZXJhZ2UyKEF2ZXJhZ2UyKEwsIFRMKSwgQXZlcmFnZTIoVCwgVFIpKSAgICAgICAgICAgICAgfAorfCAxMSAgICAgfCBTZWxlY3QoTCwgVCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTIgICAgIHwgQ2xhbXBBZGRTdWJ0cmFjdEZ1bGwoTCwgVCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEzICAgICB8IENsYW1wQWRkU3VidHJhY3RIYWxmKEF2ZXJhZ2UyKEwsIFQpLCBUTCkgICAgICAgICAgICAgICAgfAorCisKK2BBdmVyYWdlMmAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIGZvciBlYWNoIEFSR0IgY29tcG9uZW50OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3VpbnQ4IEF2ZXJhZ2UyKHVpbnQ4IGEsIHVpbnQ4IGIpIHsKKyAgcmV0dXJuIChhICsgYikgLyAyOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBTZWxlY3QgcHJlZGljdG9yIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit1aW50MzIgU2VsZWN0KHVpbnQzMiBMLCB1aW50MzIgVCwgdWludDMyIFRMKSB7CisgIC8vIEwgPSBsZWZ0IHBpeGVsLCBUID0gdG9wIHBpeGVsLCBUTCA9IHRvcCBsZWZ0IHBpeGVsLgorCisgIC8vIEFSR0IgY29tcG9uZW50IGVzdGltYXRlcyBmb3IgcHJlZGljdGlvbi4KKyAgaW50IHBBbHBoYSA9IEFMUEhBKEwpICsgQUxQSEEoVCkgLSBBTFBIQShUTCk7CisgIGludCBwUmVkID0gUkVEKEwpICsgUkVEKFQpIC0gUkVEKFRMKTsKKyAgaW50IHBHcmVlbiA9IEdSRUVOKEwpICsgR1JFRU4oVCkgLSBHUkVFTihUTCk7CisgIGludCBwQmx1ZSA9IEJMVUUoTCkgKyBCTFVFKFQpIC0gQkxVRShUTCk7CisKKyAgLy8gTWFuaGF0dGFuIGRpc3RhbmNlcyB0byBlc3RpbWF0ZXMgZm9yIGxlZnQgYW5kIHRvcCBwaXhlbHMuCisgIGludCBwTCA9IGFicyhwQWxwaGEgLSBBTFBIQShMKSkgKyBhYnMocFJlZCAtIFJFRChMKSkgKworICAgICAgICAgICBhYnMocEdyZWVuIC0gR1JFRU4oTCkpICsgYWJzKHBCbHVlIC0gQkxVRShMKSk7CisgIGludCBwVCA9IGFicyhwQWxwaGEgLSBBTFBIQShUKSkgKyBhYnMocFJlZCAtIFJFRChUKSkgKworICAgICAgICAgICBhYnMocEdyZWVuIC0gR1JFRU4oVCkpICsgYWJzKHBCbHVlIC0gQkxVRShUKSk7CisKKyAgLy8gUmV0dXJuIGVpdGhlciBsZWZ0IG9yIHRvcCwgdGhlIG9uZSBjbG9zZXIgdG8gdGhlIHByZWRpY3Rpb24uCisgIGlmIChwTCA8IHBUKSB7ICAgICAvLyBcW0FNRU5ERURcXQorICAgIHJldHVybiBMOworICB9IGVsc2UgeworICAgIHJldHVybiBUOworICB9Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGZ1bmN0aW9ucyBgQ2xhbXBBZGRTdWJ0cmFjdEZ1bGxgIGFuZCBgQ2xhbXBBZGRTdWJ0cmFjdEhhbGZgIGFyZQorcGVyZm9ybWVkIGZvciBlYWNoIEFSR0IgY29tcG9uZW50IGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gQ2xhbXAgdGhlIGlucHV0IHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LgoraW50IENsYW1wKGludCBhKSB7CisgIHJldHVybiAoYSA8IDApID8gMCA6IChhID4gMjU1KSA/ICAyNTUgOiBhOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IENsYW1wQWRkU3VidHJhY3RGdWxsKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgcmV0dXJuIENsYW1wKGEgKyBiIC0gYyk7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgQ2xhbXBBZGRTdWJ0cmFjdEhhbGYoaW50IGEsIGludCBiKSB7CisgIHJldHVybiBDbGFtcChhICsgKGEgLSBiKSAvIDIpOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXJlIGFyZSBzcGVjaWFsIGhhbmRsaW5nIHJ1bGVzIGZvciBzb21lIGJvcmRlciBwaXhlbHMuIElmIHRoZXJlIGlzIGEKK3ByZWRpY3Rpb24gdHJhbnNmb3JtLCByZWdhcmRsZXNzIG9mIHRoZSBtb2RlIFxbMC4uMTNcXSBmb3IgdGhlc2UgcGl4ZWxzLAordGhlIHByZWRpY3RlZCB2YWx1ZSBmb3IgdGhlIGxlZnQtdG9wbW9zdCBwaXhlbCBvZiB0aGUgaW1hZ2UgaXMKKzB4ZmYwMDAwMDAsIEwtcGl4ZWwgZm9yIGFsbCBwaXhlbHMgb24gdGhlIHRvcCByb3csIGFuZCBULXBpeGVsIGZvciBhbGwKK3BpeGVscyBvbiB0aGUgbGVmdG1vc3QgY29sdW1uLgorCitBZGRyZXNzaW5nIHRoZSBUUi1waXhlbCBmb3IgcGl4ZWxzIG9uIHRoZSByaWdodG1vc3QgY29sdW1uIGlzCitleGNlcHRpb25hbC4gVGhlIHBpeGVscyBvbiB0aGUgcmlnaHRtb3N0IGNvbHVtbiBhcmUgcHJlZGljdGVkIGJ5IHVzaW5nCit0aGUgbW9kZXMgXFswLi4xM1xdIGp1c3QgbGlrZSBwaXhlbHMgbm90IG9uIGJvcmRlciwgYnV0IGJ5IHVzaW5nIHRoZQorbGVmdG1vc3QgcGl4ZWwgb24gdGhlIHNhbWUgcm93IGFzIHRoZSBjdXJyZW50IFRSLXBpeGVsLiBUaGUgVFItcGl4ZWwKK29mZnNldCBpbiBtZW1vcnkgaXMgdGhlIHNhbWUgZm9yIGJvcmRlciBhbmQgbm9uLWJvcmRlciBwaXhlbHMuCisKKworIyMjIENvbG9yIFRyYW5zZm9ybQorCitUaGUgZ29hbCBvZiB0aGUgY29sb3IgdHJhbnNmb3JtIGlzIHRvIGRlY29ycmVsYXRlIHRoZSBSLCBHIGFuZCBCIHZhbHVlcworb2YgZWFjaCBwaXhlbC4gQ29sb3IgdHJhbnNmb3JtIGtlZXBzIHRoZSBncmVlbiAoRykgdmFsdWUgYXMgaXQgaXMsCit0cmFuc2Zvcm1zIHJlZCAoUikgYmFzZWQgb24gZ3JlZW4gYW5kIHRyYW5zZm9ybXMgYmx1ZSAoQikgYmFzZWQgb24gZ3JlZW4KK2FuZCB0aGVuIGJhc2VkIG9uIHJlZC4KKworQXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBwcmVkaWN0b3IgdHJhbnNmb3JtLCBmaXJzdCB0aGUgaW1hZ2UgaXMgZGl2aWRlZAoraW50byBibG9ja3MgYW5kIHRoZSBzYW1lIHRyYW5zZm9ybSBtb2RlIGlzIHVzZWQgZm9yIGFsbCB0aGUgcGl4ZWxzIGluIGEKK2Jsb2NrLiBGb3IgZWFjaCBibG9jayB0aGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgY29sb3IgdHJhbnNmb3JtIGVsZW1lbnRzLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDggZ3JlZW5fdG9fcmVkOworICB1aW50OCBncmVlbl90b19ibHVlOworICB1aW50OCByZWRfdG9fYmx1ZTsKK30gQ29sb3JUcmFuc2Zvcm1FbGVtZW50Oworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBhY3R1YWwgY29sb3IgdHJhbnNmb3JtYXRpb24gaXMgZG9uZSBieSBkZWZpbmluZyBhIGNvbG9yIHRyYW5zZm9ybQorZGVsdGEuIFRoZSBjb2xvciB0cmFuc2Zvcm0gZGVsdGEgZGVwZW5kcyBvbiB0aGUgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAsCit3aGljaCBpcyB0aGUgc2FtZSBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gYSBwYXJ0aWN1bGFyIGJsb2NrLiBUaGUgZGVsdGEgaXMKK2FkZGVkIGR1cmluZyBjb2xvciB0cmFuc2Zvcm0uIFRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSB0aGVuIGlzIGp1c3QKK3N1YnRyYWN0aW5nIHRob3NlIGRlbHRhcy4KKworVGhlIGNvbG9yIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBDb2xvclRyYW5zZm9ybSh1aW50OCByZWQsIHVpbnQ4IGJsdWUsIHVpbnQ4IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICBDb2xvclRyYW5zZm9ybUVsZW1lbnQgKnRyYW5zLAorICAgICAgICAgICAgICAgICAgICB1aW50OCAqbmV3X3JlZCwgdWludDggKm5ld19ibHVlKSB7CisgIC8vIFRyYW5zZm9ybWVkIHZhbHVlcyBvZiByZWQgYW5kIGJsdWUgY29tcG9uZW50cworICB1aW50MzIgdG1wX3JlZCA9IHJlZDsKKyAgdWludDMyIHRtcF9ibHVlID0gYmx1ZTsKKworICAvLyBBcHBseWluZyB0cmFuc2Zvcm0gaXMganVzdCBhZGRpbmcgdGhlIHRyYW5zZm9ybSBkZWx0YXMKKyAgdG1wX3JlZCAgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YSh0cmFucy0+Z3JlZW5fdG9fcmVkLCBncmVlbik7CisgIHRtcF9ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEodHJhbnMtPmdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKKyAgdG1wX2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YSh0cmFucy0+cmVkX3RvX2JsdWUsIHJlZCk7CisKKyAgKm5ld19yZWQgPSB0bXBfcmVkICYgMHhmZjsKKyAgKm5ld19ibHVlID0gdG1wX2JsdWUgJiAweGZmOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2BDb2xvclRyYW5zZm9ybURlbHRhYCBpcyBjb21wdXRlZCB1c2luZyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyCityZXByZXNlbnRpbmcgYSAzLjUtZml4ZWQtcG9pbnQgbnVtYmVyLCBhbmQgYSBzaWduZWQgOC1iaXQgUkdCIGNvbG9yCitjaGFubmVsIChjKSBcWy0xMjguLjEyN1xdIGFuZCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50OCBDb2xvclRyYW5zZm9ybURlbHRhKGludDggdCwgaW50OCBjKSB7CisgIHJldHVybiAodCAqIGMpID4+IDU7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBjb252ZXJzaW9uIGZyb20gdGhlIDgtYml0IHVuc2lnbmVkIHJlcHJlc2VudGF0aW9uICh1aW50OCkgdG8gdGhlIDgtYml0CitzaWduZWQgb25lIChpbnQ4KSBpcyByZXF1aXJlZCBiZWZvcmUgY2FsbGluZyBDb2xvclRyYW5zZm9ybURlbHRhKCkuCitJdCBzaG91bGQgYmUgcGVyZm9ybWVkIHVzaW5nIDgtYml0IHR3bydzIGNvbXBsZW1lbnQgKHRoYXQgaXM6IHVpbnQ4IHJhbmdlCitcWzEyOC0yNTVcXSBpcyBtYXBwZWQgdG8gdGhlIFxbLTEyOCwgLTFcXSByYW5nZSBvZiBpdHMgY29udmVydGVkIGludDggdmFsdWUpLgorCitUaGUgbXVsdGlwbGljYXRpb24gaXMgdG8gYmUgZG9uZSB1c2luZyBtb3JlIHByZWNpc2lvbiAod2l0aCBhdCBsZWFzdAorMTYtYml0IGR5bmFtaWNzKS4gVGhlIHNpZ24gZXh0ZW5zaW9uIHByb3BlcnR5IG9mIHRoZSBzaGlmdCBvcGVyYXRpb24KK2RvZXMgbm90IG1hdHRlciBoZXJlOiBvbmx5IHRoZSBsb3dlc3QgOCBiaXRzIGFyZSB1c2VkIGZyb20gdGhlIHJlc3VsdCwKK2FuZCB0aGVyZSB0aGUgc2lnbiBleHRlbnNpb24gc2hpZnRpbmcgYW5kIHVuc2lnbmVkIHNoaWZ0aW5nIGFyZQorY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuCisKK05vdyB3ZSBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgY29sb3IgdHJhbnNmb3JtIGRhdGEgc28gdGhhdCBkZWNvZGluZworY2FuIGFwcGx5IHRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSBhbmQgcmVjb3ZlciB0aGUgb3JpZ2luYWwgcmVkIGFuZAorYmx1ZSB2YWx1ZXMuIFRoZSBmaXJzdCAzIGJpdHMgb2YgdGhlIGNvbG9yIHRyYW5zZm9ybSBkYXRhIGNvbnRhaW4gdGhlCit3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBibG9jayBpbiBudW1iZXIgb2YgYml0cywganVzdCBsaWtlIHRoZQorcHJlZGljdG9yIHRyYW5zZm9ybToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgc2l6ZV9iaXRzID0gUmVhZEJpdHMoMykgKyAyOworaW50IGJsb2NrX3dpZHRoID0gMSA8PCBzaXplX2JpdHM7CitpbnQgYmxvY2tfaGVpZ2h0ID0gMSA8PCBzaXplX2JpdHM7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBjb2xvciB0cmFuc2Zvcm0gZGF0YSBjb250YWlucworYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgaW5zdGFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBibG9jayBvZiB0aGUKK2ltYWdlLiBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBpbnN0YW5jZXMgYXJlIHRyZWF0ZWQgYXMgcGl4ZWxzIG9mIGFuCitpbWFnZSBhbmQgZW5jb2RlZCB1c2luZyB0aGUgbWV0aG9kcyBkZXNjcmliZWQgaW4KK1tDaGFwdGVyIDRdKCNpbWFnZS1kYXRhKS4KKworRHVyaW5nIGRlY29kaW5nLCBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBpbnN0YW5jZXMgb2YgdGhlIGJsb2NrcyBhcmUKK2RlY29kZWQgYW5kIHRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSBpcyBhcHBsaWVkIG9uIHRoZSBBUkdCIHZhbHVlcyBvZgordGhlIHBpeGVscy4gQXMgbWVudGlvbmVkIGVhcmxpZXIsIHRoYXQgaW52ZXJzZSBjb2xvciB0cmFuc2Zvcm0gaXMganVzdAorc3VidHJhY3RpbmcgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgdmFsdWVzIGZyb20gdGhlIHJlZCBhbmQgYmx1ZQorY2hhbm5lbHMuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBJbnZlcnNlVHJhbnNmb3JtKHVpbnQ4IHJlZCwgdWludDggZ3JlZW4sIHVpbnQ4IGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgQ29sb3JUcmFuc2Zvcm1FbGVtZW50ICpwLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpuZXdfcmVkLCB1aW50OCAqbmV3X2JsdWUpIHsKKyAgLy8gQXBwbHlpbmcgaW52ZXJzZSB0cmFuc2Zvcm0gaXMganVzdCBzdWJ0cmFjdGluZyB0aGUKKyAgLy8gY29sb3IgdHJhbnNmb3JtIGRlbHRhcworICByZWQgIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocC0+Z3JlZW5fdG9fcmVkXywgIGdyZWVuKTsKKyAgYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHAtPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7CisgIGJsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShwLT5yZWRfdG9fYmx1ZV8sIHJlZCAmIDB4ZmYpOworCisgICpuZXdfcmVkID0gcmVkICYgMHhmZjsKKyAgKm5ld19ibHVlID0gYmx1ZSAmIDB4ZmY7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCisjIyMgU3VidHJhY3QgR3JlZW4gVHJhbnNmb3JtCisKK1RoZSBzdWJ0cmFjdCBncmVlbiB0cmFuc2Zvcm0gc3VidHJhY3RzIGdyZWVuIHZhbHVlcyBmcm9tIHJlZCBhbmQgYmx1ZQordmFsdWVzIG9mIGVhY2ggcGl4ZWwuIFdoZW4gdGhpcyB0cmFuc2Zvcm0gaXMgcHJlc2VudCwgdGhlIGRlY29kZXIgbmVlZHMKK3RvIGFkZCB0aGUgZ3JlZW4gdmFsdWUgdG8gYm90aCByZWQgYW5kIGJsdWUuIFRoZXJlIGlzIG5vIGRhdGEgYXNzb2NpYXRlZAord2l0aCB0aGlzIHRyYW5zZm9ybS4gVGhlIGRlY29kZXIgYXBwbGllcyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gYXMKK2ZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1aW50OCBncmVlbiwgdWludDggKnJlZCwgdWludDggKmJsdWUpIHsKKyAgKnJlZCAgPSAoKnJlZCAgKyBncmVlbikgJiAweGZmOworICAqYmx1ZSA9ICgqYmx1ZSArIGdyZWVuKSAmIDB4ZmY7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhpcyB0cmFuc2Zvcm0gaXMgcmVkdW5kYW50IGFzIGl0IGNhbiBiZSBtb2RlbGVkIHVzaW5nIHRoZSBjb2xvcgordHJhbnNmb3JtLCBidXQgaXQgaXMgc3RpbGwgb2Z0ZW4gdXNlZnVsLiBTaW5jZSBpdCBjYW4gZXh0ZW5kIHRoZQorZHluYW1pY3Mgb2YgdGhlIGNvbG9yIHRyYW5zZm9ybSBhbmQgdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBkYXRhIGhlcmUsCit0aGUgc3VidHJhY3QgZ3JlZW4gdHJhbnNmb3JtIGNhbiBiZSBjb2RlZCB1c2luZyBmZXdlciBiaXRzIHRoYW4gYQorZnVsbC1ibG93biBjb2xvciB0cmFuc2Zvcm0uCisKKworIyMjIENvbG9yIEluZGV4aW5nIFRyYW5zZm9ybQorCitJZiB0aGVyZSBhcmUgbm90IG1hbnkgdW5pcXVlIHBpeGVsIHZhbHVlcywgaXQgbWF5IGJlIG1vcmUgZWZmaWNpZW50IHRvCitjcmVhdGUgYSBjb2xvciBpbmRleCBhcnJheSBhbmQgcmVwbGFjZSB0aGUgcGl4ZWwgdmFsdWVzIGJ5IHRoZSBhcnJheSdzCitpbmRpY2VzLiBUaGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGFjaGlldmVzIHRoaXMuIChJbiB0aGUgY29udGV4dCBvZgorV2ViUCBsb3NzbGVzcywgd2Ugc3BlY2lmaWNhbGx5IGRvIG5vdCBjYWxsIHRoaXMgYSBwYWxldHRlIHRyYW5zZm9ybQorYmVjYXVzZSBhIHNpbWlsYXIgYnV0IG1vcmUgZHluYW1pYyBjb25jZXB0IGV4aXN0cyBpbiBXZWJQIGxvc3NsZXNzCitlbmNvZGluZzogY29sb3IgY2FjaGUuKQorCitUaGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGNoZWNrcyBmb3IgdGhlIG51bWJlciBvZiB1bmlxdWUgQVJHQiB2YWx1ZXMKK2luIHRoZSBpbWFnZS4gSWYgdGhhdCBudW1iZXIgaXMgYmVsb3cgYSB0aHJlc2hvbGQgKDI1NiksIGl0IGNyZWF0ZXMgYW4KK2FycmF5IG9mIHRob3NlIEFSR0IgdmFsdWVzLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gcmVwbGFjZSB0aGUgcGl4ZWwKK3ZhbHVlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4OiB0aGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGUgcGl4ZWxzIGFyZQorcmVwbGFjZWQgd2l0aCB0aGUgaW5kZXg7IGFsbCBhbHBoYSB2YWx1ZXMgYXJlIHNldCB0byAyNTU7IGFsbCByZWQgYW5kCitibHVlIHZhbHVlcyB0byAwLgorCitUaGUgdHJhbnNmb3JtIGRhdGEgY29udGFpbnMgY29sb3IgdGFibGUgc2l6ZSBhbmQgdGhlIGVudHJpZXMgaW4gdGhlCitjb2xvciB0YWJsZS4gVGhlIGRlY29kZXIgcmVhZHMgdGhlIGNvbG9yIGluZGV4aW5nIHRyYW5zZm9ybSBkYXRhIGFzCitmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIDggYml0IHZhbHVlIGZvciBjb2xvciB0YWJsZSBzaXplCitpbnQgY29sb3JfdGFibGVfc2l6ZSA9IFJlYWRCaXRzKDgpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgY29sb3IgdGFibGUgaXMgc3RvcmVkIHVzaW5nIHRoZSBpbWFnZSBzdG9yYWdlIGZvcm1hdCBpdHNlbGYuIFRoZQorY29sb3IgdGFibGUgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgYW4gaW1hZ2UsIHdpdGhvdXQgdGhlIFJJRkYKK2hlYWRlciwgaW1hZ2Ugc2l6ZSwgYW5kIHRyYW5zZm9ybXMsIGFzc3VtaW5nIGEgaGVpZ2h0IG9mIG9uZSBwaXhlbCBhbmQKK2Egd2lkdGggb2YgYGNvbG9yX3RhYmxlX3NpemVgLiBUaGUgY29sb3IgdGFibGUgaXMgYWx3YXlzCitzdWJ0cmFjdGlvbi1jb2RlZCB0byByZWR1Y2UgaW1hZ2UgZW50cm9weS4gVGhlIGRlbHRhcyBvZiBwYWxldHRlIGNvbG9ycworY29udGFpbiB0eXBpY2FsbHkgbXVjaCBsZXNzIGVudHJvcHkgdGhhbiB0aGUgY29sb3JzIHRoZW1zZWx2ZXMsIGxlYWRpbmcKK3RvIHNpZ25pZmljYW50IHNhdmluZ3MgZm9yIHNtYWxsZXIgaW1hZ2VzLiBJbiBkZWNvZGluZywgZXZlcnkgZmluYWwKK2NvbG9yIGluIHRoZSBjb2xvciB0YWJsZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIHRoZSBwcmV2aW91cyBjb2xvcgorY29tcG9uZW50IHZhbHVlcyBieSBlYWNoIEFSR0IgY29tcG9uZW50IHNlcGFyYXRlbHksIGFuZCBzdG9yaW5nIHRoZQorbGVhc3Qgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSByZXN1bHQuCisKK1RoZSBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgdGhlIGltYWdlIGlzIHNpbXBseSByZXBsYWNpbmcgdGhlIHBpeGVsIHZhbHVlcworKHdoaWNoIGFyZSBpbmRpY2VzIHRvIHRoZSBjb2xvciB0YWJsZSkgd2l0aCB0aGUgYWN0dWFsIGNvbG9yIHRhYmxlCit2YWx1ZXMuIFRoZSBpbmRleGluZyBpcyBkb25lIGJhc2VkIG9uIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIEFSR0IKK2NvbG9yLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIEludmVyc2UgdHJhbnNmb3JtCithcmdiID0gY29sb3JfdGFibGVbR1JFRU4oYXJnYildOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIHRoZSBpbmRleCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbiBjb2xvcl90YWJsZV9zaXplLCB0aGUgYXJnYiBjb2xvciB2YWx1ZQorc2hvdWxkIGJlIHNldCB0byAweDAwMDAwMDAwICh0cmFuc3BhcmVudCBibGFjaykuICBcW0FNRU5ERURcXQorCitXaGVuIHRoZSBjb2xvciB0YWJsZSBpcyBzbWFsbCAoZXF1YWwgdG8gb3IgbGVzcyB0aGFuIDE2IGNvbG9ycyksIHNldmVyYWwKK3BpeGVscyBhcmUgYnVuZGxlZCBpbnRvIGEgc2luZ2xlIHBpeGVsLiBUaGUgcGl4ZWwgYnVuZGxpbmcgcGFja3Mgc2V2ZXJhbAorKDIsIDQsIG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLCByZWR1Y2luZyB0aGUgaW1hZ2Ugd2lkdGgKK3Jlc3BlY3RpdmVseS4gUGl4ZWwgYnVuZGxpbmcgYWxsb3dzIGZvciBhIG1vcmUgZWZmaWNpZW50IGpvaW50CitkaXN0cmlidXRpb24gZW50cm9weSBjb2Rpbmcgb2YgbmVpZ2hib3JpbmcgcGl4ZWxzLCBhbmQgZ2l2ZXMgc29tZQorYXJpdGhtZXRpYyBjb2RpbmctbGlrZSBiZW5lZml0cyB0byB0aGUgZW50cm9weSBjb2RlLCBidXQgaXQgY2FuIG9ubHkgYmUKK3VzZWQgd2hlbiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgdW5pcXVlIHZhbHVlcy4KKworYGNvbG9yX3RhYmxlX3NpemVgIHNwZWNpZmllcyBob3cgbWFueSBwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCB3aWR0aF9iaXRzOworaWYgKGNvbG9yX3RhYmxlX3NpemUgPD0gMikgeworICB3aWR0aF9iaXRzID0gMzsKK30gZWxzZSBpZiAoY29sb3JfdGFibGVfc2l6ZSA8PSA0KSB7CisgIHdpZHRoX2JpdHMgPSAyOworfSBlbHNlIGlmIChjb2xvcl90YWJsZV9zaXplIDw9IDE2KSB7CisgIHdpZHRoX2JpdHMgPSAxOworfSBlbHNlIHsKKyAgd2lkdGhfYml0cyA9IDA7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworYHdpZHRoX2JpdHNgIGhhcyBhIHZhbHVlIG9mIDAsIDEsIDIgb3IgMy4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBubworcGl4ZWwgYnVuZGxpbmcgdG8gYmUgZG9uZSBmb3IgdGhlIGltYWdlLiBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdHdvCitwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyLCBhbmQgZWFjaCBwaXhlbCBoYXMgYSByYW5nZSBvZiBcWzAuLjE1XF0uIEEKK3ZhbHVlIG9mIDIgaW5kaWNhdGVzIHRoYXQgZm91ciBwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyLCBhbmQgZWFjaAorcGl4ZWwgaGFzIGEgcmFuZ2Ugb2YgXFswLi4zXF0uIEEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgdGhhdCBlaWdodCBwaXhlbHMKK2FyZSBjb21iaW5lZCB0b2dldGhlciBhbmQgZWFjaCBwaXhlbCBoYXMgYSByYW5nZSBvZiBcWzAuLjFcXSwgaS5lLiwgYQorYmluYXJ5IHZhbHVlLgorCitUaGUgdmFsdWVzIGFyZSBwYWNrZWQgaW50byB0aGUgZ3JlZW4gY29tcG9uZW50IGFzIGZvbGxvd3M6CisKKyAgKiBgd2lkdGhfYml0c2AgPSAxOiBmb3IgZXZlcnkgeCB2YWx1ZSB3aGVyZSB4IOKJoSAwIChtb2QgMiksIGEgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IGlzIHBvc2l0aW9uZWQgaW50byB0aGUgNCBsZWFzdC1zaWduaWZpY2FudCBiaXRzIG9mIHRoZQorICAgIGdyZWVuIHZhbHVlIGF0IHggLyAyLCBhIGdyZWVuIHZhbHVlIGF0IHggKyAxIGlzIHBvc2l0aW9uZWQgaW50byB0aGUKKyAgICA0IG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDIuCisgICogYHdpZHRoX2JpdHNgID0gMjogZm9yIGV2ZXJ5IHggdmFsdWUgd2hlcmUgeCDiiaEgMCAobW9kIDQpLCBhIGdyZWVuCisgICAgdmFsdWUgYXQgeCBpcyBwb3NpdGlvbmVkIGludG8gdGhlIDIgbGVhc3Qtc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUKKyAgICBncmVlbiB2YWx1ZSBhdCB4IC8gNCwgZ3JlZW4gdmFsdWVzIGF0IHggKyAxIHRvIHggKyAzIGluIG9yZGVyIHRvIHRoZQorICAgIG1vcmUgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDQuCisgICogYHdpZHRoX2JpdHNgID0gMzogZm9yIGV2ZXJ5IHggdmFsdWUgd2hlcmUgeCDiiaEgMCAobW9kIDgpLCBhIGdyZWVuCisgICAgdmFsdWUgYXQgeCBpcyBwb3NpdGlvbmVkIGludG8gdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IC8gOCwgZ3JlZW4gdmFsdWVzIGF0IHggKyAxIHRvIHggKyA3IGluIG9yZGVyIHRvIHRoZSBtb3JlCisgICAgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDguCisKKworNCBJbWFnZSBEYXRhCistLS0tLS0tLS0tLS0KKworSW1hZ2UgZGF0YSBpcyBhbiBhcnJheSBvZiBwaXhlbCB2YWx1ZXMgaW4gc2Nhbi1saW5lIG9yZGVyLgorCisjIyMgNC4xIFJvbGVzIG9mIEltYWdlIERhdGEKKworV2UgdXNlIGltYWdlIGRhdGEgaW4gZml2ZSBkaWZmZXJlbnQgcm9sZXM6CisKKyAgMS4gQVJHQiBpbWFnZTogU3RvcmVzIHRoZSBhY3R1YWwgcGl4ZWxzIG9mIHRoZSBpbWFnZS4KKyAgMS4gRW50cm9weSBpbWFnZTogU3RvcmVzIHRoZQorICAgICBbbWV0YSBIdWZmbWFuIGNvZGVzXSgjZGVjb2Rpbmctb2YtbWV0YS1odWZmbWFuLWNvZGVzKS4gVGhlIHJlZCBhbmQgZ3JlZW4KKyAgICAgY29tcG9uZW50cyBvZiBhIHBpeGVsIGRlZmluZSB0aGUgbWV0YSBIdWZmbWFuIGNvZGUgdXNlZCBpbiBhIHBhcnRpY3VsYXIKKyAgICAgYmxvY2sgb2YgdGhlIEFSR0IgaW1hZ2UuCisgIDEuIFByZWRpY3RvciBpbWFnZTogU3RvcmVzIHRoZSBtZXRhZGF0YSBmb3IgW1ByZWRpY3RvcgorICAgICBUcmFuc2Zvcm1dKCNwcmVkaWN0b3ItdHJhbnNmb3JtKS4gVGhlIGdyZWVuIGNvbXBvbmVudCBvZiBhIHBpeGVsIGRlZmluZXMKKyAgICAgd2hpY2ggb2YgdGhlIDE0IHByZWRpY3RvcnMgaXMgdXNlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyIGJsb2NrIG9mIHRoZQorICAgICBBUkdCIGltYWdlLgorICAxLiBDb2xvciB0cmFuc2Zvcm0gaW1hZ2UuIEl0IGlzIGNyZWF0ZWQgYnkgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgdmFsdWVzCisgICAgIChkZWZpbmVkIGluIFtDb2xvciBUcmFuc2Zvcm1dKCNjb2xvci10cmFuc2Zvcm0pKSBmb3IgZGlmZmVyZW50IGJsb2NrcyBvZgorICAgICB0aGUgaW1hZ2UuIEVhY2ggYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgYCdjdGUnYCBpcyB0cmVhdGVkIGFzIGEgcGl4ZWwgd2hvc2UKKyAgICAgYWxwaGEgY29tcG9uZW50IGlzIGAyNTVgLCByZWQgY29tcG9uZW50IGlzIGBjdGUucmVkX3RvX2JsdWVgLCBncmVlbgorICAgICBjb21wb25lbnQgaXMgYGN0ZS5ncmVlbl90b19ibHVlYCBhbmQgYmx1ZSBjb21wb25lbnQgaXMgYGN0ZS5ncmVlbl90b19yZWRgLgorICAxLiBDb2xvciBpbmRleGluZyBpbWFnZTogQW4gYXJyYXkgb2Ygb2Ygc2l6ZSBgY29sb3JfdGFibGVfc2l6ZWAgKHVwIHRvIDI1NgorICAgICBBUkdCIHZhbHVlcykgc3RvcmluZyB0aGUgbWV0YWRhdGEgZm9yIHRoZQorICAgICBbQ29sb3IgSW5kZXhpbmcgVHJhbnNmb3JtXSgjY29sb3ItaW5kZXhpbmctdHJhbnNmb3JtKS4gVGhpcyBpcyBzdG9yZWQgYXMgYW4KKyAgICAgaW1hZ2Ugb2Ygd2lkdGggYGNvbG9yX3RhYmxlX3NpemVgIGFuZCBoZWlnaHQgYDFgLgorCisjIyMgNC4yIEVuY29kaW5nIG9mIEltYWdlIGRhdGEKKworVGhlIGVuY29kaW5nIG9mIGltYWdlIGRhdGEgaXMgaW5kZXBlbmRlbnQgb2YgaXRzIHJvbGUuCisKK1RoZSBpbWFnZSBpcyBmaXJzdCBkaXZpZGVkIGludG8gYSBzZXQgb2YgZml4ZWQtc2l6ZSBibG9ja3MgKHR5cGljYWxseSAxNngxNgorYmxvY2tzKS4gRWFjaCBvZiB0aGVzZSBibG9ja3MgYXJlIG1vZGVsZWQgdXNpbmcgdGhlaXIgb3duIGVudHJvcHkgY29kZXMuIEFsc28sCitzZXZlcmFsIGJsb2NrcyBtYXkgc2hhcmUgdGhlIHNhbWUgZW50cm9weSBjb2Rlcy4KKworKipSYXRpb25hbGU6KiogU3RvcmluZyBhbiBlbnRyb3B5IGNvZGUgaW5jdXJzIGEgY29zdC4gVGhpcyBjb3N0IGNhbiBiZSBtaW5pbWl6ZWQKK2lmIHN0YXRpc3RpY2FsbHkgc2ltaWxhciBibG9ja3Mgc2hhcmUgYW4gZW50cm9weSBjb2RlLCB0aGVyZWJ5IHN0b3JpbmcgdGhhdCBjb2RlCitvbmx5IG9uY2UuIEZvciBleGFtcGxlLCBhbiBlbmNvZGVyIGNhbiBmaW5kIHNpbWlsYXIgYmxvY2tzIGJ5IGNsdXN0ZXJpbmcgdGhlbQordXNpbmcgdGhlaXIgc3RhdGlzdGljYWwgcHJvcGVydGllcywgb3IgYnkgcmVwZWF0ZWRseSBqb2luaW5nIGEgcGFpciBvZiByYW5kb21seQorc2VsZWN0ZWQgY2x1c3RlcnMgd2hlbiBpdCByZWR1Y2VzIHRoZSBvdmVyYWxsIGFtb3VudCBvZiBiaXRzIG5lZWRlZCB0byBlbmNvZGUKK3RoZSBpbWFnZS4KKworRWFjaCBwaXhlbCBpcyBlbmNvZGVkIHVzaW5nIG9uZSBvZiB0aGUgdGhyZWUgcG9zc2libGUgbWV0aG9kczoKKworICAxLiBIdWZmbWFuIGNvZGVkIGxpdGVyYWw6IGVhY2ggY2hhbm5lbCAoZ3JlZW4sIHJlZCwgYmx1ZSBhbmQgYWxwaGEpIGlzCisgICAgIGVudHJvcHktY29kZWQgaW5kZXBlbmRlbnRseTsKKyAgMi4gTFo3NyBiYWNrd2FyZCByZWZlcmVuY2U6IGEgc2VxdWVuY2Ugb2YgcGl4ZWxzIGFyZSBjb3BpZWQgZnJvbSBlbHNld2hlcmUKKyAgICAgaW4gdGhlIGltYWdlOyBvcgorICAzLiBDb2xvciBjYWNoZSBjb2RlOiB1c2luZyBhIHNob3J0IG11bHRpcGxpY2F0aXZlIGhhc2ggY29kZSAoY29sb3IgY2FjaGUKKyAgICAgaW5kZXgpIG9mIGEgcmVjZW50bHkgc2VlbiBjb2xvci4KKworVGhlIGZvbGxvd2luZyBzdWItc2VjdGlvbnMgZGVzY3JpYmUgZWFjaCBvZiB0aGVzZSBpbiBkZXRhaWwuCisKKyMjIyMgNC4yLjEgSHVmZm1hbiBDb2RlZCBMaXRlcmFscworCitUaGUgcGl4ZWwgaXMgc3RvcmVkIGFzIEh1ZmZtYW4gY29kZWQgdmFsdWVzIG9mIGdyZWVuLCByZWQsIGJsdWUgYW5kIGFscGhhIChpbgordGhhdCBvcmRlcikuIFNlZSBbdGhpcyBzZWN0aW9uXSgjZGVjb2RpbmctZW50cm9weS1jb2RlZC1pbWFnZS1kYXRhKSBmb3IgZGV0YWlscy4KKworIyMjIyA0LjIuMiBMWjc3IEJhY2t3YXJkIFJlZmVyZW5jZQorCitCYWNrd2FyZCByZWZlcmVuY2VzIGFyZSB0dXBsZXMgb2YgX2xlbmd0aF8gYW5kIF9kaXN0YW5jZSBjb2RlXzoKKworICAqIExlbmd0aCBpbmRpY2F0ZXMgaG93IG1hbnkgcGl4ZWxzIGluIHNjYW4tbGluZSBvcmRlciBhcmUgdG8gYmUgY29waWVkLgorICAqIERpc3RhbmNlIGNvZGUgaXMgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgYSBwcmV2aW91c2x5IHNlZW4KKyAgICBwaXhlbCwgZnJvbSB3aGljaCB0aGUgcGl4ZWxzIGFyZSB0byBiZSBjb3BpZWQuIFRoZSBleGFjdCBtYXBwaW5nIGlzCisgICAgZGVzY3JpYmVkIFtiZWxvd10oI2Rpc3RhbmNlLW1hcHBpbmcpLgorCitUaGUgbGVuZ3RoIGFuZCBkaXN0YW5jZSB2YWx1ZXMgYXJlIHN0b3JlZCB1c2luZyAqKkxaNzcgcHJlZml4IGNvZGluZyoqLgorCitMWjc3IHByZWZpeCBjb2RpbmcgZGl2aWRlcyBsYXJnZSBpbnRlZ2VyIHZhbHVlcyBpbnRvIHR3byBwYXJ0czogdGhlIF9wcmVmaXgKK2NvZGVfIGFuZCB0aGUgX2V4dHJhIGJpdHNfOiB0aGUgcHJlZml4IGNvZGUgaXMgc3RvcmVkIHVzaW5nIGFuIGVudHJvcHkgY29kZSwKK3doaWxlIHRoZSBleHRyYSBiaXRzIGFyZSBzdG9yZWQgYXMgdGhleSBhcmUgKHdpdGhvdXQgYW4gZW50cm9weSBjb2RlKS4KKworKipSYXRpb25hbGUqKjogVGhpcyBhcHByb2FjaCByZWR1Y2VzIHRoZSBzdG9yYWdlIHJlcXVpcmVtZW50IGZvciB0aGUgZW50cm9weQorY29kZS4gQWxzbywgbGFyZ2UgdmFsdWVzIGFyZSB1c3VhbGx5IHJhcmUsIGFuZCBzbyBleHRyYSBiaXRzIHdvdWxkIGJlIHVzZWQgZm9yCit2ZXJ5IGZldyB2YWx1ZXMgaW4gdGhlIGltYWdlLiBUaHVzLCB0aGlzIGFwcHJvYWNoIHJlc3VsdHMgaW4gYSBiZXR0ZXIKK2NvbXByZXNzaW9uIG92ZXJhbGwuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVub3RlcyB0aGUgcHJlZml4IGNvZGVzIGFuZCBleHRyYSBiaXRzIHVzZWQgZm9yIHN0b3JpbmcKK2RpZmZlcmVudCByYW5nZSBvZiB2YWx1ZXMuCisKK05vdGU6IFRoZSBtYXhpbXVtIGJhY2t3YXJkIHJlZmVyZW5jZSBsZW5ndGggaXMgbGltaXRlZCB0byA0MDk2LiBIZW5jZSwgb25seSB0aGUKK2ZpcnN0IDI0IHByZWZpeCBjb2RlcyAod2l0aCB0aGUgcmVzcGVjdGl2ZSBleHRyYSBiaXRzKSBhcmUgbWVhbmluZ2Z1bCBmb3IgbGVuZ3RoCit2YWx1ZXMuIEZvciBkaXN0YW5jZSB2YWx1ZXMsIGhvd2V2ZXIsIGFsbCB0aGUgNDAgcHJlZml4IGNvZGVzIGFyZSB2YWxpZC4KKworfCBWYWx1ZSByYW5nZSAgICAgfCBQcmVmaXggY29kZSB8IEV4dHJhIGJpdHMgfAorfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfAorfCAxICAgICAgICAgICAgICAgfCAwICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCAyICAgICAgICAgICAgICAgfCAxICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCAzICAgICAgICAgICAgICAgfCAyICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCA0ICAgICAgICAgICAgICAgfCAzICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCA1Li42ICAgICAgICAgICAgfCA0ICAgICAgICAgICB8IDEgICAgICAgICAgfAorfCA3Li44ICAgICAgICAgICAgfCA1ICAgICAgICAgICB8IDEgICAgICAgICAgfAorfCA5Li4xMiAgICAgICAgICAgfCA2ICAgICAgICAgICB8IDIgICAgICAgICAgfAorfCAxMy4uMTYgICAgICAgICAgfCA3ICAgICAgICAgICB8IDIgICAgICAgICAgfAorfCAuLi4gICAgICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgfAorfCAzMDcyLi40MDk2ICAgICAgfCAyMyAgICAgICAgICB8IDEwICAgICAgICAgfAorfCAuLi4gICAgICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgfAorfCA1MjQyODkuLjc4NjQzMiAgfCAzOCAgICAgICAgICB8IDE4ICAgICAgICAgfAorfCA3ODY0MzMuLjEwNDg1NzYgfCAzOSAgICAgICAgICB8IDE4ICAgICAgICAgfAorCitUaGUgcHNldWRvY29kZSB0byBvYnRhaW4gYSAobGVuZ3RoIG9yIGRpc3RhbmNlKSB2YWx1ZSBmcm9tIHRoZSBwcmVmaXggY29kZSBpcworYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpZiAocHJlZml4X2NvZGUgPCA0KSB7CisgIHJldHVybiBwcmVmaXhfY29kZSArIDE7Cit9CitpbnQgZXh0cmFfYml0cyA9IChwcmVmaXhfY29kZSAtIDIpID4+IDE7CitpbnQgb2Zmc2V0ID0gKDIgKyAocHJlZml4X2NvZGUgJiAxKSkgPDwgZXh0cmFfYml0czsKK3JldHVybiBvZmZzZXQgKyBSZWFkQml0cyhleHRyYV9iaXRzKSArIDE7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworKipEaXN0YW5jZSBNYXBwaW5nOioqCit7OiNkaXN0YW5jZS1tYXBwaW5nfQorCitBcyBub3RlZCBwcmV2aW91c2x5LCBkaXN0YW5jZSBjb2RlIGlzIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIHBvc2l0aW9uIG9mIGEKK3ByZXZpb3VzbHkgc2VlbiBwaXhlbCwgZnJvbSB3aGljaCB0aGUgcGl4ZWxzIGFyZSB0byBiZSBjb3BpZWQuIFRoaXMgc3ViLXNlY3Rpb24KK2RlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhIGRpc3RhbmNlIGNvZGUgYW5kIHRoZSBwb3NpdGlvbiBvZiBhIHByZXZpb3VzCitwaXhlbC4KKworVGhlIGRpc3RhbmNlIGNvZGVzIGxhcmdlciB0aGFuIDEyMCBkZW5vdGUgdGhlIHBpeGVsLWRpc3RhbmNlIGluIHNjYW4tbGluZQorb3JkZXIsIG9mZnNldCBieSAxMjAuCisKK1RoZSBzbWFsbGVzdCBkaXN0YW5jZSBjb2RlcyBcWzEuLjEyMFxdIGFyZSBzcGVjaWFsLCBhbmQgYXJlIHJlc2VydmVkIGZvciBhIGNsb3NlCituZWlnaGJvcmhvb2Qgb2YgdGhlIGN1cnJlbnQgcGl4ZWwuIFRoaXMgbmVpZ2hib3Job29kIGNvbnNpc3RzIG9mIDEyMCBwaXhlbHM6CisKKyAgKiBQaXhlbHMgdGhhdCBhcmUgMSB0byA3IHJvd3MgYWJvdmUgdGhlIGN1cnJlbnQgcGl4ZWwsIGFuZCBhcmUgdXAgdG8gOCBjb2x1bW5zCisgICAgdG8gdGhlIGxlZnQgb3IgdXAgdG8gNyBjb2x1bW5zIHRvIHRoZSByaWdodCBvZiB0aGUgY3VycmVudCBwaXhlbC4gXFtUb3RhbAorICAgIHN1Y2ggcGl4ZWxzID0gYDcgKiAoOCArIDEgKyA3KSA9IDExMmBcXS4KKyAgKiBQaXhlbHMgdGhhdCBhcmUgaW4gc2FtZSByb3cgYXMgdGhlIGN1cnJlbnQgcGl4ZWwsIGFuZCBhcmUgdXAgdG8gOCBjb2x1bW5zIHRvCisgICAgdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgcGl4ZWwuIFxbYDhgIHN1Y2ggcGl4ZWxzXF0uCisKK1RoZSBtYXBwaW5nIGJldHdlZW4gZGlzdGFuY2UgY29kZSBgaWAgYW5kIHRoZSBuZWlnaGJvcmluZyBwaXhlbCBvZmZzZXQKK2AoeGksIHlpKWAgaXMgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisoMCwgMSksICAoMSwgMCksICAoMSwgMSksICAoLTEsIDEpLCAoMCwgMiksICAoMiwgMCksICAoMSwgMiksICAoLTEsIDIpLAorKDIsIDEpLCAgKC0yLCAxKSwgKDIsIDIpLCAgKC0yLCAyKSwgKDAsIDMpLCAgKDMsIDApLCAgKDEsIDMpLCAgKC0xLCAzKSwKKygzLCAxKSwgICgtMywgMSksICgyLCAzKSwgICgtMiwgMyksICgzLCAyKSwgICgtMywgMiksICgwLCA0KSwgICg0LCAwKSwKKygxLCA0KSwgICgtMSwgNCksICg0LCAxKSwgICgtNCwgMSksICgzLCAzKSwgICgtMywgMyksICgyLCA0KSwgICgtMiwgNCksCisoNCwgMiksICAoLTQsIDIpLCAoMCwgNSksICAoMywgNCksICAoLTMsIDQpLCAoNCwgMyksICAoLTQsIDMpLCAoNSwgMCksCisoMSwgNSksICAoLTEsIDUpLCAoNSwgMSksICAoLTUsIDEpLCAoMiwgNSksICAoLTIsIDUpLCAoNSwgMiksICAoLTUsIDIpLAorKDQsIDQpLCAgKC00LCA0KSwgKDMsIDUpLCAgKC0zLCA1KSwgKDUsIDMpLCAgKC01LCAzKSwgKDAsIDYpLCAgKDYsIDApLAorKDEsIDYpLCAgKC0xLCA2KSwgKDYsIDEpLCAgKC02LCAxKSwgKDIsIDYpLCAgKC0yLCA2KSwgKDYsIDIpLCAgKC02LCAyKSwKKyg0LCA1KSwgICgtNCwgNSksICg1LCA0KSwgICgtNSwgNCksICgzLCA2KSwgICgtMywgNiksICg2LCAzKSwgICgtNiwgMyksCisoMCwgNyksICAoNywgMCksICAoMSwgNyksICAoLTEsIDcpLCAoNSwgNSksICAoLTUsIDUpLCAoNywgMSksICAoLTcsIDEpLAorKDQsIDYpLCAgKC00LCA2KSwgKDYsIDQpLCAgKC02LCA0KSwgKDIsIDcpLCAgKC0yLCA3KSwgKDcsIDIpLCAgKC03LCAyKSwKKygzLCA3KSwgICgtMywgNyksICg3LCAzKSwgICgtNywgMyksICg1LCA2KSwgICgtNSwgNiksICg2LCA1KSwgICgtNiwgNSksCisoOCwgMCksICAoNCwgNyksICAoLTQsIDcpLCAoNywgNCksICAoLTcsIDQpLCAoOCwgMSksICAoOCwgMiksICAoNiwgNiksCisoLTYsIDYpLCAoOCwgMyksICAoNSwgNyksICAoLTUsIDcpLCAoNywgNSksICAoLTcsIDUpLCAoOCwgNCksICAoNiwgNyksCisoLTYsIDcpLCAoNywgNiksICAoLTcsIDYpLCAoOCwgNSksICAoNywgNyksICAoLTcsIDcpLCAoOCwgNiksICAoOCwgNykKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitGb3IgZXhhbXBsZSwgZGlzdGFuY2UgY29kZSBgMWAgaW5kaWNhdGVzIG9mZnNldCBvZiBgKDAsIDEpYCBmb3IgdGhlIG5laWdoYm9yaW5nCitwaXhlbCwgdGhhdCBpcywgdGhlIHBpeGVsIGFib3ZlIHRoZSBjdXJyZW50IHBpeGVsICgwLXBpeGVsIGRpZmZlcmVuY2UgaW4KK1gtZGlyZWN0aW9uIGFuZCAxIHBpeGVsIGRpZmZlcmVuY2UgaW4gWS1kaXJlY3Rpb24pLiBTaW1pbGFybHksIGRpc3RhbmNlIGNvZGUKK2AzYCBpbmRpY2F0ZXMgbGVmdC10b3AgcGl4ZWwuCisKK1RoZSBkZWNvZGVyIGNhbiBjb252ZXJ0IGEgZGlzdGFuY2VzIGNvZGUgJ2knIHRvIGEgc2Nhbi1saW5lIG9yZGVyIGRpc3RhbmNlCisnZGlzdCcgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorKHhpLCB5aSkgPSBkaXN0YW5jZV9tYXBbaV0KK2Rpc3QgPSB4ICsgeSAqIHhzaXplCitpZiAoZGlzdCA8IDEpIHsKKyAgZGlzdCA9IDEKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgJ2Rpc3RhbmNlX21hcCcgaXMgdGhlIG1hcHBpbmcgbm90ZWQgYWJvdmUgYW5kIGB4c2l6ZWAgaXMgdGhlIHdpZHRoIG9mIHRoZQoraW1hZ2UgaW4gcGl4ZWxzLgorCisKKyMjIyMgNC4yLjMgQ29sb3IgQ2FjaGUgQ29kaW5nCisKK0NvbG9yIGNhY2hlIHN0b3JlcyBhIHNldCBvZiBjb2xvcnMgdGhhdCBoYXZlIGJlZW4gcmVjZW50bHkgdXNlZCBpbiB0aGUgaW1hZ2UuCisKKyoqUmF0aW9uYWxlOioqIFRoaXMgd2F5LCB0aGUgcmVjZW50bHkgdXNlZCBjb2xvcnMgY2FuIHNvbWV0aW1lcyBiZSByZWZlcnJlZCB0bworbW9yZSBlZmZpY2llbnRseSB0aGFuIGVtaXR0aW5nIHRoZW0gdXNpbmcgb3RoZXIgdHdvIG1ldGhvZHMgKGRlc2NyaWJlZCBpbgorWzQuMi4xXSgjaHVmZm1hbi1jb2RlZC1saXRlcmFscykgYW5kIFs0LjIuMl0oI2x6NzctYmFja3dhcmQtcmVmZXJlbmNlKSkuCisKK0NvbG9yIGNhY2hlIGNvZGVzIGFyZSBzdG9yZWQgYXMgZm9sbG93cy4gRmlyc3QsIHRoZXJlIGlzIGEgMS1iaXQgdmFsdWUgdGhhdAoraW5kaWNhdGVzIGlmIHRoZSBjb2xvciBjYWNoZSBpcyB1c2VkLiBJZiB0aGlzIGJpdCBpcyAwLCBubyBjb2xvciBjYWNoZSBjb2RlcworZXhpc3QsIGFuZCB0aGV5IGFyZSBub3QgdHJhbnNtaXR0ZWQgaW4gdGhlIEh1ZmZtYW4gY29kZSB0aGF0IGRlY29kZXMgdGhlIGdyZWVuCitzeW1ib2xzIGFuZCB0aGUgbGVuZ3RoIHByZWZpeCBjb2Rlcy4gSG93ZXZlciwgaWYgdGhpcyBiaXQgaXMgMSwgdGhlIGNvbG9yIGNhY2hlCitzaXplIGlzIHJlYWQgbmV4dDoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgY29sb3JfY2FjaGVfY29kZV9iaXRzID0gUmVhZEJpdHMoNCk7CitpbnQgY29sb3JfY2FjaGVfc2l6ZSA9IDEgPDwgY29sb3JfY2FjaGVfY29kZV9iaXRzOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2Bjb2xvcl9jYWNoZV9jb2RlX2JpdHNgIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGNvbG9yX2NhY2hlIGJ5ICgxIDw8CitgY29sb3JfY2FjaGVfY29kZV9iaXRzYCkuIFRoZSByYW5nZSBvZiBhbGxvd2VkIHZhbHVlcyBmb3IKK2Bjb2xvcl9jYWNoZV9jb2RlX2JpdHNgIGlzIFxbMS4uMTFcXS4gQ29tcGxpYW50IGRlY29kZXJzIG11c3QgaW5kaWNhdGUgYQorY29ycnVwdGVkIGJpdHN0cmVhbSBmb3Igb3RoZXIgdmFsdWVzLgorCitBIGNvbG9yIGNhY2hlIGlzIGFuIGFycmF5IG9mIHNpemUgYGNvbG9yX2NhY2hlX3NpemVgLiBFYWNoIGVudHJ5CitzdG9yZXMgb25lIEFSR0IgY29sb3IuIENvbG9ycyBhcmUgbG9va2VkIHVwIGJ5IGluZGV4aW5nIHRoZW0gYnkKKygweDFlMzVhN2JkICogYGNvbG9yYCkgPj4gKDMyIC0gYGNvbG9yX2NhY2hlX2NvZGVfYml0c2ApLiBPbmx5IG9uZQorbG9va3VwIGlzIGRvbmUgaW4gYSBjb2xvciBjYWNoZTsgdGhlcmUgaXMgbm8gY29uZmxpY3QgcmVzb2x1dGlvbi4KKworSW4gdGhlIGJlZ2lubmluZyBvZiBkZWNvZGluZyBvciBlbmNvZGluZyBvZiBhbiBpbWFnZSwgYWxsIGVudHJpZXMgaW4gYWxsCitjb2xvciBjYWNoZSB2YWx1ZXMgYXJlIHNldCB0byB6ZXJvLiBUaGUgY29sb3IgY2FjaGUgY29kZSBpcyBjb252ZXJ0ZWQgdG8KK3RoaXMgY29sb3IgYXQgZGVjb2RpbmcgdGltZS4gVGhlIHN0YXRlIG9mIHRoZSBjb2xvciBjYWNoZSBpcyBtYWludGFpbmVkCitieSBpbnNlcnRpbmcgZXZlcnkgcGl4ZWwsIGJlIGl0IHByb2R1Y2VkIGJ5IGJhY2t3YXJkIHJlZmVyZW5jaW5nIG9yIGFzCitsaXRlcmFscywgaW50byB0aGUgY2FjaGUgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBzdHJlYW0uCisKKworNSBFbnRyb3B5IENvZGUKKy0tLS0tLS0tLS0tLS0tCisKKyMjIyA1LjEgT3ZlcnZpZXcKKworTW9zdCBvZiB0aGUgZGF0YSBpcyBjb2RlZCB1c2luZyBbY2Fub25pY2FsIEh1ZmZtYW4gY29kZV1bY2Fub25pY2FsX2h1ZmZdLiBIZW5jZSwKK3RoZSBjb2RlcyBhcmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGluZyB0aGUgX0h1ZmZtYW4gY29kZSBsZW5ndGhzXywgYXMgb3Bwb3NlZCB0bwordGhlIGFjdHVhbCBfSHVmZm1hbiBjb2Rlc18uCisKK0luIHBhcnRpY3VsYXIsIHRoZSBmb3JtYXQgdXNlcyAqKnNwYXRpYWxseS12YXJpYW50IEh1ZmZtYW4gY29kaW5nKiouIEluIG90aGVyCit3b3JkcywgZGlmZmVyZW50IGJsb2NrcyBvZiB0aGUgaW1hZ2UgY2FuIHBvdGVudGlhbGx5IHVzZSBkaWZmZXJlbnQgZW50cm9weQorY29kZXMuCisKKyoqUmF0aW9uYWxlKio6IERpZmZlcmVudCBhcmVhcyBvZiB0aGUgaW1hZ2UgbWF5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcy4gU28sIGFsbG93aW5nIHRoZW0gdG8gdXNlIGRpZmZlcmVudCBlbnRyb3B5IGNvZGVzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkgYW5kCitwb3RlbnRpYWxseSBhIGJldHRlciBjb21wcmVzc2lvbi4KKworIyMjIDUuMiBEZXRhaWxzCisKK1RoZSBlbmNvZGVkIGltYWdlIGRhdGEgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorCisgIDEuIE1ldGEgSHVmZm1hbiBjb2RlcworICAxLiBFbnRyb3B5LWNvZGVkIGltYWdlIGRhdGEKKworIyMjIyA1LjIuMSBEZWNvZGluZyBvZiBNZXRhIEh1ZmZtYW4gQ29kZXMKKworQXMgbm90ZWQgZWFybGllciwgdGhlIGZvcm1hdCBhbGxvd3MgdGhlIHVzZSBvZiBkaWZmZXJlbnQgSHVmZm1hbiBjb2RlcyBmb3IKK2RpZmZlcmVudCBibG9ja3Mgb2YgdGhlIGltYWdlLiBfTWV0YSBIdWZmbWFuIGNvZGVzXyBhcmUgaW5kZXhlcyBpZGVudGlmeWluZword2hpY2ggSHVmZm1hbiBjb2RlcyB0byB1c2UgaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBpbWFnZS4KKworTWV0YSBIdWZmbWFuIGNvZGVzIG1heSBiZSB1c2VkIF9vbmx5XyB3aGVuIHRoZSBpbWFnZSBpcyBiZWluZyB1c2VkIGluIHRoZQorW3JvbGVdKCNyb2xlcy1vZi1pbWFnZS1kYXRhKSBvZiBhbiBfQVJHQiBpbWFnZV8uCisKK1RoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllcyBmb3IgdGhlIG1ldGEgSHVmZm1hbiBjb2RlcywgaW5kaWNhdGVkIGJ5IGEgMS1iaXQKK3ZhbHVlOgorCisgICogSWYgdGhpcyBiaXQgaXMgemVybywgdGhlcmUgaXMgb25seSBvbmUgbWV0YSBIdWZmbWFuIGNvZGUgdXNlZCBldmVyeXdoZXJlIGluCisgICAgdGhlIGltYWdlLiBObyBtb3JlIGRhdGEgaXMgc3RvcmVkLgorICAqIElmIHRoaXMgYml0IGlzIG9uZSwgdGhlIGltYWdlIHVzZXMgbXVsdGlwbGUgbWV0YSBIdWZmbWFuIGNvZGVzLiBUaGVzZSBtZXRhCisgICAgSHVmZm1hbiBjb2RlcyBhcmUgc3RvcmVkIGFzIGFuIF9lbnRyb3B5IGltYWdlXyAoZGVzY3JpYmVkIGJlbG93KS4KKworKipFbnRyb3B5IGltYWdlOioqCisKK1RoZSBlbnRyb3B5IGltYWdlIGRlZmluZXMgd2hpY2ggSHVmZm1hbiBjb2RlcyBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCitpbWFnZSwgYXMgZGVzY3JpYmVkIGJlbG93LgorCitUaGUgZmlyc3QgMy1iaXRzIGNvbnRhaW4gdGhlIGBodWZmbWFuX2JpdHNgIHZhbHVlLiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgZW50cm9weQoraW1hZ2UgYXJlIGRlcml2ZWQgZnJvbSAnaHVmZm1hbl9iaXRzJy4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgaHVmZm1hbl9iaXRzID0gUmVhZEJpdHMoMykgKyAyOworaW50IGh1ZmZtYW5feHNpemUgPSBESVZfUk9VTkRfVVAoeHNpemUsIDEgPDwgaHVmZm1hbl9iaXRzKTsKK2ludCBodWZmbWFuX3lzaXplID0gRElWX1JPVU5EX1VQKHlzaXplLCAxIDw8IGh1ZmZtYW5fYml0cyk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgYERJVl9ST1VORF9VUGAgaXMgYXMgZGVmaW5lZCBbZWFybGllcl0oI3ByZWRpY3Rvci10cmFuc2Zvcm0pLgorCitOZXh0IGJpdHMgY29udGFpbiBhbiBlbnRyb3B5IGltYWdlIG9mIHdpZHRoIGBodWZmbWFuX3hzaXplYCBhbmQgaGVpZ2h0CitgaHVmZm1hbl95c2l6ZWAuCisKKyoqSW50ZXJwcmV0YXRpb24gb2YgTWV0YSBIdWZmbWFuIENvZGVzOioqCisKK0ZvciBhbnkgZ2l2ZW4gcGl4ZWwgKHgsIHkpLCB0aGVyZSBpcyBhIHNldCBvZiBmaXZlIEh1ZmZtYW4gY29kZXMgYXNzb2NpYXRlZCB3aXRoCitpdC4gVGhlc2UgY29kZXMgYXJlIChpbiBiaXRzdHJlYW0gb3JkZXIpOgorCisgICogKipIdWZmbWFuIGNvZGUgIzEqKjogdXNlZCBmb3IgZ3JlZW4gY2hhbm5lbCwgYmFja3dhcmQtcmVmZXJlbmNlIGxlbmd0aCBhbmQKKyAgICBjb2xvciBjYWNoZQorICAqICoqSHVmZm1hbiBjb2RlICMyLCAjMyBhbmQgIzQqKjogdXNlZCBmb3IgcmVkLCBibHVlIGFuZCBhbHBoYSBjaGFubmVscworICAgIHJlc3BlY3RpdmVseS4KKyAgKiAqKkh1ZmZtYW4gY29kZSAjNSoqOiB1c2VkIGZvciBiYWNrd2FyZC1yZWZlcmVuY2UgZGlzdGFuY2UuCisKK0Zyb20gaGVyZSBvbiwgd2UgcmVmZXIgdG8gdGhpcyBzZXQgYXMgYSAqKkh1ZmZtYW4gY29kZSBncm91cCoqLgorCitUaGUgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZSBncm91cHMgaW4gdGhlIEFSR0IgaW1hZ2UgY2FuIGJlIG9idGFpbmVkIGJ5IGZpbmRpbmcKK3RoZSBfbGFyZ2VzdCBtZXRhIEh1ZmZtYW4gY29kZV8gZnJvbSB0aGUgZW50cm9weSBpbWFnZToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgbnVtX2h1ZmZfZ3JvdXBzID0gbWF4KGVudHJvcHkgaW1hZ2UpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgord2hlcmUgYG1heChlbnRyb3B5IGltYWdlKWAgaW5kaWNhdGVzIHRoZSBsYXJnZXN0IEh1ZmZtYW4gY29kZSBzdG9yZWQgaW4gdGhlCitlbnRyb3B5IGltYWdlLgorCitBcyBlYWNoIEh1ZmZtYW4gY29kZSBncm91cHMgY29udGFpbnMgZml2ZSBIdWZmbWFuIGNvZGVzLCB0aGUgdG90YWwgbnVtYmVyIG9mCitIdWZmbWFuIGNvZGVzIGlzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBudW1faHVmZl9jb2RlcyA9IDUgKiBudW1faHVmZl9ncm91cHM7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworR2l2ZW4gYSBwaXhlbCAoeCwgeSkgaW4gdGhlIEFSR0IgaW1hZ2UsIHdlIGNhbiBvYnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgSHVmZm1hbgorY29kZXMgdG8gYmUgdXNlZCBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBwb3NpdGlvbiA9ICh5ID4+IGh1ZmZtYW5fYml0cykgKiBodWZmbWFuX3hzaXplICsgKHggPj4gaHVmZm1hbl9iaXRzKTsKK2ludCBtZXRhX2h1ZmZfY29kZSA9IChlbnRyb3B5X2ltYWdlW3Bvc10gPj4gOCkgJiAweGZmZmY7CitIdWZmbWFuQ29kZUdyb3VwIGh1ZmZfZ3JvdXAgPSBodWZmbWFuX2NvZGVfZ3JvdXBzW21ldGFfaHVmZl9jb2RlXTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit3aGVyZSwgd2UgaGF2ZSBhc3N1bWVkIHRoZSBleGlzdGVuY2Ugb2YgYEh1ZmZtYW5Db2RlR3JvdXBgIHN0cnVjdHVyZSwgd2hpY2gKK3JlcHJlc2VudHMgYSBzZXQgb2YgZml2ZSBIdWZmbWFuIGNvZGVzLiBBbHNvLCBgaHVmZm1hbl9jb2RlX2dyb3Vwc2AgaXMgYW4gYXJyYXkKK29mIGBIdWZmbWFuQ29kZUdyb3VwYCAob2Ygc2l6ZSBgbnVtX2h1ZmZfZ3JvdXBzYCkuCisKK1RoZSBkZWNvZGVyIHRoZW4gdXNlcyBIdWZmbWFuIGNvZGUgZ3JvdXAgYGh1ZmZfZ3JvdXBgIHRvIGRlY29kZSB0aGUgcGl4ZWwKKyh4LCB5KSBhcyBleHBsYWluZWQgaW4gdGhlIFtuZXh0IHNlY3Rpb25dKCNkZWNvZGluZy1lbnRyb3B5LWNvZGVkLWltYWdlLWRhdGEpLgorCisjIyMjIDUuMi4yIERlY29kaW5nIEVudHJvcHktY29kZWQgSW1hZ2UgRGF0YQorCitGb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gKHgsIHkpIGluIHRoZSBpbWFnZSwgdGhlIGRlY29kZXIgZmlyc3QgaWRlbnRpZmllcyB0aGUKK2NvcnJlc3BvbmRpbmcgSHVmZm1hbiBjb2RlIGdyb3VwIChhcyBleHBsYWluZWQgaW4gdGhlIGxhc3Qgc2VjdGlvbikuIEdpdmVuIHRoZQorSHVmZm1hbiBjb2RlIGdyb3VwLCB0aGUgcGl4ZWwgaXMgcmVhZCBhbmQgZGVjb2RlZCBhcyBmb2xsb3dzOgorCitSZWFkIG5leHQgc3ltYm9sIFMgZnJvbSB0aGUgYml0c3RyZWFtIHVzaW5nIEh1ZmZtYW4gY29kZSAjMS4gXFtTZWUKK1tuZXh0IHNlY3Rpb25dKCNkZWNvZGluZy10aGUtY29kZS1sZW5ndGhzKSBmb3IgZGV0YWlscyBvbiBkZWNvZGluZyB0aGUgSHVmZm1hbgorY29kZSBsZW5ndGhzXF0uIE5vdGUgdGhhdCBTIGlzIGFueSBpbnRlZ2VyIGluIHRoZSByYW5nZSBgMGAgdG8KK2AoMjU2ICsgMjQgKyBgIFtgY29sb3JfY2FjaGVfc2l6ZWBdKCNjb2xvci1jYWNoZS1jb2RlKWAtIDEpYC4KKworVGhlIGludGVycHJldGF0aW9uIG9mIFMgZGVwZW5kcyBvbiBpdHMgdmFsdWU6CisKKyAgMS4gaWYgUyA8IDI1NgorICAgICAxLiBVc2UgUyBhcyB0aGUgZ3JlZW4gY29tcG9uZW50CisgICAgIDEuIFJlYWQgcmVkIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzIKKyAgICAgMS4gUmVhZCBibHVlIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzMKKyAgICAgMS4gUmVhZCBhbHBoYSBmcm9tIHRoZSBiaXRzdHJlYW0gdXNpbmcgSHVmZm1hbiBjb2RlICM0CisgIDEuIGlmIFMgPCAyNTYgKyAyNAorICAgICAxLiBVc2UgUyAtIDI1NiBhcyBhIGxlbmd0aCBwcmVmaXggY29kZQorICAgICAxLiBSZWFkIGV4dHJhIGJpdHMgZm9yIGxlbmd0aCBmcm9tIHRoZSBiaXRzdHJlYW0KKyAgICAgMS4gRGV0ZXJtaW5lIGJhY2t3YXJkLXJlZmVyZW5jZSBsZW5ndGggTCBmcm9tIGxlbmd0aCBwcmVmaXggY29kZSBhbmQgdGhlCisgICAgICAgIGV4dHJhIGJpdHMgcmVhZC4KKyAgICAgMS4gUmVhZCBkaXN0YW5jZSBwcmVmaXggY29kZSBmcm9tIHRoZSBiaXRzdHJlYW0gdXNpbmcgSHVmZm1hbiBjb2RlICM1CisgICAgIDEuIFJlYWQgZXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgZnJvbSB0aGUgYml0c3RyZWFtCisgICAgIDEuIERldGVybWluZSBiYWNrd2FyZC1yZWZlcmVuY2UgZGlzdGFuY2UgRCBmcm9tIGRpc3RhbmNlIHByZWZpeCBjb2RlIGFuZAorICAgICAgICB0aGUgZXh0cmEgYml0cyByZWFkLgorICAgICAxLiBDb3B5IHRoZSBMIHBpeGVscyAoaW4gc2Nhbi1saW5lIG9yZGVyKSBmcm9tIHRoZSBzZXF1ZW5jZSBvZiBwaXhlbHMKKyAgICAgICAgcHJpb3IgdG8gdGhlbSBieSBEIHBpeGVscy4KKyAgMS4gaWYgUyA+PSAyNTYgKyAyNAorICAgICAxLiBVc2UgUyAtICgyNTYgKyAyNCkgYXMgdGhlIGluZGV4IGludG8gdGhlIGNvbG9yIGNhY2hlLgorICAgICAxLiBHZXQgQVJHQiBjb2xvciBmcm9tIHRoZSBjb2xvciBjYWNoZSBhdCB0aGF0IGluZGV4LgorCisKKyoqRGVjb2RpbmcgdGhlIENvZGUgTGVuZ3RoczoqKgorezojZGVjb2RpbmctdGhlLWNvZGUtbGVuZ3Roc30KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZGV0YWlscyBhYm91dCByZWFkaW5nIGEgc3ltYm9sIGZyb20gdGhlIGJpdHN0cmVhbSBieQorZGVjb2RpbmcgdGhlIEh1ZmZtYW4gY29kZSBsZW5ndGguCisKK1RoZSBIdWZmbWFuIGNvZGUgbGVuZ3RocyBjYW4gYmUgY29kZWQgaW4gdHdvIHdheXMuIFRoZSBtZXRob2QgdXNlZCBpcyBzcGVjaWZpZWQKK2J5IGEgMS1iaXQgdmFsdWUuCisKKyAgKiBJZiB0aGlzIGJpdCBpcyAxLCBpdCBpcyBhIF9zaW1wbGUgY29kZSBsZW5ndGggY29kZV8sIGFuZAorICAqIElmIHRoaXMgYml0IGlzIDAsIGl0IGlzIGEgX25vcm1hbCBjb2RlIGxlbmd0aCBjb2RlXy4KKworKiooaSkgU2ltcGxlIENvZGUgTGVuZ3RoIENvZGU6KioKKworVGhpcyB2YXJpYW50IGlzIHVzZWQgaW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVuIG9ubHkgMSBvciAyIEh1ZmZtYW4gY29kZSBsZW5ndGhzCithcmUgbm9uLXplcm8sIGFuZCBhcmUgaW4gdGhlIHJhbmdlIG9mIFxbMCwgMjU1XF0uIEFsbCBvdGhlciBIdWZmbWFuIGNvZGUgbGVuZ3RocworYXJlIGltcGxpY2l0bHkgemVyb3MuCisKK1RoZSBmaXJzdCBiaXQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29kZSBsZW5ndGhzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBudW1fY29kZV9sZW5ndGhzID0gUmVhZEJpdHMoMSkgKyAxOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBmaXJzdCBjb2RlIGxlbmd0aCBpcyBzdG9yZWQgZWl0aGVyIHVzaW5nIGEgMS1iaXQgY29kZSBmb3IgdmFsdWVzIG9mIDAgYW5kIDEsCitvciB1c2luZyBhbiA4LWJpdCBjb2RlIGZvciB2YWx1ZXMgaW4gcmFuZ2UgXFswLCAyNTVcXS4gVGhlIHNlY29uZCBjb2RlIGxlbmd0aCwKK3doZW4gcHJlc2VudCwgaXMgY29kZWQgYXMgYW4gOC1iaXQgY29kZS4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgaXNfZmlyc3RfOGJpdHMgPSBSZWFkQml0cygxKTsKK2NvZGVfbGVuZ3Roc1swXSA9IFJlYWRCaXRzKDEgKyA3ICogaXNfZmlyc3RfOGJpdHMpOworaWYgKG51bV9jb2RlX2xlbmd0aHMgPT0gMikgeworICBjb2RlX2xlbmd0aHNbMV0gPSBSZWFkQml0cyg4KTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisqKk5vdGU6KiogQW5vdGhlciBzcGVjaWFsIGNhc2UgaXMgd2hlbiBfYWxsXyBIdWZmbWFuIGNvZGUgbGVuZ3RocyBhcmUgX3plcm9zXworKGFuIGVtcHR5IEh1ZmZtYW4gY29kZSkuIEZvciBleGFtcGxlLCBhIEh1ZmZtYW4gY29kZSBmb3IgZGlzdGFuY2UgY2FuIGJlIGVtcHR5CitpZiB0aGVyZSBhcmUgbm8gYmFja3dhcmQgcmVmZXJlbmNlcy4gU2ltaWxhcmx5LCBIdWZmbWFuIGNvZGVzIGZvciBhbHBoYSwgcmVkLAorYW5kIGJsdWUgY2FuIGJlIGVtcHR5IGlmIGFsbCBwaXhlbHMgd2l0aGluIHRoZSBzYW1lIG1ldGEgSHVmZm1hbiBjb2RlIGFyZQorcHJvZHVjZWQgdXNpbmcgdGhlIGNvbG9yIGNhY2hlLiBIb3dldmVyLCB0aGlzIGNhc2UgZG9lc24ndCBuZWVkIGEgc3BlY2lhbAoraGFuZGxpbmcsIGFzIGVtcHR5IEh1ZmZtYW4gY29kZXMgY2FuIGJlIGNvZGVkIGFzIHRob3NlIGNvbnRhaW5pbmcgYSBzaW5nbGUKK3N5bWJvbCBgMGAuCisKKyoqKGlpKSBOb3JtYWwgQ29kZSBMZW5ndGggQ29kZToqKgorCitUaGUgY29kZSBsZW5ndGhzIG9mIGEgSHVmZm1hbiBjb2RlIGFyZSByZWFkIGFzIGZvbGxvd3M6IGBudW1fY29kZV9sZW5ndGhzYAorc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29kZSBsZW5ndGhzOyB0aGUgcmVzdCBvZiB0aGUgY29kZSBsZW5ndGhzCisoYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiBga0NvZGVMZW5ndGhDb2RlT3JkZXJgKSBhcmUgemVyb3MuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGtDb2RlTGVuZ3RoQ29kZXMgPSAxOTsKK2ludCBrQ29kZUxlbmd0aENvZGVPcmRlcltrQ29kZUxlbmd0aENvZGVzXSA9IHsKKyAgMTcsIDE4LCAwLCAxLCAyLCAzLCA0LCA1LCAxNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorfTsKK2ludCBjb2RlX2xlbmd0aHNba0NvZGVMZW5ndGhDb2Rlc10gPSB7IDAgfTsgIC8vIEFsbCB6ZXJvcy4KK2ludCBudW1fY29kZV9sZW5ndGhzID0gNCArIFJlYWRCaXRzKDQpOworZm9yIChpID0gMDsgaSA8IG51bV9jb2RlX2xlbmd0aHM7ICsraSkgeworICBjb2RlX2xlbmd0aHNba0NvZGVMZW5ndGhDb2RlT3JkZXJbaV1dID0gUmVhZEJpdHMoMyk7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworICAqIENvZGUgbGVuZ3RoIGNvZGUgXFswLi4xNVxdIGluZGljYXRlcyBsaXRlcmFsIGNvZGUgbGVuZ3Rocy4KKyAgICAqIFZhbHVlIDAgbWVhbnMgbm8gc3ltYm9scyBoYXZlIGJlZW4gY29kZWQuCisgICAgKiBWYWx1ZXMgXFsxLi4xNVxdIGluZGljYXRlIHRoZSBiaXQgbGVuZ3RoIG9mIHRoZSByZXNwZWN0aXZlIGNvZGUuCisgICogQ29kZSAxNiByZXBlYXRzIHRoZSBwcmV2aW91cyBub24temVybyB2YWx1ZSBcWzMuLjZcXSB0aW1lcywgaS5lLiwKKyAgICAzICsgYFJlYWRCaXRzKDIpYCB0aW1lcy4gIElmIGNvZGUgMTYgaXMgdXNlZCBiZWZvcmUgYSBub24temVybworICAgIHZhbHVlIGhhcyBiZWVuIGVtaXR0ZWQsIGEgdmFsdWUgb2YgOCBpcyByZXBlYXRlZC4KKyAgKiBDb2RlIDE3IGVtaXRzIGEgc3RyZWFrIG9mIHplcm9zIFxbMy4uMTBcXSwgaS5lLiwgMyArIGBSZWFkQml0cygzKWAKKyAgICB0aW1lcy4KKyAgKiBDb2RlIDE4IGVtaXRzIGEgc3RyZWFrIG9mIHplcm9zIG9mIGxlbmd0aCBcWzExLi4xMzhcXSwgaS5lLiwKKyAgICAxMSArIGBSZWFkQml0cyg3KWAgdGltZXMuCisKKworNiBPdmVyYWxsIFN0cnVjdHVyZSBvZiB0aGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVsb3cgaXMgYSB2aWV3IGludG8gdGhlIGZvcm1hdCBpbiBCYWNrdXMtTmF1ciBmb3JtLiBJdCBkb2VzIG5vdCBjb3ZlcgorYWxsIGRldGFpbHMuIEVuZC1vZi1pbWFnZSAoRU9JKSBpcyBvbmx5IGltcGxpY2l0bHkgY29kZWQgaW50byB0aGUgbnVtYmVyCitvZiBwaXhlbHMgKHhzaXplICogeXNpemUpLgorCisKKyMjIyMgQmFzaWMgU3RydWN0dXJlCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorPGZvcm1hdD4gOjo9IDxSSUZGIGhlYWRlcj48aW1hZ2Ugc2l6ZT48aW1hZ2Ugc3RyZWFtPgorPGltYWdlIHN0cmVhbT4gOjo9IDxvcHRpb25hbC10cmFuc2Zvcm0+PHNwYXRpYWxseS1jb2RlZCBpbWFnZT4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKyMjIyMgU3RydWN0dXJlIG9mIFRyYW5zZm9ybXMKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cis8b3B0aW9uYWwtdHJhbnNmb3JtPiA6Oj0gKDEtYml0IHZhbHVlIDE7IDx0cmFuc2Zvcm0+IDxvcHRpb25hbC10cmFuc2Zvcm0+KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgMS1iaXQgdmFsdWUgMAorPHRyYW5zZm9ybT4gOjo9IDxwcmVkaWN0b3ItdHg+IHwgPGNvbG9yLXR4PiB8IDxzdWJ0cmFjdC1ncmVlbi10eD4gfAorICAgICAgICAgICAgICAgIDxjb2xvci1pbmRleGluZy10eD4KKzxwcmVkaWN0b3ItdHg+IDo6PSAyLWJpdCB2YWx1ZSAwOyA8cHJlZGljdG9yIGltYWdlPgorPHByZWRpY3RvciBpbWFnZT4gOjo9IDMtYml0IHN1Yi1waXhlbCBjb2RlIDsgPGVudHJvcHktY29kZWQgaW1hZ2U+Cis8Y29sb3ItdHg+IDo6PSAyLWJpdCB2YWx1ZSAxOyA8Y29sb3IgaW1hZ2U+Cis8Y29sb3IgaW1hZ2U+IDo6PSAzLWJpdCBzdWItcGl4ZWwgY29kZSA7IDxlbnRyb3B5LWNvZGVkIGltYWdlPgorPHN1YnRyYWN0LWdyZWVuLXR4PiA6Oj0gMi1iaXQgdmFsdWUgMgorPGNvbG9yLWluZGV4aW5nLXR4PiA6Oj0gMi1iaXQgdmFsdWUgMzsgPGNvbG9yLWluZGV4aW5nIGltYWdlPgorPGNvbG9yLWluZGV4aW5nIGltYWdlPiA6Oj0gOC1iaXQgY29sb3IgY291bnQ7IDxlbnRyb3B5LWNvZGVkIGltYWdlPgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKworIyMjIyBTdHJ1Y3R1cmUgb2YgdGhlIEltYWdlIERhdGEKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cis8c3BhdGlhbGx5LWNvZGVkIGltYWdlPiA6Oj0gPG1ldGEgaHVmZm1hbj48ZW50cm9weS1jb2RlZCBpbWFnZT4KKzxlbnRyb3B5LWNvZGVkIGltYWdlPiA6Oj0gPGNvbG9yIGNhY2hlIGluZm8+PGh1ZmZtYW4gY29kZXM+PGx6NzctY29kZWQgaW1hZ2U+Cis8bWV0YSBodWZmbWFuPiA6Oj0gMS1iaXQgdmFsdWUgMCB8CisgICAgICAgICAgICAgICAgICAgKDEtYml0IHZhbHVlIDE7IDxlbnRyb3B5IGltYWdlPikKKzxlbnRyb3B5IGltYWdlPiA6Oj0gMy1iaXQgc3Vic2FtcGxlIHZhbHVlOyA8ZW50cm9weS1jb2RlZCBpbWFnZT4KKzxjb2xvciBjYWNoZSBpbmZvPiA6Oj0gMSBiaXQgdmFsdWUgMCB8CisgICAgICAgICAgICAgICAgICAgICAgICgxLWJpdCB2YWx1ZSAxOyA0LWJpdCB2YWx1ZSBmb3IgY29sb3IgY2FjaGUgc2l6ZSkKKzxodWZmbWFuIGNvZGVzPiA6Oj0gPGh1ZmZtYW4gY29kZSBncm91cD4gfCA8aHVmZm1hbiBjb2RlIGdyb3VwPjxodWZmbWFuIGNvZGVzPgorPGh1ZmZtYW4gY29kZSBncm91cD4gOjo9IDxodWZmbWFuIGNvZGU+PGh1ZmZtYW4gY29kZT48aHVmZm1hbiBjb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxodWZmbWFuIGNvZGU+PGh1ZmZtYW4gY29kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgIkludGVycHJldGF0aW9uIG9mIE1ldGEgSHVmZm1hbiBjb2RlcyIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0YW5kIHdoYXQgZWFjaCBvZiB0aGVzZSBmaXZlIEh1ZmZtYW4gY29kZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yLgorPGh1ZmZtYW4gY29kZT4gOjo9IDxzaW1wbGUgaHVmZm1hbiBjb2RlPiB8IDxub3JtYWwgaHVmZm1hbiBjb2RlPgorPHNpbXBsZSBodWZmbWFuIGNvZGU+IDo6PSBzZWUgIlNpbXBsZSBjb2RlIGxlbmd0aCBjb2RlIiBmb3IgZGV0YWlscworPG5vcm1hbCBodWZmbWFuIGNvZGU+IDo6PSA8Y29kZSBsZW5ndGggY29kZT47IGVuY29kZWQgY29kZSBsZW5ndGhzCis8Y29kZSBsZW5ndGggY29kZT4gOjo9IHNlZSBzZWN0aW9uICJOb3JtYWwgY29kZSBsZW5ndGggY29kZSIKKzxsejc3LWNvZGVkIGltYWdlPiA6Oj0gKCg8YXJnYi1waXhlbD4gfCA8bHo3Ny1jb3B5PiB8IDxjb2xvci1jYWNoZS1jb2RlPikKKyAgICAgICAgICAgICAgICAgICAgICAgPGx6NzctY29kZWQgaW1hZ2U+KSB8ICIiCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBwb3NzaWJsZSBleGFtcGxlIHNlcXVlbmNlOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKzxSSUZGIGhlYWRlcj48aW1hZ2Ugc2l6ZT4xLWJpdCB2YWx1ZSAxPHN1YnRyYWN0LWdyZWVuLXR4PgorMS1iaXQgdmFsdWUgMTxwcmVkaWN0b3ItdHg+MS1iaXQgdmFsdWUgMDxtZXRhIGh1ZmZtYW4+Cis8Y29sb3IgY2FjaGUgaW5mbz48aHVmZm1hbiBjb2Rlcz4KKzxsejc3LWNvZGVkIGltYWdlPgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1tjYW5vbmljYWxfaHVmZl06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2Fub25pY2FsX0h1ZmZtYW5fY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2NwdS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk5MDFlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDUFUgZGV0ZWN0aW9uCi0vLwotLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jaW5jbHVkZSA8Y3B1LWZlYXR1cmVzLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTU0UyIGRldGVjdGlvbi4KLS8vCi0KLS8vIGFwcGxlL2RhcndpbiBnY2MtNC4wLjEgZGVmaW5lcyBfX1BJQ19fLCBidXQgbm90IF9fcGljX18gd2l0aCAtZlBJQy4KLSNpZiAoZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKF9fUElDX18pKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgIm1vdiAlJWVieCwgJSVlZGlcbiIKLSAgICAiY3B1aWRcbiIKLSAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIKLSAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPUQiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCi0gICAgOiAiYSIoaW5mb190eXBlKSk7Ci19Ci0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgewotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAiY3B1aWRcbiIKLSAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPWIiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCi0gICAgOiAiYSIoaW5mb190eXBlKSk7Ci19Ci0jZWxpZiBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCi0jZGVmaW5lIEdldENQVUluZm8gX19jcHVpZAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikKLXN0YXRpYyBpbnQgeDg2Q1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKLSAgaW50IGNwdV9pbmZvWzRdOwotICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAxKTsKLSAgaWYgKGZlYXR1cmUgPT0ga1NTRTIpIHsKLSAgICByZXR1cm4gMCAhPSAoY3B1X2luZm9bM10gJiAweDA0MDAwMDAwKTsKLSAgfQotICBpZiAoZmVhdHVyZSA9PSBrU1NFMykgewotICAgIHJldHVybiAwICE9IChjcHVfaW5mb1syXSAmIDB4MDAwMDAwMDEpOwotICB9Ci0gIHJldHVybiAwOwotfQotVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0geDg2Q1BVSW5mbzsKLSNlbGlmIGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pCi1zdGF0aWMgaW50IEFuZHJvaWRDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgewotICBjb25zdCBBbmRyb2lkQ3B1RmFtaWx5IGNwdV9mYW1pbHkgPSBhbmRyb2lkX2dldENwdUZhbWlseSgpOwotICBjb25zdCB1aW50NjRfdCBjcHVfZmVhdHVyZXMgPSBhbmRyb2lkX2dldENwdUZlYXR1cmVzKCk7Ci0gIGlmIChmZWF0dXJlID09IGtORU9OKSB7Ci0gICAgcmV0dXJuIChjcHVfZmFtaWx5ID09IEFORFJPSURfQ1BVX0ZBTUlMWV9BUk0gJiYKLSAgICAgICAgICAgIDAgIT0gKGNwdV9mZWF0dXJlcyAmIEFORFJPSURfQ1BVX0FSTV9GRUFUVVJFX05FT04pKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLVZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IEFuZHJvaWRDUFVJbmZvOwotI2VsaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCi0vLyBkZWZpbmUgYSBkdW1teSBmdW5jdGlvbiB0byBlbmFibGUgdHVybmluZyBvZmYgTkVPTiBhdCBydW50aW1lIGJ5IHNldHRpbmcKLS8vIFZQOERlY0dldENQVUluZm8gPSBOVUxMCi1zdGF0aWMgaW50IGFybUNQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7Ci0gICh2b2lkKWZlYXR1cmU7Ci0gIHJldHVybiAxOwotfQotVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gYXJtQ1BVSW5mbzsKLSNlbHNlCi1WUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBOVUxMOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMyZWUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3BlZWQtY3JpdGljYWwgZGVjb2RpbmcgZnVuY3Rpb25zLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBydW4tdGltZSB0YWJsZXMgKH40aykKLQotc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKQotc3RhdGljIHVpbnQ4X3QgYWJzMVsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKT4+MQotc3RhdGljIGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXTsgIC8vIGNsaXBzIFstMTAyMCwgMTAyMF0gdG8gWy0xMjgsIDEyN10KLXN0YXRpYyBpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdOyAgICAvLyBjbGlwcyBbLTExMiwgMTEyXSB0byBbLTE2LCAxNV0KLXN0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMCArIDFdOyAgICAvLyBjbGlwcyBbLTI1NSw1MTBdIHRvIFswLDI1NV0KLQotLy8gV2UgZGVjbGFyZSB0aGlzIHZhcmlhYmxlICd2b2xhdGlsZScgdG8gcHJldmVudCBpbnN0cnVjdGlvbiByZW9yZGVyaW5nCi0vLyBhbmQgbWFrZSBzdXJlIGl0J3Mgc2V0IHRvIHRydWUgX2xhc3RfIChzbyBhcyB0byBiZSB0aHJlYWQtc2FmZSkKLXN0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX29rID0gMDsKLQotc3RhdGljIHZvaWQgRHNwSW5pdFRhYmxlcyh2b2lkKSB7Ci0gIGlmICghdGFibGVzX29rKSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTU7ICsraSkgewotICAgICAgYWJzMFsyNTUgKyBpXSA9IChpIDwgMCkgPyAtaSA6IGk7Ci0gICAgICBhYnMxWzI1NSArIGldID0gYWJzMFsyNTUgKyBpXSA+PiAxOwotICAgIH0KLSAgICBmb3IgKGkgPSAtMTAyMDsgaSA8PSAxMDIwOyArK2kpIHsKLSAgICAgIHNjbGlwMVsxMDIwICsgaV0gPSAoaSA8IC0xMjgpID8gLTEyOCA6IChpID4gMTI3KSA/IDEyNyA6IGk7Ci0gICAgfQotICAgIGZvciAoaSA9IC0xMTI7IGkgPD0gMTEyOyArK2kpIHsKLSAgICAgIHNjbGlwMlsxMTIgKyBpXSA9IChpIDwgLTE2KSA/IC0xNiA6IChpID4gMTUpID8gMTUgOiBpOwotICAgIH0KLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NSArIDI1NTsgKytpKSB7Ci0gICAgICBjbGlwMVsyNTUgKyBpXSA9IChpIDwgMCkgPyAwIDogKGkgPiAyNTUpID8gMjU1IDogaTsKLSAgICB9Ci0gICAgdGFibGVzX29rID0gMTsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwXzhiKGludCB2KSB7Ci0gIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQotCi0jZGVmaW5lIFNUT1JFKHgsIHksIHYpIFwKLSAgZHN0W3ggKyB5ICogQlBTXSA9IGNsaXBfOGIoZHN0W3ggKyB5ICogQlBTXSArICgodikgPj4gMykpCi0KLXN0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7Ci1zdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OwotI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBpbnQgQ1s0ICogNF0sICp0bXA7Ci0gIGludCBpOwotICB0bXAgPSBDOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIHZlcnRpY2FsIHBhc3MKLSAgICBjb25zdCBpbnQgYSA9IGluWzBdICsgaW5bOF07ICAgIC8vIFstNDA5NiwgNDA5NF0KLSAgICBjb25zdCBpbnQgYiA9IGluWzBdIC0gaW5bOF07ICAgIC8vIFstNDA5NSwgNDA5NV0KLSAgICBjb25zdCBpbnQgYyA9IE1VTChpbls0XSwga0MyKSAtIE1VTChpblsxMl0sIGtDMSk7ICAgLy8gWy0zNzgzLCAzNzgzXQotICAgIGNvbnN0IGludCBkID0gTVVMKGluWzRdLCBrQzEpICsgTVVMKGluWzEyXSwga0MyKTsgICAvLyBbLTM3ODUsIDM3ODFdCi0gICAgdG1wWzBdID0gYSArIGQ7ICAgLy8gWy03ODgxLCA3ODc1XQotICAgIHRtcFsxXSA9IGIgKyBjOyAgIC8vIFstNzg3OCwgNzg3OF0KLSAgICB0bXBbMl0gPSBiIC0gYzsgICAvLyBbLTc4NzgsIDc4NzhdCi0gICAgdG1wWzNdID0gYSAtIGQ7ICAgLy8gWy03ODc3LCA3ODc5XQotICAgIHRtcCArPSA0OwotICAgIGluKys7Ci0gIH0KLSAgLy8gRWFjaCBwYXNzIGlzIGV4cGFuZGluZyB0aGUgZHluYW1pYyByYW5nZSBieSB+My44NSAodXBwZXIgYm91bmQpLgotICAvLyBUaGUgZXhhY3QgdmFsdWUgaXMgKDIuICsgKGtDMSArIGtDMikgLyA2NTUzNikuCi0gIC8vIEFmdGVyIHRoZSBzZWNvbmQgcGFzcywgbWF4aW11bSBpbnRlcnZhbCBpcyBbLTM3OTQsIDM3OTRdLCBhc3N1bWluZwotICAvLyBhbiBpbnB1dCBpbiBbLTIwNDgsIDIwNDddIGludGVydmFsLiBXZSB0aGVuIG5lZWQgdG8gYWRkIGEgZHN0IHZhbHVlCi0gIC8vIGluIHRoZSBbMCwgMjU1XSByYW5nZS4KLSAgLy8gSW4gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8sIHRoZSBpbnB1dCB0byBjbGlwXzhiKCkgY2FuIGJlIGFzIGxhcmdlIGFzCi0gIC8vIFstNjA3MTMsIDYwOTY4XS4KLSAgdG1wID0gQzsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyBob3Jpem9udGFsIHBhc3MKLSAgICBjb25zdCBpbnQgZGMgPSB0bXBbMF0gKyA0OwotICAgIGNvbnN0IGludCBhID0gIGRjICsgIHRtcFs4XTsKLSAgICBjb25zdCBpbnQgYiA9ICBkYyAtICB0bXBbOF07Ci0gICAgY29uc3QgaW50IGMgPSBNVUwodG1wWzRdLCBrQzIpIC0gTVVMKHRtcFsxMl0sIGtDMSk7Ci0gICAgY29uc3QgaW50IGQgPSBNVUwodG1wWzRdLCBrQzEpICsgTVVMKHRtcFsxMl0sIGtDMik7Ci0gICAgU1RPUkUoMCwgMCwgYSArIGQpOwotICAgIFNUT1JFKDEsIDAsIGIgKyBjKTsKLSAgICBTVE9SRSgyLCAwLCBiIC0gYyk7Ci0gICAgU1RPUkUoMywgMCwgYSAtIGQpOwotICAgIHRtcCsrOwotICAgIGRzdCArPSBCUFM7Ci0gIH0KLX0KLSN1bmRlZiBNVUwKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKLSAgVHJhbnNmb3JtT25lKGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVVWKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKLSAgVlA4VHJhbnNmb3JtKGluICsgMCAqIDE2LCBkc3QsIDEpOwotICBWUDhUcmFuc2Zvcm0oaW4gKyAyICogMTYsIGRzdCArIDQgKiBCUFMsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90ICppbiwgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IGludCBEQyA9IGluWzBdICsgNDsKLSAgaW50IGksIGo7Ci0gIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICBTVE9SRShpLCBqLCBEQyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybURDVVYoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBpZiAoaW5bMCAqIDE2XSkgVHJhbnNmb3JtREMoaW4gKyAwICogMTYsIGRzdCk7Ci0gIGlmIChpblsxICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDEgKiAxNiwgZHN0ICsgNCk7Ci0gIGlmIChpblsyICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUyk7Ci0gIGlmIChpblszICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDMgKiAxNiwgZHN0ICsgNCAqIEJQUyArIDQpOwotfQotCi0jdW5kZWYgU1RPUkUKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcmFncmFwaCAxNC4zCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGludCB0bXBbMTZdOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBhMCA9IGluWzAgKyBpXSArIGluWzEyICsgaV07Ci0gICAgY29uc3QgaW50IGExID0gaW5bNCArIGldICsgaW5bIDggKyBpXTsKLSAgICBjb25zdCBpbnQgYTIgPSBpbls0ICsgaV0gLSBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMyA9IGluWzAgKyBpXSAtIGluWzEyICsgaV07Ci0gICAgdG1wWzAgICsgaV0gPSBhMCArIGExOwotICAgIHRtcFs4ICArIGldID0gYTAgLSBhMTsKLSAgICB0bXBbNCAgKyBpXSA9IGEzICsgYTI7Ci0gICAgdG1wWzEyICsgaV0gPSBhMyAtIGEyOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBjb25zdCBpbnQgZGMgPSB0bXBbMCArIGkgKiA0XSArIDM7ICAgIC8vIHcvIHJvdW5kZXIKLSAgICBjb25zdCBpbnQgYTAgPSBkYyAgICAgICAgICAgICArIHRtcFszICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMSA9IHRtcFsxICsgaSAqIDRdICsgdG1wWzIgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGEyID0gdG1wWzEgKyBpICogNF0gLSB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTMgPSBkYyAgICAgICAgICAgICAtIHRtcFszICsgaSAqIDRdOwotICAgIG91dFsgMF0gPSAoYTAgKyBhMSkgPj4gMzsKLSAgICBvdXRbMTZdID0gKGEzICsgYTIpID4+IDM7Ci0gICAgb3V0WzMyXSA9IChhMCAtIGExKSA+PiAzOwotICAgIG91dFs0OF0gPSAoYTMgLSBhMikgPj4gMzsKLSAgICBvdXQgKz0gNjQ7Ci0gIH0KLX0KLQotdm9pZCAoKlZQOFRyYW5zZm9ybVdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgPSBUcmFuc2Zvcm1XSFQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbnRyYSBwcmVkaWN0aW9ucwotCi0jZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QgKmRzdCwgaW50IHNpemUpIHsKLSAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOwotICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwMCA9IGNsaXAxICsgMjU1IC0gdG9wWy0xXTsKLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwID0gY2xpcDAgKyBkc3RbLTFdOwotICAgIGludCB4OwotICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKLSAgICAgIGRzdFt4XSA9IGNsaXBbdG9wW3hdXTsKLSAgICB9Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotc3RhdGljIHZvaWQgVE00KHVpbnQ4X3QgKmRzdCkgICB7IFRydWVNb3Rpb24oZHN0LCA0KTsgfQotc3RhdGljIHZvaWQgVE04dXYodWludDhfdCAqZHN0KSB7IFRydWVNb3Rpb24oZHN0LCA4KTsgfQotc3RhdGljIHZvaWQgVE0xNih1aW50OF90ICpkc3QpICB7IFRydWVNb3Rpb24oZHN0LCAxNik7IH0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDE2eDE2Ci0KLXN0YXRpYyB2b2lkIFZFMTYodWludDhfdCAqZHN0KSB7ICAgICAvLyB2ZXJ0aWNhbAotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaiAqIEJQUywgZHN0IC0gQlBTLCAxNik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEUxNih1aW50OF90ICpkc3QpIHsgICAgIC8vIGhvcml6b250YWwKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDE2OyBqID4gMDsgLS1qKSB7Ci0gICAgU2JNZW1vcnlTZXQoZHN0LCBkc3RbLTFdLCAxNik7Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNihpbnQgdiwgdWludDhfdCogZHN0KSB7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgIFNiTWVtb3J5U2V0KGRzdCArIGogKiBCUFMsIHYsIDE2KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBEQzE2KHVpbnQ4X3QgKmRzdCkgeyAgICAvLyBEQwotICBpbnQgREMgPSAxNjsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7Ci0gICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU10gKyBkc3RbaiAtIEJQU107Ci0gIH0KLSAgUHV0MTYoREMgPj4gNSwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QgKmRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQotICBpbnQgREMgPSA4OwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKLSAgfQotICBQdXQxNihEQyA+PiA0LCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QgKmRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQotICBpbnQgREMgPSA4OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBEQyArPSBkc3RbaSAtIEJQU107Ci0gIH0KLSAgUHV0MTYoREMgPj4gNCwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90ICpkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIGFuZCBsZWZ0IHNhbXBsZXMKLSAgUHV0MTYoMHg4MCwgZHN0KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDR4NAotCi0jZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKLSNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCi0KLXN0YXRpYyB2b2lkIFZFNCh1aW50OF90ICpkc3QpIHsgICAgLy8gdmVydGljYWwKLSAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOwotICBjb25zdCB1aW50OF90IHZhbHNbNF0gPSB7Ci0gICAgQVZHMyh0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSksCi0gICAgQVZHMyh0b3BbIDBdLCB0b3BbMV0sIHRvcFsyXSksCi0gICAgQVZHMyh0b3BbIDFdLCB0b3BbMl0sIHRvcFszXSksCi0gICAgQVZHMyh0b3BbIDJdLCB0b3BbM10sIHRvcFs0XSkKLSAgfTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaSAqIEJQUywgdmFscywgc2l6ZW9mKHZhbHMpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIRTQodWludDhfdCAqZHN0KSB7ICAgIC8vIGhvcml6b250YWwKLSAgY29uc3QgaW50IEEgPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQiA9IGRzdFstMV07Ci0gIGNvbnN0IGludCBDID0gZHN0Wy0xICsgQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEUgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgKih1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEEsIEIsIEMpOwotICAqKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoQiwgQywgRCk7Ci0gICoodWludDMyX3QqKShkc3QgKyAyICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhDLCBELCBFKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEQsIEUsIEUpOwotfQotCi1zdGF0aWMgdm9pZCBEQzQodWludDhfdCAqZHN0KSB7ICAgLy8gREMKLSAgdWludDMyX3QgZGMgPSA0OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107Ci0gIGRjID4+PSAzOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBTYk1lbW9yeVNldChkc3QgKyBpICogQlBTLCBkYywgNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFJENCh1aW50OF90ICpkc3QpIHsgICAvLyBEb3duLXJpZ2h0Ci0gIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107Ci0gIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107Ci0gIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107Ci0gIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107Ci0gIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKLSAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107Ci0gIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOwotICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107Ci0gIERTVCgwLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSiwgSywgTCk7Ci0gIERTVCgwLCAyKSA9IERTVCgxLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSSwgSiwgSyk7Ci0gIERTVCgwLCAxKSA9IERTVCgxLCAyKSA9IERTVCgyLCAzKSAgICAgICAgICAgICA9IEFWRzMoWCwgSSwgSik7Ci0gIERTVCgwLCAwKSA9IERTVCgxLCAxKSA9IERTVCgyLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoQSwgWCwgSSk7Ci0gIERTVCgxLCAwKSA9IERTVCgyLCAxKSA9IERTVCgzLCAyKSAgICAgICAgICAgICA9IEFWRzMoQiwgQSwgWCk7Ci0gIERTVCgyLCAwKSA9IERTVCgzLCAxKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQywgQiwgQSk7Ci0gIERTVCgzLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoRCwgQywgQik7Ci19Ci0KLXN0YXRpYyB2b2lkIExENCh1aW50OF90ICpkc3QpIHsgICAvLyBEb3duLUxlZnQKLSAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107Ci0gIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOwotICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107Ci0gIGNvbnN0IGludCBFID0gZHN0WzQgLSBCUFNdOwotICBjb25zdCBpbnQgRiA9IGRzdFs1IC0gQlBTXTsKLSAgY29uc3QgaW50IEcgPSBkc3RbNiAtIEJQU107Ci0gIGNvbnN0IGludCBIID0gZHN0WzcgLSBCUFNdOwotICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOwotICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOwotICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOwotICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEUsIEYsIEcpOwotICBEU1QoMywgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEYsIEcsIEgpOwotICBEU1QoMywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEcsIEgsIEgpOwotfQotCi1zdGF0aWMgdm9pZCBWUjQodWludDhfdCAqZHN0KSB7ICAgLy8gVmVydGljYWwtUmlnaHQKLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKLSAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKLSAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKLSAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKLQotICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOwotICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOwotICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOwotICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOwotICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOwotfQotCi1zdGF0aWMgdm9pZCBWTDQodWludDhfdCAqZHN0KSB7ICAgLy8gVmVydGljYWwtTGVmdAotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgY29uc3QgaW50IEUgPSBkc3RbNCAtIEJQU107Ci0gIGNvbnN0IGludCBGID0gZHN0WzUgLSBCUFNdOwotICBjb25zdCBpbnQgRyA9IGRzdFs2IC0gQlBTXTsKLSAgY29uc3QgaW50IEggPSBkc3RbNyAtIEJQU107Ci0gIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoQSwgQik7Ci0gIERTVCgxLCAwKSA9IERTVCgwLCAyKSA9IEFWRzIoQiwgQyk7Ci0gIERTVCgyLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoQywgRCk7Ci0gIERTVCgzLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoRCwgRSk7Ci0KLSAgRFNUKDAsIDEpID0gICAgICAgICAgICAgQVZHMyhBLCBCLCBDKTsKLSAgRFNUKDEsIDEpID0gRFNUKDAsIDMpID0gQVZHMyhCLCBDLCBEKTsKLSAgRFNUKDIsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhDLCBELCBFKTsKLSAgRFNUKDMsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhELCBFLCBGKTsKLSAgICAgICAgICAgICAgRFNUKDMsIDIpID0gQVZHMyhFLCBGLCBHKTsKLSAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhGLCBHLCBIKTsKLX0KLQotc3RhdGljIHZvaWQgSFU0KHVpbnQ4X3QgKmRzdCkgeyAgIC8vIEhvcml6b250YWwtVXAKLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihJLCBKKTsKLSAgRFNUKDIsIDApID0gRFNUKDAsIDEpID0gQVZHMihKLCBLKTsKLSAgRFNUKDIsIDEpID0gRFNUKDAsIDIpID0gQVZHMihLLCBMKTsKLSAgRFNUKDEsIDApID0gICAgICAgICAgICAgQVZHMyhJLCBKLCBLKTsKLSAgRFNUKDMsIDApID0gRFNUKDEsIDEpID0gQVZHMyhKLCBLLCBMKTsKLSAgRFNUKDMsIDEpID0gRFNUKDEsIDIpID0gQVZHMyhLLCBMLCBMKTsKLSAgRFNUKDMsIDIpID0gRFNUKDIsIDIpID0KLSAgICBEU1QoMCwgMykgPSBEU1QoMSwgMykgPSBEU1QoMiwgMykgPSBEU1QoMywgMykgPSBMOwotfQotCi1zdGF0aWMgdm9pZCBIRDQodWludDhfdCAqZHN0KSB7ICAvLyBIb3Jpem9udGFsLURvd24KLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotCi0gIERTVCgwLCAwKSA9IERTVCgyLCAxKSA9IEFWRzIoSSwgWCk7Ci0gIERTVCgwLCAxKSA9IERTVCgyLCAyKSA9IEFWRzIoSiwgSSk7Ci0gIERTVCgwLCAyKSA9IERTVCgyLCAzKSA9IEFWRzIoSywgSik7Ci0gIERTVCgwLCAzKSAgICAgICAgICAgICA9IEFWRzIoTCwgSyk7Ci0KLSAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKLSAgRFNUKDIsIDApICAgICAgICAgICAgID0gQVZHMyhYLCBBLCBCKTsKLSAgRFNUKDEsIDApID0gRFNUKDMsIDEpID0gQVZHMyhJLCBYLCBBKTsKLSAgRFNUKDEsIDEpID0gRFNUKDMsIDIpID0gQVZHMyhKLCBJLCBYKTsKLSAgRFNUKDEsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhLLCBKLCBJKTsKLSAgRFNUKDEsIDMpICAgICAgICAgICAgID0gQVZHMyhMLCBLLCBKKTsKLX0KLQotI3VuZGVmIERTVAotI3VuZGVmIEFWRzMKLSN1bmRlZiBBVkcyCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaHJvbWEKLQotc3RhdGljIHZvaWQgVkU4dXYodWludDhfdCAqZHN0KSB7ICAgIC8vIHZlcnRpY2FsCi0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgOCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEU4dXYodWludDhfdCAqZHN0KSB7ICAgIC8vIGhvcml6b250YWwKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKLSAgICBTYk1lbW9yeVNldChkc3QsIGRzdFstMV0sIDgpOwotICAgIGRzdCArPSBCUFM7Ci0gIH0KLX0KLQotLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QqIGRzdCkgewotICBpbnQgajsKLSNpZm5kZWYgV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04KLSAgY29uc3QgdWludDY0X3QgdiA9ICh1aW50NjRfdCl2YWx1ZSAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKLSAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgewotICAgICoodWludDY0X3QqKShkc3QgKyBqICogQlBTKSA9IHY7Ci0gIH0KLSNlbHNlCi0gIGZvciAoaiA9IDA7IGogPCA4OyArK2opIFNiTWVtb3J5U2V0KGRzdCArIGogKiBCUFMsIHZhbHVlLCA4KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBEQzh1dih1aW50OF90ICpkc3QpIHsgICAgIC8vIERDCi0gIGludCBkYzAgPSA4OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotICAgIGRjMCArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKLSAgfQotICBQdXQ4eDh1dihkYzAgPj4gNCwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREM4dXZOb0xlZnQodWludDhfdCAqZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKLSAgaW50IGRjMCA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgZGMwICs9IGRzdFtpIC0gQlBTXTsKLSAgfQotICBQdXQ4eDh1dihkYzAgPj4gMywgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREM4dXZOb1RvcCh1aW50OF90ICpkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKLSAgaW50IGRjMCA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgZGMwICs9IGRzdFstMSArIGkgKiBCUFNdOwotICB9Ci0gIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdCh1aW50OF90ICpkc3QpIHsgICAgLy8gREMgd2l0aCBub3RoaW5nCi0gIFB1dDh4OHV2KDB4ODAsIGRzdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZWZhdWx0IEMgaW1wbGVtZW50YXRpb25zCi0KLWNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFtOVU1fQk1PREVTXSA9IHsKLSAgREM0LCBUTTQsIFZFNCwgSEU0LCBSRDQsIFZSNCwgTEQ0LCBWTDQsIEhENCwgSFU0Ci19OwotCi1jb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTE2W05VTV9CX0RDX01PREVTXSA9IHsKLSAgREMxNiwgVE0xNiwgVkUxNiwgSEUxNiwKLSAgREMxNk5vVG9wLCBEQzE2Tm9MZWZ0LCBEQzE2Tm9Ub3BMZWZ0Ci19OwotCi1jb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkQ2hyb21hOFtOVU1fQl9EQ19NT0RFU10gPSB7Ci0gIERDOHV2LCBUTTh1diwgVkU4dXYsIEhFOHV2LAotICBEQzh1dk5vVG9wLCBEQzh1dk5vTGVmdCwgREM4dXZOb1RvcExlZnQKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKLQotLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgc2NsaXAxWzEwMjAgKyBwMSAtIHExXTsKLSAgY29uc3QgaW50IGExID0gc2NsaXAyWzExMiArICgoYSArIDQpID4+IDMpXTsKLSAgY29uc3QgaW50IGEyID0gc2NsaXAyWzExMiArICgoYSArIDMpID4+IDMpXTsKLSAgcFstc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgMF0gPSBjbGlwMVsyNTUgKyBxMCAtIGExXTsKLX0KLQotLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOwotICBwWy0yKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDEgKyBhM107Ci0gIHBbLSAgc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotICBwWyAgIHN0ZXBdID0gY2xpcDFbMjU1ICsgcTEgLSBhM107Ci19Ci0KLS8vIDYgcGl4ZWxzIGluLCA2IHBpeGVscyBvdXQKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjYodWludDhfdCogcCwgaW50IHN0ZXApIHsKLSAgY29uc3QgaW50IHAyID0gcFstMypzdGVwXSwgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdOwotICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyKnN0ZXBdOwotICBjb25zdCBpbnQgYSA9IHNjbGlwMVsxMDIwICsgMyAqIChxMCAtIHAwKSArIHNjbGlwMVsxMDIwICsgcDEgLSBxMV1dOwotICBjb25zdCBpbnQgYTEgPSAoMjcgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgzICogYSArIDcpICogOSkgPj4gNwotICBjb25zdCBpbnQgYTIgPSAoMTggKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgyICogYSArIDcpICogOSkgPj4gNwotICBjb25zdCBpbnQgYTMgPSAoOSAgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgxICogYSArIDcpICogOSkgPj4gNwotICBwWy0zKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDIgKyBhM107Ci0gIHBbLTIqc3RlcF0gPSBjbGlwMVsyNTUgKyBwMSArIGEyXTsKLSAgcFstICBzdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTFdOwotICBwWyAgICAgIDBdID0gY2xpcDFbMjU1ICsgcTAgLSBhMV07Ci0gIHBbICAgc3RlcF0gPSBjbGlwMVsyNTUgKyBxMSAtIGEyXTsKLSAgcFsgMipzdGVwXSA9IGNsaXAxWzI1NSArIHEyIC0gYTNdOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IGhldihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgcmV0dXJuIChhYnMwWzI1NSArIHAxIC0gcDBdID4gdGhyZXNoKSB8fCAoYWJzMFsyNTUgKyBxMSAtIHEwXSA+IHRocmVzaCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICByZXR1cm4gKDIgKiBhYnMwWzI1NSArIHAwIC0gcTBdICsgYWJzMVsyNTUgKyBwMSAtIHExXSkgPD0gdGhyZXNoOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcjIoY29uc3QgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgewotICBjb25zdCBpbnQgcDMgPSBwWy00KnN0ZXBdLCBwMiA9IHBbLTMqc3RlcF0sIHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXTsKLSAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMipzdGVwXSwgcTMgPSBwWzMqc3RlcF07Ci0gIGlmICgoMiAqIGFiczBbMjU1ICsgcDAgLSBxMF0gKyBhYnMxWzI1NSArIHAxIC0gcTFdKSA+IHQpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBhYnMwWzI1NSArIHAzIC0gcDJdIDw9IGl0ICYmIGFiczBbMjU1ICsgcDIgLSBwMV0gPD0gaXQgJiYKLSAgICAgICAgIGFiczBbMjU1ICsgcDEgLSBwMF0gPD0gaXQgJiYgYWJzMFsyNTUgKyBxMyAtIHEyXSA8PSBpdCAmJgotICAgICAgICAgYWJzMFsyNTUgKyBxMiAtIHExXSA8PSBpdCAmJiBhYnMwWzI1NSArIHExIC0gcTBdIDw9IGl0OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSwgc3RyaWRlLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpLCBzdHJpZGUpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpICogc3RyaWRlLCAxKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaCwgaXRocmVzaCkpIHsKLSAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKLSAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvX2ZpbHRlcjYocCwgaHN0cmlkZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgKz0gdnN0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjQodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaCwgaXRocmVzaCkpIHsKLSAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKLSAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvX2ZpbHRlcjQocCwgaHN0cmlkZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgKz0gdnN0cmlkZTsKLSAgfQotfQotCi0vLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI2KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLS8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKLXN0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI2KHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI2KHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYodSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICBGaWx0ZXJMb29wMjYodiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi1zdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI0KHUgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIEZpbHRlckxvb3AyNCh2ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI0KHUgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIEZpbHRlckxvb3AyNCh2ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1WUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07Ci1WUDhEZWNJZGN0IFZQOFRyYW5zZm9ybVVWOwotVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQzsKLVZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKLQotVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OwotVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2OwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKLVZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7Ci1WUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOwotVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKLVZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyOGk7Ci1WUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNjsKLVZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OwotVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOwotVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOwotCi1leHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKLWV4dGVybiB2b2lkIFZQOERzcEluaXRORU9OKHZvaWQpOwotCi12b2lkIFZQOERzcEluaXQodm9pZCkgewotICBEc3BJbml0VGFibGVzKCk7Ci0KLSAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOwotICBWUDhUcmFuc2Zvcm1VViA9IFRyYW5zZm9ybVVWOwotICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDOwotICBWUDhUcmFuc2Zvcm1EQ1VWID0gVHJhbnNmb3JtRENVVjsKLQotICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTY7Ci0gIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNjsKLSAgVlA4VkZpbHRlcjggPSBWRmlsdGVyODsKLSAgVlA4SEZpbHRlcjggPSBIRmlsdGVyODsKLSAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7Ci0gIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOwotICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7Ci0gIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2OwotICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTY7Ci0gIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpOwotICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aTsKLQotICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgotICBpZiAoVlA4R2V0Q1BVSW5mbykgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKLSAgICAgIFZQOERzcEluaXRTU0UyKCk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgewotICAgICAgVlA4RHNwSW5pdE5FT04oKTsKLSAgICB9Ci0jZW5kaWYKLSAgfQotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19uZW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2QzYjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19uZW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFSTSBORU9OIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucyBhbmQgbG9vcCBmaWx0ZXJpbmcuCi0vLwotLy8gQXV0aG9yczogU29tbmF0aCBCYW5lcmplZSAoc29tbmF0aEBnb29nbGUuY29tKQotLy8gICAgICAgICAgSm9oYW5uIEtvZW5pZyAoam9oYW5ua29lbmlnQGdvb2dsZS5jb20pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLQotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0KLSNkZWZpbmUgUVJlZ3MgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKLQotI2RlZmluZSBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZlb3IgICAgICIgI2EgIiwiICNhICIsIiAjcyAiICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2ZW9yICAgICAiICNiICIsIiAjYiAiLCIgI3MgIiAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0jZGVmaW5lIEZMSVBfU0lHTl9CSVQ0KGEsIGIsIGMsIGQsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIoYywgZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLSNkZWZpbmUgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2YWJkLnU4ICAgIHExNSwiICNwMCAiLCIgI3EwICIgICAgICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqLyAgICAgICAgICAgICAgXAotICAidmFiZC51OCAgICBxMTQsIiAjcDEgIiwiICNxMSAiICAgICAgICAgXG4iICAvKiBhYnMocDEgLSBxMSkgKi8gICAgICAgICAgICAgIFwKLSAgInZxYWRkLnU4ICAgcTE1LCBxMTUsIHExNSAgICAgICAgICAgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICogMiAqLyAgICAgICAgICBcCi0gICJ2c2hyLnU4ICAgIHExNCwgcTE0LCAjMSAgICAgICAgICAgICAgICBcbiIgIC8qIGFicyhwMSAtIHExKSAvIDIgKi8gICAgICAgICAgXAotICAidnFhZGQudTggICBxMTUsIHExNSwgcTE0ICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICovIFwKLSAgInZkdXAuOCAgICAgcTE0LCAiICN0aHJlc2ggIiAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2Y2dlLnU4ICAgIiAjbWFzayAiLCBxMTQsIHExNSAgICAgICAgICBcbiIgIC8qIG1hc2sgPD0gdGhyZXNoICovCi0KLSNkZWZpbmUgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIG8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2cXN1Yi5zOCAgIHExNSwiICNxMCAiLCIgI3AwICIgICAgICAgICBcbiIgIC8qIChxMCAtIHAwKSAqLyAgICAgICAgICAgICAgICAgXAotICAidnFzdWIuczggICIgI28gIiwiICNwMSAiLCIgI3ExICIgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKi8gICAgICAgICAgICAgICAgIFwKLSAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMSAqIChwMCAtIHEwKSAqLyBcCi0gICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDIgKiAocDAgLSBxMCkgKi8gXAotICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAzICogKHAwIC0gcTApICovCi0KLSNkZWZpbmUgRE9fU0lNUExFX0ZJTFRFUihwMCwgcTAsIGZsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2bW92Lmk4ICAgIHExNSwgIzB4MDMgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidnFhZGQuczggICBxMTUsIHExNSwgIiAjZmwgIiAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID0gZmlsdGVyICsgMyAqLyAgICAgIFwKLSAgInZzaHIuczggICAgcTE1LCBxMTUsICMzICAgICAgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA+PiAzICovICAgICAgICAgICAgICBcCi0gICJ2cWFkZC5zOCAgIiAjcDAgIiwiICNwMCAiLCBxMTUgICAgICAgICBcbiIgIC8qIHAwICs9IGZpbHRlcjEgKi8gICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZtb3YuaTggICAgcTE1LCAjMHgwNCAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2cWFkZC5zOCAgIHExNSwgcTE1LCAiICNmbCAiICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPSBmaWx0ZXIgKyA0ICovICAgICAgXAotICAidnNoci5zOCAgICBxMTUsIHExNSwgIzMgICAgICAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIyID4+IDMgKi8gICAgICAgICAgICAgIFwKLSAgInZxc3ViLnM4ICAiICNxMCAiLCIgI3EwICIsIHExNSAgICAgICAgIFxuIiAgLyogcTAgLT0gZmlsdGVyMiAqLwotCi0vLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQotI2RlZmluZSBET19GSUxURVIyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIHE5KSAgICAgLyogZmlsdGVyIG1hc2sgaW4gcTkgKi8gICAgICAgICBcCi0gICJ2bW92Lmk4ICAgIHExMCwgIzB4ODAgICAgICAgICAgICAgICAgICBcbiIgIC8qIHNpZ24gYml0ICovICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUNChwMSwgcDAsIHEwLCBxMSwgcTEwKSAgICAgICAgICAvKiBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZSAqLyAgIFwKLSAgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIHExMSkgICAgICAgICAgLyogZ2V0IGZpbHRlciBsZXZlbCAgKi8gICAgICAgICBcCi0gICJ2YW5kICAgICAgIHE5LCBxOSwgcTExICAgICAgICAgICAgICAgICBcbiIgIC8qIGFwcGx5IGZpbHRlciBtYXNrICovICAgICAgICAgXAotICBET19TSU1QTEVfRklMVEVSKHAwLCBxMCwgcTkpICAgICAgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgKi8gICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIocDAsIHEwLCBxMTApCi0KLS8vIExvYWQvU3RvcmUgdmVydGljYWwgZWRnZQotI2RlZmluZSBMT0FEOHg0KGMxLCBjMiwgYzMsIGM0LCBiMSwgYjIsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbMF0sICIgI2MyIlswXSwgIiAjYzMiWzBdLCAiICNjNCJbMF19LCIgI2IxICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzFdLCAiICNjMiJbMV0sICIgI2MzIlsxXSwgIiAjYzQiWzFdfSwiICNiMiAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIlsyXSwgIiAjYzIiWzJdLCAiICNjMyJbMl0sICIgI2M0IlsyXX0sIiAjYjEgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbM10sICIgI2MyIlszXSwgIiAjYzMiWzNdLCAiICNjNCJbM119LCIgI2IyICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzRdLCAiICNjMiJbNF0sICIgI2MzIls0XSwgIiAjYzQiWzRdfSwiICNiMSAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIls1XSwgIiAjYzIiWzVdLCAiICNjMyJbNV0sICIgI2M0Ils1XX0sIiAjYjIgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbNl0sICIgI2MyIls2XSwgIiAjYzMiWzZdLCAiICNjNCJbNl19LCIgI2IxICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzddLCAiICNjMiJbN10sICIgI2MzIls3XSwgIiAjYzQiWzddfSwiICNiMiAiLCIgI3N0cmlkZSJcbiIKLQotI2RlZmluZSBTVE9SRTh4MihjMSwgYzIsIHAsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbMF0sICIgI2MyIlswXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzFdLCAiICNjMiJbMV19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIlsyXSwgIiAjYzIiWzJdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbM10sICIgI2MyIlszXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzRdLCAiICNjMiJbNF19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIls1XSwgIiAjYzIiWzVdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbNl0sICIgI2MyIls2XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzddLCAiICNjMiJbN119LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2TkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQotCi0gICAgInZsZDEudTggICAge3ExfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcDEKLSAgICAidmxkMS51OCAgICB7cTJ9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBwMAotICAgICJ2bGQxLnU4ICAgIHtxM30sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHEwCi0gICAgInZsZDEudTggICAge3E0fSwgWyVbcF1dICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcTEKLQotICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMywgcTQsICVbdGhyZXNoXSkKLQotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQotCi0gICAgInZzdDEudTggICAge3EyfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gc3RvcmUgb3AwCi0gICAgInZzdDEudTggICAge3EzfSwgWyVbcF1dICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gc3RvcmUgb3EwCi0gICAgOiBbcF0gIityIihwKQotICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCi0gICAgOiAibWVtb3J5IiwgUVJlZ3MKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2TkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJzdWIgICAgICAgIHI0LCAlW3BdLCAjMiAgICAgICAgICAgICAgICAgICBcbiIgIC8vIGJhc2UxID0gcCAtIDIKLSAgICAibHNsICAgICAgICByNiwgJVtzdHJpZGVdLCAjMSAgICAgICAgICAgICAgXG4iICAvLyByNiA9IDIgKiBzdHJpZGUKLSAgICAiYWRkICAgICAgICByNSwgcjQsICVbc3RyaWRlXSAgICAgICAgICAgICAgXG4iICAvLyBiYXNlMiA9IGJhc2UxICsgc3RyaWRlCi0KLSAgICBMT0FEOHg0KGQyLCBkMywgZDQsIGQ1LCBbcjRdLCBbcjVdLCByNikKLSAgICBMT0FEOHg0KGQ2LCBkNywgZDgsIGQ5LCBbcjRdLCBbcjVdLCByNikKLSAgICAidnN3cCAgICAgICBkMywgZDYgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBwMTpxMSBwMDpxMwotICAgICJ2c3dwICAgICAgIGQ1LCBkOCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHEwOnEyIHExOnE0Ci0gICAgInZzd3AgICAgICAgcTIsIHEzICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcDE6cTEgcDA6cTIgcTA6cTMgcTE6cTQKLQotICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMywgcTQsICVbdGhyZXNoXSkKLQotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICMxICAgICAgICAgICAgICAgICBcbiIgIC8vIHAgLSAxCi0KLSAgICAidnN3cCAgICAgICAgZDUsIGQ2ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgU1RPUkU4eDIoZDQsIGQ1LCBbJVtwXV0sICVbc3RyaWRlXSkKLSAgICBTVE9SRTh4MihkNiwgZDcsIFslW3BdXSwgJVtzdHJpZGVdKQotCi0gICAgOiBbcF0gIityIihwKQotICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCi0gICAgOiAibWVtb3J5IiwgInI0IiwgInI1IiwgInI2IiwgUVJlZ3MKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aU5FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNCAqIHN0cmlkZTsKLSAgICBTaW1wbGVWRmlsdGVyMTZORU9OKHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNk5FT04ocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludmVyc2UgdHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZU5FT04oY29uc3QgaW50MTZfdCAqaW4sIHVpbnQ4X3QgKmRzdCkgewotICBjb25zdCBpbnQga0JQUyA9IEJQUzsKLSAgY29uc3QgaW50MTZfdCBjb25zdGFudHNbXSA9IHsyMDA5MSwgMTc3MzQsIDAsIDB9OwotICAvKiBrQzEsIGtDMi4gUGFkZGVkIGJlY2F1c2UgdmxkMS4xNiBsb2FkcyA4IGJ5dGVzCi0gICAqIFRlY2huaWNhbGx5IHRoZXNlIGFyZSB1bnNpZ25lZCBidXQgdnFkbXVsaCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzaWduZWQuCi0gICAqIHZxZG11bGggcmV0dXJucyBoaWdoIGhhbGYgKGVmZmVjdGl2ZWx5ID4+IDE2KSBidXQgYWxzbyBkb3VibGVzIHRoZSB2YWx1ZSwKLSAgICogY2hhbmdpbmcgdGhlID4+IDE2IHRvID4+IDE1IGFuZCByZXF1aXJpbmcgYW4gYWRkaXRpb25hbCA+PiAxLgotICAgKiBXZSB1c2UgdGhpcyB0byBvdXIgYWR2YW50YWdlIHdpdGgga0MyLiBUaGUgY2Fub25pY2FsIHZhbHVlIGlzIDM1NDY4LgotICAgKiBIb3dldmVyLCB0aGUgaGlnaCBiaXQgaXMgc2V0IHNvIHRyZWF0aW5nIGl0IGFzIHNpZ25lZCB3aWxsIGdpdmUgaW5jb3JyZWN0Ci0gICAqIHJlc3VsdHMuIFdlIGF2b2lkIHRoaXMgYnkgZG93biBzaGlmdGluZyBieSAxIGhlcmUgdG8gY2xlYXIgdGhlIGhpZ2hlc3QgYml0LgotICAgKiBDb21iaW5lZCB3aXRoIHRoZSBkb3VibGluZyBlZmZlY3Qgb2YgdnFkbXVsaCB3ZSBnZXQgPj4gMTYuCi0gICAqIFRoaXMgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIGtDMSBiZWNhdXNlIHRoZSBsb3dlc3QgYml0IGlzIHNldC4gRG93biBzaGlmdGluZwotICAgKiB0aGUgY29uc3RhbnQgd291bGQgcmVkdWNlIHByZWNpc2lvbi4KLSAgICovCi0KLSAgLyogbGlid2VicCB1c2VzIGEgdHJpY2sgdG8gYXZvaWQgc29tZSBleHRyYSBhZGRpdGlvbiB0aGF0IGxpYnZweCBkb2VzLgotICAgKiBJbnN0ZWFkIG9mOgotICAgKiB0ZW1wMiA9IGlwWzEyXSArICgoaXBbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICogbGlid2VicCBhZGRzIDEgPDwgMTYgdG8gY29zcGk4c3FydDJtaW51czEgKGtDMSkuIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIHRoZQotICAgKiBzYW1lIGlzc3VlIHdpdGgga0MxIGFuZCB2cWRtdWxoIHRoYXQgd2Ugd29yayBhcm91bmQgYnkgZG93biBzaGlmdGluZyBrQzIKLSAgICovCi0KLSAgLyogQWRhcHRlZCBmcm9tIGxpYnZweDogdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbi5hc20gKi8KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInZsZDEuMTYgICAgICAgICB7cTEsIHEyfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICB7ZDB9LCBbJVtjb25zdGFudHNdXSAgICAgICAgXG4iCi0KLSAgICAvKiBkMjogaW5bMF0KLSAgICAgKiBkMzogaW5bOF0KLSAgICAgKiBkNDogaW5bNF0KLSAgICAgKiBkNTogaW5bMTJdCi0gICAgICovCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBxOCA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAgKiBxOSA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMiA+PiAxNgotICAgICAqLwotICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIyID0gYSA9IGluWzBdICsgaW5bOF0KLSAgICAgKiBkMjMgPSBiID0gaW5bMF0gLSBpbls4XQotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogVGhlIG11bHRpcGxpY2F0aW9uIHNob3VsZCBiZSB4ICoga0MxID4+IDE2Ci0gICAgICogSG93ZXZlciwgd2l0aCB2cWRtdWxoIHdlIGdldCB4ICoga0MxICogMiA+PiAxNgotICAgICAqIChtdWx0aXBseSwgZG91YmxlLCByZXR1cm4gaGlnaCBoYWxmKQotICAgICAqIFdlIGF2b2lkZWQgdGhpcyBpbiBrQzIgYnkgcHJlLXNoaWZ0aW5nIHRoZSBjb25zdGFudC4KLSAgICAgKiBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKLSAgICAgKi8KLSAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgaGFuZGxlZCBieQotICAgICAqIGFkZGluZyAxIDw8IDE2IHRvIGtDMSBpbiB0aGUgbGlid2VicCBDIGNvZGUuCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgICAqIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgICovCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgICogZDMgPSB0bXBbMV0gPSBiICsgYwotICAgICAqIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAgKiBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAgKiBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2Ci0gICAgICovCi0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCi0gICAgICogZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogU2VlIGxvbmcgd2luZGVkIGV4cGxhbmF0aW9ucyBwcmlvciAqLwotICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKLSAgICAgKiBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgotICAgICAqLwotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIgPSB0bXBbMF0gPSBhICsgZAotICAgICAqIGQzID0gdG1wWzFdID0gYiArIGMKLSAgICAgKiBkNCA9IHRtcFsyXSA9IGIgLSBjCi0gICAgICogZDUgPSB0bXBbM10gPSBhIC0gZAotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuMzIgICAgICAgICBkNlswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkNlsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1swXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1sxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0KLSAgICAic3ViICAgICAgICAgJVtkc3RdLCAlW2RzdF0sICVba0JQU10sIGxzbCAjMiBcbiIKLQotICAgIC8qICh2YWwpICsgNCA+PiAzICovCi0gICAgInZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIE11c3QgYWNjdW11bGF0ZSBiZWZvcmUgc2F0dXJhdGluZyAqLwotICAgICJ2bW92bC51OCAgICAgICAgcTgsIGQ2ICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2bW92bC51OCAgICAgICAgcTksIGQ3ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFtb3Z1bi5zMTYgICAgIGQwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFtb3Z1bi5zMTYgICAgIGQxLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMV0sIFslW2RzdF1dICAgICAgICAgICAgIFxuIgotCi0gICAgOiBbaW5dICIrciIoaW4pLCBbZHN0XSAiK3IiKGRzdCkgIC8qIG1vZGlmaWVkIHJlZ2lzdGVycyAqLwotICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2NvbnN0YW50c10gInIiKGNvbnN0YW50cykgIC8qIGNvbnN0YW50cyAqLwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxOCIsICJxOSIsICJxMTAiLCAicTExIiAgLyogY2xvYmJlcmVkICovCi0gICk7Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVR3b05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgewotICBUcmFuc2Zvcm1PbmVORU9OKGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgVHJhbnNmb3JtT25lTkVPTihpbiArIDE2LCBkc3QgKyA0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgewotICBjb25zdCBpbnQga1N0ZXAgPSAzMjsgIC8vIFRoZSBzdG9yZSBpcyBvbmx5IGluY3JlbWVudGluZyB0aGUgcG9pbnRlciBhcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhZCBzdG9yZWQgYSBzaW5nbGUgYnl0ZS4KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgLy8gcGFydCAxCi0gICAgLy8gbG9hZCBkYXRhIGludG8gcTAsIHExCi0gICAgInZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZGwuczE2ICAgICAgIHEyLCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBpblswXSArIGluWzEyXQotICAgICJ2YWRkbC5zMTYgICAgICAgcTMsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGluWzRdICsgaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE0LCBkMSwgZDIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSBpbls0XSAtIGluWzhdCi0gICAgInZzdWJsLnMxNiAgICAgICBxNSwgZDAsIGQzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gaW5bMF0gLSBpblsxMl0KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHEyLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMF0gPSBhMCArIGExCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFs4XSA9IGEwIC0gYTEKLSAgICAidmFkZC5zMzIgICAgICAgIHExLCBxNSwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzRdID0gYTMgKyBhMgotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMTJdID0gYTMgLSBhMgotCi0gICAgLy8gVHJhbnNwb3NlCi0gICAgLy8gcTAgPSB0bXBbMCwgNCwgOCwgMTJdLCBxMSA9IHRtcFsyLCA2LCAxMCwgMTRdCi0gICAgLy8gcTIgPSB0bXBbMSwgNSwgOSwgMTNdLCBxMyA9IHRtcFszLCA3LCAxMSwgMTVdCi0gICAgInZzd3AgICAgICAgICAgICBkMSwgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTAsIHEyCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTEsIHEzCi0gICAgInZ0cm4uMzIgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMiwgcTMgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidm1vdi5zMzIgICAgICAgIHE0LCAjMyAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSAzCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTAsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIGRjID0gdG1wWzBdICsgMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTYsIHEwLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGRjICsgdG1wWzNdCi0gICAgInZhZGQuczMyICAgICAgICBxNywgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gdG1wWzFdICsgdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOCwgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gdG1wWzFdIC0gdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOSwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gZGMgLSB0bXBbM10KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDAsIHEwLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgKyBhMSkgPj4gMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHExLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgKyBhMikgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTIsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgLSBhMSkgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHEzLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgLSBhMikgPj4gMwotCi0gICAgLy8gc2V0IHRoZSByZXN1bHRzIHRvIG91dHB1dAotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotCi0gICAgOiBbb3V0XSAiK3IiKG91dCkgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2luXSAiciIoaW4pLCBba1N0ZXBdICJyIihrU3RlcCkgIC8vIGNvbnN0YW50cwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiICAvLyBjbG9iYmVyZWQKLSAgKTsKLX0KLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW50cnkgcG9pbnQKLQotZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLSAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvTkVPTjsKLSAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUOwotCi0gIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNk5FT047Ci0gIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNk5FT047Ci0gIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpTkVPTjsKLSAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmlORU9OOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19zc2UyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTk0NjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19zc2UyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNTRTIgdmVyc2lvbiBvZiBzb21lIGRlY29kaW5nIGZ1bmN0aW9ucyAoaWRjdCwgbG9vcCBmaWx0ZXJpbmcpLgotLy8KLS8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQotLy8gICAgICAgICBjZHV2aXZpZXJAZ29vZ2xlLmNvbSAoQ2hyaXN0aWFuIER1dml2aWVyKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0KLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLSNpbmNsdWRlICIuLi9kZWMvdnA4aS5oIgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVNTRTIoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgewotICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNi1iaXQgZml4ZWQgcG9pbnQgdmVyc2lvbnMgb2YgdHdvCi0gIC8vIG11bHRpcGx5IGNvbnN0YW50czoKLSAgLy8gICAgSzEgPSBzcXJ0KDIpICogY29zIChwaS84KSB+PSA4NTYyNyAvIDJeMTYKLSAgLy8gICAgSzIgPSBzcXJ0KDIpICogc2luIChwaS84KSB+PSAzNTQ2OCAvIDJeMTYKLSAgLy8KLSAgLy8gVG8gYmUgYWJsZSB0byB1c2Ugc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8KLSAgLy8gaGF2ZSBjb25zdGFudHMgd2l0aGluIHJhbmdlOgotICAvLyAtIEFzc29jaWF0ZWQgY29uc3RhbnRzIGFyZSBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyB0aGUgMTYtYml0IGZpeGVkIHBvaW50Ci0gIC8vICAgdmVyc2lvbiBvZiBvbmU6Ci0gIC8vICAgICAgayA9IEsgLSAoMSA8PCAxNikgID0+ICBLID0gayArICgxIDw8IDE2KQotICAvLyAgICAgIEsxID0gODUyNjcgID0+ICBrMSA9ICAyMDA5MQotICAvLyAgICAgIEsyID0gMzU0NjggID0+ICBrMiA9IC0zMDA2OAotICAvLyAtIFRoZSBtdWx0aXBsaWNhdGlvbiBvZiBhIHZhcmlhYmxlIGJ5IGEgY29uc3RhbnQgYmVjb21lIHRoZSBzdW0gb2YgdGhlCi0gIC8vICAgdmFyaWFibGUgYW5kIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGF0IHZhcmlhYmxlIGJ5IHRoZSBhc3NvY2lhdGVkCi0gIC8vICAgY29uc3RhbnQ6Ci0gIC8vICAgICAgKHggKiBLKSA+PiAxNiA9ICh4ICogKGsgKyAoMSA8PCAxNikpKSA+PiAxNiA9ICgoeCAqIGsgKSA+PiAxNikgKyB4Ci0gIGNvbnN0IF9fbTEyOGkgazEgPSBfbW1fc2V0MV9lcGkxNigyMDA5MSk7Ci0gIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigtMzAwNjgpOwotICBfX20xMjhpIFQwLCBUMSwgVDIsIFQzOwotCi0gIC8vIExvYWQgYW5kIGNvbmNhdGVuYXRlIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcwotICAvLyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIHRyYW5zZm9ybSwgdGhlIHNlY29uZCBoYWxmIG9mIHRoZQotICAvLyB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlciB1c2Ugbm9yIHN0b3JlLgotICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKLSAgewotICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzBdKTsKLSAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls0XSk7Ci0gICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bOF0pOwotICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzEyXSk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4Ci0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAotICAgIGlmIChkb190d28pIHsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzE2XSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyMF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjRdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzI4XSk7Ci0gICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKLSAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOwotICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7Ci0gICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKLSAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICAgIH0KLSAgfQotCi0gIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgotICB7Ci0gICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCi0gICAgLy8gbXVsdGlwbGljYXRpb25zLgotICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOwotICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOwotICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7Ci0gICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOwotCi0gICAgLy8gU2Vjb25kIHBhc3MuCi0gICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAyLCB0bXAzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAyLCB0bXAzKTsKLSAgICAvLyBhMDAgYTEwIGEwMSBhMTEgICBhMDIgYTEyIGEwMyBhMTMKLSAgICAvLyBhMjAgYTMwIGEyMSBhMzEgICBhMjIgYTMyIGEyMyBhMzMKLSAgICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKLSAgICAvLyBiMjAgYjMwIGIyMSBiMzEgICBiMjIgYjMyIGIyMyBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8yID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMyA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQotICAgIC8vIGIwMCBiMTAgYjIwIGIzMCBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgYTAzIGExMyBhMjMgYTMzCi0gICAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMwotICAgIFQwID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMSA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIFQzID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKLSAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKLSAgfQotCi0gIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpMTYoNCk7Ci0gICAgY29uc3QgX19tMTI4aSBkYyA9IF9tbV9hZGRfZXBpMTYoVDAsIGZvdXIpOwotICAgIGNvbnN0IF9fbTEyOGkgYSA9ICBfbW1fYWRkX2VwaTE2KGRjLCBUMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gIF9tbV9zdWJfZXBpMTYoZGMsIFQyKTsKLSAgICAvLyBjID0gTVVMKFQxLCBLMikgLSBNVUwoVDMsIEsxKSA9IE1VTChUMSwgazIpIC0gTVVMKFQzLCBrMSkgKyBUMSAtIFQzCi0gICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihUMSwgVDMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoVDEsIEsxKSArIE1VTChUMywgSzIpID0gTVVMKFQxLCBrMSkgKyBNVUwoVDMsIGsyKSArIFQxICsgVDMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDAgPSBfbW1fc3JhaV9lcGkxNih0bXAwLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQxID0gX21tX3NyYWlfZXBpMTYodG1wMSwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMiA9IF9tbV9zcmFpX2VwaTE2KHRtcDIsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDMgPSBfbW1fc3JhaV9lcGkxNih0bXAzLCAzKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoc2hpZnRlZDAsIHNoaWZ0ZWQxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMiwgc2hpZnRlZDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gQWRkIGludmVyc2UgdHJhbnNmb3JtIHRvICdkc3QnIGFuZCBzdG9yZS4KLSAgewotICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gICAgLy8gTG9hZCB0aGUgcmVmZXJlbmNlKHMpLgotICAgIF9fbTEyOGkgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICBpZiAoZG9fdHdvKSB7Ci0gICAgICAvLyBMb2FkIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIGRzdDAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10pOwotICAgICAgZHN0MSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSk7Ci0gICAgICBkc3QyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdKTsKLSAgICAgIGRzdDMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgZHN0MCA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmZHN0WzAgKiBCUFNdKTsKLSAgICAgIGRzdDEgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJmRzdFsxICogQlBTXSk7Ci0gICAgICBkc3QyID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZkc3RbMiAqIEJQU10pOwotICAgICAgZHN0MyA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmZHN0WzMgKiBCUFNdKTsKLSAgICB9Ci0gICAgLy8gQ29udmVydCB0byAxNmIuCi0gICAgZHN0MCA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDAsIHplcm8pOwotICAgIGRzdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QxLCB6ZXJvKTsKLSAgICBkc3QyID0gX21tX3VucGFja2xvX2VwaTgoZHN0MiwgemVybyk7Ci0gICAgZHN0MyA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDMsIHplcm8pOwotICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0ocykuCi0gICAgZHN0MCA9IF9tbV9hZGRfZXBpMTYoZHN0MCwgVDApOwotICAgIGRzdDEgPSBfbW1fYWRkX2VwaTE2KGRzdDEsIFQxKTsKLSAgICBkc3QyID0gX21tX2FkZF9lcGkxNihkc3QyLCBUMik7Ci0gICAgZHN0MyA9IF9tbV9hZGRfZXBpMTYoZHN0MywgVDMpOwotICAgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgotICAgIGRzdDAgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDIsIGRzdDIpOwotICAgIGRzdDMgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDMsIGRzdDMpOwotICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIFN0b3JlIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10sIGRzdDApOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSwgZHN0MSk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdLCBkc3QyKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10sIGRzdDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgICooKGludDMyX3QgKikmZHN0WzAgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKGRzdDApOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMSAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIoZHN0MSk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsyICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihkc3QyKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzMgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKGRzdDMpOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTG9vcCBGaWx0ZXIgKFBhcmFncmFwaCAxNSkKLQotLy8gQ29tcHV0ZSBhYnMocCAtIHEpID0gc3VicyhwIC0gcSkgT1Igc3VicyhxIC0gcCkKLSNkZWZpbmUgTU1fQUJTKHAsIHEpICBfbW1fb3Jfc2kxMjgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX21tX3N1YnNfZXB1OCgocSksIChwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9tbV9zdWJzX2VwdTgoKHApLCAocSkpKQotCi0vLyBTaGlmdCBlYWNoIGJ5dGUgb2YgImEiIGJ5IE4gYml0cyB3aGlsZSBwcmVzZXJ2aW5nIGJ5IHRoZSBzaWduIGJpdC4KLS8vCi0vLyBJdCBmaXJzdCBzaGlmdHMgdGhlIGxvd2VyIGJ5dGVzIG9mIHRoZSB3b3JkcyBhbmQgdGhlbiB0aGUgdXBwZXIgYnl0ZXMgYW5kCi0vLyB0aGVuIG1lcmdlcyB0aGUgcmVzdWx0cyB0b2dldGhlci4KLSNkZWZpbmUgU0lHTkVEX1NISUZUX04oYSwgTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgdCA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ID0gX21tX3NsbGlfZXBpMTYodCwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdCA9IF9tbV9zcmFpX2VwaTE2KHQsIE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHQgPSBfbW1fc3JsaV9lcGkxNih0LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV9zcmFpX2VwaTE2KGEsIE4gKyA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGEgPSBfbW1fc2xsaV9lcGkxNihhLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV9vcl9zaTEyOCh0LCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRkxJUF9TSUdOX0JJVDIoYSwgYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGEgPSBfbW1feG9yX3NpMTI4KGEsIHNpZ25fYml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBiID0gX21tX3hvcl9zaTEyOChiLCBzaWduX2JpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBGTElQX1NJR05fQklUNChhLCBiLCBjLCBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIoYSwgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZMSVBfU0lHTl9CSVQyKGMsIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEdFVF9OT1RIRVYocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gsIG5vdF9oZXYpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzEgPSBNTV9BQlMocDEsIHAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF8yID0gTU1fQUJTKHExLCBxMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBoID0gX21tX3NldDFfZXBpOChoZXZfdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF8zID0gX21tX3N1YnNfZXB1OCh0XzEsIGgpOyAgLyogYWJzKHAxIC0gcDApIC0gaGV2X3RyZXNoICovICAgXAotICBjb25zdCBfX20xMjhpIHRfNCA9IF9tbV9zdWJzX2VwdTgodF8yLCBoKTsgIC8qIGFicyhxMSAtIHEwKSAtIGhldl90cmVzaCAqLyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5vdF9oZXYgPSBfbW1fb3Jfc2kxMjgodF8zLCB0XzQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBub3RfaGV2ID0gX21tX2NtcGVxX2VwaTgobm90X2hldiwgemVybyk7IC8qIG5vdF9oZXYgPD0gdDEgJiYgbm90X2hldiA8PSB0MiAqL1wKLX0KLQotI2RlZmluZSBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgbykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBxcDAgPSBfbW1fc3Vic19lcGk4KHEwLCBwMCk7ICAvKiBxMCAtIHAwICovICAgICAgICAgICAgICAgICAgICBcCi0gIG8gPSBfbW1fc3Vic19lcGk4KHAxLCBxMSk7ICAgICAgICAgICAgLyogcDEgLSBxMSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvID0gX21tX2FkZHNfZXBpOChvLCBxcDApOyAgICAgICAgICAgIC8qIHAxIC0gcTEgKyAxICogKHEwIC0gcDApICovICAgICAgICAgIFwKLSAgbyA9IF9tbV9hZGRzX2VwaTgobywgcXAwKTsgICAgICAgICAgICAvKiBwMSAtIHExICsgMiAqIChxMCAtIHAwKSAqLyAgICAgICAgICBcCi0gIG8gPSBfbW1fYWRkc19lcGk4KG8sIHFwMCk7ICAgICAgICAgICAgLyogcDEgLSBxMSArIDMgKiAocTAgLSBwMCkgKi8gICAgICAgICAgXAotfQotCi0jZGVmaW5lIERPX1NJTVBMRV9GSUxURVIocDAsIHEwLCBmbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHRocmVlID0gX21tX3NldDFfZXBpOCgzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpOCg0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgdjMgPSBfbW1fYWRkc19lcGk4KGZsLCB0aHJlZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfX20xMjhpIHY0ID0gX21tX2FkZHNfZXBpOChmbCwgZm91cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIERvICs0IHNpZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTSUdORURfU0hJRlRfTih2NCwgMyk7ICAgICAgICAgICAgICAgIC8qIHY0ID4+IDMgICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcTAgPSBfbW1fc3Vic19lcGk4KHEwLCB2NCk7ICAgICAgICAgICAvKiBxMCAtPSB2NCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBOb3cgZG8gKzMgc2lkZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0lHTkVEX1NISUZUX04odjMsIDMpOyAgICAgICAgICAgICAgICAvKiB2MyA+PiAzICAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHAwID0gX21tX2FkZHNfZXBpOChwMCwgdjMpOyAgICAgICAgICAgLyogcDAgKz0gdjMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBVcGRhdGVzIHZhbHVlcyBvZiAyIHBpeGVscyBhdCBNQiBlZGdlIGR1cmluZyBjb21wbGV4IGZpbHRlcmluZy4KLS8vIFVwZGF0ZSBvcGVyYXRpb25zOgotLy8gcSA9IHEgLSBkZWx0YSBhbmQgcCA9IHAgKyBkZWx0YTsgd2hlcmUgZGVsdGEgPSBbKGFfaGkgPj4gNyksIChhX2xvID4+IDcpXQotI2RlZmluZSBVUERBVEVfMlBJWEVMUyhwaSwgcWksIGFfbG8sIGFfaGkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhX2xvNyA9IF9tbV9zcmFpX2VwaTE2KGFfbG8sIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYV9oaTcgPSBfbW1fc3JhaV9lcGkxNihhX2hpLCA3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGRlbHRhID0gX21tX3BhY2tzX2VwaTE2KGFfbG83LCBhX2hpNyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcGkgPSBfbW1fYWRkc19lcGk4KHBpLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHFpID0gX21tX3N1YnNfZXBpOChxaSwgZGVsdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgdm9pZCBOZWVkc0ZpbHRlcihjb25zdCBfX20xMjhpKiBwMSwgY29uc3QgX19tMTI4aSogcDAsIGNvbnN0IF9fbTEyOGkqIHEwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogcTEsIGludCB0aHJlc2gsIF9fbTEyOGkgKm1hc2spIHsKLSAgX19tMTI4aSB0MSA9IE1NX0FCUygqcDEsICpxMSk7ICAgICAgICAvLyBhYnMocDEgLSBxMSkKLSAgKm1hc2sgPSBfbW1fc2V0MV9lcGk4KDB4RkUpOwotICB0MSA9IF9tbV9hbmRfc2kxMjgodDEsICptYXNrKTsgICAgICAgIC8vIHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgdDEgPSBfbW1fc3JsaV9lcGkxNih0MSwgMSk7ICAgICAgICAgICAvLyBhYnMocDEgLSBxMSkgLyAyCi0KLSAgKm1hc2sgPSBNTV9BQlMoKnAwLCAqcTApOyAgICAgICAgICAgICAvLyBhYnMocDAgLSBxMCkKLSAgKm1hc2sgPSBfbW1fYWRkc19lcHU4KCptYXNrLCAqbWFzayk7ICAvLyBhYnMocDAgLSBxMCkgKiAyCi0gICptYXNrID0gX21tX2FkZHNfZXB1OCgqbWFzaywgdDEpOyAgICAgLy8gYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIKLQotICB0MSA9IF9tbV9zZXQxX2VwaTgodGhyZXNoKTsKLSAgKm1hc2sgPSBfbW1fc3Vic19lcHU4KCptYXNrLCB0MSk7ICAgICAvLyBtYXNrIDw9IHRocmVzaAotICAqbWFzayA9IF9tbV9jbXBlcV9lcGk4KCptYXNrLCBfbW1fc2V0emVyb19zaTEyOCgpKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucwotCi0vLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXIyKGNvbnN0IF9fbTEyOGkqIHAxLCBfX20xMjhpKiBwMCwgX19tMTI4aSogcTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogcTEsIGludCB0aHJlc2gpIHsKLSAgX19tMTI4aSBhLCBtYXNrOwotICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKLSAgY29uc3QgX19tMTI4aSBwMXMgPSBfbW1feG9yX3NpMTI4KCpwMSwgc2lnbl9iaXQpOwotICBjb25zdCBfX20xMjhpIHExcyA9IF9tbV94b3Jfc2kxMjgoKnExLCBzaWduX2JpdCk7Ci0KLSAgTmVlZHNGaWx0ZXIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgJm1hc2spOwotCi0gIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7Ci0KLSAgR0VUX0JBU0VfREVMVEEocDFzLCAqcDAsICpxMCwgcTFzLCBhKTsKLSAgYSA9IF9tbV9hbmRfc2kxMjgoYSwgbWFzayk7ICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotICBET19TSU1QTEVfRklMVEVSKCpwMCwgKnEwLCBhKTsKLQotICAvLyB1bm9mZnNldAotICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7Ci19Ci0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDQgcGl4ZWxzIChwMSwgcDAsIHEwIGFuZCBxMSkKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNChfX20xMjhpKiBwMSwgX19tMTI4aSAqcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIG1hc2ssIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbm90X2hldjsKLSAgX19tMTI4aSB0MSwgdDIsIHQzOwotICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKLQotICAvLyBjb21wdXRlIGhldiBtYXNrCi0gIEdFVF9OT1RIRVYoKnAxLCAqcDAsICpxMCwgKnExLCBoZXZfdGhyZXNoLCBub3RfaGV2KTsKLQotICAvLyBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKLQotICB0MSA9IF9tbV9zdWJzX2VwaTgoKnAxLCAqcTEpOyAgICAgICAgLy8gcDEgLSBxMQotICB0MSA9IF9tbV9hbmRub3Rfc2kxMjgobm90X2hldiwgdDEpOyAgLy8gaGV2KHAxIC0gcTEpCi0gIHQyID0gX21tX3N1YnNfZXBpOCgqcTAsICpwMCk7ICAgICAgICAvLyBxMCAtIHAwCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAxICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAyICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAzICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FuZF9zaTEyOCh0MSwgKm1hc2spOyAgICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotCi0gIC8vIERvICs0IHNpZGUKLSAgdDIgPSBfbW1fc2V0MV9lcGk4KDQpOwotICB0MiA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgIC8vIDMgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkgKyA0Ci0gIFNJR05FRF9TSElGVF9OKHQyLCAzKTsgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiAzCi0gIHQzID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0MgotICAqcTAgPSBfbW1fc3Vic19lcGk4KCpxMCwgdDIpOyAgICAgIC8vIHEwIC09IHQyCi0KLSAgLy8gTm93IGRvICszIHNpZGUKLSAgdDIgPSBfbW1fc2V0MV9lcGk4KDMpOwotICB0MiA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgIC8vICszIGluc3RlYWQgb2YgKzQKLSAgU0lHTkVEX1NISUZUX04odDIsIDMpOyAgICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDMpID4+IDMKLSAgKnAwID0gX21tX2FkZHNfZXBpOCgqcDAsIHQyKTsgICAgICAvLyBwMCArPSB0MgotCi0gIHQyID0gX21tX3NldDFfZXBpOCgxKTsKLSAgdDMgPSBfbW1fYWRkc19lcGk4KHQzLCB0Mik7Ci0gIFNJR05FRF9TSElGVF9OKHQzLCAxKTsgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiA0Ci0KLSAgdDMgPSBfbW1fYW5kX3NpMTI4KG5vdF9oZXYsIHQzKTsgICAvLyBpZiAhaGV2Ci0gICpxMSA9IF9tbV9zdWJzX2VwaTgoKnExLCB0Myk7ICAgICAgLy8gcTEgLT0gdDMKLSAgKnAxID0gX21tX2FkZHNfZXBpOCgqcDEsIHQzKTsgICAgICAvLyBwMSArPSB0MwotCi0gIC8vIHVub2Zmc2V0Ci0gIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7Ci19Ci0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDYgcGl4ZWxzIChwMiwgcDEsIHAwLCBxMCwgcTEgYW5kIHEyKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI2KF9fbTEyOGkgKnAyLCBfX20xMjhpKiBwMSwgX19tMTI4aSAqcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExLCBfX20xMjhpICpxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBtYXNrLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIGEsIG5vdF9oZXY7Ci0gIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOwotCi0gIC8vIGNvbXB1dGUgaGV2IG1hc2sKLSAgR0VUX05PVEhFVigqcDEsICpwMCwgKnEwLCAqcTEsIGhldl90aHJlc2gsIG5vdF9oZXYpOwotCi0gIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOwotICBGTElQX1NJR05fQklUMigqcDIsICpxMik7Ci0KLSAgR0VUX0JBU0VfREVMVEEoKnAxLCAqcDAsICpxMCwgKnExLCBhKTsKLQotICB7IC8vIGRvIHNpbXBsZSBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggaGV2Ci0gICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCAqbWFzayk7Ci0gICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKLSAgICBET19TSU1QTEVfRklMVEVSKCpwMCwgKnEwLCBmKTsKLSAgfQotICB7IC8vIGRvIHN0cm9uZyBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggbm90IGhldgotICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gICAgY29uc3QgX19tMTI4aSBuaW5lID0gX21tX3NldDFfZXBpMTYoMHgwOTAwKTsKLSAgICBjb25zdCBfX20xMjhpIHNpeHR5X3RocmVlID0gX21tX3NldDFfZXBpMTYoNjMpOwotCi0gICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZF9zaTEyOChub3RfaGV2LCAqbWFzayk7Ci0gICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKLSAgICBjb25zdCBfX20xMjhpIGZfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBmKTsKLSAgICBjb25zdCBfX20xMjhpIGZfaGkgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCBmKTsKLQotICAgIGNvbnN0IF9fbTEyOGkgZjlfbG8gPSBfbW1fbXVsaGlfZXBpMTYoZl9sbywgbmluZSk7ICAgLy8gRmlsdGVyIChsbykgKiA5Ci0gICAgY29uc3QgX19tMTI4aSBmOV9oaSA9IF9tbV9tdWxoaV9lcGkxNihmX2hpLCBuaW5lKTsgICAvLyBGaWx0ZXIgKGhpKSAqIDkKLSAgICBjb25zdCBfX20xMjhpIGYxOF9sbyA9IF9tbV9hZGRfZXBpMTYoZjlfbG8sIGY5X2xvKTsgIC8vIEZpbHRlciAobG8pICogMTgKLSAgICBjb25zdCBfX20xMjhpIGYxOF9oaSA9IF9tbV9hZGRfZXBpMTYoZjlfaGksIGY5X2hpKTsgIC8vIEZpbHRlciAoaGkpICogMTgKLQotICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fYWRkX2VwaTE2KGY5X2xvLCBzaXh0eV90aHJlZSk7ICAvLyBGaWx0ZXIgKiA5ICsgNjMKLSAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX2FkZF9lcGkxNihmOV9oaSwgc2l4dHlfdGhyZWUpOyAgLy8gRmlsdGVyICogOSArIDYzCi0KLSAgICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX2FkZF9lcGkxNihmMThfbG8sIHNpeHR5X3RocmVlKTsgIC8vIEYuLi4gKiAxOCArIDYzCi0gICAgY29uc3QgX19tMTI4aSBhMV9oaSA9IF9tbV9hZGRfZXBpMTYoZjE4X2hpLCBzaXh0eV90aHJlZSk7ICAvLyBGLi4uICogMTggKyA2MwotCi0gICAgY29uc3QgX19tMTI4aSBhMF9sbyA9IF9tbV9hZGRfZXBpMTYoZjE4X2xvLCBhMl9sbyk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCi0gICAgY29uc3QgX19tMTI4aSBhMF9oaSA9IF9tbV9hZGRfZXBpMTYoZjE4X2hpLCBhMl9oaSk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCi0KLSAgICBVUERBVEVfMlBJWEVMUygqcDIsICpxMiwgYTJfbG8sIGEyX2hpKTsKLSAgICBVUERBVEVfMlBJWEVMUygqcDEsICpxMSwgYTFfbG8sIGExX2hpKTsKLSAgICBVUERBVEVfMlBJWEVMUygqcDAsICpxMCwgYTBfbG8sIGEwX2hpKTsKLSAgfQotCi0gIC8vIHVub2Zmc2V0Ci0gIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7Ci0gIEZMSVBfU0lHTl9CSVQyKCpwMiwgKnEyKTsKLX0KLQotLy8gcmVhZHMgOCByb3dzIGFjcm9zcyBhIHZlcnRpY2FsIGVkZ2UuCi0vLwotLy8gVE9ETyhzb21uYXRoKTogSW52ZXN0aWdhdGUgX21tX3NodWZmbGUqIGFsc28gc2VlIGlmIGl0IGNhbiBiZSBicm9rZW4gaW50bwotLy8gdHdvIExvYWQ0eDQoKSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4NChjb25zdCB1aW50OF90KiBiLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBwLCBfX20xMjhpKiBxKSB7Ci0gIF9fbTEyOGkgdDEsIHQyOwotCi0gIC8vIExvYWQgMHRoLCAxc3QsIDR0aCBhbmQgNXRoIHJvd3MKLSAgX19tMTI4aSByMCA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzAgKiBzdHJpZGVdKSk7ICAvLyAwMyAwMiAwMSAwMAotICBfX20xMjhpIHIxID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbMSAqIHN0cmlkZV0pKTsgIC8vIDEzIDEyIDExIDEwCi0gIF9fbTEyOGkgcjQgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYls0ICogc3RyaWRlXSkpOyAgLy8gNDMgNDIgNDEgNDAKLSAgX19tMTI4aSByNSA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzUgKiBzdHJpZGVdKSk7ICAvLyA1MyA1MiA1MSA1MAotCi0gIHIwID0gX21tX3VucGFja2xvX2VwaTMyKHIwLCByNCk7ICAgICAgICAgICAgICAgLy8gNDMgNDIgNDEgNDAgMDMgMDIgMDEgMDAKLSAgcjEgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjEsIHI1KTsgICAgICAgICAgICAgICAvLyA1MyA1MiA1MSA1MCAxMyAxMiAxMSAxMAotCi0gIC8vIHQxID0gNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLSAgdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChyMCwgcjEpOwotCi0gIC8vIExvYWQgMm5kLCAzcmQsIDZ0aCBhbmQgN3RoIHJvd3MKLSAgcjAgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYlsyICogc3RyaWRlXSkpOyAgICAgICAgICAvLyAyMyAyMiAyMSAyMgotICByMSA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzMgKiBzdHJpZGVdKSk7ICAgICAgICAgIC8vIDMzIDMyIDMxIDMwCi0gIHI0ID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbNiAqIHN0cmlkZV0pKTsgICAgICAgICAgLy8gNjMgNjIgNjEgNjAKLSAgcjUgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYls3ICogc3RyaWRlXSkpOyAgICAgICAgICAvLyA3MyA3MiA3MSA3MAotCi0gIHIwID0gX21tX3VucGFja2xvX2VwaTMyKHIwLCByNCk7ICAgICAgICAgICAgICAgLy8gNjMgNjIgNjEgNjAgMjMgMjIgMjEgMjAKLSAgcjEgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjEsIHI1KTsgICAgICAgICAgICAgICAvLyA3MyA3MiA3MSA3MCAzMyAzMiAzMSAzMAotCi0gIC8vIHQyID0gNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKLSAgdDIgPSBfbW1fdW5wYWNrbG9fZXBpOChyMCwgcjEpOwotCi0gIC8vIHQxID0gMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLSAgLy8gdDIgPSA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MiA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAotICByMCA9IHQxOwotICB0MSA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgdDIpOwotICB0MiA9IF9tbV91bnBhY2toaV9lcGkxNihyMCwgdDIpOwotCi0gIC8vICpwID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgLy8gKnEgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotICAqcCA9IF9tbV91bnBhY2tsb19lcGkzMih0MSwgdDIpOwotICAqcSA9IF9tbV91bnBhY2toaV9lcGkzMih0MSwgdDIpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4NChjb25zdCB1aW50OF90KiByMCwgY29uc3QgdWludDhfdCogcjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcDEsIF9fbTEyOGkqIHAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExKSB7Ci0gIF9fbTEyOGkgdDEsIHQyOwotICAvLyBBc3N1bWUgdGhlIHBpeGVscyBhcm91bmQgdGhlIGVkZ2UgKHwpIGFyZSBudW1iZXJlZCBhcyBmb2xsb3dzCi0gIC8vICAgICAgICAgICAgICAgIDAwIDAxIHwgMDIgMDMKLSAgLy8gICAgICAgICAgICAgICAgMTAgMTEgfCAxMiAxMwotICAvLyAgICAgICAgICAgICAgICAgLi4uICB8ICAuLi4KLSAgLy8gICAgICAgICAgICAgICAgZTAgZTEgfCBlMiBlMwotICAvLyAgICAgICAgICAgICAgICBmMCBmMSB8IGYyIGYzCi0gIC8vCi0gIC8vIHIwIGlzIHBvaW50aW5nIHRvIHRoZSAwdGggcm93ICgwMCkKLSAgLy8gcjggaXMgcG9pbnRpbmcgdG8gdGhlIDh0aCByb3cgKDgwKQotCi0gIC8vIExvYWQKLSAgLy8gcDEgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAvLyBxMCA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKLSAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MgotICBMb2FkOHg0KHIwLCBzdHJpZGUsIHAxLCBxMCk7Ci0gIExvYWQ4eDQocjgsIHN0cmlkZSwgcDAsIHExKTsKLQotICB0MSA9ICpwMTsKLSAgdDIgPSAqcTA7Ci0gIC8vIHAxID0gZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgLy8gcDAgPSBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQotICAvLyBxMCA9IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gIC8vIHExID0gZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKLSAgKnAxID0gX21tX3VucGFja2xvX2VwaTY0KHQxLCAqcDApOwotICAqcDAgPSBfbW1fdW5wYWNraGlfZXBpNjQodDEsICpwMCk7Ci0gICpxMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0MiwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTY0KHQyLCAqcTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4NChfX20xMjhpKiB4LCB1aW50OF90KiBkc3QsIGludCBzdHJpZGUpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGRzdCArPSBzdHJpZGUpIHsKLSAgICAqKChpbnQzMl90Kilkc3QpID0gX21tX2N2dHNpMTI4X3NpMzIoKngpOwotICAgICp4ID0gX21tX3NybGlfc2kxMjgoKngsIDQpOwotICB9Ci19Ci0KLS8vIFRyYW5zcG9zZSBiYWNrIGFuZCBzdG9yZQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUxNng0KHVpbnQ4X3QqIHIwLCB1aW50OF90KiByOCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBwMSwgX19tMTI4aSogcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExKSB7Ci0gIF9fbTEyOGkgdDE7Ci0KLSAgLy8gcDAgPSA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MCAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAotICAvLyBwMSA9IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCi0gIHQxID0gKnAwOwotICAqcDAgPSBfbW1fdW5wYWNrbG9fZXBpOCgqcDEsIHQxKTsKLSAgKnAxID0gX21tX3VucGFja2hpX2VwaTgoKnAxLCB0MSk7Ci0KLSAgLy8gcTAgPSA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgotICAvLyBxMSA9IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCi0gIHQxID0gKnEwOwotICAqcTAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0MSwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTgodDEsICpxMSk7Ci0KLSAgLy8gcDAgPSAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMCAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotICAvLyBxMCA9IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCi0gIHQxID0gKnAwOwotICAqcDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYodDEsICpxMCk7Ci0gICpxMCA9IF9tbV91bnBhY2toaV9lcGkxNih0MSwgKnEwKTsKLQotICAvLyBwMSA9IGIzIGIyIGIxIGIwIGEzIGEyIGExIGEwIDkzIDkyIDkxIDkwIDgzIDgyIDgxIDgwCi0gIC8vIHExID0gZjMgZjIgZjEgZjAgZTMgZTIgZTEgZTAgZDMgZDIgZDEgZDAgYzMgYzIgYzEgYzAKLSAgdDEgPSAqcDE7Ci0gICpwMSA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTE2KHQxLCAqcTEpOwotCi0gIFN0b3JlNHg0KHAwLCByMCwgc3RyaWRlKTsKLSAgcjAgKz0gNCAqIHN0cmlkZTsKLSAgU3RvcmU0eDQocTAsIHIwLCBzdHJpZGUpOwotCi0gIFN0b3JlNHg0KHAxLCByOCwgc3RyaWRlKTsKLSAgcjggKz0gNCAqIHN0cmlkZTsKLSAgU3RvcmU0eDQocTEsIHI4LCBzdHJpZGUpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2U1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIC8vIExvYWQKLSAgX19tMTI4aSBwMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLTIgKiBzdHJpZGVdKTsKLSAgX19tMTI4aSBwMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0pOwotICBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFswXSk7Ci0gIF9fbTEyOGkgcTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwW3N0cmlkZV0pOwotCi0gIERvRmlsdGVyMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0sIHAwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopcCwgcTApOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgX19tMTI4aSBwMSwgcDAsIHEwLCBxMTsKLQotICBwIC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKLQotICBMb2FkMTZ4NChwLCBwICsgOCAqIHN0cmlkZSwgIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKLSAgRG9GaWx0ZXIyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKLSAgU3RvcmUxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmlTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQgKiBzdHJpZGU7Ci0gICAgU2ltcGxlVkZpbHRlcjE2U1NFMihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aVNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNDsKLSAgICBTaW1wbGVIRmlsdGVyMTZTU0UyKHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCi0KLSNkZWZpbmUgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBNTV9BQlMocDMsIHAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDEsIHAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTUFYX0RJRkYyKHAzLCBwMiwgcDEsIHAwLCBtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAzLCBwMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDEsIHAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIGUxLCBlMiwgZTMsIGU0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGUxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzAgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlMiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsxICogc3RyaWRlXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZTMgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMiAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGU0ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzMgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIExPQURVVl9IX0VER0UocCwgdSwgdiwgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmKHUpWyhzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcCA9IF9tbV91bnBhY2tsb19lcGk2NChwLCBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodilbKHN0cmlkZSldKSk7ICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExPQURVVl9IX0VER0UoZTEsIHUsIHYsIDAgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMT0FEVVZfSF9FREdFKGUyLCB1LCB2LCAxICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTE9BRFVWX0hfRURHRShlMywgdSwgdiwgMiAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExPQURVVl9IX0VER0UoZTQsIHUsIHYsIDMgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFNUT1JFVVYocCwgdSwgdiwgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmdVsoc3RyaWRlKV0sIHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcCA9IF9tbV9zcmxpX3NpMTI4KHAsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZ2WyhzdHJpZGUpXSwgcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKSB7ICAgICAgICAgICAgICAgXAotICBfX20xMjhpIGZsX3llczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBpdCA9IF9tbV9zZXQxX2VwaTgoaXRocmVzaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1hc2sgPSBfbW1fc3Vic19lcHU4KG1hc2ssIGl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtYXNrID0gX21tX2NtcGVxX2VwaTgobWFzaywgX21tX3NldHplcm9fc2kxMjgoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTmVlZHNGaWx0ZXIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsICZmbF95ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1hc2sgPSBfbW1fYW5kX3NpMTI4KG1hc2ssIGZsX3llcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIHQxOwotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKLQotICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gIExPQURfSF9FREdFUzQocCAtIDQgKiBzdHJpZGUsIHN0cmlkZSwgdDEsIHAyLCBwMSwgcDApOwotICBNQVhfRElGRjEodDEsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKLSAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTMgKiBzdHJpZGVdLCBwMik7Ci0gIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSwgcDEpOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMCAqIHN0cmlkZV0sIHEwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMSAqIHN0cmlkZV0sIHExKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMiAqIHN0cmlkZV0sIHEyKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2U1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgX19tMTI4aSBtYXNrOwotICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKLQotICB1aW50OF90KiBjb25zdCBiID0gcCAtIDQ7Ci0gIExvYWQxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIExvYWQxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7ICAvLyBxMCwgcTEsIHEyLCBxMwotICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI2KCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICBTdG9yZTE2eDQoYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKLSAgU3RvcmUxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7Ci19Ci0KLS8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTZpU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLQotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAotICAgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCB0MiwgdDEsIHAxLCBwMCk7Ci0gICAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICAgIHAgKz0gNCAqIHN0cmlkZTsKLQotICAgIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcTAsIHExLCB0MSwgdDIpOwotICAgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7Ci0KLSAgICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gICAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gICAgLy8gU3RvcmUKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0sIHAxKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFswICogc3RyaWRlXSwgcTApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWzEgKiBzdHJpZGVdLCBxMSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2aVNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBpbnQgazsKLSAgdWludDhfdCogYjsKLSAgX19tMTI4aSBtYXNrOwotICBfX20xMjhpIHQxLCB0MiwgcDEsIHAwLCBxMCwgcTE7Ci0KLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIGIgPSBwOwotICAgIExvYWQxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZ0MiwgJnQxLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICAgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7Ci0KLSAgICBiICs9IDQ7ICAvLyBiZWdpbm5pbmcgb2YgcTAKLSAgICBMb2FkMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKLSAgICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOwotCi0gICAgQ09NUExFWF9GTF9NQVNLKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIGl0aHJlc2gsIG1hc2spOwotICAgIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAgIGIgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQotICAgIFN0b3JlMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOwotCi0gICAgcCArPSA0OwotICB9Ci19Ci0KLS8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKLXN0YXRpYyB2b2lkIFZGaWx0ZXI4U1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7Ci0KLSAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAotICBMT0FEVVZfSF9FREdFUzQodSAtIDQgKiBzdHJpZGUsIHYgLSA0ICogc3RyaWRlLCBzdHJpZGUsIHQxLCBwMiwgcDEsIHAwKTsKLSAgTUFYX0RJRkYxKHQxLCBwMiwgcDEsIHAwLCBtYXNrKTsKLQotICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKLSAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgU1RPUkVVVihwMiwgdSwgdiwgLTMgKiBzdHJpZGUpOwotICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOwotICBTVE9SRVVWKHEyLCB1LCB2LCAyICogc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjhTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7Ci0KLSAgdWludDhfdCogY29uc3QgdHUgPSB1IC0gNDsKLSAgdWludDhfdCogY29uc3QgdHYgPSB2IC0gNDsKLSAgTG9hZDE2eDQodHUsIHR2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIExvYWQxNng0KHUsIHYsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsgICAgLy8gcTAsIHExLCBxMiwgcTMKLSAgTUFYX0RJRkYyKHEzLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgU3RvcmUxNng0KHR1LCB0diwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOwotICBTdG9yZTE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOwotfQotCi1zdGF0aWMgdm9pZCBWRmlsdGVyOGlTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLQotICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHQyLCB0MSwgcDEsIHAwKTsKLSAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICB1ICs9IDQgKiBzdHJpZGU7Ci0gIHYgKz0gNCAqIHN0cmlkZTsKLQotICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgdDEsIHQyKTsKLSAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAvLyBTdG9yZQotICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOGlTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLSAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmdDIsICZ0MSwgJnAxLCAmcDApOyAgIC8vIHAzLCBwMiwgcDEsIHAwCi0gIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7Ci0KLSAgdSArPSA0OyAgLy8gYmVnaW5uaW5nIG9mIHEwCi0gIHYgKz0gNDsKLSAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKLSAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICB1IC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKLSAgdiAtPSAyOwotICBTdG9yZTE2eDQodSwgdiwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOwotfQotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1leHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKLQotdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1TU0UyOwotCi0gIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNlNTRTI7Ci0gIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNlNTRTI7Ci0gIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjhTU0UyOwotICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4U1NFMjsKLSAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmlTU0UyOwotICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aVNTRTI7Ci0gIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aVNTRTI7Ci0gIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aVNTRTI7Ci0KLSAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2U1NFMjsKLSAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2U1NFMjsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlTU0UyOwotICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aVNTRTI7Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RzcC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JlZTU0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kc3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gICBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX0RTUF9EU1BfSF8KLSNkZWZpbmUgV0VCUF9EU1BfRFNQX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ1BVIGRldGVjdGlvbgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQotI2RlZmluZSBXRUJQX01TQ19TU0UyICAvLyBWaXN1YWwgQysrIFNTRTIgdGFyZ2V0cwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fU1NFMl9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCi0jZGVmaW5lIFdFQlBfVVNFX1NTRTIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCi0jZGVmaW5lIFdFQlBfQU5EUk9JRF9ORU9OICAvLyBBbmRyb2lkIHRhcmdldHMgdGhhdCBtaWdodCBzdXBwb3J0IE5FT04KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQoX19BUk1fTkVPTl9fKSB8fCBkZWZpbmVkKFdFQlBfQU5EUk9JRF9ORU9OKSkgJiYgIWRlZmluZWQoX19hYXJjaDY0X18pCi0jZGVmaW5lIFdFQlBfVVNFX05FT04KLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotICBrU1NFMiwKLSAga1NTRTMsCi0gIGtORU9OCi19IENQVUZlYXR1cmU7Ci0vLyByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBzdXBwb3J0cyB0aGUgZmVhdHVyZS4KLXR5cGVkZWYgaW50ICgqVlA4Q1BVSW5mbykoQ1BVRmVhdHVyZSBmZWF0dXJlKTsKLWV4dGVybiBWUDhDUFVJbmZvIFZQOEdldENQVUluZm87Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbmNvZGluZwotCi0vLyBUcmFuc2Zvcm1zCi0vLyBWUDhJZGN0OiBEb2VzIG9uZSBvZiB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLiBJZiBkb190d28gaXMgc2V0LCB0aGUgdHJhbnNmb3JtcwotLy8gICAgICAgICAgd2lsbCBiZSBkb25lIGZvciAocmVmLCBpbiwgZHN0KSBhbmQgKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpLgotdHlwZWRlZiB2b2lkICgqVlA4SWRjdCkoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3byk7Ci10eXBlZGVmIHZvaWQgKCpWUDhGZGN0KShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KTsKLXR5cGVkZWYgdm9pZCAoKlZQOFdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7Ci1leHRlcm4gVlA4SWRjdCBWUDhJVHJhbnNmb3JtOwotZXh0ZXJuIFZQOEZkY3QgVlA4RlRyYW5zZm9ybTsKLWV4dGVybiBWUDhXSFQgVlA4SVRyYW5zZm9ybVdIVDsKLWV4dGVybiBWUDhXSFQgVlA4RlRyYW5zZm9ybVdIVDsKLS8vIFByZWRpY3Rpb25zCi0vLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jay4gKnRvcCBhbmQgKmxlZnQgY2FuIGJlIE5VTEwuCi10eXBlZGVmIHZvaWQgKCpWUDhJbnRyYVByZWRzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApOwotdHlwZWRlZiB2b2lkICgqVlA4SW50cmE0UHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogdG9wKTsKLWV4dGVybiBWUDhJbnRyYTRQcmVkcyBWUDhFbmNQcmVkTHVtYTQ7Ci1leHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkTHVtYTE2OwotZXh0ZXJuIFZQOEludHJhUHJlZHMgVlA4RW5jUHJlZENocm9tYTg7Ci0KLXR5cGVkZWYgaW50ICgqVlA4TWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZik7Ci1leHRlcm4gVlA4TWV0cmljIFZQOFNTRTE2eDE2LCBWUDhTU0UxNng4LCBWUDhTU0U4eDgsIFZQOFNTRTR4NDsKLXR5cGVkZWYgaW50ICgqVlA4V01ldHJpYykoY29uc3QgdWludDhfdCogcGl4LCBjb25zdCB1aW50OF90KiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3ZWlnaHRzKTsKLWV4dGVybiBWUDhXTWV0cmljIFZQOFREaXN0bzR4NCwgVlA4VERpc3RvMTZ4MTY7Ci0KLXR5cGVkZWYgdm9pZCAoKlZQOEJsb2NrQ29weSkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpOwotZXh0ZXJuIFZQOEJsb2NrQ29weSBWUDhDb3B5NHg0OwotLy8gUXVhbnRpemF0aW9uCi1zdHJ1Y3QgVlA4TWF0cml4OyAgIC8vIGZvcndhcmQgZGVjbGFyYXRpb24KLXR5cGVkZWYgaW50ICgqVlA4UXVhbnRpemVCbG9jaykoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7Ci1leHRlcm4gVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOwotCi0vLyBDb2xsZWN0IGhpc3RvZ3JhbSBmb3Igc3VzY2VwdGliaWxpdHkgY2FsY3VsYXRpb24gYW5kIGFjY3VtdWxhdGUgaW4gaGlzdG9bXS4KLXN0cnVjdCBWUDhIaXN0b2dyYW07Ci10eXBlZGVmIHZvaWQgKCpWUDhDSGlzdG8pKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0byk7Ci1leHRlcm4gY29uc3QgaW50IFZQOERzcFNjYW5bMTYgKyA0ICsgNF07Ci1leHRlcm4gVlA4Q0hpc3RvIFZQOENvbGxlY3RIaXN0b2dyYW07Ci0KLXZvaWQgVlA4RW5jRHNwSW5pdCh2b2lkKTsgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBhYm92ZQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVjb2RpbmcKLQotdHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdCkoY29uc3QgaW50MTZfdCogY29lZmZzLCB1aW50OF90KiBkc3QpOwotLy8gd2hlbiBkb2luZyB0d28gdHJhbnNmb3JtcywgY29lZmZzIGlzIGFjdHVhbGx5IGludDE2X3RbMl1bMTZdLgotdHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdDIpKGNvbnN0IGludDE2X3QqIGNvZWZmcywgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKTsKLWV4dGVybiBWUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07Ci1leHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1VVjsKLWV4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDOwotZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKLWV4dGVybiBWUDhXSFQgVlA4VHJhbnNmb3JtV0hUOwotCi0vLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jaywgd2l0aCBzdHJpZGUgQlBTLiBCb3VuZGFyeSBzYW1wbGVzIGFyZQotLy8gYXNzdW1lZCBhY2Nlc3NpYmxlIHdoZW4gbmVlZGVkLgotdHlwZWRlZiB2b2lkICgqVlA4UHJlZEZ1bmMpKHVpbnQ4X3QqIGRzdCk7Ci1leHRlcm4gY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWExNlsvKiBOVU1fQl9EQ19NT0RFUyAqL107Ci1leHRlcm4gY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZENocm9tYThbLyogTlVNX0JfRENfTU9ERVMgKi9dOwotZXh0ZXJuIGNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFsvKiBOVU1fQk1PREVTICovXTsKLQotLy8gc2ltcGxlIGZpbHRlciAob25seSBmb3IgbHVtYSkKLXR5cGVkZWYgdm9pZCAoKlZQOFNpbXBsZUZpbHRlckZ1bmMpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpOwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2OwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2aTsgIC8vIGZpbHRlciAzIGlubmVyIGVkZ2VzCi1leHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOwotCi0vLyByZWd1bGFyIGZpbHRlciAob24gYm90aCBtYWNyb2Jsb2NrIGVkZ2VzIGFuZCBpbm5lciBlZGdlcykKLXR5cGVkZWYgdm9pZCAoKlZQOEx1bWFGaWx0ZXJGdW5jKSh1aW50OF90KiBsdW1hLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOwotdHlwZWRlZiB2b2lkICgqVlA4Q2hyb21hRmlsdGVyRnVuYykodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOwotLy8gb24gb3V0ZXIgZWRnZQotZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNjsKLWV4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTY7Ci1leHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4OwotCi0vLyBvbiBpbm5lciBlZGdlCi1leHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2aTsgICAvLyBmaWx0ZXJpbmcgMyBpbm5lciBlZGdlcyBhbHRvZ2V0aGVyCi1leHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4aTsgIC8vIGZpbHRlcmluZyB1IGFuZCB2IGFsdG9nZXRoZXIKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4aTsKLQotLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIHVzaW5nIHRoZSBhYm92ZQotdm9pZCBWUDhEc3BJbml0KHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUCBJL08KLQotI2RlZmluZSBGQU5DWV9VUFNBTVBMSU5HICAgLy8gdW5kZWZpbmVkIHRvIHJlbW92ZSBmYW5jeSB1cHNhbXBsaW5nIHN1cHBvcnQKLQotdHlwZWRlZiB2b2lkICgqV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jKSgKLSAgICBjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCi0gICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LAotICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwKLSAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKTsKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCKEEpIG1vZGVzCi1leHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLS8vIEluaXRpYWxpemVzIFNTRTIgdmVyc2lvbiBvZiB0aGUgZmFuY3kgdXBzYW1wbGVycy4KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKTsKLQotLy8gTkVPTiB2ZXJzaW9uCi12b2lkIFdlYlBJbml0VXBzYW1wbGVyc05FT04odm9pZCk7Ci0KLSNlbmRpZiAgICAvLyBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIFBvaW50LXNhbXBsaW5nIG1ldGhvZHMuCi10eXBlZGVmIHZvaWQgKCpXZWJQU2FtcGxlTGluZVBhaXJGdW5jKSgKLSAgICBjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCi0gICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKLSAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKTsKLQotZXh0ZXJuIGNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLS8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdHdvIGxpbmVzIG9mIEFSR0Igb3IgUkdCQS4KLS8vICdhbHBoYV9pc19sYXN0JyBzaG91bGQgYmUgdHJ1ZSBpZiAweGZmMDAwMDAwIGlzIHN0b3JlZCBpbiBtZW1vcnkgYXMKLS8vIGFzIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYgKGxpdHRsZSBlbmRpYW4pLgotV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCk7Ci0KLS8vIFlVVjQ0NC0+UkdCIGNvbnZlcnRlcnMKLXR5cGVkZWYgdm9pZCAoKldlYlBZVVY0NDRDb252ZXJ0ZXIpKGNvbnN0IHVpbnQ4X3QqIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsKLQotZXh0ZXJuIGNvbnN0IFdlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbLyogTU9ERV9MQVNUICovXTsKLQotLy8gTWFpbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzKHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlLW11bHRpcGx5IHBsYW5lcyB3aXRoIGFscGhhIHZhbHVlcwotCi0vLyBBcHBseSBhbHBoYSBwcmUtbXVsdGlwbHkgb24gYW4gcmdiYSwgYmdyYSBvciBhcmdiIHBsYW5lIG9mIHNpemUgdyAqIGguCi0vLyBhbHBoYV9maXJzdCBzaG91bGQgYmUgMCBmb3IgYXJnYiwgMSBmb3IgcmdiYSBvciBiZ3JhICh3aGVyZSBhbHBoYSBpcyBsYXN0KS4KLWV4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseSkoCi0gICAgdWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOwotCi0vLyBTYW1lLCBidWYgc3BlY2lmaWNhbGx5IGZvciBSR0JBNDQ0NCBmb3JtYXQKLWV4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKAotICAgIHVpbnQ4X3QqIHJnYmE0NDQ0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOwotCi0vLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KLXZvaWQgV2ViUEluaXRQcmVtdWx0aXBseSh2b2lkKTsKLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5U1NFMih2b2lkKTsgICAvLyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4KLXZvaWQgV2ViUEluaXRQcmVtdWx0aXBseU5FT04odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfRFNQX0RTUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuY19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jX25lb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNTZlNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jX25lb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQVJNIE5FT04gdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCi0vLwotLy8gYWRhcHRlZCBmcm9tIGxpYnZweCAoaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS8pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLQotI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKLQotLy8gSW52ZXJzZSB0cmFuc2Zvcm0uCi0vLyBUaGlzIGNvZGUgaXMgcHJldHR5IG11Y2ggdGhlIHNhbWUgYXMgVHJhbnNmb3JtT25lTkVPTiBpbiB0aGUgZGVjb2RlciwgZXhjZXB0Ci0vLyBmb3Igc3VidHJhY3Rpb24gdG8gKnJlZi4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSBmb3IgYWxnb3JpdGhtaWMgZXhwbGFuYXRpb25zLgotc3RhdGljIHZvaWQgSVRyYW5zZm9ybU9uZShjb25zdCB1aW50OF90KiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgaW50IGtCUFMgPSBCUFM7Ci0gIGNvbnN0IGludDE2X3Qga0MxQzJbXSA9IHsgMjAwOTEsIDE3NzM0LCAwLCAwIH07ICAvLyBrQzEgLyAoa0MyID4+IDEpIC8gMCAvIDAKLQotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAidmxkMS4xNiAgICAgICAgIHtxMSwgcTJ9LCBbJVtpbl1dICAgICAgICAgICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIHtkMH0sIFslW2tDMUMyXV0gICAgICAgICAgICBcbiIKLQotICAgIC8vIGQyOiBpblswXQotICAgIC8vIGQzOiBpbls4XQotICAgIC8vIGQ0OiBpbls0XQotICAgIC8vIGQ1OiBpblsxMl0KLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHE4ID0ge2luWzRdLCBpblsxMl19ICoga0MxICogMiA+PiAxNgotICAgIC8vIHE5ID0ge2luWzRdLCBpblsxMl19ICoga0MyID4+IDE2Ci0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjIgPSBhID0gaW5bMF0gKyBpbls4XQotICAgIC8vIGQyMyA9IGIgPSBpblswXSAtIGluWzhdCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyAgcTggPSBpbls0XS9bMTJdICoga0MxID4+IDE2Ci0gICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBBZGQge2luWzRdLCBpblsxMl19IGJhY2sgYWZ0ZXIgdGhlIG11bHRpcGxpY2F0aW9uLgotICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKLSAgICAvLyBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDIgPSB0bXBbMF0gPSBhICsgZAotICAgIC8vIGQzID0gdG1wWzFdID0gYiArIGMKLSAgICAvLyBkNCA9IHRtcFsyXSA9IGIgLSBjCi0gICAgLy8gZDUgPSB0bXBbM10gPSBhIC0gZAotICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHE4ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzEgKiAyID4+IDE2Ci0gICAgLy8gcTkgPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMiA+PiAxNgotICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDIyID0gYSA9IHRtcFswXSArIHRtcFs4XQotICAgIC8vIGQyMyA9IGIgPSB0bXBbMF0gLSB0bXBbOF0KLSAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKLSAgICAvLyBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDIgPSB0bXBbMF0gPSBhICsgZAotICAgIC8vIGQzID0gdG1wWzFdID0gYiArIGMKLSAgICAvLyBkNCA9IHRtcFsyXSA9IGIgLSBjCi0gICAgLy8gZDUgPSB0bXBbM10gPSBhIC0gZAotICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuMzIgICAgICAgICBkNlswXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkNlsxXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1swXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1sxXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCi0KLSAgICAic3ViICAgICAgICAgJVtyZWZdLCAlW3JlZl0sICVba0JQU10sIGxzbCAjMiBcbiIKLQotICAgIC8vICh2YWwpICsgNCA+PiAzCi0gICAgInZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIE11c3QgYWNjdW11bGF0ZSBiZWZvcmUgc2F0dXJhdGluZwotICAgICJ2bW92bC51OCAgICAgICAgcTgsIGQ2ICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2bW92bC51OCAgICAgICAgcTksIGQ3ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFtb3Z1bi5zMTYgICAgIGQwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFtb3Z1bi5zMTYgICAgIGQxLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMV0sIFslW2RzdF1dICAgICAgICAgICAgIFxuIgotCi0gICAgOiBbaW5dICIrciIoaW4pLCBbZHN0XSAiK3IiKGRzdCkgICAgICAgICAgICAgICAvLyBtb2RpZmllZCByZWdpc3RlcnMKLSAgICA6IFtrQlBTXSAiciIoa0JQUyksIFtrQzFDMl0gInIiKGtDMUMyKSwgW3JlZl0gInIiKHJlZikgIC8vIGNvbnN0YW50cwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxOCIsICJxOSIsICJxMTAiLCAicTExIiAgLy8gY2xvYmJlcmVkCi0gICk7Ci19Ci0KLXN0YXRpYyB2b2lkIElUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7Ci0gIElUcmFuc2Zvcm1PbmUocmVmLCBpbiwgZHN0KTsKLSAgaWYgKGRvX3R3bykgewotICAgIElUcmFuc2Zvcm1PbmUocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7Ci0gIH0KLX0KLQotLy8gU2FtZSBjb2RlIGFzIGRlY19uZW9uLmMKLXN0YXRpYyB2b2lkIElUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgewotICBjb25zdCBpbnQga1N0ZXAgPSAzMjsgIC8vIFRoZSBzdG9yZSBpcyBvbmx5IGluY3JlbWVudGluZyB0aGUgcG9pbnRlciBhcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhZCBzdG9yZWQgYSBzaW5nbGUgYnl0ZS4KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgLy8gcGFydCAxCi0gICAgLy8gbG9hZCBkYXRhIGludG8gcTAsIHExCi0gICAgInZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZGwuczE2ICAgICAgIHEyLCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBpblswXSArIGluWzEyXQotICAgICJ2YWRkbC5zMTYgICAgICAgcTMsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGluWzRdICsgaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE0LCBkMSwgZDIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSBpbls0XSAtIGluWzhdCi0gICAgInZzdWJsLnMxNiAgICAgICBxNSwgZDAsIGQzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gaW5bMF0gLSBpblsxMl0KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHEyLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMF0gPSBhMCArIGExCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFs4XSA9IGEwIC0gYTEKLSAgICAidmFkZC5zMzIgICAgICAgIHExLCBxNSwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzRdID0gYTMgKyBhMgotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMTJdID0gYTMgLSBhMgotCi0gICAgLy8gVHJhbnNwb3NlCi0gICAgLy8gcTAgPSB0bXBbMCwgNCwgOCwgMTJdLCBxMSA9IHRtcFsyLCA2LCAxMCwgMTRdCi0gICAgLy8gcTIgPSB0bXBbMSwgNSwgOSwgMTNdLCBxMyA9IHRtcFszLCA3LCAxMSwgMTVdCi0gICAgInZzd3AgICAgICAgICAgICBkMSwgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTAsIHEyCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTEsIHEzCi0gICAgInZ0cm4uMzIgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMiwgcTMgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidm1vdi5zMzIgICAgICAgIHE0LCAjMyAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSAzCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTAsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIGRjID0gdG1wWzBdICsgMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTYsIHEwLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGRjICsgdG1wWzNdCi0gICAgInZhZGQuczMyICAgICAgICBxNywgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gdG1wWzFdICsgdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOCwgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gdG1wWzFdIC0gdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOSwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gZGMgLSB0bXBbM10KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDAsIHEwLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgKyBhMSkgPj4gMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHExLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgKyBhMikgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTIsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgLSBhMSkgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHEzLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgLSBhMikgPj4gMwotCi0gICAgLy8gc2V0IHRoZSByZXN1bHRzIHRvIG91dHB1dAotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbM10sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbM10sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbM10sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbM10sIFslW291dF1dLCAlW2tTdGVwXSAgICAgIFxuIgotCi0gICAgOiBbb3V0XSAiK3IiKG91dCkgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2luXSAiciIoaW4pLCBba1N0ZXBdICJyIihrU3RlcCkgIC8vIGNvbnN0YW50cwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiIC8vIGNsb2JiZXJlZAotICApOwotfQotCi0vLyBGb3J3YXJkIHRyYW5zZm9ybS4KLQotLy8gYWRhcHRlZCBmcm9tIHZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbQotc3RhdGljIGNvbnN0IGludDE2X3Qga0NvZWZmMTZbXSA9IHsKLSAgNTM1MiwgIDUzNTIsICA1MzUyLCA1MzUyLCAyMjE3LCAgMjIxNywgIDIyMTcsIDIyMTcKLX07Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrQ29lZmYzMltdID0gewotICAgMTgxMiwgIDE4MTIsICAxODEyLCAgMTgxMiwKLSAgICA5MzcsICAgOTM3LCAgIDkzNywgICA5MzcsCi0gIDEyMDAwLCAxMjAwMCwgMTIwMDAsIDEyMDAwLAotICA1MTAwMCwgNTEwMDAsIDUxMDAwLCA1MTAwMAotfTsKLQotc3RhdGljIHZvaWQgRlRyYW5zZm9ybShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IGludCBrQlBTID0gQlBTOwotICBjb25zdCB1aW50OF90KiBzcmNfcHRyID0gc3JjOwotICBjb25zdCB1aW50OF90KiByZWZfcHRyID0gcmVmOwotICBjb25zdCBpbnQxNl90KiBjb2VmZjE2ID0ga0NvZWZmMTY7Ci0gIGNvbnN0IGludDMyX3QqIGNvZWZmMzIgPSBrQ29lZmYzMjsKLQotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAvLyBsb2FkIHNyYyBpbnRvIHE0LCBxNSBpbiBoaWdoIGhhbGYKLSAgICAidmxkMS44IHtkOH0sICBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKLSAgICAidmxkMS44IHtkMTB9LCBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKLSAgICAidmxkMS44IHtkOX0sICBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKLSAgICAidmxkMS44IHtkMTF9LCBbJVtzcmNfcHRyXV0gICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGxvYWQgcmVmIGludG8gcTYsIHE3IGluIGhpZ2ggaGFsZgotICAgICJ2bGQxLjgge2QxMn0sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxNH0sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxM30sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxNX0sIFslW3JlZl9wdHJdXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gUGFjayB0aGUgaGlnaCB2YWx1ZXMgaW4gdG8gcTQgYW5kIHE2Ci0gICAgInZ0cm4uMzIgICAgIHE0LCBxNSAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgIHE2LCBxNyAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkWzAtM10gPSBzcmMgLSByZWYKLSAgICAidnN1YmwudTggICAgcTAsIGQ4LCBkMTIgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwudTggICAgcTEsIGQ5LCBkMTMgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGxvYWQgY29lZmYxNiBpbnRvIHE4KGQxNj01MzUyLCBkMTc9MjIxNykKLSAgICAidmxkMS4xNiAgICAge3E4fSwgWyVbY29lZmYxNl1dICAgICAgICAgICBcbiIKLQotICAgIC8vIGxvYWQgY29lZmYzMiBoaWdoIGhhbGYgaW50byBxOSA9IDE4MTIsIHExMCA9IDkzNwotICAgICJ2bGQxLjMyICAgICB7cTksIHExMH0sIFslW2NvZWZmMzJdXSEgICAgIFxuIgotCi0gICAgLy8gbG9hZCBjb2VmZjMyIGxvdyBoYWxmIGludG8gcTExPTEyMDAwLCBxMTI9NTEwMDAKLSAgICAidmxkMS4zMiAgICAge3ExMSxxMTJ9LCBbJVtjb2VmZjMyXV0gICAgICBcbiIKLQotICAgIC8vIHBhcnQgMQotICAgIC8vIFRyYW5zcG9zZS4gUmVnaXN0ZXIgZE4gaXMgdGhlIHNhbWUgYXMgZE4gaW4gQwotICAgICJ2dHJuLjMyICAgICAgICAgZDAsIGQyICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgZDEsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDAsIGQxICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZhZGQuczE2ICAgICAgICBkNCwgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGEwID0gZDAgKyBkMwotICAgICJ2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGQxICsgZDIKLSAgICAidnN1Yi5zMTYgICAgICAgIGQ2LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSBkMSAtIGQyCi0gICAgInZzdWIuczE2ICAgICAgICBkNywgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gZDAgLSBkMwotCi0gICAgInZhZGQuczE2ICAgICAgICBkMCwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIGEwICsgYTEKLSAgICAidnNobC5zMTYgICAgICAgIGQwLCBkMCwgIzMgICAgICAgICAgICAgICBcbiIgLy8gdGVtcFswK2kqNF0gPSAoYTArYTEpIDw8IDMKLSAgICAidnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gYTAgLSBhMQotICAgICJ2c2hsLnMxNiAgICAgICAgZDIsIGQyLCAjMyAgICAgICAgICAgICAgIFxuIiAvLyAodGVtcFsyK2kqNF0gPSAoYTAtYTEpIDw8IDMKLQotICAgICJ2bWxhbC5zMTYgICAgICAgcTksIGQ3LCBkMTYgICAgICAgICAgICAgIFxuIiAvLyBhMyo1MzUyICsgMTgxMgotICAgICJ2bWxhbC5zMTYgICAgICAgcTEwLCBkNywgZDE3ICAgICAgICAgICAgIFxuIiAvLyBhMyoyMjE3ICsgOTM3Ci0gICAgInZtbGFsLnMxNiAgICAgICBxOSwgZDYsIGQxNyAgICAgICAgICAgICAgXG4iIC8vIGEyKjIyMTcgKyBhMyo1MzUyICsgMTgxMgotICAgICJ2bWxzbC5zMTYgICAgICAgcTEwLCBkNiwgZDE2ICAgICAgICAgICAgIFxuIiAvLyBhMyoyMjE3ICsgOTM3IC0gYTIqNTM1MgotCi0gICAgLy8gdGVtcFsxK2kqNF0gPSAoZDIqMjIxNyArIGQzKjUzNTIgKyAxODEyKSA+PiA5Ci0gICAgLy8gdGVtcFszK2kqNF0gPSAoZDMqMjIxNyArIDkzNyAtIGQyKjUzNTIpID4+IDkKLSAgICAidnNocm4uczMyICAgICAgIGQxLCBxOSwgIzkgICAgICAgICAgICAgICBcbiIKLSAgICAidnNocm4uczMyICAgICAgIGQzLCBxMTAsICM5ICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHBhcnQgMgotICAgIC8vIHRyYW5zcG9zZSBkMD1pcFswXSwgZDE9aXBbNF0sIGQyPWlwWzhdLCBkMz1pcFsxMl0KLSAgICAidnRybi4zMiAgICAgICAgIGQwLCBkMiAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIGQxLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4xNiAgICAgICAgIGQwLCBkMSAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4xNiAgICAgICAgIGQyLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bW92LnMxNiAgICAgICAgZDI2LCAjNyAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZhZGQuczE2ICAgICAgICBkNCwgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGExID0gaXBbMF0gKyBpcFsxMl0KLSAgICAidmFkZC5zMTYgICAgICAgIGQ1LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYjEgPSBpcFs0XSArIGlwWzhdCi0gICAgInZzdWIuczE2ICAgICAgICBkNiwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGMxID0gaXBbNF0gLSBpcFs4XQotICAgICJ2YWRkLnMxNiAgICAgICAgZDQsIGQ0LCBkMjYgICAgICAgICAgICAgIFxuIiAvLyBhMSArIDcKLSAgICAidnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gZDEgPSBpcFswXSAtIGlwWzEyXQotCi0gICAgInZhZGQuczE2ICAgICAgICBkMCwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIG9wWzBdID0gYTEgKyBiMSArIDcKLSAgICAidnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gb3BbOF0gPSBhMSAtIGIxICsgNwotCi0gICAgInZtbGFsLnMxNiAgICAgICBxMTEsIGQ3LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGQxKjUzNTIgKyAxMjAwMAotICAgICJ2bWxhbC5zMTYgICAgICAgcTEyLCBkNywgZDE3ICAgICAgICAgICAgIFxuIiAvLyBkMSoyMjE3ICsgNTEwMDAKLQotICAgICJ2Y2VxLnMxNiAgICAgICAgZDQsIGQ3LCAjMCAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzaHIuczE2ICAgICAgICBkMCwgZDAsICM0ICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHIuczE2ICAgICAgICBkMiwgZDIsICM0ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidm1sYWwuczE2ICAgICAgIHExMSwgZDYsIGQxNyAgICAgICAgICAgICBcbiIgLy8gYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMAotICAgICJ2bWxzbC5zMTYgICAgICAgcTEyLCBkNiwgZDE2ICAgICAgICAgICAgIFxuIiAvLyBkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwCi0KLSAgICAidm12biAgICAgICAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIgLy8gIShkMSA9PSAwKQotICAgIC8vIG9wWzRdID0gKGMxKjIyMTcgKyBkMSo1MzUyICsgMTIwMDApPj4xNgotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHExMSwgIzE2ICAgICAgICAgICAgIFxuIgotICAgIC8vIG9wWzRdICs9IChkMSE9MCkKLSAgICAidnN1Yi5zMTYgICAgICAgIGQxLCBkMSwgZDQgICAgICAgICAgICAgICBcbiIKLSAgICAvLyBvcFsxMl09IChkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwKT4+MTYKLSAgICAidnNocm4uczMyICAgICAgIGQzLCBxMTIsICMxNiAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHNldCByZXN1bHQgdG8gb3V0IGFycmF5Ci0gICAgInZzdDEuMTYgICAgICAgICB7cTAsIHExfSwgWyVbb3V0XV0gICBcbiIKLSAgICA6IFtzcmNfcHRyXSAiK3IiKHNyY19wdHIpLCBbcmVmX3B0cl0gIityIihyZWZfcHRyKSwKLSAgICAgIFtjb2VmZjMyXSAiK3IiKGNvZWZmMzIpICAgICAgICAgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2NvZWZmMTZdICJyIihjb2VmZjE2KSwKLSAgICAgIFtvdXRdICJyIihvdXQpICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0YW50cwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsICJxNSIsICJxNiIsICJxNyIsICJxOCIsICJxOSIsCi0gICAgICAicTEwIiwgInExMSIsICJxMTIiLCAicTEzIiAgICAgICAvLyBjbG9iYmVyZWQKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IGludCBrU3RlcCA9IDMyOwotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAvLyBkMCA9IGluWzAgKiAxNl0gLCBkMSA9IGluWzEgKiAxNl0KLSAgICAvLyBkMiA9IGluWzIgKiAxNl0gLCBkMyA9IGluWzMgKiAxNl0KLSAgICAidmxkMS4xNiAgICAgICAgIGQwWzBdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDFbMF0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMlswXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQzWzBdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDBbMV0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMVsxXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQyWzFdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDNbMV0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMFsyXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQxWzJdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDJbMl0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkM1syXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQwWzNdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDFbM10sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMlszXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQzWzNdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotCi0gICAgInZhZGRsLnMxNiAgICAgICBxMiwgZDAsIGQyICAgICAgICAgICAgICAgICBcbiIgLy8gYTA9KGluWzAqMTZdK2luWzIqMTZdKQotICAgICJ2YWRkbC5zMTYgICAgICAgcTMsIGQxLCBkMyAgICAgICAgICAgICAgICAgXG4iIC8vIGExPShpblsxKjE2XStpblszKjE2XSkKLSAgICAidnN1YmwuczE2ICAgICAgIHE0LCBkMSwgZDMgICAgICAgICAgICAgICAgIFxuIiAvLyBhMj0oaW5bMSoxNl0taW5bMyoxNl0pCi0gICAgInZzdWJsLnMxNiAgICAgICBxNSwgZDAsIGQyICAgICAgICAgICAgICAgICBcbiIgLy8gYTM9KGluWzAqMTZdLWluWzIqMTZdKQotCi0gICAgInZxYWRkLnMzMiAgICAgICBxNiwgcTIsIHEzICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgKyBhMQotICAgICJ2cWFkZC5zMzIgICAgICAgcTcsIHE1LCBxNCAgICAgICAgICAgICAgICAgXG4iIC8vIGEzICsgYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE4LCBxNSwgcTQgICAgICAgICAgICAgICAgIFxuIiAvLyBhMyAtIGEyCi0gICAgInZxc3ViLnMzMiAgICAgICBxOSwgcTIsIHEzICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgLSBhMQotCi0gICAgLy8gVHJhbnNwb3NlCi0gICAgLy8gcTYgPSB0bXBbMCwgMSwgIDIsICAzXSA7IHE3ID0gdG1wWyA0LCAgNSwgIDYsICA3XQotICAgIC8vIHE4ID0gdG1wWzgsIDksIDEwLCAxMV0gOyBxOSA9IHRtcFsxMiwgMTMsIDE0LCAxNV0KLSAgICAidnN3cCAgICAgICAgICAgIGQxMywgZDE2ICAgICAgICAgICAgICAgICAgIFxuIiAvLyB2dHJuLjY0IHEwLCBxMgotICAgICJ2c3dwICAgICAgICAgICAgZDE1LCBkMTggICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTEsIHEzCi0gICAgInZ0cm4uMzIgICAgICAgICBxNiwgcTcgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHE4LCBxOSAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZxYWRkLnMzMiAgICAgICBxMCwgcTYsIHE4ICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSB0bXBbMF0gKyB0bXBbOF0KLSAgICAidnFhZGQuczMyICAgICAgIHExLCBxNywgcTkgICAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IHRtcFs0XSArIHRtcFsxMl0KLSAgICAidnFzdWIuczMyICAgICAgIHEyLCBxNywgcTkgICAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IHRtcFs0XSAtIHRtcFsxMl0KLSAgICAidnFzdWIuczMyICAgICAgIHEzLCBxNiwgcTggICAgICAgICAgICAgICAgIFxuIiAvLyBhMyA9IHRtcFswXSAtIHRtcFs4XQotCi0gICAgInZxYWRkLnMzMiAgICAgICBxNCwgcTAsIHExICAgICAgICAgICAgICAgICBcbiIgLy8gYjAgPSBhMCArIGExCi0gICAgInZxYWRkLnMzMiAgICAgICBxNSwgcTMsIHEyICAgICAgICAgICAgICAgICBcbiIgLy8gYjEgPSBhMyArIGEyCi0gICAgInZxc3ViLnMzMiAgICAgICBxNiwgcTMsIHEyICAgICAgICAgICAgICAgICBcbiIgLy8gYjIgPSBhMyAtIGEyCi0gICAgInZxc3ViLnMzMiAgICAgICBxNywgcTAsIHExICAgICAgICAgICAgICAgICBcbiIgLy8gYjMgPSBhMCAtIGExCi0KLSAgICAidnNocm4uczMyICAgICAgIGQxOCwgcTQsICMxICAgICAgICAgICAgICAgIFxuIiAvLyBiMCA+PiAxCi0gICAgInZzaHJuLnMzMiAgICAgICBkMTksIHE1LCAjMSAgICAgICAgICAgICAgICBcbiIgLy8gYjEgPj4gMQotICAgICJ2c2hybi5zMzIgICAgICAgZDIwLCBxNiwgIzEgICAgICAgICAgICAgICAgXG4iIC8vIGIyID4+IDEKLSAgICAidnNocm4uczMyICAgICAgIGQyMSwgcTcsICMxICAgICAgICAgICAgICAgIFxuIiAvLyBiMyA+PiAxCi0KLSAgICAidnN0MS4xNiAgICAgICAgIHtxOSwgcTEwfSwgWyVbb3V0XV0gICAgICAgIFxuIgotCi0gICAgOiBbaW5dICIrciIoaW4pCi0gICAgOiBba1N0ZXBdICJyIihrU3RlcCksIFtvdXRdICJyIihvdXQpCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwKLSAgICAgICJxNiIsICJxNyIsICJxOCIsICJxOSIsICJxMTAiICAgICAgIC8vIGNsb2JiZXJlZAotICApIDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRleHR1cmUgZGlzdG9ydGlvbgotLy8KLS8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAotLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgotCi0vLyBIYWRhbWFyZCB0cmFuc2Zvcm0KLS8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgotLy8gVGhpcyB1c2VzIGEgVFRyYW5zZm9ybSBoZWxwZXIgZnVuY3Rpb24gaW4gQwotc3RhdGljIGludCBEaXN0bzR4NChjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBjb25zdCBpbnQga0JQUyA9IEJQUzsKLSAgY29uc3QgdWludDhfdCogQSA9IGE7Ci0gIGNvbnN0IHVpbnQ4X3QqIEIgPSBiOwotICBjb25zdCB1aW50MTZfdCogVyA9IHc7Ci0gIGludCBzdW07Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJ2bGQxLjMyICAgICAgICAgZDBbMF0sIFslW2FdXSwgJVtrQlBTXSAgIFxuIgotICAgICJ2bGQxLjMyICAgICAgICAgZDBbMV0sIFslW2FdXSwgJVtrQlBTXSAgIFxuIgotICAgICJ2bGQxLjMyICAgICAgICAgZDJbMF0sIFslW2FdXSwgJVtrQlBTXSAgIFxuIgotICAgICJ2bGQxLjMyICAgICAgICAgZDJbMV0sIFslW2FdXSAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuMzIgICAgICAgICBkMVswXSwgWyVbYl1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMVsxXSwgWyVbYl1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkM1swXSwgWyVbYl1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkM1sxXSwgWyVbYl1dICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBhIGQwL2QyLCBiIGQxL2QzCi0gICAgLy8gZDAvZDE6IDAxIDAxIDAxIDAxCi0gICAgLy8gZDIvZDM6IDIzIDIzIDIzIDIzCi0gICAgLy8gQnV0OiBpdCBnb2VzIDAxIDQ1IDIzIDY3Ci0gICAgLy8gTm90aWNlIHRoZSBtaWRkbGUgdmFsdWVzIGFyZSB0cmFuc3Bvc2VkCi0gICAgInZ0cm4uMTYgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB7YTAsIGExfSA9IHtpblswXSArIGluWzJdLCBpblsxXSArIGluWzNdfQotICAgICJ2YWRkbC51OCAgICAgICAgcTIsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkbC51OCAgICAgICAgcTEwLCBkMSwgZDMgICAgICAgICAgICAgIFxuIgotICAgIC8vIHthMywgYTJ9ID0ge2luWzBdIC0gaW5bMl0sIGluWzFdIC0gaW5bM119Ci0gICAgInZzdWJsLnU4ICAgICAgICBxMywgZDAsIGQyICAgICAgICAgICAgICAgXG4iCi0gICAgInZzdWJsLnU4ICAgICAgICBxMTEsIGQxLCBkMyAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB0bXBbMF0gPSBhMCArIGExCi0gICAgInZwYWRkbC5zMTYgICAgICBxMCwgcTIgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZwYWRkbC5zMTYgICAgICBxOCwgcTEwICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB0bXBbMV0gPSBhMyArIGEyCi0gICAgInZwYWRkbC5zMTYgICAgICBxMSwgcTMgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZwYWRkbC5zMTYgICAgICBxOSwgcTExICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBObyBwYWlyIHN1YnRyYWN0Ci0gICAgLy8gcTIgPSB7YTAsIGEzfQotICAgIC8vIHEzID0ge2ExLCBhMn0KLSAgICAidnRybi4xNiAgICAgICAgIHEyLCBxMyAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4xNiAgICAgICAgIHExMCwgcTExICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHt0bXBbM10sIHRtcFsyXX0gPSB7YTAgLSBhMSwgYTMgLSBhMn0KLSAgICAidnN1YmwuczE2ICAgICAgIHExMiwgZDQsIGQ2ICAgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwuczE2ICAgICAgIHExMywgZDUsIGQ3ICAgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwuczE2ICAgICAgIHExNCwgZDIwLCBkMjIgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwuczE2ICAgICAgIHExNSwgZDIxLCBkMjMgICAgICAgICAgICBcbiIKLQotICAgIC8vIHNlcGFyYXRlIHRtcFszXSBhbmQgdG1wWzJdCi0gICAgLy8gcTEyID0gdG1wWzNdCi0gICAgLy8gcTEzID0gdG1wWzJdCi0gICAgInZ0cm4uMzIgICAgICAgICBxMTIsIHExMyAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMTQsIHExNSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBUcmFuc3Bvc2UgdG1wIGZvciBhCi0gICAgInZzd3AgICAgICAgICAgICBkMSwgZDI2ICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQKLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkMjQgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NAotICAgICJ2dHJuLjMyICAgICAgICAgcTAsIHExICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgcTEzLCBxMTIgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gVHJhbnNwb3NlIHRtcCBmb3IgYgotICAgICJ2c3dwICAgICAgICAgICAgZDE3LCBkMzAgICAgICAgICAgICAgICAgIFxuIiAvLyB2dHJuLjY0Ci0gICAgInZzd3AgICAgICAgICAgICBkMTksIGQyOCAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQKLSAgICAidnRybi4zMiAgICAgICAgIHE4LCBxOSAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHExNSwgcTE0ICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIFRoZSBmaXJzdCBRIHJlZ2lzdGVyIGlzIGEsIHRoZSBzZWNvbmQgYi4KLSAgICAvLyBxMC84IHRtcFswLTNdCi0gICAgLy8gcTEzLzE1IHRtcFs0LTddCi0gICAgLy8gcTEvOSB0bXBbOC0xMV0KLSAgICAvLyBxMTIvMTQgdG1wWzEyLTE1XQotCi0gICAgLy8gVGhlc2UgYXJlIHN0aWxsIGluIDAxIDQ1IDIzIDY3IG9yZGVyLiBXZSBmaXggaXQgZWFzaWx5IGluIHRoZSBhZGRpdGlvbgotICAgIC8vIGNhc2UgYnV0IHRoZSBzdWJ0cmFjdGlvbiBwcm9wZWdhdGVzIHRoZW0uCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDI3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzd3AgICAgICAgICAgICBkMTksIGQzMSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBhMCA9IHRtcFswXSArIHRtcFs4XQotICAgICJ2YWRkLnMzMiAgICAgICAgcTIsIHEwLCBxMSAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnMzMiAgICAgICAgcTMsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYTEgPSB0bXBbNF0gKyB0bXBbMTJdCi0gICAgInZhZGQuczMyICAgICAgICBxMTAsIHExMywgcTEyICAgICAgICAgICAgXG4iCi0gICAgInZhZGQuczMyICAgICAgICBxMTEsIHExNSwgcTE0ICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBhMiA9IHRtcFs0XSAtIHRtcFsxMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHExMywgcTEzLCBxMTIgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHExNSwgcTE1LCBxMTQgICAgICAgICAgICBcbiIKLQotICAgIC8vIGEzID0gdG1wWzBdIC0gdG1wWzhdCi0gICAgInZzdWIuczMyICAgICAgICBxMCwgcTAsIHExICAgICAgICAgICAgICAgXG4iCi0gICAgInZzdWIuczMyICAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBiMCA9IGEwICsgYTEKLSAgICAidmFkZC5zMzIgICAgICAgIHExLCBxMiwgcTEwICAgICAgICAgICAgICBcbiIKLSAgICAidmFkZC5zMzIgICAgICAgIHE5LCBxMywgcTExICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGIxID0gYTMgKyBhMgotICAgICJ2YWRkLnMzMiAgICAgICAgcTEyLCBxMCwgcTEzICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnMzMiAgICAgICAgcTE0LCBxOCwgcTE1ICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYjIgPSBhMyAtIGEyCi0gICAgInZzdWIuczMyICAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgXG4iCi0gICAgInZzdWIuczMyICAgICAgICBxOCwgcTgsIHExNSAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBiMyA9IGEwIC0gYTEKLSAgICAidnN1Yi5zMzIgICAgICAgIHEyLCBxMiwgcTEwICAgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHEzLCBxMywgcTExICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bGQxLjY0ICAgICAgICAge3ExMCwgcTExfSwgWyVbd11dICAgICAgIFxuIgotCi0gICAgLy8gYWJzKGIwKQotICAgICJ2YWJzLnMzMiAgICAgICAgcTEsIHExICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWJzLnMzMiAgICAgICAgcTksIHE5ICAgICAgICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhiMSkKLSAgICAidmFicy5zMzIgICAgICAgIHExMiwgcTEyICAgICAgICAgICAgICAgICBcbiIKLSAgICAidmFicy5zMzIgICAgICAgIHExNCwgcTE0ICAgICAgICAgICAgICAgICBcbiIKLSAgICAvLyBhYnMoYjIpCi0gICAgInZhYnMuczMyICAgICAgICBxMCwgcTAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhYnMuczMyICAgICAgICBxOCwgcTggICAgICAgICAgICAgICAgICAgXG4iCi0gICAgLy8gYWJzKGIzKQotICAgICJ2YWJzLnMzMiAgICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWJzLnMzMiAgICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZXhwYW5kIHcgYmVmb3JlIHVzaW5nLgotICAgICJ2bW92bC51MTYgICAgICAgcTEzLCBkMjAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2bW92bC51MTYgICAgICAgcTE1LCBkMjEgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gd1swXSAqIGFicyhiMCkKLSAgICAidm11bC51MzIgICAgICAgIHExLCBxMSwgcTEzICAgICAgICAgICAgICBcbiIKLSAgICAidm11bC51MzIgICAgICAgIHE5LCBxOSwgcTEzICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHdbNF0gKiBhYnMoYjEpCi0gICAgInZtbGEudTMyICAgICAgICBxMSwgcTEyLCBxMTUgICAgICAgICAgICAgXG4iCi0gICAgInZtbGEudTMyICAgICAgICBxOSwgcTE0LCBxMTUgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBleHBhbmQgdyBiZWZvcmUgdXNpbmcuCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTMsIGQyMiAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTUsIGQyMyAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB3WzhdICogYWJzKGIxKQotICAgICJ2bWxhLnUzMiAgICAgICAgcTEsIHEwLCBxMTMgICAgICAgICAgICAgIFxuIgotICAgICJ2bWxhLnUzMiAgICAgICAgcTksIHE4LCBxMTMgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gd1sxMl0gKiBhYnMoYjEpCi0gICAgInZtbGEudTMyICAgICAgICBxMSwgcTIsIHExNSAgICAgICAgICAgICAgXG4iCi0gICAgInZtbGEudTMyICAgICAgICBxOSwgcTMsIHExNSAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBTdW0gdGhlIGFycmF5cwotICAgICJ2cGFkZGwudTMyICAgICAgcTEsIHExICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cGFkZGwudTMyICAgICAgcTksIHE5ICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnU2NCAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnU2NCAgICAgICAgZDE4LCBkMTkgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gSGFkYW1hcmQgdHJhbnNmb3JtIG5lZWRzIDQgYml0cyBvZiBleHRyYSBwcmVjaXNpb24gKDIgYml0cyBpbiBlYWNoCi0gICAgLy8gZGlyZWN0aW9uKSBmb3IgZHluYW1pYyByYXcuIFdlaWdodHMgd1tdIGFyZSAxNmJpdHMgYXQgbWF4LCBzbyB0aGUgbWF4aW11bQotICAgIC8vIHByZWNpc2lvbiBmb3IgY29lZmYgaXMgOGJpdCBvZiBpbnB1dCArIDRiaXRzIG9mIEhhZGFtYXJkIHRyYW5zZm9ybSArCi0gICAgLy8gMTZiaXRzIGZvciB3W10gKyAyIGJpdHMgb2YgYWJzKCkgc3VtbWF0aW9uLgotICAgIC8vCi0gICAgLy8gVGhpcyB1c2VzIGEgbWF4aW11bSBvZiAzMSBiaXRzIChzaWduZWQpLiBEaXNjYXJkaW5nIHRoZSB0b3AgMzIgYml0cyBpcwotICAgIC8vIEEtT0suCi0KLSAgICAvLyBzdW0yIC0gc3VtMQotICAgICJ2c3ViLnUzMiAgICAgICAgZDAsIGQyLCBkMTggICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhzdW0yIC0gc3VtMSkKLSAgICAidmFicy5zMzIgICAgICAgIGQwLCBkMCAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAvLyBhYnMoc3VtMiAtIHN1bTEpID4+IDUKLSAgICAidnNoci51MzIgICAgICAgIGQwLCAjNSAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIEl0IHdvdWxkIGJlIGJldHRlciB0byBtb3ZlIHRoZSB2YWx1ZSBzdHJhaWdodCBpbnRvIHIwIGJ1dCBJJ20gbm90Ci0gICAgLy8gZW50aXJlbHkgc3VyZSBob3cgdGhpcyB3b3JrcyB3aXRoIGlubGluZSBhc3NlbWJseS4KLSAgICAidm1vdi4zMiAgICAgICAgICVbc3VtXSwgZDBbMF0gICAgICAgICAgICBcbiIKLQotICAgIDogW3N1bV0gIj1yIihzdW0pLCBbYV0gIityIihBKSwgW2JdICIrciIoQiksIFt3XSAiK3IiKFcpCi0gICAgOiBba0JQU10gInIiKGtCUFMpCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgInE4IiwgInE5IiwKLSAgICAgICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIgIC8vIGNsb2JiZXJlZAotICApIDsKLQotICByZXR1cm4gc3VtOwotfQotCi1zdGF0aWMgaW50IERpc3RvMTZ4MTYoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBpbnQgRCA9IDA7Ci0gIGludCB4LCB5OwotICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgewotICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7Ci0gICAgICBEICs9IERpc3RvNHg0KGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEQ7Ci19Ci0KLSNlbmRpZiAgIC8vIFdFQlBfVVNFX05FT04KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudHJ5IHBvaW50Ci0KLWV4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRORU9OKHZvaWQpOwotCi12b2lkIFZQOEVuY0RzcEluaXRORU9OKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtOwotICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybTsKLQotICBWUDhJVHJhbnNmb3JtV0hUID0gSVRyYW5zZm9ybVdIVDsKLSAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFQ7Ci0KLSAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDQ7Ci0gIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX05FT04KLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfc3NlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJlOTkwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfc3NlMi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBTU0UyIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgotLy8KLS8vIEF1dGhvcjogQ2hyaXN0aWFuIER1dml2aWVyIChjZHV2aXZpZXJAZ29vZ2xlLmNvbSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCi0jaW5jbHVkZSA8ZW1taW50cmluLmg+Ci0KLSNpbmNsdWRlICIuLi9lbmMvdnA4ZW5jaS5oIgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUXVpdGUgdXNlZnVsIG1hY3JvIGZvciBkZWJ1Z2dpbmcuIExlZnQgaGVyZSBmb3IgY29udmVuaWVuY2UuCi0KLSNpZiAwCi0jaW5jbHVkZSA8c3RkaW8uaD4KLXN0YXRpYyB2b2lkIFByaW50UmVnKGNvbnN0IF9fbTEyOGkgciwgY29uc3QgY2hhciogY29uc3QgbmFtZSwgaW50IHNpemUpIHsKLSAgaW50IG47Ci0gIHVuaW9uIHsKLSAgICBfX20xMjhpIHI7Ci0gICAgdWludDhfdCBpOFsxNl07Ci0gICAgdWludDE2X3QgaTE2WzhdOwotICAgIHVpbnQzMl90IGkzMls0XTsKLSAgICB1aW50NjRfdCBpNjRbMl07Ci0gIH0gdG1wOwotICB0bXAuciA9IHI7Ci0gIHByaW50ZigiJXNcdDogIiwgbmFtZSk7Ci0gIGlmIChzaXplID09IDgpIHsKLSAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgcHJpbnRmKCIlLjJ4ICIsIHRtcC5pOFtuXSk7Ci0gIH0gZWxzZSBpZiAoc2l6ZSA9PSAxNikgewotICAgIGZvciAobiA9IDA7IG4gPCA4OyArK24pIHByaW50ZigiJS40eCAiLCB0bXAuaTE2W25dKTsKLSAgfSBlbHNlIGlmIChzaXplID09IDMyKSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDQ7ICsrbikgcHJpbnRmKCIlLjh4ICIsIHRtcC5pMzJbbl0pOwotICB9IGVsc2UgewotICAgIGZvciAobiA9IDA7IG4gPCAyOyArK24pIHByaW50ZigiJS4xNmx4ICIsIHRtcC5pNjRbbl0pOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLX0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtczoKLS8vIHRoZSBoaWdoZXIsIHRoZSAiZWFzaWVyIiB0aGUgbWFjcm9ibG9jayBpcyB0byBjb21wcmVzcy4KLQotc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbVNTRTIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl90aHJlc2ggPSBfbW1fc2V0MV9lcGkxNihNQVhfQ09FRkZfVEhSRVNIKTsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKLSAgICBpbnQxNl90IG91dFsxNl07Ci0gICAgaW50IGs7Ci0KLSAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOwotCi0gICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluICh3aXRoaW4gb3V0W10pLgotICAgIHsKLSAgICAgIC8vIExvYWQuCi0gICAgICBjb25zdCBfX20xMjhpIG91dDAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0pOwotICAgICAgY29uc3QgX19tMTI4aSBvdXQxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdKTsKLSAgICAgIC8vIHNpZ24ob3V0KSA9IG91dCA+PiAxNSAgKDB4MDAwMCBpZiBwb3NpdGl2ZSwgMHhmZmZmIGlmIG5lZ2F0aXZlKQotICAgICAgY29uc3QgX19tMTI4aSBzaWduMCA9IF9tbV9zcmFpX2VwaTE2KG91dDAsIDE1KTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgc2lnbjEgPSBfbW1fc3JhaV9lcGkxNihvdXQxLCAxNSk7Ci0gICAgICAvLyBhYnMob3V0KSA9IChvdXQgXiBzaWduKSAtIHNpZ24KLSAgICAgIGNvbnN0IF9fbTEyOGkgeG9yMCA9IF9tbV94b3Jfc2kxMjgob3V0MCwgc2lnbjApOwotICAgICAgY29uc3QgX19tMTI4aSB4b3IxID0gX21tX3hvcl9zaTEyOChvdXQxLCBzaWduMSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGFiczAgPSBfbW1fc3ViX2VwaTE2KHhvcjAsIHNpZ24wKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMSA9IF9tbV9zdWJfZXBpMTYoeG9yMSwgc2lnbjEpOwotICAgICAgLy8gdiA9IGFicyhvdXQpID4+IDMKLSAgICAgIGNvbnN0IF9fbTEyOGkgdjAgPSBfbW1fc3JhaV9lcGkxNihhYnMwLCAzKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fc3JhaV9lcGkxNihhYnMxLCAzKTsKLSAgICAgIC8vIGJpbiA9IG1pbih2LCBNQVhfQ09FRkZfVEhSRVNIKQotICAgICAgY29uc3QgX19tMTI4aSBiaW4wID0gX21tX21pbl9lcGkxNih2MCwgbWF4X2NvZWZmX3RocmVzaCk7Ci0gICAgICBjb25zdCBfX20xMjhpIGJpbjEgPSBfbW1fbWluX2VwaTE2KHYxLCBtYXhfY29lZmZfdGhyZXNoKTsKLSAgICAgIC8vIFN0b3JlLgotICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgYmluMCk7Ci0gICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBiaW4xKTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCi0gICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKLSAgICAgIGhpc3RvLT5kaXN0cmlidXRpb25bb3V0W2tdXSsrOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLS8vIERvZXMgb25lIG9yIHR3byBpbnZlcnNlIHRyYW5zZm9ybXMuCi1zdGF0aWMgdm9pZCBJVHJhbnNmb3JtU1NFMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKSB7Ci0gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2LWJpdCBmaXhlZCBwb2ludCB2ZXJzaW9ucyBvZiB0d28KLSAgLy8gbXVsdGlwbHkgY29uc3RhbnRzOgotICAvLyAgICBLMSA9IHNxcnQoMikgKiBjb3MgKHBpLzgpIH49IDg1NjI3IC8gMl4xNgotICAvLyAgICBLMiA9IHNxcnQoMikgKiBzaW4gKHBpLzgpIH49IDM1NDY4IC8gMl4xNgotICAvLwotICAvLyBUbyBiZSBhYmxlIHRvIHVzZSBzaWduZWQgMTYtYml0IGludGVnZXJzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayB0bwotICAvLyBoYXZlIGNvbnN0YW50cyB3aXRoaW4gcmFuZ2U6Ci0gIC8vIC0gQXNzb2NpYXRlZCBjb25zdGFudHMgYXJlIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nIHRoZSAxNi1iaXQgZml4ZWQgcG9pbnQKLSAgLy8gICB2ZXJzaW9uIG9mIG9uZToKLSAgLy8gICAgICBrID0gSyAtICgxIDw8IDE2KSAgPT4gIEsgPSBrICsgKDEgPDwgMTYpCi0gIC8vICAgICAgSzEgPSA4NTI2NyAgPT4gIGsxID0gIDIwMDkxCi0gIC8vICAgICAgSzIgPSAzNTQ2OCAgPT4gIGsyID0gLTMwMDY4Ci0gIC8vIC0gVGhlIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFyaWFibGUgYnkgYSBjb25zdGFudCBiZWNvbWUgdGhlIHN1bSBvZiB0aGUKLSAgLy8gICB2YXJpYWJsZSBhbmQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoYXQgdmFyaWFibGUgYnkgdGhlIGFzc29jaWF0ZWQKLSAgLy8gICBjb25zdGFudDoKLSAgLy8gICAgICAoeCAqIEspID4+IDE2ID0gKHggKiAoayArICgxIDw8IDE2KSkpID4+IDE2ID0gKCh4ICogayApID4+IDE2KSArIHgKLSAgY29uc3QgX19tMTI4aSBrMSA9IF9tbV9zZXQxX2VwaTE2KDIwMDkxKTsKLSAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KC0zMDA2OCk7Ci0gIF9fbTEyOGkgVDAsIFQxLCBUMiwgVDM7Ci0KLSAgLy8gTG9hZCBhbmQgY29uY2F0ZW5hdGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgKHdlJ2xsIGRvIHR3byBpbnZlcnNlCi0gIC8vIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwpLiBJbiB0aGUgY2FzZSBvZiBvbmx5IG9uZSBpbnZlcnNlIHRyYW5zZm9ybSwgdGhlCi0gIC8vIHNlY29uZCBoYWxmIG9mIHRoZSB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlcgotICAvLyB1c2Ugbm9yIHN0b3JlLgotICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKLSAgewotICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzBdKTsKLSAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls0XSk7Ci0gICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bOF0pOwotICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzEyXSk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4Ci0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAotICAgIGlmIChkb190d28pIHsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzE2XSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyMF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjRdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzI4XSk7Ci0gICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKLSAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOwotICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7Ci0gICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKLSAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICAgIH0KLSAgfQotCi0gIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgotICB7Ci0gICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCi0gICAgLy8gbXVsdGlwbGljYXRpb25zLgotICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOwotICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOwotICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7Ci0gICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOwotCi0gICAgLy8gU2Vjb25kIHBhc3MuCi0gICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAyLCB0bXAzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAyLCB0bXAzKTsKLSAgICAvLyBhMDAgYTEwIGEwMSBhMTEgICBhMDIgYTEyIGEwMyBhMTMKLSAgICAvLyBhMjAgYTMwIGEyMSBhMzEgICBhMjIgYTMyIGEyMyBhMzMKLSAgICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKLSAgICAvLyBiMjAgYjMwIGIyMSBiMzEgICBiMjIgYjMyIGIyMyBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8yID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMyA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQotICAgIC8vIGIwMCBiMTAgYjIwIGIzMCBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgYTAzIGExMyBhMjMgYTMzCi0gICAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMwotICAgIFQwID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMSA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIFQzID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKLSAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKLSAgfQotCi0gIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpMTYoNCk7Ci0gICAgY29uc3QgX19tMTI4aSBkYyA9IF9tbV9hZGRfZXBpMTYoVDAsIGZvdXIpOwotICAgIGNvbnN0IF9fbTEyOGkgYSA9ICBfbW1fYWRkX2VwaTE2KGRjLCBUMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gIF9tbV9zdWJfZXBpMTYoZGMsIFQyKTsKLSAgICAvLyBjID0gTVVMKFQxLCBLMikgLSBNVUwoVDMsIEsxKSA9IE1VTChUMSwgazIpIC0gTVVMKFQzLCBrMSkgKyBUMSAtIFQzCi0gICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihUMSwgVDMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoVDEsIEsxKSArIE1VTChUMywgSzIpID0gTVVMKFQxLCBrMSkgKyBNVUwoVDMsIGsyKSArIFQxICsgVDMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDAgPSBfbW1fc3JhaV9lcGkxNih0bXAwLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQxID0gX21tX3NyYWlfZXBpMTYodG1wMSwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMiA9IF9tbV9zcmFpX2VwaTE2KHRtcDIsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDMgPSBfbW1fc3JhaV9lcGkxNih0bXAzLCAzKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoc2hpZnRlZDAsIHNoaWZ0ZWQxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMiwgc2hpZnRlZDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gQWRkIGludmVyc2UgdHJhbnNmb3JtIHRvICdyZWYnIGFuZCBzdG9yZS4KLSAgewotICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gICAgLy8gTG9hZCB0aGUgcmVmZXJlbmNlKHMpLgotICAgIF9fbTEyOGkgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMzsKLSAgICBpZiAoZG9fdHdvKSB7Ci0gICAgICAvLyBMb2FkIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIHJlZjAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMCAqIEJQU10pOwotICAgICAgcmVmMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlsxICogQlBTXSk7Ci0gICAgICByZWYyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzIgKiBCUFNdKTsKLSAgICAgIHJlZjMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMyAqIEJQU10pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgcmVmMCA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmcmVmWzAgKiBCUFNdKTsKLSAgICAgIHJlZjEgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJnJlZlsxICogQlBTXSk7Ci0gICAgICByZWYyID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZyZWZbMiAqIEJQU10pOwotICAgICAgcmVmMyA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmcmVmWzMgKiBCUFNdKTsKLSAgICB9Ci0gICAgLy8gQ29udmVydCB0byAxNmIuCi0gICAgcmVmMCA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjAsIHplcm8pOwotICAgIHJlZjEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYxLCB6ZXJvKTsKLSAgICByZWYyID0gX21tX3VucGFja2xvX2VwaTgocmVmMiwgemVybyk7Ci0gICAgcmVmMyA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjMsIHplcm8pOwotICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0ocykuCi0gICAgcmVmMCA9IF9tbV9hZGRfZXBpMTYocmVmMCwgVDApOwotICAgIHJlZjEgPSBfbW1fYWRkX2VwaTE2KHJlZjEsIFQxKTsKLSAgICByZWYyID0gX21tX2FkZF9lcGkxNihyZWYyLCBUMik7Ci0gICAgcmVmMyA9IF9tbV9hZGRfZXBpMTYocmVmMywgVDMpOwotICAgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgotICAgIHJlZjAgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjAsIHJlZjApOwotICAgIHJlZjEgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjEsIHJlZjEpOwotICAgIHJlZjIgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjIsIHJlZjIpOwotICAgIHJlZjMgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjMsIHJlZjMpOwotICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIFN0b3JlIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10sIHJlZjApOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSwgcmVmMSk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdLCByZWYyKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10sIHJlZjMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgICooKGludDMyX3QgKikmZHN0WzAgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKHJlZjApOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMSAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIocmVmMSk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsyICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihyZWYyKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzMgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKHJlZjMpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgewotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBjb25zdCBfX20xMjhpIHNldmVuID0gX21tX3NldDFfZXBpMTYoNyk7Ci0gIGNvbnN0IF9fbTEyOGkgazkzNyA9IF9tbV9zZXQxX2VwaTMyKDkzNyk7Ci0gIGNvbnN0IF9fbTEyOGkgazE4MTIgPSBfbW1fc2V0MV9lcGkzMigxODEyKTsKLSAgY29uc3QgX19tMTI4aSBrNTEwMDAgPSBfbW1fc2V0MV9lcGkzMig1MTAwMCk7Ci0gIGNvbnN0IF9fbTEyOGkgazEyMDAwX3BsdXNfb25lID0gX21tX3NldDFfZXBpMzIoMTIwMDAgKyAoMSA8PCAxNikpOwotICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTcgPSBfbW1fc2V0X2VwaTE2KDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzUyLCAgMjIxNywgNTM1MiwgIDIyMTcpOwotICBjb25zdCBfX20xMjhpIGsyMjE3XzUzNTIgPSBfbW1fc2V0X2VwaTE2KDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIpOwotICBjb25zdCBfX20xMjhpIGs4OHAgPSBfbW1fc2V0X2VwaTE2KDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgpOwotICBjb25zdCBfX20xMjhpIGs4OG0gPSBfbW1fc2V0X2VwaTE2KC04LCA4LCAtOCwgOCwgLTgsIDgsIC04LCA4KTsKLSAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3cCA9IF9tbV9zZXRfZXBpMTYoMjIxNywgNTM1MiwgMjIxNywgNTM1MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNywgNTM1MiwgMjIxNywgNTM1Mik7Ci0gIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxN20gPSBfbW1fc2V0X2VwaTE2KC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3KTsKLSAgX19tMTI4aSB2MDEsIHYzMjsKLQotCi0gIC8vIERpZmZlcmVuY2UgYmV0d2VlbiBzcmMgYW5kIHJlZiBhbmQgaW5pdGlhbCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBMb2FkIHNyYyBhbmQgY29udmVydCB0byAxNmIuCi0gICAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmc3JjWzAgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZzcmNbMSAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnNyY1syICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmc3JjWzMgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyY18wID0gX21tX3VucGFja2xvX2VwaTgoc3JjMCwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmNfMSA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzEsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMyLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHNyY18zID0gX21tX3VucGFja2xvX2VwaTgoc3JjMywgemVybyk7Ci0gICAgLy8gTG9hZCByZWYgYW5kIGNvbnZlcnQgdG8gMTZiLgotICAgIGNvbnN0IF9fbTEyOGkgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlswICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSByZWYxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlszICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSByZWZfMCA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjAsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYxLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZl8yID0gX21tX3VucGFja2xvX2VwaTgocmVmMiwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSByZWZfMyA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjMsIHplcm8pOwotICAgIC8vIENvbXB1dGUgZGlmZmVyZW5jZS4gLT4gMDAgMDEgMDIgMDMgMDAgMDAgMDAgMDAKLSAgICBjb25zdCBfX20xMjhpIGRpZmYwID0gX21tX3N1Yl9lcGkxNihzcmNfMCwgcmVmXzApOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjEgPSBfbW1fc3ViX2VwaTE2KHNyY18xLCByZWZfMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkaWZmMiA9IF9tbV9zdWJfZXBpMTYoc3JjXzIsIHJlZl8yKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYzID0gX21tX3N1Yl9lcGkxNihzcmNfMywgcmVmXzMpOwotCi0KLSAgICAvLyBVbnBhY2sgYW5kIHNodWZmbGUKLSAgICAvLyAwMCAwMSAwMiAwMyAgIDAgMCAwIDAKLSAgICAvLyAxMCAxMSAxMiAxMyAgIDAgMCAwIDAKLSAgICAvLyAyMCAyMSAyMiAyMyAgIDAgMCAwIDAKLSAgICAvLyAzMCAzMSAzMiAzMyAgIDAgMCAwIDAKLSAgICBjb25zdCBfX20xMjhpIHNodWYwMSA9IF9tbV91bnBhY2tsb19lcGkzMihkaWZmMCwgZGlmZjEpOwotICAgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYyLCBkaWZmMyk7Ci0gICAgLy8gMDAgMDEgMTAgMTEgMDIgMDMgMTIgMTMKLSAgICAvLyAyMCAyMSAzMCAzMSAyMiAyMyAzMiAzMwotICAgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxX3AgPQotICAgICAgICBfbW1fc2h1ZmZsZWhpX2VwaTE2KHNodWYwMSwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOwotICAgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzX3AgPQotICAgICAgICBfbW1fc2h1ZmZsZWhpX2VwaTE2KHNodWYyMywgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOwotICAgIC8vIDAwIDAxIDEwIDExIDAzIDAyIDEzIDEyCi0gICAgLy8gMjAgMjEgMzAgMzEgMjMgMjIgMzMgMzIKLSAgICBjb25zdCBfX20xMjhpIHMwMSA9IF9tbV91bnBhY2tsb19lcGk2NChzaHVmMDFfcCwgc2h1ZjIzX3ApOwotICAgIGNvbnN0IF9fbTEyOGkgczMyID0gX21tX3VucGFja2hpX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7Ci0gICAgLy8gMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEKLSAgICAvLyAwMyAwMiAxMyAxMiAyMyAyMiAzMyAzMgotICAgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX2FkZF9lcGkxNihzMDEsIHMzMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMzIgPSBfbW1fc3ViX2VwaTE2KHMwMSwgczMyKTsKLSAgICAvLyBbZDAgKyBkMyB8IGQxICsgZDIgfCAuLi5dID0gW2EwIGExIHwgYTAnIGExJyB8IC4uLiBdCi0gICAgLy8gW2QwIC0gZDMgfCBkMSAtIGQyIHwgLi4uXSA9IFthMyBhMiB8IGEzJyBhMicgfCAuLi4gXQotCi0gICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhwKTsgIC8vIFsgKGEwICsgYTEpIDw8IDMsIC4uLiBdCi0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhtKTsgIC8vIFsgKGEwIC0gYTEpIDw8IDMsIC4uLiBdCi0gICAgY29uc3QgX19tMTI4aSB0bXAxXzEgPSBfbW1fbWFkZF9lcGkxNihhMzIsIGs1MzUyXzIyMTdwKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDNfMSA9IF9tbV9tYWRkX2VwaTE2KGEzMiwgazUzNTJfMjIxN20pOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMV8yID0gX21tX2FkZF9lcGkzMih0bXAxXzEsIGsxODEyKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDNfMiA9IF9tbV9hZGRfZXBpMzIodG1wM18xLCBrOTM3KTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDEgICA9IF9tbV9zcmFpX2VwaTMyKHRtcDFfMiwgOSk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAzICAgPSBfbW1fc3JhaV9lcGkzMih0bXAzXzIsIDkpOwotICAgIGNvbnN0IF9fbTEyOGkgczAzID0gX21tX3BhY2tzX2VwaTMyKHRtcDAsIHRtcDIpOwotICAgIGNvbnN0IF9fbTEyOGkgczEyID0gX21tX3BhY2tzX2VwaTMyKHRtcDEsIHRtcDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc19sbyA9IF9tbV91bnBhY2tsb19lcGkxNihzMDMsIHMxMik7ICAgLy8gMCAxIDAgMSAwIDEuLi4KLSAgICBjb25zdCBfX20xMjhpIHNfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoczAzLCBzMTIpOyAgIC8vIDIgMyAyIDMgMiAzCi0gICAgY29uc3QgX19tMTI4aSB2MjMgPSBfbW1fdW5wYWNraGlfZXBpMzIoc19sbywgc19oaSk7Ci0gICAgdjAxID0gX21tX3VucGFja2xvX2VwaTMyKHNfbG8sIHNfaGkpOwotICAgIHYzMiA9IF9tbV9zaHVmZmxlX2VwaTMyKHYyMywgX01NX1NIVUZGTEUoMSwgMCwgMywgMikpOyAgLy8gMyAyIDMgMiAzIDIuLgotICB9Ci0KLSAgLy8gU2Vjb25kIHBhc3MKLSAgewotICAgIC8vIFNhbWUgb3BlcmF0aW9ucyBhcmUgZG9uZSBvbiB0aGUgKDAsMykgYW5kICgxLDIpIHBhaXJzLgotICAgIC8vIGEwID0gdjAgKyB2MwotICAgIC8vIGExID0gdjEgKyB2MgotICAgIC8vIGEzID0gdjAgLSB2MwotICAgIC8vIGEyID0gdjEgLSB2MgotICAgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX2FkZF9lcGkxNih2MDEsIHYzMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMzIgPSBfbW1fc3ViX2VwaTE2KHYwMSwgdjMyKTsKLSAgICBjb25zdCBfX20xMjhpIGExMSA9IF9tbV91bnBhY2toaV9lcGk2NChhMDEsIGEwMSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTMyLCBhMzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTAxX3BsdXNfNyA9IF9tbV9hZGRfZXBpMTYoYTAxLCBzZXZlbik7Ci0KLSAgICAvLyBkMCA9IChhMCArIGExICsgNykgPj4gNDsKLSAgICAvLyBkMiA9IChhMCAtIGExICsgNykgPj4gNDsKLSAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX2FkZF9lcGkxNihhMDFfcGx1c183LCBhMTEpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fc3ViX2VwaTE2KGEwMV9wbHVzXzcsIGExMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zcmFpX2VwaTE2KGMwLCA0KTsKLSAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX3NyYWlfZXBpMTYoYzIsIDQpOwotCi0gICAgLy8gZjEgPSAoKGIzICogNTM1MiArIGIyICogMjIxNyArIDEyMDAwKSA+PiAxNikKLSAgICAvLyBmMyA9ICgoYjMgKiAyMjE3IC0gYjIgKiA1MzUyICsgNTEwMDApID4+IDE2KQotICAgIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTE2KGEyMiwgYTMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX21hZGRfZXBpMTYoYjIzLCBrNTM1Ml8yMjE3KTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX21hZGRfZXBpMTYoYjIzLCBrMjIxN181MzUyKTsKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX2FkZF9lcGkzMihjMSwgazEyMDAwX3BsdXNfb25lKTsKLSAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkzMihjMywgazUxMDAwKTsKLSAgICBjb25zdCBfX20xMjhpIGUxID0gX21tX3NyYWlfZXBpMzIoZDEsIDE2KTsKLSAgICBjb25zdCBfX20xMjhpIGUzID0gX21tX3NyYWlfZXBpMzIoZDMsIDE2KTsKLSAgICBjb25zdCBfX20xMjhpIGYxID0gX21tX3BhY2tzX2VwaTMyKGUxLCBlMSk7Ci0gICAgY29uc3QgX19tMTI4aSBmMyA9IF9tbV9wYWNrc19lcGkzMihlMywgZTMpOwotICAgIC8vIGYxID0gZjEgKyAoYTMgIT0gMCk7Ci0gICAgLy8gVGhlIGNvbXBhcmUgd2lsbCByZXR1cm4gKDB4ZmZmZiwgMCkgZm9yICg9PTAsICE9MCkuIFRvIHR1cm4gdGhhdCBpbnRvIHRoZQotICAgIC8vIGRlc2lyZWQgKDAsIDEpLCB3ZSBhZGQgb25lIGVhcmxpZXIgdGhyb3VnaCBrMTIwMDBfcGx1c19vbmUuCi0gICAgLy8gLT4gZjEgPSBmMSArIDEgLSAoYTMgPT0gMCkKLSAgICBjb25zdCBfX20xMjhpIGcxID0gX21tX2FkZF9lcGkxNihmMSwgX21tX2NtcGVxX2VwaTE2KGEzMiwgemVybykpOwotCi0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgMF0sIGQwKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyA0XSwgZzEpOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDhdLCBkMik7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsxMl0sIGYzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUU1NFMihjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGludDE2X3QgdG1wWzE2XTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IDY0KSB7Ci0gICAgY29uc3QgaW50IGEwID0gKGluWzAgKiAxNl0gKyBpblsyICogMTZdKTsKLSAgICBjb25zdCBpbnQgYTEgPSAoaW5bMSAqIDE2XSArIGluWzMgKiAxNl0pOwotICAgIGNvbnN0IGludCBhMiA9IChpblsxICogMTZdIC0gaW5bMyAqIDE2XSk7Ci0gICAgY29uc3QgaW50IGEzID0gKGluWzAgKiAxNl0gLSBpblsyICogMTZdKTsKLSAgICB0bXBbMCArIGkgKiA0XSA9IGEwICsgYTE7Ci0gICAgdG1wWzEgKyBpICogNF0gPSBhMyArIGEyOwotICAgIHRtcFsyICsgaSAqIDRdID0gYTMgLSBhMjsKLSAgICB0bXBbMyArIGkgKiA0XSA9IGEwIC0gYTE7Ci0gIH0KLSAgewotICAgIGNvbnN0IF9fbTEyOGkgc3JjMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnRtcFswXSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmdG1wWzRdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZ0bXBbOF0pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnRtcFsxMl0pOwotICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHNyYzAsIHNyYzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHNyYzEsIHNyYzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHNyYzEsIHNyYzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHNyYzAsIHNyYzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fc3JhaV9lcGkxNihfbW1fYWRkc19lcGkxNihhMCwgYTEpLCAxKTsKLSAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3NyYWlfZXBpMTYoX21tX2FkZHNfZXBpMTYoYTMsIGEyKSwgMSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zcmFpX2VwaTE2KF9tbV9zdWJzX2VwaTE2KGEzLCBhMiksIDEpOwotICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3JhaV9lcGkxNihfbW1fc3Vic19lcGkxNihhMCwgYTEpLCAxKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyAwXSwgYjApOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDRdLCBiMSk7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgOF0sIGIyKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WzEyXSwgYjMpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZXRyaWMKLQotc3RhdGljIGludCBTU0VfTng0U1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3F1YWRzLCBpbnQgZG9fMTYpIHsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgX19tMTI4aSBzdW0xID0gemVybzsKLSAgX19tMTI4aSBzdW0yID0gemVybzsKLQotICB3aGlsZSAobnVtX3F1YWRzLS0gPiAwKSB7Ci0gICAgLy8gTm90ZTogZm9yIHRoZSAhZG9fMTYgY2FzZSwgd2UgcmVhZCAxNiBwaXhlbHMgaW5zdGVhZCBvZiA4IGJ1dCB0aGF0J3Mgb2ssCi0gICAgLy8gdGhhbmtzIHRvIGJ1ZmZlciBvdmVyLWFsbG9jYXRpb24gdG8gdGhhdCBlZmZlY3QuCi0gICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFbQlBTICogMF0pOwotICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYVtCUFMgKiAyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFbQlBTICogM10pOwotICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZiW0JQUyAqIDBdKTsKLSAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYltCUFMgKiAxXSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmJbQlBTICogMl0pOwotICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZiW0JQUyAqIDNdKTsKLQotICAgIC8vIGNvbXB1dGUgY2xpcDAoYS1iKSBhbmQgY2xpcDAoYi1hKQotICAgIGNvbnN0IF9fbTEyOGkgYTBwID0gX21tX3N1YnNfZXB1OChhMCwgYjApOwotICAgIGNvbnN0IF9fbTEyOGkgYTBtID0gX21tX3N1YnNfZXB1OChiMCwgYTApOwotICAgIGNvbnN0IF9fbTEyOGkgYTFwID0gX21tX3N1YnNfZXB1OChhMSwgYjEpOwotICAgIGNvbnN0IF9fbTEyOGkgYTFtID0gX21tX3N1YnNfZXB1OChiMSwgYTEpOwotICAgIGNvbnN0IF9fbTEyOGkgYTJwID0gX21tX3N1YnNfZXB1OChhMiwgYjIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTJtID0gX21tX3N1YnNfZXB1OChiMiwgYTIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTNwID0gX21tX3N1YnNfZXB1OChhMywgYjMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTNtID0gX21tX3N1YnNfZXB1OChiMywgYTMpOwotCi0gICAgLy8gY29tcHV0ZSB8YS1ifCB3aXRoIDhiIGFyaXRobWV0aWMgYXMgY2xpcDAoYS1iKSB8IGNsaXAwKGItYSkKLSAgICBjb25zdCBfX20xMjhpIGRpZmYwID0gX21tX29yX3NpMTI4KGEwcCwgYTBtKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYxID0gX21tX29yX3NpMTI4KGExcCwgYTFtKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYyID0gX21tX29yX3NpMTI4KGEycCwgYTJtKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYzID0gX21tX29yX3NpMTI4KGEzcCwgYTNtKTsKLQotICAgIC8vIHVucGFjayAob25seSBmb3VyIG9wZXJhdGlvbnMsIGluc3RlYWQgb2YgZWlnaHQpCi0gICAgY29uc3QgX19tMTI4aSBsb3cwID0gX21tX3VucGFja2xvX2VwaTgoZGlmZjAsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgbG93MSA9IF9tbV91bnBhY2tsb19lcGk4KGRpZmYxLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIGxvdzIgPSBfbW1fdW5wYWNrbG9fZXBpOChkaWZmMiwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3czID0gX21tX3VucGFja2xvX2VwaTgoZGlmZjMsIHplcm8pOwotCi0gICAgLy8gbXVsdGlwbHkgd2l0aCBzZWxmCi0gICAgY29uc3QgX19tMTI4aSBsb3dfbWFkZDAgPSBfbW1fbWFkZF9lcGkxNihsb3cwLCBsb3cwKTsKLSAgICBjb25zdCBfX20xMjhpIGxvd19tYWRkMSA9IF9tbV9tYWRkX2VwaTE2KGxvdzEsIGxvdzEpOwotICAgIGNvbnN0IF9fbTEyOGkgbG93X21hZGQyID0gX21tX21hZGRfZXBpMTYobG93MiwgbG93Mik7Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfbWFkZDMgPSBfbW1fbWFkZF9lcGkxNihsb3czLCBsb3czKTsKLQotICAgIC8vIGNvbGxlY3QgaW4gYSBjYXNjYWRpbmcgd2F5Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfc3VtMCA9IF9tbV9hZGRfZXBpMzIobG93X21hZGQwLCBsb3dfbWFkZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgbG93X3N1bTEgPSBfbW1fYWRkX2VwaTMyKGxvd19tYWRkMiwgbG93X21hZGQzKTsKLSAgICBzdW0xID0gX21tX2FkZF9lcGkzMihzdW0xLCBsb3dfc3VtMCk7Ci0gICAgc3VtMiA9IF9tbV9hZGRfZXBpMzIoc3VtMiwgbG93X3N1bTEpOwotCi0gICAgaWYgKGRvXzE2KSB7ICAvLyBpZiBuZWNlc3NhcnksIHByb2Nlc3MgdGhlIGhpZ2hlciA4IGJ5dGVzIHNpbWlsYXJseQotICAgICAgY29uc3QgX19tMTI4aSBoaTAgPSBfbW1fdW5wYWNraGlfZXBpOChkaWZmMCwgemVybyk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpMSA9IF9tbV91bnBhY2toaV9lcGk4KGRpZmYxLCB6ZXJvKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGkyID0gX21tX3VucGFja2hpX2VwaTgoZGlmZjIsIHplcm8pOwotICAgICAgY29uc3QgX19tMTI4aSBoaTMgPSBfbW1fdW5wYWNraGlfZXBpOChkaWZmMywgemVybyk7Ci0KLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfbWFkZDAgPSBfbW1fbWFkZF9lcGkxNihoaTAsIGhpMCk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpX21hZGQxID0gX21tX21hZGRfZXBpMTYoaGkxLCBoaTEpOwotICAgICAgY29uc3QgX19tMTI4aSBoaV9tYWRkMiA9IF9tbV9tYWRkX2VwaTE2KGhpMiwgaGkyKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfbWFkZDMgPSBfbW1fbWFkZF9lcGkxNihoaTMsIGhpMyk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpX3N1bTAgPSBfbW1fYWRkX2VwaTMyKGhpX21hZGQwLCBoaV9tYWRkMSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpX3N1bTEgPSBfbW1fYWRkX2VwaTMyKGhpX21hZGQyLCBoaV9tYWRkMyk7Ci0gICAgICBzdW0xID0gX21tX2FkZF9lcGkzMihzdW0xLCBoaV9zdW0wKTsKLSAgICAgIHN1bTIgPSBfbW1fYWRkX2VwaTMyKHN1bTIsIGhpX3N1bTEpOwotICAgIH0KLSAgICBhICs9IDQgKiBCUFM7Ci0gICAgYiArPSA0ICogQlBTOwotICB9Ci0gIHsKLSAgICBpbnQzMl90IHRtcFs0XTsKLSAgICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtMSwgc3VtMik7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOwotICAgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFNTRTE2eDE2U1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIHJldHVybiBTU0VfTng0U1NFMihhLCBiLCA0LCAxKTsKLX0KLQotc3RhdGljIGludCBTU0UxNng4U1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIHJldHVybiBTU0VfTng0U1NFMihhLCBiLCAyLCAxKTsKLX0KLQotc3RhdGljIGludCBTU0U4eDhTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIFNTRV9OeDRTU0UyKGEsIGIsIDIsIDApOwotfQotCi1zdGF0aWMgaW50IFNTRTR4NFNTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgewotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotCi0gIC8vIExvYWQgdmFsdWVzLiBOb3RlIHRoYXQgd2UgcmVhZCA4IHBpeGVscyBpbnN0ZWFkIG9mIDQsCi0gIC8vIGJ1dCB0aGUgYS9iIGJ1ZmZlcnMgYXJlIG92ZXItYWxsb2NhdGVkIHRvIHRoYXQgZWZmZWN0LgotICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYVtCUFMgKiAwXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZhW0JQUyAqIDFdKTsKLSAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmFbQlBTICogMl0pOwotICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYVtCUFMgKiAzXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZiW0JQUyAqIDBdKTsKLSAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmJbQlBTICogMV0pOwotICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYltCUFMgKiAyXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZiW0JQUyAqIDNdKTsKLQotICAvLyBDb21iaW5lIHBhaXIgb2YgbGluZXMgYW5kIGNvbnZlcnQgdG8gMTZiLgotICBjb25zdCBfX20xMjhpIGEwMSA9IF9tbV91bnBhY2tsb19lcGkzMihhMCwgYTEpOwotICBjb25zdCBfX20xMjhpIGEyMyA9IF9tbV91bnBhY2tsb19lcGkzMihhMiwgYTMpOwotICBjb25zdCBfX20xMjhpIGIwMSA9IF9tbV91bnBhY2tsb19lcGkzMihiMCwgYjEpOwotICBjb25zdCBfX20xMjhpIGIyMyA9IF9tbV91bnBhY2tsb19lcGkzMihiMiwgYjMpOwotICBjb25zdCBfX20xMjhpIGEwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChhMDEsIHplcm8pOwotICBjb25zdCBfX20xMjhpIGEyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChhMjMsIHplcm8pOwotICBjb25zdCBfX20xMjhpIGIwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChiMDEsIHplcm8pOwotICBjb25zdCBfX20xMjhpIGIyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChiMjMsIHplcm8pOwotCi0gIC8vIENvbXB1dGUgZGlmZmVyZW5jZXM7IChhLWIpXjIgPSAoYWJzKGEtYikpXjIgPSAoc2F0OChhLWIpICsgc2F0OChiLWEpKV4yCi0gIC8vIFRPRE8oY2R1dml2aWVyKTogRGlzc2Fzc2VtYmxlIGFuZCBmaWd1cmUgb3V0IHdoeSB0aGlzIGlzIGZhc3Rlc3QuIFdlIGRvbid0Ci0gIC8vICAgICAgICAgICAgICAgICAgbmVlZCBhYnNvbHV0ZSB2YWx1ZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gY2FsY3VsYXRpb24KLSAgLy8gICAgICAgICAgICAgICAgICBpbiA4Yml0IGFzIHdlIGFyZSBhbHJlYWR5IGluIDE2Yml0LCAuLi4gWWV0IHRoaXMgaXMgd2hhdAotICAvLyAgICAgICAgICAgICAgICAgIGJlbmNobWFya3MgdGhlIGZhc3Rlc3QhCi0gIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3Vic19lcHU4KGEwMXMsIGIwMXMpOwotICBjb25zdCBfX20xMjhpIGQxID0gX21tX3N1YnNfZXB1OChiMDFzLCBhMDFzKTsKLSAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9zdWJzX2VwdTgoYTIzcywgYjIzcyk7Ci0gIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fc3Vic19lcHU4KGIyM3MsIGEyM3MpOwotCi0gIC8vIFNxdWFyZSBhbmQgYWRkIHRoZW0gYWxsIHRvZ2V0aGVyLgotICBjb25zdCBfX20xMjhpIG1hZGQwID0gX21tX21hZGRfZXBpMTYoZDAsIGQwKTsKLSAgY29uc3QgX19tMTI4aSBtYWRkMSA9IF9tbV9tYWRkX2VwaTE2KGQxLCBkMSk7Ci0gIGNvbnN0IF9fbTEyOGkgbWFkZDIgPSBfbW1fbWFkZF9lcGkxNihkMiwgZDIpOwotICBjb25zdCBfX20xMjhpIG1hZGQzID0gX21tX21hZGRfZXBpMTYoZDMsIGQzKTsKLSAgY29uc3QgX19tMTI4aSBzdW0wID0gX21tX2FkZF9lcGkzMihtYWRkMCwgbWFkZDEpOwotICBjb25zdCBfX20xMjhpIHN1bTEgPSBfbW1fYWRkX2VwaTMyKG1hZGQyLCBtYWRkMyk7Ci0gIGNvbnN0IF9fbTEyOGkgc3VtMiA9IF9tbV9hZGRfZXBpMzIoc3VtMCwgc3VtMSk7Ci0KLSAgaW50MzJfdCB0bXBbNF07Ci0gIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtMik7Ci0gIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRleHR1cmUgZGlzdG9ydGlvbgotLy8KLS8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAotLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgotCi0vLyBIYWRhbWFyZCB0cmFuc2Zvcm0KLS8vIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZgotLy8gdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgotc3RhdGljIGludCBUVHJhbnNmb3JtU1NFMihjb25zdCB1aW50OF90KiBpbkEsIGNvbnN0IHVpbnQ4X3QqIGluQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKLSAgaW50MzJfdCBzdW1bNF07Ci0gIF9fbTEyOGkgdG1wXzAsIHRtcF8xLCB0bXBfMiwgdG1wXzM7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0KLSAgLy8gTG9hZCwgY29tYmluZSBhbmQgdHJhbnBvc2UgaW5wdXRzLgotICB7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFfMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQVtCUFMgKiAwXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFfMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQVtCUFMgKiAxXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFfMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQVtCUFMgKiAyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFfMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQVtCUFMgKiAzXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkJfMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQltCUFMgKiAwXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkJfMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQltCUFMgKiAxXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkJfMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQltCUFMgKiAyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkJfMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluQltCUFMgKiAzXSk7Ci0KLSAgICAvLyBDb21iaW5lIGluQSBhbmQgaW5CICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuCi0gICAgY29uc3QgX19tMTI4aSBpbkFCXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFfMCwgaW5CXzApOwotICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8xID0gX21tX3VucGFja2xvX2VwaTgoaW5BXzEsIGluQl8xKTsKLSAgICBjb25zdCBfX20xMjhpIGluQUJfMiA9IF9tbV91bnBhY2tsb19lcGk4KGluQV8yLCBpbkJfMik7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFCXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFfMywgaW5CXzMpOwotICAgIC8vIGEwMCBiMDAgYTAxIGIwMSBhMDIgYjAzIGEwMyBiMDMgICAwIDAgMCAwIDAgMCAwIDAKLSAgICAvLyBhMTAgYjEwIGExMSBiMTEgYTEyIGIxMiBhMTMgYjEzICAgMCAwIDAgMCAwIDAgMCAwCi0gICAgLy8gYTIwIGIyMCBhMjEgYjIxIGEyMiBiMjIgYTIzIGIyMyAgIDAgMCAwIDAgMCAwIDAgMAotICAgIC8vIGEzMCBiMzAgYTMxIGIzMSBhMzIgYjMyIGEzMyBiMzMgICAwIDAgMCAwIDAgMCAwIDAKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NCwgZGlzY2FyZGluZyB0aGUgZmlsbGluZyB6ZXJvZXMuCi0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzAsIGluQUJfMik7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzEsIGluQUJfMyk7Ci0gICAgLy8gYTAwIGEyMCAgYjAwIGIyMCAgYTAxIGEyMSAgYjAxIGIyMSAgYTAyIGEyMiAgYjAyIGIyMiAgYTAzIGEyMyAgYjAzIGIyMwotICAgIC8vIGExMCBhMzAgIGIxMCBiMzAgIGExMSBhMzEgIGIxMSBiMzEgIGExMiBhMzIgIGIxMiBiMzIgIGExMyBhMzMgIGIxMyBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGk4KHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2toaV9lcGk4KHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgIGIwMCBiMTAgYjIwIGIzMCAgYTAxIGExMSBhMjEgYTMxICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgIGIwMiBiMTIgYjIyIGIzMiAgYTAzIGExMyBhMjMgYTMzICBiMDMgYjEzIGIyMyBiMzMKLQotICAgIC8vIENvbnZlcnQgdG8gMTZiLgotICAgIHRtcF8wID0gX21tX3VucGFja2xvX2VwaTgodHJhbnNwb3NlMV8wLCB6ZXJvKTsKLSAgICB0bXBfMSA9IF9tbV91bnBhY2toaV9lcGk4KHRyYW5zcG9zZTFfMCwgemVybyk7Ci0gICAgdG1wXzIgPSBfbW1fdW5wYWNrbG9fZXBpOCh0cmFuc3Bvc2UxXzEsIHplcm8pOwotICAgIHRtcF8zID0gX21tX3VucGFja2hpX2VwaTgodHJhbnNwb3NlMV8xLCB6ZXJvKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKLSAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKLSAgfQotCi0gIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBDYWxjdWxhdGUgYSBhbmQgYiAodHdvIDR4NCBhdCBvbmNlKS4KLSAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkxNih0bXBfMCwgdG1wXzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHRtcF8xLCB0bXBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYodG1wXzEsIHRtcF8zKTsKLSAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkxNih0bXBfMCwgdG1wXzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYWRkX2VwaTE2KGEwLCBhMSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hZGRfZXBpMTYoYTMsIGEyKTsKLSAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3N1Yl9lcGkxNihhMywgYTIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3ViX2VwaTE2KGEwLCBhMSk7Ci0gICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCi0gICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCi0gICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCi0gICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCi0KLSAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCi0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYjAsIGIxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGkxNihiMiwgYjMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KGIwLCBiMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzMgPSBfbW1fdW5wYWNraGlfZXBpMTYoYjIsIGIzKTsKLSAgICAvLyBhMDAgYTEwIGEwMSBhMTEgICBhMDIgYTEyIGEwMyBhMTMKLSAgICAvLyBhMjAgYTMwIGEyMSBhMzEgICBhMjIgYTMyIGEyMyBhMzMKLSAgICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKLSAgICAvLyBiMjAgYjMwIGIyMSBiMzEgICBiMjIgYjMyIGIyMyBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8yID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMyA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQotICAgIC8vIGIwMCBiMTAgYjIwIGIzMCBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgYTAzIGExMyBhMjMgYTMzCi0gICAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMwotICAgIHRtcF8wID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICB0bXBfMSA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgdG1wXzIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIHRtcF8zID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKLSAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKLSAgfQotCi0gIC8vIFZlcnRpY2FsIHBhc3MgYW5kIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3Vtcy4KLSAgewotICAgIC8vIExvYWQgYWxsIGlucHV0cy4KLSAgICAvLyBUT0RPKGNkdXZpdmllcik6IE1ha2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBhbGxvY2F0aW9ucyBhbGlnbmVkIHNvCi0gICAgLy8gICAgICAgICAgICAgICAgICB3ZSBjYW4gdXNlIF9tbV9sb2FkX3NpMTI4IGluc3RlYWQgb2YgX21tX2xvYWR1X3NpMTI4LgotICAgIGNvbnN0IF9fbTEyOGkgd18wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmd1swXSk7Ci0gICAgY29uc3QgX19tMTI4aSB3XzggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZ3WzhdKTsKLQotICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgotICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKLSAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKLSAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKLQotICAgIC8vIFNlcGFyYXRlIHRoZSB0cmFuc2Zvcm1zIG9mIGluQSBhbmQgaW5CLgotICAgIF9fbTEyOGkgQV9iMCA9IF9tbV91bnBhY2tsb19lcGk2NChiMCwgYjEpOwotICAgIF9fbTEyOGkgQV9iMiA9IF9tbV91bnBhY2tsb19lcGk2NChiMiwgYjMpOwotICAgIF9fbTEyOGkgQl9iMCA9IF9tbV91bnBhY2toaV9lcGk2NChiMCwgYjEpOwotICAgIF9fbTEyOGkgQl9iMiA9IF9tbV91bnBhY2toaV9lcGk2NChiMiwgYjMpOwotCi0gICAgewotICAgICAgLy8gc2lnbihiKSA9IGIgPj4gMTUgICgweDAwMDAgaWYgcG9zaXRpdmUsIDB4ZmZmZiBpZiBuZWdhdGl2ZSkKLSAgICAgIGNvbnN0IF9fbTEyOGkgc2lnbl9BX2IwID0gX21tX3NyYWlfZXBpMTYoQV9iMCwgMTUpOwotICAgICAgY29uc3QgX19tMTI4aSBzaWduX0FfYjIgPSBfbW1fc3JhaV9lcGkxNihBX2IyLCAxNSk7Ci0gICAgICBjb25zdCBfX20xMjhpIHNpZ25fQl9iMCA9IF9tbV9zcmFpX2VwaTE2KEJfYjAsIDE1KTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgc2lnbl9CX2IyID0gX21tX3NyYWlfZXBpMTYoQl9iMiwgMTUpOwotCi0gICAgICAvLyBiID0gYWJzKGIpID0gKGIgXiBzaWduKSAtIHNpZ24KLSAgICAgIEFfYjAgPSBfbW1feG9yX3NpMTI4KEFfYjAsIHNpZ25fQV9iMCk7Ci0gICAgICBBX2IyID0gX21tX3hvcl9zaTEyOChBX2IyLCBzaWduX0FfYjIpOwotICAgICAgQl9iMCA9IF9tbV94b3Jfc2kxMjgoQl9iMCwgc2lnbl9CX2IwKTsKLSAgICAgIEJfYjIgPSBfbW1feG9yX3NpMTI4KEJfYjIsIHNpZ25fQl9iMik7Ci0gICAgICBBX2IwID0gX21tX3N1Yl9lcGkxNihBX2IwLCBzaWduX0FfYjApOwotICAgICAgQV9iMiA9IF9tbV9zdWJfZXBpMTYoQV9iMiwgc2lnbl9BX2IyKTsKLSAgICAgIEJfYjAgPSBfbW1fc3ViX2VwaTE2KEJfYjAsIHNpZ25fQl9iMCk7Ci0gICAgICBCX2IyID0gX21tX3N1Yl9lcGkxNihCX2IyLCBzaWduX0JfYjIpOwotICAgIH0KLQotICAgIC8vIHdlaWdodGVkIHN1bXMKLSAgICBBX2IwID0gX21tX21hZGRfZXBpMTYoQV9iMCwgd18wKTsKLSAgICBBX2IyID0gX21tX21hZGRfZXBpMTYoQV9iMiwgd184KTsKLSAgICBCX2IwID0gX21tX21hZGRfZXBpMTYoQl9iMCwgd18wKTsKLSAgICBCX2IyID0gX21tX21hZGRfZXBpMTYoQl9iMiwgd184KTsKLSAgICBBX2IwID0gX21tX2FkZF9lcGkzMihBX2IwLCBBX2IyKTsKLSAgICBCX2IwID0gX21tX2FkZF9lcGkzMihCX2IwLCBCX2IyKTsKLQotICAgIC8vIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3VtcwotICAgIEFfYjAgPSBfbW1fc3ViX2VwaTMyKEFfYjAsIEJfYjApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZzdW1bMF0sIEFfYjApOwotICB9Ci0gIHJldHVybiBzdW1bMF0gKyBzdW1bMV0gKyBzdW1bMl0gKyBzdW1bM107Ci19Ci0KLXN0YXRpYyBpbnQgRGlzdG80eDRTU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBjb25zdCBpbnQgZGlmZl9zdW0gPSBUVHJhbnNmb3JtU1NFMihhLCBiLCB3KTsKLSAgcmV0dXJuIGFicyhkaWZmX3N1bSkgPj4gNTsKLX0KLQotc3RhdGljIGludCBEaXN0bzE2eDE2U1NFMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBpbnQgRCA9IDA7Ci0gIGludCB4LCB5OwotICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgewotICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7Ci0gICAgICBEICs9IERpc3RvNHg0U1NFMihhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBEOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUXVhbnRpemF0aW9uCi0vLwotCi0vLyBTaW1wbGUgcXVhbnRpemF0aW9uCi1zdGF0aWMgaW50IFF1YW50aXplQmxvY2tTU0UyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgewotICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl8yMDQ3ID0gX21tX3NldDFfZXBpMTYoTUFYX0xFVkVMKTsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgX19tMTI4aSBjb2VmZjAsIGNvZWZmODsKLSAgX19tMTI4aSBvdXQwLCBvdXQ4OwotICBfX20xMjhpIHBhY2tlZF9vdXQ7Ci0KLSAgLy8gTG9hZCBhbGwgaW5wdXRzLgotICAvLyBUT0RPKGNkdXZpdmllcik6IE1ha2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBhbGxvY2F0aW9ucyBhbGlnbmVkIHNvIHRoYXQKLSAgLy8gICAgICAgICAgICAgICAgICB3ZSBjYW4gdXNlIF9tbV9sb2FkX3NpMTI4IGluc3RlYWQgb2YgX21tX2xvYWR1X3NpMTI4LgotICBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzBdKTsKLSAgX19tMTI4aSBpbjggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnNoYXJwZW5fWzBdKTsKLSAgY29uc3QgX19tMTI4aSBzaGFycGVuOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+c2hhcnBlbl9bOF0pOwotICBjb25zdCBfX20xMjhpIGlxMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+aXFfWzBdKTsKLSAgY29uc3QgX19tMTI4aSBpcTggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPmlxX1s4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgYmlhczAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPmJpYXNfWzBdKTsKLSAgY29uc3QgX19tMTI4aSBiaWFzOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+Ymlhc19bOF0pOwotICBjb25zdCBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5xX1swXSk7Ci0gIGNvbnN0IF9fbTEyOGkgcTggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnFfWzhdKTsKLSAgY29uc3QgX19tMTI4aSB6dGhyZXNoMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+enRocmVzaF9bMF0pOwotICBjb25zdCBfX20xMjhpIHp0aHJlc2g4ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT56dGhyZXNoX1s4XSk7Ci0KLSAgLy8gc2lnbihpbikgPSBpbiA+PiAxNSAgKDB4MDAwMCBpZiBwb3NpdGl2ZSwgMHhmZmZmIGlmIG5lZ2F0aXZlKQotICBjb25zdCBfX20xMjhpIHNpZ24wID0gX21tX3NyYWlfZXBpMTYoaW4wLCAxNSk7Ci0gIGNvbnN0IF9fbTEyOGkgc2lnbjggPSBfbW1fc3JhaV9lcGkxNihpbjgsIDE1KTsKLQotICAvLyBjb2VmZiA9IGFicyhpbikgPSAoaW4gXiBzaWduKSAtIHNpZ24KLSAgY29lZmYwID0gX21tX3hvcl9zaTEyOChpbjAsIHNpZ24wKTsKLSAgY29lZmY4ID0gX21tX3hvcl9zaTEyOChpbjgsIHNpZ244KTsKLSAgY29lZmYwID0gX21tX3N1Yl9lcGkxNihjb2VmZjAsIHNpZ24wKTsKLSAgY29lZmY4ID0gX21tX3N1Yl9lcGkxNihjb2VmZjgsIHNpZ244KTsKLQotICAvLyBjb2VmZiA9IGFicyhpbikgKyBzaGFycGVuCi0gIGNvZWZmMCA9IF9tbV9hZGRfZXBpMTYoY29lZmYwLCBzaGFycGVuMCk7Ci0gIGNvZWZmOCA9IF9tbV9hZGRfZXBpMTYoY29lZmY4LCBzaGFycGVuOCk7Ci0KLSAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKSA+PiBRRklYOwotICB7Ci0gICAgLy8gZG9pbmcgY2FsY3VsYXRpb25zIHdpdGggMzJiIHByZWNpc2lvbiAoUUZJWD0xNykKLSAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSkKLSAgICBfX20xMjhpIGNvZWZmX2lRMEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmYwLCBpcTApOwotICAgIF9fbTEyOGkgY29lZmZfaVEwTCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjAsIGlxMCk7Ci0gICAgX19tMTI4aSBjb2VmZl9pUThIID0gX21tX211bGhpX2VwdTE2KGNvZWZmOCwgaXE4KTsKLSAgICBfX20xMjhpIGNvZWZmX2lROEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmY4LCBpcTgpOwotICAgIF9fbTEyOGkgb3V0XzAwID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOwotICAgIF9fbTEyOGkgb3V0XzA0ID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOwotICAgIF9fbTEyOGkgb3V0XzA4ID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOwotICAgIF9fbTEyOGkgb3V0XzEyID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOwotICAgIC8vIGV4cGFuZCBiaWFzIGZyb20gMTZiIHRvIDMyYgotICAgIF9fbTEyOGkgYmlhc18wMCA9IF9tbV91bnBhY2tsb19lcGkxNihiaWFzMCwgemVybyk7Ci0gICAgX19tMTI4aSBiaWFzXzA0ID0gX21tX3VucGFja2hpX2VwaTE2KGJpYXMwLCB6ZXJvKTsKLSAgICBfX20xMjhpIGJpYXNfMDggPSBfbW1fdW5wYWNrbG9fZXBpMTYoYmlhczgsIHplcm8pOwotICAgIF9fbTEyOGkgYmlhc18xMiA9IF9tbV91bnBhY2toaV9lcGkxNihiaWFzOCwgemVybyk7Ci0gICAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKQotICAgIG91dF8wMCA9IF9tbV9hZGRfZXBpMzIob3V0XzAwLCBiaWFzXzAwKTsKLSAgICBvdXRfMDQgPSBfbW1fYWRkX2VwaTMyKG91dF8wNCwgYmlhc18wNCk7Ci0gICAgb3V0XzA4ID0gX21tX2FkZF9lcGkzMihvdXRfMDgsIGJpYXNfMDgpOwotICAgIG91dF8xMiA9IF9tbV9hZGRfZXBpMzIob3V0XzEyLCBiaWFzXzEyKTsKLSAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVg7Ci0gICAgb3V0XzAwID0gX21tX3NyYWlfZXBpMzIob3V0XzAwLCBRRklYKTsKLSAgICBvdXRfMDQgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDQsIFFGSVgpOwotICAgIG91dF8wOCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wOCwgUUZJWCk7Ci0gICAgb3V0XzEyID0gX21tX3NyYWlfZXBpMzIob3V0XzEyLCBRRklYKTsKLQotICAgIC8vIHBhY2sgcmVzdWx0IGFzIDE2YgotICAgIG91dDAgPSBfbW1fcGFja3NfZXBpMzIob3V0XzAwLCBvdXRfMDQpOwotICAgIG91dDggPSBfbW1fcGFja3NfZXBpMzIob3V0XzA4LCBvdXRfMTIpOwotCi0gICAgLy8gaWYgKGNvZWZmID4gMjA0NykgY29lZmYgPSAyMDQ3Ci0gICAgb3V0MCA9IF9tbV9taW5fZXBpMTYob3V0MCwgbWF4X2NvZWZmXzIwNDcpOwotICAgIG91dDggPSBfbW1fbWluX2VwaTE2KG91dDgsIG1heF9jb2VmZl8yMDQ3KTsKLSAgfQotCi0gIC8vIGdldCBzaWduIGJhY2sgKGlmIChzaWduW2pdKSBvdXRfbiA9IC1vdXRfbikKLSAgb3V0MCA9IF9tbV94b3Jfc2kxMjgob3V0MCwgc2lnbjApOwotICBvdXQ4ID0gX21tX3hvcl9zaTEyOChvdXQ4LCBzaWduOCk7Ci0gIG91dDAgPSBfbW1fc3ViX2VwaTE2KG91dDAsIHNpZ24wKTsKLSAgb3V0OCA9IF9tbV9zdWJfZXBpMTYob3V0OCwgc2lnbjgpOwotCi0gIC8vIGluID0gb3V0ICogUQotICBpbjAgPSBfbW1fbXVsbG9fZXBpMTYob3V0MCwgcTApOwotICBpbjggPSBfbW1fbXVsbG9fZXBpMTYob3V0OCwgcTgpOwotCi0gIC8vIGlmIChjb2VmZiA8PSBtdHgtPnp0aHJlc2hfKSB7aW49MDsgb3V0PTA7fQotICB7Ci0gICAgX19tMTI4aSBjbXAwID0gX21tX2NtcGd0X2VwaTE2KGNvZWZmMCwgenRocmVzaDApOwotICAgIF9fbTEyOGkgY21wOCA9IF9tbV9jbXBndF9lcGkxNihjb2VmZjgsIHp0aHJlc2g4KTsKLSAgICBpbjAgPSBfbW1fYW5kX3NpMTI4KGluMCwgY21wMCk7Ci0gICAgaW44ID0gX21tX2FuZF9zaTEyOChpbjgsIGNtcDgpOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSwgaW4wKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmaW5bOF0sIGluOCk7Ci0gICAgb3V0MCA9IF9tbV9hbmRfc2kxMjgob3V0MCwgY21wMCk7Ci0gICAgb3V0OCA9IF9tbV9hbmRfc2kxMjgob3V0OCwgY21wOCk7Ci0gIH0KLQotICAvLyB6aWd6YWcgdGhlIG91dHB1dCBiZWZvcmUgc3RvcmluZyBpdC4KLSAgLy8KLSAgLy8gVGhlIHppZ3phZyBwYXR0ZXJuIGNhbiBhbG1vc3QgYmUgcmVwcm9kdWNlZCB3aXRoIGEgc21hbGwgc2VxdWVuY2Ugb2YKLSAgLy8gc2h1ZmZsZXMuIEFmdGVyIGl0LCB3ZSBvbmx5IG5lZWQgdG8gc3dhcCB0aGUgN3RoIChlbmRpbmcgdXAgaW4gdGhpcmQKLSAgLy8gcG9zaXRpb24gaW5zdGVhZCBvZiB0d2VsZnRoKSBhbmQgOHRoIHZhbHVlcy4KLSAgewotICAgIF9fbTEyOGkgb3V0WjAsIG91dFo4OwotICAgIG91dFowID0gX21tX3NodWZmbGVoaV9lcGkxNihvdXQwLCAgX01NX1NIVUZGTEUoMiwgMSwgMywgMCkpOwotICAgIG91dFowID0gX21tX3NodWZmbGVfZXBpMzIgIChvdXRaMCwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkpOwotICAgIG91dFowID0gX21tX3NodWZmbGVoaV9lcGkxNihvdXRaMCwgX01NX1NIVUZGTEUoMywgMSwgMCwgMikpOwotICAgIG91dFo4ID0gX21tX3NodWZmbGVsb19lcGkxNihvdXQ4LCAgX01NX1NIVUZGTEUoMywgMCwgMiwgMSkpOwotICAgIG91dFo4ID0gX21tX3NodWZmbGVfZXBpMzIgIChvdXRaOCwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkpOwotICAgIG91dFo4ID0gX21tX3NodWZmbGVsb19lcGkxNihvdXRaOCwgX01NX1NIVUZGTEUoMSwgMywgMiwgMCkpOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIG91dFowKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBvdXRaOCk7Ci0gICAgcGFja2VkX291dCA9IF9tbV9wYWNrc19lcGkxNihvdXRaMCwgb3V0WjgpOwotICB9Ci0gIHsKLSAgICBjb25zdCBpbnQxNl90IG91dFpfMTIgPSBvdXRbMTJdOwotICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8zID0gb3V0WzNdOwotICAgIG91dFszXSA9IG91dFpfMTI7Ci0gICAgb3V0WzEyXSA9IG91dFpfMzsKLSAgfQotCi0gIC8vIGRldGVjdCBpZiBhbGwgJ291dCcgdmFsdWVzIGFyZSB6ZXJvZXMgb3Igbm90Ci0gIHsKLSAgICBpbnQzMl90IHRtcFs0XTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHBhY2tlZF9vdXQpOwotICAgIGlmIChuKSB7Ci0gICAgICB0bXBbMF0gJj0gfjB4ZmY7Ci0gICAgfQotICAgIHJldHVybiAodG1wWzNdIHx8IHRtcFsyXSB8fCB0bXBbMV0gfHwgdG1wWzBdKTsKLSAgfQotfQotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1leHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKTsKLQotdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbVNTRTI7Ci0gIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrU1NFMjsKLSAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1TU0UyOwotICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybVNTRTI7Ci0gIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUU1NFMjsKLSAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNlNTRTI7Ci0gIFZQOFNTRTE2eDggPSBTU0UxNng4U1NFMjsKLSAgVlA4U1NFOHg4ID0gU1NFOHg4U1NFMjsKLSAgVlA4U1NFNHg0ID0gU1NFNHg0U1NFMjsKLSAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRTU0UyOwotICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZTU0UyOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfU1NFMgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjZhMjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCi0vLwotLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotLy8gICAgICAgICAgVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLS8vIERlZmluZSB0aGUgZm9sbG93aW5nIGlmIHRhcmdldCBhcmNoIGlzIHN1cmUgdG8gaGF2ZSBTU0UyCi0vLyAjZGVmaW5lIFdFQlBfVEFSR0VUX0hBU19TU0UyCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1RBUkdFVF9IQVNfU1NFMikKLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICIuL2xvc3NsZXNzLmgiCi0jaW5jbHVkZSAiLi4vZGVjL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2RlZmluZSBNQVhfRElGRl9DT1NUICgxZTMwZikKLQotLy8gbG9va3VwIHRhYmxlIGZvciBzbWFsbCB2YWx1ZXMgb2YgbG9nMihpbnQpCi0jZGVmaW5lIEFQUFJPWF9MT0dfTUFYICA0MDk2Ci0jZGVmaW5lIExPR18yX1JFQ0lQUk9DQUwgMS40NDI2OTUwNDA4ODg5NjMzODcwMDQ2NTA5NDAwNzA4NgotY29uc3QgZmxvYXQga0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdID0gewotICAwLjAwMDAwMDAwMDAwMDAwMDBmLCAwLjAwMDAwMDAwMDAwMDAwMDBmLAotICAxLjAwMDAwMDAwMDAwMDAwMDBmLCAxLjU4NDk2MjUwMDcyMTE1NjBmLAotICAyLjAwMDAwMDAwMDAwMDAwMDBmLCAyLjMyMTkyODA5NDg4NzM2MjFmLAotICAyLjU4NDk2MjUwMDcyMTE1NjBmLCAyLjgwNzM1NDkyMjA1NzYwNDFmLAotICAzLjAwMDAwMDAwMDAwMDAwMDBmLCAzLjE2OTkyNTAwMTQ0MjMxMjFmLAotICAzLjMyMTkyODA5NDg4NzM2MjFmLCAzLjQ1OTQzMTYxODYzNzI5NzNmLAotICAzLjU4NDk2MjUwMDcyMTE1NjBmLCAzLjcwMDQzOTcxODE0MTA5MjFmLAotICAzLjgwNzM1NDkyMjA1NzYwNDFmLCAzLjkwNjg5MDU5NTYwODUxODdmLAotICA0LjAwMDAwMDAwMDAwMDAwMDBmLCA0LjA4NzQ2Mjg0MTI1MDMzOTBmLAotICA0LjE2OTkyNTAwMTQ0MjMxMjFmLCA0LjI0NzkyNzUxMzQ0MzU4NTJmLAotICA0LjMyMTkyODA5NDg4NzM2MjZmLCA0LjM5MjMxNzQyMjc3ODc2MDZmLAotICA0LjQ1OTQzMTYxODYzNzI5NzNmLCA0LjUyMzU2MTk1NjA1NzAxMzBmLAotICA0LjU4NDk2MjUwMDcyMTE1NjBmLCA0LjY0Mzg1NjE4OTc3NDcyNDNmLAotICA0LjcwMDQzOTcxODE0MTA5MTdmLCA0Ljc1NDg4NzUwMjE2MzQ2ODJmLAotICA0LjgwNzM1NDkyMjA1NzYwMzdmLCA0Ljg1Nzk4MDk5NTEyNzU3MThmLAotICA0LjkwNjg5MDU5NTYwODUxODdmLCA0Ljk1NDE5NjMxMDM4Njg3NDlmLAotICA1LjAwMDAwMDAwMDAwMDAwMDBmLCA1LjA0NDM5NDExOTM1ODQ1MzNmLAotICA1LjA4NzQ2Mjg0MTI1MDMzOTBmLCA1LjEyOTI4MzAxNjk0NDk2NjNmLAotICA1LjE2OTkyNTAwMTQ0MjMxMjFmLCA1LjIwOTQ1MzM2NTYyODk1MDFmLAotICA1LjI0NzkyNzUxMzQ0MzU4NTJmLCA1LjI4NTQwMjIxODg2MjI0ODdmLAotICA1LjMyMTkyODA5NDg4NzM2MjZmLCA1LjM1NzU1MjAwNDYxODA4MzdmLAotICA1LjM5MjMxNzQyMjc3ODc2MDZmLCA1LjQyNjI2NDc1NDcwMjA5NzlmLAotICA1LjQ1OTQzMTYxODYzNzI5NzNmLCA1LjQ5MTg1MzA5NjMyOTY3NDdmLAotICA1LjUyMzU2MTk1NjA1NzAxMzBmLCA1LjU1NDU4ODg1MTY3NzYzNzZmLAotICA1LjU4NDk2MjUwMDcyMTE1NjBmLCA1LjYxNDcwOTg0NDExNTIwODNmLAotICA1LjY0Mzg1NjE4OTc3NDcyNDNmLCA1LjY3MjQyNTM0MTk3MTQ5NTFmLAotICA1LjcwMDQzOTcxODE0MTA5MTdmLCA1LjcyNzkyMDQ1NDU2MzE5ODdmLAotICA1Ljc1NDg4NzUwMjE2MzQ2ODJmLCA1Ljc4MTM1OTcxMzUyNDY1OTlmLAotICA1LjgwNzM1NDkyMjA1NzYwMzdmLCA1LjgzMjg5MDAxNDE2NDc0MTJmLAotICA1Ljg1Nzk4MDk5NTEyNzU3MThmLCA1Ljg4MjY0MzA0OTM2MTg0MTVmLAotICA1LjkwNjg5MDU5NTYwODUxODdmLCA1LjkzMDczNzMzNzU2Mjg4NjZmLAotICA1Ljk1NDE5NjMxMDM4Njg3NDlmLCA1Ljk3NzI3OTkyMzQ5OTkxNjdmLAotICA2LjAwMDAwMDAwMDAwMDAwMDBmLCA2LjAyMjM2NzgxMzAyODQ1NDNmLAotICA2LjA0NDM5NDExOTM1ODQ1MzNmLCA2LjA2NjA4OTE5MDQ1Nzc3MjBmLAotICA2LjA4NzQ2Mjg0MTI1MDMzOTBmLCA2LjEwODUyNDQ1Njc3ODE2OTFmLAotICA2LjEyOTI4MzAxNjk0NDk2NjNmLCA2LjE0OTc0NzExOTUwNDY4MjJmLAotICA2LjE2OTkyNTAwMTQ0MjMxMjFmLCA2LjE4OTgyNDU1ODg4MDAxNzVmLAotICA2LjIwOTQ1MzM2NTYyODk1MDFmLCA2LjIyODgxODY5MDQ5NTg4MDRmLAotICA2LjI0NzkyNzUxMzQ0MzU4NTJmLCA2LjI2Njc4NjU0MDY5NDkwMTBmLAotICA2LjI4NTQwMjIxODg2MjI0ODdmLCA2LjMwMzc4MDc0ODE3NzEwMzBmLAotICA2LjMyMTkyODA5NDg4NzM2MjZmLCA2LjMzOTg1MDAwMjg4NDYyNDNmLAotICA2LjM1NzU1MjAwNDYxODA4MzdmLCA2LjM3NTAzOTQzMTM0NjkyNDVmLAotICA2LjM5MjMxNzQyMjc3ODc2MDZmLCA2LjQwOTM5MDkzNjEzNzcwMTdmLAotICA2LjQyNjI2NDc1NDcwMjA5NzlmLCA2LjQ0Mjk0MzQ5NTg0ODcyNzlmLAotICA2LjQ1OTQzMTYxODYzNzI5NzNmLCA2LjQ3NTczMzQzMDk2NjM5NzZmLAotICA2LjQ5MTg1MzA5NjMyOTY3NDdmLCA2LjUwNzc5NDY0MDE5ODY5NjNmLAotICA2LjUyMzU2MTk1NjA1NzAxMzBmLCA2LjUzOTE1ODgxMTEwODAzMDlmLAotICA2LjU1NDU4ODg1MTY3NzYzNzZmLCA2LjU2OTg1NTYwODMzMDk0NzhmLAotICA2LjU4NDk2MjUwMDcyMTE1NjBmLCA2LjU5OTkxMjg0MjE4NzEyNzhmLAotICA2LjYxNDcwOTg0NDExNTIwODNmLCA2LjYyOTM1NjYyMDA3OTYwOTRmLAotICA2LjY0Mzg1NjE4OTc3NDcyNDNmLCA2LjY1ODIxMTQ4Mjc1MTc5NDZmLAotICA2LjY3MjQyNTM0MTk3MTQ5NTFmLCA2LjY4NjUwMDUyNzE4MzIxODVmLAotICA2LjcwMDQzOTcxODE0MTA5MTdmLCA2LjcxNDI0NTUxNzY2NjEyMjRmLAotICA2LjcyNzkyMDQ1NDU2MzE5ODdmLCA2Ljc0MTQ2Njk4NjQwMTE0NjRmLAotICA2Ljc1NDg4NzUwMjE2MzQ2ODJmLCA2Ljc2ODE4NDMyNDc3NjkyNTlmLAotICA2Ljc4MTM1OTcxMzUyNDY1OTlmLCA2Ljc5NDQxNTg2NjM1MDEwNjFmLAotICA2LjgwNzM1NDkyMjA1NzYwMzdmLCA2LjgyMDE3ODk2MjQxNTE4NzhmLAotICA2LjgzMjg5MDAxNDE2NDc0MTJmLCA2Ljg0NTQ5MDA1MDk0NDM3NDdmLAotICA2Ljg1Nzk4MDk5NTEyNzU3MThmLCA2Ljg3MDM2NDcxOTU4MzQwNDdmLAotICA2Ljg4MjY0MzA0OTM2MTg0MTVmLCA2Ljg5NDgxNzc2MzMwNzk0MzdmLAotICA2LjkwNjg5MDU5NTYwODUxODdmLCA2LjkxODg2MzIzNzI3NDU5NDZmLAotICA2LjkzMDczNzMzNzU2Mjg4NjZmLCA2Ljk0MjUxNDUwNTMzOTIzOThmLAotICA2Ljk1NDE5NjMxMDM4Njg3NDlmLCA2Ljk2NTc4NDI4NDY2MjA4NjlmLAotICA2Ljk3NzI3OTkyMzQ5OTkxNjdmLCA2Ljk4ODY4NDY4Njc3MjE2NTRmLAotICA3LjAwMDAwMDAwMDAwMDAwMDBmLCA3LjAxMTIyNzI1NTQyMzI1MzlmLAotICA3LjAyMjM2NzgxMzAyODQ1NDNmLCA3LjAzMzQyMzAwMTUzNzQ1MDFmLAotICA3LjA0NDM5NDExOTM1ODQ1MzNmLCA3LjA1NTI4MjQzNTUwMTE4OThmLAotICA3LjA2NjA4OTE5MDQ1Nzc3MjBmLCA3LjA3NjgxNTU5NzA1MDgzMDhmLAotICA3LjA4NzQ2Mjg0MTI1MDMzOTBmLCA3LjA5ODAzMjA4Mjk2MDUyNjNmLAotICA3LjEwODUyNDQ1Njc3ODE2OTFmLCA3LjExODk0MTA3MjcyMzUwNzZmLAotICA3LjEyOTI4MzAxNjk0NDk2NjNmLCA3LjEzOTU1MTM1MjM5ODc5MzZmLAotICA3LjE0OTc0NzExOTUwNDY4MjJmLCA3LjE1OTg3MTMzNjc3ODM4OTBmLAotICA3LjE2OTkyNTAwMTQ0MjMxMjFmLCA3LjE3OTkwOTA5MDAxNDkzNDRmLAotICA3LjE4OTgyNDU1ODg4MDAxNzVmLCA3LjE5OTY3MjM0NDgzNjM2NDRmLAotICA3LjIwOTQ1MzM2NTYyODk1MDFmLCA3LjIxOTE2ODUyMDQ2MjE2MTFmLAotICA3LjIyODgxODY5MDQ5NTg4MDRmLCA3LjIzODQwNDczOTMyNTA3ODVmLAotICA3LjI0NzkyNzUxMzQ0MzU4NTJmLCA3LjI1NzM4Nzg0MjY5MjY1MjFmLAotICA3LjI2Njc4NjU0MDY5NDkwMTBmLCA3LjI3NjEyNDQwNTI3NDIzNzVmLAotICA3LjI4NTQwMjIxODg2MjI0ODdmLCA3LjI5NDYyMDc0ODg5MTYyNzBmLAotICA3LjMwMzc4MDc0ODE3NzEwMzBmLCA3LjMxMjg4Mjk1NTI4NDM1NTdmLAotICA3LjMyMTkyODA5NDg4NzM2MjZmLCA3LjMzMDkxNjg3ODExNDYxNjdmLAotICA3LjMzOTg1MDAwMjg4NDYyNDNmLCA3LjM0ODcyODE1NDIzMTA3NzFmLAotICA3LjM1NzU1MjAwNDYxODA4MzdmLCA3LjM2NjMyMjIxNDI0NTgxNjBmLAotICA3LjM3NTAzOTQzMTM0NjkyNDVmLCA3LjM4MzcwNDI5MjQ3NDA1MTlmLAotICA3LjM5MjMxNzQyMjc3ODc2MDZmLCA3LjQwMDg3OTQzNjI4MjE4NDNmLAotICA3LjQwOTM5MDkzNjEzNzcwMTdmLCA3LjQxNzg1MjUxNDg4NTg5ODJmLAotICA3LjQyNjI2NDc1NDcwMjA5NzlmLCA3LjQzNDYyODIyNzYzNjcyNDVmLAotICA3LjQ0Mjk0MzQ5NTg0ODcyNzlmLCA3LjQ1MTIxMTExMTgzMjMyODlmLAotICA3LjQ1OTQzMTYxODYzNzI5NzNmLCA3LjQ2NzYwNTU1MDA4Mjk5NzZmLAotICA3LjQ3NTczMzQzMDk2NjM5NzZmLCA3LjQ4MzgxNTc3NzI2NDI1NjNmLAotICA3LjQ5MTg1MzA5NjMyOTY3NDdmLCA3LjQ5OTg0NTg4NzA4MzIwNTZmLAotICA3LjUwNzc5NDY0MDE5ODY5NjNmLCA3LjUxNTY5OTgzODI4NDA0MjdmLAotICA3LjUyMzU2MTk1NjA1NzAxMzBmLCA3LjUzMTM4MTQ2MDUxNjMxMThmLAotICA3LjUzOTE1ODgxMTEwODAzMDlmLCA3LjU0Njg5NDQ1OTg4NzYzNjRmLAotICA3LjU1NDU4ODg1MTY3NzYzNzZmLCA3LjU2MjI0MjQyNDIyMTA3MjhmLAotICA3LjU2OTg1NTYwODMzMDk0NzhmLCA3LjU3NzQyODgyODAzNTc0ODZmLAotICA3LjU4NDk2MjUwMDcyMTE1NjBmLCA3LjU5MjQ1NzAzNzI2ODA4MDZmLAotICA3LjU5OTkxMjg0MjE4NzEyNzhmLCA3LjYwNzMzMDMxMzc0OTYxMDRmLAotICA3LjYxNDcwOTg0NDExNTIwODNmLCA3LjYyMjA1MTgxOTQ1NjM3NjRmLAotICA3LjYyOTM1NjYyMDA3OTYwOTRmLCA3LjYzNjYyNDYyMDU0MzY0ODdmLAotICA3LjY0Mzg1NjE4OTc3NDcyNDNmLCA3LjY1MTA1MTY5MTE3ODkyODFmLAotICA3LjY1ODIxMTQ4Mjc1MTc5NDZmLCA3LjY2NTMzNTkxNzE4NTE3NjRmLAotICA3LjY3MjQyNTM0MTk3MTQ5NTFmLCA3LjY3OTQ4MDA5OTUwNTQ0NjRmLAotICA3LjY4NjUwMDUyNzE4MzIxODVmLCA3LjY5MzQ4Njk1NzQ5OTMyNTJmLAotICA3LjcwMDQzOTcxODE0MTA5MTdmLCA3LjcwNzM1OTEzMjA4MDg4MjVmLAotICA3LjcxNDI0NTUxNzY2NjEyMjRmLCA3LjcyMTA5OTE4ODcwNzE4NTVmLAotICA3LjcyNzkyMDQ1NDU2MzE5ODdmLCA3LjczNDcwOTYyMDIyNTgzODNmLAotICA3Ljc0MTQ2Njk4NjQwMTE0NjRmLCA3Ljc0ODE5Mjg0OTU4OTQ2MDVmLAotICA3Ljc1NDg4NzUwMjE2MzQ2ODJmLCA3Ljc2MTU1MTIzMjQ0NDQ3OTVmLAotICA3Ljc2ODE4NDMyNDc3NjkyNTlmLCA3Ljc3NDc4NzA1OTYwMTE3MzZmLAotICA3Ljc4MTM1OTcxMzUyNDY1OTlmLCA3Ljc4NzkwMjU1OTM5MTQzMTdmLAotICA3Ljc5NDQxNTg2NjM1MDEwNjFmLCA3LjgwMDg5OTg5OTkyMDMwNDdmLAotICA3LjgwNzM1NDkyMjA1NzYwMzdmLCA3LjgxMzc4MTE5MTIxNzAzNzRmLAotICA3LjgyMDE3ODk2MjQxNTE4NzhmLCA3LjgyNjU0ODQ4NzI5MDkxNTBmLAotICA3LjgzMjg5MDAxNDE2NDc0MTJmLCA3LjgzOTIwMzc4ODA5Njk0MzZmLAotICA3Ljg0NTQ5MDA1MDk0NDM3NDdmLCA3Ljg1MTc0OTA0MTQxNjA1NzFmLAotICA3Ljg1Nzk4MDk5NTEyNzU3MThmLCA3Ljg2NDE4NjE0NDY1NDI3OTdmLAotICA3Ljg3MDM2NDcxOTU4MzQwNDdmLCA3Ljg3NjUxNjk0NjU2NDk5OTNmLAotICA3Ljg4MjY0MzA0OTM2MTg0MTVmLCA3Ljg4ODc0MzI0ODg5ODI1OTFmLAotICA3Ljg5NDgxNzc2MzMwNzk0MzdmLCA3LjkwMDg2NjgwNzk4MDc0ODZmLAotICA3LjkwNjg5MDU5NTYwODUxODdmLCA3LjkxMjg4OTMzNjIyOTk2MTlmLAotICA3LjkxODg2MzIzNzI3NDU5NDZmLCA3LjkyNDgxMjUwMzYwNTc4MTJmLAotICA3LjkzMDczNzMzNzU2Mjg4NjZmLCA3LjkzNjYzNzkzOTAwMjU3MDlmLAotICA3Ljk0MjUxNDUwNTMzOTIzOThmLCA3Ljk0ODM2NzIzMTU4NDY3NzhmLAotICA3Ljk1NDE5NjMxMDM4Njg3NDlmLCA3Ljk2MDAwMTkzMjA2ODA4MDVmLAotICA3Ljk2NTc4NDI4NDY2MjA4NjlmLCA3Ljk3MTU0MzU1Mzk1MDc3MTlmLAotICA3Ljk3NzI3OTkyMzQ5OTkxNjdmLCA3Ljk4Mjk5MzU3NDY5NDMxMDNmLAotICA3Ljk4ODY4NDY4Njc3MjE2NTRmLCA3Ljk5NDM1MzQzNjg1ODg1NzdmCi19OwotCi1jb25zdCBmbG9hdCBrU0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdID0gewotICAwLjAwMDAwMDAwZiwgICAgMC4wMDAwMDAwMGYsICAyLjAwMDAwMDAwZiwgICA0Ljc1NDg4NzUwZiwKLSAgOC4wMDAwMDAwMGYsICAgMTEuNjA5NjQwNDdmLCAgMTUuNTA5Nzc1MDBmLCAgMTkuNjUxNDg0NDVmLAotICAyNC4wMDAwMDAwMGYsICAyOC41MjkzMjUwMWYsICAzMy4yMTkyODA5NWYsICAzOC4wNTM3NDc4MWYsCi0gIDQzLjAxOTU1MDAxZiwgIDQ4LjEwNTcxNjM0ZiwgIDUzLjMwMjk2ODkxZiwgIDU4LjYwMzM1ODkzZiwKLSAgNjQuMDAwMDAwMDBmLCAgNjkuNDg2ODY4MzBmLCAgNzUuMDU4NjUwMDNmLCAgODAuNzEwNjIyNzZmLAotICA4Ni40Mzg1NjE5MGYsICA5Mi4yMzg2NjU4OGYsICA5OC4xMDc0OTU2MWYsICAxMDQuMDQxOTI0OTlmLAotICAxMTAuMDM5MTAwMDJmLCAxMTYuMDk2NDA0NzRmLCAxMjIuMjExNDMyNjdmLCAxMjguMzgxOTYyNTZmLAotICAxMzQuNjA1OTM3ODJmLCAxNDAuODgxNDQ4ODZmLCAxNDcuMjA2NzE3ODdmLCAxNTMuNTgwMDg1NjJmLAotICAxNjAuMDAwMDAwMDBmLCAxNjYuNDY1MDA1OTRmLCAxNzIuOTczNzM2NjBmLCAxNzkuNTI0OTA1NTlmLAotICAxODYuMTE3MzAwMDVmLCAxOTIuNzQ5Nzc0NTNmLCAxOTkuNDIxMjQ1NTFmLCAyMDYuMTMwNjg2NTRmLAotICAyMTIuODc3MTIzODBmLCAyMTkuNjU5NjMyMTlmLCAyMjYuNDc3MzMxNzZmLCAyMzMuMzI5Mzg0NDVmLAotICAyNDAuMjE0OTkxMjJmLCAyNDcuMTMzMzg5MzNmLCAyNTQuMDgzODQ5OThmLCAyNjEuMDY1Njc2MDNmLAotICAyNjguMDc4MjAwMDNmLCAyNzUuMTIwNzgyMzZmLCAyODIuMTkyODA5NDlmLCAyODkuMjkzNjkyNDRmLAotICAyOTYuNDIyODY1MzRmLCAzMDMuNTc5Nzg0MDlmLCAzMTAuNzYzOTI1MTJmLCAzMTcuOTc0Nzg0MjRmLAotICAzMjUuMjExODc1NjRmLCAzMzIuNDc0NzMwODFmLCAzMzkuNzYyODk3NzJmLCAzNDcuMDc1OTM5OTFmLAotICAzNTQuNDEzNDM1NzRmLCAzNjEuNzc0OTc3NTlmLCAzNjkuMTYwMTcxMjRmLCAzNzYuNTY4NjM1MThmLAotICAzODQuMDAwMDAwMDBmLCAzOTEuNDUzOTA3ODVmLCAzOTguOTMwMDExODhmLCA0MDYuNDI3OTc1NzZmLAotICA0MTMuOTQ3NDczMjFmLCA0MjEuNDg4MTg3NTJmLCA0MjkuMDQ5ODExMTlmLCA0MzYuNjMyMDQ1NDhmLAotICA0NDQuMjM0NjAwMTBmLCA0NTEuODU3MTkyODBmLCA0NTkuNDk5NTQ5MDZmLCA0NjcuMTYxNDAxNzlmLAotICA0NzQuODQyNDkxMDJmLCA0ODIuNTQyNTYzNjNmLCA0OTAuMjYxMzczMDdmLCA0OTcuOTk4Njc5MTFmLAotICA1MDUuNzU0MjQ3NTlmLCA1MTMuNTI3ODUwMjNmLCA1MjEuMzE5MjY0MzhmLCA1MjkuMTI4MjcyODBmLAotICA1MzYuOTU0NjYzNTFmLCA1NDQuNzk4MjI5NTdmLCA1NTIuNjU4NzY4OTBmLCA1NjAuNTM2MDg0MTRmLAotICA1NjguNDI5OTgyNDRmLCA1NzYuMzQwMjc1MzZmLCA1ODQuMjY2Nzc4NjdmLCA1OTIuMjA5MzEyMjZmLAotICA2MDAuMTY3Njk5OTZmLCA2MDguMTQxNzY5NDNmLCA2MTYuMTMxMzUyMDZmLCA2MjQuMTM2MjgyNzlmLAotICA2MzIuMTU2NDAwMDdmLCA2NDAuMTkxNTQ1NjlmLCA2NDguMjQxNTY0NzJmLCA2NTYuMzA2MzA1MzlmLAotICA2NjQuMzg1NjE4OThmLCA2NzIuNDc5MzU5NzZmLCA2ODAuNTg3Mzg0ODhmLCA2ODguNzA5NTU0MzBmLAotICA2OTYuODQ1NzMwNjlmLCA3MDQuOTk1Nzc5MzVmLCA3MTMuMTU5NTY4MThmLCA3MjEuMzM2OTY3NTRmLAotICA3MjkuNTI3ODUwMjNmLCA3MzcuNzMyMDkxNDBmLCA3NDUuOTQ5NTY4NDlmLCA3NTQuMTgwMTYxMTZmLAotICA3NjIuNDIzNzUxMjdmLCA3NzAuNjgwMjIyNzVmLCA3NzguOTQ5NDYxNjFmLCA3ODcuMjMxMzU1ODZmLAotICA3OTUuNTI1Nzk1NDNmLCA4MDMuODMyNjcyMTlmLCA4MTIuMTUxODc5ODJmLCA4MjAuNDgzMzEzODNmLAotICA4MjguODI2ODcxNDdmLCA4MzcuMTgyNDUxNzFmLCA4NDUuNTQ5OTU1MThmLCA4NTMuOTI5Mjg0MTZmLAotICA4NjIuMzIwMzQyNDlmLCA4NzAuNzIzMDM1NThmLCA4NzkuMTM3MjcwMzZmLCA4ODcuNTYyOTU1MjJmLAotICA4OTYuMDAwMDAwMDBmLCA5MDQuNDQ4MzE1OTVmLCA5MTIuOTA3ODE1NjlmLCA5MjEuMzc4NDEzMjBmLAotICA5MjkuODYwMDIzNzZmLCA5MzguMzUyNTYzOTJmLCA5NDYuODU1OTUxNTJmLCA5NTUuMzcwMTA1NjBmLAotICA5NjMuODk0OTQ2NDFmLCA5NzIuNDMwMzk1MzdmLCA5ODAuOTc2Mzc1MDRmLCA5ODkuNTMyODA5MTFmLAotICA5OTguMDk5NjIyMzdmLCAxMDA2LjY3Njc0MDY5ZiwgMTAxNS4yNjQwOTA5N2YsIDEwMjMuODYxNjAxMTZmLAotICAxMDMyLjQ2OTIwMDIxZiwgMTA0MS4wODY4MTgwNWYsIDEwNDkuNzE0Mzg1NjBmLCAxMDU4LjM1MTgzNDY5ZiwKLSAgMTA2Ni45OTkwOTgxMWYsIDEwNzUuNjU2MTA5NTVmLCAxMDg0LjMyMjgwMzU3ZiwgMTA5Mi45OTkxMTU2NGYsCi0gIDExMDEuNjg0OTgyMDRmLCAxMTEwLjM4MDMzOTkzZiwgMTExOS4wODUxMjcyN2YsIDExMjcuNzk5MjgyODJmLAotICAxMTM2LjUyMjc0NjE0ZiwgMTE0NS4yNTU0NTc1OGYsIDExNTMuOTk3MzU4MjFmLCAxMTYyLjc0ODM4OTg5ZiwKLSAgMTE3MS41MDg0OTUxOGYsIDExODAuMjc3NjE3MzhmLCAxMTg5LjA1NTcwMDQ3ZiwgMTE5Ny44NDI2ODkxNGYsCi0gIDEyMDYuNjM4NTI4NzZmLCAxMjE1LjQ0MzE2NTM1ZiwgMTIyNC4yNTY1NDU2MGYsIDEyMzMuMDc4NjE2ODRmLAotICAxMjQxLjkwOTMyNzAzZiwgMTI1MC43NDg2MjQ3M2YsIDEyNTkuNTk2NDU5MTRmLCAxMjY4LjQ1Mjc4MDA1ZiwKLSAgMTI3Ny4zMTc1Mzc4MWYsIDEyODYuMTkwNjgzMzhmLCAxMjk1LjA3MjE2ODI4ZiwgMTMwMy45NjE5NDQ1N2YsCi0gIDEzMTIuODU5OTY0ODhmLCAxMzIxLjc2NjE4MjM2ZiwgMTMzMC42ODA1NTA3MWYsIDEzMzkuNjAzMDI0MTNmLAotICAxMzQ4LjUzMzU1NzM0ZiwgMTM1Ny40NzIxMDU1NmYsIDEzNjYuNDE4NjI0NTJmLCAxMzc1LjM3MzA3MDQxZiwKLSAgMTM4NC4zMzUzOTk5MWYsIDEzOTMuMzA1NTcwMjBmLCAxNDAyLjI4MzUzODg3ZiwgMTQxMS4yNjkyNjQwMGYsCi0gIDE0MjAuMjYyNzA0MTJmLCAxNDI5LjI2MzgxODE4ZiwgMTQzOC4yNzI1NjU1OGYsIDE0NDcuMjg4OTA2MTVmLAotICAxNDU2LjMxMjgwMDE0ZiwgMTQ2NS4zNDQyMDgxOWYsIDE0NzQuMzgzMDkxMzhmLCAxNDgzLjQyOTQxMTE4ZiwKLSAgMTQ5Mi40ODMxMjk0NWYsIDE1MDEuNTQ0MjA4NDNmLCAxNTEwLjYxMjYxMDc4ZiwgMTUxOS42ODgyOTk0OWYsCi0gIDE1MjguNzcxMjM3OTVmLCAxNTM3Ljg2MTM4OTkzZiwgMTU0Ni45NTg3MTk1MmYsIDE1NTYuMDYzMTkxMTlmLAotICAxNTY1LjE3NDc2OTc2ZiwgMTU3NC4yOTM0MjA0MGYsIDE1ODMuNDE5MTA4NjBmLCAxNTkyLjU1MTgwMDIwZiwKLSAgMTYwMS42OTE0NjEzN2YsIDE2MTAuODM4MDU4NjBmLCAxNjE5Ljk5MTU1ODcxZiwgMTYyOS4xNTE5Mjg4MmYsCi0gIDE2MzguMzE5MTM2MzdmLCAxNjQ3LjQ5MzE0OTExZiwgMTY1Ni42NzM5MzUwOWYsIDE2NjUuODYxNDYyNjZmLAotICAxNjc1LjA1NTcwMDQ3ZiwgMTY4NC4yNTY2MTc0NGYsIDE2OTMuNDY0MTgyODBmLCAxNzAyLjY3ODM2NjA1ZiwKLSAgMTcxMS44OTkxMzY5OGYsIDE3MjEuMTI2NDY1NjNmLCAxNzMwLjM2MDMyMjMzZiwgMTczOS42MDA2Nzc2OGYsCi0gIDE3NDguODQ3NTAyNTRmLCAxNzU4LjEwMDc2ODAyZiwgMTc2Ny4zNjA0NDU1MWYsIDE3NzYuNjI2NTA2NjJmLAotICAxNzg1Ljg5ODkyMzIzZiwgMTc5NS4xNzc2Njc0N2YsIDE4MDQuNDYyNzExNzJmLCAxODEzLjc1NDAyODU3ZiwKLSAgMTgyMy4wNTE1OTA4N2YsIDE4MzIuMzU1MzcxNzBmLCAxODQxLjY2NTM0NDM4ZiwgMTg1MC45ODE0ODI0NGYsCi0gIDE4NjAuMzAzNzU5NjVmLCAxODY5LjYzMjE0OTk5ZiwgMTg3OC45NjY2Mjc2N2YsIDE4ODguMzA3MTY3MTFmLAotICAxODk3LjY1Mzc0Mjk1ZiwgMTkwNy4wMDYzMzAwM2YsIDE5MTYuMzY0OTAzNDJmLCAxOTI1LjcyOTQzODM4ZiwKLSAgMTkzNS4wOTk5MTAzN2YsIDE5NDQuNDc2Mjk1MDZmLCAxOTUzLjg1ODU2ODMxZiwgMTk2My4yNDY3MDYyMGYsCi0gIDE5NzIuNjQwNjg0OThmLCAxOTgyLjA0MDQ4MTA4ZiwgMTk5MS40NDYwNzExN2YsIDIwMDAuODU3NDMyMDRmLAotICAyMDEwLjI3NDU0MDcyZiwgMjAxOS42OTczNzQ0MGYsIDIwMjkuMTI1OTEwNDRmLCAyMDM4LjU2MDEyNjQwZgotfTsKLQotZmxvYXQgVlA4TEZhc3RTTG9nMlNsb3coaW50IHYpIHsKLSAgU0JfRENIRUNLKHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKLSAgaWYgKHYgPCBBUFBST1hfTE9HX01BWCkgewotICAgIGludCBsb2dfY250ID0gMDsKLSAgICBjb25zdCBmbG9hdCB2X2YgPSAoZmxvYXQpdjsKLSAgICB3aGlsZSAodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpIHsKLSAgICAgICsrbG9nX2NudDsKLSAgICAgIHYgPSB2ID4+IDE7Ci0gICAgfQotICAgIHJldHVybiB2X2YgKiAoa0xvZzJUYWJsZVt2XSArIGxvZ19jbnQpOwotICB9IGVsc2UgewotICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiB2ICogbG9nKChkb3VibGUpdikpOwotICB9Ci19Ci0KLWZsb2F0IFZQOExGYXN0TG9nMlNsb3coaW50IHYpIHsKLSAgU0JfRENIRUNLKHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKLSAgaWYgKHYgPCBBUFBST1hfTE9HX01BWCkgewotICAgIGludCBsb2dfY250ID0gMDsKLSAgICB3aGlsZSAodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpIHsKLSAgICAgICsrbG9nX2NudDsKLSAgICAgIHYgPSB2ID4+IDE7Ci0gICAgfQotICAgIHJldHVybiBrTG9nMlRhYmxlW3ZdICsgbG9nX2NudDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogbG9nKChkb3VibGUpdikpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbWFnZSB0cmFuc2Zvcm1zLgotCi0vLyBJbi1wbGFjZSBzdW0gb2YgZWFjaCBjb21wb25lbnQgd2l0aCBtb2QgMjU2Lgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkUGl4ZWxzRXEodWludDMyX3QqIGEsIHVpbnQzMl90IGIpIHsKLSAgY29uc3QgdWludDMyX3QgYWxwaGFfYW5kX2dyZWVuID0gKCphICYgMHhmZjAwZmYwMHUpICsgKGIgJiAweGZmMDBmZjAwdSk7Ci0gIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9ICgqYSAmIDB4MDBmZjAwZmZ1KSArIChiICYgMHgwMGZmMDBmZnUpOwotICAqYSA9IChhbHBoYV9hbmRfZ3JlZW4gJiAweGZmMDBmZjAwdSkgfCAocmVkX2FuZF9ibHVlICYgMHgwMGZmMDBmZnUpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7Ci0gIHJldHVybiAoKChhMCBeIGExKSAmIDB4ZmVmZWZlZmVMKSA+PiAxKSArIChhMCAmIGExKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwgdWludDMyX3QgYTIpIHsKLSAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMiksIGExKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2U0KHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMiwgdWludDMyX3QgYTMpIHsKLSAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMSksIEF2ZXJhZ2UyKGEyLCBhMykpOwotfQotCi0jaWYgZGVmaW5lZChXRUJQX1RBUkdFVF9IQVNfU1NFMikKLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMCksIHplcm8pOwotICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzEpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMyKSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgVjEgPSBfbW1fYWRkX2VwaTE2KEMwLCBDMSk7Ci0gIGNvbnN0IF9fbTEyOGkgVjIgPSBfbW1fc3ViX2VwaTE2KFYxLCBDMik7Ci0gIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9wYWNrdXNfZXBpMTYoVjIsIFYyKTsKLSAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoYik7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGF2ZSA9IEF2ZXJhZ2UyKGMwLCBjMSk7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChhdmUpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMyKSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc3ViX2VwaTE2KEEwLCBCMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQmd0QSA9IF9tbV9jbXBndF9lcGkxNihCMCwgQTApOwotICBjb25zdCBfX20xMjhpIEEyID0gX21tX3N1Yl9lcGkxNihBMSwgQmd0QSk7Ci0gIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc3JhaV9lcGkxNihBMiwgMSk7Ci0gIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fYWRkX2VwaTE2KEEwLCBBMyk7Ci0gIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fcGFja3VzX2VwaTE2KEE0LCBBNCk7Ci0gIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKEE1KTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7Ci0gIGludCBwYV9taW51c19wYjsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGEpOwotICBjb25zdCBfX20xMjhpIEIwID0gX21tX2N2dHNpMzJfc2kxMjgoYik7Ci0gIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fY3Z0c2kzMl9zaTEyOChjKTsKLSAgY29uc3QgX19tMTI4aSBBQzAgPSBfbW1fc3Vic19lcHU4KEEwLCBDMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQ0EwID0gX21tX3N1YnNfZXB1OChDMCwgQTApOwotICBjb25zdCBfX20xMjhpIEJDMCA9IF9tbV9zdWJzX2VwdTgoQjAsIEMwKTsKLSAgY29uc3QgX19tMTI4aSBDQjAgPSBfbW1fc3Vic19lcHU4KEMwLCBCMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQUMgPSBfbW1fb3Jfc2kxMjgoQUMwLCBDQTApOwotICBjb25zdCBfX20xMjhpIEJDID0gX21tX29yX3NpMTI4KEJDMCwgQ0IwKTsKLSAgY29uc3QgX19tMTI4aSBwYSA9IF9tbV91bnBhY2tsb19lcGk4KEFDLCB6ZXJvKTsgIC8vIHxhIC0gY3wKLSAgY29uc3QgX19tMTI4aSBwYiA9IF9tbV91bnBhY2tsb19lcGk4KEJDLCB6ZXJvKTsgIC8vIHxiIC0gY3wKLSAgY29uc3QgX19tMTI4aSBkaWZmID0gX21tX3N1Yl9lcGkxNihwYiwgcGEpOwotICB7Ci0gICAgaW50MTZfdCBvdXRbOF07Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopb3V0LCBkaWZmKTsKLSAgICBwYV9taW51c19wYiA9IG91dFswXSArIG91dFsxXSArIG91dFsyXSArIG91dFszXTsKLSAgfQotICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGlwMjU1KHVpbnQzMl90IGEpIHsKLSAgaWYgKGEgPCAyNTYpIHsKLSAgICByZXR1cm4gYTsKLSAgfQotICAvLyByZXR1cm4gMCwgd2hlbiBhIGlzIGEgbmVnYXRpdmUgaW50ZWdlci4KLSAgLy8gcmV0dXJuIDI1NSwgd2hlbiBhIGlzIHBvc2l0aXZlLgotICByZXR1cm4gfmEgPj4gMjQ7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGludCBhLCBpbnQgYiwgaW50IGMpIHsKLSAgcmV0dXJuIENsaXAyNTUoYSArIGIgLSBjKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKLSAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgPj4gMjQsIGMxID4+IDI0LCBjMiA+PiAyNCk7Ci0gIGNvbnN0IGludCByID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDE2KSAmIDB4ZmYpOwotICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbCgoYzAgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gOCkgJiAweGZmKTsKLSAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgJiAweGZmLCBjMSAmIDB4ZmYsIGMyICYgMHhmZik7Ci0gIHJldHVybiAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGludCBhLCBpbnQgYikgewotICByZXR1cm4gQ2xpcDI1NShhICsgKGEgLSBiKSAvIDIpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgewotICBjb25zdCB1aW50MzJfdCBhdmUgPSBBdmVyYWdlMihjMCwgYzEpOwotICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihhdmUgPj4gMjQsIGMyID4+IDI0KTsKLSAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAxNikgJiAweGZmLCAoYzIgPj4gMTYpICYgMHhmZik7Ci0gIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gOCkgJiAweGZmLCAoYzIgPj4gOCkgJiAweGZmKTsKLSAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAwKSAmIDB4ZmYsIChjMiA+PiAwKSAmIDB4ZmYpOwotICByZXR1cm4gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFN1YjMoaW50IGEsIGludCBiLCBpbnQgYykgewotICBjb25zdCBpbnQgcGIgPSBiIC0gYzsKLSAgY29uc3QgaW50IHBhID0gYSAtIGM7Ci0gIHJldHVybiBhYnMocGIpIC0gYWJzKHBhKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7Ci0gIGNvbnN0IGludCBwYV9taW51c19wYiA9Ci0gICAgICBTdWIzKChhID4+IDI0KSAgICAgICAsIChiID4+IDI0KSAgICAgICAsIChjID4+IDI0KSAgICAgICApICsKLSAgICAgIFN1YjMoKGEgPj4gMTYpICYgMHhmZiwgKGIgPj4gMTYpICYgMHhmZiwgKGMgPj4gMTYpICYgMHhmZikgKwotICAgICAgU3ViMygoYSA+PiAgOCkgJiAweGZmLCAoYiA+PiAgOCkgJiAweGZmLCAoYyA+PiAgOCkgJiAweGZmKSArCi0gICAgICBTdWIzKChhICAgICAgKSAmIDB4ZmYsIChiICAgICAgKSAmIDB4ZmYsIChjICAgICAgKSAmIDB4ZmYpOwotICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Ci19Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByZWRpY3RvcnMKLQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjAodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICAodm9pZCl0b3A7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiBBUkdCX0JMQUNLOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICAodm9pZCl0b3A7Ci0gIHJldHVybiBsZWZ0OwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICAodm9pZClsZWZ0OwotICByZXR1cm4gdG9wWzBdOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICAodm9pZClsZWZ0OwotICByZXR1cm4gdG9wWzFdOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjQodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICAodm9pZClsZWZ0OwotICByZXR1cm4gdG9wWy0xXTsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbLTFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbMF0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjkodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWzBdLCB0b3BbMV0pOwotICAodm9pZClsZWZ0OwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlNChsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci0KLXR5cGVkZWYgdWludDMyX3QgKCpQcmVkaWN0b3JGdW5jKSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKTsKLXN0YXRpYyBjb25zdCBQcmVkaWN0b3JGdW5jIGtQcmVkaWN0b3JzWzE2XSA9IHsKLSAgUHJlZGljdG9yMCwgUHJlZGljdG9yMSwgUHJlZGljdG9yMiwgUHJlZGljdG9yMywKLSAgUHJlZGljdG9yNCwgUHJlZGljdG9yNSwgUHJlZGljdG9yNiwgUHJlZGljdG9yNywKLSAgUHJlZGljdG9yOCwgUHJlZGljdG9yOSwgUHJlZGljdG9yMTAsIFByZWRpY3RvcjExLAotICBQcmVkaWN0b3IxMiwgUHJlZGljdG9yMTMsCi0gIFByZWRpY3RvcjAsIFByZWRpY3RvcjAgICAgLy8gPC0gcGFkZGluZyBzZWN1cml0eSBzZW50aW5lbHMKLX07Ci0KLS8vIFRPRE8odmlrYXNhKTogUmVwbGFjZSAyNTYgZXRjIHdpdGggZGVmaW5lcy4KLXN0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdFNwYXRpYWwoY29uc3QgaW50KiBjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRfMCwgZG91YmxlIGV4cF92YWwpIHsKLSAgY29uc3QgaW50IHNpZ25pZmljYW50X3N5bWJvbHMgPSAxNjsKLSAgY29uc3QgZG91YmxlIGV4cF9kZWNheV9mYWN0b3IgPSAwLjY7Ci0gIGRvdWJsZSBiaXRzID0gd2VpZ2h0XzAgKiBjb3VudHNbMF07Ci0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgc2lnbmlmaWNhbnRfc3ltYm9sczsgKytpKSB7Ci0gICAgYml0cyArPSBleHBfdmFsICogKGNvdW50c1tpXSArIGNvdW50c1syNTYgLSBpXSk7Ci0gICAgZXhwX3ZhbCAqPSBleHBfZGVjYXlfZmFjdG9yOwotICB9Ci0gIHJldHVybiAoZmxvYXQpKC0wLjEgKiBiaXRzKTsKLX0KLQotLy8gQ29tcHV0ZSB0aGUgY29tYmluZWQgU2hhbm9uJ3MgZW50cm9weSBmb3IgZGlzdHJpYnV0aW9uIHtYfSBhbmQge1grWX0KLXN0YXRpYyBmbG9hdCBDb21iaW5lZFNoYW5ub25FbnRyb3B5KGNvbnN0IGludCogY29uc3QgWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgWSwgaW50IG4pIHsKLSAgaW50IGk7Ci0gIGRvdWJsZSByZXR2YWwgPSAwLjsKLSAgaW50IHN1bVggPSAwLCBzdW1YWSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBjb25zdCBpbnQgeCA9IFhbaV07Ci0gICAgY29uc3QgaW50IHh5ID0gWFtpXSArIFlbaV07Ci0gICAgaWYgKHggIT0gMCkgewotICAgICAgc3VtWCArPSB4OwotICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoeCk7Ci0gICAgfQotICAgIGlmICh4eSAhPSAwKSB7Ci0gICAgICBzdW1YWSArPSB4eTsKLSAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHh5KTsKLSAgICB9Ci0gIH0KLSAgcmV0dmFsICs9IFZQOExGYXN0U0xvZzIoc3VtWCkgKyBWUDhMRmFzdFNMb2cyKHN1bVhZKTsKLSAgcmV0dXJuIChmbG9hdClyZXR2YWw7Ci19Ci0KLXN0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdFNwYXRpYWxIaXN0b2dyYW0oaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlWzRdWzI1Nl0pIHsKLSAgaW50IGk7Ci0gIGRvdWJsZSByZXR2YWwgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgY29uc3QgZG91YmxlIGtFeHBWYWx1ZSA9IDAuOTQ7Ci0gICAgcmV0dmFsICs9IFByZWRpY3Rpb25Db3N0U3BhdGlhbCh0aWxlW2ldLCAxLCBrRXhwVmFsdWUpOwotICAgIHJldHZhbCArPSBDb21iaW5lZFNoYW5ub25FbnRyb3B5KHRpbGVbaV0sIGFjY3VtdWxhdGVkW2ldLCAyNTYpOwotICB9Ci0gIHJldHVybiAoZmxvYXQpcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2N1bXVsYXRlZFs0XVsyNTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoKSB7Ci0gIGNvbnN0IGludCBrTnVtUHJlZE1vZGVzID0gMTQ7Ci0gIGNvbnN0IGludCBjb2xfc3RhcnQgPSB0aWxlX3ggPDwgYml0czsKLSAgY29uc3QgaW50IHJvd19zdGFydCA9IHRpbGVfeSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgeW1heCA9ICh0aWxlX3NpemUgPD0gaGVpZ2h0IC0gcm93X3N0YXJ0KSA/Ci0gICAgICB0aWxlX3NpemUgOiBoZWlnaHQgLSByb3dfc3RhcnQ7Ci0gIGNvbnN0IGludCB4bWF4ID0gKHRpbGVfc2l6ZSA8PSB3aWR0aCAtIGNvbF9zdGFydCkgPwotICAgICAgdGlsZV9zaXplIDogd2lkdGggLSBjb2xfc3RhcnQ7Ci0gIGludCBoaXN0b1s0XVsyNTZdOwotICBmbG9hdCBiZXN0X2RpZmYgPSBNQVhfRElGRl9DT1NUOwotICBpbnQgYmVzdF9tb2RlID0gMDsKLQotICBpbnQgbW9kZTsKLSAgZm9yIChtb2RlID0gMDsgbW9kZSA8IGtOdW1QcmVkTW9kZXM7ICsrbW9kZSkgewotICAgIGNvbnN0IHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IGFyZ2Jfc2NyYXRjaDsKLSAgICBjb25zdCBQcmVkaWN0b3JGdW5jIHByZWRfZnVuYyA9IGtQcmVkaWN0b3JzW21vZGVdOwotICAgIGZsb2F0IGN1cl9kaWZmOwotICAgIGludCB5OwotICAgIFNiTWVtb3J5U2V0KCZoaXN0b1swXVswXSwgMCwgc2l6ZW9mKGhpc3RvKSk7Ci0gICAgZm9yICh5ID0gMDsgeSA8IHltYXg7ICsreSkgewotICAgICAgaW50IHg7Ci0gICAgICBjb25zdCBpbnQgcm93ID0gcm93X3N0YXJ0ICsgeTsKLSAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB1cHBlcl9yb3cgPSBjdXJyZW50X3JvdzsKLSAgICAgIGN1cnJlbnRfcm93ID0gdXBwZXJfcm93ICsgd2lkdGg7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgeG1heDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2wgPSBjb2xfc3RhcnQgKyB4OwotICAgICAgICB1aW50MzJfdCBwcmVkaWN0OwotICAgICAgICB1aW50MzJfdCBwcmVkaWN0X2RpZmY7Ci0gICAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICAgIHByZWRpY3QgPSAoY29sID09IDApID8gQVJHQl9CTEFDSyA6IGN1cnJlbnRfcm93W2NvbCAtIDFdOyAgLy8gTGVmdC4KLSAgICAgICAgfSBlbHNlIGlmIChjb2wgPT0gMCkgewotICAgICAgICAgIHByZWRpY3QgPSB1cHBlcl9yb3dbY29sXTsgIC8vIFRvcC4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwcmVkaWN0ID0gcHJlZF9mdW5jKGN1cnJlbnRfcm93W2NvbCAtIDFdLCB1cHBlcl9yb3cgKyBjb2wpOwotICAgICAgICB9Ci0gICAgICAgIHByZWRpY3RfZGlmZiA9IFZQOExTdWJQaXhlbHMoY3VycmVudF9yb3dbY29sXSwgcHJlZGljdCk7Ci0gICAgICAgICsraGlzdG9bMF1bcHJlZGljdF9kaWZmID4+IDI0XTsKLSAgICAgICAgKytoaXN0b1sxXVsoKHByZWRpY3RfZGlmZiA+PiAxNikgJiAweGZmKV07Ci0gICAgICAgICsraGlzdG9bMl1bKChwcmVkaWN0X2RpZmYgPj4gOCkgJiAweGZmKV07Ci0gICAgICAgICsraGlzdG9bM11bKHByZWRpY3RfZGlmZiAmIDB4ZmYpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY3VyX2RpZmYgPSBQcmVkaWN0aW9uQ29zdFNwYXRpYWxIaXN0b2dyYW0oYWNjdW11bGF0ZWQsIGhpc3RvKTsKLSAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKLSAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOwotICAgICAgYmVzdF9tb2RlID0gbW9kZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gYmVzdF9tb2RlOwotfQotCi1zdGF0aWMgdm9pZCBDb3B5VGlsZVdpdGhQcmVkaWN0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsIGludCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYikgewotICBjb25zdCBpbnQgY29sX3N0YXJ0ID0gdGlsZV94IDw8IGJpdHM7Ci0gIGNvbnN0IGludCByb3dfc3RhcnQgPSB0aWxlX3kgPDwgYml0czsKLSAgY29uc3QgaW50IHRpbGVfc2l6ZSA9IDEgPDwgYml0czsKLSAgY29uc3QgaW50IHltYXggPSAodGlsZV9zaXplIDw9IGhlaWdodCAtIHJvd19zdGFydCkgPwotICAgICAgdGlsZV9zaXplIDogaGVpZ2h0IC0gcm93X3N0YXJ0OwotICBjb25zdCBpbnQgeG1heCA9ICh0aWxlX3NpemUgPD0gd2lkdGggLSBjb2xfc3RhcnQpID8KLSAgICAgIHRpbGVfc2l6ZSA6IHdpZHRoIC0gY29sX3N0YXJ0OwotICBjb25zdCBQcmVkaWN0b3JGdW5jIHByZWRfZnVuYyA9IGtQcmVkaWN0b3JzW21vZGVdOwotICBjb25zdCB1aW50MzJfdCogY3VycmVudF9yb3cgPSBhcmdiX3NjcmF0Y2g7Ci0KLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCB5bWF4OyArK3kpIHsKLSAgICBpbnQgeDsKLSAgICBjb25zdCBpbnQgcm93ID0gcm93X3N0YXJ0ICsgeTsKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3QgdXBwZXJfcm93ID0gY3VycmVudF9yb3c7Ci0gICAgY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aDsKLSAgICBmb3IgKHggPSAwOyB4IDwgeG1heDsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgY29sID0gY29sX3N0YXJ0ICsgeDsKLSAgICAgIGNvbnN0IGludCBwaXggPSByb3cgKiB3aWR0aCArIGNvbDsKLSAgICAgIHVpbnQzMl90IHByZWRpY3Q7Ci0gICAgICBpZiAocm93ID09IDApIHsKLSAgICAgICAgcHJlZGljdCA9IChjb2wgPT0gMCkgPyBBUkdCX0JMQUNLIDogY3VycmVudF9yb3dbY29sIC0gMV07ICAvLyBMZWZ0LgotICAgICAgfSBlbHNlIGlmIChjb2wgPT0gMCkgewotICAgICAgICBwcmVkaWN0ID0gdXBwZXJfcm93W2NvbF07ICAvLyBUb3AuCi0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVkaWN0ID0gcHJlZF9mdW5jKGN1cnJlbnRfcm93W2NvbCAtIDFdLCB1cHBlcl9yb3cgKyBjb2wpOwotICAgICAgfQotICAgICAgYXJnYltwaXhdID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1tjb2xdLCBwcmVkaWN0KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhMUmVzaWR1YWxJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGltYWdlKSB7Ci0gIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKLSAgY29uc3QgaW50IHRpbGVzX3Blcl9jb2wgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOwotICB1aW50MzJfdCogY29uc3QgdXBwZXJfcm93ID0gYXJnYl9zY3JhdGNoOwotICB1aW50MzJfdCogY29uc3QgY3VycmVudF90aWxlX3Jvd3MgPSBhcmdiX3NjcmF0Y2ggKyB3aWR0aDsKLSAgaW50IHRpbGVfeTsKLSAgaW50IGhpc3RvWzRdWzI1Nl07Ci0gIFNiTWVtb3J5U2V0KGhpc3RvLCAwLCBzaXplb2YoaGlzdG8pKTsKLSAgZm9yICh0aWxlX3kgPSAwOyB0aWxlX3kgPCB0aWxlc19wZXJfY29sOyArK3RpbGVfeSkgewotICAgIGNvbnN0IGludCB0aWxlX3lfb2Zmc2V0ID0gdGlsZV95ICogbWF4X3RpbGVfc2l6ZTsKLSAgICBjb25zdCBpbnQgdGhpc190aWxlX2hlaWdodCA9Ci0gICAgICAgICh0aWxlX3kgPCB0aWxlc19wZXJfY29sIC0gMSkgPyBtYXhfdGlsZV9zaXplIDogaGVpZ2h0IC0gdGlsZV95X29mZnNldDsKLSAgICBpbnQgdGlsZV94OwotICAgIGlmICh0aWxlX3kgPiAwKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkodXBwZXJfcm93LCBjdXJyZW50X3RpbGVfcm93cyArIChtYXhfdGlsZV9zaXplIC0gMSkgKiB3aWR0aCwKLSAgICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqdXBwZXJfcm93KSk7Ci0gICAgfQotICAgIFNiTWVtb3J5Q29weShjdXJyZW50X3RpbGVfcm93cywgJmFyZ2JbdGlsZV95X29mZnNldCAqIHdpZHRoXSwKLSAgICAgICAgICAgdGhpc190aWxlX2hlaWdodCAqIHdpZHRoICogc2l6ZW9mKCpjdXJyZW50X3RpbGVfcm93cykpOwotICAgIGZvciAodGlsZV94ID0gMDsgdGlsZV94IDwgdGlsZXNfcGVyX3JvdzsgKyt0aWxlX3gpIHsKLSAgICAgIGludCBwcmVkOwotICAgICAgaW50IHk7Ci0gICAgICBjb25zdCBpbnQgdGlsZV94X29mZnNldCA9IHRpbGVfeCAqIG1heF90aWxlX3NpemU7Ci0gICAgICBpbnQgYWxsX3hfbWF4ID0gdGlsZV94X29mZnNldCArIG1heF90aWxlX3NpemU7Ci0gICAgICBpZiAoYWxsX3hfbWF4ID4gd2lkdGgpIHsKLSAgICAgICAgYWxsX3hfbWF4ID0gd2lkdGg7Ci0gICAgICB9Ci0gICAgICBwcmVkID0gR2V0QmVzdFByZWRpY3RvckZvclRpbGUod2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksIGJpdHMsIGhpc3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2Jfc2NyYXRjaCk7Ci0gICAgICBpbWFnZVt0aWxlX3kgKiB0aWxlc19wZXJfcm93ICsgdGlsZV94XSA9IDB4ZmYwMDAwMDB1IHwgKHByZWQgPDwgOCk7Ci0gICAgICBDb3B5VGlsZVdpdGhQcmVkaWN0aW9uKHdpZHRoLCBoZWlnaHQsIHRpbGVfeCwgdGlsZV95LCBiaXRzLCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiX3NjcmF0Y2gsIGFyZ2IpOwotICAgICAgZm9yICh5ID0gMDsgeSA8IG1heF90aWxlX3NpemU7ICsreSkgewotICAgICAgICBpbnQgaXg7Ci0gICAgICAgIGludCBhbGxfeDsKLSAgICAgICAgaW50IGFsbF95ID0gdGlsZV95X29mZnNldCArIHk7Ci0gICAgICAgIGlmIChhbGxfeSA+PSBoZWlnaHQpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpeCA9IGFsbF95ICogd2lkdGggKyB0aWxlX3hfb2Zmc2V0OwotICAgICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gYXJnYltpeF07Ci0gICAgICAgICAgKytoaXN0b1swXVthID4+IDI0XTsKLSAgICAgICAgICArK2hpc3RvWzFdWygoYSA+PiAxNikgJiAweGZmKV07Ci0gICAgICAgICAgKytoaXN0b1syXVsoKGEgPj4gOCkgJiAweGZmKV07Ci0gICAgICAgICAgKytoaXN0b1szXVsoYSAmIDB4ZmYpXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBJbnZlcnNlIHByZWRpY3Rpb24uCi1zdGF0aWMgdm9pZCBQcmVkaWN0b3JJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgdWludDMyX3QqIGRhdGEpIHsKLSAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87Ci0gIGlmICh5X3N0YXJ0ID09IDApIHsgIC8vIEZpcnN0IFJvdyBmb2xsb3dzIHRoZSBMIChtb2RlPTEpIG1vZGUuCi0gICAgaW50IHg7Ci0gICAgY29uc3QgdWludDMyX3QgcHJlZDAgPSBQcmVkaWN0b3IwKGRhdGFbLTFdLCBOVUxMKTsKLSAgICBBZGRQaXhlbHNFcShkYXRhLCBwcmVkMCk7Ci0gICAgZm9yICh4ID0gMTsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHByZWQxID0gUHJlZGljdG9yMShkYXRhW3ggLSAxXSwgTlVMTCk7Ci0gICAgICBBZGRQaXhlbHNFcShkYXRhICsgeCwgcHJlZDEpOwotICAgIH0KLSAgICBkYXRhICs9IHdpZHRoOwotICAgICsreV9zdGFydDsKLSAgfQotCi0gIHsKLSAgICBpbnQgeSA9IHlfc3RhcnQ7Ci0gICAgY29uc3QgaW50IG1hc2sgPSAoMSA8PCB0cmFuc2Zvcm0tPmJpdHNfKSAtIDE7Ci0gICAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtLT5iaXRzXyk7Ci0gICAgY29uc3QgdWludDMyX3QqIHByZWRfbW9kZV9iYXNlID0KLSAgICAgICAgdHJhbnNmb3JtLT5kYXRhXyArICh5ID4+IHRyYW5zZm9ybS0+Yml0c18pICogdGlsZXNfcGVyX3JvdzsKLQotICAgIHdoaWxlICh5IDwgeV9lbmQpIHsKLSAgICAgIGludCB4OwotICAgICAgY29uc3QgdWludDMyX3QgcHJlZDIgPSBQcmVkaWN0b3IyKGRhdGFbLTFdLCBkYXRhIC0gd2lkdGgpOwotICAgICAgY29uc3QgdWludDMyX3QqIHByZWRfbW9kZV9zcmMgPSBwcmVkX21vZGVfYmFzZTsKLSAgICAgIFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jOwotCi0gICAgICAvLyBGaXJzdCBwaXhlbCBmb2xsb3dzIHRoZSBUIChtb2RlPTIpIG1vZGUuCi0gICAgICBBZGRQaXhlbHNFcShkYXRhLCBwcmVkMik7Ci0KLSAgICAgIC8vIC4uIHRoZSByZXN0OgotICAgICAgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbKCgqcHJlZF9tb2RlX3NyYysrKSA+PiA4KSAmIDB4Zl07Ci0gICAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICB1aW50MzJfdCBwcmVkOwotICAgICAgICBpZiAoKHggJiBtYXNrKSA9PSAwKSB7ICAgIC8vIHN0YXJ0IG9mIHRpbGUuIFJlYWQgcHJlZGljdG9yIGZ1bmN0aW9uLgotICAgICAgICAgIHByZWRfZnVuYyA9IGtQcmVkaWN0b3JzWygoKnByZWRfbW9kZV9zcmMrKykgPj4gOCkgJiAweGZdOwotICAgICAgICB9Ci0gICAgICAgIHByZWQgPSBwcmVkX2Z1bmMoZGF0YVt4IC0gMV0sIGRhdGEgKyB4IC0gd2lkdGgpOwotICAgICAgICBBZGRQaXhlbHNFcShkYXRhICsgeCwgcHJlZCk7Ci0gICAgICB9Ci0gICAgICBkYXRhICs9IHdpZHRoOwotICAgICAgKyt5OwotICAgICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgeyAgIC8vIFVzZSB0aGUgc2FtZSBtYXNrLCBzaW5jZSB0aWxlcyBhcmUgc3F1YXJlcy4KLSAgICAgICAgcHJlZF9tb2RlX2Jhc2UgKz0gdGlsZXNfcGVyX3JvdzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4cykgewotICBpbnQgaSA9IDA7Ci0jaWYgZGVmaW5lZChXRUJQX1RBUkdFVF9IQVNfU1NFMikKLSAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldDFfZXBpMzIoMHgwMDAwZmYwMCk7Ci0gIGZvciAoOyBpICsgNCA8IG51bV9waXhzOyBpICs9IDQpIHsKLSAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldKTsKLSAgICBjb25zdCBfX20xMjhpIGluXzAwZzAgPSBfbW1fYW5kX3NpMTI4KGluLCBtYXNrKTsgICAgIC8vIDAwZzB8MDBnMHwuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzBnMDAgPSBfbW1fc2xsaV9lcGkzMihpbl8wMGcwLCA4KTsgIC8vIDBnMDB8MGcwMHwuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzAwMGcgPSBfbW1fc3JsaV9lcGkzMihpbl8wMGcwLCA4KTsgIC8vIDAwMGd8MDAwZ3wuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzBnMGcgPSBfbW1fb3Jfc2kxMjgoaW5fMGcwMCwgaW5fMDAwZyk7Ci0gICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fc3ViX2VwaTgoaW4sIGluXzBnMGcpOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0sIG91dCk7Ci0gIH0KLSAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCi0jZW5kaWYKLSAgZm9yICg7IGkgPCBudW1fcGl4czsgKytpKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9IGFyZ2JfZGF0YVtpXTsKLSAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IChhcmdiID4+IDgpICYgMHhmZjsKLSAgICBjb25zdCB1aW50MzJfdCBuZXdfciA9ICgoKGFyZ2IgPj4gMTYpICYgMHhmZikgLSBncmVlbikgJiAweGZmOwotICAgIGNvbnN0IHVpbnQzMl90IG5ld19iID0gKChhcmdiICYgMHhmZikgLSBncmVlbikgJiAweGZmOwotICAgIGFyZ2JfZGF0YVtpXSA9IChhcmdiICYgMHhmZjAwZmYwMCkgfCAobmV3X3IgPDwgMTYpIHwgbmV3X2I7Ci0gIH0KLX0KLQotLy8gQWRkIGdyZWVuIHRvIGJsdWUgYW5kIHJlZCBjaGFubmVscyAoaS5lLiBwZXJmb3JtIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBvZgotLy8gJ3N1YnRyYWN0IGdyZWVuJykuCi1zdGF0aWMgdm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZChjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCB1aW50MzJfdCogZGF0YSkgewotICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRhdGFfZW5kID0gZGF0YSArICh5X2VuZCAtIHlfc3RhcnQpICogd2lkdGg7Ci0jaWYgZGVmaW5lZChXRUJQX1RBUkdFVF9IQVNfU1NFMikKLSAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldDFfZXBpMzIoMHgwMDAwZmYwMCk7Ci0gIGZvciAoOyBkYXRhICsgNCA8IGRhdGFfZW5kOyBkYXRhICs9IDQpIHsKLSAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKilkYXRhKTsKLSAgICBjb25zdCBfX20xMjhpIGluXzAwZzAgPSBfbW1fYW5kX3NpMTI4KGluLCBtYXNrKTsgICAgIC8vIDAwZzB8MDBnMHwuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzBnMDAgPSBfbW1fc2xsaV9lcGkzMihpbl8wMGcwLCA4KTsgIC8vIDBnMDB8MGcwMHwuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzAwMGcgPSBfbW1fc3JsaV9lcGkzMihpbl8wMGcwLCA4KTsgIC8vIDAwMGd8MDAwZ3wuLi4KLSAgICBjb25zdCBfX20xMjhpIGluXzBnMGcgPSBfbW1fb3Jfc2kxMjgoaW5fMGcwMCwgaW5fMDAwZyk7Ci0gICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fYWRkX2VwaTgoaW4sIGluXzBnMGcpOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRhdGEsIG91dCk7Ci0gIH0KLSAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCi0jZW5kaWYKLSAgd2hpbGUgKGRhdGEgPCBkYXRhX2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqZGF0YTsKLSAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9ICgoYXJnYiA+PiA4KSAmIDB4ZmYpOwotICAgIHVpbnQzMl90IHJlZF9ibHVlID0gKGFyZ2IgJiAweDAwZmYwMGZmdSk7Ci0gICAgcmVkX2JsdWUgKz0gKGdyZWVuIDw8IDE2KSB8IGdyZWVuOwotICAgIHJlZF9ibHVlICY9IDB4MDBmZjAwZmZ1OwotICAgICpkYXRhKysgPSAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IHJlZF9ibHVlOwotICB9Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gTm90ZTogdGhlIG1lbWJlcnMgYXJlIHVpbnQ4X3QsIHNvIHRoYXQgYW55IG5lZ2F0aXZlIHZhbHVlcyBhcmUKLSAgLy8gYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gIm1vZCAyNTYiIHZhbHVlcy4KLSAgdWludDhfdCBncmVlbl90b19yZWRfOwotICB1aW50OF90IGdyZWVuX3RvX2JsdWVfOwotICB1aW50OF90IHJlZF90b19ibHVlXzsKLX0gTXVsdGlwbGllcnM7Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIE11bHRpcGxpZXJzQ2xlYXIoTXVsdGlwbGllcnMqIG0pIHsKLSAgbS0+Z3JlZW5fdG9fcmVkXyA9IDA7Ci0gIG0tPmdyZWVuX3RvX2JsdWVfID0gMDsKLSAgbS0+cmVkX3RvX2JsdWVfID0gMDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OF90IGNvbG9yX3ByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgY29sb3IpIHsKLSAgcmV0dXJuICh1aW50MzJfdCkoKGludCkoY29sb3JfcHJlZCkgKiBjb2xvcikgPj4gNTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyh1aW50MzJfdCBjb2xvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWVycyogY29uc3QgbSkgewotICBtLT5ncmVlbl90b19yZWRfICA9IChjb2xvcl9jb2RlID4+ICAwKSAmIDB4ZmY7Ci0gIG0tPmdyZWVuX3RvX2JsdWVfID0gKGNvbG9yX2NvZGUgPj4gIDgpICYgMHhmZjsKLSAgbS0+cmVkX3RvX2JsdWVfICAgPSAoY29sb3JfY29kZSA+PiAxNikgJiAweGZmOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTXVsdGlwbGllcnNUb0NvbG9yQ29kZShNdWx0aXBsaWVycyogY29uc3QgbSkgewotICByZXR1cm4gMHhmZjAwMDAwMHUgfAotICAgICAgICAgKCh1aW50MzJfdCkobS0+cmVkX3RvX2JsdWVfKSA8PCAxNikgfAotICAgICAgICAgKCh1aW50MzJfdCkobS0+Z3JlZW5fdG9fYmx1ZV8pIDw8IDgpIHwKLSAgICAgICAgIG0tPmdyZWVuX3RvX3JlZF87Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBUcmFuc2Zvcm1Db2xvcihjb25zdCBNdWx0aXBsaWVycyogY29uc3QgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiLCBpbnQgaW52ZXJzZSkgewotICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKLSAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKLSAgdWludDMyX3QgbmV3X3JlZCA9IHJlZDsKLSAgdWludDMyX3QgbmV3X2JsdWUgPSBhcmdiOwotCi0gIGlmIChpbnZlcnNlKSB7Ci0gICAgbmV3X3JlZCArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKLSAgICBuZXdfcmVkICY9IDB4ZmY7Ci0gICAgbmV3X2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOwotICAgIG5ld19ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCBuZXdfcmVkKTsKLSAgICBuZXdfYmx1ZSAmPSAweGZmOwotICB9IGVsc2UgewotICAgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7Ci0gICAgbmV3X3JlZCAmPSAweGZmOwotICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKLSAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgcmVkKTsKLSAgICBuZXdfYmx1ZSAmPSAweGZmOwotICB9Ci0gIHJldHVybiAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IChuZXdfcmVkIDw8IDE2KSB8IChuZXdfYmx1ZSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yUmVkKHVpbnQ4X3QgZ3JlZW5fdG9fcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgewotICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKLSAgdWludDMyX3QgbmV3X3JlZCA9IGFyZ2IgPj4gMTY7Ci0gIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19yZWQsIGdyZWVuKTsKLSAgcmV0dXJuIChuZXdfcmVkICYgMHhmZik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yQmx1ZSh1aW50OF90IGdyZWVuX3RvX2JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWRfdG9fYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OwotICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OwotICB1aW50OF90IG5ld19ibHVlID0gYXJnYjsKLSAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19ibHVlLCBncmVlbik7Ci0gIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocmVkX3RvX2JsdWUsIHJlZCk7Ci0gIHJldHVybiAobmV3X2JsdWUgJiAweGZmKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBTa2lwUmVwZWF0ZWRQaXhlbHMoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXgsIGludCB4c2l6ZSkgewotICBjb25zdCB1aW50MzJfdCB2ID0gYXJnYltpeF07Ci0gIGlmIChpeCA+PSB4c2l6ZSArIDMpIHsKLSAgICBpZiAodiA9PSBhcmdiW2l4IC0geHNpemVdICYmCi0gICAgICAgIGFyZ2JbaXggLSAxXSA9PSBhcmdiW2l4IC0geHNpemUgLSAxXSAmJgotICAgICAgICBhcmdiW2l4IC0gMl0gPT0gYXJnYltpeCAtIHhzaXplIC0gMl0gJiYKLSAgICAgICAgYXJnYltpeCAtIDNdID09IGFyZ2JbaXggLSB4c2l6ZSAtIDNdKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHYgPT0gYXJnYltpeCAtIDNdICYmIHYgPT0gYXJnYltpeCAtIDJdICYmIHYgPT0gYXJnYltpeCAtIDFdOwotICB9IGVsc2UgaWYgKGl4ID49IDMpIHsKLSAgICByZXR1cm4gdiA9PSBhcmdiW2l4IC0gM10gJiYgdiA9PSBhcmdiW2l4IC0gMl0gJiYgdiA9PSBhcmdiW2l4IC0gMV07Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoY29uc3QgaW50IGFjY3VtdWxhdGVkWzI1Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb3VudHNbMjU2XSkgewotICAvLyBGYXZvciBsb3cgZW50cm9weSwgbG9jYWxseSBhbmQgZ2xvYmFsbHkuCi0gIC8vIEZhdm9yIHNtYWxsIGFic29sdXRlIHZhbHVlcyBmb3IgUHJlZGljdGlvbkNvc3RTcGF0aWFsCi0gIHN0YXRpYyBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMi40OwotICByZXR1cm4gQ29tYmluZWRTaGFubm9uRW50cm9weShjb3VudHMsIGFjY3VtdWxhdGVkLCAyNTYpICsKLSAgICAgICAgIFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb3VudHMsIDMsIGtFeHBWYWx1ZSk7Ci19Ci0KLXN0YXRpYyBNdWx0aXBsaWVycyBHZXRCZXN0Q29sb3JUcmFuc2Zvcm1Gb3JUaWxlKAotICAgIGludCB0aWxlX3gsIGludCB0aWxlX3ksIGludCBiaXRzLAotICAgIE11bHRpcGxpZXJzIHByZXZYLAotICAgIE11bHRpcGxpZXJzIHByZXZZLAotICAgIGludCBzdGVwLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICBpbnQqIGFjY3VtdWxhdGVkX3JlZF9oaXN0bywKLSAgICBpbnQqIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8sCi0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IpIHsKLSAgZmxvYXQgYmVzdF9kaWZmID0gTUFYX0RJRkZfQ09TVDsKLSAgZmxvYXQgY3VyX2RpZmY7Ci0gIGNvbnN0IGludCBoYWxmc3RlcCA9IHN0ZXAgLyAyOwotICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKLSAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOwotICBjb25zdCBpbnQgdGlsZV94X29mZnNldCA9IHRpbGVfeCAqIG1heF90aWxlX3NpemU7Ci0gIGludCBncmVlbl90b19yZWQ7Ci0gIGludCBncmVlbl90b19ibHVlOwotICBpbnQgcmVkX3RvX2JsdWU7Ci0gIGludCBhbGxfeF9tYXggPSB0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZTsKLSAgaW50IGFsbF95X21heCA9IHRpbGVfeV9vZmZzZXQgKyBtYXhfdGlsZV9zaXplOwotICBNdWx0aXBsaWVycyBiZXN0X3R4OwotICBNdWx0aXBsaWVyc0NsZWFyKCZiZXN0X3R4KTsKLSAgaWYgKGFsbF94X21heCA+IHhzaXplKSB7Ci0gICAgYWxsX3hfbWF4ID0geHNpemU7Ci0gIH0KLSAgaWYgKGFsbF95X21heCA+IHlzaXplKSB7Ci0gICAgYWxsX3lfbWF4ID0geXNpemU7Ci0gIH0KLQotICBmb3IgKGdyZWVuX3RvX3JlZCA9IC02NDsgZ3JlZW5fdG9fcmVkIDw9IDY0OyBncmVlbl90b19yZWQgKz0gaGFsZnN0ZXApIHsKLSAgICBpbnQgaGlzdG9bMjU2XSA9IHsgMCB9OwotICAgIGludCBhbGxfeTsKLQotICAgIGZvciAoYWxsX3kgPSB0aWxlX3lfb2Zmc2V0OyBhbGxfeSA8IGFsbF95X21heDsgKythbGxfeSkgewotICAgICAgaW50IGl4ID0gYWxsX3kgKiB4c2l6ZSArIHRpbGVfeF9vZmZzZXQ7Ci0gICAgICBpbnQgYWxsX3g7Ci0gICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgaWYgKFNraXBSZXBlYXRlZFBpeGVscyhhcmdiLCBpeCwgeHNpemUpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvclJlZChncmVlbl90b19yZWQsIGFyZ2JbaXhdKV07ICAvLyByZWQuCi0gICAgICB9Ci0gICAgfQotICAgIGN1cl9kaWZmID0gUHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yKCZhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMF0sICZoaXN0b1swXSk7Ci0gICAgaWYgKCh1aW50OF90KWdyZWVuX3RvX3JlZCA9PSBwcmV2WC5ncmVlbl90b19yZWRfKSB7Ci0gICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgfQotICAgIGlmICgodWludDhfdClncmVlbl90b19yZWQgPT0gcHJldlkuZ3JlZW5fdG9fcmVkXykgewotICAgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgotICAgIH0KLSAgICBpZiAoZ3JlZW5fdG9fcmVkID09IDApIHsKLSAgICAgIGN1cl9kaWZmIC09IDM7Ci0gICAgfQotICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgewotICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7Ci0gICAgICBiZXN0X3R4LmdyZWVuX3RvX3JlZF8gPSBncmVlbl90b19yZWQ7Ci0gICAgfQotICB9Ci0gIGJlc3RfZGlmZiA9IE1BWF9ESUZGX0NPU1Q7Ci0gIGZvciAoZ3JlZW5fdG9fYmx1ZSA9IC0zMjsgZ3JlZW5fdG9fYmx1ZSA8PSAzMjsgZ3JlZW5fdG9fYmx1ZSArPSBzdGVwKSB7Ci0gICAgZm9yIChyZWRfdG9fYmx1ZSA9IC0zMjsgcmVkX3RvX2JsdWUgPD0gMzI7IHJlZF90b19ibHVlICs9IHN0ZXApIHsKLSAgICAgIGludCBhbGxfeTsKLSAgICAgIGludCBoaXN0b1syNTZdID0geyAwIH07Ci0gICAgICBmb3IgKGFsbF95ID0gdGlsZV95X29mZnNldDsgYWxsX3kgPCBhbGxfeV9tYXg7ICsrYWxsX3kpIHsKLSAgICAgICAgaW50IGFsbF94OwotICAgICAgICBpbnQgaXggPSBhbGxfeSAqIHhzaXplICsgdGlsZV94X29mZnNldDsKLSAgICAgICAgZm9yIChhbGxfeCA9IHRpbGVfeF9vZmZzZXQ7IGFsbF94IDwgYWxsX3hfbWF4OyArK2FsbF94LCArK2l4KSB7Ci0gICAgICAgICAgaWYgKFNraXBSZXBlYXRlZFBpeGVscyhhcmdiLCBpeCwgeHNpemUpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvckJsdWUoZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGFyZ2JbaXhdKV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGN1cl9kaWZmID0KLSAgICAgICAgICBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoJmFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMF0sICZoaXN0b1swXSk7Ci0gICAgICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2WC5ncmVlbl90b19ibHVlXykgewotICAgICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgICB9Ci0gICAgICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2WS5ncmVlbl90b19ibHVlXykgewotICAgICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgICB9Ci0gICAgICBpZiAoKHVpbnQ4X3QpcmVkX3RvX2JsdWUgPT0gcHJldlgucmVkX3RvX2JsdWVfKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICAgIH0KLSAgICAgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2WS5yZWRfdG9fYmx1ZV8pIHsKLSAgICAgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgotICAgICAgfQotICAgICAgaWYgKGdyZWVuX3RvX2JsdWUgPT0gMCkgewotICAgICAgICBjdXJfZGlmZiAtPSAzOwotICAgICAgfQotICAgICAgaWYgKHJlZF90b19ibHVlID09IDApIHsKLSAgICAgICAgY3VyX2RpZmYgLT0gMzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgewotICAgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKLSAgICAgICAgYmVzdF90eC5ncmVlbl90b19ibHVlXyA9IGdyZWVuX3RvX2JsdWU7Ci0gICAgICAgIGJlc3RfdHgucmVkX3RvX2JsdWVfID0gcmVkX3RvX2JsdWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBiZXN0X3R4OwotfQotCi1zdGF0aWMgdm9pZCBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybShpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3gsIGludCB0aWxlX3ksIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGllcnMgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IpIHsKLSAgaW50IHk7Ci0gIGludCB4c2NhbiA9IDEgPDwgYml0czsKLSAgaW50IHlzY2FuID0gMSA8PCBiaXRzOwotICB0aWxlX3ggPDw9IGJpdHM7Ci0gIHRpbGVfeSA8PD0gYml0czsKLSAgaWYgKHhzY2FuID4geHNpemUgLSB0aWxlX3gpIHsKLSAgICB4c2NhbiA9IHhzaXplIC0gdGlsZV94OwotICB9Ci0gIGlmICh5c2NhbiA+IHlzaXplIC0gdGlsZV95KSB7Ci0gICAgeXNjYW4gPSB5c2l6ZSAtIHRpbGVfeTsKLSAgfQotICB5c2NhbiArPSB0aWxlX3k7Ci0gIGZvciAoeSA9IHRpbGVfeTsgeSA8IHlzY2FuOyArK3kpIHsKLSAgICBpbnQgaXggPSB5ICogeHNpemUgKyB0aWxlX3g7Ci0gICAgY29uc3QgaW50IGVuZF9peCA9IGl4ICsgeHNjYW47Ci0gICAgZm9yICg7IGl4IDwgZW5kX2l4OyArK2l4KSB7Ci0gICAgICBhcmdiW2l4XSA9IFRyYW5zZm9ybUNvbG9yKCZjb2xvcl90cmFuc2Zvcm0sIGFyZ2JbaXhdLCAwKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgc3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBpbWFnZSkgewotICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKLSAgaW50IHRpbGVfeHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgYml0cyk7Ci0gIGludCB0aWxlX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBiaXRzKTsKLSAgaW50IGFjY3VtdWxhdGVkX3JlZF9oaXN0b1syNTZdID0geyAwIH07Ci0gIGludCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvWzI1Nl0gPSB7IDAgfTsKLSAgaW50IHRpbGVfeTsKLSAgaW50IHRpbGVfeDsKLSAgTXVsdGlwbGllcnMgcHJldlg7Ci0gIE11bHRpcGxpZXJzIHByZXZZOwotICBNdWx0aXBsaWVyc0NsZWFyKCZwcmV2WSk7Ci0gIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZYKTsKLSAgZm9yICh0aWxlX3kgPSAwOyB0aWxlX3kgPCB0aWxlX3lzaXplOyArK3RpbGVfeSkgewotICAgIGZvciAodGlsZV94ID0gMDsgdGlsZV94IDwgdGlsZV94c2l6ZTsgKyt0aWxlX3gpIHsKLSAgICAgIE11bHRpcGxpZXJzIGNvbG9yX3RyYW5zZm9ybTsKLSAgICAgIGludCBhbGxfeF9tYXg7Ci0gICAgICBpbnQgeTsKLSAgICAgIGNvbnN0IGludCB0aWxlX3lfb2Zmc2V0ID0gdGlsZV95ICogbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGlmICh0aWxlX3kgIT0gMCkgewotICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlW3RpbGVfeSAqIHRpbGVfeHNpemUgKyB0aWxlX3ggLSAxXSwgJnByZXZYKTsKLSAgICAgICAgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyhpbWFnZVsodGlsZV95IC0gMSkgKiB0aWxlX3hzaXplICsgdGlsZV94XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldlkpOwotICAgICAgfSBlbHNlIGlmICh0aWxlX3ggIT0gMCkgewotICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlW3RpbGVfeSAqIHRpbGVfeHNpemUgKyB0aWxlX3ggLSAxXSwgJnByZXZYKTsKLSAgICAgIH0KLSAgICAgIGNvbG9yX3RyYW5zZm9ybSA9Ci0gICAgICAgICAgR2V0QmVzdENvbG9yVHJhbnNmb3JtRm9yVGlsZSh0aWxlX3gsIHRpbGVfeSwgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZYLCBwcmV2WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiKTsKLSAgICAgIGltYWdlW3RpbGVfeSAqIHRpbGVfeHNpemUgKyB0aWxlX3hdID0KLSAgICAgICAgICBNdWx0aXBsaWVyc1RvQ29sb3JDb2RlKCZjb2xvcl90cmFuc2Zvcm0pOwotICAgICAgQ29weVRpbGVXaXRoQ29sb3JUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl90cmFuc2Zvcm0sIGFyZ2IpOwotCi0gICAgICAvLyBHYXRoZXIgYWNjdW11bGF0ZWQgaGlzdG9ncmFtIGRhdGEuCi0gICAgICBhbGxfeF9tYXggPSB0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGlmIChhbGxfeF9tYXggPiB3aWR0aCkgewotICAgICAgICBhbGxfeF9tYXggPSB3aWR0aDsKLSAgICAgIH0KLSAgICAgIGZvciAoeSA9IDA7IHkgPCBtYXhfdGlsZV9zaXplOyArK3kpIHsKLSAgICAgICAgaW50IGl4OwotICAgICAgICBpbnQgYWxsX3g7Ci0gICAgICAgIGludCBhbGxfeSA9IHRpbGVfeV9vZmZzZXQgKyB5OwotICAgICAgICBpZiAoYWxsX3kgPj0gaGVpZ2h0KSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaXggPSBhbGxfeSAqIHdpZHRoICsgdGlsZV94X29mZnNldDsKLSAgICAgICAgZm9yIChhbGxfeCA9IHRpbGVfeF9vZmZzZXQ7IGFsbF94IDwgYWxsX3hfbWF4OyArK2FsbF94LCArK2l4KSB7Ci0gICAgICAgICAgaWYgKGl4ID49IDIgJiYKLSAgICAgICAgICAgICAgYXJnYltpeF0gPT0gYXJnYltpeCAtIDJdICYmCi0gICAgICAgICAgICAgIGFyZ2JbaXhdID09IGFyZ2JbaXggLSAxXSkgewotICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXggPj0gd2lkdGggKyAyICYmCi0gICAgICAgICAgICAgIGFyZ2JbaXggLSAyXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAyXSAmJgotICAgICAgICAgICAgICBhcmdiW2l4IC0gMV0gPT0gYXJnYltpeCAtIHdpZHRoIC0gMV0gJiYKLSAgICAgICAgICAgICAgYXJnYltpeF0gPT0gYXJnYltpeCAtIHdpZHRoXSkgewotICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcwotICAgICAgICAgIH0KLSAgICAgICAgICArK2FjY3VtdWxhdGVkX3JlZF9oaXN0b1soYXJnYltpeF0gPj4gMTYpICYgMHhmZl07Ci0gICAgICAgICAgKythY2N1bXVsYXRlZF9ibHVlX2hpc3RvW2FyZ2JbaXhdICYgMHhmZl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLy8gQ29sb3Igc3BhY2UgaW52ZXJzZSB0cmFuc2Zvcm0uCi1zdGF0aWMgdm9pZCBDb2xvclNwYWNlSW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCB1aW50MzJfdCogZGF0YSkgewotICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgY29uc3QgaW50IG1hc2sgPSAoMSA8PCB0cmFuc2Zvcm0tPmJpdHNfKSAtIDE7Ci0gIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybS0+Yml0c18pOwotICBpbnQgeSA9IHlfc3RhcnQ7Ci0gIGNvbnN0IHVpbnQzMl90KiBwcmVkX3JvdyA9Ci0gICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OwotCi0gIHdoaWxlICh5IDwgeV9lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCogcHJlZCA9IHByZWRfcm93OwotICAgIE11bHRpcGxpZXJzIG0gPSB7IDAsIDAsIDAgfTsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICBpZiAoKHggJiBtYXNrKSA9PSAwKSBDb2xvckNvZGVUb011bHRpcGxpZXJzKCpwcmVkKyssICZtKTsKLSAgICAgIGRhdGFbeF0gPSBUcmFuc2Zvcm1Db2xvcigmbSwgZGF0YVt4XSwgMSk7Ci0gICAgfQotICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgKyt5OwotICAgIGlmICgoeSAmIG1hc2spID09IDApIHByZWRfcm93ICs9IHRpbGVzX3Blcl9yb3c7OwotICB9Ci19Ci0KLS8vIFNlcGFyYXRlIG91dCBwaXhlbHMgcGFja2VkIHRvZ2V0aGVyIHVzaW5nIHBpeGVsLWJ1bmRsaW5nLgotLy8gV2UgZGVmaW5lIHR3byBtZXRob2RzIGZvciBBUkdCIGRhdGEgKHVpbnQzMl90KSBhbmQgYWxwaGEtb25seSBkYXRhICh1aW50OF90KS4KLSNkZWZpbmUgQ09MT1JfSU5ERVhfSU5WRVJTRShGVU5DX05BTUUsIFRZUEUsIEdFVF9JTkRFWCwgR0VUX1ZBTFVFKSAgICAgICAgICAgICBcCi12b2lkIEZVTkNfTkFNRShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgY29uc3QgVFlQRSogc3JjLCBUWVBFKiBkc3QpIHsgICAgICAgICAgIFwKLSAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBiaXRzX3Blcl9waXhlbCA9IDggPj4gdHJhbnNmb3JtLT5iaXRzXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCA9IHRyYW5zZm9ybS0+ZGF0YV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChiaXRzX3Blcl9waXhlbCA8IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCBwaXhlbHNfcGVyX2J5dGUgPSAxIDw8IHRyYW5zZm9ybS0+Yml0c187ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgY291bnRfbWFzayA9IHBpeGVsc19wZXJfYnl0ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgYml0X21hc2sgPSAoMSA8PCBiaXRzX3Blcl9waXhlbCkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoeSA9IHlfc3RhcnQ7IHkgPCB5X2VuZDsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVpbnQzMl90IHBhY2tlZF9waXhlbHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgLyogV2UgbmVlZCB0byBsb2FkIGZyZXNoICdwYWNrZWRfcGl4ZWxzJyBvbmNlIGV2ZXJ5ICAgICAgICAgICAgICAgICovICBcCi0gICAgICAgIC8qICdwaXhlbHNfcGVyX2J5dGUnIGluY3JlbWVudHMgb2YgeC4gRm9ydHVuYXRlbHksIHBpeGVsc19wZXJfYnl0ZSAqLyAgXAotICAgICAgICAvKiBpcyBhIHBvd2VyIG9mIDIsIHNvIGNhbiBqdXN0IHVzZSBhIG1hc2sgZm9yIHRoYXQsIGluc3RlYWQgb2YgICAgKi8gIFwKLSAgICAgICAgLyogZGVjcmVtZW50aW5nIGEgY291bnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICBcCi0gICAgICAgIGlmICgoeCAmIGNvdW50X21hc2spID09IDApIHBhY2tlZF9waXhlbHMgPSBHRVRfSU5ERVgoKnNyYysrKTsgICAgICAgICAgXAotICAgICAgICAqZHN0KysgPSBHRVRfVkFMVUUoY29sb3JfbWFwW3BhY2tlZF9waXhlbHMgJiBiaXRfbWFza10pOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgcGFja2VkX3BpeGVscyA+Pj0gYml0c19wZXJfcGl4ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbR0VUX0lOREVYKCpzcmMrKyldKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QVJHQkluZGV4KHVpbnQzMl90IGlkeCkgewotICByZXR1cm4gKGlkeCA+PiA4KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IEdldEFscGhhSW5kZXgodWludDhfdCBpZHgpIHsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldEFSR0JWYWx1ZSh1aW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgR2V0QWxwaGFWYWx1ZSh1aW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuICh2YWwgPj4gOCkgJiAweGZmOwotfQotCi1zdGF0aWMgQ09MT1JfSU5ERVhfSU5WRVJTRShDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSwgdWludDMyX3QsIEdldEFSR0JJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEFSR0JWYWx1ZSkKLUNPTE9SX0lOREVYX0lOVkVSU0UoVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEsIHVpbnQ4X3QsIEdldEFscGhhSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIEdldEFscGhhVmFsdWUpCi0KLSN1bmRlZiBDT0xPUl9JTkRFWF9JTlZFUlNFCi0KLXZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3N0YXJ0LCBpbnQgcm93X2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGluLCB1aW50MzJfdCogY29uc3Qgb3V0KSB7Ci0gIFNCX0RDSEVDSyhyb3dfc3RhcnQgPCByb3dfZW5kKTsKLSAgU0JfRENIRUNLKHJvd19lbmQgPD0gdHJhbnNmb3JtLT55c2l6ZV8pOwotICBzd2l0Y2ggKHRyYW5zZm9ybS0+dHlwZV8pIHsKLSAgICBjYXNlIFNVQlRSQUNUX0dSRUVOOgotICAgICAgQWRkR3JlZW5Ub0JsdWVBbmRSZWQodHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIG91dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBSRURJQ1RPUl9UUkFOU0ZPUk06Ci0gICAgICBQcmVkaWN0b3JJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBvdXQpOwotICAgICAgaWYgKHJvd19lbmQgIT0gdHJhbnNmb3JtLT55c2l6ZV8pIHsKLSAgICAgICAgLy8gVGhlIGxhc3QgcHJlZGljdGVkIHJvdyBpbiB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHRoZSB0b3AtcHJlZCByb3cKLSAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCByb3cgaW4gbmV4dCBpdGVyYXRpb24uCi0gICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOwotICAgICAgICBTYk1lbW9yeUNvcHkob3V0IC0gd2lkdGgsIG91dCArIChyb3dfZW5kIC0gcm93X3N0YXJ0IC0gMSkgKiB3aWR0aCwKLSAgICAgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCpvdXQpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgotICAgICAgQ29sb3JTcGFjZUludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIG91dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STToKLSAgICAgIGlmIChpbiA9PSBvdXQgJiYgdHJhbnNmb3JtLT5iaXRzXyA+IDApIHsKLSAgICAgICAgLy8gTW92ZSBwYWNrZWQgcGl4ZWxzIHRvIHRoZSBlbmQgb2YgdW5wYWNrZWQgcmVnaW9uLCBzbyB0aGF0IHVucGFja2luZwotICAgICAgICAvLyBjYW4gb2NjdXIgc2VhbWxlc3NseS4KLSAgICAgICAgLy8gQWxzbywgbm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdHJhbnNmb3JtIHRoYXQgYXBwbGllcyBvbgotICAgICAgICAvLyB0aGUgZWZmZWN0aXZlIHdpZHRoIG9mIFZQOExTdWJTYW1wbGVTaXplKHhzaXplXywgYml0c18pLiBBbGwgb3RoZXIKLSAgICAgICAgLy8gdHJhbnNmb3JtcyB3b3JrIG9uIGVmZmVjdGl2ZSB3aWR0aCBvZiB4c2l6ZV8uCi0gICAgICAgIGNvbnN0IGludCBvdXRfc3RyaWRlID0gKHJvd19lbmQgLSByb3dfc3RhcnQpICogdHJhbnNmb3JtLT54c2l6ZV87Ci0gICAgICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKgotICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIHRyYW5zZm9ybS0+Yml0c18pOwotICAgICAgICB1aW50MzJfdCogY29uc3Qgc3JjID0gb3V0ICsgb3V0X3N0cmlkZSAtIGluX3N0cmlkZTsKLSAgICAgICAgU2JNZW1vcnlNb3ZlKHNyYywgb3V0LCBpbl9zdHJpZGUgKiBzaXplb2YoKnNyYykpOwotICAgICAgICBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgc3JjLCBvdXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIGluLCBvdXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbG9yIHNwYWNlIGNvbnZlcnNpb24uCi0KLXN0YXRpYyBpbnQgaXNfYmlnX2VuZGlhbih2b2lkKSB7Ci0gIHN0YXRpYyBjb25zdCB1bmlvbiB7Ci0gICAgdWludDE2X3QgdzsKLSAgICB1aW50OF90IGJbMl07Ci0gIH0gdG1wID0geyAxIH07Ci0gIHJldHVybiAodG1wLmJbMF0gIT0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0IoY29uc3QgdWludDMyX3QqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQShjb25zdCB1aW50MzJfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAyNCkgJiAweGZmOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBNDQ0NChjb25zdCB1aW50MzJfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOwotICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0gICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGYwKSB8ICgoYXJnYiA+PiAxMikgJiAweGYpOwotICAgIGNvbnN0IHVpbnQ4X3QgYmEgPSAoKGFyZ2IgPj4gIDApICYgMHhmMCkgfCAoKGFyZ2IgPj4gMjgpICYgMHhmKTsKLSNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCi0gICAgKmRzdCsrID0gYmE7Ci0gICAgKmRzdCsrID0gcmc7Ci0jZWxzZQotICAgICpkc3QrKyA9IHJnOwotICAgICpkc3QrKyA9IGJhOwotI2VuZGlmCi0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQjU2NShjb25zdCB1aW50MzJfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotICAgIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKGFyZ2IgPj4gMTYpICYgMHhmOCkgfCAoKGFyZ2IgPj4gMTMpICYgMHg3KTsKLSAgICBjb25zdCB1aW50OF90IGdiID0gKChhcmdiID4+ICA1KSAmIDB4ZTApIHwgKChhcmdiID4+ICAzKSAmIDB4MWYpOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgICAqZHN0KysgPSBnYjsKLSAgICAqZHN0KysgPSByZzsKLSNlbHNlCi0gICAgKmRzdCsrID0gcmc7Ci0gICAgKmRzdCsrID0gZ2I7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSKGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOwotICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29weU9yU3dhcChjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3dhcF9vbl9iaWdfZW5kaWFuKSB7Ci0gIGlmIChpc19iaWdfZW5kaWFuKCkgPT0gc3dhcF9vbl9iaWdfZW5kaWFuKSB7Ci0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOwotICAgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgICB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotCi0jaWYgIWRlZmluZWQoX19CSUdfRU5ESUFOX18pCi0jaWYgIWRlZmluZWQoV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04pCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotICAgICAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXAgJTAiIDogIj1yIihhcmdiKSA6ICIwIihhcmdiKSk7Ci0gICAgICAqKHVpbnQzMl90Kilkc3QgPSBhcmdiOwotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLSAgICAgIGFyZ2IgPSBfYnl0ZXN3YXBfdWxvbmcoYXJnYik7Ci0gICAgICAqKHVpbnQzMl90Kilkc3QgPSBhcmdiOwotI2Vsc2UKLSAgICAgIGRzdFswXSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7Ci0gICAgICBkc3RbMV0gPSAoYXJnYiA+PiAxNikgJiAweGZmOwotICAgICAgZHN0WzJdID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAgIGRzdFszXSA9IChhcmdiID4+ICAwKSAmIDB4ZmY7Ci0jZW5kaWYKLSNlbHNlICAvLyBXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTgotICAgICAgZHN0WzBdID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKLSAgICAgIGRzdFsxXSA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgICBkc3RbMl0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICAgZHN0WzNdID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSNlbmRpZgotI2Vsc2UgIC8vIF9fQklHX0VORElBTl9fCi0gICAgICBkc3RbMF0gPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICAgICAgZHN0WzFdID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAgIGRzdFsyXSA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgICBkc3RbM10gPSAoYXJnYiA+PiAyNCkgJiAweGZmOwotI2VuZGlmCi0gICAgICBkc3QgKz0gc2l6ZW9mKGFyZ2IpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIG51bV9waXhlbHMgKiBzaXplb2YoKnNyYykpOwotICB9Ci19Ci0KLXZvaWQgVlA4TENvbnZlcnRGcm9tQkdSQShjb25zdCB1aW50MzJfdCogY29uc3QgaW5fZGF0YSwgaW50IG51bV9waXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DU1BfTU9ERSBvdXRfY29sb3JzcGFjZSwgdWludDhfdCogY29uc3QgcmdiYSkgewotICBzd2l0Y2ggKG91dF9jb2xvcnNwYWNlKSB7Ci0gICAgY2FzZSBNT0RFX1JHQjoKLSAgICAgIENvbnZlcnRCR1JBVG9SR0IoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfUkdCQToKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX3JnYkE6Ci0gICAgICBDb252ZXJ0QkdSQVRvUkdCQShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMCwgbnVtX3BpeGVscywgMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfQkdSOgotICAgICAgQ29udmVydEJHUkFUb0JHUihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9CR1JBOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9iZ3JBOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMCwgbnVtX3BpeGVscywgMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfQVJHQjoKLSAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfQXJnYjoKLSAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7Ci0gICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KHJnYmEsIDEsIG51bV9waXhlbHMsIDEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX1JHQkFfNDQ0NDoKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9yZ2JBXzQ0NDQ6Ci0gICAgICBDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7Ci0gICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NChyZ2JhLCBudW1fcGl4ZWxzLCAxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9SR0JfNTY1OgotICAgICAgQ29udmVydEJHUkFUb1JHQjU2NShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9EQ0hFQ0soMCk7ICAgICAgICAgIC8vIENvZGUgZmxvdyBzaG91bGQgbm90IHJlYWNoIGhlcmUuCi0gIH0KLX0KLQotLy8gQnVuZGxlcyBtdWx0aXBsZSAoMSwgMiwgNCBvciA4KSBwaXhlbHMgaW50byBhIHNpbmdsZSBwaXhlbC4KLXZvaWQgVlA4TEJ1bmRsZUNvbG9yTWFwKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhiaXRzLCB1aW50MzJfdCogY29uc3QgZHN0KSB7Ci0gIGludCB4OwotICBpZiAoeGJpdHMgPiAwKSB7Ci0gICAgY29uc3QgaW50IGJpdF9kZXB0aCA9IDEgPDwgKDMgLSB4Yml0cyk7Ci0gICAgY29uc3QgaW50IG1hc2sgPSAoMSA8PCB4Yml0cykgLSAxOwotICAgIHVpbnQzMl90IGNvZGUgPSAweGZmMDAwMDAwOwotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgeHN1YiA9IHggJiBtYXNrOwotICAgICAgaWYgKHhzdWIgPT0gMCkgewotICAgICAgICBjb2RlID0gMHhmZjAwMDAwMDsKLSAgICAgIH0KLSAgICAgIGNvZGUgfD0gcm93W3hdIDw8ICg4ICsgYml0X2RlcHRoICogeHN1Yik7Ci0gICAgICBkc3RbeCA+PiB4Yml0c10gPSBjb2RlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgZHN0W3hdID0gMHhmZjAwMDAwMCB8IChyb3dbeF0gPDwgOCk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvbG9zc2xlc3MuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkwZWM4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCi0vLwotLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotCi0jaWZuZGVmIFdFQlBfRFNQX0xPU1NMRVNTX0hfCi0jZGVmaW5lIFdFQlBfRFNQX0xPU1NMRVNTX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9kZWNvZGUuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbWFnZSB0cmFuc2Zvcm1zLgotCi1zdHJ1Y3QgVlA4TFRyYW5zZm9ybTsgIC8vIERlZmluZWQgaW4gZGVjL3ZwOGxpLmguCi0KLS8vIFBlcmZvcm1zIGludmVyc2UgdHJhbnNmb3JtIG9mIGRhdGEgZ2l2ZW4gdHJhbnNmb3JtIGluZm9ybWF0aW9uLCBzdGFydCBhbmQgZW5kCi0vLyByb3dzLiBUcmFuc2Zvcm0gd2lsbCBiZSBhcHBsaWVkIHRvIHJvd3MgW3Jvd19zdGFydCwgcm93X2VuZFsuCi0vLyBUaGUgKmluIGFuZCAqb3V0IHBvaW50ZXJzIHJlZmVyIHRvIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGF0YSByZXNwZWN0aXZlbHkKLS8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVybWVkaWF0ZSByb3cgKHJvd19zdGFydCkuCi12b2lkIFZQOExJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IHN0cnVjdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpOwotCi0vLyBTaW1pbGFyIHRvIHRoZSBzdGF0aWMgbWV0aG9kIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtKCkgdGhhdCBpcyBwYXJ0IG9mCi0vLyBsb3NzbGVzcy5jLCBidXQgdXNlZCBvbmx5IGZvciBhbHBoYSBkZWNvZGluZy4gSXQgdGFrZXMgdWludDhfdCAocmF0aGVyIHRoYW4KLS8vIHVpbnQzMl90KSBhcmd1bWVudHMgZm9yICdzcmMnIGFuZCAnZHN0Jy4KLXZvaWQgVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEoCi0gICAgY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKLSAgICBjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCk7Ci0KLS8vIFN1YnRyYWN0cyBncmVlbiBmcm9tIGJsdWUgYW5kIHJlZCBjaGFubmVscy4KLXZvaWQgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCh1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeHMpOwotCi12b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgaW1hZ2UpOwotCi12b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbG9yIHNwYWNlIGNvbnZlcnNpb24uCi0KLS8vIENvbnZlcnRzIGZyb20gQkdSQSB0byBvdGhlciBjb2xvciBzcGFjZXMuCi12b2lkIFZQOExDb252ZXJ0RnJvbUJHUkEoY29uc3QgdWludDMyX3QqIGNvbnN0IGluX2RhdGEsIGludCBudW1fcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ1NQX01PREUgb3V0X2NvbG9yc3BhY2UsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWlzYyBtZXRob2RzLgotCi0vLyBDb21wdXRlcyBzYW1wbGVkIHNpemUgb2YgJ3NpemUnIHdoZW4gc2FtcGxpbmcgdXNpbmcgJ3NhbXBsaW5nIGJpdHMnLgotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExTdWJTYW1wbGVTaXplKHVpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdfYml0cykgewotICByZXR1cm4gKHNpemUgKyAoMSA8PCBzYW1wbGluZ19iaXRzKSAtIDEpID4+IHNhbXBsaW5nX2JpdHM7Ci19Ci0KLS8vIEZhc3RlciBsb2dhcml0aG0gZm9yIGludGVnZXJzLiBTbWFsbCB2YWx1ZXMgdXNlIGEgbG9vay11cCB0YWJsZS4KLSNkZWZpbmUgTE9HX0xPT0tVUF9JRFhfTUFYIDI1NgotZXh0ZXJuIGNvbnN0IGZsb2F0IGtMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXTsKLWV4dGVybiBjb25zdCBmbG9hdCBrU0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdOwotZXh0ZXJuIGZsb2F0IFZQOExGYXN0TG9nMlNsb3coaW50IHYpOwotZXh0ZXJuIGZsb2F0IFZQOExGYXN0U0xvZzJTbG93KGludCB2KTsKLXN0YXRpYyBXRUJQX0lOTElORSBmbG9hdCBWUDhMRmFzdExvZzIoaW50IHYpIHsKLSAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtMb2cyVGFibGVbdl0gOiBWUDhMRmFzdExvZzJTbG93KHYpOwotfQotLy8gRmFzdCBjYWxjdWxhdGlvbiBvZiB2ICogbG9nMih2KSBmb3IgaW50ZWdlciBpbnB1dC4KLXN0YXRpYyBXRUJQX0lOTElORSBmbG9hdCBWUDhMRmFzdFNMb2cyKGludCB2KSB7Ci0gIHJldHVybiAodiA8IExPR19MT09LVVBfSURYX01BWCkgPyBrU0xvZzJUYWJsZVt2XSA6IFZQOExGYXN0U0xvZzJTbG93KHYpOwotfQotCi0KLS8vIEluLXBsYWNlIGRpZmZlcmVuY2Ugb2YgZWFjaCBjb21wb25lbnQgd2l0aCBtb2QgMjU2Lgotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExTdWJQaXhlbHModWludDMyX3QgYSwgdWludDMyX3QgYikgewotICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPQotICAgICAgMHgwMGZmMDBmZnUgKyAoYSAmIDB4ZmYwMGZmMDB1KSAtIChiICYgMHhmZjAwZmYwMHUpOwotICBjb25zdCB1aW50MzJfdCByZWRfYW5kX2JsdWUgPQotICAgICAgMHhmZjAwZmYwMHUgKyAoYSAmIDB4MDBmZjAwZmZ1KSAtIChiICYgMHgwMGZmMDBmZnUpOwotICByZXR1cm4gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Ci19Ci0KLXZvaWQgVlA4TEJ1bmRsZUNvbG9yTWFwKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhiaXRzLCB1aW50MzJfdCogY29uc3QgZHN0KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV0VCUF9EU1BfTE9TU0xFU1NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJhNGY4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotI2luY2x1ZGUgIi4veXV2LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmFuY3kgdXBzYW1wbGVyCi0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIEZhbmN5IHVwc2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgWVVWIHRvIFJHQgotV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzW01PREVfTEFTVF07Ci0KLS8vIEdpdmVuIHNhbXBsZXMgbGFpZCBvdXQgaW4gYSBzcXVhcmUgYXM6Ci0vLyAgW2EgYl0KLS8vICBbYyBkXQotLy8gd2UgaW50ZXJwb2xhdGUgdS92IGFzOgotLy8gIChbOSphICsgMypiICsgMypjICsgICBkICAgIDMqYSArIDkqYiArIDMqYyArICAgZF0gKyBbOCA4XSkgLyAxNgotLy8gIChbMyphICsgICBiICsgOSpjICsgMypkICAgICAgYSArIDMqYiArIDMqYyArIDkqZF0gICBbOCA4XSkgLyAxNgotCi0vLyBXZSBwcm9jZXNzIHUgYW5kIHYgdG9nZXRoZXIgc3Rhc2hlZCBpbnRvIDMyYml0ICgxNmJpdCBlYWNoKS4KLSNkZWZpbmUgTE9BRF9VVih1LCB2KSAoKHUpIHwgKCh2KSA8PCAxNikpCi0KLSNkZWZpbmUgVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAotICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGxhc3RfcGl4ZWxfcGFpciA9IChsZW4gLSAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMl90IHRsX3V2ID0gTE9BRF9VVih0b3BfdVswXSwgdG9wX3ZbMF0pOyAgIC8qIHRvcC1sZWZ0IHNhbXBsZSAqLyAgICAgICAgXAotICB1aW50MzJfdCBsX3V2ICA9IExPQURfVVYoY3VyX3VbMF0sIGN1cl92WzBdKTsgICAvKiBsZWZ0LXNhbXBsZSAqLyAgICAgICAgICAgIFwKLSAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKGJvdHRvbV95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKHggPSAxOyB4IDw9IGxhc3RfcGl4ZWxfcGFpcjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCB0X3V2ID0gTE9BRF9VVih0b3BfdVt4XSwgdG9wX3ZbeF0pOyAgLyogdG9wIHNhbXBsZSAqLyAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgdXYgICA9IExPQURfVVYoY3VyX3VbeF0sIGN1cl92W3hdKTsgIC8qIHNhbXBsZSAqLyAgICAgICAgICAgXAotICAgIC8qIHByZWNvbXB1dGUgaW52YXJpYW50IHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZmlyc3QgYW5kIHNlY29uZCBkaWFnb25hbHMqL1wKLSAgICBjb25zdCB1aW50MzJfdCBhdmcgPSB0bF91diArIHRfdXYgKyBsX3V2ICsgdXYgKyAweDAwMDgwMDA4dTsgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgZGlhZ18xMiA9IChhdmcgKyAyICogKHRfdXYgKyBsX3V2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQzMl90IGRpYWdfMDMgPSAoYXZnICsgMiAqICh0bF91diArIHV2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoZGlhZ18xMiArIHRsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYxID0gKGRpYWdfMDMgKyB0X3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbMiAqIHggLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHRvcF9kc3QgKyAoMiAqIHggLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDApICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzAzICsgbF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18xMiArIHV2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlVOQyhib3R0b21feVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgYm90dG9tX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdHRvbV95WzIgKiB4ICsgMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4ICsgMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGxfdXYgPSB0X3V2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxfdXYgPSB1djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICghKGxlbiAmIDEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95W2xlbiAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICB0b3BfZHN0ICsgKGxlbiAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90dG9tX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGJvdHRvbV9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpciwgIFZQOFl1dlRvUmdiLCAgMykKLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpciwgIFZQOFl1dlRvQmdyLCAgMykKLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXIsIFZQOFl1dlRvUmdiYSwgNCkKLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXIsIFZQOFl1dlRvQmdyYSwgNCkKLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXIsIFZQOFl1dlRvQXJnYiwgNCkKLVVQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgVlA4WXV2VG9SZ2I1NjUsICAyKQotCi0jdW5kZWYgTE9BRF9VVgotI3VuZGVmIFVQU0FNUExFX0ZVTkMKLQotI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzaW1wbGUgcG9pbnQtc2FtcGxpbmcKLQotI2RlZmluZSBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKLSAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpICs9IDIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMF0sIHVbMF0sIHZbMF0sIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKHRvcF95WzFdLCB1WzBdLCB2WzBdLCB0b3BfZHN0ICsgWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyhib3R0b21feVswXSwgdVswXSwgdlswXSwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMV0sIHVbMF0sIHZbMF0sIGJvdHRvbV9kc3QgKyBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfeSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYm90dG9tX3kgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG9wX2RzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJvdHRvbV9kc3QgKz0gMiAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChpID09IGxlbiAtIDEpIHsgICAgLyogbGFzdCBvbmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMF0sIHVbMF0sIHZbMF0sIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKGJvdHRvbV95WzBdLCB1WzBdLCB2WzBdLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBBbGwgdmFyaWFudHMgaW1wbGVtZW50ZWQuCi1TQU1QTEVfRlVOQyhTYW1wbGVSZ2JMaW5lUGFpciwgICAgICBWUDhZdXZUb1JnYiwgIDMpCi1TQU1QTEVfRlVOQyhTYW1wbGVCZ3JMaW5lUGFpciwgICAgICBWUDhZdXZUb0JnciwgIDMpCi1TQU1QTEVfRlVOQyhTYW1wbGVSZ2JhTGluZVBhaXIsICAgICBWUDhZdXZUb1JnYmEsIDQpCi1TQU1QTEVfRlVOQyhTYW1wbGVCZ3JhTGluZVBhaXIsICAgICBWUDhZdXZUb0JncmEsIDQpCi1TQU1QTEVfRlVOQyhTYW1wbGVBcmdiTGluZVBhaXIsICAgICBWUDhZdXZUb0FyZ2IsIDQpCi1TQU1QTEVfRlVOQyhTYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQotU0FNUExFX0ZVTkMoU2FtcGxlUmdiNTY1TGluZVBhaXIsICAgVlA4WXV2VG9SZ2I1NjUsIDIpCi0KLSN1bmRlZiBTQU1QTEVfRlVOQwotCi1jb25zdCBXZWJQU2FtcGxlTGluZVBhaXJGdW5jIFdlYlBTYW1wbGVyc1tNT0RFX0xBU1RdID0gewotICBTYW1wbGVSZ2JMaW5lUGFpciwgICAgICAgLy8gTU9ERV9SR0IKLSAgU2FtcGxlUmdiYUxpbmVQYWlyLCAgICAgIC8vIE1PREVfUkdCQQotICBTYW1wbGVCZ3JMaW5lUGFpciwgICAgICAgLy8gTU9ERV9CR1IKLSAgU2FtcGxlQmdyYUxpbmVQYWlyLCAgICAgIC8vIE1PREVfQkdSQQotICBTYW1wbGVBcmdiTGluZVBhaXIsICAgICAgLy8gTU9ERV9BUkdCCi0gIFNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsICAvLyBNT0RFX1JHQkFfNDQ0NAotICBTYW1wbGVSZ2I1NjVMaW5lUGFpciwgICAgLy8gTU9ERV9SR0JfNTY1Ci0gIFNhbXBsZVJnYmFMaW5lUGFpciwgICAgICAvLyBNT0RFX3JnYkEKLSAgU2FtcGxlQmdyYUxpbmVQYWlyLCAgICAgIC8vIE1PREVfYmdyQQotICBTYW1wbGVBcmdiTGluZVBhaXIsICAgICAgLy8gTU9ERV9BcmdiCi0gIFNhbXBsZVJnYmE0NDQ0TGluZVBhaXIgICAvLyBNT0RFX3JnYkFfNDQ0NAotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmICFkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpCi0jZGVmaW5lIERVQUxfU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3RfeSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYm90X3UsIGNvbnN0IHVpbnQ4X3QqIGJvdF92LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdF9kc3QsIGludCBsZW4pIHsgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGhhbGZfbGVuID0gbGVuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX2RzdCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WzIgKiB4ICsgMF0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4ICsgMCk7ICAgICAgICAgXAotICAgICAgRlVOQyh0b3BfeVsyICogeCArIDFdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCArIDQpOyAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGxlbiAmIDEpIEZVTkModG9wX3lbMiAqIHggKyAwXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHgpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdF9kc3QgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICh4ID0gMDsgeCA8IGhhbGZfbGVuOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlVOQyhib3RfeVsyICogeCArIDBdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCArIDApOyAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90X3lbMiAqIHggKyAxXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHggKyA0KTsgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChsZW4gJiAxKSBGVU5DKGJvdF95WzIgKiB4ICsgMF0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4KTsgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLURVQUxfU0FNUExFX0ZVTkMoRHVhbExpbmVTYW1wbGVyQkdSQSwgVlA4WXV2VG9CZ3JhKQotRFVBTF9TQU1QTEVfRlVOQyhEdWFsTGluZVNhbXBsZXJBUkdCLCBWUDhZdXZUb0FyZ2IpCi0jdW5kZWYgRFVBTF9TQU1QTEVfRlVOQwotCi0jZW5kaWYgIC8vICFGQU5DWV9VUFNBTVBMSU5HCi0KLVdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQR2V0TGluZVBhaXJDb252ZXJ0ZXIoaW50IGFscGhhX2lzX2xhc3QpIHsKLSAgV2ViUEluaXRVcHNhbXBsZXJzKCk7Ci0gIFZQOFlVVkluaXQoKTsKLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0gIHJldHVybiBXZWJQVXBzYW1wbGVyc1thbHBoYV9pc19sYXN0ID8gTU9ERV9CR1JBIDogTU9ERV9BUkdCXTsKLSNlbHNlCi0gIHJldHVybiAoYWxwaGFfaXNfbGFzdCA/IER1YWxMaW5lU2FtcGxlckJHUkEgOiBEdWFsTGluZVNhbXBsZXJBUkdCKTsKLSNlbmRpZgotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gWVVWNDQ0IGNvbnZlcnRlcgotCi0jZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIEZVTkMoeVtpXSwgdVtpXSwgdltpXSwgJmRzdFtpICogWFNURVBdKTsgICAgICAgICAgIFwKLX0KLQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2IsICAgICAgVlA4WXV2VG9SZ2IsICAzKQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3IsICAgICAgVlA4WXV2VG9CZ3IsICAzKQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhLCAgICAgVlA4WXV2VG9SZ2JhLCA0KQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JhLCAgICAgVlA4WXV2VG9CZ3JhLCA0KQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9BcmdiLCAgICAgVlA4WXV2VG9BcmdiLCA0KQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhNDQ0NCwgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKLVlVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiNTY1LCAgIFZQOFl1dlRvUmdiNTY1LCAyKQotCi0jdW5kZWYgWVVWNDQ0X0ZVTkMKLQotY29uc3QgV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0xBU1RdID0gewotICBZdXY0NDRUb1JnYiwgICAgICAgLy8gTU9ERV9SR0IKLSAgWXV2NDQ0VG9SZ2JhLCAgICAgIC8vIE1PREVfUkdCQQotICBZdXY0NDRUb0JnciwgICAgICAgLy8gTU9ERV9CR1IKLSAgWXV2NDQ0VG9CZ3JhLCAgICAgIC8vIE1PREVfQkdSQQotICBZdXY0NDRUb0FyZ2IsICAgICAgLy8gTU9ERV9BUkdCCi0gIFl1djQ0NFRvUmdiYTQ0NDQsICAvLyBNT0RFX1JHQkFfNDQ0NAotICBZdXY0NDRUb1JnYjU2NSwgICAgLy8gTU9ERV9SR0JfNTY1Ci0gIFl1djQ0NFRvUmdiYSwgICAgICAvLyBNT0RFX3JnYkEKLSAgWXV2NDQ0VG9CZ3JhLCAgICAgIC8vIE1PREVfYmdyQQotICBZdXY0NDRUb0FyZ2IsICAgICAgLy8gTU9ERV9BcmdiCi0gIFl1djQ0NFRvUmdiYTQ0NDQgICAvLyBNT0RFX3JnYkFfNDQ0NAotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByZW11bHRpcGxpZWQgbW9kZXMKLQotLy8gbm9uIGRpdGhlcmVkLW1vZGVzCi0KLS8vICh4ICogYSAqIDMyODk3KSA+PiAyMyBpcyBiaXQtd2lzZSBlcXVpdmFsZW50IHRvIChpbnQpKHggKiBhIC8gMjU1LikKLS8vIGZvciBhbGwgOGJpdCB4IG9yIGEuIEZvciBiaXQtd2lzZSBlcXVpdmFsZW5jZSB0byAoaW50KSh4ICogYSAvIDI1NS4gKyAuNSksCi0vLyBvbmUgY2FuIHVzZSBpbnN0ZWFkOiAoeCAqIGEgKiA2NTc5MyArICgxIDw8IDIzKSkgPj4gMjQKLSNpZiAxICAgICAvLyAoaW50KSh4ICogYSAvIDI1NS4pCi0jZGVmaW5lIE1VTFRJUExJRVIoYSkgICAoKGEpICogMzI4OTdVTCkKLSNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkpID4+IDIzKQotI2Vsc2UgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LiArIC41KQotI2RlZmluZSBNVUxUSVBMSUVSKGEpICgoYSkgKiA2NTc5M1VMKQotI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSArICgxVUwgPDwgMjMpKSA+PiAyNCkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHkodWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgewotICB3aGlsZSAoaC0tID4gMCkgewotICAgIHVpbnQ4X3QqIGNvbnN0IHJnYiA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAxIDogMCk7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhbHBoYVs0ICogaV07Ci0gICAgICBpZiAoYSAhPSAweGZmKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IG11bHQgPSBNVUxUSVBMSUVSKGEpOwotICAgICAgICByZ2JbNCAqIGkgKyAwXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDBdLCBtdWx0KTsKLSAgICAgICAgcmdiWzQgKiBpICsgMV0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAxXSwgbXVsdCk7Ci0gICAgICAgIHJnYls0ICogaSArIDJdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMl0sIG11bHQpOwotICAgICAgfQotICAgIH0KLSAgICByZ2JhICs9IHN0cmlkZTsKLSAgfQotfQotI3VuZGVmIE1VTFRJUExJRVIKLSN1bmRlZiBQUkVNVUxUSVBMWQotCi0vLyByZ2JBNDQ0NAotCi0jZGVmaW5lIE1VTFRJUExJRVIoYSkgICgoYSkgKiAweDExMTEpICAgIC8vIDB4MTExMSB+PSAoMSA8PCAxNikgLyAxNQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBkaXRoZXJfaGkodWludDhfdCB4KSB7Ci0gIHJldHVybiAoeCAmIDB4ZjApIHwgKHggPj4gNCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9sbyh1aW50OF90IHgpIHsKLSAgcmV0dXJuICh4ICYgMHgwZikgfCAoeCA8PCA0KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgbXVsdGlwbHkodWludDhfdCB4LCB1aW50MzJfdCBtKSB7Ci0gIHJldHVybiAoeCAqIG0pID4+IDE2OwotfQotCi1zdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHVpbnQ4X3QqIHJnYmE0NDQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKLSAgd2hpbGUgKGgtLSA+IDApIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50OF90IGEgPSAocmdiYTQ0NDRbMiAqIGkgKyAxXSAmIDB4MGYpOwotICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7Ci0gICAgICBjb25zdCB1aW50OF90IHIgPSBtdWx0aXBseShkaXRoZXJfaGkocmdiYTQ0NDRbMiAqIGkgKyAwXSksIG11bHQpOwotICAgICAgY29uc3QgdWludDhfdCBnID0gbXVsdGlwbHkoZGl0aGVyX2xvKHJnYmE0NDQ0WzIgKiBpICsgMF0pLCBtdWx0KTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IG11bHRpcGx5KGRpdGhlcl9oaShyZ2JhNDQ0NFsyICogaSArIDFdKSwgbXVsdCk7Ci0gICAgICByZ2JhNDQ0NFsyICogaSArIDBdID0gKHIgJiAweGYwKSB8ICgoZyA+PiA0KSAmIDB4MGYpOwotICAgICAgcmdiYTQ0NDRbMiAqIGkgKyAxXSA9IChiICYgMHhmMCkgfCBhOwotICAgIH0KLSAgICByZ2JhNDQ0NCArPSBzdHJpZGU7Ci0gIH0KLX0KLSN1bmRlZiBNVUxUSVBMSUVSCi0KLXZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5KSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgaW50KQotICAgID0gQXBwbHlBbHBoYU11bHRpcGx5Owotdm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KSh1aW50OF90KiwgaW50LCBpbnQsIGludCkKLSAgICA9IEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGNhbGwKLQotdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnModm9pZCkgewotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gVXBzYW1wbGVSZ2JMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFVwc2FtcGxlQmdyTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyOwotCi0gIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCi0gIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0gICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7Ci0gICAgICBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKCk7Ci0gICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgewotICAgICAgV2ViUEluaXRVcHNhbXBsZXJzTkVPTigpOwotICAgIH0KLSNlbmRpZgotICB9Ci0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLX0KLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5KHZvaWQpIHsKLSAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseSA9IEFwcGx5QWxwaGFNdWx0aXBseTsKLSAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQgPSBBcHBseUFscGhhTXVsdGlwbHk0NDQ0OwotCi0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7Ci0KLSAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKLSAgICAgIFdlYlBJbml0UHJlbXVsdGlwbHlTU0UyKCk7Ci0gICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgewotICAgICAgV2ViUEluaXRQcmVtdWx0aXBseU5FT04oKTsKLSAgICB9Ci0jZW5kaWYKLSAgfQotI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTZhOGU1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX25lb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTkVPTiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBtYW5zQG1hbnNyLmNvbSAoTWFucyBSdWxsZ2FyZCkKLS8vIEJhc2VkIG9uIFNTRSBjb2RlIGJ5OiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXJtX25lb24uaD4KLSNpbmNsdWRlICIuL3l1di5oIgotCi0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotCi0vLyBMb2FkcyA5IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAxNiBwaXhlbHMuCi0jZGVmaW5lIFVQU0FNUExFXzE2UElYRUxTKHIxLCByMiwgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4eDhfdCBhID0gdmxkMV91OChyMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4eDhfdCBiID0gdmxkMV91OChyMSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4eDhfdCBjID0gdmxkMV91OChyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4eDhfdCBkID0gdmxkMV91OChyMiArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQxNng4X3QgYWwgPSB2c2hsbF9uX3U4KGEsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQxNng4X3QgYmwgPSB2c2hsbF9uX3U4KGIsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQxNng4X3QgY2wgPSB2c2hsbF9uX3U4KGMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQxNng4X3QgZGwgPSB2c2hsbF9uX3U4KGQsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4eDhfdCBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQxNng4X3Qgc2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIGEgKyBiICsgYyArIGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNsID0gdmFkZGxfdTgoYSwgIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNsID0gdmFkZHdfdTgoc2wsIGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNsID0gdmFkZHdfdTgoc2wsIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGFsID0gdmFkZHFfdTE2KHNsLCBhbCk7IC8qIDNhICsgIGIgKyAgYyArICBkICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJsID0gdmFkZHFfdTE2KHNsLCBibCk7IC8qICBhICsgM2IgKyAgYyArICBkICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGFsID0gdmFkZHFfdTE2KGFsLCBkbCk7IC8qIDNhICsgIGIgKyAgYyArIDNkICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJsID0gdmFkZHFfdTE2KGJsLCBjbCk7IC8qICBhICsgM2IgKyAzYyArICBkICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRpYWcyID0gdnNocm5fbl91MTYoYWwsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRpYWcxID0gdnNocm5fbl91MTYoYmwsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGEgPSB2cmhhZGRfdTgoYSwgZGlhZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGIgPSB2cmhhZGRfdTgoYiwgZGlhZzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGMgPSB2cmhhZGRfdTgoYywgZGlhZzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGQgPSB2cmhhZGRfdTgoZCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDh4OHgyX3QgYV9iID0ge3sgYSwgYiB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDh4OHgyX3QgY19kID0ge3sgYywgZCB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdnN0Ml91OChvdXQsICAgICAgYV9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdnN0Ml91OChvdXQgKyAzMiwgY19kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCi1zdGF0aWMgdm9pZCBVcHNhbXBsZTE2UGl4ZWxzKGNvbnN0IHVpbnQ4X3QgKnIxLCBjb25zdCB1aW50OF90ICpyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0KSB7Ci0gIFVQU0FNUExFXzE2UElYRUxTKHIxLCByMiwgb3V0KTsKLX0KLQotI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90IHIxWzldLCByMls5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTYk1lbW9yeUNvcHkocjEsICh0YiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTYk1lbW9yeUNvcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTYk1lbW9yeVNldChyMSArIChudW1fcGl4ZWxzKSwgcjFbKG51bV9waXhlbHMpIC0gMV0sIDkgLSAobnVtX3BpeGVscykpOyAgICBcCi0gIFNiTWVtb3J5U2V0KHIyICsgKG51bV9waXhlbHMpLCByMlsobnVtX3BpeGVscykgLSAxXSwgOSAtIChudW1fcGl4ZWxzKSk7ICAgIFwKLSAgVXBzYW1wbGUxNlBpeGVscyhyMSwgcjIsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBDWSAgNzYyODMKLSNkZWZpbmUgQ1ZSIDg5ODU4Ci0jZGVmaW5lIENVRyAyMjAxNAotI2RlZmluZSBDVkcgNDU3NzMKLSNkZWZpbmUgQ1VCIDExMzYxOAotCi1zdGF0aWMgY29uc3QgaW50MTZfdCBjb2VmWzRdID0geyBDVlIgLyA0LCBDVUcsIENWRyAvIDIsIENVQiAvIDQgfTsKLQotI2RlZmluZSBDT05WRVJUOChGTVQsIFhTVEVQLCBOLCBzcmNfeSwgc3JjX3V2LCBvdXQsIGN1cl94KSB7ICAgICAgICAgICAgXAotICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGkgPSAwOyBpIDwgTjsgaSArPSA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBvZmYgPSAoKGN1cl94KSArIGkpICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4eDhfdCB5ICA9IHZsZDFfdTgoc3JjX3kgKyAoY3VyX3gpICArIGkpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4eDhfdCB1ICA9IHZsZDFfdTgoKHNyY191dikgKyBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4eDhfdCB2ICA9IHZsZDFfdTgoKHNyY191dikgKyBpICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDE2eDhfdCB5eSA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh5LCB1MTYpKTsgICAgICAgICAgICAgXAotICAgIGludDE2eDhfdCB1dSA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh1LCB1MTI4KSk7ICAgICAgICAgICAgXAotICAgIGludDE2eDhfdCB2diA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh2LCB1MTI4KSk7ICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDE2eDhfdCB1ZCA9IHZzaGxxX25fczE2KHV1LCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDE2eDhfdCB2ZCA9IHZzaGxxX25fczE2KHZ2LCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCB2cmwgPSB2cWRtbGFsX2xhbmVfczE2KHZzaGxsX25fczE2KHZnZXRfbG93X3MxNih2diksIDEpLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNih2ZCksICBjZjE2LCAwKTsgICAgICAgXAotICAgIGludDMyeDRfdCB2cmggPSB2cWRtbGFsX2xhbmVfczE2KHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYodnYpLCAxKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYodmQpLCBjZjE2LCAwKTsgICAgICAgXAotICAgIGludDE2eDhfdCB2ciA9IHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIodnJsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIodnJoLCAxNikpOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCB2bCA9IHZtb3ZsX3MxNih2Z2V0X2xvd19zMTYodnYpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCB2aCA9IHZtb3ZsX3MxNih2Z2V0X2hpZ2hfczE2KHZ2KSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCB1Z2wgPSB2bWxhbF9sYW5lX3MxNih2bCwgdmdldF9sb3dfczE2KHV1KSwgIGNmMTYsIDEpOyAgICAgXAotICAgIGludDMyeDRfdCB1Z2ggPSB2bWxhbF9sYW5lX3MxNih2aCwgdmdldF9oaWdoX3MxNih1dSksIGNmMTYsIDEpOyAgICAgXAotICAgIGludDMyeDRfdCBnY2wgPSB2cWRtbGFsX2xhbmVfczE2KHVnbCwgdmdldF9sb3dfczE2KHZ2KSwgIGNmMTYsIDIpOyAgXAotICAgIGludDMyeDRfdCBnY2ggPSB2cWRtbGFsX2xhbmVfczE2KHVnaCwgdmdldF9oaWdoX3MxNih2diksIGNmMTYsIDIpOyAgXAotICAgIGludDE2eDhfdCBnYyA9IHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIoZ2NsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIoZ2NoLCAxNikpOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCB1YmwgPSB2cWRtbGFsX2xhbmVfczE2KHZzaGxsX25fczE2KHZnZXRfbG93X3MxNih1dSksIDEpLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNih1ZCksICBjZjE2LCAzKTsgICAgICAgXAotICAgIGludDMyeDRfdCB1YmggPSB2cWRtbGFsX2xhbmVfczE2KHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYodXUpLCAxKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYodWQpLCBjZjE2LCAzKTsgICAgICAgXAotICAgIGludDE2eDhfdCB1YiA9IHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIodWJsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIodWJoLCAxNikpOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyeDRfdCBybCA9IHZhZGRsX3MxNih2Z2V0X2xvd19zMTYoeXkpLCAgdmdldF9sb3dfczE2KHZyKSk7ICAgICAgXAotICAgIGludDMyeDRfdCByaCA9IHZhZGRsX3MxNih2Z2V0X2hpZ2hfczE2KHl5KSwgdmdldF9oaWdoX3MxNih2cikpOyAgICAgXAotICAgIGludDMyeDRfdCBnbCA9IHZzdWJsX3MxNih2Z2V0X2xvd19zMTYoeXkpLCAgdmdldF9sb3dfczE2KGdjKSk7ICAgICAgXAotICAgIGludDMyeDRfdCBnaCA9IHZzdWJsX3MxNih2Z2V0X2hpZ2hfczE2KHl5KSwgdmdldF9oaWdoX3MxNihnYykpOyAgICAgXAotICAgIGludDMyeDRfdCBibCA9IHZhZGRsX3MxNih2Z2V0X2xvd19zMTYoeXkpLCAgdmdldF9sb3dfczE2KHViKSk7ICAgICAgXAotICAgIGludDMyeDRfdCBiaCA9IHZhZGRsX3MxNih2Z2V0X2hpZ2hfczE2KHl5KSwgdmdldF9oaWdoX3MxNih1YikpOyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJsID0gdm11bHFfbGFuZV9zMzIocmwsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJoID0gdm11bHFfbGFuZV9zMzIocmgsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdsID0gdm11bHFfbGFuZV9zMzIoZ2wsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdoID0gdm11bHFfbGFuZV9zMzIoZ2gsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJsID0gdm11bHFfbGFuZV9zMzIoYmwsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJoID0gdm11bHFfbGFuZV9zMzIoYmgsIGNmMzIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHkgPSB2cW1vdnVuX3MxNih2Y29tYmluZV9zMTYodnJzaHJuX25fczMyKHJsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJzaHJuX25fczMyKHJoLCAxNikpKTsgICAgICAgICAgICAgICAgXAotICAgIHUgPSB2cW1vdnVuX3MxNih2Y29tYmluZV9zMTYodnJzaHJuX25fczMyKGdsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJzaHJuX25fczMyKGdoLCAxNikpKTsgICAgICAgICAgICAgICAgXAotICAgIHYgPSB2cW1vdnVuX3MxNih2Y29tYmluZV9zMTYodnJzaHJuX25fczMyKGJsLCAxNiksICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJzaHJuX25fczMyKGJoLCAxNikpKTsgICAgICAgICAgICAgICAgXAotICAgIFNUUl8gIyMgRk1UKG91dCArIG9mZiwgeSwgdSwgdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIHYyNTUgdm1vdl9uX3U4KDI1NSkKLQotI2RlZmluZSBTVFJfUmdiKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4eDNfdCByX2dfYiA9IHt7IHIsIGcsIGIgfX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2c3QzX3U4KG91dCwgcl9nX2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVFJfQmdyKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4eDNfdCBiX2dfciA9IHt7IGIsIGcsIHIgfX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2c3QzX3U4KG91dCwgYl9nX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVFJfUmdiYShvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4eDRfdCByX2dfYl92MjU1ID0ge3sgciwgZywgYiwgdjI1NSB9fTsgICAgICAgICAgICAgICAgICAgXAotICB2c3Q0X3U4KG91dCwgcl9nX2JfdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVFJfQmdyYShvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4eDRfdCBiX2dfcl92MjU1ID0ge3sgYiwgZywgciwgdjI1NSB9fTsgICAgICAgICAgICAgICAgICAgXAotICB2c3Q0X3U4KG91dCwgYl9nX3JfdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDT05WRVJUMShGTVQsIFhTVEVQLCBOLCBzcmNfeSwgc3JjX3V2LCByZ2IsIGN1cl94KSB7ICAgICAgICAgICAgXAotICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBvZmYgPSAoKGN1cl94KSArIGkpICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCB5ID0gc3JjX3lbKGN1cl94KSArIGldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCB1ID0gKHNyY191dilbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCB2ID0gKHNyY191dilbaSArIDE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZQOFl1dlRvICMjIEZNVCh5LCB1LCB2LCByZ2IgKyBvZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENPTlZFUlQyUkdCXzgoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB1diwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gsIGxlbikgeyAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDgoRk1ULCBYU1RFUCwgbGVuLCB0b3BfeSwgdXYsIHRvcF9kc3QsIGN1cl94KSAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDgoRk1ULCBYU1RFUCwgbGVuLCBib3R0b21feSwgKHV2KSArIDMyLCBib3R0b21fZHN0LCBjdXJfeCkgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQ09OVkVSVDJSR0JfMShGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbGVuKSB7ICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUMShGTVQsIFhTVEVQLCBsZW4sIHRvcF95LCB1diwgdG9wX2RzdCwgY3VyX3gpOyAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUMShGTVQsIFhTVEVQLCBsZW4sIGJvdHRvbV95LCAodXYpICsgMzIsIGJvdHRvbV9kc3QsIGN1cl94KTsgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBORU9OX1VQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGTVQsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QgKnRvcF95LCBjb25zdCB1aW50OF90ICpib3R0b21feSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcF91LCBjb25zdCB1aW50OF90ICp0b3BfdiwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1cl91LCBjb25zdCB1aW50OF90ICpjdXJfdiwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRvcF9kc3QsIHVpbnQ4X3QgKmJvdHRvbV9kc3QsIGludCBsZW4pIHsgXAotICBpbnQgYmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiAxNiBieXRlIGFsaWduZWQgYXJyYXkgdG8gY2FjaGUgcmVjb25zdHJ1Y3RlZCB1IGFuZCB2ICovICAgICAgICAgICAgXAotICB1aW50OF90IHV2X2J1ZlsyICogMzIgKyAxNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90ICpjb25zdCByX3V2ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgXAotICBjb25zdCBpbnQgdXZfbGVuID0gKGxlbiArIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiA5IHBpeGVscyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9ICh1dl9sZW4gLSAxKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbGVmdG92ZXIgPSB1dl9sZW4gLSBudW1fYmxvY2tzICogODsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbGFzdF9wb3MgPSAxICsgMTYgKiBudW1fYmxvY2tzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgdV9kaWFnID0gKCh0b3BfdVswXSArIGN1cl91WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgdl9kaWFnID0gKCh0b3BfdlswXSArIGN1cl92WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQxNng0X3QgY2YxNiA9IHZsZDFfczE2KGNvZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQzMngyX3QgY2YzMiA9IHZtb3Zfbl9zMzIoQ1kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4X3QgdTE2ICA9IHZtb3Zfbl91OCgxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50OHg4X3QgdTEyOCA9IHZtb3Zfbl91OCgxMjgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBUcmVhdCB0aGUgZmlyc3QgcGl4ZWwgaW4gcmVndWxhciB3YXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB1MCA9ICh0b3BfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB2MCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZQOFl1dlRvICMjIEZNVCh0b3BfeVswXSwgdTAsIHYwLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB1MCA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB2MCA9IChjdXJfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZQOFl1dlRvICMjIEZNVChib3R0b21feVswXSwgdTAsIHYwLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBudW1fYmxvY2tzOyArK2Jsb2NrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQU0FNUExFXzE2UElYRUxTKHRvcF91LCBjdXJfdSwgcl91dik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQU0FNUExFXzE2UElYRUxTKHRvcF92LCBjdXJfdiwgcl91diArIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQyUkdCXzgoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgMTYgKiBibG9jayArIDEsIDE2KTsgICAgICAgICAgICAgXAotICAgIHRvcF91ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN1cl91ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRvcF92ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN1cl92ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF91LCBjdXJfdSwgbGVmdG92ZXIsIHJfdXYpOyAgICAgICAgICAgICAgICAgICAgXAotICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92LCBjdXJfdiwgbGVmdG92ZXIsIHJfdXYgKyAxNik7ICAgICAgICAgICAgICAgXAotICBDT05WRVJUMlJHQl8xKEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGxhc3RfcG9zLCBsZW4gLSBsYXN0X3Bvcyk7ICAgICAgICAgXAotfQotCi0vLyBORU9OIHZhcmlhbnRzIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXIuCi1ORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpck5FT04sICBSZ2IsICAzKQotTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXJORU9OLCAgQmdyLCAgMykKLU5FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpck5FT04sIFJnYmEsIDQpCi1ORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXJORU9OLCBCZ3JhLCA0KQotCi0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpck5FT047Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpck5FT047Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyTkVPTjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyTkVPTjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX05FT04KLX0KLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5TkVPTih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJORU9OOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJORU9OOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTYwYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZ19zc2UyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNTRTIgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgotLy8KLS8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2luY2x1ZGUgIi4veXV2LmgiCi0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIFdlIGNvbXB1dGUgKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2IGFzIGZvbGxvd3MKLS8vIHUgPSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYKLS8vICAgPSAoYSArIChhICsgMypiICsgMypjICsgZCkgLyA4ICsgMSkgLyAyCi0vLyAgID0gKGEgKyBtICsgMSkgLyAyCi0vLyB3aGVyZSBtID0gKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDgKLS8vICAgICAgICAgPSAoKGEgKyBiICsgYyArIGQpIC8gMiArIGIgKyBjKSAvIDQKLS8vCi0vLyBMZXQncyBzYXkgIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0LgotLy8gV2UgY2FuIGNvbXB1dGUgayBhcwotLy8gayA9IChzICsgdCArIDEpIC8gMiAtICgoYV5kKSB8IChiXmMpIHwgKHNedCkpICYgMQotLy8gd2hlcmUgcyA9IChhICsgZCArIDEpIC8gMiBhbmQgdCA9IChiICsgYyArIDEpIC8gMgotLy8KLS8vIFRoZW4gbSBjYW4gYmUgd3JpdHRlbiBhcwotLy8gbSA9IChrICsgdCArIDEpIC8gMiAtICgoKGJeYykgJiAoc150KSkgfCAoa150KSkgJiAxCi0KLS8vIENvbXB1dGVzIG91dCA9IChrICsgaW4gKyAxKSAvIDIgLSAoKGlqICYgKHNedCkpIHwgKGteaW4pKSAmIDEKLSNkZWZpbmUgR0VUX00oaWosIGluLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hdmdfZXB1OChrLCAoaW4pKTsgICAgIC8qIChrICsgaW4gKyAxKSAvIDIgKi8gICAgICAgXAotICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYW5kX3NpMTI4KChpaiksIHN0KTsgICAvKiAoaWopICYgKHNedCkgKi8gICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3hvcl9zaTEyOChrLCAoaW4pKTsgICAgLyogKGteaW4pICovICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9vcl9zaTEyOCh0bXAxLCB0bXAyKTsgIC8qICgoaWopICYgKHNedCkpIHwgKGteaW4pICovXAotICBjb25zdCBfX20xMjhpIHRtcDQgPSBfbW1fYW5kX3NpMTI4KHRtcDMsIG9uZSk7ICAvKiAmIDEgLT4gbHNiX2NvcnJlY3Rpb24gKi8gIFwKLSAgKG91dCkgPSBfbW1fc3ViX2VwaTgodG1wMCwgdG1wNCk7ICAgIC8qIChrICsgaW4gKyAxKSAvIDIgLSBsc2JfY29ycmVjdGlvbiAqLyBcCi19IHdoaWxlICgwKQotCi0vLyBwYWNrIGFuZCBzdG9yZSB0d28gYWx0ZXJuaW5nIHBpeGVsIHJvd3MKLSNkZWZpbmUgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGEsIGRiLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF9hID0gX21tX2F2Z19lcHU4KGEsIGRhKTsgIC8qICg5YSArIDNiICsgM2MgKyAgZCArIDgpIC8gMTYgKi8gXAotICBjb25zdCBfX20xMjhpIHRfYiA9IF9tbV9hdmdfZXB1OChiLCBkYik7ICAvKiAoM2EgKyA5YiArICBjICsgM2QgKyA4KSAvIDE2ICovIFwKLSAgY29uc3QgX19tMTI4aSB0XzEgPSBfbW1fdW5wYWNrbG9fZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF8yID0gX21tX3VucGFja2hpX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAwLCB0XzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMSwgdF8yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0vLyBMb2FkcyAxNyBwaXhlbHMgZWFjaCBmcm9tIHJvd3MgcjEgYW5kIHIyIGFuZCBnZW5lcmF0ZXMgMzIgcGl4ZWxzLgotI2RlZmluZSBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihyMSlbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGIgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocjEpWzFdKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBjID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHIyKVswXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihyMilbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBzID0gX21tX2F2Z19lcHU4KGEsIGQpOyAgICAgICAgLyogcyA9IChhICsgZCArIDEpIC8gMiAqLyAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdCA9IF9tbV9hdmdfZXB1OChiLCBjKTsgICAgICAgIC8qIHQgPSAoYiArIGMgKyAxKSAvIDIgKi8gICAgICAgXAotICBjb25zdCBfX20xMjhpIHN0ID0gX21tX3hvcl9zaTEyOChzLCB0KTsgICAgICAvKiBzdCA9IHNedCAqLyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYWQgPSBfbW1feG9yX3NpMTI4KGEsIGQpOyAgICAgIC8qIGFkID0gYV5kICovICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChiLCBjKTsgICAgICAvKiBiYyA9IGJeYyAqLyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdDEgPSBfbW1fb3Jfc2kxMjgoYWQsIGJjKTsgICAgIC8qIChhXmQpIHwgKGJeYykgKi8gICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHQyID0gX21tX29yX3NpMTI4KHQxLCBzdCk7ICAgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgKi8gICAgIFwKLSAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9hbmRfc2kxMjgodDIsIG9uZSk7ICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICYgMSAqLyBcCi0gIGNvbnN0IF9fbTEyOGkgdDQgPSBfbW1fYXZnX2VwdTgocywgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGsgPSBfbW1fc3ViX2VwaTgodDQsIHQzKTsgICAgICAvKiBrID0gKGEgKyBiICsgYyArIGQpIC8gNCAqLyAgIFwKLSAgX19tMTI4aSBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBHRVRfTShiYywgdCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcxID0gKGEgKyAzYiArIDNjICsgZCkgLyA4ICovICAgIFwKLSAgR0VUX00oYWQsIHMsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMiA9ICgzYSArIGIgKyBjICsgM2QpIC8gOCAqLyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBwYWNrIHRoZSBhbHRlcm5hdGUgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGlhZzEsIGRpYWcyLCAmKG91dClbMCAqIDMyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFBBQ0tfQU5EX1NUT1JFKGMsIGQsIGRpYWcyLCBkaWFnMSwgJihvdXQpWzIgKiAzMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBUdXJuIHRoZSBtYWNybyBpbnRvIGEgZnVuY3Rpb24gZm9yIHJlZHVjaW5nIGNvZGUtc2l6ZSB3aGVuIG5vbi1jcml0aWNhbAotc3RhdGljIHZvaWQgVXBzYW1wbGUzMlBpeGVscyhjb25zdCB1aW50OF90IHIxW10sIGNvbnN0IHVpbnQ4X3QgcjJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0KSB7Ci0gIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KTsKLX0KLQotI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDhfdCByMVsxN10sIHIyWzE3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTYk1lbW9yeUNvcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogcmVwbGljYXRlIGxhc3QgYnl0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5U2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCi0gIFNiTWVtb3J5U2V0KHIyICsgKG51bV9waXhlbHMpLCByMlsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCi0gIC8qIHVzaW5nIHRoZSBzaGFyZWQgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgbWFjcm8gc2F2ZXMgfjNrIGNvZGUgc2l6ZSAqLyAgICAgXAotICBVcHNhbXBsZTMyUGl4ZWxzKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBDT05WRVJUMlJHQihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB1diwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gsIG51bV9waXhlbHMpIHsgICAgICAgICAgICAgICAgICBcCi0gIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKG4gPSAwOyBuIDwgKG51bV9waXhlbHMpOyArK24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WyhjdXJfeCkgKyBuXSwgKHV2KVtuXSwgKHV2KVszMiArIG5dLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICB0b3BfZHN0ICsgKChjdXJfeCkgKyBuKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKG4gPSAwOyBuIDwgKG51bV9waXhlbHMpOyArK24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdHRvbV95WyhjdXJfeCkgKyBuXSwgKHV2KVs2NCArIG5dLCAodXYpWzY0ICsgMzIgKyBuXSwgICAgICAgICAgICAgXAotICAgICAgICAgICBib3R0b21fZHN0ICsgKChjdXJfeCkgKyBuKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFNTRTJfVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKLSAgaW50IGJsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDE2IGJ5dGUgYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90IHV2X2J1Zls0ICogMzIgKyAxNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDhfdCogY29uc3Qgcl91diA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkodXZfYnVmICsgMTUpICYgfjE1KTsgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB1dl9sZW4gPSAobGVuICsgMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiAxNyBwaXhlbHMgbXVzdCBiZSByZWFkLWFibGUgZm9yIGVhY2ggYmxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IG51bV9ibG9ja3MgPSAodXZfbGVuIC0gMSkgPj4gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsZWZ0b3ZlciA9IHV2X2xlbiAtIG51bV9ibG9ja3MgKiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbGFzdF9wb3MgPSAxICsgMzIgKiBudW1fYmxvY2tzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgdl9kaWFnID0gKCh0b3BfdlswXSArIGN1cl92WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyhsZW4gPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBUcmVhdCB0aGUgZmlyc3QgcGl4ZWwgaW4gcmVndWxhciB3YXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHUwID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB2MCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKHRvcF95WzBdLCB1MCwgdjAsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdTAgPSAoY3VyX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMF0sIHUwLCB2MCwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBudW1fYmxvY2tzOyArK2Jsb2NrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdSwgY3VyX3UsIHJfdXYgKyAwICogMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3YsIGN1cl92LCByX3V2ICsgMSAqIDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQyUkdCKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHJfdXYsIHRvcF9kc3QsIGJvdHRvbV9kc3QsICAgICAgIFwKLSAgICAgICAgICAgICAgICAzMiAqIGJsb2NrICsgMSwgMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG9wX3UgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN1cl91ICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfdiArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3YgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UsIGN1cl91LCBsZWZ0b3Zlciwgcl91diArIDAgKiAzMik7ICAgICAgICAgICAgICAgICAgXAotICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92LCBjdXJfdiwgbGVmdG92ZXIsIHJfdXYgKyAxICogMzIpOyAgICAgICAgICAgICAgICAgIFwKLSAgQ09OVkVSVDJSR0IoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgdG9wX2RzdCwgYm90dG9tX2RzdCwgICAgICAgICBcCi0gICAgICAgICAgICAgIGxhc3RfcG9zLCBsZW4gLSBsYXN0X3Bvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBTU0UyIHZhcmlhbnRzIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXIuCi1TU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpclNTRTIsICBWUDhZdXZUb1JnYiwgIDMpCi1TU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpclNTRTIsICBWUDhZdXZUb0JnciwgIDMpCi1TU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXJTU0UyLCBWUDhZdXZUb1JnYmEsIDQpCi1TU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXJTU0UyLCBWUDhZdXZUb0JncmEsIDQpCi0KLSN1bmRlZiBHRVRfTQotI3VuZGVmIFBBQ0tfQU5EX1NUT1JFCi0jdW5kZWYgVVBTQU1QTEVfMzJQSVhFTFMKLSN1bmRlZiBVUFNBTVBMRV9MQVNUX0JMT0NLCi0jdW5kZWYgQ09OVkVSVDJSR0IKLSN1bmRlZiBTU0UyX1VQU0FNUExFX0ZVTkMKLQotI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCi0KLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOwotCi12b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIodm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICA9IFVwc2FtcGxlUmdiTGluZVBhaXJTU0UyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJTU0UyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gID0gVXBzYW1wbGVCZ3JMaW5lUGFpclNTRTI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpclNTRTI7Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi19Ci0KLXZvaWQgV2ViUEluaXRQcmVtdWx0aXBseVNTRTIodm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyU1NFMjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyU1NFMjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU5Zjc0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC95dXYuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgIi4veXV2LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZkZWYgV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLWludDE2X3QgVlA4a1ZUb1JbMjU2XSwgVlA4a1VUb0JbMjU2XTsKLWludDMyX3QgVlA4a1ZUb0dbMjU2XSwgVlA4a1VUb0dbMjU2XTsKLXVpbnQ4X3QgVlA4a0NsaXBbWVVWX1JBTkdFX01BWCAtIFlVVl9SQU5HRV9NSU5dOwotdWludDhfdCBWUDhrQ2xpcDRCaXRzW1lVVl9SQU5HRV9NQVggLSBZVVZfUkFOR0VfTUlOXTsKLQotc3RhdGljIGludCBkb25lID0gMDsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcChpbnQgdiwgaW50IG1heF92YWx1ZSkgewotICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IG1heF92YWx1ZSA/IG1heF92YWx1ZSA6IHY7Ci19Ci0KLXZvaWQgVlA4WVVWSW5pdCh2b2lkKSB7Ci0gIGludCBpOwotICBpZiAoZG9uZSkgewotICAgIHJldHVybjsKLSAgfQotI2lmbmRlZiBVU0VfWVVWagotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLSAgICBWUDhrVlRvUltpXSA9ICg4OTg1OCAqIChpIC0gMTI4KSArIFlVVl9IQUxGKSA+PiBZVVZfRklYOwotICAgIFZQOGtVVG9HW2ldID0gLTIyMDE0ICogKGkgLSAxMjgpICsgWVVWX0hBTEY7Ci0gICAgVlA4a1ZUb0dbaV0gPSAtNDU3NzMgKiAoaSAtIDEyOCk7Ci0gICAgVlA4a1VUb0JbaV0gPSAoMTEzNjE4ICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gIH0KLSAgZm9yIChpID0gWVVWX1JBTkdFX01JTjsgaSA8IFlVVl9SQU5HRV9NQVg7ICsraSkgewotICAgIGNvbnN0IGludCBrID0gKChpIC0gMTYpICogNzYyODMgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKLSAgICBWUDhrQ2xpcFtpIC0gWVVWX1JBTkdFX01JTl0gPSBjbGlwKGssIDI1NSk7Ci0gICAgVlA4a0NsaXA0Qml0c1tpIC0gWVVWX1JBTkdFX01JTl0gPSBjbGlwKChrICsgOCkgPj4gNCwgMTUpOwotICB9Ci0jZWxzZQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLSAgICBWUDhrVlRvUltpXSA9ICg5MTg4MSAqIChpIC0gMTI4KSArIFlVVl9IQUxGKSA+PiBZVVZfRklYOwotICAgIFZQOGtVVG9HW2ldID0gLTIyNTU0ICogKGkgLSAxMjgpICsgWVVWX0hBTEY7Ci0gICAgVlA4a1ZUb0dbaV0gPSAtNDY4MDIgKiAoaSAtIDEyOCk7Ci0gICAgVlA4a1VUb0JbaV0gPSAoMTE2MTMwICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gIH0KLSAgZm9yIChpID0gWVVWX1JBTkdFX01JTjsgaSA8IFlVVl9SQU5HRV9NQVg7ICsraSkgewotICAgIGNvbnN0IGludCBrID0gaTsKLSAgICBWUDhrQ2xpcFtpIC0gWVVWX1JBTkdFX01JTl0gPSBjbGlwKGssIDI1NSk7Ci0gICAgVlA4a0NsaXA0Qml0c1tpIC0gWVVWX1JBTkdFX01JTl0gPSBjbGlwKChrICsgOCkgPj4gNCwgMTUpOwotICB9Ci0jZW5kaWYKLQotICBkb25lID0gMTsKLX0KLQotI2Vsc2UKLQotdm9pZCBWUDhZVVZJbml0KHZvaWQpIHt9Ci0KLSNlbmRpZiAgLy8gV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ0ZDhjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC95dXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gaW5saW5lIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9uCi0vLwotLy8gVGhlIGV4YWN0IG5hbWluZyBpcyBZJ0NiQ3IsIGZvbGxvd2luZyB0aGUgSVRVLVIgQlQuNjAxIHN0YW5kYXJkLgotLy8gTW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDcgotLy8gWSA9IDAuMjU2OSAqIFIgKyAwLjUwNDQgKiBHICsgMC4wOTc5ICogQiArIDE2Ci0vLyBVID0gLTAuMTQ4MyAqIFIgLSAwLjI5MTEgKiBHICsgMC40Mzk0ICogQiArIDEyOAotLy8gViA9IDAuNDM5NCAqIFIgLSAwLjM2NzkgKiBHIC0gMC4wNzE1ICogQiArIDEyOAotLy8gV2UgdXNlIDE2Yml0IGZpeGVkIHBvaW50IG9wZXJhdGlvbnMgZm9yIFJHQi0+WVVWIGNvbnZlcnNpb24uCi0vLwotLy8gRm9yIHRoZSBZJ0NiQ3IgdG8gUkdCIGNvbnZlcnNpb24sIHRoZSBCVC42MDEgc3BlY2lmaWNhdGlvbiByZWFkczoKLS8vICAgUiA9IDEuMTY0ICogKFktMTYpICsgMS41OTYgKiAoVi0xMjgpCi0vLyAgIEcgPSAxLjE2NCAqIChZLTE2KSAtIDAuODEzICogKFYtMTI4KSAtIDAuMzkxICogKFUtMTI4KQotLy8gICBCID0gMS4xNjQgKiAoWS0xNikgICAgICAgICAgICAgICAgICAgKyAyLjAxOCAqIChVLTEyOCkKLS8vIHdoZXJlIFkgaXMgaW4gdGhlIFsxNiwyMzVdIHJhbmdlLCBhbmQgVS9WIGluIHRoZSBbMTYsMjQwXSByYW5nZS4KLS8vIEluIHRoZSB0YWJsZS1sb29rdXAgdmVyc2lvbiAoV0VCUF9ZVVZfVVNFX1RBQkxFKSwgdGhlIGNvbW1vbiBmYWN0b3IKLS8vICIxLjE2NCAqIChZLTE2KSIgY2FuIGJlIGhhbmRsZWQgYXMgYW4gb2Zmc2V0IGluIHRoZSBWUDhrQ2xpcFtdIHRhYmxlLgotLy8gU28gaW4gdGhpcyBjYXNlIHRoZSBmb3JtdWxhZSBzaG91bGQgYmUgcmVhZCBhczoKLS8vICAgUiA9IDEuMTY0ICogW1kgKyAxLjM3MSAqIChWLTEyOCkgICAgICAgICAgICAgICAgICBdIC0gMTguNjI0Ci0vLyAgIEcgPSAxLjE2NCAqIFtZIC0gMC42OTggKiAoVi0xMjgpIC0gMC4zMzYgKiAoVS0xMjgpXSAtIDE4LjYyNAotLy8gICBCID0gMS4xNjQgKiBbWSAgICAgICAgICAgICAgICAgICArIDEuNzMzICogKFUtMTI4KV0gLSAxOC42MjQKLS8vIG9uY2UgZmFjdG9yaXplZC4gSGVyZSB0b28sIDE2Yml0IGZpeGVkIHByZWNpc2lvbiBpcyB1c2VkLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9EU1BfWVVWX0hfCi0jZGVmaW5lIFdFQlBfRFNQX1lVVl9IXwotCi0jaW5jbHVkZSAiLi4vZGVjL2RlY29kZV92cDguaCIKLQotLy8gRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoZSBMVVQtYmFzZWQgY29kZToKLSNkZWZpbmUgV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLSNpZiBkZWZpbmVkKFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTKQotLy8gRG8gTk9UIGFjdGl2YXRlIHRoaXMgZmVhdHVyZSBmb3IgcmVhbCBjb21wcmVzc2lvbi4gVGhpcyBpcyBvbmx5IGV4cGVyaW1lbnRhbCEKLS8vIFRoaXMgZmxhZyBpcyBmb3IgY29tcGFyaXNvbiBwdXJwb3NlIGFnYWluc3QgSlBFRydzICJZVVZqIiBuYXR1cmFsIGNvbG9yc3BhY2UuCi0vLyBUaGlzIGNvbG9yc3BhY2UgaXMgY2xvc2UgdG8gUmVjLjYwMSdzIFknQ2JDciBtb2RlbCB3aXRoIHRoZSBub3RhYmxlCi0vLyBkaWZmZXJlbmNlIG9mIGFsbG93aW5nIGxhcmdlciByYW5nZSBmb3IgbHVtYS9jaHJvbWEuCi0vLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDciNKUEVHX2NvbnZlcnNpb24gcGFyYWdyYXBoLCBhbmQgaXRzCi0vLyBkaWZmZXJlbmNlIHdpdGggaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDciNJVFUtUl9CVC42MDFfY29udmVyc2lvbgotLy8gI2RlZmluZSBVU0VfWVVWagotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBZVVYgLT4gUkdCIGNvbnZlcnNpb24KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWVudW0geyBZVVZfRklYID0gMTYsICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbgotICAgICAgIFlVVl9IQUxGID0gMSA8PCAoWVVWX0ZJWCAtIDEpLAotICAgICAgIFlVVl9NQVNLID0gKDI1NiA8PCBZVVZfRklYKSAtIDEsCi0gICAgICAgWVVWX1JBTkdFX01JTiA9IC0yMjcsICAgICAgICAvLyBtaW4gdmFsdWUgb2Ygci9nL2Igb3V0cHV0Ci0gICAgICAgWVVWX1JBTkdFX01BWCA9IDI1NiArIDIyNiAgICAvLyBtYXggdmFsdWUgb2Ygci9nL2Igb3V0cHV0Ci19OwotCi0jaWZkZWYgV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLWV4dGVybiBpbnQxNl90IFZQOGtWVG9SWzI1Nl0sIFZQOGtVVG9CWzI1Nl07Ci1leHRlcm4gaW50MzJfdCBWUDhrVlRvR1syNTZdLCBWUDhrVVRvR1syNTZdOwotZXh0ZXJuIHVpbnQ4X3QgVlA4a0NsaXBbWVVWX1JBTkdFX01BWCAtIFlVVl9SQU5HRV9NSU5dOwotZXh0ZXJuIHVpbnQ4X3QgVlA4a0NsaXA0Qml0c1tZVVZfUkFOR0VfTUFYIC0gWVVWX1JBTkdFX01JTl07Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKLSAgY29uc3QgaW50IHJfb2ZmID0gVlA4a1ZUb1Jbdl07Ci0gIGNvbnN0IGludCBnX29mZiA9IChWUDhrVlRvR1t2XSArIFZQOGtVVG9HW3VdKSA+PiBZVVZfRklYOwotICBjb25zdCBpbnQgYl9vZmYgPSBWUDhrVVRvQlt1XTsKLSAgcmdiWzBdID0gVlA4a0NsaXBbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci0gIHJnYlsxXSA9IFZQOGtDbGlwW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotICByZ2JbMl0gPSBWUDhrQ2xpcFt5ICsgYl9vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncikgewotICBjb25zdCBpbnQgcl9vZmYgPSBWUDhrVlRvUlt2XTsKLSAgY29uc3QgaW50IGdfb2ZmID0gKFZQOGtWVG9HW3ZdICsgVlA4a1VUb0dbdV0pID4+IFlVVl9GSVg7Ci0gIGNvbnN0IGludCBiX29mZiA9IFZQOGtVVG9CW3VdOwotICBiZ3JbMF0gPSBWUDhrQ2xpcFt5ICsgYl9vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLSAgYmdyWzFdID0gVlA4a0NsaXBbeSArIGdfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci0gIGJnclsyXSA9IFZQOGtDbGlwW3kgKyByX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYjU2NSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7Ci0gIGNvbnN0IGludCByX29mZiA9IFZQOGtWVG9SW3ZdOwotICBjb25zdCBpbnQgZ19vZmYgPSAoVlA4a1ZUb0dbdl0gKyBWUDhrVVRvR1t1XSkgPj4gWVVWX0ZJWDsKLSAgY29uc3QgaW50IGJfb2ZmID0gVlA4a1VUb0JbdV07Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKFZQOGtDbGlwW3kgKyByX29mZiAtIFlVVl9SQU5HRV9NSU5dICYgMHhmOCkgfAotICAgICAgICAgICAgICAgICAgICAgIChWUDhrQ2xpcFt5ICsgZ19vZmYgLSBZVVZfUkFOR0VfTUlOXSA+PiA1KSk7Ci0gIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoKChWUDhrQ2xpcFt5ICsgZ19vZmYgLSBZVVZfUkFOR0VfTUlOXSA8PCAzKSAmIDB4ZTApIHwKLSAgICAgICAgICAgICAgICAgICAgICAoVlA4a0NsaXBbeSArIGJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gPj4gMykpOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgcmdiWzBdID0gZ2I7Ci0gIHJnYlsxXSA9IHJnOwotI2Vsc2UKLSAgcmdiWzBdID0gcmc7Ci0gIHJnYlsxXSA9IGdiOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYTQ0NDQodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgewotICBjb25zdCBpbnQgcl9vZmYgPSBWUDhrVlRvUlt2XTsKLSAgY29uc3QgaW50IGdfb2ZmID0gKFZQOGtWVG9HW3ZdICsgVlA4a1VUb0dbdV0pID4+IFlVVl9GSVg7Ci0gIGNvbnN0IGludCBiX29mZiA9IFZQOGtVVG9CW3VdOwotICBjb25zdCB1aW50OF90IHJnID0gKChWUDhrQ2xpcDRCaXRzW3kgKyByX29mZiAtIFlVVl9SQU5HRV9NSU5dIDw8IDQpIHwKLSAgICAgICAgICAgICAgICAgICAgICBWUDhrQ2xpcDRCaXRzW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dKTsKLSAgY29uc3QgdWludDhfdCBiYSA9IChWUDhrQ2xpcDRCaXRzW3kgKyBiX29mZiAtIFlVVl9SQU5HRV9NSU5dIDw8IDQpIHwgMHgwZjsKLSNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCi0gIGFyZ2JbMF0gPSBiYTsKLSAgYXJnYlsxXSA9IHJnOwotI2Vsc2UKLSAgYXJnYlswXSA9IHJnOwotICBhcmdiWzFdID0gYmE7Ci0jZW5kaWYKLX0KLQotI2Vsc2UgICAvLyBUYWJsZS1mcmVlIHZlcnNpb24gKHNsb3dlciBvbiB4ODYpCi0KLS8vIFRoZXNlIGNvbnN0YW50cyBhcmUgMTZiIGZpeGVkLXBvaW50IHZlcnNpb24gb2YgSVRVLVIgQlQuNjAxIGNvbnN0YW50cwotI2RlZmluZSBrWVNjYWxlIDc2MzA5ICAgICAgLy8gMS4xNjQgPSAyNTUgLyAyMTkKLSNkZWZpbmUga1ZUb1IgICAxMDQ1OTcgICAgIC8vIDEuNTk2ID0gMjU1IC8gMTEyICogMC43MDEKLSNkZWZpbmUga1VUb0cgICAyNTY3NCAgICAgIC8vIDAuMzkxID0gMjU1IC8gMTEyICogMC44ODYgKiAwLjExNCAvIDAuNTg3Ci0jZGVmaW5lIGtWVG9HICAgNTMyNzggICAgICAvLyAwLjgxMyA9IDI1NSAvIDExMiAqIDAuNzAxICogMC4yOTkgLyAwLjU4NwotI2RlZmluZSBrVVRvQiAgIDEzMjIwMSAgICAgLy8gMi4wMTggPSAyNTUgLyAxMTIgKiAwLjg4NgotI2RlZmluZSBrUkNzdCAoLWtZU2NhbGUgKiAxNiAtIGtWVG9SICogMTI4ICsgWVVWX0hBTEYpCi0jZGVmaW5lIGtHQ3N0ICgta1lTY2FsZSAqIDE2ICsga1VUb0cgKiAxMjggKyBrVlRvRyAqIDEyOCArIFlVVl9IQUxGKQotI2RlZmluZSBrQkNzdCAoLWtZU2NhbGUgKiAxNiAtIGtVVG9CICogMTI4ICsgWVVWX0hBTEYpCi0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOENsaXA4KGludCB2KSB7Ci0gIHJldHVybiAoKHYgJiB+WVVWX01BU0spID09IDApID8gKHVpbnQ4X3QpKHYgPj4gWVVWX0ZJWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodiA8IDApID8gMHUgOiAyNTV1OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBWUDhDbGlwTihpbnQgdiwgaW50IE4pIHsgIC8vIGNsaXAgdG8gTiBiaXRzCi0gIHJldHVybiAoKHYgJiB+WVVWX01BU0spID09IDApID8gKHVpbnQ4X3QpKHYgPj4gKFlVVl9GSVggKyAoOCAtIE4pKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodiA8IDApID8gMHUgOiAoMjU1dSA+PiAoOCAtIE4pKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhZVVZUb1IoaW50IHksIGludCB2KSB7Ci0gIHJldHVybiBrWVNjYWxlICogeSArIGtWVG9SICogdiArIGtSQ3N0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvRyhpbnQgeSwgaW50IHUsIGludCB2KSB7Ci0gIHJldHVybiBrWVNjYWxlICogeSAtIGtVVG9HICogdSAtIGtWVG9HICogdiArIGtHQ3N0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvQihpbnQgeSwgaW50IHUpIHsKLSAgcmV0dXJuIGtZU2NhbGUgKiB5ICArIGtVVG9CICogdSArIGtCQ3N0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7Ci0gIHJnYlswXSA9IFZQOENsaXA4KFZQOFlVVlRvUih5LCB2KSk7Ci0gIHJnYlsxXSA9IFZQOENsaXA4KFZQOFlVVlRvRyh5LCB1LCB2KSk7Ci0gIHJnYlsyXSA9IFZQOENsaXA4KFZQOFlVVlRvQih5LCB1KSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiZ3IpIHsKLSAgYmdyWzBdID0gVlA4Q2xpcDgoVlA4WVVWVG9CKHksIHUpKTsKLSAgYmdyWzFdID0gVlA4Q2xpcDgoVlA4WVVWVG9HKHksIHUsIHYpKTsKLSAgYmdyWzJdID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHYpKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2I1NjUodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgewotICBjb25zdCBpbnQgciA9IFZQOENsaXA4KFZQOFlVVlRvUih5LCB1KSk7Ci0gIGNvbnN0IGludCBnID0gVlA4Q2xpcE4oVlA4WVVWVG9HKHksIHUsIHYpLCA2KTsKLSAgY29uc3QgaW50IGIgPSBWUDhDbGlwTihWUDhZVVZUb0IoeSwgdiksIDUpOwotICBjb25zdCB1aW50OF90IHJnID0gKHIgJiAweGY4KSB8IChnID4+IDMpOwotICBjb25zdCB1aW50OF90IGdiID0gKGcgPDwgNSkgfCBiOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgcmdiWzBdID0gZ2I7Ci0gIHJnYlsxXSA9IHJnOwotI2Vsc2UKLSAgcmdiWzBdID0gcmc7Ci0gIHJnYlsxXSA9IGdiOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYTQ0NDQodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgewotICBjb25zdCBpbnQgciA9IFZQOENsaXA4KFZQOFlVVlRvUih5LCB1KSk7Ci0gIGNvbnN0IGludCBnID0gVlA4Q2xpcE4oVlA4WVVWVG9HKHksIHUsIHYpLCA0KTsKLSAgY29uc3QgaW50IGIgPSBWUDhDbGlwOChWUDhZVVZUb0IoeSwgdikpOwotICBjb25zdCB1aW50OF90IHJnID0gKHIgJiAweGYwKSB8IGc7Ci0gIGNvbnN0IHVpbnQ4X3QgYmEgPSBiIHwgMHgwZjsgICAvLyBvdmVyd3JpdGUgdGhlIGxvd2VyIDQgYml0cwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgYXJnYlswXSA9IGJhOwotICBhcmdiWzFdID0gcmc7Ci0jZWxzZQotICBhcmdiWzBdID0gcmc7Ci0gIGFyZ2JbMV0gPSBiYTsKLSNlbmRpZgotfQotCi0jZW5kaWYgIC8vIFdFQlBfWVVWX1VTRV9UQUJMRQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0FyZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7Ci0gIGFyZ2JbMF0gPSAweGZmOwotICBWUDhZdXZUb1JnYih5LCB1LCB2LCBhcmdiICsgMSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncmEpIHsKLSAgVlA4WXV2VG9CZ3IoeSwgdSwgdiwgYmdyYSk7Ci0gIGJncmFbM10gPSAweGZmOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhKSB7Ci0gIFZQOFl1dlRvUmdiKHksIHUsIHYsIHJnYmEpOwotICByZ2JhWzNdID0gMHhmZjsKLX0KLQotLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV2ZXJ5dGhpbmcsIHRvIGluaXRpYWxpemUgdGhlIHRhYmxlcy4KLXZvaWQgVlA4WVVWSW5pdCh2b2lkKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOENsaXBVVihpbnQgdikgewotICB2ID0gKHYgKyAoMjU3IDw8IChZVVZfRklYICsgMiAtIDEpKSkgPj4gKFlVVl9GSVggKyAyKTsKLSAgcmV0dXJuICgodiAmIH4weGZmKSA9PSAwKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKLX0KLQotI2lmbmRlZiBVU0VfWVVWagotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCBrUm91bmQgPSAoMSA8PCAoWVVWX0ZJWCAtIDEpKSArICgxNiA8PCBZVVZfRklYKTsKLSAgY29uc3QgaW50IGx1bWEgPSAxNjgzOSAqIHIgKyAzMzA1OSAqIGcgKyA2NDIwICogYjsKLSAgcmV0dXJuIChsdW1hICsga1JvdW5kKSA+PiBZVVZfRklYOyAgLy8gbm8gbmVlZCB0byBjbGlwCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IHUgPSAtOTcxOSAqIHIgLSAxOTA4MSAqIGcgKyAyODgwMCAqIGI7Ci0gIHJldHVybiBWUDhDbGlwVVYodSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9WKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IHYgPSArMjg4MDAgKiByIC0gMjQxMTYgKiBnIC0gNDY4NCAqIGI7Ci0gIHJldHVybiBWUDhDbGlwVVYodik7Ci19Ci0KLSNlbHNlCi0KLS8vIFRoaXMgSlBFRy1ZVVYgY29sb3JzcGFjZSwgb25seSBmb3IgY29tcGFyaXNvbiEKLS8vIFRoZXNlIGFyZSBhbHNvIDE2LWJpdCBwcmVjaXNpb24gY29lZmZpY2llbnRzIGZyb20gUmVjLjYwMSwgYnV0IHdpdGggZnVsbAotLy8gWzAuLjI1NV0gb3V0cHV0IHJhbmdlLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1koaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQga1JvdW5kID0gKDEgPDwgKFlVVl9GSVggLSAxKSk7Ci0gIGNvbnN0IGludCBsdW1hID0gMTk1OTUgKiByICsgMzg0NzAgKiBnICsgNzQ3MSAqIGI7Ci0gIHJldHVybiAobHVtYSArIGtSb3VuZCkgPj4gWVVWX0ZJWDsgIC8vIG5vIG5lZWQgdG8gY2xpcAotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCB1ID0gLTExMDU4ICogciAtIDIxNzEwICogZyArIDMyNzY4ICogYjsKLSAgcmV0dXJuIFZQOENsaXBVVih1KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQgdiA9IDMyNzY4ICogciAtIDI3NDM5ICogZyAtIDUzMjkgKiBiOwotICByZXR1cm4gVlA4Q2xpcFVWKHYpOwotfQotCi0jZW5kaWYgICAgLy8gVVNFX1lVVmoKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9EU1BfWVVWX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYWxwaGEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjZjN2U4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBbHBoYS1wbGFuZSBjb21wcmVzc2lvbi4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2ZpbHRlcnMuaCIKLSNpbmNsdWRlICIuLi91dGlscy9xdWFudF9sZXZlbHMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbmNvZGVzIHRoZSBnaXZlbiBhbHBoYSBkYXRhIHZpYSBzcGVjaWZpZWQgY29tcHJlc3Npb24gbWV0aG9kICdtZXRob2QnLgotLy8gVGhlIHByZS1wcm9jZXNzaW5nIChxdWFudGl6YXRpb24pIGlzIHBlcmZvcm1lZCBpZiAncXVhbGl0eScgaXMgbGVzcyB0aGFuIDEwMC4KLS8vIEZvciBzdWNoIGNhc2VzLCB0aGUgZW5jb2RpbmcgaXMgbG9zc3kuIFRoZSB2YWxpZCByYW5nZSBpcyBbMCwgMTAwXSBmb3IKLS8vICdxdWFsaXR5JyBhbmQgWzAsIDFdIGZvciAnbWV0aG9kJzoKLS8vICAgJ21ldGhvZCA9IDAnIC0gTm8gY29tcHJlc3Npb247Ci0vLyAgICdtZXRob2QgPSAxJyAtIFVzZSBsb3NzbGVzcyBjb2RlciBvbiB0aGUgYWxwaGEgcGxhbmUgb25seQotLy8gJ2ZpbHRlcicgdmFsdWVzIFswLCA0XSBjb3JyZXNwb25kIHRvIHByZWRpY3Rpb24gbW9kZXMgbm9uZSwgaG9yaXpvbnRhbCwKLS8vIHZlcnRpY2FsICYgZ3JhZGllbnQgZmlsdGVycy4gVGhlIHByZWRpY3Rpb24gbW9kZSA0IHdpbGwgdHJ5IGFsbCB0aGUKLS8vIHByZWRpY3Rpb24gbW9kZXMgMCB0byAzIGFuZCBwaWNrIHRoZSBiZXN0IG9uZS4KLS8vICdlZmZvcnRfbGV2ZWwnOiBzcGVjaWZpZXMgaG93IG11Y2ggZWZmb3J0IG11c3QgYmUgc3BlbnQgdG8gdHJ5IGFuZCByZWR1Y2UKLS8vICB0aGUgY29tcHJlc3NlZCBvdXRwdXQgc2l6ZS4gSW4gcmFuZ2UgMCAocXVpY2spIHRvIDYgKHNsb3cpLgotLy8KLS8vICdvdXRwdXQnIGNvcnJlc3BvbmRzIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBjb21wcmVzc2VkIGFscGhhIGRhdGEuCi0vLyAgICAgICAgICBUaGlzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhpcyBtZXRob2QgYW5kIGNhbGxlciBzaG91bGQgY2FsbAotLy8gICAgICAgICAgU2JNZW1vcnlEZWFsbG9jYXRlKCpvdXRwdXQpIHdoZW4gZG9uZS4KLS8vICdvdXRwdXRfc2l6ZScgY29ycmVzcG9uZHMgdG8gc2l6ZSBvZiB0aGlzIGNvbXByZXNzZWQgYWxwaGEgYnVmZmVyLgotLy8KLS8vIFJldHVybnMgMSBvbiBzdWNjZXNzZnVsbHkgZW5jb2RpbmcgdGhlIGFscGhhIGFuZAotLy8gICAgICAgICAwIGlmIGVpdGhlcjoKLS8vICAgICAgICAgICBpbnZhbGlkIHF1YWxpdHkgb3IgbWV0aG9kLCBvcgotLy8gICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIGZhaWxzLgotCi0jaW5jbHVkZSAiLi4vZW5jL3ZwOGxpLmgiCi0KLXN0YXRpYyBpbnQgRW5jb2RlTG9zc2xlc3MoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLCAgLy8gaW4gWzAuLjZdIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMpIHsKLSAgaW50IG9rID0gMDsKLSAgV2ViUENvbmZpZyBjb25maWc7Ci0gIFdlYlBQaWN0dXJlIHBpY3R1cmU7Ci0gIFZQOExCaXRXcml0ZXIgdG1wX2J3OwotCi0gIFdlYlBQaWN0dXJlSW5pdCgmcGljdHVyZSk7Ci0gIHBpY3R1cmUud2lkdGggPSB3aWR0aDsKLSAgcGljdHVyZS5oZWlnaHQgPSBoZWlnaHQ7Ci0gIHBpY3R1cmUudXNlX2FyZ2IgPSAxOwotICBwaWN0dXJlLnN0YXRzID0gc3RhdHM7Ci0gIGlmICghV2ViUFBpY3R1cmVBbGxvYygmcGljdHVyZSkpIHJldHVybiAwOwotCi0gIC8vIFRyYW5zZmVyIHRoZSBhbHBoYSB2YWx1ZXMgdG8gdGhlIGdyZWVuIGNoYW5uZWwuCi0gIHsKLSAgICBpbnQgaSwgajsKLSAgICB1aW50MzJfdCogZHN0ID0gcGljdHVyZS5hcmdiOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IGRhdGE7Ci0gICAgZm9yIChqID0gMDsgaiA8IHBpY3R1cmUuaGVpZ2h0OyArK2opIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWN0dXJlLndpZHRoOyArK2kpIHsKLSAgICAgICAgZHN0W2ldID0gKHNyY1tpXSA8PCA4KSB8IDB4ZmYwMDAwMDB1OwotICAgICAgfQotICAgICAgc3JjICs9IHdpZHRoOwotICAgICAgZHN0ICs9IHBpY3R1cmUuYXJnYl9zdHJpZGU7Ci0gICAgfQotICB9Ci0KLSAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7Ci0gIGNvbmZpZy5sb3NzbGVzcyA9IDE7Ci0gIGNvbmZpZy5tZXRob2QgPSBlZmZvcnRfbGV2ZWw7ICAvLyBpbXBhY3QgaXMgdmVyeSBzbWFsbAotICAvLyBTZXQgYSBtb2RlcmF0ZSBkZWZhdWx0IHF1YWxpdHkgc2V0dGluZyBmb3IgYWxwaGEuCi0gIGNvbmZpZy5xdWFsaXR5ID0gMTAuZiAqIGVmZm9ydF9sZXZlbDsKLSAgU0JfRENIRUNLKGNvbmZpZy5xdWFsaXR5ID49IDAgJiYgY29uZmlnLnF1YWxpdHkgPD0gMTAwLmYpOwotCi0gIG9rID0gVlA4TEJpdFdyaXRlckluaXQoJnRtcF9idywgKHdpZHRoICogaGVpZ2h0KSA+PiAzKTsKLSAgb2sgPSBvayAmJiAoVlA4TEVuY29kZVN0cmVhbSgmY29uZmlnLCAmcGljdHVyZSwgJnRtcF9idykgPT0gVlA4X0VOQ19PSyk7Ci0gIFdlYlBQaWN0dXJlRnJlZSgmcGljdHVyZSk7Ci0gIGlmIChvaykgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1ZmZlciA9IFZQOExCaXRXcml0ZXJGaW5pc2goJnRtcF9idyk7Ci0gICAgY29uc3Qgc2l6ZV90IGJ1ZmZlcl9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKCZ0bXBfYncpOwotICAgIFZQOEJpdFdyaXRlckFwcGVuZChidywgYnVmZmVyLCBidWZmZXJfc2l6ZSk7Ci0gIH0KLSAgVlA4TEJpdFdyaXRlckRlc3Ryb3koJnRtcF9idyk7Ci0gIHJldHVybiBvayAmJiAhYnctPmVycm9yXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGludCBFbmNvZGVBbHBoYUludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLCBpbnQgZmlsdGVyLCBpbnQgcmVkdWNlX2xldmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLCAgLy8gaW4gWzAuLjZdIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgdG1wX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgewotICBpbnQgb2sgPSAwOwotICBjb25zdCB1aW50OF90KiBhbHBoYV9zcmM7Ci0gIFdlYlBGaWx0ZXJGdW5jIGZpbHRlcl9mdW5jOwotICB1aW50OF90IGhlYWRlcjsKLSAgc2l6ZV90IGV4cGVjdGVkX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKLQotICBTQl9EQ0hFQ0soKHVpbnQ2NF90KWRhdGFfc2l6ZSA9PSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpOyAgLy8gYXMgcGVyIHNwZWMKLSAgU0JfRENIRUNLKGZpbHRlciA+PSAwICYmIGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1QpOwotICBTQl9EQ0hFQ0sobWV0aG9kID49IEFMUEhBX05PX0NPTVBSRVNTSU9OKTsKLSAgU0JfRENIRUNLKG1ldGhvZCA8PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTik7Ci0gIFNCX0RDSEVDSyhzaXplb2YoaGVhZGVyKSA9PSBBTFBIQV9IRUFERVJfTEVOKTsKLSAgLy8gVE9ETyhza2FsKTogaGF2ZSBhIGNvbW1vbiBmdW5jdGlvbiBhbmQgI2RlZmluZSdzIHRvIHZhbGlkYXRlIGFscGhhIHBhcmFtcy4KLQotICBleHBlY3RlZF9zaXplID0KLSAgICAgIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pID8gKEFMUEhBX0hFQURFUl9MRU4gKyBkYXRhX3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkYXRhX3NpemUgPj4gNSk7Ci0gIGhlYWRlciA9IG1ldGhvZCB8IChmaWx0ZXIgPDwgMik7Ci0gIGlmIChyZWR1Y2VfbGV2ZWxzKSBoZWFkZXIgfD0gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUyA8PCA0OwotCi0gIFZQOEJpdFdyaXRlckluaXQoYncsIGV4cGVjdGVkX3NpemUpOwotICBWUDhCaXRXcml0ZXJBcHBlbmQoYncsICZoZWFkZXIsIEFMUEhBX0hFQURFUl9MRU4pOwotCi0gIGZpbHRlcl9mdW5jID0gV2ViUEZpbHRlcnNbZmlsdGVyXTsKLSAgaWYgKGZpbHRlcl9mdW5jICE9IE5VTEwpIHsKLSAgICBmaWx0ZXJfZnVuYyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgdG1wX2FscGhhKTsKLSAgICBhbHBoYV9zcmMgPSB0bXBfYWxwaGE7Ci0gIH0gIGVsc2UgewotICAgIGFscGhhX3NyYyA9IGRhdGE7Ci0gIH0KLQotICBpZiAobWV0aG9kID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7Ci0gICAgb2sgPSBWUDhCaXRXcml0ZXJBcHBlbmQoYncsIGFscGhhX3NyYywgd2lkdGggKiBoZWlnaHQpOwotICAgIG9rID0gb2sgJiYgIWJ3LT5lcnJvcl87Ci0gIH0gZWxzZSB7Ci0gICAgb2sgPSBFbmNvZGVMb3NzbGVzcyhhbHBoYV9zcmMsIHdpZHRoLCBoZWlnaHQsIGVmZm9ydF9sZXZlbCwgYncsIHN0YXRzKTsKLSAgICBWUDhCaXRXcml0ZXJGaW5pc2goYncpOwotICB9Ci0gIHJldHVybiBvazsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVE9ETyhza2FsKTogbW92ZSB0byBkc3AvID8KLXN0YXRpYyB2b2lkIENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICB3aGlsZSAoaGVpZ2h0LS0gPiAwKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCB3aWR0aCk7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gIH0KLX0KLQotc3RhdGljIGludCBHZXROdW1Db2xvcnMoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgewotICBpbnQgajsKLSAgaW50IGNvbG9ycyA9IDA7Ci0gIHVpbnQ4X3QgY29sb3JbMjU2XSA9IHsgMCB9OwotCi0gIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgewotICAgIGludCBpOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBkYXRhICsgaiAqIHN0cmlkZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgewotICAgICAgY29sb3JbcFtpXV0gPSAxOwotICAgIH0KLSAgfQotICBmb3IgKGogPSAwOyBqIDwgMjU2OyArK2opIHsKLSAgICBpZiAoY29sb3Jbal0gPiAwKSArK2NvbG9yczsKLSAgfQotICByZXR1cm4gY29sb3JzOwotfQotCi1zdGF0aWMgaW50IEVuY29kZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBtZXRob2QsIGludCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBvdXRwdXQsIHNpemVfdCogY29uc3Qgb3V0cHV0X3NpemUpIHsKLSAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OwotCi0gIHVpbnQ4X3QqIHF1YW50X2FscGhhID0gTlVMTDsKLSAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICB1aW50NjRfdCBzc2UgPSAwOwotICBpbnQgb2sgPSAxOwotICBjb25zdCBpbnQgcmVkdWNlX2xldmVscyA9IChxdWFsaXR5IDwgMTAwKTsKLQotICAvLyBxdWljayBzYW5pdHkgY2hlY2tzCi0gIFNCX0RDSEVDSygodWludDY0X3QpZGF0YV9zaXplID09ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCk7ICAvLyBhcyBwZXIgc3BlYwotICBTQl9EQ0hFQ0soZW5jICE9IE5VTEwgJiYgcGljICE9IE5VTEwgJiYgcGljLT5hICE9IE5VTEwpOwotICBTQl9EQ0hFQ0sob3V0cHV0ICE9IE5VTEwgJiYgb3V0cHV0X3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7Ci0gIFNCX0RDSEVDSyhwaWMtPmFfc3RyaWRlID49IHdpZHRoKTsKLSAgU0JfRENIRUNLKGZpbHRlciA+PSBXRUJQX0ZJTFRFUl9OT05FICYmIGZpbHRlciA8PSBXRUJQX0ZJTFRFUl9GQVNUKTsKLQotICBpZiAocXVhbGl0eSA8IDAgfHwgcXVhbGl0eSA+IDEwMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKG1ldGhvZCA8IEFMUEhBX05PX0NPTVBSRVNTSU9OIHx8IG1ldGhvZCA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBxdWFudF9hbHBoYSA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKGRhdGFfc2l6ZSk7Ci0gIGlmIChxdWFudF9hbHBoYSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBFeHRyYWN0IGFscGhhIGRhdGEgKHdpZHRoIHggaGVpZ2h0KSBmcm9tIHJhd19kYXRhIChzdHJpZGUgeCBoZWlnaHQpLgotICBDb3B5UGxhbmUocGljLT5hLCBwaWMtPmFfc3RyaWRlLCBxdWFudF9hbHBoYSwgd2lkdGgsIHdpZHRoLCBoZWlnaHQpOwotCi0gIGlmIChyZWR1Y2VfbGV2ZWxzKSB7ICAvLyBObyBRdWFudGl6YXRpb24gcmVxdWlyZWQgZm9yICdxdWFsaXR5ID0gMTAwJy4KLSAgICAvLyAxNiBhbHBoYSBsZXZlbHMgZ2l2ZXMgcXVpdGUgYSBsb3cgTVNFIHcuci50IG9yaWdpbmFsIGFscGhhIHBsYW5lIGhlbmNlCi0gICAgLy8gbWFwcGVkIHRvIG1vZGVyYXRlIHF1YWxpdHkgNzAuIEhlbmNlIFF1YWxpdHk6WzAsIDcwXSAtPiBMZXZlbHM6WzIsIDE2XQotICAgIC8vIGFuZCBRdWFsaXR5Ol03MCwgMTAwXSAtPiBMZXZlbHM6XTE2LCAyNTZdLgotICAgIGNvbnN0IGludCBhbHBoYV9sZXZlbHMgPSAocXVhbGl0eSA8PSA3MCkgPyAoMiArIHF1YWxpdHkgLyA1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoMTYgKyAocXVhbGl0eSAtIDcwKSAqIDgpOwotICAgIG9rID0gUXVhbnRpemVMZXZlbHMocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIGFscGhhX2xldmVscywgJnNzZSk7Ci0gIH0KLQotICBpZiAob2spIHsKLSAgICBWUDhCaXRXcml0ZXIgYnc7Ci0gICAgaW50IHRlc3RfZmlsdGVyOwotICAgIHVpbnQ4X3QqIGZpbHRlcmVkX2FscGhhID0gTlVMTDsKLSAgICBpbnQgdHJ5X2ZpbHRlcl9ub25lID0gKGVmZm9ydF9sZXZlbCA+IDMpOwotCi0gICAgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9GQVNUKSB7ICAvLyBRdWljayBlc3RpbWF0ZSBvZiB0aGUgYmVzdCBjYW5kaWRhdGUuCi0gICAgICBjb25zdCBpbnQga01pbkNvbG9yc0ZvckZpbHRlck5vbmUgPSAxNjsKLSAgICAgIGNvbnN0IGludCBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSA9IDE5MjsKLSAgICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gR2V0TnVtQ29sb3JzKHF1YW50X2FscGhhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7Ci0gICAgICAvLyBGb3IgbG93IG51bWJlciBvZiBjb2xvcnMsIE5PTkUgeWVpbGRzIGJldHRlciBjb21wcmVzc2lvbi4KLSAgICAgIGZpbHRlciA9IChudW1fY29sb3JzIDw9IGtNaW5Db2xvcnNGb3JGaWx0ZXJOb25lKSA/IFdFQlBfRklMVEVSX05PTkUgOgotICAgICAgICAgICAgICAgRXN0aW1hdGVCZXN0RmlsdGVyKHF1YW50X2FscGhhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7Ci0gICAgICAvLyBGb3IgbGFyZ2UgbnVtYmVyIG9mIGNvbG9ycywgdHJ5IEZJTFRFUl9OT05FIGluIGFkZGl0aW9uIHRvIHRoZSBiZXN0Ci0gICAgICAvLyBmaWx0ZXIgYXMgd2VsbC4KLSAgICAgIGlmIChudW1fY29sb3JzID4ga01heENvbG9yc0ZvckZpbHRlck5vbmUpIHsKLSAgICAgICAgdHJ5X2ZpbHRlcl9ub25lID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUZXN0IGZvciBXRUJQX0ZJTFRFUl9OT05FIGZvciBoaWdoZXIgZWZmb3J0IGxldmVscy4KLSAgICBpZiAodHJ5X2ZpbHRlcl9ub25lIHx8IGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9OT05FKSB7Ci0gICAgICBvayA9IEVuY29kZUFscGhhSW50ZXJuYWwocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBXRUJQX0ZJTFRFUl9OT05FLCByZWR1Y2VfbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZm9ydF9sZXZlbCwgTlVMTCwgJmJ3LCBwaWMtPnN0YXRzKTsKLQotICAgICAgaWYgKCFvaykgewotICAgICAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KCZidyk7Ci0gICAgICAgIGdvdG8gRW5kOwotICAgICAgfQotICAgIH0KLSAgICAvLyBTdG9wPwotICAgIGlmIChmaWx0ZXIgPT0gV0VCUF9GSUxURVJfTk9ORSkgewotICAgICAgZ290byBPazsKLSAgICB9Ci0KLSAgICBmaWx0ZXJlZF9hbHBoYSA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKGRhdGFfc2l6ZSk7Ci0gICAgb2sgPSAoZmlsdGVyZWRfYWxwaGEgIT0gTlVMTCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgZ290byBFbmQ7Ci0gICAgfQotCi0gICAgLy8gVHJ5IHRoZSBvdGhlciBtb2RlKHMpLgotICAgIHsKLSAgICAgIFdlYlBBdXhTdGF0cyBiZXN0X3N0YXRzOwotICAgICAgc2l6ZV90IGJlc3Rfc2NvcmUgPSB0cnlfZmlsdGVyX25vbmUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhCaXRXcml0ZXJTaXplKCZidykgOiAoc2l6ZV90KX4wVTsKLSAgICAgIGludCB3aXBlX3RtcF9idyA9IHRyeV9maWx0ZXJfbm9uZTsKLQotICAgICAgU2JNZW1vcnlTZXQoJmJlc3Rfc3RhdHMsIDAsIHNpemVvZihiZXN0X3N0YXRzKSk7ICAvLyBwcmV2ZW50IHNwdXJpb3VzIHdhcm5pbmcKLSAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIGJlc3Rfc3RhdHMgPSAqcGljLT5zdGF0czsKLSAgICAgIGZvciAodGVzdF9maWx0ZXIgPQotICAgICAgICAgICB0cnlfZmlsdGVyX25vbmUgPyBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMIDogV0VCUF9GSUxURVJfTk9ORTsKLSAgICAgICAgICAgb2sgJiYgKHRlc3RfZmlsdGVyIDw9IFdFQlBfRklMVEVSX0dSQURJRU5UKTsKLSAgICAgICAgICAgKyt0ZXN0X2ZpbHRlcikgewotICAgICAgICBWUDhCaXRXcml0ZXIgdG1wX2J3OwotICAgICAgICBpZiAoZmlsdGVyICE9IFdFQlBfRklMVEVSX0JFU1QgJiYgdGVzdF9maWx0ZXIgIT0gZmlsdGVyKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgb2sgPSBFbmNvZGVBbHBoYUludGVybmFsKHF1YW50X2FscGhhLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCB0ZXN0X2ZpbHRlciwgcmVkdWNlX2xldmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZm9ydF9sZXZlbCwgZmlsdGVyZWRfYWxwaGEsICZ0bXBfYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPnN0YXRzKTsKLSAgICAgICAgaWYgKG9rKSB7Ci0gICAgICAgICAgY29uc3Qgc2l6ZV90IHNjb3JlID0gVlA4Qml0V3JpdGVyU2l6ZSgmdG1wX2J3KTsKLSAgICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICAgICAgICAvLyBzd2FwIGJpdHdyaXRlciBvYmplY3RzLgotICAgICAgICAgICAgVlA4Qml0V3JpdGVyIHRtcCA9IHRtcF9idzsKLSAgICAgICAgICAgIHRtcF9idyA9IGJ3OwotICAgICAgICAgICAgYncgPSB0bXA7Ci0gICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSBiZXN0X3N0YXRzID0gKnBpYy0+c3RhdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJ3KTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2lwZV90bXBfYncpIHsKLSAgICAgICAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOwotICAgICAgICB9Ci0gICAgICAgIHdpcGVfdG1wX2J3ID0gMTsgIC8vIEZvciBuZXh0IGZpbHRlciB0cmlhbCBmb3IgV0VCUF9GSUxURVJfQkVTVC4KLSAgICAgIH0KLSAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpICpwaWMtPnN0YXRzID0gYmVzdF9zdGF0czsKLSAgICB9Ci0gT2s6Ci0gICAgaWYgKG9rKSB7Ci0gICAgICAqb3V0cHV0X3NpemUgPSBWUDhCaXRXcml0ZXJTaXplKCZidyk7Ci0gICAgICAqb3V0cHV0ID0gVlA4Qml0V3JpdGVyQnVmKCZidyk7Ci0gICAgICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7ICAgICAgICAgLy8gbmVlZCBzdGF0cz8KLSAgICAgICAgcGljLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KSgqb3V0cHV0X3NpemUpOwotICAgICAgICBlbmMtPnNzZV9bM10gPSBzc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShmaWx0ZXJlZF9hbHBoYSk7Ci0gIH0KLSBFbmQ6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShxdWFudF9hbHBoYSk7Ci0gIHJldHVybiBvazsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBjYWxscwotCi1zdGF0aWMgaW50IENvbXByZXNzQWxwaGFKb2IoVlA4RW5jb2RlciogY29uc3QgZW5jLCB2b2lkKiBkdW1teSkgewotICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWcgPSBlbmMtPmNvbmZpZ187Ci0gIHVpbnQ4X3QqIGFscGhhX2RhdGEgPSBOVUxMOwotICBzaXplX3QgYWxwaGFfc2l6ZSA9IDA7Ci0gIGNvbnN0IGludCBlZmZvcnRfbGV2ZWwgPSBjb25maWctPm1ldGhvZDsgIC8vIG1hcHMgdG8gWzAuLjZdCi0gIGNvbnN0IFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyID0KLSAgICAgIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA9PSAwKSA/IFdFQlBfRklMVEVSX05PTkUgOgotICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDEpID8gV0VCUF9GSUxURVJfRkFTVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0ZJTFRFUl9CRVNUOwotICBpZiAoIUVuY29kZUFscGhhKGVuYywgY29uZmlnLT5hbHBoYV9xdWFsaXR5LCBjb25maWctPmFscGhhX2NvbXByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIGZpbHRlciwgZWZmb3J0X2xldmVsLCAmYWxwaGFfZGF0YSwgJmFscGhhX3NpemUpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGFscGhhX3NpemUgIT0gKHVpbnQzMl90KWFscGhhX3NpemUpIHsgIC8vIFNhbml0eSBjaGVjay4KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoYWxwaGFfZGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gKHVpbnQzMl90KWFscGhhX3NpemU7Ci0gIGVuYy0+YWxwaGFfZGF0YV8gPSBhbHBoYV9kYXRhOwotICAodm9pZClkdW1teTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgVlA4RW5jSW5pdEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBlbmMtPmhhc19hbHBoYV8gPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShlbmMtPnBpY18pOwotICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKLSAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKLSAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKLSAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOwotICAgIFdlYlBXb3JrZXJJbml0KHdvcmtlcik7Ci0gICAgd29ya2VyLT5kYXRhMSA9IGVuYzsKLSAgICB3b3JrZXItPmRhdGEyID0gTlVMTDsKLSAgICB3b3JrZXItPmhvb2sgPSAoV2ViUFdvcmtlckhvb2spQ29tcHJlc3NBbHBoYUpvYjsKLSAgfQotfQotCi1pbnQgVlA4RW5jU3RhcnRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaWYgKGVuYy0+aGFzX2FscGhhXykgewotICAgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7Ci0gICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOwotICAgICAgaWYgKCFXZWJQV29ya2VyUmVzZXQod29ya2VyKSkgeyAgICAvLyBNYWtlcyBzdXJlIHdvcmtlciBpcyBnb29kIHRvIGdvLgotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIFdlYlBXb3JrZXJMYXVuY2god29ya2VyKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQ29tcHJlc3NBbHBoYUpvYihlbmMsIE5VTEwpOyAgIC8vIGp1c3QgZG8gdGhlIGpvYiByaWdodCBhd2F5Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQgVlA4RW5jRmluaXNoQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKLSAgICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgewotICAgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKLSAgICAgIGlmICghV2ViUFdvcmtlclN5bmMod29ya2VyKSkgcmV0dXJuIDA7ICAvLyBlcnJvcgotICAgIH0KLSAgfQotICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Ci19Ci0KLWludCBWUDhFbmNEZWxldGVBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IG9rID0gMTsKLSAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKLSAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOwotICAgIG9rID0gV2ViUFdvcmtlclN5bmMod29ya2VyKTsgIC8vIGZpbmlzaCBhbnl0aGluZyBsZWZ0IGluIGZsaWdodAotICAgIFdlYlBXb3JrZXJFbmQod29ya2VyKTsgIC8vIHN0aWxsIG5lZWQgdG8gZW5kIHRoZSB3b3JrZXIsIGV2ZW4gaWYgIW9rCi0gIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYy0+YWxwaGFfZGF0YV8pOwotICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKLSAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKLSAgZW5jLT5oYXNfYWxwaGFfID0gMDsKLSAgcmV0dXJuIG9rOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA0ZjlkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKLS8vCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiLi9oaXN0b2dyYW0uaCIKLSNpbmNsdWRlICIuLi9kc3AvbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi91dGlscy9jb2xvcl9jYWNoZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNkZWZpbmUgVkFMVUVTX0lOX0JZVEUgMjU2Ci0KLSNkZWZpbmUgSEFTSF9CSVRTIDE4Ci0jZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCi0jZGVmaW5lIEhBU0hfTVVMVElQTElFUiAoMHhjNmE0YTc5MzViZDFlOTk1VUxMKQotCi0vLyAxTSB3aW5kb3cgKDRNIGJ5dGVzKSBtaW51cyAxMjAgc3BlY2lhbCBjb2RlcyBmb3Igc2hvcnQgZGlzdGFuY2VzLgotI2RlZmluZSBXSU5ET1dfU0laRSAoKDEgPDwgMjApIC0gMTIwKQotCi0vLyBCb3VuZHMgZm9yIHRoZSBtYXRjaCBsZW5ndGguCi0jZGVmaW5lIE1JTl9MRU5HVEggMgotI2RlZmluZSBNQVhfTEVOR1RIIDQwOTYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBTdG9yZXMgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgcG9zaXRpb24gd2l0aCB0aGUgZ2l2ZW4gaGFzaCB2YWx1ZS4KLSAgaW50MzJfdCBoYXNoX3RvX2ZpcnN0X2luZGV4X1tIQVNIX1NJWkVdOwotICAvLyBjaGFpbl9bcG9zXSBzdG9yZXMgdGhlIHByZXZpb3VzIHBvc2l0aW9uIHdpdGggdGhlIHNhbWUgaGFzaCB2YWx1ZQotICAvLyBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIGltYWdlLgotICBpbnQzMl90KiBjaGFpbl87Ci19IEhhc2hDaGFpbjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGxhbmVfdG9fY29kZV9sdXRbMTI4XSA9IHsKLSA5NiwgICA3MywgIDU1LCAgMzksICAyMywgIDEzLCAgIDUsICAxLCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gMTAxLCAgNzgsICA1OCwgIDQyLCAgMjYsICAxNiwgICA4LCAgMiwgICAgMCwgICAzLCAgOSwgICAxNywgIDI3LCAgNDMsICA1OSwgIDc5LAotIDEwMiwgIDg2LCAgNjIsICA0NiwgIDMyLCAgMjAsICAxMCwgIDYsICAgIDQsICAgNywgIDExLCAgMjEsICAzMywgIDQ3LCAgNjMsICA4NywKLSAxMDUsICA5MCwgIDcwLCAgNTIsICAzNywgIDI4LCAgMTgsICAxNCwgIDEyLCAgMTUsICAxOSwgIDI5LCAgMzgsICA1MywgIDcxLCAgOTEsCi0gMTEwLCAgOTksICA4MiwgIDY2LCAgNDgsICAzNSwgIDMwLCAgMjQsICAyMiwgIDI1LCAgMzEsICAzNiwgIDQ5LCAgNjcsICA4MywgMTAwLAotIDExNSwgMTA4LCAgOTQsICA3NiwgIDY0LCAgNTAsICA0NCwgIDQwLCAgMzQsICA0MSwgIDQ1LCAgNTEsICA2NSwgIDc3LCAgOTUsIDEwOSwKLSAxMTgsIDExMywgMTAzLCAgOTIsICA4MCwgIDY4LCAgNjAsICA1NiwgIDU0LCAgNTcsICA2MSwgIDY5LCAgODEsICA5MywgMTA0LCAxMTQsCi0gMTE5LCAxMTYsIDExMSwgMTA2LCAgOTcsICA4OCwgIDg0LCAgNzQsICA3MiwgIDc1LCAgODUsICA4OSwgIDk4LCAxMDcsIDExMiwgMTE3Ci19OwotCi1zdGF0aWMgaW50IERpc3RhbmNlVG9QbGFuZUNvZGUoaW50IHhzaXplLCBpbnQgZGlzdCkgewotICBjb25zdCBpbnQgeW9mZnNldCA9IGRpc3QgLyB4c2l6ZTsKLSAgY29uc3QgaW50IHhvZmZzZXQgPSBkaXN0IC0geW9mZnNldCAqIHhzaXplOwotICBpZiAoeG9mZnNldCA8PSA4ICYmIHlvZmZzZXQgPCA4KSB7Ci0gICAgcmV0dXJuIHBsYW5lX3RvX2NvZGVfbHV0W3lvZmZzZXQgKiAxNiArIDggLSB4b2Zmc2V0XSArIDE7Ci0gIH0gZWxzZSBpZiAoeG9mZnNldCA+IHhzaXplIC0gOCAmJiB5b2Zmc2V0IDwgNykgewotICAgIHJldHVybiBwbGFuZV90b19jb2RlX2x1dFsoeW9mZnNldCArIDEpICogMTYgKyA4ICsgKHhzaXplIC0geG9mZnNldCldICsgMTsKLSAgfQotICByZXR1cm4gZGlzdCArIDEyMDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBGaW5kTWF0Y2hMZW5ndGgoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF4X2xpbWl0KSB7Ci0gIGludCBtYXRjaF9sZW4gPSAwOwotICB3aGlsZSAobWF0Y2hfbGVuIDwgbWF4X2xpbWl0ICYmIGFycmF5MVttYXRjaF9sZW5dID09IGFycmF5MlttYXRjaF9sZW5dKSB7Ci0gICAgKyttYXRjaF9sZW47Ci0gIH0KLSAgcmV0dXJuIG1hdGNoX2xlbjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBWUDhMQmFja3dhcmRSZWZzCi0KLXZvaWQgVlA4TEluaXRCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBpZiAocmVmcyAhPSBOVUxMKSB7Ci0gICAgcmVmcy0+cmVmcyA9IE5VTEw7Ci0gICAgcmVmcy0+c2l6ZSA9IDA7Ci0gICAgcmVmcy0+bWF4X3NpemUgPSAwOwotICB9Ci19Ci0KLXZvaWQgVlA4TENsZWFyQmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgaWYgKHJlZnMgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShyZWZzLT5yZWZzKTsKLSAgICBWUDhMSW5pdEJhY2t3YXJkUmVmcyhyZWZzKTsKLSAgfQotfQotCi1pbnQgVlA4TEJhY2t3YXJkUmVmc0FsbG9jKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsIGludCBtYXhfc2l6ZSkgewotICBTQl9EQ0hFQ0socmVmcyAhPSBOVUxMKTsKLSAgcmVmcy0+c2l6ZSA9IDA7Ci0gIHJlZnMtPm1heF9zaXplID0gMDsKLSAgcmVmcy0+cmVmcyA9IChQaXhPckNvcHkqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCltYXhfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcmVmcy0+cmVmcykpOwotICBpZiAocmVmcy0+cmVmcyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgcmVmcy0+bWF4X3NpemUgPSBtYXhfc2l6ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIYXNoIGNoYWlucwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgR2V0UGl4UGFpckhhc2g2NChjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgewotICB1aW50NjRfdCBrZXkgPSAoKHVpbnQ2NF90KShhcmdiWzFdKSA8PCAzMikgfCBhcmdiWzBdOwotICBrZXkgPSAoa2V5ICogSEFTSF9NVUxUSVBMSUVSKSA+PiAoNjQgLSBIQVNIX0JJVFMpOwotICByZXR1cm4ga2V5OwotfQotCi1zdGF0aWMgaW50IEhhc2hDaGFpbkluaXQoSGFzaENoYWluKiBjb25zdCBwLCBpbnQgc2l6ZSkgewotICBpbnQgaTsKLSAgcC0+Y2hhaW5fID0gKGludCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXNpemUsIHNpemVvZigqcC0+Y2hhaW5fKSk7Ci0gIGlmIChwLT5jaGFpbl8gPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBwLT5jaGFpbl9baV0gPSAtMTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpIHsKLSAgICBwLT5oYXNoX3RvX2ZpcnN0X2luZGV4X1tpXSA9IC0xOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBIYXNoQ2hhaW5EZWxldGUoSGFzaENoYWluKiBjb25zdCBwKSB7Ci0gIGlmIChwICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUocC0+Y2hhaW5fKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUocCk7Ci0gIH0KLX0KLQotLy8gSW5zZXJ0aW9uIG9mIHR3byBwaXhlbHMgYXQgYSB0aW1lLgotc3RhdGljIHZvaWQgSGFzaENoYWluSW5zZXJ0KEhhc2hDaGFpbiogY29uc3QgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHBvcykgewotICBjb25zdCB1aW50NjRfdCBoYXNoX2NvZGUgPSBHZXRQaXhQYWlySGFzaDY0KGFyZ2IpOwotICBwLT5jaGFpbl9bcG9zXSA9IHAtPmhhc2hfdG9fZmlyc3RfaW5kZXhfW2hhc2hfY29kZV07Ci0gIHAtPmhhc2hfdG9fZmlyc3RfaW5kZXhfW2hhc2hfY29kZV0gPSBwb3M7Ci19Ci0KLXN0YXRpYyB2b2lkIEdldFBhcmFtc0Zvckhhc2hDaGFpbkZpbmRDb3B5KGludCBxdWFsaXR5LCBpbnQgeHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywgaW50KiB3aW5kb3dfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaXRlcl9wb3MsIGludCogaXRlcl9saW1pdCkgewotICBjb25zdCBpbnQgaXRlcl9tdWx0ID0gKHF1YWxpdHkgPCAyNykgPyAxIDogMSArICgocXVhbGl0eSAtIDI3KSA+PiA0KTsKLSAgY29uc3QgaW50IGl0ZXJfbmVnID0gLWl0ZXJfbXVsdCAqIChxdWFsaXR5ID4+IDEpOwotICAvLyBMaW1pdCB0aGUgYmFja3dhcmQtcmVmIHdpbmRvdyBzaXplIGZvciBsb3dlciBxdWFsaXRpZXMuCi0gIGNvbnN0IGludCBtYXhfd2luZG93X3NpemUgPSAocXVhbGl0eSA+IDUwKSA/IFdJTkRPV19TSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocXVhbGl0eSA+IDI1KSA/ICh4c2l6ZSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHhzaXplIDw8IDQpOwotICBTQl9EQ0hFQ0soeHNpemUgPiAwKTsKLSAgKndpbmRvd19zaXplID0gKG1heF93aW5kb3dfc2l6ZSA+IFdJTkRPV19TSVpFKSA/IFdJTkRPV19TSVpFCi0gICAgICAgICAgICAgICA6IG1heF93aW5kb3dfc2l6ZTsKLSAgKml0ZXJfcG9zID0gOCArIChxdWFsaXR5ID4+IDMpOwotICAvLyBGb3IgbG93ZXIgZW50cm9weSBpbWFnZXMsIHRoZSByaWdvdXJvdXMgc2VhcmNoIGxvb3AgaW4gSGFzaENoYWluRmluZENvcHkKLSAgLy8gY2FuIGJlIHJlbGF4ZWQuCi0gICppdGVyX2xpbWl0ID0gKGNhY2hlX2JpdHMgPiAwKSA/IGl0ZXJfbmVnIDogaXRlcl9uZWcgLyAyOwotfQotCi1zdGF0aWMgaW50IEhhc2hDaGFpbkZpbmRDb3B5KGNvbnN0IEhhc2hDaGFpbiogY29uc3QgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2VfcG9zaXRpb24sIGludCB4c2l6ZV9zaWduZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgbWF4bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93X3NpemUsIGludCBpdGVyX3BvcywgaW50IGl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZGlzdGFuY2VfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlbmd0aF9wdHIpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc3RhcnQgPSBhcmdiICsgYmFzZV9wb3NpdGlvbjsKLSAgdWludDY0X3QgYmVzdF92YWwgPSAwOwotICB1aW50MzJfdCBiZXN0X2xlbmd0aCA9IDE7Ci0gIHVpbnQzMl90IGJlc3RfZGlzdGFuY2UgPSAwOwotICBjb25zdCB1aW50MzJfdCB4c2l6ZSA9ICh1aW50MzJfdCl4c2l6ZV9zaWduZWQ7Ci0gIGNvbnN0IGludCBtaW5fcG9zID0KLSAgICAgIChiYXNlX3Bvc2l0aW9uID4gd2luZG93X3NpemUpID8gYmFzZV9wb3NpdGlvbiAtIHdpbmRvd19zaXplIDogMDsKLSAgaW50IHBvczsKLSAgU0JfRENIRUNLKHhzaXplID4gMCk7Ci0gIGZvciAocG9zID0gcC0+aGFzaF90b19maXJzdF9pbmRleF9bR2V0UGl4UGFpckhhc2g2NChhcmdiX3N0YXJ0KV07Ci0gICAgICAgcG9zID49IG1pbl9wb3M7Ci0gICAgICAgcG9zID0gcC0+Y2hhaW5fW3Bvc10pIHsKLSAgICB1aW50NjRfdCB2YWw7Ci0gICAgdWludDMyX3QgY3Vycl9sZW5ndGg7Ci0gICAgdWludDMyX3QgZGlzdGFuY2U7Ci0gICAgaWYgKGl0ZXJfcG9zIDwgMCkgewotICAgICAgaWYgKGl0ZXJfcG9zIDwgaXRlcl9saW1pdCB8fCBiZXN0X3ZhbCA+PSAweGZmMDAwMCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLS1pdGVyX3BvczsKLSAgICBpZiAoYXJnYltwb3MgKyBiZXN0X2xlbmd0aCAtIDFdICE9IGFyZ2Jfc3RhcnRbYmVzdF9sZW5ndGggLSAxXSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGN1cnJfbGVuZ3RoID0gRmluZE1hdGNoTGVuZ3RoKGFyZ2IgKyBwb3MsIGFyZ2Jfc3RhcnQsIG1heGxlbik7Ci0gICAgaWYgKGN1cnJfbGVuZ3RoIDwgYmVzdF9sZW5ndGgpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkaXN0YW5jZSA9ICh1aW50MzJfdCkoYmFzZV9wb3NpdGlvbiAtIHBvcyk7Ci0gICAgdmFsID0gY3Vycl9sZW5ndGggPDwgMTY7Ci0gICAgLy8gRmF2b3JpbmcgMmQgbG9jYWxpdHkgaGVyZSBnaXZlcyBzYXZpbmdzIGZvciBjZXJ0YWluIGltYWdlcy4KLSAgICBpZiAoZGlzdGFuY2UgPCA5ICogeHNpemUpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHkgPSBkaXN0YW5jZSAvIHhzaXplOwotICAgICAgdWludDMyX3QgeCA9IGRpc3RhbmNlICUgeHNpemU7Ci0gICAgICBpZiAoeCA+ICh4c2l6ZSA+PiAxKSkgewotICAgICAgICB4ID0geHNpemUgLSB4OwotICAgICAgfQotICAgICAgaWYgKHggPD0gNykgewotICAgICAgICB2YWwgKz0gOSAqIDkgKyA5ICogOTsKLSAgICAgICAgdmFsIC09IHkgKiB5ICsgeCAqIHg7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChiZXN0X3ZhbCA8IHZhbCkgewotICAgICAgYmVzdF92YWwgPSB2YWw7Ci0gICAgICBiZXN0X2xlbmd0aCA9IGN1cnJfbGVuZ3RoOwotICAgICAgYmVzdF9kaXN0YW5jZSA9IGRpc3RhbmNlOwotICAgICAgaWYgKGN1cnJfbGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKGJlc3RfZGlzdGFuY2UgPT0gMSB8fCBkaXN0YW5jZSA9PSB4c2l6ZSkgJiYKLSAgICAgICAgICBiZXN0X2xlbmd0aCA+PSAxMjgpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICpkaXN0YW5jZV9wdHIgPSAoaW50KWJlc3RfZGlzdGFuY2U7Ci0gICpsZW5ndGhfcHRyID0gYmVzdF9sZW5ndGg7Ci0gIHJldHVybiAoYmVzdF9sZW5ndGggPj0gTUlOX0xFTkdUSCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1c2hCYWNrQ29weShWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLCBpbnQgbGVuZ3RoKSB7Ci0gIGludCBzaXplID0gcmVmcy0+c2l6ZTsKLSAgd2hpbGUgKGxlbmd0aCA+PSBNQVhfTEVOR1RIKSB7Ci0gICAgcmVmcy0+cmVmc1tzaXplKytdID0gUGl4T3JDb3B5Q3JlYXRlQ29weSgxLCBNQVhfTEVOR1RIKTsKLSAgICBsZW5ndGggLT0gTUFYX0xFTkdUSDsKLSAgfQotICBpZiAobGVuZ3RoID4gMCkgewotICAgIHJlZnMtPnJlZnNbc2l6ZSsrXSA9IFBpeE9yQ29weUNyZWF0ZUNvcHkoMSwgbGVuZ3RoKTsKLSAgfQotICByZWZzLT5zaXplID0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgQmFja3dhcmRSZWZlcmVuY2VzUmxlKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7Ci0gIGludCBtYXRjaF9sZW4gPSAwOwotICBpbnQgaTsKLSAgcmVmcy0+c2l6ZSA9IDA7Ci0gIFB1c2hCYWNrQ29weShyZWZzLCBtYXRjaF9sZW4pOyAgICAvLyBpPTAgY2FzZQotICByZWZzLT5yZWZzW3JlZnMtPnNpemUrK10gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKGFyZ2JbMF0pOwotICBmb3IgKGkgPSAxOyBpIDwgcGl4X2NvdW50OyArK2kpIHsKLSAgICBpZiAoYXJnYltpXSA9PSBhcmdiW2kgLSAxXSkgewotICAgICAgKyttYXRjaF9sZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIFB1c2hCYWNrQ29weShyZWZzLCBtYXRjaF9sZW4pOwotICAgICAgbWF0Y2hfbGVuID0gMDsKLSAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZSsrXSA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwoYXJnYltpXSk7Ci0gICAgfQotICB9Ci0gIFB1c2hCYWNrQ29weShyZWZzLCBtYXRjaF9sZW4pOwotfQotCi1zdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbihpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIGludCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBpbnQgaTsKLSAgaW50IG9rID0gMDsKLSAgaW50IGNjX2luaXQgPSAwOwotICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKLSAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7Ci0gIEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiA9IChIYXNoQ2hhaW4qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoYXNoX2NoYWluKSk7Ci0gIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7Ci0gIGludCB3aW5kb3dfc2l6ZSA9IFdJTkRPV19TSVpFOwotICBpbnQgaXRlcl9wb3MgPSAxOwotICBpbnQgaXRlcl9saW1pdCA9IC0xOwotCi0gIGlmIChoYXNoX2NoYWluID09IE5VTEwpIHJldHVybiAwOwotICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7Ci0gICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKCFIYXNoQ2hhaW5Jbml0KGhhc2hfY2hhaW4sIHBpeF9jb3VudCkpIGdvdG8gRXJyb3I7Ci0KLSAgcmVmcy0+c2l6ZSA9IDA7Ci0gIEdldFBhcmFtc0Zvckhhc2hDaGFpbkZpbmRDb3B5KHF1YWxpdHksIHhzaXplLCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93X3NpemUsICZpdGVyX3BvcywgJml0ZXJfbGltaXQpOwotICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OyApIHsKLSAgICAvLyBBbHRlcm5hdGl2ZSMxOiBDb2RlIHRoZSBwaXhlbHMgc3RhcnRpbmcgYXQgJ2knIHVzaW5nIGJhY2t3YXJkIHJlZmVyZW5jZS4KLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgbGVuID0gMDsKLSAgICBpZiAoaSA8IHBpeF9jb3VudCAtIDEpIHsgIC8vIEZpbmRDb3B5KGksLi4pIHJlYWRzIHBpeGVscyBhdCBbaV0gYW5kIFtpICsgMV0uCi0gICAgICBpbnQgbWF4bGVuID0gcGl4X2NvdW50IC0gaTsKLSAgICAgIGlmIChtYXhsZW4gPiBNQVhfTEVOR1RIKSB7Ci0gICAgICAgIG1heGxlbiA9IE1BWF9MRU5HVEg7Ci0gICAgICB9Ci0gICAgICBIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCB4c2l6ZSwgYXJnYiwgbWF4bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3NpemUsIGl0ZXJfcG9zLCBpdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwgJmxlbik7Ci0gICAgfQotICAgIGlmIChsZW4gPj0gTUlOX0xFTkdUSCkgewotICAgICAgLy8gQWx0ZXJuYXRpdmUjMjogSW5zZXJ0IHRoZSBwaXhlbCBhdCAnaScgYXMgbGl0ZXJhbCwgYW5kIGNvZGUgdGhlCi0gICAgICAvLyBwaXhlbHMgc3RhcnRpbmcgYXQgJ2kgKyAxJyB1c2luZyBiYWNrd2FyZCByZWZlcmVuY2UuCi0gICAgICBpbnQgb2Zmc2V0MiA9IDA7Ci0gICAgICBpbnQgbGVuMiA9IDA7Ci0gICAgICBpbnQgazsKLSAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpXSwgaSk7Ci0gICAgICBpZiAoaSA8IHBpeF9jb3VudCAtIDIpIHsgIC8vIEZpbmRDb3B5KGkrMSwuLikgcmVhZHMgW2kgKyAxXSBhbmQgW2kgKyAyXS4KLSAgICAgICAgaW50IG1heGxlbiA9IHBpeF9jb3VudCAtIChpICsgMSk7Ci0gICAgICAgIGlmIChtYXhsZW4gPiBNQVhfTEVOR1RIKSB7Ci0gICAgICAgICAgbWF4bGVuID0gTUFYX0xFTkdUSDsKLSAgICAgICAgfQotICAgICAgICBIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpICsgMSwgeHNpemUsIGFyZ2IsIG1heGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3NpemUsIGl0ZXJfcG9zLCBpdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0MiwgJmxlbjIpOwotICAgICAgICBpZiAobGVuMiA+IGxlbiArIDEpIHsKLSAgICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhlbCA9IGFyZ2JbaV07Ci0gICAgICAgICAgLy8gQWx0ZXJuYXRpdmUjMiBpcyBhIGJldHRlciBtYXRjaC4gU28gcHVzaCBwaXhlbCBhdCAnaScgYXMgbGl0ZXJhbC4KLSAgICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlICYmIFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIHBpeGVsKSkgewotICAgICAgICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgcGl4ZWwpOwotICAgICAgICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplXSA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGl4KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplXSA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICArK3JlZnMtPnNpemU7Ci0gICAgICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIHBpeGVsKTsKLSAgICAgICAgICBpKys7ICAvLyBCYWNrd2FyZCByZWZlcmVuY2UgdG8gYmUgZG9uZSBmb3IgbmV4dCBwaXhlbC4KLSAgICAgICAgICBsZW4gPSBsZW4yOwotICAgICAgICAgIG9mZnNldCA9IG9mZnNldDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZW4gPj0gTUFYX0xFTkdUSCkgewotICAgICAgICBsZW4gPSBNQVhfTEVOR1RIIC0gMTsKLSAgICAgIH0KLSAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZSsrXSA9IFBpeE9yQ29weUNyZWF0ZUNvcHkob2Zmc2V0LCBsZW4pOwotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKLSAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBBZGQgdG8gdGhlIGhhc2hfY2hhaW4gKGJ1dCBjYW5ub3QgYWRkIHRoZSBsYXN0IHBpeGVsKS4KLSAgICAgIHsKLSAgICAgICAgY29uc3QgaW50IGxhc3QgPSAobGVuIDwgcGl4X2NvdW50IC0gMSAtIGkpID8gbGVuIDogcGl4X2NvdW50IC0gMSAtIGk7Ci0gICAgICAgIGZvciAoayA9IDE7IGsgPCBsYXN0OyArK2spIHsKLSAgICAgICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaSArIGtdLCBpICsgayk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGkgKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwaXhlbCA9IGFyZ2JbaV07Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlICYmIFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIHBpeGVsKSkgewotICAgICAgICAvLyBwdXNoIHBpeGVsIGFzIGEgUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHggcGl4ZWwKLSAgICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgcGl4ZWwpOwotICAgICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemVdID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplXSA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOwotICAgICAgfQotICAgICAgKytyZWZzLT5zaXplOwotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIHBpeGVsKTsKLSAgICAgIGlmIChpICsgMSA8IHBpeF9jb3VudCkgewotICAgICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaV0sIGkpOwotICAgICAgfQotICAgICAgKytpOwotICAgIH0KLSAgfQotICBvayA9IDE7Ci1FcnJvcjoKLSAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOwotICBIYXNoQ2hhaW5EZWxldGUoaGFzaF9jaGFpbik7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBkb3VibGUgYWxwaGFfW1ZBTFVFU19JTl9CWVRFXTsKLSAgZG91YmxlIHJlZF9bVkFMVUVTX0lOX0JZVEVdOwotICBkb3VibGUgbGl0ZXJhbF9bUElYX09SX0NPUFlfQ09ERVNfTUFYXTsKLSAgZG91YmxlIGJsdWVfW1ZBTFVFU19JTl9CWVRFXTsKLSAgZG91YmxlIGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOwotfSBDb3N0TW9kZWw7Ci0KLXN0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCi0gICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGludCByZWN1cnNpdmVfY29zdF9tb2RlbCwKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLAotICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOwotCi1zdGF0aWMgdm9pZCBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICBpbnQgbnVtX3N5bWJvbHMsIGNvbnN0IGludCBwb3B1bGF0aW9uX2NvdW50c1tdLCBkb3VibGUgb3V0cHV0W10pIHsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBub256ZXJvcyA9IDA7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgewotICAgIHN1bSArPSBwb3B1bGF0aW9uX2NvdW50c1tpXTsKLSAgICBpZiAocG9wdWxhdGlvbl9jb3VudHNbaV0gPiAwKSB7Ci0gICAgICArK25vbnplcm9zOwotICAgIH0KLSAgfQotICBpZiAobm9uemVyb3MgPD0gMSkgewotICAgIFNiTWVtb3J5U2V0KG91dHB1dCwgMCwgbnVtX3N5bWJvbHMgKiBzaXplb2YoKm91dHB1dCkpOwotICB9IGVsc2UgewotICAgIGNvbnN0IGRvdWJsZSBsb2dzdW0gPSBWUDhMRmFzdExvZzIoc3VtKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgewotICAgICAgb3V0cHV0W2ldID0gbG9nc3VtIC0gVlA4TEZhc3RMb2cyKHBvcHVsYXRpb25fY291bnRzW2ldKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGludCBDb3N0TW9kZWxCdWlsZChDb3N0TW9kZWwqIGNvbnN0IG0sIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdXJzaW9uX2xldmVsLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzKSB7Ci0gIGludCBvayA9IDA7Ci0gIFZQOExIaXN0b2dyYW0gaGlzdG87Ci0gIFZQOExCYWNrd2FyZFJlZnMgcmVmczsKLQotICBpZiAoIVZQOExCYWNrd2FyZFJlZnNBbGxvYygmcmVmcywgeHNpemUgKiB5c2l6ZSkpIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKHJlY3Vyc2lvbl9sZXZlbCA+IDApIHsKLSAgICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKHhzaXplLCB5c2l6ZSwgcmVjdXJzaW9uX2xldmVsIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IsIHF1YWxpdHksIGNhY2hlX2JpdHMsICZyZWZzKSkgewotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW4oeHNpemUsIHlzaXplLCBhcmdiLCBjYWNoZV9iaXRzLCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZzKSkgewotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLSAgVlA4TEhpc3RvZ3JhbUNyZWF0ZSgmaGlzdG8sICZyZWZzLCBjYWNoZV9iaXRzKTsKLSAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgICBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoJmhpc3RvKSwgaGlzdG8ubGl0ZXJhbF8sIG0tPmxpdGVyYWxfKTsKLSAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgICBWQUxVRVNfSU5fQllURSwgaGlzdG8ucmVkXywgbS0+cmVkXyk7Ci0gIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLmJsdWVfLCBtLT5ibHVlXyk7Ci0gIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLmFscGhhXywgbS0+YWxwaGFfKTsKLSAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgICBOVU1fRElTVEFOQ0VfQ09ERVMsIGhpc3RvLmRpc3RhbmNlXywgbS0+ZGlzdGFuY2VfKTsKLSAgb2sgPSAxOwotCi0gRXJyb3I6Ci0gIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmcyk7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRMaXRlcmFsQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sIHVpbnQzMl90IHYpIHsKLSAgcmV0dXJuIG0tPmFscGhhX1t2ID4+IDI0XSArCi0gICAgICAgICBtLT5yZWRfWyh2ID4+IDE2KSAmIDB4ZmZdICsKLSAgICAgICAgIG0tPmxpdGVyYWxfWyh2ID4+IDgpICYgMHhmZl0gKwotICAgICAgICAgbS0+Ymx1ZV9bdiAmIDB4ZmZdOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldENhY2hlQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sIHVpbnQzMl90IGlkeCkgewotICBjb25zdCBpbnQgbGl0ZXJhbF9pZHggPSBWQUxVRVNfSU5fQllURSArIE5VTV9MRU5HVEhfQ09ERVMgKyBpZHg7Ci0gIHJldHVybiBtLT5saXRlcmFsX1tsaXRlcmFsX2lkeF07Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0TGVuZ3RoQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoKSB7Ci0gIGludCBjb2RlLCBleHRyYV9iaXRzX2NvdW50LCBleHRyYV9iaXRzX3ZhbHVlOwotICBQcmVmaXhFbmNvZGUobGVuZ3RoLCAmY29kZSwgJmV4dHJhX2JpdHNfY291bnQsICZleHRyYV9iaXRzX3ZhbHVlKTsKLSAgcmV0dXJuIG0tPmxpdGVyYWxfW1ZBTFVFU19JTl9CWVRFICsgY29kZV0gKyBleHRyYV9iaXRzX2NvdW50OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldERpc3RhbmNlQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaXN0YW5jZSkgewotICBpbnQgY29kZSwgZXh0cmFfYml0c19jb3VudCwgZXh0cmFfYml0c192YWx1ZTsKLSAgUHJlZml4RW5jb2RlKGRpc3RhbmNlLCAmY29kZSwgJmV4dHJhX2JpdHNfY291bnQsICZleHRyYV9iaXRzX3ZhbHVlKTsKLSAgcmV0dXJuIG0tPmRpc3RhbmNlX1tjb2RlXSArIGV4dHJhX2JpdHNfY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAotICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgcmVjdXJzaXZlX2Nvc3RfbW9kZWwsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywgdWludDMyX3QqIGNvbnN0IGRpc3RfYXJyYXkpIHsKLSAgaW50IGk7Ci0gIGludCBvayA9IDA7Ci0gIGludCBjY19pbml0ID0gMDsKLSAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7Ci0gIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOwotICBmbG9hdCogY29uc3QgY29zdCA9Ci0gICAgICAoZmxvYXQqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdClwaXhfY291bnQsIHNpemVvZigqY29zdCkpOwotICBDb3N0TW9kZWwqIGNvc3RfbW9kZWwgPSAoQ29zdE1vZGVsKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqY29zdF9tb2RlbCkpOwotICBIYXNoQ2hhaW4qIGhhc2hfY2hhaW4gPSAoSGFzaENoYWluKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqaGFzaF9jaGFpbikpOwotICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOwotICBjb25zdCBkb3VibGUgbXVsMCA9IChyZWN1cnNpdmVfY29zdF9tb2RlbCAhPSAwKSA/IDEuMCA6IDAuNjg7Ci0gIGNvbnN0IGRvdWJsZSBtdWwxID0gKHJlY3Vyc2l2ZV9jb3N0X21vZGVsICE9IDApID8gMS4wIDogMC44MjsKLSAgY29uc3QgaW50IG1pbl9kaXN0YW5jZV9jb2RlID0gMjsgIC8vIFRPRE8odmlrYXNhKTogdHVuZSBhcyBmdW5jdGlvbiBvZiBxdWFsaXR5Ci0gIGludCB3aW5kb3dfc2l6ZSA9IFdJTkRPV19TSVpFOwotICBpbnQgaXRlcl9wb3MgPSAxOwotICBpbnQgaXRlcl9saW1pdCA9IC0xOwotCi0gIGlmIChjb3N0ID09IE5VTEwgfHwgY29zdF9tb2RlbCA9PSBOVUxMIHx8IGhhc2hfY2hhaW4gPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICBpZiAoIUhhc2hDaGFpbkluaXQoaGFzaF9jaGFpbiwgcGl4X2NvdW50KSkgZ290byBFcnJvcjsKLQotICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7Ci0gICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKCFDb3N0TW9kZWxCdWlsZChjb3N0X21vZGVsLCB4c2l6ZSwgeXNpemUsIHJlY3Vyc2l2ZV9jb3N0X21vZGVsLCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIGNhY2hlX2JpdHMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBwaXhfY291bnQ7ICsraSkgY29zdFtpXSA9IDFlMzhmOwotCi0gIC8vIFdlIGxvb3Agb25lIHBpeGVsIGF0IGEgdGltZSwgYnV0IHN0b3JlIGFsbCBjdXJyZW50bHkgYmVzdCBwb2ludHMgdG8KLSAgLy8gbm9uLXByb2Nlc3NlZCBsb2NhdGlvbnMgZnJvbSB0aGlzIHBvaW50LgotICBkaXN0X2FycmF5WzBdID0gMDsKLSAgR2V0UGFyYW1zRm9ySGFzaENoYWluRmluZENvcHkocXVhbGl0eSwgeHNpemUsIGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dfc2l6ZSwgJml0ZXJfcG9zLCAmaXRlcl9saW1pdCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwaXhfY291bnQ7ICsraSkgewotICAgIGRvdWJsZSBwcmV2X2Nvc3QgPSAwLjA7Ci0gICAgaW50IHNob3J0bWF4OwotICAgIGlmIChpID4gMCkgewotICAgICAgcHJldl9jb3N0ID0gY29zdFtpIC0gMV07Ci0gICAgfQotICAgIGZvciAoc2hvcnRtYXggPSAwOyBzaG9ydG1heCA8IDI7ICsrc2hvcnRtYXgpIHsKLSAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICBpZiAoaSA8IHBpeF9jb3VudCAtIDEpIHsgIC8vIEZpbmRDb3B5IHJlYWRzIHBpeGVscyBhdCBbaV0gYW5kIFtpICsgMV0uCi0gICAgICAgIGludCBtYXhsZW4gPSBzaG9ydG1heCA/IDIgOiBNQVhfTEVOR1RIOwotICAgICAgICBpZiAobWF4bGVuID4gcGl4X2NvdW50IC0gaSkgewotICAgICAgICAgIG1heGxlbiA9IHBpeF9jb3VudCAtIGk7Ci0gICAgICAgIH0KLSAgICAgICAgSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSwgeHNpemUsIGFyZ2IsIG1heGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3NpemUsIGl0ZXJfcG9zLCBpdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LCAmbGVuKTsKLSAgICAgIH0KLSAgICAgIGlmIChsZW4gPj0gTUlOX0xFTkdUSCkgewotICAgICAgICBjb25zdCBpbnQgY29kZSA9IERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIG9mZnNldCk7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSBkaXN0YW5jZV9jb3N0ID0KLSAgICAgICAgICAgIHByZXZfY29zdCArIEdldERpc3RhbmNlQ29zdChjb3N0X21vZGVsLCBjb2RlKTsKLSAgICAgICAgaW50IGs7Ci0gICAgICAgIGZvciAoayA9IDE7IGsgPCBsZW47ICsraykgewotICAgICAgICAgIGNvbnN0IGRvdWJsZSBjb3N0X3ZhbCA9IGRpc3RhbmNlX2Nvc3QgKyBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspOwotICAgICAgICAgIGlmIChjb3N0W2kgKyBrXSA+IGNvc3RfdmFsKSB7Ci0gICAgICAgICAgICBjb3N0W2kgKyBrXSA9IChmbG9hdCljb3N0X3ZhbDsKLSAgICAgICAgICAgIGRpc3RfYXJyYXlbaSArIGtdID0gayArIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRoaXMgaWYgaXMgZm9yIHNwZWVkdXAgb25seS4gSXQgcm91Z2hseSBkb3VibGVzIHRoZSBzcGVlZCwgYW5kCi0gICAgICAgIC8vIG1ha2VzIGNvbXByZXNzaW9uIHdvcnNlIGJ5IC4xICUuCi0gICAgICAgIGlmIChsZW4gPj0gMTI4ICYmIGNvZGUgPD0gbWluX2Rpc3RhbmNlX2NvZGUpIHsKLSAgICAgICAgICAvLyBMb25nIGNvcHkgZm9yIHNob3J0IGRpc3RhbmNlcywgbGV0J3Mgc2tpcCB0aGUgbWlkZGxlCi0gICAgICAgICAgLy8gbG9va3VwcyBmb3IgYmV0dGVyIGNvcGllcy4KLSAgICAgICAgICAvLyAxKSBpbnNlcnQgdGhlIGhhc2hlcy4KLSAgICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKLSAgICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaSArIGtdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gMikgQWRkIHRvIHRoZSBoYXNoX2NoYWluIChidXQgY2Fubm90IGFkZCB0aGUgbGFzdCBwaXhlbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgbGFzdCA9IChsZW4gKyBpIDwgcGl4X2NvdW50IC0gMSkgPyBsZW4gKyBpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwaXhfY291bnQgLSAxOwotICAgICAgICAgICAgZm9yIChrID0gaTsgayA8IGxhc3Q7ICsraykgewotICAgICAgICAgICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2Jba10sIGspOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyAzKSBqdW1wLgotICAgICAgICAgIGkgKz0gbGVuIC0gMTsgIC8vIGZvciBsb29wIGRvZXMgKytpLCB0aHVzIC0xIGhlcmUuCi0gICAgICAgICAgZ290byBuZXh0X3N5bWJvbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoaSA8IHBpeF9jb3VudCAtIDEpIHsKLSAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpXSwgaSk7Ci0gICAgfQotICAgIHsKLSAgICAgIC8vIGluc2VydGluZyBhIGxpdGVyYWwgcGl4ZWwKLSAgICAgIGRvdWJsZSBjb3N0X3ZhbCA9IHByZXZfY29zdDsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgYXJnYltpXSkpIHsKLSAgICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgYXJnYltpXSk7Ci0gICAgICAgIGNvc3RfdmFsICs9IEdldENhY2hlQ29zdChjb3N0X21vZGVsLCBpeCkgKiBtdWwwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29zdF92YWwgKz0gR2V0TGl0ZXJhbENvc3QoY29zdF9tb2RlbCwgYXJnYltpXSkgKiBtdWwxOwotICAgICAgfQotICAgICAgaWYgKGNvc3RbaV0gPiBjb3N0X3ZhbCkgewotICAgICAgICBjb3N0W2ldID0gKGZsb2F0KWNvc3RfdmFsOwotICAgICAgICBkaXN0X2FycmF5W2ldID0gMTsgIC8vIG9ubHkgb25lIGlzIGluc2VydGVkLgotICAgICAgfQotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaV0pOwotICAgIH0KLSBuZXh0X3N5bWJvbDogOwotICB9Ci0gIC8vIExhc3QgcGl4ZWwgc3RpbGwgdG8gZG8sIGl0IGNhbiBvbmx5IGJlIGEgc2luZ2xlIHN0ZXAgaWYgbm90IHJlYWNoZWQKLSAgLy8gdGhyb3VnaCBjaGVhcGVyIG1lYW5zIGFscmVhZHkuCi0gIG9rID0gMTsKLUVycm9yOgotICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7Ci0gIEhhc2hDaGFpbkRlbGV0ZShoYXNoX2NoYWluKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGNvc3RfbW9kZWwpOwotICBTYk1lbW9yeURlYWxsb2NhdGUoY29zdCk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gV2UgcGFjayB0aGUgcGF0aCBhdCB0aGUgZW5kIG9mICpkaXN0X2FycmF5IGFuZCByZXR1cm4KLS8vIGEgcG9pbnRlciB0byB0aGlzIHBhcnQgb2YgdGhlIGFycmF5LiBFeGFtcGxlOgotLy8gZGlzdF9hcnJheSA9IFsxeDJ4eDN4Ml0gPT4gcGFja2VkIFsxeDJ4MTIzMl0sIGNob3Nlbl9wYXRoID0gWzEyMzJdCi1zdGF0aWMgdm9pZCBUcmFjZUJhY2t3YXJkcyh1aW50MzJfdCogY29uc3QgZGlzdF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0X2FycmF5X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGNob3Nlbl9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjaG9zZW5fcGF0aF9zaXplKSB7Ci0gIHVpbnQzMl90KiBwYXRoID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZTsKLSAgdWludDMyX3QqIGN1ciA9IGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSAxOwotICB3aGlsZSAoY3VyID49IGRpc3RfYXJyYXkpIHsKLSAgICBjb25zdCBpbnQgayA9ICpjdXI7Ci0gICAgLS1wYXRoOwotICAgICpwYXRoID0gazsKLSAgICBjdXIgLT0gazsKLSAgfQotICAqY2hvc2VuX3BhdGggPSBwYXRoOwotICAqY2hvc2VuX3BhdGhfc2l6ZSA9IChpbnQpKGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSBwYXRoKTsKLX0KLQotc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAotICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsCi0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNob3Nlbl9wYXRoLCBpbnQgY2hvc2VuX3BhdGhfc2l6ZSwKLSAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOwotICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKLSAgaW50IHNpemUgPSAwOwotICBpbnQgaSA9IDA7Ci0gIGludCBrOwotICBpbnQgaXg7Ci0gIGludCBvayA9IDA7Ci0gIGludCBjY19pbml0ID0gMDsKLSAgaW50IHdpbmRvd19zaXplID0gV0lORE9XX1NJWkU7Ci0gIGludCBpdGVyX3BvcyA9IDE7Ci0gIGludCBpdGVyX2xpbWl0ID0gLTE7Ci0gIEhhc2hDaGFpbiogaGFzaF9jaGFpbiA9IChIYXNoQ2hhaW4qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoYXNoX2NoYWluKSk7Ci0gIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7Ci0KLSAgaWYgKGhhc2hfY2hhaW4gPT0gTlVMTCB8fCAhSGFzaENoYWluSW5pdChoYXNoX2NoYWluLCBwaXhfY291bnQpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7Ci0gICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOwotICB9Ci0KLSAgcmVmcy0+c2l6ZSA9IDA7Ci0gIEdldFBhcmFtc0Zvckhhc2hDaGFpbkZpbmRDb3B5KHF1YWxpdHksIHhzaXplLCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93X3NpemUsICZpdGVyX3BvcywgJml0ZXJfbGltaXQpOwotICBmb3IgKGl4ID0gMDsgaXggPCBjaG9zZW5fcGF0aF9zaXplOyArK2l4LCArK3NpemUpIHsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgbGVuID0gMDsKLSAgICBpbnQgbWF4bGVuID0gY2hvc2VuX3BhdGhbaXhdOwotICAgIGlmIChtYXhsZW4gIT0gMSkgewotICAgICAgSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSwgeHNpemUsIGFyZ2IsIG1heGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd19zaXplLCBpdGVyX3BvcywgaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsICZsZW4pOwotICAgICAgU0JfRENIRUNLKGxlbiA9PSBtYXhsZW4pOwotICAgICAgcmVmcy0+cmVmc1tzaXplXSA9IFBpeE9yQ29weUNyZWF0ZUNvcHkob2Zmc2V0LCBsZW4pOwotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKLSAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB7Ci0gICAgICAgIGNvbnN0IGludCBsYXN0ID0gKGxlbiA8IHBpeF9jb3VudCAtIDEgLSBpKSA/IGxlbiA6IHBpeF9jb3VudCAtIDEgLSBpOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGFzdDsgKytrKSB7Ci0gICAgICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2kgKyBrXSwgaSArIGspOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpICs9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJiBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBhcmdiW2ldKSkgewotICAgICAgICAvLyBwdXNoIHBpeGVsIGFzIGEgY29sb3IgY2FjaGUgaW5kZXgKLSAgICAgICAgY29uc3QgaW50IGlkeCA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoJmhhc2hlcnMsIGFyZ2JbaV0pOwotICAgICAgICByZWZzLT5yZWZzW3NpemVdID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaWR4KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlZnMtPnJlZnNbc2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKGFyZ2JbaV0pOwotICAgICAgfQotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaV0pOwotICAgICAgaWYgKGkgKyAxIDwgcGl4X2NvdW50KSB7Ci0gICAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpXSwgaSk7Ci0gICAgICB9Ci0gICAgICArK2k7Ci0gICAgfQotICB9Ci0gIFNCX0RDSEVDSyhzaXplIDw9IHJlZnMtPm1heF9zaXplKTsKLSAgcmVmcy0+c2l6ZSA9IHNpemU7Ci0gIG9rID0gMTsKLUVycm9yOgotICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7Ci0gIEhhc2hDaGFpbkRlbGV0ZShoYXNoX2NoYWluKTsKLSAgcmV0dXJuIG9rOwotfQotCi0vLyBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KLXN0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNpdmVfY29zdF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBpbnQgb2sgPSAwOwotICBjb25zdCBpbnQgZGlzdF9hcnJheV9zaXplID0geHNpemUgKiB5c2l6ZTsKLSAgdWludDMyX3QqIGNob3Nlbl9wYXRoID0gTlVMTDsKLSAgaW50IGNob3Nlbl9wYXRoX3NpemUgPSAwOwotICB1aW50MzJfdCogZGlzdF9hcnJheSA9Ci0gICAgICAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdClkaXN0X2FycmF5X3NpemUsIHNpemVvZigqZGlzdF9hcnJheSkpOwotCi0gIGlmIChkaXN0X2FycmF5ID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkoCi0gICAgICB4c2l6ZSwgeXNpemUsIHJlY3Vyc2l2ZV9jb3N0X21vZGVsLCBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLAotICAgICAgZGlzdF9hcnJheSkpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIFRyYWNlQmFja3dhcmRzKGRpc3RfYXJyYXksIGRpc3RfYXJyYXlfc2l6ZSwgJmNob3Nlbl9wYXRoLCAmY2hvc2VuX3BhdGhfc2l6ZSk7Ci0gIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRm9sbG93Q2hvc2VuUGF0aCgKLSAgICAgIHhzaXplLCB5c2l6ZSwgYXJnYiwgcXVhbGl0eSwgY2FjaGVfYml0cywgY2hvc2VuX3BhdGgsIGNob3Nlbl9wYXRoX3NpemUsCi0gICAgICByZWZzKSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgb2sgPSAxOwotIEVycm9yOgotICBTYk1lbW9yeURlYWxsb2NhdGUoZGlzdF9hcnJheSk7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIHZvaWQgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eShpbnQgeHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWZzLT5zaXplOyArK2kpIHsKLSAgICBpZiAoUGl4T3JDb3B5SXNDb3B5KCZyZWZzLT5yZWZzW2ldKSkgewotICAgICAgY29uc3QgaW50IGRpc3QgPSByZWZzLT5yZWZzW2ldLmFyZ2Jfb3JfZGlzdGFuY2U7Ci0gICAgICBjb25zdCBpbnQgdHJhbnNmb3JtZWRfZGlzdCA9IERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIGRpc3QpOwotICAgICAgcmVmcy0+cmVmc1tpXS5hcmdiX29yX2Rpc3RhbmNlID0gdHJhbnNmb3JtZWRfZGlzdDsKLSAgICB9Ci0gIH0KLX0KLQotaW50IFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsIGludCB1c2VfMmRfbG9jYWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCBiZXN0KSB7Ci0gIGludCBvayA9IDA7Ci0gIGludCBsejc3X2lzX3VzZWZ1bDsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzX3JsZSwgcmVmc19sejc3OwotICBjb25zdCBpbnQgbnVtX3BpeCA9IHdpZHRoICogaGVpZ2h0OwotCi0gIFZQOExCYWNrd2FyZFJlZnNBbGxvYygmcmVmc19ybGUsIG51bV9waXgpOwotICBWUDhMQmFja3dhcmRSZWZzQWxsb2MoJnJlZnNfbHo3NywgbnVtX3BpeCk7Ci0gIFZQOExJbml0QmFja3dhcmRSZWZzKGJlc3QpOwotICBpZiAocmVmc19ybGUucmVmcyA9PSBOVUxMIHx8IHJlZnNfbHo3Ny5yZWZzID09IE5VTEwpIHsKLSBFcnJvcjE6Ci0gICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzX3JsZSk7Ci0gICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzX2x6NzcpOwotICAgIGdvdG8gRW5kOwotICB9Ci0KLSAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW4od2lkdGgsIGhlaWdodCwgYXJnYiwgY2FjaGVfYml0cywgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZnNfbHo3NykpIHsKLSAgICBnb3RvIEVuZDsKLSAgfQotICAvLyBCYWNrd2FyZCBSZWZlcmVuY2UgdXNpbmcgUkxFIG9ubHkuCi0gIEJhY2t3YXJkUmVmZXJlbmNlc1JsZSh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAmcmVmc19ybGUpOwotCi0gIHsKLSAgICBkb3VibGUgYml0X2Nvc3RfbHo3NywgYml0X2Nvc3RfcmxlOwotICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoaXN0bykpOwotICAgIGlmIChoaXN0byA9PSBOVUxMKSBnb3RvIEVycm9yMTsKLSAgICAvLyBFdmFsdWF0ZSBsejc3IGNvZGluZwotICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sICZyZWZzX2x6NzcsIGNhY2hlX2JpdHMpOwotICAgIGJpdF9jb3N0X2x6NzcgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKLSAgICAvLyBFdmFsdWF0ZSBSTEUgY29kaW5nCi0gICAgVlA4TEhpc3RvZ3JhbUNyZWF0ZShoaXN0bywgJnJlZnNfcmxlLCBjYWNoZV9iaXRzKTsKLSAgICBiaXRfY29zdF9ybGUgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKLSAgICAvLyBEZWNpZGUgaWYgTFo3NyBpcyB1c2VmdWwuCi0gICAgbHo3N19pc191c2VmdWwgPSAoYml0X2Nvc3RfbHo3NyA8IGJpdF9jb3N0X3JsZSk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvKTsKLSAgfQotCi0gIC8vIENob29zZSBhcHByb3ByaWF0ZSBiYWNrd2FyZCByZWZlcmVuY2UuCi0gIGlmIChsejc3X2lzX3VzZWZ1bCkgewotICAgIC8vIFRyYWNlQmFja3dhcmRzIGlzIGNvc3RseS4gRG9uJ3QgZXhlY3V0ZSBpdCBhdCBsb3dlciBxdWFsaXR5IChxIDw9IDEwKS4KLSAgICBjb25zdCBpbnQgdHJ5X2x6NzdfdHJhY2VfYmFja3dhcmRzID0gKHF1YWxpdHkgPiAxMCk7Ci0gICAgKmJlc3QgPSByZWZzX2x6Nzc7ICAgLy8gZGVmYXVsdCBndWVzczogbHo3NyBpcyBiZXR0ZXIKLSAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnNfcmxlKTsKLSAgICBpZiAodHJ5X2x6NzdfdHJhY2VfYmFja3dhcmRzKSB7Ci0gICAgICAvLyBTZXQgcmVjdXJzaW9uIGxldmVsIGZvciBsYXJnZSBpbWFnZXMgdXNpbmcgYSBjb2xvciBjYWNoZS4KLSAgICAgIGNvbnN0IGludCByZWN1cnNpb25fbGV2ZWwgPQotICAgICAgICAgIChudW1fcGl4IDwgMzIwICogMjAwKSAmJiAoY2FjaGVfYml0cyA+IDApID8gMSA6IDA7Ci0gICAgICBWUDhMQmFja3dhcmRSZWZzIHJlZnNfdHJhY2U7Ci0gICAgICBpZiAoIVZQOExCYWNrd2FyZFJlZnNBbGxvYygmcmVmc190cmFjZSwgbnVtX3BpeCkpIHsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0gICAgICBpZiAoQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMod2lkdGgsIGhlaWdodCwgcmVjdXJzaW9uX2xldmVsLCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIGNhY2hlX2JpdHMsICZyZWZzX3RyYWNlKSkgewotICAgICAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnNfbHo3Nyk7Ci0gICAgICAgICpiZXN0ID0gcmVmc190cmFjZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzX2x6NzcpOwotICAgICpiZXN0ID0gcmVmc19ybGU7Ci0gIH0KLQotICBpZiAodXNlXzJkX2xvY2FsaXR5KSBCYWNrd2FyZFJlZmVyZW5jZXMyRExvY2FsaXR5KHdpZHRoLCBiZXN0KTsKLQotICBvayA9IDE7Ci0KLSBFbmQ6Ci0gIGlmICghb2spIHsKLSAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoYmVzdCk7Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLyBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KLXN0YXRpYyBpbnQgQ29tcHV0ZUNhY2hlSGlzdG9ncmFtKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBpbnQgcGl4ZWxfaW5kZXggPSAwOwotICBpbnQgaTsKLSAgdWludDMyX3QgazsKLSAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGludCBjY19pbml0ID0gMDsKLQotICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7Ci0gICAgaWYgKCFjY19pbml0KSByZXR1cm4gMDsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCByZWZzLT5zaXplOyArK2kpIHsKLSAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSAmcmVmcy0+cmVmc1tpXTsKLSAgICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlICYmCi0gICAgICAgICAgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgYXJnYltwaXhlbF9pbmRleF0pKSB7Ci0gICAgICAgIC8vIHB1c2ggcGl4ZWwgYXMgYSBjYWNoZSBpbmRleAotICAgICAgICBjb25zdCBpbnQgaXggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBhcmdiW3BpeGVsX2luZGV4XSk7Ci0gICAgICAgIGNvbnN0IFBpeE9yQ29weSB0b2tlbiA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGl4KTsKLSAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgJnRva2VuKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sIHYpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCB2KTsKLSAgICB9Ci0gICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgICAgZm9yIChrID0gMDsgayA8IFBpeE9yQ29weUxlbmd0aCh2KTsgKytrKSB7Ci0gICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW3BpeGVsX2luZGV4ICsga10pOwotICAgICAgfQotICAgIH0KLSAgICBwaXhlbF9pbmRleCArPSBQaXhPckNvcHlMZW5ndGgodik7Ci0gIH0KLSAgU0JfRENIRUNLKHBpeGVsX2luZGV4ID09IHhzaXplICogeXNpemUpOwotICAodm9pZCl4c2l6ZTsgIC8vIHhzaXplIGlzIG5vdCB1c2VkIGluIG5vbi1kZWJ1ZyBjb21waWxhdGlvbnMgb3RoZXJ3aXNlLgotICAodm9pZCl5c2l6ZTsgIC8vIHlzaXplIGlzIG5vdCB1c2VkIGluIG5vbi1kZWJ1ZyBjb21waWxhdGlvbnMgb3RoZXJ3aXNlLgotICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7Ci0gIHJldHVybiAxOwotfQotCi0vLyBSZXR1cm5zIGhvdyBtYW55IGJpdHMgYXJlIHRvIGJlIHVzZWQgZm9yIGEgY29sb3IgY2FjaGUuCi1pbnQgVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBiZXN0X2NhY2hlX2JpdHMpIHsKLSAgaW50IG9rID0gMDsKLSAgaW50IGNhY2hlX2JpdHM7Ci0gIGRvdWJsZSBsb3dlc3RfZW50cm9weSA9IDFlOTk7Ci0gIFZQOExCYWNrd2FyZFJlZnMgcmVmczsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU21hbGxQZW5hbHR5Rm9yTGFyZ2VDYWNoZSA9IDQuMDsKLSAgc3RhdGljIGNvbnN0IGludCBxdWFsaXR5ID0gMzA7Ci0gIGlmICghVlA4TEJhY2t3YXJkUmVmc0FsbG9jKCZyZWZzLCB4c2l6ZSAqIHlzaXplKSB8fAotICAgICAgIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbih4c2l6ZSwgeXNpemUsIGFyZ2IsIDAsIHF1YWxpdHksICZyZWZzKSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgZm9yIChjYWNoZV9iaXRzID0gMDsgY2FjaGVfYml0cyA8PSBNQVhfQ09MT1JfQ0FDSEVfQklUUzsgKytjYWNoZV9iaXRzKSB7Ci0gICAgZG91YmxlIGN1cl9lbnRyb3B5OwotICAgIFZQOExIaXN0b2dyYW0gaGlzdG87Ci0gICAgVlA4TEhpc3RvZ3JhbUluaXQoJmhpc3RvLCBjYWNoZV9iaXRzKTsKLSAgICBDb21wdXRlQ2FjaGVIaXN0b2dyYW0oYXJnYiwgeHNpemUsIHlzaXplLCAmcmVmcywgY2FjaGVfYml0cywgJmhpc3RvKTsKLSAgICBjdXJfZW50cm9weSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoJmhpc3RvKSArCi0gICAgICAgIGtTbWFsbFBlbmFsdHlGb3JMYXJnZUNhY2hlICogY2FjaGVfYml0czsKLSAgICBpZiAoY2FjaGVfYml0cyA9PSAwIHx8IGN1cl9lbnRyb3B5IDwgbG93ZXN0X2VudHJvcHkpIHsKLSAgICAgICpiZXN0X2NhY2hlX2JpdHMgPSBjYWNoZV9iaXRzOwotICAgICAgbG93ZXN0X2VudHJvcHkgPSBjdXJfZW50cm9weTsKLSAgICB9Ci0gIH0KLSAgb2sgPSAxOwotIEVycm9yOgotICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnMpOwotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNDQxYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotCi0jaWZuZGVmIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfSF8KLSNkZWZpbmUgV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIFRoZSBzcGVjIGFsbG93cyAxMSwgd2UgdXNlIDkgYml0cyB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uIGluIGVuY29kaW5nLgotLy8gSGF2aW5nIDkgaW5zdGVhZCBvZiAxMSBvbmx5IHJlbW92ZXMgYWJvdXQgMC4yNSAlIG9mIGNvbXByZXNzaW9uIGRlbnNpdHkuCi0jZGVmaW5lIE1BWF9DT0xPUl9DQUNIRV9CSVRTIDkKLQotLy8gTWF4IGV2ZXIgbnVtYmVyIG9mIGNvZGVzIHdlJ2xsIHVzZToKLSNkZWZpbmUgUElYX09SX0NPUFlfQ09ERVNfTUFYIFwKLSAgICAoTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsgKDEgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlZml4RW5jb2RlKCkKLQotLy8gdXNlIEdOVSBidWlsdGlucyB3aGVyZSBhdmFpbGFibGUuCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAotICAgICgoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSB8fCBfX0dOVUNfXyA+PSA0KQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBCaXRzTG9nMkZsb29yKHVpbnQzMl90IG4pIHsKLSAgU0JfRENIRUNLKG4gIT0gMCk7Ci0gIHJldHVybiAzMSBeIF9fYnVpbHRpbl9jbHoobik7Ci19Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpCi0jaW5jbHVkZSA8aW50cmluLmg+Ci0jcHJhZ21hIGludHJpbnNpYyhfQml0U2NhblJldmVyc2UpCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7Ci0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc2V0X2JpdDsKLSAgU0JfRENIRUNLKG4gIT0gMCk7Ci0gIF9CaXRTY2FuUmV2ZXJzZSgmZmlyc3Rfc2V0X2JpdCwgbik7Ci0gIHJldHVybiBmaXJzdF9zZXRfYml0OwotfQotI2Vsc2UKLS8vIFJldHVybnMgKGludClmbG9vcihsb2cyKG4pKS4gbiBtdXN0IGJlID4gMC4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7Ci0gIGludCBsb2cgPSAwOwotICB1aW50MzJfdCB2YWx1ZSA9IG47Ci0gIGludCBpOwotCi0gIFNCX0RDSEVDSyhuICE9IDApOwotICBmb3IgKGkgPSA0OyBpID49IDA7IC0taSkgewotICAgIGNvbnN0IGludCBzaGlmdCA9ICgxIDw8IGkpOwotICAgIGNvbnN0IHVpbnQzMl90IHggPSB2YWx1ZSA+PiBzaGlmdDsKLSAgICBpZiAoeCAhPSAwKSB7Ci0gICAgICB2YWx1ZSA9IHg7Ci0gICAgICBsb2cgKz0gc2hpZnQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBsb2c7Ci19Ci0jZW5kaWYKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMQml0c0xvZzJDZWlsaW5nKHVpbnQzMl90IG4pIHsKLSAgY29uc3QgaW50IGxvZ19mbG9vciA9IEJpdHNMb2cyRmxvb3Iobik7Ci0gIGlmIChuID09IChuICYgfihuIC0gMSkpKSAgLy8gemVybyBvciBhIHBvd2VyIG9mIHR3by4KLSAgICByZXR1cm4gbG9nX2Zsb29yOwotICBlbHNlCi0gICAgcmV0dXJuIGxvZ19mbG9vciArIDE7Ci19Ci0KLS8vIFNwbGl0dGluZyBvZiBkaXN0YW5jZSBhbmQgbGVuZ3RoIGNvZGVzIGludG8gcHJlZml4ZXMgYW5kCi0vLyBleHRyYSBiaXRzLiBUaGUgcHJlZml4ZXMgYXJlIGVuY29kZWQgd2l0aCBhbiBlbnRyb3B5IGNvZGUKLS8vIHdoaWxlIHRoZSBleHRyYSBiaXRzIGFyZSBzdG9yZWQganVzdCBhcyBub3JtYWwgYml0cy4KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWZpeEVuY29kZShpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHNfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzX3ZhbHVlKSB7Ci0gIGlmIChkaXN0YW5jZSA+IDIpIHsgIC8vIENvbGxlY3QgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0gICAgY29uc3QgaW50IGhpZ2hlc3RfYml0ID0gQml0c0xvZzJGbG9vcigtLWRpc3RhbmNlKTsKLSAgICBjb25zdCBpbnQgc2Vjb25kX2hpZ2hlc3RfYml0ID0gKGRpc3RhbmNlID4+IChoaWdoZXN0X2JpdCAtIDEpKSAmIDE7Ci0gICAgKmV4dHJhX2JpdHNfY291bnQgPSBoaWdoZXN0X2JpdCAtIDE7Ci0gICAgKmV4dHJhX2JpdHNfdmFsdWUgPSBkaXN0YW5jZSAmICgoMSA8PCAqZXh0cmFfYml0c19jb3VudCkgLSAxKTsKLSAgICAqY29kZSA9IDIgKiBoaWdoZXN0X2JpdCArIHNlY29uZF9oaWdoZXN0X2JpdDsKLSAgfSBlbHNlIHsKLSAgICAqZXh0cmFfYml0c19jb3VudCA9IDA7Ci0gICAgKmV4dHJhX2JpdHNfdmFsdWUgPSAwOwotICAgICpjb2RlID0gKGRpc3RhbmNlID09IDIpID8gMSA6IDA7Ci0gIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBpeE9yQ29weQotCi1lbnVtIE1vZGUgewotICBrTGl0ZXJhbCwKLSAga0NhY2hlSWR4LAotICBrQ29weSwKLSAga05vbmUKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gbW9kZSBhcyB1aW50OF90IHRvIG1ha2UgdGhlIG1lbW9yeSBsYXlvdXQgdG8gYmUgZXhhY3RseSA4IGJ5dGVzLgotICB1aW50OF90IG1vZGU7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDMyX3QgYXJnYl9vcl9kaXN0YW5jZTsKLX0gUGl4T3JDb3B5OwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUNvcHkodWludDMyX3QgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIFBpeE9yQ29weSByZXR2YWw7Ci0gIHJldHZhbC5tb2RlID0ga0NvcHk7Ci0gIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gZGlzdGFuY2U7Ci0gIHJldHZhbC5sZW4gPSBsZW47Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaW50IGlkeCkgewotICBQaXhPckNvcHkgcmV0dmFsOwotICBTQl9EQ0hFQ0soaWR4ID49IDApOwotICBTQl9EQ0hFQ0soaWR4IDwgKDEgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKTsKLSAgcmV0dmFsLm1vZGUgPSBrQ2FjaGVJZHg7Ci0gIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gaWR4OwotICByZXR2YWwubGVuID0gMTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHVpbnQzMl90IGFyZ2IpIHsKLSAgUGl4T3JDb3B5IHJldHZhbDsKLSAgcmV0dmFsLm1vZGUgPSBrTGl0ZXJhbDsKLSAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBhcmdiOwotICByZXR2YWwubGVuID0gMTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0xpdGVyYWwoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIHJldHVybiAocC0+bW9kZSA9PSBrTGl0ZXJhbCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDYWNoZUlkeChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgcmV0dXJuIChwLT5tb2RlID09IGtDYWNoZUlkeCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDb3B5KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICByZXR1cm4gKHAtPm1vZGUgPT0ga0NvcHkpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50KSB7Ci0gIFNCX0RDSEVDSyhwLT5tb2RlID09IGtMaXRlcmFsKTsKLSAgcmV0dXJuIChwLT5hcmdiX29yX2Rpc3RhbmNlID4+IChjb21wb25lbnQgKiA4KSkgJiAweGZmOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGVuZ3RoKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICByZXR1cm4gcC0+bGVuOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5QXJnYihjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0xpdGVyYWwpOwotICByZXR1cm4gcC0+YXJnYl9vcl9kaXN0YW5jZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBpeE9yQ29weUNhY2hlSWR4KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICBTQl9EQ0hFQ0socC0+bW9kZSA9PSBrQ2FjaGVJZHgpOwotICBTQl9EQ0hFQ0socC0+YXJnYl9vcl9kaXN0YW5jZSA8ICgxVSA8PCBNQVhfQ09MT1JfQ0FDSEVfQklUUykpOwotICByZXR1cm4gcC0+YXJnYl9vcl9kaXN0YW5jZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBpeE9yQ29weURpc3RhbmNlKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICBTQl9EQ0hFQ0socC0+bW9kZSA9PSBrQ29weSk7Ci0gIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TEJhY2t3YXJkUmVmcwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFBpeE9yQ29weSogcmVmczsKLSAgaW50IHNpemU7ICAgICAgLy8gY3VycmVudGx5IHVzZWQKLSAgaW50IG1heF9zaXplOyAgLy8gbWF4aW11bSBjYXBhY2l0eQotfSBWUDhMQmFja3dhcmRSZWZzOwotCi0vLyBJbml0aWFsaXplIHRoZSBvYmplY3QuIE11c3QgYmUgY2FsbGVkIGZpcnN0LiAncmVmcycgY2FuIGJlIE5VTEwuCi12b2lkIFZQOExJbml0QmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOwotCi0vLyBSZWxlYXNlIG1lbW9yeSBhbmQgcmUtaW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiAncmVmcycgY2FuIGJlIE5VTEwuCi12b2lkIFZQOExDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKLQotLy8gQWxsb2NhdGUgJ21heF9zaXplJyByZWZlcmVuY2VzLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgotaW50IFZQOExCYWNrd2FyZFJlZnNBbGxvYyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLCBpbnQgbWF4X3NpemUpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBlbnRyeSBwb2ludHMKLQotLy8gRXZhbHVhdGVzIGJlc3QgcG9zc2libGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmb3Igc3BlY2lmaWVkIHF1YWxpdHkuCi0vLyBGdXJ0aGVyIG9wdGltaXplIGZvciAyRCBsb2NhbGl0eSBpZiB1c2VfMmRfbG9jYWxpdHkgZmxhZyBpcyBzZXQuCi1pbnQgVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywgaW50IHVzZV8yZF9sb2NhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IGJlc3QpOwotCi0vLyBQcm9kdWNlIGFuIGVzdGltYXRlIGZvciBhIGdvb2QgY29sb3IgY2FjaGUgc2l6ZSBmb3IgdGhlIGltYWdlLgotaW50IFZQOExDYWxjdWxhdGVFc3RpbWF0ZUZvckNhY2hlU2l6ZShjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgYmVzdF9jYWNoZV9iaXRzKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb25maWcuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmOTZiMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIENvZGluZyB0b29scyBjb25maWd1cmF0aW9uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgIi4uL3dlYnAvZW5jb2RlLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUENvbmZpZwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFdlYlBDb25maWdJbml0SW50ZXJuYWwoV2ViUENvbmZpZyogY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFByZXNldCBwcmVzZXQsIGZsb2F0IHF1YWxpdHksIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgIC8vIGNhbGxlci9zeXN0ZW0gdmVyc2lvbiBtaXNtYXRjaCEKLSAgfQotICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiAwOwotCi0gIGNvbmZpZy0+cXVhbGl0eSA9IHF1YWxpdHk7Ci0gIGNvbmZpZy0+dGFyZ2V0X3NpemUgPSAwOwotICBjb25maWctPnRhcmdldF9QU05SID0gMC47Ci0gIGNvbmZpZy0+bWV0aG9kID0gNDsKLSAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA1MDsKLSAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSA2MDsgICAvLyByYXRoZXIgaGlnaCBmaWx0ZXJpbmcsIGhlbHBzIHcvIGdyYWRpZW50cy4KLSAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gMDsKLSAgY29uZmlnLT5maWx0ZXJfdHlwZSA9IDE7ICAgICAgICAvLyBkZWZhdWx0OiBzdHJvbmcgKHNvIFUvViBpcyBmaWx0ZXJlZCB0b28pCi0gIGNvbmZpZy0+cGFydGl0aW9ucyA9IDA7Ci0gIGNvbmZpZy0+c2VnbWVudHMgPSA0OwotICBjb25maWctPnBhc3MgPSAxOwotICBjb25maWctPnNob3dfY29tcHJlc3NlZCA9IDA7Ci0gIGNvbmZpZy0+cHJlcHJvY2Vzc2luZyA9IDA7Ci0gIGNvbmZpZy0+YXV0b2ZpbHRlciA9IDA7Ci0gIGNvbmZpZy0+cGFydGl0aW9uX2xpbWl0ID0gMDsKLSAgY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiA9IDE7Ci0gIGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID0gMTsKLSAgY29uZmlnLT5hbHBoYV9xdWFsaXR5ID0gMTAwOwotICBjb25maWctPmxvc3NsZXNzID0gMDsKLSAgY29uZmlnLT5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX0RFRkFVTFQ7Ci0gIGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPSAwOwotICBjb25maWctPnRocmVhZF9sZXZlbCA9IDA7Ci0gIGNvbmZpZy0+bG93X21lbW9yeSA9IDA7Ci0KLSAgLy8gVE9ETyhza2FsKTogdHVuZS4KLSAgc3dpdGNoIChwcmVzZXQpIHsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX1BJQ1RVUkU6Ci0gICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOwotICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNDsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX1BIT1RPOgotICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA4MDsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDM7Ci0gICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9EUkFXSU5HOgotICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAyNTsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDY7Ci0gICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9JQ09OOgotICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAwOwotICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAwOyAgIC8vIGRpc2FibGUgZmlsdGVyaW5nIHRvIHJldGFpbiBzaGFycG5lc3MKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0VCUF9QUkVTRVRfVEVYVDoKLSAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gMDsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMDsgICAvLyBkaXNhYmxlIGZpbHRlcmluZyB0byByZXRhaW4gc2hhcnBuZXNzCi0gICAgICBjb25maWctPnNlZ21lbnRzID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0VCUF9QUkVTRVRfREVGQVVMVDoKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIFdlYlBWYWxpZGF0ZUNvbmZpZyhjb25maWcpOwotfQotCi1pbnQgV2ViUFZhbGlkYXRlQ29uZmlnKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZykgewotICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5xdWFsaXR5IDwgMCB8fCBjb25maWctPnF1YWxpdHkgPiAxMDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnRhcmdldF9zaXplIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+dGFyZ2V0X1BTTlIgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5tZXRob2QgPCAwIHx8IGNvbmZpZy0+bWV0aG9kID4gNikKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+c2VnbWVudHMgPCAxIHx8IGNvbmZpZy0+c2VnbWVudHMgPiA0KQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5zbnNfc3RyZW5ndGggPCAwIHx8IGNvbmZpZy0+c25zX3N0cmVuZ3RoID4gMTAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID4gMTAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzIDwgMCB8fCBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPiA3KQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5maWx0ZXJfdHlwZSA8IDAgfHwgY29uZmlnLT5maWx0ZXJfdHlwZSA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmF1dG9maWx0ZXIgPCAwIHx8IGNvbmZpZy0+YXV0b2ZpbHRlciA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnBhc3MgPCAxIHx8IGNvbmZpZy0+cGFzcyA+IDEwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPCAwIHx8IGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+cHJlcHJvY2Vzc2luZyA8IDAgfHwgY29uZmlnLT5wcmVwcm9jZXNzaW5nID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+cGFydGl0aW9ucyA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25zID4gMykKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+cGFydGl0aW9uX2xpbWl0IDwgMCB8fCBjb25maWctPnBhcnRpdGlvbl9saW1pdCA+IDEwMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24gPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5hbHBoYV9xdWFsaXR5IDwgMCB8fCBjb25maWctPmFscGhhX3F1YWxpdHkgPiAxMDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmxvc3NsZXNzIDwgMCB8fCBjb25maWctPmxvc3NsZXNzID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+aW1hZ2VfaGludCA+PSBXRUJQX0hJTlRfTEFTVCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPCAwIHx8IGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT50aHJlYWRfbGV2ZWwgPCAwIHx8IGNvbmZpZy0+dGhyZWFkX2xldmVsID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+bG93X21lbW9yeSA8IDAgfHwgY29uZmlnLT5sb3dfbWVtb3J5ID4gMSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2MyYzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDb3N0IHRhYmxlcyBmb3IgbGV2ZWwgYW5kIG1vZGVzLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9FTkNfQ09TVF9IXwotI2RlZmluZSBXRUJQX0VOQ19DT1NUX0hfCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIGFwcHJveGltYXRlIGNvc3QgcGVyIGxldmVsOgotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsRml4ZWRDb3N0c1tNQVhfTEVWRUwgKyAxXTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhFbnRyb3B5Q29zdFsyNTZdOyAgICAgICAgLy8gOGJpdCBmaXhlZC1wb2ludCBsb2cocCkKLQotLy8gQ29zdCBvZiBjb2Rpbmcgb25lIGV2ZW50IHdpdGggcHJvYmFiaWxpdHkgJ3Byb2JhJy4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Qml0Q29zdChpbnQgYml0LCB1aW50OF90IHByb2JhKSB7Ci0gIHJldHVybiAhYml0ID8gVlA4RW50cm9weUNvc3RbcHJvYmFdIDogVlA4RW50cm9weUNvc3RbMjU1IC0gcHJvYmFdOwotfQotCi0vLyBMZXZlbCBjb3N0IGNhbGN1bGF0aW9ucwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXTsKLXZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhQcm9iYSogY29uc3QgcHJvYmEpOwotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMZXZlbENvc3QoY29uc3QgdWludDE2X3QqIGNvbnN0IHRhYmxlLCBpbnQgbGV2ZWwpIHsKLSAgcmV0dXJuIFZQOExldmVsRml4ZWRDb3N0c1tsZXZlbF0KLSAgICAgICArIHRhYmxlWyhsZXZlbCA+IE1BWF9WQVJJQUJMRV9MRVZFTCkgPyBNQVhfVkFSSUFCTEVfTEVWRUwgOiBsZXZlbF07Ci19Ci0KLS8vIE1vZGUgY29zdHMKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF07Ci1leHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU107Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfRU5DX0NPU1RfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9maWx0ZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NzI3Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNlbGVjdGluZyBmaWx0ZXIgbGV2ZWwKLS8vCi0vLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lbmQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gTk9URTogY2xpcDEsIHRhYmxlcyBhbmQgSW5pdFRhYmxlcyBhcmUgcmVwZWF0ZWQgZW50cmllcyBvZiBkc3AuYwotc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKQotc3RhdGljIHVpbnQ4X3QgYWJzMVsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKT4+MQotc3RhdGljIGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXTsgIC8vIGNsaXBzIFstMTAyMCwgMTAyMF0gdG8gWy0xMjgsIDEyN10KLXN0YXRpYyBpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdOyAgICAvLyBjbGlwcyBbLTExMiwgMTEyXSB0byBbLTE2LCAxNV0KLXN0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMCArIDFdOyAgICAvLyBjbGlwcyBbLTI1NSw1MTBdIHRvIFswLDI1NV0KLQotc3RhdGljIGludCB0YWJsZXNfb2sgPSAwOwotCi1zdGF0aWMgdm9pZCBJbml0VGFibGVzKHZvaWQpIHsKLSAgaWYgKCF0YWJsZXNfb2spIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NTsgKytpKSB7Ci0gICAgICBhYnMwWzI1NSArIGldID0gKGkgPCAwKSA/IC1pIDogaTsKLSAgICAgIGFiczFbMjU1ICsgaV0gPSBhYnMwWzI1NSArIGldID4+IDE7Ci0gICAgfQotICAgIGZvciAoaSA9IC0xMDIwOyBpIDw9IDEwMjA7ICsraSkgewotICAgICAgc2NsaXAxWzEwMjAgKyBpXSA9IChpIDwgLTEyOCkgPyAtMTI4IDogKGkgPiAxMjcpID8gMTI3IDogaTsKLSAgICB9Ci0gICAgZm9yIChpID0gLTExMjsgaSA8PSAxMTI7ICsraSkgewotICAgICAgc2NsaXAyWzExMiArIGldID0gKGkgPCAtMTYpID8gLTE2IDogKGkgPiAxNSkgPyAxNSA6IGk7Ci0gICAgfQotICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKLSAgICAgIGNsaXAxWzI1NSArIGldID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiBpOwotICAgIH0KLSAgICB0YWJsZXNfb2sgPSAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKLQotLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgc2NsaXAxWzEwMjAgKyBwMSAtIHExXTsKLSAgY29uc3QgaW50IGExID0gc2NsaXAyWzExMiArICgoYSArIDQpID4+IDMpXTsKLSAgY29uc3QgaW50IGEyID0gc2NsaXAyWzExMiArICgoYSArIDMpID4+IDMpXTsKLSAgcFstc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgMF0gPSBjbGlwMVsyNTUgKyBxMCAtIGExXTsKLX0KLQotLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOwotICBwWy0yKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDEgKyBhM107Ci0gIHBbLSAgc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotICBwWyAgIHN0ZXBdID0gY2xpcDFbMjU1ICsgcTEgLSBhM107Ci19Ci0KLS8vIGhpZ2ggZWRnZS12YXJpYW5jZQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKLSAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07Ci0gIHJldHVybiAoYWJzMFsyNTUgKyBwMSAtIHAwXSA+IHRocmVzaCkgfHwgKGFiczBbMjU1ICsgcTEgLSBxMF0gPiB0aHJlc2gpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgcmV0dXJuICgyICogYWJzMFsyNTUgKyBwMCAtIHEwXSArIGFiczFbMjU1ICsgcDEgLSBxMV0pIDw9IHRocmVzaDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBuZWVkc19maWx0ZXIyKGNvbnN0IHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCB0LCBpbnQgaXQpIHsKLSAgY29uc3QgaW50IHAzID0gcFstNCpzdGVwXSwgcDIgPSBwWy0zKnN0ZXBdLCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF07Ci0gIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIqc3RlcF0sIHEzID0gcFszKnN0ZXBdOwotICBpZiAoKDIgKiBhYnMwWzI1NSArIHAwIC0gcTBdICsgYWJzMVsyNTUgKyBwMSAtIHExXSkgPiB0KQotICAgIHJldHVybiAwOwotICByZXR1cm4gYWJzMFsyNTUgKyBwMyAtIHAyXSA8PSBpdCAmJiBhYnMwWzI1NSArIHAyIC0gcDFdIDw9IGl0ICYmCi0gICAgICAgICBhYnMwWzI1NSArIHAxIC0gcDBdIDw9IGl0ICYmIGFiczBbMjU1ICsgcTMgLSBxMl0gPD0gaXQgJiYKLSAgICAgICAgIGFiczBbMjU1ICsgcTIgLSBxMV0gPD0gaXQgJiYgYWJzMFsyNTUgKyBxMSAtIHEwXSA8PSBpdDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCi0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGlmIChuZWVkc19maWx0ZXIocCArIGksIHN0cmlkZSwgdGhyZXNoKSkgewotICAgICAgZG9fZmlsdGVyMihwICsgaSwgc3RyaWRlKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSAqIHN0cmlkZSwgMSwgdGhyZXNoKSkgewotICAgICAgZG9fZmlsdGVyMihwICsgaSAqIHN0cmlkZSwgMSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNCAqIHN0cmlkZTsKLSAgICBTaW1wbGVWRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNDsKLSAgICBTaW1wbGVIRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgd2hpbGUgKHNpemUtLSA+IDApIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gsIGl0aHJlc2gpKSB7Ci0gICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7Ci0gICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkb19maWx0ZXI0KHAsIGhzdHJpZGUpOwotICAgICAgfQotICAgIH0KLSAgICBwICs9IHZzdHJpZGU7Ci0gIH0KLX0KLQotLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgKCpWUDhFbmNWRmlsdGVyMTZpKSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgaW50KSA9IFZGaWx0ZXIxNmk7Ci12b2lkICgqVlA4RW5jSEZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50LCBpbnQsIGludCkgPSBIRmlsdGVyMTZpOwotdm9pZCAoKlZQOEVuY1ZGaWx0ZXI4aSkodWludDhfdCosIHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpID0gVkZpbHRlcjhpOwotdm9pZCAoKlZQOEVuY0hGaWx0ZXI4aSkodWludDhfdCosIHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpID0gSEZpbHRlcjhpOwotCi12b2lkICgqVlA4RW5jU2ltcGxlVkZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50KSA9IFNpbXBsZVZGaWx0ZXIxNmk7Ci12b2lkICgqVlA4RW5jU2ltcGxlSEZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50KSA9IFNpbXBsZUhGaWx0ZXIxNmk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYXJhZ3JhcGggMTUuNDogY29tcHV0ZSB0aGUgaW5uZXItZWRnZSBmaWx0ZXJpbmcgc3RyZW5ndGgKLQotc3RhdGljIGludCBHZXRJTGV2ZWwoaW50IHNoYXJwbmVzcywgaW50IGxldmVsKSB7Ci0gIGlmIChzaGFycG5lc3MgPiAwKSB7Ci0gICAgaWYgKHNoYXJwbmVzcyA+IDQpIHsKLSAgICAgIGxldmVsID4+PSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZXZlbCA+Pj0gMTsKLSAgICB9Ci0gICAgaWYgKGxldmVsID4gOSAtIHNoYXJwbmVzcykgewotICAgICAgbGV2ZWwgPSA5IC0gc2hhcnBuZXNzOwotICAgIH0KLSAgfQotICBpZiAobGV2ZWwgPCAxKSBsZXZlbCA9IDE7Ci0gIHJldHVybiBsZXZlbDsKLX0KLQotc3RhdGljIHZvaWQgRG9GaWx0ZXIoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbGV2ZWwpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IGludCBpbGV2ZWwgPSBHZXRJTGV2ZWwoZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzLCBsZXZlbCk7Ci0gIGNvbnN0IGludCBsaW1pdCA9IDIgKiBsZXZlbCArIGlsZXZlbDsKLQotICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBZX09GRjsKLSAgdWludDhfdCogY29uc3QgdV9kc3QgPSBpdC0+eXV2X291dDJfICsgVV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFZfT0ZGOwotCi0gIC8vIGNvcHkgY3VycmVudCBibG9jayB0byB5dXZfb3V0Ml8KLSAgU2JNZW1vcnlDb3B5KHlfZHN0LCBpdC0+eXV2X291dF8sIFlVVl9TSVpFICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICBpZiAoZW5jLT5maWx0ZXJfaGRyXy5zaW1wbGVfID09IDEpIHsgICAvLyBzaW1wbGUKLSAgICBWUDhFbmNTaW1wbGVIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0KTsKLSAgICBWUDhFbmNTaW1wbGVWRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0KTsKLSAgfSBlbHNlIHsgICAgLy8gY29tcGxleAotICAgIGNvbnN0IGludCBoZXZfdGhyZXNoID0gKGxldmVsID49IDQwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7Ci0gICAgVlA4RW5jSEZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICBWUDhFbmNIRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIFZQOEVuY1ZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgVlA4RW5jVkZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU1NJTSBtZXRyaWMKLQotZW51bSB7IEtFUk5FTCA9IDMgfTsKLXN0YXRpYyBjb25zdCBkb3VibGUga01pblZhbHVlID0gMS5lLTEwOyAgLy8gbWluaW1hbCB0aHJlc2hvbGQKLQotdm9pZCBWUDhTU0lNQWRkU3RhdHMoY29uc3QgRGlzdG9TdGF0cyogY29uc3Qgc3JjLCBEaXN0b1N0YXRzKiBjb25zdCBkc3QpIHsKLSAgZHN0LT53ICAgKz0gc3JjLT53OwotICBkc3QtPnhtICArPSBzcmMtPnhtOwotICBkc3QtPnltICArPSBzcmMtPnltOwotICBkc3QtPnh4bSArPSBzcmMtPnh4bTsKLSAgZHN0LT54eW0gKz0gc3JjLT54eW07Ci0gIGRzdC0+eXltICs9IHNyYy0+eXltOwotfQotCi1zdGF0aWMgdm9pZCBWUDhTU0lNQWNjdW11bGF0ZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sIGludCBXLCBpbnQgSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IGludCB5bWluID0gKHlvIC0gS0VSTkVMIDwgMCkgPyAwIDogeW8gLSBLRVJORUw7Ci0gIGNvbnN0IGludCB5bWF4ID0gKHlvICsgS0VSTkVMID4gSCAtIDEpID8gSCAtIDEgOiB5byArIEtFUk5FTDsKLSAgY29uc3QgaW50IHhtaW4gPSAoeG8gLSBLRVJORUwgPCAwKSA/IDAgOiB4byAtIEtFUk5FTDsKLSAgY29uc3QgaW50IHhtYXggPSAoeG8gKyBLRVJORUwgPiBXIC0gMSkgPyBXIC0gMSA6IHhvICsgS0VSTkVMOwotICBpbnQgeCwgeTsKLSAgc3JjMSArPSB5bWluICogc3RyaWRlMTsKLSAgc3JjMiArPSB5bWluICogc3RyaWRlMjsKLSAgZm9yICh5ID0geW1pbjsgeSA8PSB5bWF4OyArK3ksIHNyYzEgKz0gc3RyaWRlMSwgc3JjMiArPSBzdHJpZGUyKSB7Ci0gICAgZm9yICh4ID0geG1pbjsgeCA8PSB4bWF4OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBzMSA9IHNyYzFbeF07Ci0gICAgICBjb25zdCBpbnQgczIgPSBzcmMyW3hdOwotICAgICAgc3RhdHMtPncgICArPSAxOwotICAgICAgc3RhdHMtPnhtICArPSBzMTsKLSAgICAgIHN0YXRzLT55bSAgKz0gczI7Ci0gICAgICBzdGF0cy0+eHhtICs9IHMxICogczE7Ci0gICAgICBzdGF0cy0+eHltICs9IHMxICogczI7Ci0gICAgICBzdGF0cy0+eXltICs9IHMyICogczI7Ci0gICAgfQotICB9Ci19Ci0KLWRvdWJsZSBWUDhTU0lNR2V0KGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IGRvdWJsZSB4bXhtID0gc3RhdHMtPnhtICogc3RhdHMtPnhtOwotICBjb25zdCBkb3VibGUgeW15bSA9IHN0YXRzLT55bSAqIHN0YXRzLT55bTsKLSAgY29uc3QgZG91YmxlIHhteW0gPSBzdGF0cy0+eG0gKiBzdGF0cy0+eW07Ci0gIGNvbnN0IGRvdWJsZSB3MiA9IHN0YXRzLT53ICogc3RhdHMtPnc7Ci0gIGRvdWJsZSBzeHggPSBzdGF0cy0+eHhtICogc3RhdHMtPncgLSB4bXhtOwotICBkb3VibGUgc3l5ID0gc3RhdHMtPnl5bSAqIHN0YXRzLT53IC0geW15bTsKLSAgZG91YmxlIHN4eSA9IHN0YXRzLT54eW0gKiBzdGF0cy0+dyAtIHhteW07Ci0gIGRvdWJsZSBDMSwgQzI7Ci0gIGRvdWJsZSBmbnVtOwotICBkb3VibGUgZmRlbjsKLSAgLy8gc21hbGwgZXJyb3JzIGFyZSBwb3NzaWJsZSwgZHVlIHRvIHJvdW5kaW5nLiBDbGFtcCB0byB6ZXJvLgotICBpZiAoc3h4IDwgMC4pIHN4eCA9IDAuOwotICBpZiAoc3l5IDwgMC4pIHN5eSA9IDAuOwotICBDMSA9IDYuNTAyNSAqIHcyOwotICBDMiA9IDU4LjUyMjUgKiB3MjsKLSAgZm51bSA9ICgyICogeG15bSArIEMxKSAqICgyICogc3h5ICsgQzIpOwotICBmZGVuID0gKHhteG0gKyB5bXltICsgQzEpICogKHN4eCArIHN5eSArIEMyKTsKLSAgcmV0dXJuIChmZGVuICE9IDAuKSA/IGZudW0gLyBmZGVuIDoga01pblZhbHVlOwotfQotCi1kb3VibGUgVlA4U1NJTUdldFNxdWFyZWRFcnJvcihjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzKSB7Ci0gIGlmIChzLT53ID4gMC4pIHsKLSAgICBjb25zdCBkb3VibGUgaXcyID0gMS4gLyAocy0+dyAqIHMtPncpOwotICAgIGNvbnN0IGRvdWJsZSBzeHggPSBzLT54eG0gKiBzLT53IC0gcy0+eG0gKiBzLT54bTsKLSAgICBjb25zdCBkb3VibGUgc3l5ID0gcy0+eXltICogcy0+dyAtIHMtPnltICogcy0+eW07Ci0gICAgY29uc3QgZG91YmxlIHN4eSA9IHMtPnh5bSAqIHMtPncgLSBzLT54bSAqIHMtPnltOwotICAgIGNvbnN0IGRvdWJsZSBTU0UgPSBpdzIgKiAoc3h4ICsgc3l5IC0gMi4gKiBzeHkpOwotICAgIGlmIChTU0UgPiBrTWluVmFsdWUpIHJldHVybiBTU0U7Ci0gIH0KLSAgcmV0dXJuIGtNaW5WYWx1ZTsKLX0KLQotdm9pZCBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXLCBpbnQgSCwgRGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBIOyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgVzsgKyt4KSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZShzcmMxLCBzdHJpZGUxLCBzcmMyLCBzdHJpZGUyLCB4LCB5LCBXLCBILCBzdGF0cyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBkb3VibGUgR2V0TUJTU0lNKGNvbnN0IHVpbnQ4X3QqIHl1djEsIGNvbnN0IHVpbnQ4X3QqIHl1djIpIHsKLSAgaW50IHgsIHk7Ci0gIERpc3RvU3RhdHMgcyA9IHsgLjAsIC4wLCAuMCwgLjAsIC4wLCAuMCB9OwotCi0gIC8vIGNvbXB1dGUgU1NJTSBpbiBhIDEwIHggMTAgd2luZG93Ci0gIGZvciAoeCA9IDM7IHggPCAxMzsgeCsrKSB7Ci0gICAgZm9yICh5ID0gMzsgeSA8IDEzOyB5KyspIHsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHl1djEgKyBZX09GRiwgQlBTLCB5dXYyICsgWV9PRkYsIEJQUywgeCwgeSwgMTYsIDE2LCAmcyk7Ci0gICAgfQotICB9Ci0gIGZvciAoeCA9IDE7IHggPCA3OyB4KyspIHsKLSAgICBmb3IgKHkgPSAxOyB5IDwgNzsgeSsrKSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZSh5dXYxICsgVV9PRkYsIEJQUywgeXV2MiArIFVfT0ZGLCBCUFMsIHgsIHksIDgsIDgsICZzKTsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHl1djEgKyBWX09GRiwgQlBTLCB5dXYyICsgVl9PRkYsIEJQUywgeCwgeSwgOCwgOCwgJnMpOwotICAgIH0KLSAgfQotICByZXR1cm4gVlA4U1NJTUdldCgmcyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHBvc2VkIEFQSXM6IEVuY29kZXIgc2hvdWxkIGNhbGwgdGhlIGZvbGxvd2luZyAzIGZ1bmN0aW9ucyB0byBhZGp1c3QKLS8vIGxvb3AgZmlsdGVyIHN0cmVuZ3RoCi0KLXZvaWQgVlA4SW5pdEZpbHRlcihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IHMsIGk7Ci0gIGlmICghaXQtPmxmX3N0YXRzXykgcmV0dXJuOwotCi0gIEluaXRUYWJsZXMoKTsKLSAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgcysrKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgewotICAgICAgKCppdC0+bGZfc3RhdHNfKVtzXVtpXSA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVlA4U3RvcmVGaWx0ZXJTdGF0cyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IGQ7Ci0gIGNvbnN0IGludCBzID0gaXQtPm1iXy0+c2VnbWVudF87Ci0gIGNvbnN0IGludCBsZXZlbDAgPSBpdC0+ZW5jXy0+ZHFtX1tzXS5mc3RyZW5ndGhfOyAgLy8gVE9ETzogcmVmX2xmX2RlbHRhW10KLQotICAvLyBleHBsb3JlICsvLXF1YW50IHJhbmdlIG9mIHZhbHVlcyBhcm91bmQgbGV2ZWwwCi0gIGNvbnN0IGludCBkZWx0YV9taW4gPSAtaXQtPmVuY18tPmRxbV9bc10ucXVhbnRfOwotICBjb25zdCBpbnQgZGVsdGFfbWF4ID0gaXQtPmVuY18tPmRxbV9bc10ucXVhbnRfOwotICBjb25zdCBpbnQgc3RlcF9zaXplID0gKGRlbHRhX21heCAtIGRlbHRhX21pbiA+PSA0KSA/IDQgOiAxOwotCi0gIGlmICghaXQtPmxmX3N0YXRzXykgcmV0dXJuOwotCi0gIC8vIE5PVEU6IEN1cnJlbnRseSB3ZSBhcmUgYXBwbHlpbmcgZmlsdGVyIG9ubHkgYWNyb3NzIHRoZSBzdWJsb2NrIGVkZ2VzCi0gIC8vIFRoZXJlIGFyZSB0d28gcmVhc29ucyBmb3IgdGhhdC4KLSAgLy8gMS4gQXBwbHlpbmcgZmlsdGVyIG9uIG1hY3JvIGJsb2NrIGVkZ2VzIHdpbGwgY2hhbmdlIHRoZSBwaXhlbHMgaW4KLSAgLy8gdGhlIGxlZnQgYW5kIHRvcCBtYWNybyBibG9ja3MuIFRoYXQgd2lsbCBiZSBoYXJkIHRvIHJlc3RvcmUKLSAgLy8gMi4gTWFjcm8gQmxvY2tzIG9uIHRoZSBib3R0b20gYW5kIHJpZ2h0IGFyZSBub3QgeWV0IGNvbXByZXNzZWQuIFNvIHdlCi0gIC8vIGNhbm5vdCBhcHBseSBmaWx0ZXIgb24gdGhlIHJpZ2h0IGFuZCBib3R0b20gbWFjcm8gYmxvY2sgZWRnZXMuCi0gIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxICYmIGl0LT5tYl8tPnNraXBfKSByZXR1cm47Ci0KLSAgLy8gQWx3YXlzIHRyeSBmaWx0ZXIgbGV2ZWwgIHplcm8KLSAgKCppdC0+bGZfc3RhdHNfKVtzXVswXSArPSBHZXRNQlNTSU0oaXQtPnl1dl9pbl8sIGl0LT55dXZfb3V0Xyk7Ci0KLSAgZm9yIChkID0gZGVsdGFfbWluOyBkIDw9IGRlbHRhX21heDsgZCArPSBzdGVwX3NpemUpIHsKLSAgICBjb25zdCBpbnQgbGV2ZWwgPSBsZXZlbDAgKyBkOwotICAgIGlmIChsZXZlbCA8PSAwIHx8IGxldmVsID49IE1BWF9MRl9MRVZFTFMpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBEb0ZpbHRlcihpdCwgbGV2ZWwpOwotICAgICgqaXQtPmxmX3N0YXRzXylbc11bbGV2ZWxdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXQyXyk7Ci0gIH0KLX0KLQotdm9pZCBWUDhBZGp1c3RGaWx0ZXJTdHJlbmd0aChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IHM7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotCi0gIGlmICghaXQtPmxmX3N0YXRzXykgewotICAgIHJldHVybjsKLSAgfQotICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKLSAgICBpbnQgaSwgYmVzdF9sZXZlbCA9IDA7Ci0gICAgLy8gSW1wcm92ZW1lbnQgb3ZlciBmaWx0ZXIgbGV2ZWwgMCBzaG91bGQgYmUgYXQgbGVhc3QgMWUtNSAocmVsYXRpdmVseSkKLSAgICBkb3VibGUgYmVzdF92ID0gMS4wMDAwMSAqICgqaXQtPmxmX3N0YXRzXylbc11bMF07Ci0gICAgZm9yIChpID0gMTsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgewotICAgICAgY29uc3QgZG91YmxlIHYgPSAoKml0LT5sZl9zdGF0c18pW3NdW2ldOwotICAgICAgaWYgKHYgPiBiZXN0X3YpIHsKLSAgICAgICAgYmVzdF92ID0gdjsKLSAgICAgICAgYmVzdF9sZXZlbCA9IGk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfID0gYmVzdF9sZXZlbDsKLSAgfQotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9mcmFtZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZyYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmQxNGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgZnJhbWUgY29kaW5nIGFuZCBhbmFseXNpcwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmguIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLSNpbmNsdWRlICIuL2Nvc3QuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgU0VHTUVOVF9WSVNVIDAKLSNkZWZpbmUgREVCVUdfU0VBUkNIIDAgICAgLy8gdXNlZnVsIHRvIHRyYWNrIHNlYXJjaCBjb252ZXJnZW5jZQotCi0vLyBPbi10aGUtZmx5IGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgc2V0IG9mIHJlc2lkdWFscy4gSGFuZHkgdG8gYXZvaWQKLS8vIHBhc3NpbmcgemlsbGlvbnMgb2YgcGFyYW1zLgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgZmlyc3Q7Ci0gIGludCBsYXN0OwotICBjb25zdCBpbnQxNl90KiBjb2VmZnM7Ci0KLSAgaW50IGNvZWZmX3R5cGU7Ci0gIFByb2JhQXJyYXkqIHByb2I7Ci0gIFN0YXRzQXJyYXkqIHN0YXRzOwotICBDb3N0QXJyYXkqICBjb3N0OwotfSBWUDhSZXNpZHVhbDsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRhYmxlcyBmb3IgbGV2ZWwgY29kaW5nCi0KLWNvbnN0IHVpbnQ4X3QgVlA4RW5jQmFuZHNbMTYgKyAxXSA9IHsKLSAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKLSAgMCAgLy8gc2VudGluZWwKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0M1tdID0geyAxNzMsIDE0OCwgMTQwIH07Ci1jb25zdCB1aW50OF90IFZQOENhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1IH07Ci1jb25zdCB1aW50OF90IFZQOENhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAgfTsKLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0NltdID0KLSAgICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5IH07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSZXNldCB0aGUgc3RhdGlzdGljcyBhYm91dDogbnVtYmVyIG9mIHNraXBzLCB0b2tlbiBwcm9iYSwgbGV2ZWwgY29zdCwuLi4KLQotc3RhdGljIHZvaWQgUmVzZXRTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwotICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKHByb2JhKTsKLSAgcHJvYmEtPm5iX3NraXBfID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNraXAgZGVjaXNpb24gcHJvYmFiaWxpdHkKLQotI2RlZmluZSBTS0lQX1BST0JBX1RIUkVTSE9MRCAyNTAgIC8vIHZhbHVlIGJlbG93IHdoaWNoIHVzaW5nIHNraXBfcHJvYmEgaXMgT0suCi0KLXN0YXRpYyBpbnQgQ2FsY1NraXBQcm9iYSh1aW50NjRfdCBuYiwgdWludDY0X3QgdG90YWwpIHsKLSAgcmV0dXJuIChpbnQpKHRvdGFsID8gKHRvdGFsIC0gbmIpICogMjU1IC8gdG90YWwgOiAyNTUpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBza2lwIHByb2JhYmlsaXR5Lgotc3RhdGljIGludCBGaW5hbGl6ZVNraXBQcm9iYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwotICBjb25zdCBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gIGNvbnN0IGludCBuYl9ldmVudHMgPSBwcm9iYS0+bmJfc2tpcF87Ci0gIGludCBzaXplOwotICBwcm9iYS0+c2tpcF9wcm9iYV8gPSBDYWxjU2tpcFByb2JhKG5iX2V2ZW50cywgbmJfbWJzKTsKLSAgcHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9IChwcm9iYS0+c2tpcF9wcm9iYV8gPCBTS0lQX1BST0JBX1RIUkVTSE9MRCk7Ci0gIHNpemUgPSAyNTY7ICAgLy8gJ3VzZV9za2lwX3Byb2JhJyBiaXQKLSAgaWYgKHByb2JhLT51c2Vfc2tpcF9wcm9iYV8pIHsKLSAgICBzaXplICs9ICBuYl9ldmVudHMgKiBWUDhCaXRDb3N0KDEsIHByb2JhLT5za2lwX3Byb2JhXykKLSAgICAgICAgICsgKG5iX21icyAtIG5iX2V2ZW50cykgKiBWUDhCaXRDb3N0KDAsIHByb2JhLT5za2lwX3Byb2JhXyk7Ci0gICAgc2l6ZSArPSA4ICogMjU2OyAgIC8vIGNvc3Qgb2Ygc2lnbmFsaW5nIHRoZSBza2lwX3Byb2JhXyBpdHNlbGYuCi0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSZWNvcmRpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcy4KLQotc3RhdGljIHZvaWQgUmVzZXRUb2tlblN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87Ci0gIFNiTWVtb3J5U2V0KHByb2JhLT5zdGF0c18sIDAsIHNpemVvZihwcm9iYS0+c3RhdHNfKSk7Ci19Ci0KLS8vIFJlY29yZCBwcm9iYSBjb250ZXh0IHVzZWQKLXN0YXRpYyBpbnQgUmVjb3JkKGludCBiaXQsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7Ci0gIHByb2JhX3QgcCA9ICpzdGF0czsKLSAgaWYgKHAgPj0gMHhmZmZmMDAwMHUpIHsgICAgICAgICAgICAgICAvLyBhbiBvdmVyZmxvdyBpcyBpbmJvdW5kLgotICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KLSAgfQotICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KLSAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKLSAgKnN0YXRzID0gcDsKLSAgcmV0dXJuIGJpdDsKLX0KLQotLy8gV2Uga2VlcCB0aGUgdGFibGUgZnJlZSB2YXJpYW50IGFyb3VuZCBmb3IgcmVmZXJlbmNlLCBpbiBjYXNlLgotI2RlZmluZSBVU0VfTEVWRUxfQ09ERV9UQUJMRQotCi0vLyBTaW11bGF0ZSBibG9jayBjb2RpbmcsIGJ1dCBvbmx5IHJlY29yZCBzdGF0aXN0aWNzLgotLy8gTm90ZTogbm8gbmVlZCB0byByZWNvcmQgdGhlIGZpeGVkIHByb2Jhcy4KLXN0YXRpYyBpbnQgUmVjb3JkQ29lZmZzKGludCBjdHgsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKLSAgaW50IG4gPSByZXMtPmZpcnN0OwotICAvLyBzaG91bGQgYmUgc3RhdHNbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQotICBwcm9iYV90KiBzID0gcmVzLT5zdGF0c1tuXVtjdHhdOwotICBpZiAocmVzLT5sYXN0ICA8IDApIHsKLSAgICBSZWNvcmQoMCwgcyArIDApOwotICAgIHJldHVybiAwOwotICB9Ci0gIHdoaWxlIChuIDw9IHJlcy0+bGFzdCkgewotICAgIGludCB2OwotICAgIFJlY29yZCgxLCBzICsgMCk7ICAvLyBvcmRlciBvZiByZWNvcmQgZG9lc24ndCBtYXR0ZXIKLSAgICB3aGlsZSAoKHYgPSByZXMtPmNvZWZmc1tuKytdKSA9PSAwKSB7Ci0gICAgICBSZWNvcmQoMCwgcyArIDEpOwotICAgICAgcyA9IHJlcy0+c3RhdHNbVlA4RW5jQmFuZHNbbl1dWzBdOwotICAgIH0KLSAgICBSZWNvcmQoMSwgcyArIDEpOwotICAgIGlmICghUmVjb3JkKDJ1IDwgKHVuc2lnbmVkIGludCkodiArIDEpLCBzICsgMikpIHsgIC8vIHYgPSAtMSBvciAxCi0gICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHYgPSBhYnModik7Ci0jaWYgIWRlZmluZWQoVVNFX0xFVkVMX0NPREVfVEFCTEUpCi0gICAgICBpZiAoIVJlY29yZCh2ID4gNCwgcyArIDMpKSB7Ci0gICAgICAgIGlmIChSZWNvcmQodiAhPSAyLCBzICsgNCkpCi0gICAgICAgICAgUmVjb3JkKHYgPT0gNCwgcyArIDUpOwotICAgICAgfSBlbHNlIGlmICghUmVjb3JkKHYgPiAxMCwgcyArIDYpKSB7Ci0gICAgICAgIFJlY29yZCh2ID4gNiwgcyArIDcpOwotICAgICAgfSBlbHNlIGlmICghUmVjb3JkKCh2ID49IDMgKyAoOCA8PCAyKSksIHMgKyA4KSkgewotICAgICAgICBSZWNvcmQoKHYgPj0gMyArICg4IDw8IDEpKSwgcyArIDkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUmVjb3JkKCh2ID49IDMgKyAoOCA8PCAzKSksIHMgKyAxMCk7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgaWYgKHYgPiBNQVhfVkFSSUFCTEVfTEVWRUwpCi0gICAgICAgIHYgPSBNQVhfVkFSSUFCTEVfTEVWRUw7Ci0KLSAgICAgIHsKLSAgICAgICAgY29uc3QgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW3YgLSAxXVsxXTsKLSAgICAgICAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW3YgLSAxXVswXTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IChwYXR0ZXJuID4+PSAxKSAhPSAwOyArK2kpIHsKLSAgICAgICAgICBjb25zdCBpbnQgbWFzayA9IDIgPDwgaTsKLSAgICAgICAgICBpZiAocGF0dGVybiAmIDEpIFJlY29yZCghIShiaXRzICYgbWFzayksIHMgKyAzICsgaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgICAgcyA9IHJlcy0+c3RhdHNbVlA4RW5jQmFuZHNbbl1dWzJdOwotICAgIH0KLSAgfQotICBpZiAobiA8IDE2KSBSZWNvcmQoMCwgcyArIDApOwotICByZXR1cm4gMTsKLX0KLQotLy8gQ29sbGVjdCBzdGF0aXN0aWNzIGFuZCBkZWR1Y2UgcHJvYmFiaWxpdGllcyBmb3IgbmV4dCBjb2RpbmcgcGFzcy4KLS8vIFJldHVybiB0aGUgdG90YWwgYml0LWNvc3QgZm9yIGNvZGluZyB0aGUgcHJvYmFiaWxpdHkgdXBkYXRlcy4KLXN0YXRpYyBpbnQgQ2FsY1Rva2VuUHJvYmEoaW50IG5iLCBpbnQgdG90YWwpIHsKLSAgU0JfRENIRUNLKG5iIDw9IHRvdGFsKTsKLSAgcmV0dXJuIG5iID8gKDI1NSAtIG5iICogMjU1IC8gdG90YWwpIDogMjU1OwotfQotCi0vLyBDb3N0IG9mIGNvZGluZyAnbmInIDEncyBhbmQgJ3RvdGFsLW5iJyAwJ3MgdXNpbmcgJ3Byb2JhJyBwcm9iYWJpbGl0eS4KLXN0YXRpYyBpbnQgQnJhbmNoQ29zdChpbnQgbmIsIGludCB0b3RhbCwgaW50IHByb2JhKSB7Ci0gIHJldHVybiBuYiAqIFZQOEJpdENvc3QoMSwgcHJvYmEpICsgKHRvdGFsIC0gbmIpICogVlA4Qml0Q29zdCgwLCBwcm9iYSk7Ci19Ci0KLXN0YXRpYyBpbnQgRmluYWxpemVUb2tlblByb2JhcyhWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgaW50IGhhc19jaGFuZ2VkID0gMDsKLSAgaW50IHNpemUgPSAwOwotICBpbnQgdCwgYiwgYywgcDsKLSAgZm9yICh0ID0gMDsgdCA8IE5VTV9UWVBFUzsgKyt0KSB7Ci0gICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7Ci0gICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7Ci0gICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKLSAgICAgICAgICBjb25zdCBwcm9iYV90IHN0YXRzID0gcHJvYmEtPnN0YXRzX1t0XVtiXVtjXVtwXTsKLSAgICAgICAgICBjb25zdCBpbnQgbmIgPSAoc3RhdHMgPj4gMCkgJiAweGZmZmY7Ci0gICAgICAgICAgY29uc3QgaW50IHRvdGFsID0gKHN0YXRzID4+IDE2KSAmIDB4ZmZmZjsKLSAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlX3Byb2JhID0gVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF07Ci0gICAgICAgICAgY29uc3QgaW50IG9sZF9wID0gVlA4Q29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOwotICAgICAgICAgIGNvbnN0IGludCBuZXdfcCA9IENhbGNUb2tlblByb2JhKG5iLCB0b3RhbCk7Ci0gICAgICAgICAgY29uc3QgaW50IG9sZF9jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG9sZF9wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMCwgdXBkYXRlX3Byb2JhKTsKLSAgICAgICAgICBjb25zdCBpbnQgbmV3X2Nvc3QgPSBCcmFuY2hDb3N0KG5iLCB0b3RhbCwgbmV3X3ApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Qml0Q29zdCgxLCB1cGRhdGVfcHJvYmEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgOCAqIDI1NjsKLSAgICAgICAgICBjb25zdCBpbnQgdXNlX25ld19wID0gKG9sZF9jb3N0ID4gbmV3X2Nvc3QpOwotICAgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdCh1c2VfbmV3X3AsIHVwZGF0ZV9wcm9iYSk7Ci0gICAgICAgICAgaWYgKHVzZV9uZXdfcCkgeyAgLy8gb25seSB1c2UgcHJvYmEgdGhhdCBzZWVtIG1lYW5pbmdmdWwgZW5vdWdoLgotICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBuZXdfcDsKLSAgICAgICAgICAgIGhhc19jaGFuZ2VkIHw9IChuZXdfcCAhPSBvbGRfcCk7Ci0gICAgICAgICAgICBzaXplICs9IDggKiAyNTY7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gb2xkX3A7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByb2JhLT5kaXJ0eV8gPSBoYXNfY2hhbmdlZDsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbGl6ZSBTZWdtZW50IHByb2JhYmlsaXR5IGJhc2VkIG9uIHRoZSBjb2RpbmcgdHJlZQotCi1zdGF0aWMgaW50IEdldFByb2JhKGludCBhLCBpbnQgYikgewotICBjb25zdCBpbnQgdG90YWwgPSBhICsgYjsKLSAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDI1NSAgICAgLy8gdGhhdCdzIHRoZSBkZWZhdWx0IHByb2JhYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICAgIDogKDI1NSAqIGEgKyB0b3RhbCAvIDIpIC8gdG90YWw7ICAvLyByb3VuZGVkIHByb2JhCi19Ci0KLXN0YXRpYyB2b2lkIFNldFNlZ21lbnRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGludCBwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAgfTsKLSAgaW50IG47Ci0KLSAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKLSAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19bbl07Ci0gICAgcFttYi0+c2VnbWVudF9dKys7Ci0gIH0KLSAgaWYgKGVuYy0+cGljXy0+c3RhdHMgIT0gTlVMTCkgewotICAgIGZvciAobiA9IDA7IG4gPCBOVU1fTUJfU0VHTUVOVFM7ICsrbikgewotICAgICAgZW5jLT5waWNfLT5zdGF0cy0+c2VnbWVudF9zaXplW25dID0gcFtuXTsKLSAgICB9Ci0gIH0KLSAgaWYgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB7Ci0gICAgdWludDhfdCogY29uc3QgcHJvYmFzID0gZW5jLT5wcm9iYV8uc2VnbWVudHNfOwotICAgIHByb2Jhc1swXSA9IEdldFByb2JhKHBbMF0gKyBwWzFdLCBwWzJdICsgcFszXSk7Ci0gICAgcHJvYmFzWzFdID0gR2V0UHJvYmEocFswXSwgcFsxXSk7Ci0gICAgcHJvYmFzWzJdID0gR2V0UHJvYmEocFsyXSwgcFszXSk7Ci0KLSAgICBlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXyA9Ci0gICAgICAgIChwcm9iYXNbMF0gIT0gMjU1KSB8fCAocHJvYmFzWzFdICE9IDI1NSkgfHwgKHByb2Jhc1syXSAhPSAyNTUpOwotICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0KLSAgICAgICAgcFswXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1sxXSkpICsKLSAgICAgICAgcFsxXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1sxXSkpICsKLSAgICAgICAgcFsyXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1syXSkpICsKLSAgICAgICAgcFszXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1syXSkpOwotICB9IGVsc2UgewotICAgIGVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfID0gMDsKLSAgICBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXyA9IDA7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlc2lkdWFscyBzdHJ1Y3QgVlA4UmVzaWR1YWwuCi0KLXN0YXRpYyB2b2lkIEluaXRSZXNpZHVhbChpbnQgZmlyc3QsIGludCBjb2VmZl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICByZXMtPmNvZWZmX3R5cGUgPSBjb2VmZl90eXBlOwotICByZXMtPnByb2IgID0gZW5jLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKLSAgcmVzLT5zdGF0cyA9IGVuYy0+cHJvYmFfLnN0YXRzX1tjb2VmZl90eXBlXTsKLSAgcmVzLT5jb3N0ICA9IGVuYy0+cHJvYmFfLmxldmVsX2Nvc3RfW2NvZWZmX3R5cGVdOwotICByZXMtPmZpcnN0ID0gZmlyc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldFJlc2lkdWFsQ29lZmZzKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKLSAgaW50IG47Ci0gIHJlcy0+bGFzdCA9IC0xOwotICBmb3IgKG4gPSAxNTsgbiA+PSByZXMtPmZpcnN0OyAtLW4pIHsKLSAgICBpZiAoY29lZmZzW25dKSB7Ci0gICAgICByZXMtPmxhc3QgPSBuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJlcy0+Y29lZmZzID0gY29lZmZzOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTW9kZSBjb3N0cwotCi1zdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdChpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICBpbnQgbiA9IHJlcy0+Zmlyc3Q7Ci0gIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKLSAgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOwotICBjb25zdCB1aW50MTZfdCogdCA9IHJlcy0+Y29zdFtuXVtjdHgwXTsKLSAgaW50IGNvc3Q7Ci0KLSAgaWYgKHJlcy0+bGFzdCA8IDApIHsKLSAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7Ci0gIH0KLSAgY29zdCA9IDA7Ci0gIHdoaWxlIChuIDwgcmVzLT5sYXN0KSB7Ci0gICAgaW50IHYgPSByZXMtPmNvZWZmc1tuXTsKLSAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKLSAgICArK247Ci0gICAgaWYgKHYgPT0gMCkgewotICAgICAgLy8gc2hvcnQtY2FzZSBmb3IgVlA4TGV2ZWxDb3N0KHQsIDApIChub3RlOiBWUDhMZXZlbEZpeGVkQ29zdHNbMF0gPT0gMCk6Ci0gICAgICBjb3N0ICs9IHRbMF07Ci0gICAgICB0ID0gcmVzLT5jb3N0W2JdWzBdOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHYgPSBhYnModik7Ci0gICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIHAwKTsKLSAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKLSAgICB7Ci0gICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKLSAgICAgIHAwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07Ci0gICAgICB0ID0gcmVzLT5jb3N0W2JdW2N0eF07Ci0gICAgfQotICB9Ci0gIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCi0gIHsKLSAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7Ci0gICAgU0JfRENIRUNLKHYgIT0gMCk7Ci0gICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIHAwKTsKLSAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKLSAgICBpZiAobiA8IDE1KSB7Ci0gICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKLSAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOwotICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKLSAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLWludCBWUDhHZXRDb3N0THVtYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBpbnQxNl90IGxldmVsc1sxNl0pIHsKLSAgY29uc3QgaW50IHggPSAoaXQtPmk0XyAmIDMpLCB5ID0gKGl0LT5pNF8gPj4gMik7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGludCBSID0gMDsKLSAgaW50IGN0eDsKLQotICBJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKLSAgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gIFNldFJlc2lkdWFsQ29lZmZzKGxldmVscywgJnJlcyk7Ci0gIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7Ci0gIHJldHVybiBSOwotfQotCi1pbnQgVlA4R2V0Q29zdEx1bWExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaW50IHgsIHk7Ci0gIGludCBSID0gMDsKLQotICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAgLy8gcmUtaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0Ci0KLSAgLy8gREMKLSAgSW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7Ci0gIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKLQotICAvLyBBQwotICBJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKLSAgICAgIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7Ci0gICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IChyZXMubGFzdCA+PSAwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFI7Ci19Ci0KLWludCBWUDhHZXRDb3N0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGludCBjaCwgeCwgeTsKLSAgaW50IFIgPSAwOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgIC8vIHJlLWltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAotCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBSICs9IEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IChyZXMubGFzdCA+PSAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFI7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb2VmZmljaWVudCBjb2RpbmcKLQotc3RhdGljIGludCBQdXRDb2VmZnMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIHJlcykgewotICBpbnQgbiA9IHJlcy0+Zmlyc3Q7Ci0gIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKLSAgY29uc3QgdWludDhfdCogcCA9IHJlcy0+cHJvYltuXVtjdHhdOwotICBpZiAoIVZQOFB1dEJpdChidywgcmVzLT5sYXN0ID49IDAsIHBbMF0pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aGlsZSAobiA8IDE2KSB7Ci0gICAgY29uc3QgaW50IGMgPSByZXMtPmNvZWZmc1tuKytdOwotICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7Ci0gICAgaW50IHYgPSBzaWduID8gLWMgOiBjOwotICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ICE9IDAsIHBbMV0pKSB7Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVswXTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDEsIHBbMl0pKSB7Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVsxXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiA0LCBwWzNdKSkgewotICAgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCB2ICE9IDIsIHBbNF0pKQotICAgICAgICAgIFZQOFB1dEJpdChidywgdiA9PSA0LCBwWzVdKTsKLSAgICAgIH0gZWxzZSBpZiAoIVZQOFB1dEJpdChidywgdiA+IDEwLCBwWzZdKSkgewotICAgICAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDYsIHBbN10pKSB7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID09IDYsIDE1OSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID49IDksIDE2NSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAhKHYgJiAxKSwgMTQ1KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG1hc2s7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKLSAgICAgICAgaWYgKHYgPCAzICsgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQotICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzldKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAwKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCAyOwotICAgICAgICAgIHRhYiA9IFZQOENhdDM7Ci0gICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAyKSkgeyAgIC8vIFZQOENhdDQgICg0YikKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOF0pOwotICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs5XSk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMSk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMzsKLSAgICAgICAgICB0YWIgPSBWUDhDYXQ0OwotICAgICAgICB9IGVsc2UgaWYgKHYgPCAzICsgKDggPDwgMykpIHsgICAvLyBWUDhDYXQ1ICAoNWIpCi0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzhdKTsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbMTBdKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAyKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCA0OwotICAgICAgICAgIHRhYiA9IFZQOENhdDU7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOENhdDYgKDExYikKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOwotICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFsxMF0pOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDMpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDEwOwotICAgICAgICAgIHRhYiA9IFZQOENhdDY7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG1hc2spIHsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsICEhKHYgJiBtYXNrKSwgKnRhYisrKTsKLSAgICAgICAgICBtYXNrID4+PSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVsyXTsKLSAgICB9Ci0gICAgVlA4UHV0Qml0VW5pZm9ybShidywgc2lnbik7Ci0gICAgaWYgKG4gPT0gMTYgfHwgIVZQOFB1dEJpdChidywgbiA8PSByZXMtPmxhc3QsIHBbMF0pKSB7Ci0gICAgICByZXR1cm4gMTsgICAvLyBFT0IKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIENvZGVSZXNpZHVhbHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGludCB4LCB5LCBjaDsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICB1aW50NjRfdCBwb3MxLCBwb3MyLCBwb3MzOwotICBjb25zdCBpbnQgaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOwotICBjb25zdCBpbnQgc2VnbWVudCA9IGl0LT5tYl8tPnNlZ21lbnRfOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLQotICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7Ci0KLSAgcG9zMSA9IFZQOEJpdFdyaXRlclBvcyhidyk7Ci0gIGlmIChpMTYpIHsKLSAgICBJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKLSAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOwotICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KLSAgICAgIFB1dENvZWZmcyhidywgaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOwotICAgIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICB9IGVsc2UgewotICAgIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICB9Ci0KLSAgLy8gbHVtYS1BQwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7Ci0gICAgfQotICB9Ci0gIHBvczIgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwotCi0gIC8vIFUvVgotICBJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKLSAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKLSAgICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKLSAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQotICAgICAgICAgICAgUHV0Q29lZmZzKGJ3LCBjdHgsICZyZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICBwb3MzID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgaXQtPmx1bWFfYml0c18gPSBwb3MyIC0gcG9zMTsKLSAgaXQtPnV2X2JpdHNfID0gcG9zMyAtIHBvczI7Ci0gIGl0LT5iaXRfY291bnRfW3NlZ21lbnRdW2kxNl0gKz0gaXQtPmx1bWFfYml0c187Ci0gIGl0LT5iaXRfY291bnRfW3NlZ21lbnRdWzJdICs9IGl0LT51dl9iaXRzXzsKLSAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOwotfQotCi0vLyBTYW1lIGFzIENvZGVSZXNpZHVhbHMsIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHdyaXRlIGFueXRoaW5nLgotLy8gSW5zdGVhZCwgaXQganVzdCByZWNvcmRzIHRoZSBldmVudCBkaXN0cmlidXRpb24uCi1zdGF0aWMgdm9pZCBSZWNvcmRSZXNpZHVhbHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgaW50IHgsIHksIGNoOwotICBWUDhSZXNpZHVhbCByZXM7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKLQotICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgotICAgIEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOwotICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQotICAgICAgUmVjb3JkQ29lZmZzKGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKLSAgICBJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKLSAgfSBlbHNlIHsKLSAgICBJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKLSAgfQotCi0gIC8vIGx1bWEtQUMKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKLSAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVS9WCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9Ci0gICAgICAgICAgICBSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUb2tlbiBidWZmZXIKLQotI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQotCi1zdGF0aWMgdm9pZCBSZWNvcmRUb2tlbnMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgewotICBpbnQgeCwgeSwgY2g7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0KLSAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOwotICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgotICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XTsKLSAgICBJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKLSAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOwotICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KLSAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZmlyc3QsIHJlcy5sYXN0LCByZXMuY29lZmZzLCB0b2tlbnMpOwotICAgIFJlY29yZENvZWZmcyhjdHgsICZyZXMpOwotICAgIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICB9IGVsc2UgewotICAgIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICB9Ci0KLSAgLy8gbHVtYS1BQwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPQotICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgcmVzLmNvZWZmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKLSAgICAgIFJlY29yZENvZWZmcyhjdHgsICZyZXMpOwotICAgIH0KLSAgfQotCi0gIC8vIFUvVgotICBJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKLSAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKLSAgICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKLSAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQotICAgICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKLSAgICAgICAgUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKLX0KLQotI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXh0cmFJbmZvIG1hcCAvIERlYnVnIGZ1bmN0aW9uCi0KLSNpZiBTRUdNRU5UX1ZJU1UKLXN0YXRpYyB2b2lkIFNldEJsb2NrKHVpbnQ4X3QqIHAsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBTYk1lbW9yeVNldChwLCB2YWx1ZSwgc2l6ZSk7Ci0gICAgcCArPSBCUFM7Ci0gIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgZW5jLT5zc2VfWzBdID0gMDsKLSAgZW5jLT5zc2VfWzFdID0gMDsKLSAgZW5jLT5zc2VfWzJdID0gMDsKLSAgLy8gTm90ZTogZW5jLT5zc2VfWzNdIGlzIG1hbmFnZWQgYnkgYWxwaGEuYwotICBlbmMtPnNzZV9jb3VudF8gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBTdG9yZVNTRShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gaXQtPnl1dl9pbl87Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG91dCA9IGl0LT55dXZfb3V0XzsKLSAgLy8gTm90ZTogbm90IHRvdGFsbHkgYWNjdXJhdGUgYXQgYm91bmRhcnkuIEFuZCBkb2Vzbid0IGluY2x1ZGUgaW4tbG9vcCBmaWx0ZXIuCi0gIGVuYy0+c3NlX1swXSArPSBWUDhTU0UxNngxNihpbiArIFlfT0ZGLCBvdXQgKyBZX09GRik7Ci0gIGVuYy0+c3NlX1sxXSArPSBWUDhTU0U4eDgoaW4gKyBVX09GRiwgb3V0ICsgVV9PRkYpOwotICBlbmMtPnNzZV9bMl0gKz0gVlA4U1NFOHg4KGluICsgVl9PRkYsIG91dCArIFZfT0ZGKTsKLSAgZW5jLT5zc2VfY291bnRfICs9IDE2ICogMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlU2lkZUluZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQtPm1iXzsKLSAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLQotICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgU3RvcmVTU0UoaXQpOwotICAgIGVuYy0+YmxvY2tfY291bnRfWzBdICs9IChtYi0+dHlwZV8gPT0gMCk7Ci0gICAgZW5jLT5ibG9ja19jb3VudF9bMV0gKz0gKG1iLT50eXBlXyA9PSAxKTsKLSAgICBlbmMtPmJsb2NrX2NvdW50X1syXSArPSAobWItPnNraXBfICE9IDApOwotICB9Ci0KLSAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgdWludDhfdCogY29uc3QgaW5mbyA9ICZwaWMtPmV4dHJhX2luZm9baXQtPnhfICsgaXQtPnlfICogZW5jLT5tYl93X107Ci0gICAgc3dpdGNoIChwaWMtPmV4dHJhX2luZm9fdHlwZSkgewotICAgICAgY2FzZSAxOiAqaW5mbyA9IG1iLT50eXBlXzsgYnJlYWs7Ci0gICAgICBjYXNlIDI6ICppbmZvID0gbWItPnNlZ21lbnRfOyBicmVhazsKLSAgICAgIGNhc2UgMzogKmluZm8gPSBlbmMtPmRxbV9bbWItPnNlZ21lbnRfXS5xdWFudF87IGJyZWFrOwotICAgICAgY2FzZSA0OiAqaW5mbyA9IChtYi0+dHlwZV8gPT0gMSkgPyBpdC0+cHJlZHNfWzBdIDogMHhmZjsgYnJlYWs7Ci0gICAgICBjYXNlIDU6ICppbmZvID0gbWItPnV2X21vZGVfOyBicmVhazsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBjb25zdCBpbnQgYiA9IChpbnQpKChpdC0+bHVtYV9iaXRzXyArIGl0LT51dl9iaXRzXyArIDcpID4+IDMpOwotICAgICAgICAqaW5mbyA9IChiID4gMjU1KSA/IDI1NSA6IGI7IGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA3OiAqaW5mbyA9IG1iLT5hbHBoYV87IGJyZWFrOwotICAgICAgZGVmYXVsdDogKmluZm8gPSAwOyBicmVhazsKLSAgICB9OwotICB9Ci0jaWYgU0VHTUVOVF9WSVNVICAvLyB2aXN1YWxpemUgc2VnbWVudHMgYW5kIHByZWRpY3Rpb24gbW9kZXMKLSAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgWV9PRkYsIG1iLT5zZWdtZW50XyAqIDY0LCAxNik7Ci0gIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFVfT0ZGLCBpdC0+cHJlZHNfWzBdICogNjQsIDgpOwotICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBWX09GRiwgbWItPnV2X21vZGVfICogNjQsIDgpOwotI2VuZGlmCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgU3RhdExvb3AoKTogb25seSBjb2xsZWN0IHN0YXRpc3RpY3MgKG51bWJlciBvZiBza2lwcywgdG9rZW4gdXNhZ2UsIC4uLikuCi0vLyAgVGhpcyBpcyB1c2VkIGZvciBkZWNpZGluZyBvcHRpbWFsIHByb2JhYmlsaXRpZXMuIEl0IGFsc28gbW9kaWZpZXMgdGhlCi0vLyAgcXVhbnRpemVyIHZhbHVlIGlmIHNvbWUgdGFyZ2V0IChzaXplLCBQTlNSKSB3YXMgc3BlY2lmaWVkLgotCi0jZGVmaW5lIGtIZWFkZXJTaXplRXN0aW1hdGUgKDE1ICsgMjAgKyAxMCkgICAgICAvLyBUT0RPOiBmaXggYmV0dGVyCi0KLXN0YXRpYyB2b2lkIFNldExvb3BQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxKSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgcXVhbGl0eSBwYXJhbWV0ZXIgaXMgaW5zaWRlIHZhbGlkIGJvdW5kcwotICBpZiAocSA8IDAuKSB7Ci0gICAgcSA9IDA7Ci0gIH0gZWxzZSBpZiAocSA+IDEwMC4pIHsKLSAgICBxID0gMTAwOwotICB9Ci0KLSAgVlA4U2V0U2VnbWVudFBhcmFtcyhlbmMsIHEpOyAgICAgIC8vIHNldHVwIHNlZ21lbnQgcXVhbnRpemF0aW9ucyBhbmQgZmlsdGVycwotICBTZXRTZWdtZW50UHJvYmFzKGVuYyk7ICAgICAgICAgICAgLy8gY29tcHV0ZSBzZWdtZW50IHByb2JhYmlsaXRpZXMKLQotICBSZXNldFN0YXRzKGVuYyk7Ci0gIFJlc2V0VG9rZW5TdGF0cyhlbmMpOwotCi0gIFJlc2V0U1NFKGVuYyk7Ci19Ci0KLXN0YXRpYyBpbnQgT25lU3RhdFBhc3MoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxLCBWUDhSRExldmVsIHJkX29wdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX21icywgZmxvYXQqIGNvbnN0IFBTTlIsIGludCBwZXJjZW50X2RlbHRhKSB7Ci0gIFZQOEVuY0l0ZXJhdG9yIGl0OwotICB1aW50NjRfdCBzaXplID0gMDsKLSAgdWludDY0X3QgZGlzdG9ydGlvbiA9IDA7Ci0gIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gbmJfbWJzICogMzg0OwotCi0gIFNldExvb3BQYXJhbXMoZW5jLCBxKTsKLQotICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIGluZm87Ci0gICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICBpZiAoVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSkgewotICAgICAgLy8gSnVzdCByZWNvcmQgdGhlIG51bWJlciBvZiBza2lwcyBhbmQgYWN0IGxpa2Ugc2tpcF9wcm9iYSBpcyBub3QgdXNlZC4KLSAgICAgIGVuYy0+cHJvYmFfLm5iX3NraXBfKys7Ci0gICAgfQotICAgIFJlY29yZFJlc2lkdWFscygmaXQsICZpbmZvKTsKLSAgICBzaXplICs9IGluZm8uUjsKLSAgICBkaXN0b3J0aW9uICs9IGluZm8uRDsKLSAgICBpZiAocGVyY2VudF9kZWx0YSAmJiAhVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIHBlcmNlbnRfZGVsdGEpKQotICAgICAgcmV0dXJuIDA7Ci0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQsIGl0Lnl1dl9vdXRfKSAmJiAtLW5iX21icyA+IDApOwotICBzaXplICs9IEZpbmFsaXplU2tpcFByb2JhKGVuYyk7Ci0gIHNpemUgKz0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOwotICBzaXplICs9IGVuYy0+c2VnbWVudF9oZHJfLnNpemVfOwotICBzaXplID0gKChzaXplICsgMTAyNCkgPj4gMTEpICsga0hlYWRlclNpemVFc3RpbWF0ZTsKLQotICBpZiAoUFNOUikgewotICAgICpQU05SID0gKGZsb2F0KSgxMC4qIGxvZzEwKDI1NS4gKiAyNTUuICogcGl4ZWxfY291bnQgLyBkaXN0b3J0aW9uKSk7Ci0gIH0KLSAgcmV0dXJuIChpbnQpc2l6ZTsKLX0KLQotLy8gc3VjY2Vzc2l2ZSByZWZpbmVtZW50IGluY3JlbWVudHMuCi1zdGF0aWMgY29uc3QgaW50IGRxc1tdID0geyAyMCwgMTUsIDEwLCA4LCA2LCA0LCAyLCAxLCAwIH07Ci0KLXN0YXRpYyBpbnQgU3RhdExvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGNvbnN0IGludCBtZXRob2QgPSBlbmMtPm1ldGhvZF87Ci0gIGNvbnN0IGludCBkb19zZWFyY2ggPSBlbmMtPmRvX3NlYXJjaF87Ci0gIGNvbnN0IGludCBmYXN0X3Byb2JlID0gKChtZXRob2QgPT0gMCB8fCBtZXRob2QgPT0gMykgJiYgIWRvX3NlYXJjaCk7Ci0gIGZsb2F0IHEgPSBlbmMtPmNvbmZpZ18tPnF1YWxpdHk7Ci0gIGNvbnN0IGludCBtYXhfcGFzc2VzID0gZW5jLT5jb25maWdfLT5wYXNzOwotICBjb25zdCBpbnQgdGFza19wZXJjZW50ID0gMjA7Ci0gIGNvbnN0IGludCBwZXJjZW50X3Blcl9wYXNzID0gKHRhc2tfcGVyY2VudCArIG1heF9wYXNzZXMgLyAyKSAvIG1heF9wYXNzZXM7Ci0gIGNvbnN0IGludCBmaW5hbF9wZXJjZW50ID0gZW5jLT5wZXJjZW50XyArIHRhc2tfcGVyY2VudDsKLSAgaW50IHBhc3M7Ci0gIGludCBuYl9tYnM7Ci0KLSAgLy8gRmFzdCBtb2RlOiBxdWljayBhbmFseXNpcyBwYXNzIG92ZXIgZmV3IG1icy4gQmV0dGVyIHRoYW4gbm90aGluZy4KLSAgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gIGlmIChmYXN0X3Byb2JlKSB7Ci0gICAgaWYgKG1ldGhvZCA9PSAzKSB7ICAvLyB3ZSBuZWVkIG1vcmUgc3RhdHMgZm9yIG1ldGhvZCAzIHRvIGJlIHJlbGlhYmxlLgotICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMSA6IDEwMDsKLSAgICB9IGVsc2UgewotICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMiA6IDUwOwotICAgIH0KLSAgfQotCi0gIC8vIE5vIHRhcmdldCBzaXplOiBqdXN0IGRvIHNldmVyYWwgcGFzcyB3aXRob3V0IGNoYW5naW5nICdxJwotICBpZiAoIWRvX3NlYXJjaCkgewotICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBtYXhfcGFzc2VzOyArK3Bhc3MpIHsKLSAgICAgIGNvbnN0IFZQOFJETGV2ZWwgcmRfb3B0ID0gKG1ldGhvZCA+PSAzKSA/IFJEX09QVF9CQVNJQyA6IFJEX09QVF9OT05FOwotICAgICAgaWYgKCFPbmVTdGF0UGFzcyhlbmMsIHEsIHJkX29wdCwgbmJfbWJzLCBOVUxMLCBwZXJjZW50X3Blcl9wYXNzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgYSBzaXplIGNsb3NlIHRvIHRhcmdldAotICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBtYXhfcGFzc2VzICYmIChkcXNbcGFzc10gPiAwKTsgKytwYXNzKSB7Ci0gICAgICBmbG9hdCBQU05SOwotICAgICAgaW50IGNyaXRlcmlvbjsKLSAgICAgIGNvbnN0IGludCBzaXplID0gT25lU3RhdFBhc3MoZW5jLCBxLCBSRF9PUFRfQkFTSUMsIG5iX21icywgJlBTTlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfcGVyX3Bhc3MpOwotI2lmIERFQlVHX1NFQVJDSAotICAgICAgcHJpbnRmKCIjJWQgc2l6ZT0lZCBQU05SPSUuMmYgcT0lLjJmXG4iLCBwYXNzLCBzaXplLCBQU05SLCBxKTsKLSNlbmRpZgotICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICBpZiAoZW5jLT5jb25maWdfLT50YXJnZXRfUFNOUiA+IDApIHsKLSAgICAgICAgY3JpdGVyaW9uID0gKFBTTlIgPCBlbmMtPmNvbmZpZ18tPnRhcmdldF9QU05SKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNyaXRlcmlvbiA9IChzaXplIDwgZW5jLT5jb25maWdfLT50YXJnZXRfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICAvLyBkaWNob3RvbWl6ZQotICAgICAgaWYgKGNyaXRlcmlvbikgewotICAgICAgICBxICs9IGRxc1twYXNzXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHEgLT0gZHFzW3Bhc3NdOwotICAgICAgfQotICAgIH0KLSAgfQotICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCZlbmMtPnByb2JhXyk7ICAvLyBmaW5hbGl6ZSBjb3N0cwotICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZmluYWxfcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBsb29wcwotLy8KLQotc3RhdGljIGNvbnN0IGludCBrQXZlcmFnZUJ5dGVzUGVyTUJbOF0gPSB7IDUwLCAyNCwgMTYsIDksIDcsIDUsIDMsIDIgfTsKLQotc3RhdGljIGludCBQcmVMb29wSW5pdGlhbGl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IHA7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IGludCBhdmVyYWdlX2J5dGVzX3Blcl9NQiA9IGtBdmVyYWdlQnl0ZXNQZXJNQltlbmMtPmJhc2VfcXVhbnRfID4+IDRdOwotICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BhcnRzID0KLSAgICAgIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfICogYXZlcmFnZV9ieXRlc19wZXJfTUIgLyBlbmMtPm51bV9wYXJ0c187Ci0gIC8vIEluaXRpYWxpemUgdGhlIGJpdC13cml0ZXJzCi0gIGZvciAocCA9IDA7IG9rICYmIHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgewotICAgIG9rID0gVlA4Qml0V3JpdGVySW5pdChlbmMtPnBhcnRzXyArIHAsIGJ5dGVzX3Blcl9wYXJ0cyk7Ci0gIH0KLSAgaWYgKCFvaykgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsgIC8vIG1hbGxvYyBlcnJvciBvY2N1cnJlZAotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgUG9zdExvb3BGaW5hbGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBvaykgewotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaWYgKG9rKSB7ICAgICAgLy8gRmluYWxpemUgdGhlIHBhcnRpdGlvbnMsIGNoZWNrIGZvciBleHRyYSBlcnJvcnMuCi0gICAgaW50IHA7Ci0gICAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7Ci0gICAgICBWUDhCaXRXcml0ZXJGaW5pc2goZW5jLT5wYXJ0c18gKyBwKTsKLSAgICAgIG9rICY9ICFlbmMtPnBhcnRzX1twXS5lcnJvcl87Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9rKSB7ICAgICAgLy8gQWxsIGdvb2QuIEZpbmlzaCB1cC4KLSAgICBpZiAoZW5jLT5waWNfLT5zdGF0cykgeyAgICAgICAgICAgLy8gZmluYWxpemUgYnl0ZSBjb3VudGVycy4uLgotICAgICAgaW50IGksIHM7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgewotICAgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKLSAgICAgICAgICBlbmMtPnJlc2lkdWFsX2J5dGVzX1tpXVtzXSA9IChpbnQpKChpdC0+Yml0X2NvdW50X1tzXVtpXSArIDcpID4+IDMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKGl0KTsgICAgIC8vIC4uLmFuZCBzdG9yZSBmaWx0ZXIgc3RhdHMuCi0gIH0gZWxzZSB7Ci0gICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAtPiBuZWVkIHRvIGRvIHNvbWUgbWVtb3J5IGNsZWFudXAuCi0gICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgVlA4RW5jTG9vcCgpOiBkb2VzIHRoZSBmaW5hbCBiaXRzdHJlYW0gY29kaW5nLgotCi1zdGF0aWMgdm9pZCBSZXNldEFmdGVyU2tpcChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEpIHsKLSAgICAqaXQtPm56XyA9IDA7ICAvLyByZXNldCBhbGwgcHJlZGljdG9ycwotICAgIGl0LT5sZWZ0X256X1s4XSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgKml0LT5uel8gJj0gKDEgPDwgMjQpOyAgLy8gcHJlc2VydmUgdGhlIGRjX256IGJpdAotICB9Ci19Ci0KLWludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhFbmNJdGVyYXRvciBpdDsKLSAgaW50IG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKLSAgaWYgKCFvaykgcmV0dXJuIDA7Ci0KLSAgU3RhdExvb3AoZW5jKTsgIC8vIHN0YXRzLWNvbGxlY3Rpb24gbG9vcAotCi0gIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7Ci0gIFZQOEluaXRGaWx0ZXIoJml0KTsKLSAgZG8gewotICAgIFZQOE1vZGVTY29yZSBpbmZvOwotICAgIGNvbnN0IGludCBkb250X3VzZV9za2lwID0gIWVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXzsKLSAgICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKLQotICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCk7Ci0gICAgLy8gV2FybmluZyEgb3JkZXIgaXMgaW1wb3J0YW50OiBmaXJzdCBjYWxsIFZQOERlY2ltYXRlKCkgYW5kCi0gICAgLy8gKnRoZW4qIGRlY2lkZSBob3cgdG8gY29kZSB0aGUgc2tpcCBkZWNpc2lvbiBpZiB0aGVyZSdzIG9uZS4KLSAgICBpZiAoIVZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkgfHwgZG9udF91c2Vfc2tpcCkgewotICAgICAgQ29kZVJlc2lkdWFscyhpdC5id18sICZpdCwgJmluZm8pOwotICAgIH0gZWxzZSB7ICAgLy8gcmVzZXQgcHJlZGljdG9ycyBhZnRlciBhIHNraXAKLSAgICAgIFJlc2V0QWZ0ZXJTa2lwKCZpdCk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgICAgVlA4RW5jQ29kZUxheWVyQmxvY2soJml0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBTdG9yZVNpZGVJbmZvKCZpdCk7Ci0gICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOwotICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7Ci0gICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOwotICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0LCBpdC55dXZfb3V0XykpOwotCi0gIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2luZ2xlIHBhc3MgdXNpbmcgVG9rZW4gQnVmZmVyLgotCi0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0KLSNkZWZpbmUgTUlOX0NPVU5UIDk2ICAgLy8gbWluaW11bSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgYmVmb3JlIHVwZGF0aW5nIHN0YXRzCi0KLWludCBWUDhFbmNUb2tlbkxvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGludCBvazsKLSAgLy8gUm91Z2hseSByZWZyZXNoIHRoZSBwcm9iYSBoZWlnaHQgdGltZXMgcGVyIHBhc3MKLSAgaW50IG1heF9jb3VudCA9IChlbmMtPm1iX3dfICogZW5jLT5tYl9oXykgPj4gMzsKLSAgaW50IGNudDsKLSAgVlA4RW5jSXRlcmF0b3IgaXQ7Ci0gIFZQOFByb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKLSAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSBlbmMtPnJkX29wdF9sZXZlbF87Ci0KLSAgaWYgKG1heF9jb3VudCA8IE1JTl9DT1VOVCkgbWF4X2NvdW50ID0gTUlOX0NPVU5UOwotICBjbnQgPSBtYXhfY291bnQ7Ci0KLSAgU0JfRENIRUNLKGVuYy0+bnVtX3BhcnRzXyA9PSAxKTsKLSAgU0JfRENIRUNLKGVuYy0+dXNlX3Rva2Vuc18pOwotICBTQl9EQ0hFQ0socHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9PSAwKTsKLSAgU0JfRENIRUNLKHJkX29wdCA+PSBSRF9PUFRfQkFTSUMpOyAgIC8vIG90aGVyd2lzZSwgdG9rZW4tYnVmZmVyIHdvbid0IGJlIHVzZWZ1bAotICBTQl9EQ0hFQ0soIWVuYy0+ZG9fc2VhcmNoXyk7ICAgICAgICAgLy8gVE9ETyhza2FsKTogaGFuZGxlIHBhc3MgYW5kIGRpY2hvdG9teQotCi0gIFNldExvb3BQYXJhbXMoZW5jLCBlbmMtPmNvbmZpZ18tPnF1YWxpdHkpOwotCi0gIG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKLSAgaWYgKCFvaykgcmV0dXJuIDA7Ci0KLSAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKLSAgVlA4SW5pdEZpbHRlcigmaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIGluZm87Ci0gICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICBpZiAoLS1jbnQgPCAwKSB7Ci0gICAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKHByb2JhKTsKLSAgICAgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMocHJvYmEpOyAgLy8gcmVmcmVzaCBjb3N0IHRhYmxlcyBmb3IgcmQtb3B0Ci0gICAgICBjbnQgPSBtYXhfY291bnQ7Ci0gICAgfQotICAgIFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCk7Ci0gICAgUmVjb3JkVG9rZW5zKCZpdCwgJmluZm8sICZlbmMtPnRva2Vuc18pOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgICAgVlA4RW5jQ29kZUxheWVyQmxvY2soJml0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBTdG9yZVNpZGVJbmZvKCZpdCk7Ci0gICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOwotICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7Ci0gICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOwotICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0LCBpdC55dXZfb3V0XykpOwotCi0gIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Ci0KLSAgaWYgKG9rKSB7Ci0gICAgRmluYWxpemVUb2tlblByb2Jhcyhwcm9iYSk7Ci0gICAgb2sgPSBWUDhFbWl0VG9rZW5zKCZlbmMtPnRva2Vuc18sIGVuYy0+cGFydHNfICsgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfLCAxKTsKLSAgfQotCi0gIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOwotfQotCi0jZWxzZQotCi1pbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICAodm9pZCllbmM7Ci0gIHJldHVybiAwOyAgIC8vIHdlIHNob3VsZG4ndCBiZSBoZXJlLgotfQotCi0jZW5kaWYgICAgLy8gRElTQUJMRV9UT0tFTl9CVUZGRVIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NGMzNzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4vaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2xvc3NsZXNzLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotc3RhdGljIHZvaWQgSGlzdG9ncmFtQ2xlYXIoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgewotICBTYk1lbW9yeVNldChwLT5saXRlcmFsXywgMCwgc2l6ZW9mKHAtPmxpdGVyYWxfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPnJlZF8sIDAsIHNpemVvZihwLT5yZWRfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPmJsdWVfLCAwLCBzaXplb2YocC0+Ymx1ZV8pKTsKLSAgU2JNZW1vcnlTZXQocC0+YWxwaGFfLCAwLCBzaXplb2YocC0+YWxwaGFfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPmRpc3RhbmNlXywgMCwgc2l6ZW9mKHAtPmRpc3RhbmNlXykpOwotICBwLT5iaXRfY29zdF8gPSAwOwotfQotCi12b2lkIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHJlZnMtPnNpemU7ICsraSkgewotICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sICZyZWZzLT5yZWZzW2ldKTsKLSAgfQotfQotCi12b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cykgewotICBpZiAocGFsZXR0ZV9jb2RlX2JpdHMgPj0gMCkgewotICAgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOwotICB9Ci0gIEhpc3RvZ3JhbUNsZWFyKHApOwotICBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKHJlZnMsIHApOwotfQotCi12b2lkIFZQOExIaXN0b2dyYW1Jbml0KFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsIGludCBwYWxldHRlX2NvZGVfYml0cykgewotICBwLT5wYWxldHRlX2NvZGVfYml0c18gPSBwYWxldHRlX2NvZGVfYml0czsKLSAgSGlzdG9ncmFtQ2xlYXIocCk7Ci19Ci0KLVZQOExIaXN0b2dyYW1TZXQqIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbnQgc2l6ZSwgaW50IGNhY2hlX2JpdHMpIHsKLSAgaW50IGk7Ci0gIFZQOExIaXN0b2dyYW1TZXQqIHNldDsKLSAgVlA4TEhpc3RvZ3JhbSogYnVsazsKLSAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9IHNpemVvZigqc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KXNpemUgKiBzaXplb2YoKnNldC0+aGlzdG9ncmFtcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClzaXplICogc2l6ZW9mKCoqc2V0LT5oaXN0b2dyYW1zKTsKLSAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtb3J5KSk7Ci0gIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgc2V0ID0gKFZQOExIaXN0b2dyYW1TZXQqKW1lbW9yeTsKLSAgbWVtb3J5ICs9IHNpemVvZigqc2V0KTsKLSAgc2V0LT5oaXN0b2dyYW1zID0gKFZQOExIaXN0b2dyYW0qKiltZW1vcnk7Ci0gIG1lbW9yeSArPSBzaXplICogc2l6ZW9mKCpzZXQtPmhpc3RvZ3JhbXMpOwotICBidWxrID0gKFZQOExIaXN0b2dyYW0qKW1lbW9yeTsKLSAgc2V0LT5tYXhfc2l6ZSA9IHNpemU7Ci0gIHNldC0+c2l6ZSA9IHNpemU7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBzZXQtPmhpc3RvZ3JhbXNbaV0gPSBidWxrICsgaTsKLSAgICBWUDhMSGlzdG9ncmFtSW5pdChzZXQtPmhpc3RvZ3JhbXNbaV0sIGNhY2hlX2JpdHMpOwotICB9Ci0gIHJldHVybiBzZXQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYpIHsKLSAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgewotICAgICsraGlzdG8tPmFscGhhX1tQaXhPckNvcHlMaXRlcmFsKHYsIDMpXTsKLSAgICArK2hpc3RvLT5yZWRfW1BpeE9yQ29weUxpdGVyYWwodiwgMildOwotICAgICsraGlzdG8tPmxpdGVyYWxfW1BpeE9yQ29weUxpdGVyYWwodiwgMSldOwotICAgICsraGlzdG8tPmJsdWVfW1BpeE9yQ29weUxpdGVyYWwodiwgMCldOwotICB9IGVsc2UgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKLSAgICBpbnQgbGl0ZXJhbF9peCA9IDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKyBQaXhPckNvcHlDYWNoZUlkeCh2KTsKLSAgICArK2hpc3RvLT5saXRlcmFsX1tsaXRlcmFsX2l4XTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgY29kZSwgZXh0cmFfYml0c19jb3VudCwgZXh0cmFfYml0c192YWx1ZTsKLSAgICBQcmVmaXhFbmNvZGUoUGl4T3JDb3B5TGVuZ3RoKHYpLAotICAgICAgICAgICAgICAgICAmY29kZSwgJmV4dHJhX2JpdHNfY291bnQsICZleHRyYV9iaXRzX3ZhbHVlKTsKLSAgICArK2hpc3RvLT5saXRlcmFsX1syNTYgKyBjb2RlXTsKLSAgICBQcmVmaXhFbmNvZGUoUGl4T3JDb3B5RGlzdGFuY2UodiksCi0gICAgICAgICAgICAgICAgICZjb2RlLCAmZXh0cmFfYml0c19jb3VudCwgJmV4dHJhX2JpdHNfdmFsdWUpOwotICAgICsraGlzdG8tPmRpc3RhbmNlX1tjb2RlXTsKLSAgfQotfQotCi1zdGF0aWMgZG91YmxlIEJpdHNFbnRyb3B5KGNvbnN0IGludCogY29uc3QgYXJyYXksIGludCBuKSB7Ci0gIGRvdWJsZSByZXR2YWwgPSAwLjsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBub256ZXJvcyA9IDA7Ci0gIGludCBtYXhfdmFsID0gMDsKLSAgaW50IGk7Ci0gIGRvdWJsZSBtaXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBpZiAoYXJyYXlbaV0gIT0gMCkgewotICAgICAgc3VtICs9IGFycmF5W2ldOwotICAgICAgKytub256ZXJvczsKLSAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKGFycmF5W2ldKTsKLSAgICAgIGlmIChtYXhfdmFsIDwgYXJyYXlbaV0pIHsKLSAgICAgICAgbWF4X3ZhbCA9IGFycmF5W2ldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW0pOwotCi0gIGlmIChub256ZXJvcyA8IDUpIHsKLSAgICBpZiAobm9uemVyb3MgPD0gMSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIFR3byBzeW1ib2xzLCB0aGV5IHdpbGwgYmUgMCBhbmQgMSBpbiBhIEh1ZmZtYW4gY29kZS4KLSAgICAvLyBMZXQncyBtaXggaW4gYSBiaXQgb2YgZW50cm9weSB0byBmYXZvciBnb29kIGNsdXN0ZXJpbmcgd2hlbgotICAgIC8vIGRpc3RyaWJ1dGlvbnMgb2YgdGhlc2UgYXJlIGNvbWJpbmVkLgotICAgIGlmIChub256ZXJvcyA9PSAyKSB7Ci0gICAgICByZXR1cm4gMC45OSAqIHN1bSArIDAuMDEgKiByZXR2YWw7Ci0gICAgfQotICAgIC8vIE5vIG1hdHRlciB3aGF0IHRoZSBlbnRyb3B5IHNheXMsIHdlIGNhbm5vdCBiZSBiZXR0ZXIgdGhhbiBtaW5fbGltaXQKLSAgICAvLyB3aXRoIEh1ZmZtYW4gY29kaW5nLiBJIGFtIG1peGluZyBhIGJpdCBvZiBlbnRyb3B5IGludG8gdGhlCi0gICAgLy8gbWluX2xpbWl0IHNpbmNlIGl0IHByb2R1Y2VzIG11Y2ggYmV0dGVyICh+MC41ICUpIGNvbXByZXNzaW9uIHJlc3VsdHMKLSAgICAvLyBwZXJoYXBzIGJlY2F1c2Ugb2YgYmV0dGVyIGVudHJvcHkgY2x1c3RlcmluZy4KLSAgICBpZiAobm9uemVyb3MgPT0gMykgewotICAgICAgbWl4ID0gMC45NTsKLSAgICB9IGVsc2UgewotICAgICAgbWl4ID0gMC43OyAgLy8gbm9uemVyb3MgPT0gNC4KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbWl4ID0gMC42Mjc7Ci0gIH0KLQotICB7Ci0gICAgZG91YmxlIG1pbl9saW1pdCA9IDIgKiBzdW0gLSBtYXhfdmFsOwotICAgIG1pbl9saW1pdCA9IG1peCAqIG1pbl9saW1pdCArICgxLjAgLSBtaXgpICogcmV0dmFsOwotICAgIHJldHVybiAocmV0dmFsIDwgbWluX2xpbWl0KSA/IG1pbl9saW1pdCA6IHJldHZhbDsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBjb3N0IGVuY29kZSB0aGUgcmxlLWVuY29kZWQgZW50cm9weSBjb2RlLgotLy8gVGhlIGNvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBleHBlcmltZW50YWwuCi1zdGF0aWMgZG91YmxlIEh1ZmZtYW5Db3N0KGNvbnN0IGludCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgewotICAvLyBTbWFsbCBiaWFzIGJlY2F1c2UgSHVmZm1hbiBjb2RlIGxlbmd0aCBpcyB0eXBpY2FsbHkgbm90IHN0b3JlZCBpbgotICAvLyBmdWxsIGxlbmd0aC4KLSAgc3RhdGljIGNvbnN0IGludCBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSA9IENPREVfTEVOR1RIX0NPREVTICogMzsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU21hbGxCaWFzID0gOS4xOwotICBkb3VibGUgcmV0dmFsID0ga0h1ZmZtYW5Db2RlT2ZIdWZmbWFuQ29kZVNpemUgLSBrU21hbGxCaWFzOwotICBpbnQgc3RyZWFrID0gMDsKLSAgaW50IGkgPSAwOwotICBmb3IgKDsgaSA8IGxlbmd0aCAtIDE7ICsraSkgewotICAgICsrc3RyZWFrOwotICAgIGlmIChwb3B1bGF0aW9uW2ldID09IHBvcHVsYXRpb25baSArIDFdKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gbGFzdF9zdHJlYWtfaGFjazoKLSAgICAvLyBwb3B1bGF0aW9uW2ldIHBvaW50cyBub3cgdG8gdGhlIHN5bWJvbCBpbiB0aGUgc3RyZWFrIG9mIHNhbWUgdmFsdWVzLgotICAgIGlmIChzdHJlYWsgPiAzKSB7Ci0gICAgICBpZiAocG9wdWxhdGlvbltpXSA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSAxLjU2MjUgKyAwLjIzNDM3NSAqIHN0cmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHZhbCArPSAyLjU3ODEyNSArIDAuNzAzMTI1ICogc3RyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocG9wdWxhdGlvbltpXSA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSAxLjc5Njg3NSAqIHN0cmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHZhbCArPSAzLjI4MTI1ICogc3RyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzdHJlYWsgPSAwOwotICB9Ci0gIGlmIChpID09IGxlbmd0aCAtIDEpIHsKLSAgICArK3N0cmVhazsKLSAgICBnb3RvIGxhc3Rfc3RyZWFrX2hhY2s7Ci0gIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGRvdWJsZSBQb3B1bGF0aW9uQ29zdChjb25zdCBpbnQqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKLSAgcmV0dXJuIEJpdHNFbnRyb3B5KHBvcHVsYXRpb24sIGxlbmd0aCkgKyBIdWZmbWFuQ29zdChwb3B1bGF0aW9uLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgZG91YmxlIEV4dHJhQ29zdChjb25zdCBpbnQqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKLSAgaW50IGk7Ci0gIGRvdWJsZSBjb3N0ID0gMC47Ci0gIGZvciAoaSA9IDI7IGkgPCBsZW5ndGggLSAyOyArK2kpIGNvc3QgKz0gKGkgPj4gMSkgKiBwb3B1bGF0aW9uW2kgKyAyXTsKLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLS8vIEVzdGltYXRlcyB0aGUgRW50cm9weSArIEh1ZmZtYW4gKyBvdGhlciBibG9jayBvdmVyaGVhZCBzaXplIGNvc3QuCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7Ci0gIHJldHVybiBQb3B1bGF0aW9uQ29zdChwLT5saXRlcmFsXywgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKHApKQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+cmVkXywgMjU2KQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+Ymx1ZV8sIDI1NikKLSAgICAgICArIFBvcHVsYXRpb25Db3N0KHAtPmFscGhhXywgMjU2KQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+bGl0ZXJhbF8gKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotfQotCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0c0J1bGsoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgewotICByZXR1cm4gQml0c0VudHJvcHkocC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwKSkKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPnJlZF8sIDI1NikKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPmJsdWVfLCAyNTYpCi0gICAgICAgKyBCaXRzRW50cm9weShwLT5hbHBoYV8sIDI1NikKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKQotICAgICAgICsgRXh0cmFDb3N0KHAtPmxpdGVyYWxfICsgMjU2LCBOVU1fTEVOR1RIX0NPREVTKQotICAgICAgICsgRXh0cmFDb3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZhcmlvdXMgaGlzdG9ncmFtIGNvbWJpbmUvY29zdC1ldmFsIGZ1bmN0aW9ucwotCi0vLyBBZGRzICdpbicgaGlzdG9ncmFtIHRvICdvdXQnCi1zdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGQoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgUElYX09SX0NPUFlfQ09ERVNfTUFYOyArK2kpIHsKLSAgICBvdXQtPmxpdGVyYWxfW2ldICs9IGluLT5saXRlcmFsX1tpXTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKLSAgICBvdXQtPmRpc3RhbmNlX1tpXSArPSBpbi0+ZGlzdGFuY2VfW2ldOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIG91dC0+cmVkX1tpXSArPSBpbi0+cmVkX1tpXTsKLSAgICBvdXQtPmJsdWVfW2ldICs9IGluLT5ibHVlX1tpXTsKLSAgICBvdXQtPmFscGhhX1tpXSArPSBpbi0+YWxwaGFfW2ldOwotICB9Ci19Ci0KLS8vIFBlcmZvcm1zIG91dCA9IGEgKyBiLCBjb21wdXRpbmcgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSAtIEMoYikgd2hpbGUgY29tcGFyaW5nCi0vLyB0byB0aGUgdGhyZXNob2xkIHZhbHVlICdjb3N0X3RocmVzaG9sZCcuIFRoZSBzY29yZSByZXR1cm5lZCBpcwotLy8gIFNjb3JlID0gQyhhK2IpIC0gQyhhKSAtIEMoYiksIHdoZXJlIEMoYSkgKyBDKGIpIGlzIGtub3duIGFuZCBmaXhlZC4KLS8vIFNpbmNlIHRoZSBwcmV2aW91cyBzY29yZSBwYXNzZWQgaXMgJ2Nvc3RfdGhyZXNob2xkJywgd2Ugb25seSBuZWVkIHRvIGNvbXBhcmUKLS8vIHRoZSBwYXJ0aWFsIGNvc3QgYWdhaW5zdCAnY29zdF90aHJlc2hvbGQgKyBDKGEpICsgQyhiKScgdG8gcG9zc2libHkgYmFpbC1vdXQKLS8vIGVhcmx5Lgotc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRFdmFsKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7Ci0gIGRvdWJsZSBjb3N0ID0gMDsKLSAgY29uc3QgZG91YmxlIHN1bV9jb3N0ID0gYS0+Yml0X2Nvc3RfICsgYi0+Yml0X2Nvc3RfOwotICBpbnQgaTsKLQotICBjb3N0X3RocmVzaG9sZCArPSBzdW1fY29zdDsKLQotICAvLyBwYWxldHRlX2NvZGVfYml0c18gaXMgcGFydCBvZiB0aGUgY29zdCBldmFsdWF0aW9uIGZvciBsaXRlcmFsXy4KLSAgLy8gVE9ETyhza2FsKTogcmVtb3ZlL3NpbXBsaWZ5IHRoaXMgcGFsZXR0ZV9jb2RlX2JpdHNfPwotICBvdXQtPnBhbGV0dGVfY29kZV9iaXRzXyA9Ci0gICAgICAoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID4gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKSA/IGEtPnBhbGV0dGVfY29kZV9iaXRzXyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPnBhbGV0dGVfY29kZV9iaXRzXzsKLSAgZm9yIChpID0gMDsgaSA8IFBJWF9PUl9DT1BZX0NPREVTX01BWDsgKytpKSB7Ci0gICAgb3V0LT5saXRlcmFsX1tpXSA9IGEtPmxpdGVyYWxfW2ldICsgYi0+bGl0ZXJhbF9baV07Ci0gIH0KLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmxpdGVyYWxfLCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMob3V0KSk7Ci0gIGNvc3QgKz0gRXh0cmFDb3N0KG91dC0+bGl0ZXJhbF8gKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIG91dC0+cmVkX1tpXSA9IGEtPnJlZF9baV0gKyBiLT5yZWRfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+cmVkXywgMjU2KTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSBvdXQtPmJsdWVfW2ldID0gYS0+Ymx1ZV9baV0gKyBiLT5ibHVlX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmJsdWVfLCAyNTYpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKLSAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKLSAgfQotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBjb3N0ICs9IEV4dHJhQ29zdChvdXQtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSBvdXQtPmFscGhhX1tpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmFscGhhXywgMjU2KTsKLQotICBvdXQtPmJpdF9jb3N0XyA9IGNvc3Q7Ci0gIHJldHVybiBjb3N0IC0gc3VtX2Nvc3Q7Ci19Ci0KLS8vIFNhbWUgYXMgSGlzdG9ncmFtQWRkRXZhbCgpLCBleGNlcHQgdGhhdCB0aGUgcmVzdWx0aW5nIGhpc3RvZ3JhbQotLy8gaXMgbm90IHN0b3JlZC4gT25seSB0aGUgY29zdCBDKGErYikgLSBDKGEpIGlzIGV2YWx1YXRlZC4gV2Ugb21pdAotLy8gdGhlIHRlcm0gQyhiKSB3aGljaCBpcyBjb25zdGFudCBvdmVyIGFsbCB0aGUgZXZhbHVhdGlvbnMuCi1zdGF0aWMgZG91YmxlIEhpc3RvZ3JhbUFkZFRocmVzaChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgewotICBpbnQgdG1wW1BJWF9PUl9DT1BZX0NPREVTX01BWF07ICAvLyA8PSBtYXggc3RvcmFnZSB3ZSdsbCBuZWVkCi0gIGludCBpOwotICBkb3VibGUgY29zdCA9IC1hLT5iaXRfY29zdF87Ci0KLSAgZm9yIChpID0gMDsgaSA8IFBJWF9PUl9DT1BZX0NPREVTX01BWDsgKytpKSB7Ci0gICAgdG1wW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKLSAgfQotICAvLyBub3RlIHRoYXQgdGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgdGhlIHVzdWFsbHkgbGFyZ2VzdAotICAvLyBjb3N0IHNoYXJlcyBjb21lIGZpcnN0LgotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEpKTsKLSAgY29zdCArPSBFeHRyYUNvc3QodG1wICsgMjU2LCBOVU1fTEVOR1RIX0NPREVTKTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB0bXBbaV0gPSBhLT5yZWRfW2ldICsgYi0+cmVkX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgdG1wW2ldID0gYS0+Ymx1ZV9baV0gKyBiLT5ibHVlX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgewotICAgIHRtcFtpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKLSAgfQotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgTlVNX0RJU1RBTkNFX0NPREVTKTsKLSAgY29zdCArPSBFeHRyYUNvc3QodG1wLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHRtcFtpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0KLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIEhpc3RvZ3JhbUJ1aWxkSW1hZ2UoaW50IHhzaXplLCBpbnQgaGlzdG9fYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmFja3dhcmRfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2UpIHsKLSAgaW50IGk7Ci0gIGludCB4ID0gMCwgeSA9IDA7Ci0gIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKTsKLSAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZS0+aGlzdG9ncmFtczsKLSAgU0JfRENIRUNLKGhpc3RvX2JpdHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGJhY2t3YXJkX3JlZnMtPnNpemU7ICsraSkgewotICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9ICZiYWNrd2FyZF9yZWZzLT5yZWZzW2ldOwotICAgIGNvbnN0IGludCBpeCA9ICh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKyAoeCA+PiBoaXN0b19iaXRzKTsKLSAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvZ3JhbXNbaXhdLCB2KTsKLSAgICB4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKLSAgICB3aGlsZSAoeCA+PSB4c2l6ZSkgewotICAgICAgeCAtPSB4c2l6ZTsKLSAgICAgICsreTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHVpbnQzMl90IE15UmFuZCh1aW50MzJfdCAqc2VlZCkgewotICAqc2VlZCAqPSAxNjgwN1U7Ci0gIGlmICgqc2VlZCA9PSAwKSB7Ci0gICAgKnNlZWQgPSAxOwotICB9Ci0gIHJldHVybiAqc2VlZDsKLX0KLQotc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lKGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG91dCwgaW50IGl0ZXJfbXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhaXJzLCBpbnQgbnVtX3RyaWVzX25vX3N1Y2Nlc3MpIHsKLSAgaW50IG9rID0gMDsKLSAgaW50IGksIGl0ZXI7Ci0gIHVpbnQzMl90IHNlZWQgPSAwOwotICBpbnQgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKLSAgaW50IG91dF9zaXplID0gaW4tPnNpemU7Ci0gIGNvbnN0IGludCBvdXRlcl9pdGVycyA9IGluLT5zaXplICogaXRlcl9tdWx0OwotICBjb25zdCBpbnQgbWluX2NsdXN0ZXJfc2l6ZSA9IDI7Ci0gIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvcyA9IChWUDhMSGlzdG9ncmFtKilTYk1lbW9yeUFsbG9jYXRlKDIgKiBzaXplb2YoKmhpc3RvcykpOwotICBWUDhMSGlzdG9ncmFtKiBjdXJfY29tYm8gPSBoaXN0b3MgKyAwOyAgICAvLyB0cmlhbCBtZXJnZWQgaGlzdG9ncmFtCi0gIFZQOExIaXN0b2dyYW0qIGJlc3RfY29tYm8gPSBoaXN0b3MgKyAxOyAgIC8vIGJlc3QgbWVyZ2VkIGhpc3RvZ3JhbSBzbyBmYXIKLSAgaWYgKGhpc3RvcyA9PSBOVUxMKSBnb3RvIEVuZDsKLQotICAvLyBDb3B5IGhpc3RvZ3JhbXMgZnJvbSBpbltdIHRvIG91dFtdLgotICBTQl9EQ0hFQ0soaW4tPnNpemUgPD0gb3V0LT5zaXplKTsKLSAgZm9yIChpID0gMDsgaSA8IGluLT5zaXplOyArK2kpIHsKLSAgICBpbi0+aGlzdG9ncmFtc1tpXS0+Yml0X2Nvc3RfID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhpbi0+aGlzdG9ncmFtc1tpXSk7Ci0gICAgKm91dC0+aGlzdG9ncmFtc1tpXSA9ICppbi0+aGlzdG9ncmFtc1tpXTsKLSAgfQotCi0gIC8vIENvbGxhcHNlIHNpbWlsYXIgaGlzdG9ncmFtcyBpbiAnb3V0Jy4KLSAgZm9yIChpdGVyID0gMDsgaXRlciA8IG91dGVyX2l0ZXJzICYmIG91dF9zaXplID49IG1pbl9jbHVzdGVyX3NpemU7ICsraXRlcikgewotICAgIGRvdWJsZSBiZXN0X2Nvc3RfZGlmZiA9IDAuOwotICAgIGludCBiZXN0X2lkeDEgPSAtMSwgYmVzdF9pZHgyID0gMTsKLSAgICBpbnQgajsKLSAgICBjb25zdCBpbnQgbnVtX3RyaWVzID0gKG51bV9wYWlycyA8IG91dF9zaXplKSA/IG51bV9wYWlycyA6IG91dF9zaXplOwotICAgIHNlZWQgKz0gaXRlcjsKLSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3RyaWVzOyArK2opIHsKLSAgICAgIGRvdWJsZSBjdXJyX2Nvc3RfZGlmZjsKLSAgICAgIC8vIENob29zZSB0d28gaGlzdG9ncmFtcyBhdCByYW5kb20gYW5kIHRyeSB0byBjb21iaW5lIHRoZW0uCi0gICAgICBjb25zdCB1aW50MzJfdCBpZHgxID0gTXlSYW5kKCZzZWVkKSAlIG91dF9zaXplOwotICAgICAgY29uc3QgdWludDMyX3QgdG1wID0gKGogJiA3KSArIDE7Ci0gICAgICBjb25zdCB1aW50MzJfdCBkaWZmID0gKHRtcCA8IDMpID8gdG1wIDogTXlSYW5kKCZzZWVkKSAlIChvdXRfc2l6ZSAtIDEpOwotICAgICAgY29uc3QgdWludDMyX3QgaWR4MiA9IChpZHgxICsgZGlmZiArIDEpICUgb3V0X3NpemU7Ci0gICAgICBpZiAoaWR4MSA9PSBpZHgyKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgcmVkdWN0aW9uIG9uIGNvbWJpbmluZy4KLSAgICAgIGN1cnJfY29zdF9kaWZmID0gSGlzdG9ncmFtQWRkRXZhbChvdXQtPmhpc3RvZ3JhbXNbaWR4MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5oaXN0b2dyYW1zW2lkeDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb21ibywgYmVzdF9jb3N0X2RpZmYpOwotICAgICAgaWYgKGN1cnJfY29zdF9kaWZmIDwgYmVzdF9jb3N0X2RpZmYpIHsgICAgLy8gZm91bmQgYSBiZXR0ZXIgcGFpcj8KLSAgICAgICAgeyAgICAgLy8gc3dhcCBjdXIvYmVzdCBjb21ibyBoaXN0b2dyYW1zCi0gICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgdG1wX2hpc3RvID0gY3VyX2NvbWJvOwotICAgICAgICAgIGN1cl9jb21ibyA9IGJlc3RfY29tYm87Ci0gICAgICAgICAgYmVzdF9jb21ibyA9IHRtcF9oaXN0bzsKLSAgICAgICAgfQotICAgICAgICBiZXN0X2Nvc3RfZGlmZiA9IGN1cnJfY29zdF9kaWZmOwotICAgICAgICBiZXN0X2lkeDEgPSBpZHgxOwotICAgICAgICBiZXN0X2lkeDIgPSBpZHgyOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChiZXN0X2lkeDEgPj0gMCkgewotICAgICAgKm91dC0+aGlzdG9ncmFtc1tiZXN0X2lkeDFdID0gKmJlc3RfY29tYm87Ci0gICAgICAvLyBzd2FwIGJlc3RfaWR4MiBzbG90IHdpdGggbGFzdCBvbmUgKHdoaWNoIGlzIG5vdyB1bnVzZWQpCi0gICAgICAtLW91dF9zaXplOwotICAgICAgaWYgKGJlc3RfaWR4MiAhPSBvdXRfc2l6ZSkgewotICAgICAgICBvdXQtPmhpc3RvZ3JhbXNbYmVzdF9pZHgyXSA9IG91dC0+aGlzdG9ncmFtc1tvdXRfc2l6ZV07Ci0gICAgICAgIG91dC0+aGlzdG9ncmFtc1tvdXRfc2l6ZV0gPSBOVUxMOyAgIC8vIGp1c3QgZm9yIHNhbml0eSBjaGVjay4KLSAgICAgIH0KLSAgICAgIHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7Ci0gICAgfQotICAgIGlmICgrK3RyaWVzX3dpdGhfbm9fc3VjY2VzcyA+PSBudW1fdHJpZXNfbm9fc3VjY2VzcykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG91dC0+c2l6ZSA9IG91dF9zaXplOwotICBvayA9IDE7Ci0KLSBFbmQ6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b3MpOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIaXN0b2dyYW0gcmVmaW5lbWVudAotCi0vLyBXaGF0IGlzIHRoZSBiaXQgY29zdCBvZiBtb3Zpbmcgc3F1YXJlX2hpc3RvZ3JhbSBmcm9tIGN1cl9zeW1ib2wgdG8gY2FuZGlkYXRlLgotc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1EaXN0YW5jZShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBzcXVhcmVfaGlzdG9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBjYW5kaWRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgewotICByZXR1cm4gSGlzdG9ncmFtQWRkVGhyZXNoKGNhbmRpZGF0ZSwgc3F1YXJlX2hpc3RvZ3JhbSwgY29zdF90aHJlc2hvbGQpOwotfQotCi0vLyBGaW5kIHRoZSBiZXN0ICdvdXQnIGhpc3RvZ3JhbSBmb3IgZWFjaCBvZiB0aGUgJ2luJyBoaXN0b2dyYW1zLgotLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb3V0W10tPmJpdF9jb3N0XyBpcyBhbHJlYWR5IHVwLXRvLWRhdGUuCi1zdGF0aWMgdm9pZCBIaXN0b2dyYW1SZW1hcChjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBzeW1ib2xzKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgaW4tPnNpemU7ICsraSkgewotICAgIGludCBiZXN0X291dCA9IDA7Ci0gICAgZG91YmxlIGJlc3RfYml0cyA9Ci0gICAgICAgIEhpc3RvZ3JhbURpc3RhbmNlKGluLT5oaXN0b2dyYW1zW2ldLCBvdXQtPmhpc3RvZ3JhbXNbMF0sIDEuZTM4KTsKLSAgICBpbnQgazsKLSAgICBmb3IgKGsgPSAxOyBrIDwgb3V0LT5zaXplOyArK2spIHsKLSAgICAgIGNvbnN0IGRvdWJsZSBjdXJfYml0cyA9Ci0gICAgICAgICAgSGlzdG9ncmFtRGlzdGFuY2UoaW4tPmhpc3RvZ3JhbXNbaV0sIG91dC0+aGlzdG9ncmFtc1trXSwgYmVzdF9iaXRzKTsKLSAgICAgIGlmIChjdXJfYml0cyA8IGJlc3RfYml0cykgewotICAgICAgICBiZXN0X2JpdHMgPSBjdXJfYml0czsKLSAgICAgICAgYmVzdF9vdXQgPSBrOwotICAgICAgfQotICAgIH0KLSAgICBzeW1ib2xzW2ldID0gYmVzdF9vdXQ7Ci0gIH0KLQotICAvLyBSZWNvbXB1dGUgZWFjaCBvdXQgYmFzZWQgb24gcmF3IGFuZCBzeW1ib2xzLgotICBmb3IgKGkgPSAwOyBpIDwgb3V0LT5zaXplOyArK2kpIHsKLSAgICBIaXN0b2dyYW1DbGVhcihvdXQtPmhpc3RvZ3JhbXNbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBpbi0+c2l6ZTsgKytpKSB7Ci0gICAgSGlzdG9ncmFtQWRkKGluLT5oaXN0b2dyYW1zW2ldLCBvdXQtPmhpc3RvZ3JhbXNbc3ltYm9sc1tpXV0pOwotICB9Ci19Ci0KLWludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgaGlzdG9fYml0cywgaW50IGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMpIHsKLSAgaW50IG9rID0gMDsKLSAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKSA6IDE7Ci0gIGNvbnN0IGludCBoaXN0b195c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh5c2l6ZSwgaGlzdG9fYml0cykgOiAxOwotICBjb25zdCBpbnQgaGlzdG9faW1hZ2VfcmF3X3NpemUgPSBoaXN0b194c2l6ZSAqIGhpc3RvX3lzaXplOwotCi0gIC8vIEhldXJpc3RpYyBwYXJhbXMgZm9yIEhpc3RvZ3JhbUNvbWJpbmUoKS4KLSAgY29uc3QgaW50IG51bV90cmllc19ub19zdWNjZXNzID0gOCArIChxdWFsaXR5ID4+IDEpOwotICBjb25zdCBpbnQgaXRlcl9tdWx0ID0gKHF1YWxpdHkgPCAyNykgPyAxIDogMSArICgocXVhbGl0eSAtIDI3KSA+PiA0KTsKLSAgY29uc3QgaW50IG51bV9wYWlycyA9IChxdWFsaXR5IDwgMjUpID8gMTAgOiAoNSAqIHF1YWxpdHkpID4+IDM7Ci0KLSAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2Vfb3V0ID0KLSAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b19pbWFnZV9yYXdfc2l6ZSwgY2FjaGVfYml0cyk7Ci0gIGlmIChpbWFnZV9vdXQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlLgotICBIaXN0b2dyYW1CdWlsZEltYWdlKHhzaXplLCBoaXN0b19iaXRzLCByZWZzLCBpbWFnZV9vdXQpOwotICAvLyBDb2xsYXBzZSBzaW1pbGFyIGhpc3RvZ3JhbXMuCi0gIGlmICghSGlzdG9ncmFtQ29tYmluZShpbWFnZV9vdXQsIGltYWdlX2luLCBpdGVyX211bHQsIG51bV9wYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV90cmllc19ub19zdWNjZXNzKSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgLy8gRmluZCB0aGUgb3B0aW1hbCBtYXAgZnJvbSBvcmlnaW5hbCBoaXN0b2dyYW1zIHRvIHRoZSBmaW5hbCBvbmVzLgotICBIaXN0b2dyYW1SZW1hcChpbWFnZV9vdXQsIGltYWdlX2luLCBoaXN0b2dyYW1fc3ltYm9scyk7Ci0gIG9rID0gMTsKLQotRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShpbWFnZV9vdXQpOwotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODMxYTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotLy8gTW9kZWxzIHRoZSBoaXN0b2dyYW1zIG9mIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGVzLgotCi0jaWZuZGVmIFdFQlBfRU5DX0hJU1RPR1JBTV9IXwotI2RlZmluZSBXRUJQX0VOQ19ISVNUT0dSQU1fSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgaGlzdG9ncmFtcyBvZiBkYXRhLgotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBsaXRlcmFsXyBjb250YWlucyBncmVlbiBsaXRlcmFsLCBwYWxldHRlLWNvZGUgYW5kCi0gIC8vIGNvcHktbGVuZ3RoLXByZWZpeCBoaXN0b2dyYW0KLSAgaW50IGxpdGVyYWxfW1BJWF9PUl9DT1BZX0NPREVTX01BWF07Ci0gIGludCByZWRfWzI1Nl07Ci0gIGludCBibHVlX1syNTZdOwotICBpbnQgYWxwaGFfWzI1Nl07Ci0gIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSBwcmVmaXgtY29kZSBoaXN0b2dyYW0uCi0gIGludCBkaXN0YW5jZV9bTlVNX0RJU1RBTkNFX0NPREVTXTsKLSAgaW50IHBhbGV0dGVfY29kZV9iaXRzXzsKLSAgZG91YmxlIGJpdF9jb3N0XzsgICAvLyBjYWNoZWQgdmFsdWUgb2YgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyh0aGlzKQotfSBWUDhMSGlzdG9ncmFtOwotCi0vLyBDb2xsZWN0aW9uIG9mIGhpc3RvZ3JhbXMgd2l0aCBmaXhlZCBjYXBhY2l0eSwgYWxsb2NhdGVkIGFzIG9uZQotLy8gYmlnIG1lbW9yeSBjaHVuay4gQ2FuIGJlIGRlc3Ryb3llZCBieSBzaW1wbHkgY2FsbGluZyAnU2JNZW1vcnlEZWFsbG9jYXRlKCknLgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgc2l6ZTsgICAgICAgICAvLyBudW1iZXIgb2Ygc2xvdHMgY3VycmVudGx5IGluIHVzZQotICBpbnQgbWF4X3NpemU7ICAgICAvLyBtYXhpbXVtIGNhcGFjaXR5Ci0gIFZQOExIaXN0b2dyYW0qKiBoaXN0b2dyYW1zOwotfSBWUDhMSGlzdG9ncmFtU2V0OwotCi0vLyBDcmVhdGUgdGhlIGhpc3RvZ3JhbS4KLS8vCi0vLyBUaGUgaW5wdXQgZGF0YSBpcyB0aGUgUGl4T3JDb3B5IGRhdGEsIHdoaWNoIG1vZGVscyB0aGUgbGl0ZXJhbHMsIHN0b3AKLS8vIGNvZGVzIGFuZCBiYWNrd2FyZCByZWZlcmVuY2VzIChib3RoIGRpc3RhbmNlcyBhbmQgbGVuZ3RocykuICBBbHNvOiBpZgotLy8gcGFsZXR0ZV9jb2RlX2JpdHMgaXMgPj0gMCwgaW5pdGlhbGl6ZSB0aGUgaGlzdG9ncmFtIHdpdGggdGhpcyB2YWx1ZS4KLXZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKLQotLy8gU2V0IHRoZSBwYWxldHRlX2NvZGVfYml0cyBhbmQgcmVzZXQgdGhlIHN0YXRzLgotdm9pZCBWUDhMSGlzdG9ncmFtSW5pdChWUDhMSGlzdG9ncmFtKiBjb25zdCBwLCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpOwotCi0vLyBDb2xsZWN0IGFsbCB0aGUgcmVmZXJlbmNlcyBpbnRvIGEgaGlzdG9ncmFtICh3aXRob3V0IHJlc2V0KQotdm9pZCBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOwotCi0vLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVyIHRvIGhpc3RvZ3JhbXMsIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKLS8vIHVzaW5nICdjYWNoZV9iaXRzJy4gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCi1WUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKTsKLQotLy8gQWNjdW11bGF0ZSBhIHRva2VuICd2JyBpbnRvIGEgaGlzdG9ncmFtLgotdm9pZCBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3Qgdik7Ci0KLS8vIEVzdGltYXRlIGhvdyBtYW55IGJpdHMgdGhlIGNvbWJpbmVkIGVudHJvcHkgb2YgbGl0ZXJhbHMgYW5kIGRpc3RhbmNlCi0vLyBhcHByb3hpbWF0ZWx5IG1hcHMgdG8uCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKTsKLQotLy8gVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGNvc3QgaW4gYml0cyBleGNsdWRpbmcgdGhlIGJpdHMgbmVlZGVkIHRvCi0vLyByZXByZXNlbnQgdGhlIGVudHJvcHkgY29kZSBpdHNlbGYuCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0c0J1bGsoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgcCk7Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKLSAgcmV0dXJuIDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKwotICAgICAgKChwLT5wYWxldHRlX2NvZGVfYml0c18gPiAwKSA/ICgxIDw8IHAtPnBhbGV0dGVfY29kZV9iaXRzXykgOiAwKTsKLX0KLQotLy8gQnVpbGRzIHRoZSBoaXN0b2dyYW0gaW1hZ2UuCi1pbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGhpc3RvZ3JhbV9iaXRzLCBpbnQgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyk7Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX0VOQ19ISVNUT0dSQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9sYXllci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2xheWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTk0YzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2xheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRW5oYW5jZW1lbnQgbGF5ZXIgKGZvciBZVVY0NDQvNDIyKQotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVlA4RW5jSW5pdExheWVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBlbmMtPnVzZV9sYXllcl8gPSAoZW5jLT5waWNfLT51MCAhPSBOVUxMKTsKLSAgZW5jLT5sYXllcl9kYXRhX3NpemVfID0gMDsKLSAgZW5jLT5sYXllcl9kYXRhXyA9IE5VTEw7Ci0gIGlmIChlbmMtPnVzZV9sYXllcl8pIHsKLSAgICBWUDhCaXRXcml0ZXJJbml0KCZlbmMtPmxheWVyX2J3XywgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiAzKTsKLSAgfQotfQotCi12b2lkIFZQOEVuY0NvZGVMYXllckJsb2NrKFZQOEVuY0l0ZXJhdG9yKiBpdCkgewotICAodm9pZClpdDsgICAvLyByZW1vdmUgYSB3YXJuaW5nCi19Ci0KLWludCBWUDhFbmNGaW5pc2hMYXllcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgIGVuYy0+bGF5ZXJfZGF0YV8gPSBWUDhCaXRXcml0ZXJGaW5pc2goJmVuYy0+bGF5ZXJfYndfKTsKLSAgICBlbmMtPmxheWVyX2RhdGFfc2l6ZV8gPSBWUDhCaXRXcml0ZXJTaXplKCZlbmMtPmxheWVyX2J3Xyk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgVlA4RW5jRGVsZXRlTGF5ZXIoVlA4RW5jb2RlciogZW5jKSB7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShlbmMtPmxheWVyX2RhdGFfKTsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcGljdHVyZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3BpY3R1cmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YmY3Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcGljdHVyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gV2ViUFBpY3R1cmUgdXRpbHM6IGNvbG9yc3BhY2UgY29udmVyc2lvbiwgY3JvcCwgLi4uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvcmVzY2FsZXIuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL2RzcC9kc3AuaCIKLSNpbmNsdWRlICIuLi9kc3AveXV2LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIEhBTFZFKHgpICgoKHgpICsgMSkgPj4gMSkKLSNkZWZpbmUgSVNfWVVWX0NTUChjc3AsIFlVVl9DU1ApICgoKGNzcCkgJiBXRUJQX0NTUF9VVl9NQVNLKSA9PSAoWVVWX0NTUCkpCi0KLXN0YXRpYyBjb25zdCB1bmlvbiB7Ci0gIHVpbnQzMl90IGFyZ2I7Ci0gIHVpbnQ4X3QgIGJ5dGVzWzRdOwotfSB0ZXN0X2VuZGlhbiA9IHsgMHhmZjAwMDAwMHUgfTsKLSNkZWZpbmUgQUxQSEFfSVNfTEFTVCAodGVzdF9lbmRpYW4uYnl0ZXNbM10gPT0gMHhmZikKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBQaWN0dXJlCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSAhPSBOVUxMKSB7Ci0gICAgY29uc3QgV2ViUEVuY0NTUCB1dl9jc3AgPSBwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSzsKLSAgICBjb25zdCBpbnQgaGFzX2FscGhhID0gcGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKLSAgICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotCi0gICAgaWYgKCFwaWN0dXJlLT51c2VfYXJnYikgewotICAgICAgY29uc3QgaW50IHlfc3RyaWRlID0gd2lkdGg7Ci0gICAgICBjb25zdCBpbnQgdXZfd2lkdGggPSBIQUxWRSh3aWR0aCk7Ci0gICAgICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gSEFMVkUoaGVpZ2h0KTsKLSAgICAgIGNvbnN0IGludCB1dl9zdHJpZGUgPSB1dl93aWR0aDsKLSAgICAgIGludCB1djBfc3RyaWRlID0gMDsKLSAgICAgIGludCBhX3dpZHRoLCBhX3N0cmlkZTsKLSAgICAgIHVpbnQ2NF90IHlfc2l6ZSwgdXZfc2l6ZSwgdXYwX3NpemUsIGFfc2l6ZSwgdG90YWxfc2l6ZTsKLSAgICAgIHVpbnQ4X3QqIG1lbTsKLQotICAgICAgLy8gVS9WCi0gICAgICBzd2l0Y2ggKHV2X2NzcCkgewotICAgICAgICBjYXNlIFdFQlBfWVVWNDIwOgotICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgICAgIGNhc2UgV0VCUF9ZVVY0MDA6ICAgIC8vIGZvciBub3csIHdlJ2xsIGp1c3QgcmVzZXQgdGhlIFUvViBzYW1wbGVzCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV0VCUF9ZVVY0MjI6Ci0gICAgICAgICAgdXYwX3N0cmlkZSA9IHV2X3dpZHRoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdFQlBfWVVWNDQ0OgotICAgICAgICAgIHV2MF9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgdXYwX3NpemUgPSBoZWlnaHQgKiB1djBfc3RyaWRlOwotCi0gICAgICAvLyBhbHBoYQotICAgICAgYV93aWR0aCA9IGhhc19hbHBoYSA/IHdpZHRoIDogMDsKLSAgICAgIGFfc3RyaWRlID0gYV93aWR0aDsKLSAgICAgIHlfc2l6ZSA9ICh1aW50NjRfdCl5X3N0cmlkZSAqIGhlaWdodDsKLSAgICAgIHV2X3NpemUgPSAodWludDY0X3QpdXZfc3RyaWRlICogdXZfaGVpZ2h0OwotICAgICAgYV9zaXplID0gICh1aW50NjRfdClhX3N0cmlkZSAqIGhlaWdodDsKLQotICAgICAgdG90YWxfc2l6ZSA9IHlfc2l6ZSArIGFfc2l6ZSArIDIgKiB1dl9zaXplICsgMiAqIHV2MF9zaXplOwotCi0gICAgICAvLyBTZWN1cml0eSBhbmQgdmFsaWRhdGlvbiBjaGVja3MKLSAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8ICAgICAgICAgLy8gbHVtYS9hbHBoYSBwYXJhbSBlcnJvcgotICAgICAgICAgIHV2X3dpZHRoIDwgMCB8fCB1dl9oZWlnaHQgPCAwKSB7ICAgICAvLyB1L3YgcGFyYW0gZXJyb3IKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICAvLyBDbGVhciBwcmV2aW91cyBidWZmZXIgYW5kIGFsbG9jYXRlIGEgbmV3IG9uZS4KLSAgICAgIFdlYlBQaWN0dXJlRnJlZShwaWN0dXJlKTsgICAvLyBlcmFzZSBwcmV2aW91cyBidWZmZXIKLSAgICAgIG1lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbSkpOwotICAgICAgaWYgKG1lbSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgICAgLy8gRnJvbSBub3cgb24sIHdlJ3JlIGluIHRoZSBjbGVhciwgd2UgY2FuIG5vIGxvbmdlciBmYWlsLi4uCi0gICAgICBwaWN0dXJlLT5tZW1vcnlfID0gKHZvaWQqKW1lbTsKLSAgICAgIHBpY3R1cmUtPnlfc3RyaWRlICA9IHlfc3RyaWRlOwotICAgICAgcGljdHVyZS0+dXZfc3RyaWRlID0gdXZfc3RyaWRlOwotICAgICAgcGljdHVyZS0+YV9zdHJpZGUgID0gYV9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT51djBfc3RyaWRlID0gdXYwX3N0cmlkZTsKLSAgICAgIC8vIFRPRE8oc2thbCk6IHdlIGNvdWxkIGFsaWduIHRoZSB5L3UvdiBwbGFuZXMgYW5kIGFkanVzdCBzdHJpZGUuCi0gICAgICBwaWN0dXJlLT55ID0gbWVtOwotICAgICAgbWVtICs9IHlfc2l6ZTsKLQotICAgICAgcGljdHVyZS0+dSA9IG1lbTsKLSAgICAgIG1lbSArPSB1dl9zaXplOwotICAgICAgcGljdHVyZS0+diA9IG1lbTsKLSAgICAgIG1lbSArPSB1dl9zaXplOwotCi0gICAgICBpZiAoYV9zaXplKSB7Ci0gICAgICAgIHBpY3R1cmUtPmEgPSBtZW07Ci0gICAgICAgIG1lbSArPSBhX3NpemU7Ci0gICAgICB9Ci0gICAgICBpZiAodXYwX3NpemUpIHsKLSAgICAgICAgcGljdHVyZS0+dTAgPSBtZW07Ci0gICAgICAgIG1lbSArPSB1djBfc2l6ZTsKLSAgICAgICAgcGljdHVyZS0+djAgPSBtZW07Ci0gICAgICAgIG1lbSArPSB1djBfc2l6ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm9pZCogbWVtb3J5OwotICAgICAgY29uc3QgdWludDY0X3QgYXJnYl9zaXplID0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0OwotICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICAvLyBDbGVhciBwcmV2aW91cyBidWZmZXIgYW5kIGFsbG9jYXRlIGEgbmV3IG9uZS4KLSAgICAgIFdlYlBQaWN0dXJlRnJlZShwaWN0dXJlKTsgICAvLyBlcmFzZSBwcmV2aW91cyBidWZmZXIKLSAgICAgIG1lbW9yeSA9IFdlYlBTYWZlTWFsbG9jKGFyZ2Jfc2l6ZSwgc2l6ZW9mKCpwaWN0dXJlLT5hcmdiKSk7Ci0gICAgICBpZiAobWVtb3J5ID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgICAvLyBUT0RPKHNrYWwpOiBhbGlnbiBwbGFuZSB0byBjYWNoZSBsaW5lPwotICAgICAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gbWVtb3J5OwotICAgICAgcGljdHVyZS0+YXJnYiA9ICh1aW50MzJfdCopbWVtb3J5OwotICAgICAgcGljdHVyZS0+YXJnYl9zdHJpZGUgPSB3aWR0aDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIEFSR0IgYnVmZmVyIChkb2Vzbid0IGZyZWUgYW55dGhpbmcpLgotc3RhdGljIHZvaWQgUGljdHVyZVJlc2V0QVJHQihXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPSBOVUxMOwotICBwaWN0dXJlLT5hcmdiID0gTlVMTDsKLSAgcGljdHVyZS0+YXJnYl9zdHJpZGUgPSAwOwotfQotCi0vLyBSZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBZVVZBIGJ1ZmZlciAoZG9lc24ndCBmcmVlIGFueXRoaW5nKS4KLXN0YXRpYyB2b2lkIFBpY3R1cmVSZXNldFlVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgcGljdHVyZS0+bWVtb3J5XyA9IE5VTEw7Ci0gIHBpY3R1cmUtPnkgPSBwaWN0dXJlLT51ID0gcGljdHVyZS0+diA9IHBpY3R1cmUtPmEgPSBOVUxMOwotICBwaWN0dXJlLT51MCA9IHBpY3R1cmUtPnYwID0gTlVMTDsKLSAgcGljdHVyZS0+eV9zdHJpZGUgPSBwaWN0dXJlLT51dl9zdHJpZGUgPSAwOwotICBwaWN0dXJlLT5hX3N0cmlkZSA9IDA7Ci0gIHBpY3R1cmUtPnV2MF9zdHJpZGUgPSAwOwotfQotCi0vLyBHcmFiIHRoZSAnc3BlY3MnICh3cml0ZXIsICpvcGFxdWUsIHdpZHRoLCBoZWlnaHQuLi4pIGZyb20gJ3NyYycgYW5kIGNvcHkgdGhlbQotLy8gaW50byAnZHN0Jy4gTWFyayAnZHN0JyBhcyBub3Qgb3duaW5nIGFueSBtZW1vcnkuCi1zdGF0aWMgdm9pZCBXZWJQUGljdHVyZUdyYWJTcGVjcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgewotICBTQl9EQ0hFQ0soc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOwotICAqZHN0ID0gKnNyYzsKLSAgUGljdHVyZVJlc2V0WVVWQShkc3QpOwotICBQaWN0dXJlUmVzZXRBUkdCKGRzdCk7Ci19Ci0KLS8vIEFsbG9jYXRlIGEgbmV3IGFyZ2IgYnVmZmVyLCBkaXNjYXJkaW5nIGFueSBleGlzdGluZyBvbmUgYW5kIHByZXNlcnZpbmcKLS8vIHRoZSBvdGhlciBZVVYoQSkgYnVmZmVyLgotc3RhdGljIGludCBQaWN0dXJlQWxsb2NBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIFdlYlBQaWN0dXJlIHRtcDsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHBpY3R1cmUtPm1lbW9yeV9hcmdiXyk7Ci0gIFBpY3R1cmVSZXNldEFSR0IocGljdHVyZSk7Ci0gIHBpY3R1cmUtPnVzZV9hcmdiID0gMTsKLSAgV2ViUFBpY3R1cmVHcmFiU3BlY3MocGljdHVyZSwgJnRtcCk7Ci0gIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOwotICB9Ci0gIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IHRtcC5tZW1vcnlfYXJnYl87Ci0gIHBpY3R1cmUtPmFyZ2IgPSB0bXAuYXJnYjsKLSAgcGljdHVyZS0+YXJnYl9zdHJpZGUgPSB0bXAuYXJnYl9zdHJpZGU7Ci0gIHJldHVybiAxOwotfQotCi0vLyBSZWxlYXNlIG1lbW9yeSBvd25lZCBieSAncGljdHVyZScgKGJvdGggWVVWIGFuZCBBUkdCIGJ1ZmZlcnMpLgotdm9pZCBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShwaWN0dXJlLT5tZW1vcnlfKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKLSAgICBQaWN0dXJlUmVzZXRZVVZBKHBpY3R1cmUpOwotICAgIFBpY3R1cmVSZXNldEFSR0IocGljdHVyZSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBpY3R1cmUgY29weWluZwotCi0vLyBOb3Qgd29ydGggbW92aW5nIHRvIGRzcC9lbmMuYyAob25seSB1c2VkIGhlcmUpLgotc3RhdGljIHZvaWQgQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHdpZHRoKTsKLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgfQotfQotCi0vLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIHRvIGNocm9tYSBzYW1wbGUgcG9zaXRpb24uCi1zdGF0aWMgdm9pZCBTbmFwVG9wTGVmdFBvc2l0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdCwgaW50KiBjb25zdCB0b3ApIHsKLSAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7Ci0gICAgY29uc3QgaW50IGlzX3l1djQyMiA9IElTX1lVVl9DU1AocGljLT5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMik7Ci0gICAgaWYgKElTX1lVVl9DU1AocGljLT5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMCkgfHwgaXNfeXV2NDIyKSB7Ci0gICAgICAqbGVmdCAmPSB+MTsKLSAgICAgIGlmICghaXNfeXV2NDIyKSAqdG9wICY9IH4xOwotICAgIH0KLSAgfQotfQotCi0vLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgc3ViLXJlY3RhbmdsZSBpcyB2YWxpZC4KLXN0YXRpYyBpbnQgQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0LCBpbnQqIGNvbnN0IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFNuYXBUb3BMZWZ0UG9zaXRpb24ocGljLCBsZWZ0LCB0b3ApOwotICBpZiAoKCpsZWZ0KSA8IDAgfHwgKCp0b3ApIDwgMCkgcmV0dXJuIDA7Ci0gIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKLSAgaWYgKCgqbGVmdCkgKyB3aWR0aCA+IHBpYy0+d2lkdGgpIHJldHVybiAwOwotICBpZiAoKCp0b3ApICsgaGVpZ2h0ID4gcGljLT5oZWlnaHQpIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KSB7Ci0gIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChzcmMgPT0gZHN0KSByZXR1cm4gMTsKLQotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7Ci0gIGlmICghV2ViUFBpY3R1cmVBbGxvYyhkc3QpKSByZXR1cm4gMDsKLQotICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKLSAgICBDb3B5UGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLAotICAgICAgICAgICAgICBkc3QtPnksIGRzdC0+eV9zdHJpZGUsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKLSAgICBDb3B5UGxhbmUoc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgZHN0LT51LCBkc3QtPnV2X3N0cmlkZSwgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7Ci0gICAgQ29weVBsYW5lKHNyYy0+diwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgIGRzdC0+diwgZHN0LT51dl9zdHJpZGUsIEhBTFZFKGRzdC0+d2lkdGgpLCBIQUxWRShkc3QtPmhlaWdodCkpOwotICAgIGlmIChkc3QtPmEgIT0gTlVMTCkgIHsKLSAgICAgIENvcHlQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0LT5hLCBkc3QtPmFfc3RyaWRlLCBkc3QtPndpZHRoLCBkc3QtPmhlaWdodCk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKGRzdC0+dTAgIT0gTlVMTCkgIHsKLSAgICAgIGludCB1djBfd2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgaWYgKElTX1lVVl9DU1AoZHN0LT5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMikpIHsKLSAgICAgICAgdXYwX3dpZHRoID0gSEFMVkUodXYwX3dpZHRoKTsKLSAgICAgIH0KLSAgICAgIENvcHlQbGFuZShzcmMtPnUwLCBzcmMtPnV2MF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0LT51MCwgZHN0LT51djBfc3RyaWRlLCB1djBfd2lkdGgsIGRzdC0+aGVpZ2h0KTsKLSAgICAgIENvcHlQbGFuZShzcmMtPnYwLCBzcmMtPnV2MF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0LT52MCwgZHN0LT51djBfc3RyaWRlLCB1djBfd2lkdGgsIGRzdC0+aGVpZ2h0KTsKLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBDb3B5UGxhbmUoKGNvbnN0IHVpbnQ4X3QqKXNyYy0+YXJnYiwgNCAqIHNyYy0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgICh1aW50OF90Kilkc3QtPmFyZ2IsIDQgKiBkc3QtPmFyZ2Jfc3RyaWRlLAotICAgICAgICAgICAgICA0ICogZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChwaWN0dXJlLT51c2VfYXJnYikgewotICAgIHJldHVybiAocGljdHVyZS0+bWVtb3J5X2FyZ2JfID09IE5VTEwpOwotICB9Ci0gIHJldHVybiAocGljdHVyZS0+bWVtb3J5XyA9PSBOVUxMKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlVmlldyhjb25zdCBXZWJQUGljdHVyZSogc3JjLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogZHN0KSB7Ci0gIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgLy8gdmVyaWZ5IHJlY3RhbmdsZSBwb3NpdGlvbi4KLSAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShzcmMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7Ci0KLSAgaWYgKHNyYyAhPSBkc3QpIHsgIC8vIGJld2FyZSBvZiBhbGlhc2luZyEgV2UgZG9uJ3Qgd2FudCB0byBsZWFrICdtZW1vcnlfJy4KLSAgICBXZWJQUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7Ci0gIH0KLSAgZHN0LT53aWR0aCA9IHdpZHRoOwotICBkc3QtPmhlaWdodCA9IGhlaWdodDsKLSAgaWYgKCFzcmMtPnVzZV9hcmdiKSB7Ci0gICAgZHN0LT55ID0gc3JjLT55ICsgdG9wICogc3JjLT55X3N0cmlkZSArIGxlZnQ7Ci0gICAgZHN0LT51ID0gc3JjLT51ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7Ci0gICAgZHN0LT52ID0gc3JjLT52ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7Ci0gICAgZHN0LT55X3N0cmlkZSA9IHNyYy0+eV9zdHJpZGU7Ci0gICAgZHN0LT51dl9zdHJpZGUgPSBzcmMtPnV2X3N0cmlkZTsKLSAgICBpZiAoc3JjLT5hICE9IE5VTEwpIHsKLSAgICAgIGRzdC0+YSA9IHNyYy0+YSArIHRvcCAqIHNyYy0+YV9zdHJpZGUgKyBsZWZ0OwotICAgICAgZHN0LT5hX3N0cmlkZSA9IHNyYy0+YV9zdHJpZGU7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKHNyYy0+dTAgIT0gTlVMTCkgewotICAgICAgY29uc3QgaW50IGxlZnRfcG9zID0KLSAgICAgICAgICBJU19ZVVZfQ1NQKGRzdC0+Y29sb3JzcGFjZSwgV0VCUF9ZVVY0MjIpID8gKGxlZnQgPj4gMSkgOiBsZWZ0OwotICAgICAgZHN0LT51MCA9IHNyYy0+dTAgKyB0b3AgKiBzcmMtPnV2MF9zdHJpZGUgKyBsZWZ0X3BvczsKLSAgICAgIGRzdC0+djAgPSBzcmMtPnYwICsgdG9wICogc3JjLT51djBfc3RyaWRlICsgbGVmdF9wb3M7Ci0gICAgICBkc3QtPnV2MF9zdHJpZGUgPSBzcmMtPnV2MF9zdHJpZGU7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZHN0LT5hcmdiID0gc3JjLT5hcmdiICsgdG9wICogc3JjLT5hcmdiX3N0cmlkZSArIGxlZnQ7Ci0gICAgZHN0LT5hcmdiX3N0cmlkZSA9IHNyYy0+YXJnYl9zdHJpZGU7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQaWN0dXJlIGNyb3BwaW5nCi0KLWludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpYywKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBXZWJQUGljdHVyZSB0bXA7Ci0KLSAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShwaWMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7Ci0KLSAgV2ViUFBpY3R1cmVHcmFiU3BlY3MocGljLCAmdG1wKTsKLSAgdG1wLndpZHRoID0gd2lkdGg7Ci0gIHRtcC5oZWlnaHQgPSBoZWlnaHQ7Ci0gIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgcmV0dXJuIDA7Ci0KLSAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7Ci0gICAgY29uc3QgaW50IHlfb2Zmc2V0ID0gdG9wICogcGljLT55X3N0cmlkZSArIGxlZnQ7Ci0gICAgY29uc3QgaW50IHV2X29mZnNldCA9ICh0b3AgLyAyKSAqIHBpYy0+dXZfc3RyaWRlICsgbGVmdCAvIDI7Ci0gICAgQ29weVBsYW5lKHBpYy0+eSArIHlfb2Zmc2V0LCBwaWMtPnlfc3RyaWRlLAotICAgICAgICAgICAgICB0bXAueSwgdG1wLnlfc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBDb3B5UGxhbmUocGljLT51ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgdG1wLnUsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7Ci0gICAgQ29weVBsYW5lKHBpYy0+diArIHV2X29mZnNldCwgcGljLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgIHRtcC52LCB0bXAudXZfc3RyaWRlLCBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCkpOwotCi0gICAgaWYgKHRtcC5hICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGludCBhX29mZnNldCA9IHRvcCAqIHBpYy0+YV9zdHJpZGUgKyBsZWZ0OwotICAgICAgQ29weVBsYW5lKHBpYy0+YSArIGFfb2Zmc2V0LCBwaWMtPmFfc3RyaWRlLAotICAgICAgICAgICAgICAgIHRtcC5hLCB0bXAuYV9zdHJpZGUsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgIGlmICh0bXAudTAgIT0gTlVMTCkgewotICAgICAgaW50IHcgPSB3aWR0aDsKLSAgICAgIGludCBsZWZ0X3BvcyA9IGxlZnQ7Ci0gICAgICBpZiAoSVNfWVVWX0NTUCh0bXAuY29sb3JzcGFjZSwgV0VCUF9ZVVY0MjIpKSB7Ci0gICAgICAgIHcgPSBIQUxWRSh3KTsKLSAgICAgICAgbGVmdF9wb3MgPSBIQUxWRShsZWZ0X3Bvcyk7Ci0gICAgICB9Ci0gICAgICBDb3B5UGxhbmUocGljLT51MCArIHRvcCAqIHBpYy0+dXYwX3N0cmlkZSArIGxlZnRfcG9zLCBwaWMtPnV2MF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgdG1wLnUwLCB0bXAudXYwX3N0cmlkZSwgdywgaGVpZ2h0KTsKLSAgICAgIENvcHlQbGFuZShwaWMtPnYwICsgdG9wICogcGljLT51djBfc3RyaWRlICsgbGVmdF9wb3MsIHBpYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICB0bXAudjAsIHRtcC51djBfc3RyaWRlLCB3LCBoZWlnaHQpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9Ci0gICAgICAgIChjb25zdCB1aW50OF90KikocGljLT5hcmdiICsgdG9wICogcGljLT5hcmdiX3N0cmlkZSArIGxlZnQpOwotICAgIENvcHlQbGFuZShzcmMsIHBpYy0+YXJnYl9zdHJpZGUgKiA0LAotICAgICAgICAgICAgICAodWludDhfdCopdG1wLmFyZ2IsIHRtcC5hcmdiX3N0cmlkZSAqIDQsCi0gICAgICAgICAgICAgIHdpZHRoICogNCwgaGVpZ2h0KTsKLSAgfQotICBXZWJQUGljdHVyZUZyZWUocGljKTsKLSAgKnBpYyA9IHRtcDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGUgcGljdHVyZSByZXNjYWxlcgotCi1zdGF0aWMgdm9pZCBSZXNjYWxlUGxhbmUoY29uc3QgdWludDhfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbnN0IHdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscykgewotICBXZWJQUmVzY2FsZXIgcmVzY2FsZXI7Ci0gIGludCB5ID0gMDsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcmVzY2FsZXIsIHNyY193aWR0aCwgc3JjX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgc3JjX3dpZHRoLCBkc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgc3JjX2hlaWdodCwgZHN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICB3b3JrKTsKLSAgU2JNZW1vcnlTZXQod29yaywgMCwgMiAqIGRzdF93aWR0aCAqIG51bV9jaGFubmVscyAqIHNpemVvZigqd29yaykpOwotICB3aGlsZSAoeSA8IHNyY19oZWlnaHQpIHsKLSAgICB5ICs9IFdlYlBSZXNjYWxlckltcG9ydCgmcmVzY2FsZXIsIHNyY19oZWlnaHQgLSB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArIHkgKiBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlKTsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnQoJnJlc2NhbGVyKTsKLSAgfQotfQotCi1pbnQgV2ViUFBpY3R1cmVSZXNjYWxlKFdlYlBQaWN0dXJlKiBwaWMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBXZWJQUGljdHVyZSB0bXA7Ci0gIGludCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodDsKLSAgaW50MzJfdCogd29yazsKLQotICBpZiAocGljID09IE5VTEwpIHJldHVybiAwOwotICBwcmV2X3dpZHRoID0gcGljLT53aWR0aDsKLSAgcHJldl9oZWlnaHQgPSBwaWMtPmhlaWdodDsKLSAgLy8gaWYgd2lkdGggaXMgdW5zcGVjaWZpZWQsIHNjYWxlIG9yaWdpbmFsIHByb3BvcnRpb25hbGx5IHRvIGhlaWdodCByYXRpby4KLSAgaWYgKHdpZHRoID09IDApIHsKLSAgICB3aWR0aCA9IChwcmV2X3dpZHRoICogaGVpZ2h0ICsgcHJldl9oZWlnaHQgLyAyKSAvIHByZXZfaGVpZ2h0OwotICB9Ci0gIC8vIGlmIGhlaWdodCBpcyB1bnNwZWNpZmllZCwgc2NhbGUgb3JpZ2luYWwgcHJvcG9ydGlvbmFsbHkgdG8gd2lkdGggcmF0aW8uCi0gIGlmIChoZWlnaHQgPT0gMCkgewotICAgIGhlaWdodCA9IChwcmV2X2hlaWdodCAqIHdpZHRoICsgcHJldl93aWR0aCAvIDIpIC8gcHJldl93aWR0aDsKLSAgfQotICAvLyBDaGVjayBpZiB0aGUgb3ZlcmFsbCBkaW1lbnNpb25zIHN0aWxsIG1ha2Ugc2Vuc2UuCi0gIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKLQotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOwotICB0bXAud2lkdGggPSB3aWR0aDsKLSAgdG1wLmhlaWdodCA9IGhlaWdodDsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKLQotICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKLSAgICB3b3JrID0gKGludDMyX3QqKVdlYlBTYWZlTWFsbG9jKDJVTEwgKiB3aWR0aCwgc2l6ZW9mKCp3b3JrKSk7Ci0gICAgaWYgKHdvcmsgPT0gTlVMTCkgewotICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUmVzY2FsZVBsYW5lKHBpYy0+eSwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsIHBpYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgIHRtcC55LCB3aWR0aCwgaGVpZ2h0LCB0bXAueV9zdHJpZGUsIHdvcmssIDEpOwotICAgIFJlc2NhbGVQbGFuZShwaWMtPnUsCi0gICAgICAgICAgICAgICAgIEhBTFZFKHByZXZfd2lkdGgpLCBIQUxWRShwcmV2X2hlaWdodCksIHBpYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICB0bXAudSwKLSAgICAgICAgICAgICAgICAgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpLCB0bXAudXZfc3RyaWRlLCB3b3JrLCAxKTsKLSAgICBSZXNjYWxlUGxhbmUocGljLT52LAotICAgICAgICAgICAgICAgICBIQUxWRShwcmV2X3dpZHRoKSwgSEFMVkUocHJldl9oZWlnaHQpLCBwaWMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgdG1wLnYsCi0gICAgICAgICAgICAgICAgIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSwgdG1wLnV2X3N0cmlkZSwgd29yaywgMSk7Ci0KLSAgICBpZiAodG1wLmEgIT0gTlVMTCkgewotICAgICAgUmVzY2FsZVBsYW5lKHBpYy0+YSwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsIHBpYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgdG1wLmEsIHdpZHRoLCBoZWlnaHQsIHRtcC5hX3N0cmlkZSwgd29yaywgMSk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKHRtcC51MCAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBpbnQgcyA9IElTX1lVVl9DU1AodG1wLmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIyKSA/IDIgOiAxOwotICAgICAgUmVzY2FsZVBsYW5lKAotICAgICAgICAgIHBpYy0+dTAsIChwcmV2X3dpZHRoICsgcyAvIDIpIC8gcywgcHJldl9oZWlnaHQsIHBpYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICB0bXAudTAsICh3aWR0aCArIHMgLyAyKSAvIHMsIGhlaWdodCwgdG1wLnV2MF9zdHJpZGUsIHdvcmssIDEpOwotICAgICAgUmVzY2FsZVBsYW5lKAotICAgICAgICAgIHBpYy0+djAsIChwcmV2X3dpZHRoICsgcyAvIDIpIC8gcywgcHJldl9oZWlnaHQsIHBpYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICB0bXAudjAsICh3aWR0aCArIHMgLyAyKSAvIHMsIGhlaWdodCwgdG1wLnV2MF9zdHJpZGUsIHdvcmssIDEpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIHdvcmsgPSAoaW50MzJfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoICogNCwgc2l6ZW9mKCp3b3JrKSk7Ci0gICAgaWYgKHdvcmsgPT0gTlVMTCkgewotICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUmVzY2FsZVBsYW5lKChjb25zdCB1aW50OF90KilwaWMtPmFyZ2IsIHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0LAotICAgICAgICAgICAgICAgICBwaWMtPmFyZ2Jfc3RyaWRlICogNCwKLSAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXRtcC5hcmdiLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICB0bXAuYXJnYl9zdHJpZGUgKiA0LAotICAgICAgICAgICAgICAgICB3b3JrLCA0KTsKLSAgfQotICBXZWJQUGljdHVyZUZyZWUocGljKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHdvcmspOwotICAqcGljID0gdG1wOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBNZW1vcnlXcml0ZXI6IFdyaXRlLXRvLW1lbW9yeQotCi12b2lkIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcikgewotICB3cml0ZXItPm1lbSA9IE5VTEw7Ci0gIHdyaXRlci0+c2l6ZSA9IDA7Ci0gIHdyaXRlci0+bWF4X3NpemUgPSAwOwotfQotCi1pbnQgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IHcgPSAoV2ViUE1lbW9yeVdyaXRlciopcGljdHVyZS0+Y3VzdG9tX3B0cjsKLSAgdWludDY0X3QgbmV4dF9zaXplOwotICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgbmV4dF9zaXplID0gKHVpbnQ2NF90KXctPnNpemUgKyBkYXRhX3NpemU7Ci0gIGlmIChuZXh0X3NpemUgPiB3LT5tYXhfc2l6ZSkgewotICAgIHVpbnQ4X3QqIG5ld19tZW07Ci0gICAgdWludDY0X3QgbmV4dF9tYXhfc2l6ZSA9IDJVTEwgKiB3LT5tYXhfc2l6ZTsKLSAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IG5leHRfc2l6ZSkgbmV4dF9tYXhfc2l6ZSA9IG5leHRfc2l6ZTsKLSAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IDgxOTJVTEwpIG5leHRfbWF4X3NpemUgPSA4MTkyVUxMOwotICAgIG5ld19tZW0gPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MobmV4dF9tYXhfc2l6ZSwgMSk7Ci0gICAgaWYgKG5ld19tZW0gPT0gTlVMTCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh3LT5zaXplID4gMCkgewotICAgICAgU2JNZW1vcnlDb3B5KG5ld19tZW0sIHctPm1lbSwgdy0+c2l6ZSk7Ci0gICAgfQotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSh3LT5tZW0pOwotICAgIHctPm1lbSA9IG5ld19tZW07Ci0gICAgLy8gZG93bi1jYXN0IGlzIG9rLCB0aGFua3MgdG8gV2ViUFNhZmVNYWxsb2MKLSAgICB3LT5tYXhfc2l6ZSA9IChzaXplX3QpbmV4dF9tYXhfc2l6ZTsKLSAgfQotICBpZiAoZGF0YV9zaXplID4gMCkgewotICAgIFNiTWVtb3J5Q29weSh3LT5tZW0gKyB3LT5zaXplLCBkYXRhLCBkYXRhX3NpemUpOwotICAgIHctPnNpemUgKz0gZGF0YV9zaXplOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGV0ZWN0aW9uIG9mIG5vbi10cml2aWFsIHRyYW5zcGFyZW5jeQotCi0vLyBSZXR1cm5zIHRydWUgaWYgYWxwaGFbXSBoYXMgbm9uLTB4ZmYgdmFsdWVzLgotc3RhdGljIGludCBDaGVja05vbk9wYXF1ZShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdGVwLCBpbnQgeV9zdGVwKSB7Ci0gIGlmIChhbHBoYSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgd2hpbGUgKGhlaWdodC0tID4gMCkgewotICAgIGludCB4OwotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAqIHhfc3RlcDsgeCArPSB4X3N0ZXApIHsKLSAgICAgIGlmIChhbHBoYVt4XSAhPSAweGZmKSByZXR1cm4gMTsgIC8vIFRPRE8oc2thbCk6IGNoZWNrIDQvOCBieXRlcyBhdCBhIHRpbWUuCi0gICAgfQotICAgIGFscGhhICs9IHlfc3RlcDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gQ2hlY2tpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiBub24tb3BhcXVlIGFscGhhLgotaW50IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOwotICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgcmV0dXJuIENoZWNrTm9uT3BhcXVlKHBpY3R1cmUtPmEsIHBpY3R1cmUtPndpZHRoLCBwaWN0dXJlLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHBpY3R1cmUtPmFfc3RyaWRlKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgeCwgeTsKLSAgICBjb25zdCB1aW50MzJfdCogYXJnYiA9IHBpY3R1cmUtPmFyZ2I7Ci0gICAgaWYgKGFyZ2IgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gICAgZm9yICh5ID0gMDsgeSA8IHBpY3R1cmUtPmhlaWdodDsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgcGljdHVyZS0+d2lkdGg7ICsreCkgewotICAgICAgICBpZiAoYXJnYlt4XSA8IDB4ZmYwMDAwMDB1KSByZXR1cm4gMTsgICAvLyB0ZXN0IGFueSBhbHBoYSB2YWx1ZXMgIT0gMHhmZgotICAgICAgfQotICAgICAgYXJnYiArPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSR0IgLT4gWVVWIGNvbnZlcnNpb24KLQotLy8gVE9ETzogd2UgY2FuIGRvIGJldHRlciB0aGFuIHNpbXBseSAyeDIgYXZlcmFnaW5nIG9uIFUvViBzYW1wbGVzLgotI2RlZmluZSBTVU00KHB0cikgKChwdHIpWzBdICsgKHB0cilbc3RlcF0gKyBcCi0gICAgICAgICAgICAgICAgICAgKHB0cilbcmdiX3N0cmlkZV0gKyAocHRyKVtyZ2Jfc3RyaWRlICsgc3RlcF0pCi0jZGVmaW5lIFNVTTJIKHB0cikgKDIgKiAocHRyKVswXSArIDIgKiAocHRyKVtzdGVwXSkKLSNkZWZpbmUgU1VNMlYocHRyKSAoMiAqIChwdHIpWzBdICsgMiAqIChwdHIpW3JnYl9zdHJpZGVdKQotI2RlZmluZSBTVU0xKHB0cikgICg0ICogKHB0cilbMF0pCi0jZGVmaW5lIFJHQl9UT19VVih4LCB5LCBTVU0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBzcmMgPSAoMiAqIChzdGVwICogKHgpICsgKHkpICogcmdiX3N0cmlkZSkpOyBcCi0gIGNvbnN0IGludCBkc3QgPSAoeCkgKyAoeSkgKiBwaWN0dXJlLT51dl9zdHJpZGU7ICAgICAgICBcCi0gIGNvbnN0IGludCByID0gU1VNKHJfcHRyICsgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBnID0gU1VNKGdfcHRyICsgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBiID0gU1VNKGJfcHRyICsgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHBpY3R1cmUtPnVbZHN0XSA9IFZQOFJHQlRvVShyLCBnLCBiKTsgICAgICAgICAgICAgICAgICBcCi0gIHBpY3R1cmUtPnZbZHN0XSA9IFZQOFJHQlRvVihyLCBnLCBiKTsgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgUkdCX1RPX1VWMCh4X2luLCB4X291dCwgeSwgU1VNKSB7ICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHNyYyA9IChzdGVwICogKHhfaW4pICsgKHkpICogcmdiX3N0cmlkZSk7ICAgIFwKLSAgY29uc3QgaW50IGRzdCA9ICh4X291dCkgKyAoeSkgKiBwaWN0dXJlLT51djBfc3RyaWRlOyAgIFwKLSAgY29uc3QgaW50IHIgPSBTVU0ocl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGcgPSBTVU0oZ19wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGIgPSBTVU0oYl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+dTBbZHN0XSA9IFZQOFJHQlRvVShyLCBnLCBiKTsgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+djBbZHN0XSA9IFZQOFJHQlRvVihyLCBnLCBiKTsgICAgICAgICAgICAgICAgIFwKLX0KLQotc3RhdGljIHZvaWQgTWFrZUdyYXkoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgaW50IHk7Ci0gIGNvbnN0IGludCB1dl93aWR0aCA9IEhBTFZFKHBpY3R1cmUtPndpZHRoKTsKLSAgY29uc3QgaW50IHV2X2hlaWdodCA9IEhBTFZFKHBpY3R1cmUtPmhlaWdodCk7Ci0gIGZvciAoeSA9IDA7IHkgPCB1dl9oZWlnaHQ7ICsreSkgewotICAgIFNiTWVtb3J5U2V0KHBpY3R1cmUtPnUgKyB5ICogcGljdHVyZS0+dXZfc3RyaWRlLCAxMjgsIHV2X3dpZHRoKTsKLSAgICBTYk1lbW9yeVNldChwaWN0dXJlLT52ICsgeSAqIHBpY3R1cmUtPnV2X3N0cmlkZSwgMTI4LCB1dl93aWR0aCk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBJbXBvcnRZVVZBRnJvbVJHQkEoY29uc3QgdWludDhfdCogY29uc3Qgcl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgICAgICAgICAvLyBieXRlcyBwZXIgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLCAgIC8vIGJ5dGVzIHBlciBzY2FubGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgY29uc3QgV2ViUEVuY0NTUCB1dl9jc3AgPSBwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSzsKLSAgaW50IHgsIHk7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotICBjb25zdCBpbnQgaGFzX2FscGhhID0gQ2hlY2tOb25PcGFxdWUoYV9wdHIsIHdpZHRoLCBoZWlnaHQsIHN0ZXAsIHJnYl9zdHJpZGUpOwotCi0gIHBpY3R1cmUtPmNvbG9yc3BhY2UgPSB1dl9jc3A7Ci0gIHBpY3R1cmUtPnVzZV9hcmdiID0gMDsKLSAgaWYgKGhhc19hbHBoYSkgewotICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgfD0gV0VCUF9DU1BfQUxQSEFfQklUOwotICB9Ci0gIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWN0dXJlKSkgcmV0dXJuIDA7Ci0KLSAgLy8gSW1wb3J0IGx1bWEgcGxhbmUKLSAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBzdGVwICogeCArIHkgKiByZ2Jfc3RyaWRlOwotICAgICAgcGljdHVyZS0+eVt4ICsgeSAqIHBpY3R1cmUtPnlfc3RyaWRlXSA9Ci0gICAgICAgICAgVlA4UkdCVG9ZKHJfcHRyW29mZnNldF0sIGdfcHRyW29mZnNldF0sIGJfcHRyW29mZnNldF0pOwotICAgIH0KLSAgfQotCi0gIC8vIERvd25zYW1wbGUgVS9WIHBsYW5lCi0gIGlmICh1dl9jc3AgIT0gV0VCUF9ZVVY0MDApIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgKGhlaWdodCA+PiAxKTsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoID4+IDEpOyArK3gpIHsKLSAgICAgICAgUkdCX1RPX1VWKHgsIHksIFNVTTQpOwotICAgICAgfQotICAgICAgaWYgKHdpZHRoICYgMSkgewotICAgICAgICBSR0JfVE9fVVYoeCwgeSwgU1VNMlYpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGVpZ2h0ICYgMSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8ICh3aWR0aCA+PiAxKTsgKyt4KSB7Ci0gICAgICAgIFJHQl9UT19VVih4LCB5LCBTVU0ySCk7Ci0gICAgICB9Ci0gICAgICBpZiAod2lkdGggJiAxKSB7Ci0gICAgICAgIFJHQl9UT19VVih4LCB5LCBTVU0xKTsKLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgIC8vIFN0b3JlIG9yaWdpbmFsIFUvViBzYW1wbGVzIHRvbwotICAgIGlmICh1dl9jc3AgPT0gV0VCUF9ZVVY0MjIpIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoID4+IDEpOyArK3gpIHsKLSAgICAgICAgICBSR0JfVE9fVVYwKDIgKiB4LCB4LCB5LCBTVU0ySCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdpZHRoICYgMSkgewotICAgICAgICAgIFJHQl9UT19VVjAoMiAqIHgsIHgsIHksIFNVTTEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh1dl9jc3AgPT0gV0VCUF9ZVVY0NDQpIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAgIFJHQl9UT19VVjAoeCwgeCwgeSwgU1VNMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBNYWtlR3JheShwaWN0dXJlKTsKLSAgfQotCi0gIGlmIChoYXNfYWxwaGEpIHsKLSAgICBTQl9EQ0hFQ0soc3RlcCA+PSA0KTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIHBpY3R1cmUtPmFbeCArIHkgKiBwaWN0dXJlLT5hX3N0cmlkZV0gPQotICAgICAgICAgICAgYV9wdHJbc3RlcCAqIHggKyB5ICogcmdiX3N0cmlkZV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEltcG9ydChXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYiwgaW50IHJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHN3YXBfcmIsIGludCBpbXBvcnRfYWxwaGEpIHsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgcl9wdHIgPSByZ2IgKyAoc3dhcF9yYiA/IDIgOiAwKTsKLSAgY29uc3QgdWludDhfdCogY29uc3QgZ19wdHIgPSByZ2IgKyAxOwotICBjb25zdCB1aW50OF90KiBjb25zdCBiX3B0ciA9IHJnYiArIChzd2FwX3JiID8gMCA6IDIpOwotICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciA9IGltcG9ydF9hbHBoYSA/IHJnYiArIDMgOiBOVUxMOwotICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLQotICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgcmV0dXJuIEltcG9ydFlVVkFGcm9tUkdCQShyX3B0ciwgZ19wdHIsIGJfcHRyLCBhX3B0ciwgc3RlcCwgcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUpOwotICB9Ci0gIGlmIChpbXBvcnRfYWxwaGEpIHsKLSAgICBwaWN0dXJlLT5jb2xvcnNwYWNlIHw9IFdFQlBfQ1NQX0FMUEhBX0JJVDsKLSAgfSBlbHNlIHsKLSAgICBwaWN0dXJlLT5jb2xvcnNwYWNlICY9IH5XRUJQX0NTUF9BTFBIQV9CSVQ7Ci0gIH0KLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpY3R1cmUpKSByZXR1cm4gMDsKLQotICBpZiAoIWltcG9ydF9hbHBoYSkgewotICAgIGludCB4LCB5OwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHN0ZXAgKiB4ICsgeSAqIHJnYl9zdHJpZGU7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPQotICAgICAgICAgICAgMHhmZjAwMDAwMHUgfAotICAgICAgICAgICAgKHJfcHRyW29mZnNldF0gPDwgMTYpIHwKLSAgICAgICAgICAgIChnX3B0cltvZmZzZXRdIDw8ICA4KSB8Ci0gICAgICAgICAgICAoYl9wdHJbb2Zmc2V0XSk7Ci0gICAgICAgIHBpY3R1cmUtPmFyZ2JbeCArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZV0gPSBhcmdiOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbnQgeCwgeTsKLSAgICBTQl9EQ0hFQ0soc3RlcCA+PSA0KTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBzdGVwICogeCArIHkgKiByZ2Jfc3RyaWRlOwotICAgICAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKCh1aW50MzJfdClhX3B0cltvZmZzZXRdIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocl9wdHJbb2Zmc2V0XSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdfcHRyW29mZnNldF0gPDwgIDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiX3B0cltvZmZzZXRdKTsKLSAgICAgICAgcGljdHVyZS0+YXJnYlt4ICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlXSA9IGFyZ2I7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotI3VuZGVmIFNVTTQKLSN1bmRlZiBTVU0yVgotI3VuZGVmIFNVTTJICi0jdW5kZWYgU1VNMQotI3VuZGVmIFJHQl9UT19VVgotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0IoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSkgewotICByZXR1cm4gSW1wb3J0KHBpY3R1cmUsIHJnYiwgcmdiX3N0cmlkZSwgMywgMCwgMCk7Ci19Ci0KLWludCBXZWJQUGljdHVyZUltcG9ydEJHUihXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAxLCAwKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCQShXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDAsIDEpOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMSk7Ci19Ci0KLWludCBXZWJQUGljdHVyZUltcG9ydFJHQlgoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgewotICByZXR1cm4gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAwLCAwKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSWChXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDEsIDApOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXV0b21hdGljIFlVViA8LT4gQVJHQiBjb252ZXJzaW9ucy4KLQotaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHBpY3R1cmUtPm1lbW9yeV8gPT0gTlVMTCB8fCBwaWN0dXJlLT55ID09IE5VTEwgfHwKLSAgICAgIHBpY3R1cmUtPnUgPT0gTlVMTCB8fCBwaWN0dXJlLT52ID09IE5VTEwpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUik7Ci0gIH0KLSAgaWYgKChwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSAmJiBwaWN0dXJlLT5hID09IE5VTEwpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUik7Ci0gIH0KLSAgaWYgKChwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSykgIT0gV0VCUF9ZVVY0MjApIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOwotICB9Ci0gIC8vIEFsbG9jYXRlIGEgbmV3IGFyZ2IgYnVmZmVyIChkaXNjYXJkaW5nIHRoZSBwcmV2aW91cyBvbmUpLgotICBpZiAoIVBpY3R1cmVBbGxvY0FSR0IocGljdHVyZSkpIHJldHVybiAwOwotCi0gIC8vIENvbnZlcnQKLSAgewotICAgIGludCB5OwotICAgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICAgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0gICAgY29uc3QgaW50IGFyZ2Jfc3RyaWRlID0gNCAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOwotICAgIHVpbnQ4X3QqIGRzdCA9ICh1aW50OF90KilwaWN0dXJlLT5hcmdiOwotICAgIGNvbnN0IHVpbnQ4X3QgKmN1cl91ID0gcGljdHVyZS0+dSwgKmN1cl92ID0gcGljdHVyZS0+diwgKmN1cl95ID0gcGljdHVyZS0+eTsKLSAgICBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgdXBzYW1wbGUgPSBXZWJQR2V0TGluZVBhaXJDb252ZXJ0ZXIoQUxQSEFfSVNfTEFTVCk7Ci0KLSAgICAvLyBGaXJzdCByb3csIHdpdGggcmVwbGljYXRlZCB0b3Agc2FtcGxlcy4KLSAgICB1cHNhbXBsZShOVUxMLCBjdXJfeSwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIE5VTEwsIGRzdCwgd2lkdGgpOwotICAgIGN1cl95ICs9IHBpY3R1cmUtPnlfc3RyaWRlOwotICAgIGRzdCArPSBhcmdiX3N0cmlkZTsKLSAgICAvLyBDZW50ZXIgcm93cy4KLSAgICBmb3IgKHkgPSAxOyB5ICsgMSA8IGhlaWdodDsgeSArPSAyKSB7Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3BfdSA9IGN1cl91OwotICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wX3YgPSBjdXJfdjsKLSAgICAgIGN1cl91ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKLSAgICAgIGN1cl92ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKLSAgICAgIHVwc2FtcGxlKGN1cl95LCBjdXJfeSArIHBpY3R1cmUtPnlfc3RyaWRlLCB0b3BfdSwgdG9wX3YsIGN1cl91LCBjdXJfdiwKLSAgICAgICAgICAgICAgIGRzdCwgZHN0ICsgYXJnYl9zdHJpZGUsIHdpZHRoKTsKLSAgICAgIGN1cl95ICs9IDIgKiBwaWN0dXJlLT55X3N0cmlkZTsKLSAgICAgIGRzdCArPSAyICogYXJnYl9zdHJpZGU7Ci0gICAgfQotICAgIC8vIExhc3Qgcm93IChpZiBuZWVkZWQpLCB3aXRoIHJlcGxpY2F0ZWQgYm90dG9tIHNhbXBsZXMuCi0gICAgaWYgKGhlaWdodCA+IDEgJiYgIShoZWlnaHQgJiAxKSkgewotICAgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBkc3QsIE5VTEwsIHdpZHRoKTsKLSAgICB9Ci0gICAgLy8gSW5zZXJ0IGFscGhhIHZhbHVlcyBpZiBuZWVkZWQsIGluIHJlcGxhY2VtZW50IGZvciB0aGUgZGVmYXVsdCAweGZmIG9uZXMuCi0gICAgaWYgKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9kc3QgPSBwaWN0dXJlLT5hcmdiICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOwotICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBwaWN0dXJlLT5hICsgeSAqIHBpY3R1cmUtPmFfc3RyaWRlOwotICAgICAgICBpbnQgeDsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgICBhcmdiX2RzdFt4XSA9IChhcmdiX2RzdFt4XSAmIDB4MDBmZmZmZmZ1KSB8ICgodWludDMyX3Qpc3JjW3hdIDw8IDI0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50IFdlYlBQaWN0dXJlQVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSwgV2ViUEVuY0NTUCBjb2xvcnNwYWNlKSB7Ci0gIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOwotICBpZiAocGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOwotICB9IGVsc2UgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFyZ2IgPSAoY29uc3QgdWludDhfdCopcGljdHVyZS0+YXJnYjsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCByID0gQUxQSEFfSVNfTEFTVCA/IGFyZ2IgKyAyIDogYXJnYiArIDE7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgZyA9IEFMUEhBX0lTX0xBU1QgPyBhcmdiICsgMSA6IGFyZ2IgKyAyOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDAgOiBhcmdiICsgMzsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBhID0gQUxQSEFfSVNfTEFTVCA/IGFyZ2IgKyAzIDogYXJnYiArIDA7Ci0gICAgLy8gV2Ugd29yayBvbiBhIHRtcCBjb3B5IG9mICdwaWN0dXJlJywgYmVjYXVzZSBJbXBvcnRZVVZBRnJvbVJHQkEoKQotICAgIC8vIHdvdWxkIGJlIGNhbGxpbmcgV2ViUFBpY3R1cmVGcmVlKHBpY3R1cmUpIG90aGVyd2lzZS4KLSAgICBXZWJQUGljdHVyZSB0bXAgPSAqcGljdHVyZTsKLSAgICBQaWN0dXJlUmVzZXRBUkdCKCZ0bXApOyAgLy8gcmVzZXQgQVJHQiBidWZmZXIgc28gdGhhdCBpdCdzIG5vdCBTYk1lbW9yeURlYWxsb2NhdGUoKSdkLgotICAgIHRtcC51c2VfYXJnYiA9IDA7Ci0gICAgdG1wLmNvbG9yc3BhY2UgPSBjb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSzsKLSAgICBpZiAoIUltcG9ydFlVVkFGcm9tUkdCQShyLCBnLCBiLCBhLCA0LCA0ICogcGljdHVyZS0+YXJnYl9zdHJpZGUsICZ0bXApKSB7Ci0gICAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKLSAgICB9Ci0gICAgLy8gQ29weSBiYWNrIHRoZSBZVVYgc3BlY3MgaW50byAncGljdHVyZScuCi0gICAgdG1wLmFyZ2IgPSBwaWN0dXJlLT5hcmdiOwotICAgIHRtcC5hcmdiX3N0cmlkZSA9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOwotICAgIHRtcC5tZW1vcnlfYXJnYl8gPSBwaWN0dXJlLT5tZW1vcnlfYXJnYl87Ci0gICAgKnBpY3R1cmUgPSB0bXA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWxwZXI6IGNsZWFuIHVwIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEgdG8gaGVscCBjb21wcmVzc2liaWxpdHkuCi0KLSNkZWZpbmUgU0laRSA4Ci0jZGVmaW5lIFNJWkUyIChTSVpFIC8gMikKLXN0YXRpYyBpbnQgaXNfdHJhbnNwYXJlbnRfYXJlYShjb25zdCB1aW50OF90KiBwdHIsIGludCBzdHJpZGUsIGludCBzaXplKSB7Ci0gIGludCB5LCB4OwotICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHNpemU7ICsreCkgewotICAgICAgaWYgKHB0clt4XSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHRyICs9IHN0cmlkZTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZmxhdHRlbih1aW50OF90KiBwdHIsIGludCB2LCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgewotICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewotICAgIFNiTWVtb3J5U2V0KHB0ciwgdiwgc2l6ZSk7Ci0gICAgcHRyICs9IHN0cmlkZTsKLSAgfQotfQotCi12b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKFdlYlBQaWN0dXJlKiBwaWMpIHsKLSAgaW50IHgsIHksIHcsIGg7Ci0gIGNvbnN0IHVpbnQ4X3QqIGFfcHRyOwotICBpbnQgdmFsdWVzWzNdID0geyAwIH07Ci0KLSAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm47Ci0KLSAgYV9wdHIgPSBwaWMtPmE7Ci0gIGlmIChhX3B0ciA9PSBOVUxMKSByZXR1cm47ICAgIC8vIG5vdGhpbmcgdG8gZG8KLQotICB3ID0gcGljLT53aWR0aCAvIFNJWkU7Ci0gIGggPSBwaWMtPmhlaWdodCAvIFNJWkU7Ci0gIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBpbnQgbmVlZF9yZXNldCA9IDE7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewotICAgICAgY29uc3QgaW50IG9mZl9hID0gKHkgKiBwaWMtPmFfc3RyaWRlICsgeCkgKiBTSVpFOwotICAgICAgY29uc3QgaW50IG9mZl95ID0gKHkgKiBwaWMtPnlfc3RyaWRlICsgeCkgKiBTSVpFOwotICAgICAgY29uc3QgaW50IG9mZl91diA9ICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIFNJWkUyOwotICAgICAgaWYgKGlzX3RyYW5zcGFyZW50X2FyZWEoYV9wdHIgKyBvZmZfYSwgcGljLT5hX3N0cmlkZSwgU0laRSkpIHsKLSAgICAgICAgaWYgKG5lZWRfcmVzZXQpIHsKLSAgICAgICAgICB2YWx1ZXNbMF0gPSBwaWMtPnlbb2ZmX3ldOwotICAgICAgICAgIHZhbHVlc1sxXSA9IHBpYy0+dVtvZmZfdXZdOwotICAgICAgICAgIHZhbHVlc1syXSA9IHBpYy0+dltvZmZfdXZdOwotICAgICAgICAgIG5lZWRfcmVzZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGZsYXR0ZW4ocGljLT55ICsgb2ZmX3ksIHZhbHVlc1swXSwgcGljLT55X3N0cmlkZSwgU0laRSk7Ci0gICAgICAgIGZsYXR0ZW4ocGljLT51ICsgb2ZmX3V2LCB2YWx1ZXNbMV0sIHBpYy0+dXZfc3RyaWRlLCBTSVpFMik7Ci0gICAgICAgIGZsYXR0ZW4ocGljLT52ICsgb2ZmX3V2LCB2YWx1ZXNbMl0sIHBpYy0+dXZfc3RyaWRlLCBTSVpFMik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuZWVkX3Jlc2V0ID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWdub3JlIHRoZSBsZWZ0LW92ZXJzIG9uIHJpZ2h0L2JvdHRvbQotICB9Ci19Ci0KLSN1bmRlZiBTSVpFCi0jdW5kZWYgU0laRTIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGxvY2FsLW1pbiBkaXN0b3J0aW9uCi0vLwotLy8gRm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSAqcmVmZXJlbmNlKiBwaWN0dXJlLCB3ZSBzZWFyY2ggZm9yIHRoZSBsb2NhbCBiZXN0Ci0vLyBtYXRjaCBpbiB0aGUgY29tcHJlc3NlZCBpbWFnZS4gVGhpcyBpcyBub3QgYSBzeW1tZXRyaWNhbCBtZWFzdXJlLgotCi0vLyBzZWFyY2ggcmFkaXVzLiBTaG91bGRuJ3QgYmUgdG9vIGxhcmdlLgotI2RlZmluZSBSQURJVVMgMgotCi1zdGF0aWMgZmxvYXQgQWNjdW11bGF0ZUxTSU0oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIGludCByZWZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgewotICBpbnQgeCwgeTsKLSAgZG91YmxlIHRvdGFsX3NzZSA9IDAuOwotICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7Ci0gICAgY29uc3QgaW50IHlfMCA9ICh5IC0gUkFESVVTIDwgMCkgPyAwIDogeSAtIFJBRElVUzsKLSAgICBjb25zdCBpbnQgeV8xID0gKHkgKyBSQURJVVMgKyAxID49IGgpID8gaCA6IHkgKyBSQURJVVMgKyAxOwotICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCB4XzAgPSAoeCAtIFJBRElVUyA8IDApID8gMCA6IHggLSBSQURJVVM7Ci0gICAgICBjb25zdCBpbnQgeF8xID0gKHggKyBSQURJVVMgKyAxID49IHcpID8gdyA6IHggKyBSQURJVVMgKyAxOwotICAgICAgZG91YmxlIGJlc3Rfc3NlID0gMjU1LiAqIDI1NS47Ci0gICAgICBjb25zdCBkb3VibGUgdmFsdWUgPSAoZG91YmxlKXJlZlt5ICogcmVmX3N0cmlkZSArIHhdOwotICAgICAgaW50IGksIGo7Ci0gICAgICBmb3IgKGogPSB5XzA7IGogPCB5XzE7ICsraikgewotICAgICAgICBjb25zdCB1aW50OF90KiBzID0gc3JjICsgaiAqIHNyY19zdHJpZGU7Ci0gICAgICAgIGZvciAoaSA9IHhfMDsgaSA8IHhfMTsgKytpKSB7Ci0gICAgICAgICAgY29uc3QgZG91YmxlIHNzZSA9IChkb3VibGUpKHNbaV0gLSB2YWx1ZSkgKiAoc1tpXSAtIHZhbHVlKTsKLSAgICAgICAgICBpZiAoc3NlIDwgYmVzdF9zc2UpIGJlc3Rfc3NlID0gc3NlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0b3RhbF9zc2UgKz0gYmVzdF9zc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoZmxvYXQpdG90YWxfc3NlOwotfQotI3VuZGVmIFJBRElVUwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGlzdG9ydGlvbgotCi0vLyBNYXggdmFsdWUgcmV0dXJuZWQgaW4gY2FzZSBvZiBleGFjdCBzaW1pbGFyaXR5Lgotc3RhdGljIGNvbnN0IGRvdWJsZSBrTWluRGlzdG9ydGlvbl9kQiA9IDk5LjsKLXN0YXRpYyBmbG9hdCBHZXRQU05SKGNvbnN0IGRvdWJsZSB2KSB7Ci0gIHJldHVybiAoZmxvYXQpKCh2ID4gMC4pID8gLTQuMzQyOTQ0OCAqIGxvZyh2IC8gKDI1NSAqIDI1NS4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbihjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQgcmVzdWx0WzVdKSB7Ci0gIERpc3RvU3RhdHMgc3RhdHNbNV07Ci0gIGludCBoYXNfYWxwaGE7Ci0gIGludCB1dl93LCB1dl9oOwotCi0gIGlmIChzcmMgPT0gTlVMTCB8fCByZWYgPT0gTlVMTCB8fAotICAgICAgc3JjLT53aWR0aCAhPSByZWYtPndpZHRoIHx8IHNyYy0+aGVpZ2h0ICE9IHJlZi0+aGVpZ2h0IHx8Ci0gICAgICBzcmMtPnkgPT0gTlVMTCB8fCByZWYtPnkgPT0gTlVMTCB8fAotICAgICAgc3JjLT51ID09IE5VTEwgfHwgcmVmLT51ID09IE5VTEwgfHwKLSAgICAgIHNyYy0+diA9PSBOVUxMIHx8IHJlZi0+diA9PSBOVUxMIHx8Ci0gICAgICByZXN1bHQgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIC8vIFRPRE8oc2thbCk6IHByb3ZpZGUgZGlzdG9ydGlvbiBmb3IgQVJHQiB0b28uCi0gIGlmIChzcmMtPnVzZV9hcmdiID09IDEgfHwgc3JjLT51c2VfYXJnYiAhPSByZWYtPnVzZV9hcmdiKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBoYXNfYWxwaGEgPSAhIShzcmMtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpOwotICBpZiAoaGFzX2FscGhhICE9ICEhKHJlZi0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgfHwKLSAgICAgIChoYXNfYWxwaGEgJiYgKHNyYy0+YSA9PSBOVUxMIHx8IHJlZi0+YSA9PSBOVUxMKSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIFNiTWVtb3J5U2V0KHN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQotICB1dl93ID0gSEFMVkUoc3JjLT53aWR0aCk7Ci0gIHV2X2ggPSBIQUxWRShzcmMtPmhlaWdodCk7Ci0gIGlmICh0eXBlID49IDIpIHsKLSAgICBmbG9hdCBzc2VbNF07Ci0gICAgc3NlWzBdID0gQWNjdW11bGF0ZUxTSU0oc3JjLT55LCBzcmMtPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+eSwgcmVmLT55X3N0cmlkZSwgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOwotICAgIHNzZVsxXSA9IEFjY3VtdWxhdGVMU0lNKHNyYy0+dSwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT51LCByZWYtPnV2X3N0cmlkZSwgdXZfdywgdXZfaCk7Ci0gICAgc3NlWzJdID0gQWNjdW11bGF0ZUxTSU0oc3JjLT52LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnYsIHJlZi0+dXZfc3RyaWRlLCB1dl93LCB1dl9oKTsKLSAgICBzc2VbM10gPSBoYXNfYWxwaGEgPyBBY2N1bXVsYXRlTFNJTShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5hLCByZWYtPmFfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+d2lkdGgsIHNyYy0+aGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICA6IDAuZjsKLSAgICByZXN1bHRbMF0gPSBHZXRQU05SKHNzZVswXSAvIChzcmMtPndpZHRoICogc3JjLT5oZWlnaHQpKTsKLSAgICByZXN1bHRbMV0gPSBHZXRQU05SKHNzZVsxXSAvICh1dl93ICogdXZfaCkpOwotICAgIHJlc3VsdFsyXSA9IEdldFBTTlIoc3NlWzJdIC8gKHV2X3cgKiB1dl9oKSk7Ci0gICAgcmVzdWx0WzNdID0gR2V0UFNOUihzc2VbM10gLyAoc3JjLT53aWR0aCAqIHNyYy0+aGVpZ2h0KSk7Ci0gICAgewotICAgICAgZG91YmxlIHRvdGFsX3NzZSA9IHNzZVswXSArIHNzZVsxXSArIHNzZVsyXTsKLSAgICAgIGludCB0b3RhbF9waXhlbHMgPSBzcmMtPndpZHRoICogc3JjLT5oZWlnaHQgKyAyICogdXZfdyAqIHV2X2g7Ci0gICAgICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgICAgIHRvdGFsX3BpeGVscyArPSBzcmMtPndpZHRoICogc3JjLT5oZWlnaHQ7Ci0gICAgICAgIHRvdGFsX3NzZSArPSBzc2VbM107Ci0gICAgICB9Ci0gICAgICByZXN1bHRbNF0gPSBHZXRQU05SKHRvdGFsX3NzZSAvIHRvdGFsX3BpeGVscyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGludCBjOwotICAgIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT55LCByZWYtPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsICZzdGF0c1swXSk7Ci0gICAgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShzcmMtPnUsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT51LCByZWYtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2X3csIHV2X2gsICZzdGF0c1sxXSk7Ci0gICAgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT52LCByZWYtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2X3csIHV2X2gsICZzdGF0c1syXSk7Ci0gICAgaWYgKGhhc19hbHBoYSkgewotICAgICAgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+YSwgcmVmLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsICZzdGF0c1szXSk7Ci0gICAgfQotICAgIGZvciAoYyA9IDA7IGMgPD0gNDsgKytjKSB7Ci0gICAgICBpZiAodHlwZSA9PSAxKSB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gVlA4U1NJTUdldCgmc3RhdHNbY10pOwotICAgICAgICByZXN1bHRbY10gPSAoZmxvYXQpKCh2IDwgMS4pID8gLTEwLjAgKiBsb2cxMCgxLiAtIHYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrTWluRGlzdG9ydGlvbl9kQik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBkb3VibGUgdiA9IFZQOFNTSU1HZXRTcXVhcmVkRXJyb3IoJnN0YXRzW2NdKTsKLSAgICAgICAgcmVzdWx0W2NdID0gR2V0UFNOUih2KTsKLSAgICAgIH0KLSAgICAgIC8vIEFjY3VtdWxhdGUgZm9yd2FyZAotICAgICAgaWYgKGMgPCA0KSBWUDhTU0lNQWRkU3RhdHMoJnN0YXRzW2NdLCAmc3RhdHNbNF0pOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZXN0IGhpZ2gtbGV2ZWwgY2FsbHM6Ci0KLXR5cGVkZWYgaW50ICgqSW1wb3J0ZXIpKFdlYlBQaWN0dXJlKiBjb25zdCwgY29uc3QgdWludDhfdCogY29uc3QsIGludCk7Ci0KLXN0YXRpYyBzaXplX3QgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIEltcG9ydGVyIGltcG9ydCwgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIGludCBsb3NzbGVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpIHsKLSAgV2ViUFBpY3R1cmUgcGljOwotICBXZWJQQ29uZmlnIGNvbmZpZzsKLSAgV2ViUE1lbW9yeVdyaXRlciB3cnQ7Ci0gIGludCBvazsKLQotICBpZiAoIVdlYlBDb25maWdQcmVzZXQoJmNvbmZpZywgV0VCUF9QUkVTRVRfREVGQVVMVCwgcXVhbGl0eV9mYWN0b3IpIHx8Ci0gICAgICAhV2ViUFBpY3R1cmVJbml0KCZwaWMpKSB7Ci0gICAgcmV0dXJuIDA7ICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBleGNlcHQgaWYgc3lzdGVtIGluc3RhbGxhdGlvbiBpcyBicm9rZW4KLSAgfQotCi0gIGNvbmZpZy5sb3NzbGVzcyA9ICEhbG9zc2xlc3M7Ci0gIHBpYy51c2VfYXJnYiA9ICEhbG9zc2xlc3M7Ci0gIHBpYy53aWR0aCA9IHdpZHRoOwotICBwaWMuaGVpZ2h0ID0gaGVpZ2h0OwotICBwaWMud3JpdGVyID0gV2ViUE1lbW9yeVdyaXRlOwotICBwaWMuY3VzdG9tX3B0ciA9ICZ3cnQ7Ci0gIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZ3cnQpOwotCi0gIG9rID0gaW1wb3J0KCZwaWMsIHJnYmEsIHN0cmlkZSkgJiYgV2ViUEVuY29kZSgmY29uZmlnLCAmcGljKTsKLSAgV2ViUFBpY3R1cmVGcmVlKCZwaWMpOwotICBpZiAoIW9rKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHdydC5tZW0pOwotICAgICpvdXRwdXQgPSBOVUxMOwotICAgIHJldHVybiAwOwotICB9Ci0gICpvdXRwdXQgPSB3cnQubWVtOwotICByZXR1cm4gd3J0LnNpemU7Ci19Ci0KLSNkZWZpbmUgRU5DT0RFX0ZVTkMoTkFNRSwgSU1QT1JURVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXNpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIGZsb2F0IHEsICAgICAgICAgIFwKLSAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcmV0dXJuIEVuY29kZShpbiwgdywgaCwgYnBzLCBJTVBPUlRFUiwgcSwgMCwgb3V0KTsgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotRU5DT0RFX0ZVTkMoV2ViUEVuY29kZVJHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpOwotRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUJHUiwgV2ViUFBpY3R1cmVJbXBvcnRCR1IpOwotRU5DT0RFX0ZVTkMoV2ViUEVuY29kZVJHQkEsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSk7Ci1FTkNPREVfRlVOQyhXZWJQRW5jb2RlQkdSQSwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKTsKLQotI3VuZGVmIEVOQ09ERV9GVU5DCi0KLSNkZWZpbmUgTE9TU0xFU1NfREVGQVVMVF9RVUFMSVRZIDcwLgotI2RlZmluZSBMT1NTTEVTU19FTkNPREVfRlVOQyhOQU1FLCBJTVBPUlRFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zaXplX3QgTkFNRShjb25zdCB1aW50OF90KiBpbiwgaW50IHcsIGludCBoLCBpbnQgYnBzLCB1aW50OF90Kiogb3V0KSB7ICAgICAgIFwKLSAgcmV0dXJuIEVuY29kZShpbiwgdywgaCwgYnBzLCBJTVBPUlRFUiwgTE9TU0xFU1NfREVGQVVMVF9RVUFMSVRZLCAxLCBvdXQpOyAgXAotfQotCi1MT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NSR0IsIFdlYlBQaWN0dXJlSW1wb3J0UkdCKTsKLUxPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc0JHUiwgV2ViUFBpY3R1cmVJbXBvcnRCR1IpOwotTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKTsKLUxPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSk7Ci0KLSN1bmRlZiBMT1NTTEVTU19FTkNPREVfRlVOQwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9xdWFudC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3F1YW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWIwYjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3F1YW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgIFF1YW50aXphdGlvbgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vY29zdC5oIgotCi0jZGVmaW5lIERPX1RSRUxMSVNfSTQgIDEKLSNkZWZpbmUgRE9fVFJFTExJU19JMTYgMSAgIC8vIG5vdCBhIGh1Z2UgZ2FpbiwgYnV0IG9rIGF0IGxvdyBiaXRyYXRlLgotI2RlZmluZSBET19UUkVMTElTX1VWICAwICAgLy8gZGlzYWJsZSB0cmVsbGlzIGZvciBVVi4gUmlza3kuIE5vdCB3b3J0aC4KLSNkZWZpbmUgVVNFX1RESVNUTyAxCi0KLSNkZWZpbmUgTUlEX0FMUEhBIDY0ICAgICAgLy8gbmV1dHJhbCB2YWx1ZSBmb3Igc3VzY2VwdGliaWxpdHkKLSNkZWZpbmUgTUlOX0FMUEhBIDMwICAgICAgLy8gbG93ZXN0IHVzYWJsZSB2YWx1ZSBmb3Igc3VzY2VwdGliaWxpdHkKLSNkZWZpbmUgTUFYX0FMUEhBIDEwMCAgICAgLy8gaGlnaGVyIG1lYW5pbmZ1bCB2YWx1ZSBmb3Igc3VzY2VwdGliaWxpdHkKLQotI2RlZmluZSBTTlNfVE9fRFEgMC45ICAgICAvLyBTY2FsaW5nIGNvbnN0YW50IGJldHdlZW4gdGhlIHNucyB2YWx1ZSBhbmQgdGhlIFFQCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyLWxhdyBtb2R1bGF0aW9uLiBNdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiAxLgotCi0jZGVmaW5lIEk0X1BFTkFMVFkgNDAwMCAgIC8vIFJhdGUtcGVuYWx0eSBmb3IgcXVpY2sgaTQvaTE2IGRlY2lzaW9uCi0KLSNkZWZpbmUgTVVMVF84QihhLCBiKSAoKChhKSAqIChiKSArIDEyOCkgPj4gOCkKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IG0sIGludCBNKSB7Ci0gIHJldHVybiB2IDwgbSA/IG0gOiB2ID4gTSA/IE0gOiB2OwotfQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKLSAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RjVGFibGVbMTI4XSA9IHsKLSAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTAsCi0gIDExLCAgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE3LAotICAxOCwgICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLCAgMjIsICAyMiwKLSAgMjMsICAgMjMsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI3LCAgMjgsCi0gIDI5LCAgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LAotICAzNywgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKLSAgNDQsICAgNDUsICA0NiwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCi0gIDUxLCAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAotICA1OSwgICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwKLSAgNjcsICAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsCi0gIDc1LCAgIDc2LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLAotICA4MiwgICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwKLSAgOTEsICAgOTMsICA5NSwgIDk2LCAgOTgsIDEwMCwgMTAxLCAxMDIsCi0gIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LAotICAxMjIsIDEyNCwgMTI2LCAxMjgsIDEzMCwgMTMyLCAxMzQsIDEzNiwKLSAgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDgsIDE1MSwgMTU0LCAxNTcKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZVsxMjhdID0gewotICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwKLSAgMTIsICAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksCi0gIDIwLCAgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAotICAyOCwgICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKLSAgMzYsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCi0gIDQ0LCAgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLAotICA1MiwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwKLSAgNjIsICAgNjQsICA2NiwgIDY4LCAgNzAsICA3MiwgIDc0LCAgNzYsCi0gIDc4LCAgIDgwLCAgODIsICA4NCwgIDg2LCAgODgsICA5MCwgIDkyLAotICA5NCwgICA5NiwgIDk4LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwKLSAgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTksIDEyMiwgMTI1LCAxMjgsCi0gIDEzMSwgMTM0LCAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUyLAotICAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywgMTcwLCAxNzMsIDE3NywKLSAgMTgxLCAxODUsIDE4OSwgMTkzLCAxOTcsIDIwMSwgMjA1LCAyMDksCi0gIDIxMywgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzQsIDIzOSwgMjQ1LAotICAyNDksIDI1NCwgMjU5LCAyNjQsIDI2OSwgMjc0LCAyNzksIDI4NAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBY1RhYmxlMlsxMjhdID0gewotICA4LCAgICAgOCwgICA5LCAgMTAsICAxMiwgIDEzLCAgMTUsICAxNywKLSAgMTgsICAgMjAsICAyMSwgIDIzLCAgMjQsICAyNiwgIDI3LCAgMjksCi0gIDMxLCAgIDMyLCAgMzQsICAzNSwgIDM3LCAgMzgsICA0MCwgIDQxLAotICA0MywgICA0NCwgIDQ2LCAgNDgsICA0OSwgIDUxLCAgNTIsICA1NCwKLSAgNTUsICAgNTcsICA1OCwgIDYwLCAgNjIsICA2MywgIDY1LCAgNjYsCi0gIDY4LCAgIDY5LCAgNzEsICA3MiwgIDc0LCAgNzUsICA3NywgIDc5LAotICA4MCwgICA4MiwgIDgzLCAgODUsICA4NiwgIDg4LCAgODksICA5MywKLSAgOTYsICAgOTksIDEwMiwgMTA1LCAxMDgsIDExMSwgMTE0LCAxMTcsCi0gIDEyMCwgMTI0LCAxMjcsIDEzMCwgMTMzLCAxMzYsIDEzOSwgMTQyLAotICAxNDUsIDE0OCwgMTUxLCAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywKLSAgMTcwLCAxNzMsIDE3NiwgMTc5LCAxODQsIDE4OSwgMTkzLCAxOTgsCi0gIDIwMywgMjA3LCAyMTIsIDIxNywgMjIxLCAyMjYsIDIzMCwgMjM1LAotICAyNDAsIDI0NCwgMjQ5LCAyNTQsIDI1OCwgMjYzLCAyNjgsIDI3NCwKLSAgMjgwLCAyODYsIDI5MiwgMjk5LCAzMDUsIDMxMSwgMzE3LCAzMjMsCi0gIDMzMCwgMzM2LCAzNDIsIDM0OCwgMzU0LCAzNjIsIDM3MCwgMzc5LAotICAzODUsIDM5MywgNDAxLCA0MDksIDQxNiwgNDI0LCA0MzIsIDQ0MAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtDb2VmZlRocmVzaFsxNl0gPSB7Ci0gIDAsICAxMCwgMjAsIDMwLAotICAxMCwgMjAsIDMwLCAzMCwKLSAgMjAsIDMwLCAzMCwgMzAsCi0gIDMwLCAzMCwgMzAsIDMwCi19OwotCi0vLyBUT0RPKHNrYWwpOiB0dW5lIG1vcmUuIENvZWZmIHRocmVzaG9sZGluZz8KLXN0YXRpYyBjb25zdCB1aW50OF90IGtCaWFzTWF0cmljZXNbM11bMTZdID0geyAgLy8gWzNdID0gW2x1bWEtYWMsbHVtYS1kYyxjaHJvbWFdCi0gIHsgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYgfSwKLSAgeyA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiB9LAotICB7IDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2IH0KLX07Ci0KLS8vIFNoYXJwZW5pbmcgYnkgKHNsaWdodGx5KSByYWlzaW5nIHRoZSBoaS1mcmVxdWVuY3kgY29lZmZzIChvbmx5IGZvciB0cmVsbGlzKS4KLS8vIEhhY2staXNoIGJ1dCBoZWxwZnVsIGZvciBtaWQtYml0cmF0ZSByYW5nZS4gVXNlIHdpdGggY2FyZS4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtGcmVxU2hhcnBlbmluZ1sxNl0gPSB7Ci0gIDAsICAzMCwgNjAsIDkwLAotICAzMCwgNjAsIDkwLCA5MCwKLSAgNjAsIDkwLCA5MCwgOTAsCi0gIDkwLCA5MCwgOTAsIDkwCi19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5pdGlhbGl6ZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycyBpbiBWUDhNYXRyaXgKLQotLy8gUmV0dXJucyB0aGUgYXZlcmFnZSBxdWFudGl6ZXIKLXN0YXRpYyBpbnQgRXhwYW5kTWF0cml4KFZQOE1hdHJpeCogY29uc3QgbSwgaW50IHR5cGUpIHsKLSAgaW50IGk7Ci0gIGludCBzdW0gPSAwOwotICBmb3IgKGkgPSAyOyBpIDwgMTY7ICsraSkgewotICAgIG0tPnFfW2ldID0gbS0+cV9bMV07Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbaV07Ci0gICAgY29uc3QgaW50IGJpYXMgPSBrQmlhc01hdHJpY2VzW3R5cGVdW2pdOwotICAgIG0tPmlxX1tqXSA9ICgxIDw8IFFGSVgpIC8gbS0+cV9bal07Ci0gICAgbS0+Ymlhc19bal0gPSBCSUFTKGJpYXMpOwotICAgIC8vIFRPRE8oc2thbCk6IHR1bmUga0NvZWZmVGhyZXNoW10KLSAgICBtLT56dGhyZXNoX1tqXSA9ICgoMjU2IC8qKyBrQ29lZmZUaHJlc2hbal0qLyAtIGJpYXMpICogbS0+cV9bal0gKyAxMjcpID4+IDg7Ci0gICAgbS0+c2hhcnBlbl9bal0gPSAoa0ZyZXFTaGFycGVuaW5nW2pdICogbS0+cV9bal0pID4+IDExOwotICAgIHN1bSArPSBtLT5xX1tqXTsKLSAgfQotICByZXR1cm4gKHN1bSArIDgpID4+IDQ7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldHVwTWF0cmljZXMoVlA4RW5jb2RlciogZW5jKSB7Ci0gIGludCBpOwotICBjb25zdCBpbnQgdGxhbWJkYV9zY2FsZSA9Ci0gICAgKGVuYy0+bWV0aG9kXyA+PSA0KSA/IGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0gIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKLSAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgbSA9ICZlbmMtPmRxbV9baV07Ci0gICAgY29uc3QgaW50IHEgPSBtLT5xdWFudF87Ci0gICAgaW50IHE0LCBxMTYsIHF1djsKLSAgICBtLT55MV8ucV9bMF0gPSBrRGNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3kxX2RjXywgMCwgMTI3KV07Ci0gICAgbS0+eTFfLnFfWzFdID0ga0FjVGFibGVbY2xpcChxLCAgICAgICAgICAgICAgICAgIDAsIDEyNyldOwotCi0gICAgbS0+eTJfLnFfWzBdID0ga0RjVGFibGVbIGNsaXAocSArIGVuYy0+ZHFfeTJfZGNfLCAwLCAxMjcpXSAqIDI7Ci0gICAgbS0+eTJfLnFfWzFdID0ga0FjVGFibGUyW2NsaXAocSArIGVuYy0+ZHFfeTJfYWNfLCAwLCAxMjcpXTsKLQotICAgIG0tPnV2Xy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfZGNfLCAwLCAxMTcpXTsKLSAgICBtLT51dl8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3V2X2FjXywgMCwgMTI3KV07Ci0KLSAgICBxNCAgPSBFeHBhbmRNYXRyaXgoJm0tPnkxXywgMCk7Ci0gICAgcTE2ID0gRXhwYW5kTWF0cml4KCZtLT55Ml8sIDEpOwotICAgIHF1diA9IEV4cGFuZE1hdHJpeCgmbS0+dXZfLCAyKTsKLQotICAgIC8vIFRPRE86IFN3aXRjaCB0byBrTGFtYmRhKltdIHRhYmxlcz8KLSAgICB7Ci0gICAgICBtLT5sYW1iZGFfaTRfICA9ICgzICogcTQgKiBxNCkgPj4gNzsKLSAgICAgIG0tPmxhbWJkYV9pMTZfID0gKDMgKiBxMTYgKiBxMTYpOwotICAgICAgbS0+bGFtYmRhX3V2XyAgPSAoMyAqIHF1diAqIHF1dikgPj4gNjsKLSAgICAgIG0tPmxhbWJkYV9tb2RlXyAgICA9ICgxICogcTQgKiBxNCkgPj4gNzsKLSAgICAgIG0tPmxhbWJkYV90cmVsbGlzX2k0XyAgPSAoNyAqIHE0ICogcTQpID4+IDM7Ci0gICAgICBtLT5sYW1iZGFfdHJlbGxpc19pMTZfID0gKHExNiAqIHExNikgPj4gMjsKLSAgICAgIG0tPmxhbWJkYV90cmVsbGlzX3V2XyAgPSAocXV2ICpxdXYpIDw8IDE7Ci0gICAgICBtLT50bGFtYmRhXyAgICAgICAgICAgID0gKHRsYW1iZGFfc2NhbGUgKiBxNCkgPj4gNTsKLSAgICB9Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEluaXRpYWxpemUgZmlsdGVyaW5nIHBhcmFtZXRlcnMKLQotLy8gVmVyeSBzbWFsbCBmaWx0ZXItc3RyZW5ndGggdmFsdWVzIGhhdmUgY2xvc2UgdG8gbm8gdmlzdWFsIGVmZmVjdC4gU28gd2UgY2FuCi0vLyBzYXZlIGEgbGl0dGxlIGRlY29kaW5nLUNQVSBieSB0dXJuaW5nIGZpbHRlcmluZyBvZmYgZm9yIHRoZXNlLgotI2RlZmluZSBGU1RSRU5HVEhfQ1VUT0ZGIDMKLQotc3RhdGljIHZvaWQgU2V0dXBGaWx0ZXJTdHJlbmd0aChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IGk7Ci0gIGNvbnN0IGludCBsZXZlbDAgPSBlbmMtPmNvbmZpZ18tPmZpbHRlcl9zdHJlbmd0aDsKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7Ci0gICAgLy8gU2VnbWVudHMgd2l0aCBsb3dlciBxdWFudGl6ZXIgd2lsbCBiZSBsZXNzIGZpbHRlcmVkLiBUT0RPOiB0dW5lICh3cnQgU05TKQotICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsMCAqIDI1NiAqIGVuYy0+ZHFtX1tpXS5xdWFudF8gLyAxMjg7Ci0gICAgY29uc3QgaW50IGYgPSBsZXZlbCAvICgyNTYgKyBlbmMtPmRxbV9baV0uYmV0YV8pOwotICAgIGVuYy0+ZHFtX1tpXS5mc3RyZW5ndGhfID0gKGYgPCBGU1RSRU5HVEhfQ1VUT0ZGKSA/IDAgOiAoZiA+IDYzKSA/IDYzIDogZjsKLSAgfQotICAvLyBXZSByZWNvcmQgdGhlIGluaXRpYWwgc3RyZW5ndGggKG1haW5seSBmb3IgdGhlIGNhc2Ugb2YgMS1zZWdtZW50IG9ubHkpLgotICBlbmMtPmZpbHRlcl9oZHJfLmxldmVsXyA9IGVuYy0+ZHFtX1swXS5mc3RyZW5ndGhfOwotICBlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPSAoZW5jLT5jb25maWdfLT5maWx0ZXJfdHlwZSA9PSAwKTsKLSAgZW5jLT5maWx0ZXJfaGRyXy5zaGFycG5lc3NfID0gZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBOb3RlOiBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZXMgYmVsb3csIHJlbWVtYmVyIHRoYXQgdGhlIG1heCByYW5nZQotLy8gYWxsb3dlZCBieSB0aGUgc3ludGF4IGZvciBEUV9VViBpcyBbLTE2LDE2XS4KLSNkZWZpbmUgTUFYX0RRX1VWICg2KQotI2RlZmluZSBNSU5fRFFfVVYgKC00KQotCi0vLyBXZSB3YW50IHRvIGVtdWxhdGUganBlZy1saWtlIGJlaGF2aW91ciB3aGVyZSB0aGUgZXhwZWN0ZWQgImdvb2QiIHF1YWxpdHkKLS8vIGlzIGFyb3VuZCBxPTc1LiBJbnRlcm5hbGx5LCBvdXIgImdvb2QiIG1pZGRsZSBpcyBhcm91bmQgYz01MC4gU28gd2UKLS8vIG1hcCBhY2NvcmRpbmdseSB1c2luZyBsaW5lYXIgcGllY2Utd2lzZSBmdW5jdGlvbgotc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9Db21wcmVzc2lvbihkb3VibGUgYykgewotICBjb25zdCBkb3VibGUgbGluZWFyX2MgPSAoYyA8IDAuNzUpID8gYyAqICgyLiAvIDMuKSA6IDIuICogYyAtIDEuOwotICAvLyBUaGUgZmlsZSBzaXplIHJvdWdobHkgc2NhbGVzIGFzIHBvdyhxdWFudGl6ZXIsIDMuKS4gQWN0dWFsbHksIHRoZQotICAvLyBleHBvbmVudCBpcyBzb21ld2hlcmUgYmV0d2VlbiAyLjggYW5kIDMuMiwgYnV0IHdlJ3JlIG1vc3RseSBpbnRlcmVzdGVkCi0gIC8vIGluIHRoZSBtaWQtcXVhbnQgcmFuZ2UuIFNvIHdlIHNjYWxlIHRoZSBjb21wcmVzc2liaWxpdHkgaW52ZXJzZWx5IHRvCi0gIC8vIHRoaXMgcG93ZXItbGF3OiBxdWFudCB+PSBjb21wcmVzc2lvbiBeIDEvMy4gVGhpcyBsYXcgaG9sZHMgd2VsbCBmb3IKLSAgLy8gbG93IHF1YW50LiBGaW5lciBtb2RlbGxpbmcgZm9yIGhpZ2gtcXVhbnQgd291bGQgbWFrZSB1c2Ugb2Yga0FjVGFibGVbXQotICAvLyBtb3JlIGV4cGxpY2l0bHkuCi0gIGNvbnN0IGRvdWJsZSB2ID0gcG93KGxpbmVhcl9jLCAxIC8gMy4pOwotICByZXR1cm4gdjsKLX0KLQotc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oZG91YmxlIGMsIGRvdWJsZSBhbHBoYSkgewotICAvLyBXZSBtYXAgdGhlIGNvbXBsZXhpdHkgJ2FscGhhJyBhbmQgcXVhbGl0eSBzZXR0aW5nICdjJyB0byBhIGNvbXByZXNzaW9uCi0gIC8vIGV4cG9uZW50IGVtcGlyaWNhbGx5IG1hdGNoZWQgdG8gdGhlIGNvbXByZXNzaW9uIGN1cnZlIG9mIGxpYmpwZWc2Yi4KLSAgLy8gT24gYXZlcmFnZSwgdGhlIFdlYlAgb3V0cHV0IHNpemUgd2lsbCBiZSByb3VnaGx5IHNpbWlsYXIgdG8gdGhhdCBvZiBhCi0gIC8vIEpQRUcgZmlsZSBjb21wcmVzc2VkIHdpdGggc2FtZSBxdWFsaXR5IGZhY3Rvci4KLSAgY29uc3QgZG91YmxlIGFtaW4gPSAwLjMwOwotICBjb25zdCBkb3VibGUgYW1heCA9IDAuODU7Ci0gIGNvbnN0IGRvdWJsZSBleHBfbWluID0gMC40OwotICBjb25zdCBkb3VibGUgZXhwX21heCA9IDAuOTsKLSAgY29uc3QgZG91YmxlIHNsb3BlID0gKGV4cF9taW4gLSBleHBfbWF4KSAvIChhbWF4IC0gYW1pbik7Ci0gIC8vIExpbmVhcmx5IGludGVycG9sYXRlICdleHBuJyBmcm9tIGV4cF9taW4gdG8gZXhwX21heAotICAvLyBpbiB0aGUgW2FtaW4sIGFtYXhdIHJhbmdlLgotICBjb25zdCBkb3VibGUgZXhwbiA9IChhbHBoYSA+IGFtYXgpID8gZXhwX21pbgotICAgICAgICAgICAgICAgICAgICA6IChhbHBoYSA8IGFtaW4pID8gZXhwX21heAotICAgICAgICAgICAgICAgICAgICA6IGV4cF9tYXggKyBzbG9wZSAqIChhbHBoYSAtIGFtaW4pOwotICBjb25zdCBkb3VibGUgdiA9IHBvdyhjLCBleHBuKTsKLSAgcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBpbnQgU2VnbWVudHNBcmVFcXVpdmFsZW50KGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMikgewotICByZXR1cm4gKFMxLT5xdWFudF8gPT0gUzItPnF1YW50XykgJiYgKFMxLT5mc3RyZW5ndGhfID09IFMyLT5mc3RyZW5ndGhfKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxpZnlTZWdtZW50cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IG1hcFtOVU1fTUJfU0VHTUVOVFNdID0geyAwLCAxLCAyLCAzIH07Ci0gIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOwotICBpbnQgbnVtX2ZpbmFsX3NlZ21lbnRzID0gMTsKLSAgaW50IHMxLCBzMjsKLSAgZm9yIChzMSA9IDE7IHMxIDwgbnVtX3NlZ21lbnRzOyArK3MxKSB7ICAgIC8vIGZpbmQgc2ltaWxhciBzZWdtZW50cwotICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMSA9ICZlbmMtPmRxbV9bczFdOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHNpbWlsYXIgc2VnbWVudAotICAgIGZvciAoczIgPSAwOyBzMiA8IG51bV9maW5hbF9zZWdtZW50czsgKytzMikgewotICAgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMyID0gJmVuYy0+ZHFtX1tzMl07Ci0gICAgICBpZiAoU2VnbWVudHNBcmVFcXVpdmFsZW50KFMxLCBTMikpIHsKLSAgICAgICAgZm91bmQgPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWFwW3MxXSA9IHMyOwotICAgIGlmICghZm91bmQpIHsKLSAgICAgIGlmIChudW1fZmluYWxfc2VnbWVudHMgIT0gczEpIHsKLSAgICAgICAgZW5jLT5kcW1fW251bV9maW5hbF9zZWdtZW50c10gPSBlbmMtPmRxbV9bczFdOwotICAgICAgfQotICAgICAgKytudW1fZmluYWxfc2VnbWVudHM7Ci0gICAgfQotICB9Ci0gIGlmIChudW1fZmluYWxfc2VnbWVudHMgPCBudW1fc2VnbWVudHMpIHsgIC8vIFJlbWFwCi0gICAgaW50IGkgPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKLSAgICB3aGlsZSAoaS0tID4gMCkgZW5jLT5tYl9pbmZvX1tpXS5zZWdtZW50XyA9IG1hcFtlbmMtPm1iX2luZm9fW2ldLnNlZ21lbnRfXTsKLSAgICBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfID0gbnVtX2ZpbmFsX3NlZ21lbnRzOwotICAgIC8vIFJlcGxpY2F0ZSB0aGUgdHJhaWxpbmcgc2VnbWVudCBpbmZvcyAoaXQncyBtb3N0bHkgY29zbWV0aWNzKQotICAgIGZvciAoaSA9IG51bV9maW5hbF9zZWdtZW50czsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7Ci0gICAgICBlbmMtPmRxbV9baV0gPSBlbmMtPmRxbV9bbnVtX2ZpbmFsX3NlZ21lbnRzIC0gMV07Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVlA4U2V0U2VnbWVudFBhcmFtcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsIGZsb2F0IHF1YWxpdHkpIHsKLSAgaW50IGk7Ci0gIGludCBkcV91dl9hYywgZHFfdXZfZGM7Ci0gIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOwotICBjb25zdCBkb3VibGUgYW1wID0gU05TX1RPX0RRICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDAuIC8gMTI4LjsKLSAgY29uc3QgZG91YmxlIFEgPSBxdWFsaXR5IC8gMTAwLjsKLSAgY29uc3QgZG91YmxlIGNfYmFzZSA9IGVuYy0+Y29uZmlnXy0+ZW11bGF0ZV9qcGVnX3NpemUgPwotICAgICAgUXVhbGl0eVRvSlBFR0NvbXByZXNzaW9uKFEsIGVuYy0+YWxwaGFfIC8gMjU1LikgOgotICAgICAgUXVhbGl0eVRvQ29tcHJlc3Npb24oUSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc2VnbWVudHM7ICsraSkgewotICAgIC8vIFdlIG1vZHVsYXRlIHRoZSBiYXNlIGNvZWZmaWNpZW50IHRvIGFjY29tbW9kYXRlIGZvciB0aGUgcXVhbnRpemF0aW9uCi0gICAgLy8gc3VzY2VwdGliaWxpdHkgYW5kIGFsbG93IGRlbnNlciBzZWdtZW50cyB0byBiZSBxdWFudGl6ZWQgbW9yZS4KLSAgICBjb25zdCBkb3VibGUgZXhwbiA9IDEuIC0gYW1wICogZW5jLT5kcW1fW2ldLmFscGhhXzsKLSAgICBjb25zdCBkb3VibGUgYyA9IHBvdyhjX2Jhc2UsIGV4cG4pOwotICAgIGNvbnN0IGludCBxID0gKGludCkoMTI3LiAqICgxLiAtIGMpKTsKLSAgICBTQl9EQ0hFQ0soZXhwbiA+IDAuKTsKLSAgICBlbmMtPmRxbV9baV0ucXVhbnRfID0gY2xpcChxLCAwLCAxMjcpOwotICB9Ci0KLSAgLy8gcHVyZWx5IGluZGljYXRpdmUgaW4gdGhlIGJpdHN0cmVhbSAoZXhjZXB0IGZvciB0aGUgMS1zZWdtZW50IGNhc2UpCi0gIGVuYy0+YmFzZV9xdWFudF8gPSBlbmMtPmRxbV9bMF0ucXVhbnRfOwotCi0gIC8vIGZpbGwtaW4gdmFsdWVzIGZvciB0aGUgdW51c2VkIHNlZ21lbnRzIChyZXF1aXJlZCBieSB0aGUgc3ludGF4KQotICBmb3IgKGkgPSBudW1fc2VnbWVudHM7IGkgPCBOVU1fTUJfU0VHTUVOVFM7ICsraSkgewotICAgIGVuYy0+ZHFtX1tpXS5xdWFudF8gPSBlbmMtPmJhc2VfcXVhbnRfOwotICB9Ci0KLSAgLy8gdXZfYWxwaGFfIGlzIG5vcm1hbGx5IHNwcmVhZCBhcm91bmQgfjYwLiBUaGUgdXNlZnVsIHJhbmdlIGlzCi0gIC8vIHR5cGljYWxseSB+MzAgKHF1aXRlIGJhZCkgdG8gfjEwMCAob2sgdG8gZGVjaW1hdGUgVVYgbW9yZSkuCi0gIC8vIFdlIG1hcCBpdCB0byB0aGUgc2FmZSBtYXhpbWFsIHJhbmdlIG9mIE1BWC9NSU5fRFFfVVYgZm9yIGRxX3V2LgotICBkcV91dl9hYyA9IChlbmMtPnV2X2FscGhhXyAtIE1JRF9BTFBIQSkgKiAoTUFYX0RRX1VWIC0gTUlOX0RRX1VWKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoTUFYX0FMUEhBIC0gTUlOX0FMUEhBKTsKLSAgLy8gd2UgcmVzY2FsZSBieSB0aGUgdXNlci1kZWZpbmVkIHN0cmVuZ3RoIG9mIGFkYXB0YXRpb24KLSAgZHFfdXZfYWMgPSBkcV91dl9hYyAqIGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoIC8gMTAwOwotICAvLyBhbmQgbWFrZSBpdCBzYWZlLgotICBkcV91dl9hYyA9IGNsaXAoZHFfdXZfYWMsIE1JTl9EUV9VViwgTUFYX0RRX1VWKTsKLSAgLy8gV2UgYWxzbyBib29zdCB0aGUgZGMtdXYtcXVhbnQgYSBsaXR0bGUsIGJhc2VkIG9uIHNucy1zdHJlbmd0aCwgc2luY2UKLSAgLy8gVS9WIGNoYW5uZWxzIGFyZSBxdWl0ZSBtb3JlIHJlYWN0aXZlIHRvIGhpZ2ggcXVhbnRzIChmbGF0IERDLWJsb2NrcwotICAvLyB0ZW5kIHRvIGFwcGVhciwgYW5kIGFyZSBkaXNwbGVhc2FudCkuCi0gIGRxX3V2X2RjID0gLTQgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMDsKLSAgZHFfdXZfZGMgPSBjbGlwKGRxX3V2X2RjLCAtMTUsIDE1KTsgICAvLyA0Yml0LXNpZ25lZCBtYXggYWxsb3dlZAotCi0gIGVuYy0+ZHFfeTFfZGNfID0gMDsgICAgICAgLy8gVE9ETyhza2FsKTogZHEtbHVtCi0gIGVuYy0+ZHFfeTJfZGNfID0gMDsKLSAgZW5jLT5kcV95Ml9hY18gPSAwOwotICBlbmMtPmRxX3V2X2RjXyA9IGRxX3V2X2RjOwotICBlbmMtPmRxX3V2X2FjXyA9IGRxX3V2X2FjOwotCi0gIFNldHVwRmlsdGVyU3RyZW5ndGgoZW5jKTsgICAvLyBpbml0aWFsaXplIHNlZ21lbnRzJyBmaWx0ZXJpbmcsIGV2ZW50dWFsbHkKLQotICBpZiAobnVtX3NlZ21lbnRzID4gMSkgU2ltcGxpZnlTZWdtZW50cyhlbmMpOwotCi0gIFNldHVwTWF0cmljZXMoZW5jKTsgICAgICAgICAvLyBmaW5hbGl6ZSBxdWFudGl6YXRpb24gbWF0cmljZXMKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZvcm0gdGhlIHByZWRpY3Rpb25zIGluIGNhY2hlCi0KLS8vIE11c3QgYmUgb3JkZXJlZCB1c2luZyB7RENfUFJFRCwgVE1fUFJFRCwgVl9QUkVELCBIX1BSRUR9IGFzIGluZGV4Ci1jb25zdCBpbnQgVlA4STE2TW9kZU9mZnNldHNbNF0gPSB7IEkxNkRDMTYsIEkxNlRNMTYsIEkxNlZFMTYsIEkxNkhFMTYgfTsKLWNvbnN0IGludCBWUDhVVk1vZGVPZmZzZXRzWzRdID0geyBDOERDOCwgQzhUTTgsIEM4VkU4LCBDOEhFOCB9OwotCi0vLyBNdXN0IGJlIGluZGV4ZWQgdXNpbmcge0JfRENfUFJFRCAtPiBCX0hVX1BSRUR9IGFzIGluZGV4Ci1jb25zdCBpbnQgVlA4STRNb2RlT2Zmc2V0c1tOVU1fQk1PREVTXSA9IHsKLSAgSTREQzQsIEk0VE00LCBJNFZFNCwgSTRIRTQsIEk0UkQ0LCBJNFZSNCwgSTRMRDQsIEk0Vkw0LCBJNEhENCwgSTRIVTQKLX07Ci0KLXZvaWQgVlA4TWFrZUx1bWExNlByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgbGVmdCA9IGl0LT54XyA/IGVuYy0+eV9sZWZ0XyA6IE5VTEw7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT55XyA/IGVuYy0+eV90b3BfICsgaXQtPnhfICogMTYgOiBOVUxMOwotICBWUDhFbmNQcmVkTHVtYTE2KGl0LT55dXZfcF8sIGxlZnQsIHRvcCk7Ci19Ci0KLXZvaWQgVlA4TWFrZUNocm9tYThQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+eF8gPyBlbmMtPnVfbGVmdF8gOiBOVUxMOwotICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+eV8gPyBlbmMtPnV2X3RvcF8gKyBpdC0+eF8gKiAxNiA6IE5VTEw7Ci0gIFZQOEVuY1ByZWRDaHJvbWE4KGl0LT55dXZfcF8sIGxlZnQsIHRvcCk7Ci19Ci0KLXZvaWQgVlA4TWFrZUludHJhNFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBWUDhFbmNQcmVkTHVtYTQoaXQtPnl1dl9wXywgaXQtPmk0X3RvcF8pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUXVhbnRpemUKLQotLy8gTGF5b3V0OgotLy8gKy0tLS0rCi0vLyB8WVlZWXwgMAotLy8gfFlZWVl8IDQKLS8vIHxZWVlZfCA4Ci0vLyB8WVlZWXwgMTIKLS8vICstLS0tKwotLy8gfFVVVlZ8IDE2Ci0vLyB8VVVWVnwgMjAKLS8vICstLS0tKwotCi1jb25zdCBpbnQgVlA4U2NhblsxNiArIDQgKyA0XSA9IHsKLSAgLy8gTHVtYQotICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKLSAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCi0gIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAotICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUywKLQotICAwICsgMCAqIEJQUywgICA0ICsgMCAqIEJQUywgMCArIDQgKiBCUFMsICA0ICsgNCAqIEJQUywgICAgLy8gVQotICA4ICsgMCAqIEJQUywgIDEyICsgMCAqIEJQUywgOCArIDQgKiBCUFMsIDEyICsgNCAqIEJQUyAgICAgLy8gVgotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERpc3RvcnRpb24gbWVhc3VyZW1lbnQKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRZWzE2XSA9IHsKLSAgMzgsIDMyLCAyMCwgOSwgMzIsIDI4LCAxNywgNywgMjAsIDE3LCAxMCwgNCwgOSwgNywgNCwgMgotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRUcmVsbGlzWzE2XSA9IHsKLSNpZiBVU0VfVERJU1RPID09IDAKLSAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKLSNlbHNlCi0gIDMwLCAyNywgMTksIDExLAotICAyNywgMjQsIDE3LCAxMCwKLSAgMTksIDE3LCAxMiwgIDgsCi0gIDExLCAxMCwgIDgsICA2Ci0jZW5kaWYKLX07Ci0KLS8vIEluaXQvQ29weSB0aGUgY29tbW9uIGZpZWxkcyBpbiBzY29yZS4KLXN0YXRpYyB2b2lkIEluaXRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIHJkLT5EICA9IDA7Ci0gIHJkLT5TRCA9IDA7Ci0gIHJkLT5SICA9IDA7Ci0gIHJkLT5ueiA9IDA7Ci0gIHJkLT5zY29yZSA9IE1BWF9DT1NUOwotfQotCi1zdGF0aWMgdm9pZCBDb3B5U2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCBkc3QsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3Qgc3JjKSB7Ci0gIGRzdC0+RCAgPSBzcmMtPkQ7Ci0gIGRzdC0+U0QgPSBzcmMtPlNEOwotICBkc3QtPlIgID0gc3JjLT5SOwotICBkc3QtPm56ID0gc3JjLT5uejsgICAgICAvLyBub3RlIHRoYXQgbnogaXMgbm90IGFjY3VtdWxhdGVkLCBidXQganVzdCBjb3BpZWQuCi0gIGRzdC0+c2NvcmUgPSBzcmMtPnNjb3JlOwotfQotCi1zdGF0aWMgdm9pZCBBZGRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKLSAgZHN0LT5EICArPSBzcmMtPkQ7Ci0gIGRzdC0+U0QgKz0gc3JjLT5TRDsKLSAgZHN0LT5SICArPSBzcmMtPlI7Ci0gIGRzdC0+bnogfD0gc3JjLT5uejsgICAgIC8vIGhlcmUsIG5ldyBueiBiaXRzIGFyZSBhY2N1bXVsYXRlZC4KLSAgZHN0LT5zY29yZSArPSBzcmMtPnNjb3JlOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGVyZm9ybXMgdHJlbGxpcy1vcHRpbWl6ZWQgcXVhbnRpemF0aW9uLgotCi0vLyBUcmVsbGlzCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHByZXY7ICAgICAgICAvLyBiZXN0IHByZXZpb3VzCi0gIGludCBsZXZlbDsgICAgICAgLy8gbGV2ZWwKLSAgaW50IHNpZ247ICAgICAgICAvLyBzaWduIG9mIGNvZWZmX2kKLSAgc2NvcmVfdCBjb3N0OyAgICAvLyBiaXQgY29zdAotICBzY29yZV90IGVycm9yOyAgIC8vIGRpc3RvcnRpb24gPSBzdW0gb2YgKHxjb2VmZl9pfCAtIGxldmVsX2kgKiBRX2kpXjIKLSAgaW50IGN0eDsgICAgICAgICAvLyBjb250ZXh0IChvbmx5IGRlcGVuZHMgb24gJ2xldmVsJy4gQ291bGQgYmUgc3BhcmVkLikKLX0gTm9kZTsKLQotLy8gSWYgYSBjb2VmZmljaWVudCB3YXMgcXVhbnRpemVkIHRvIGEgdmFsdWUgUSAodXNpbmcgYSBuZXV0cmFsIGJpYXMpLAotLy8gd2UgdGVzdCBhbGwgYWx0ZXJuYXRlIHBvc3NpYmlsaXRpZXMgYmV0d2VlbiBbUS1NSU5fREVMVEEsIFErTUFYX0RFTFRBXQotLy8gV2UgZG9uJ3QgdGVzdCBuZWdhdGl2ZSB2YWx1ZXMgdGhvdWdoLgotI2RlZmluZSBNSU5fREVMVEEgMCAgIC8vIGhvdyBtdWNoIGxvd2VyIGxldmVsIHRvIHRyeQotI2RlZmluZSBNQVhfREVMVEEgMSAgIC8vIGhvdyBtdWNoIGhpZ2hlcgotI2RlZmluZSBOVU1fTk9ERVMgKE1JTl9ERUxUQSArIDEgKyBNQVhfREVMVEEpCi0jZGVmaW5lIE5PREUobiwgbCkgKG5vZGVzWyhuKSArIDFdWyhsKSArIE1JTl9ERUxUQV0pCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNldFJEU2NvcmUoaW50IGxhbWJkYSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICAvLyBUT0RPOiBpbmNvcnBvcmF0ZSB0aGUgIiogMjU2IiBpbiB0aGUgdGFibGVzPwotICByZC0+c2NvcmUgPSByZC0+UiAqIGxhbWJkYSArIDI1NiAqIChyZC0+RCArIHJkLT5TRCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBzY29yZV90IFJEU2NvcmVUcmVsbGlzKGludCBsYW1iZGEsIHNjb3JlX3QgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3QgZGlzdG9ydGlvbikgewotICByZXR1cm4gcmF0ZSAqIGxhbWJkYSArIDI1NiAqIGRpc3RvcnRpb247Ci19Ci0KLXN0YXRpYyBpbnQgVHJlbGxpc1F1YW50aXplQmxvY2soY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4MCwgaW50IGNvZWZmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFtYmRhKSB7Ci0gIFByb2JhQXJyYXkqIGNvbnN0IGxhc3RfY29zdHMgPSBpdC0+ZW5jXy0+cHJvYmFfLmNvZWZmc19bY29lZmZfdHlwZV07Ci0gIENvc3RBcnJheSogY29uc3QgY29zdHMgPSBpdC0+ZW5jXy0+cHJvYmFfLmxldmVsX2Nvc3RfW2NvZWZmX3R5cGVdOwotICBjb25zdCBpbnQgZmlyc3QgPSAoY29lZmZfdHlwZSA9PSAwKSA/IDEgOiAwOwotICBOb2RlIG5vZGVzWzE3XVtOVU1fTk9ERVNdOwotICBpbnQgYmVzdF9wYXRoWzNdID0gey0xLCAtMSwgLTF9OyAgIC8vIHN0b3JlIGJlc3QtbGFzdC9iZXN0LWxldmVsL2Jlc3QtcHJldmlvdXMKLSAgc2NvcmVfdCBiZXN0X3Njb3JlOwotICBpbnQgYmVzdF9ub2RlOwotICBpbnQgbGFzdCA9IGZpcnN0IC0gMTsKLSAgaW50IG4sIG0sIHAsIG56OwotCi0gIHsKLSAgICBzY29yZV90IGNvc3Q7Ci0gICAgc2NvcmVfdCBtYXhfZXJyb3I7Ci0gICAgY29uc3QgaW50IHRocmVzaCA9IG10eC0+cV9bMV0gKiBtdHgtPnFfWzFdIC8gNDsKLSAgICBjb25zdCBpbnQgbGFzdF9wcm9iYSA9IGxhc3RfY29zdHNbVlA4RW5jQmFuZHNbZmlyc3RdXVtjdHgwXVswXTsKLQotICAgIC8vIGNvbXB1dGUgbWF4aW1hbCBkaXN0b3J0aW9uLgotICAgIG1heF9lcnJvciA9IDA7Ci0gICAgZm9yIChuID0gZmlyc3Q7IG4gPCAxNjsgKytuKSB7Ci0gICAgICBjb25zdCBpbnQgaiAgPSBrWmlnemFnW25dOwotICAgICAgY29uc3QgaW50IGVyciA9IGluW2pdICogaW5bal07Ci0gICAgICBtYXhfZXJyb3IgKz0ga1dlaWdodFRyZWxsaXNbal0gKiBlcnI7Ci0gICAgICBpZiAoZXJyID4gdGhyZXNoKSBsYXN0ID0gbjsKLSAgICB9Ci0gICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBnbyBpbnNwZWN0IHVwIHRvIG4gPSAxNiBjb2VmZnMuIFdlIGNhbiBqdXN0IGdvIHVwCi0gICAgLy8gdG8gbGFzdCArIDEgKGluY2x1c2l2ZSkgd2l0aG91dCBsb3NpbmcgbXVjaC4KLSAgICBpZiAobGFzdCA8IDE1KSArK2xhc3Q7Ci0KLSAgICAvLyBjb21wdXRlICdza2lwJyBzY29yZS4gVGhpcyBpcyB0aGUgbWF4IHNjb3JlIG9uZSBjYW4gZG8uCi0gICAgY29zdCA9IFZQOEJpdENvc3QoMCwgbGFzdF9wcm9iYSk7Ci0gICAgYmVzdF9zY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgbWF4X2Vycm9yKTsKLQotICAgIC8vIGluaXRpYWxpemUgc291cmNlIG5vZGUuCi0gICAgbiA9IGZpcnN0IC0gMTsKLSAgICBmb3IgKG0gPSAtTUlOX0RFTFRBOyBtIDw9IE1BWF9ERUxUQTsgKyttKSB7Ci0gICAgICBOT0RFKG4sIG0pLmNvc3QgPSAwOwotICAgICAgTk9ERShuLCBtKS5lcnJvciA9IG1heF9lcnJvcjsKLSAgICAgIE5PREUobiwgbSkuY3R4ID0gY3R4MDsKLSAgICB9Ci0gIH0KLQotICAvLyB0cmF2ZXJzZSB0cmVsbGlzLgotICBmb3IgKG4gPSBmaXJzdDsgbiA8PSBsYXN0OyArK24pIHsKLSAgICBjb25zdCBpbnQgaiAgPSBrWmlnemFnW25dOwotICAgIGNvbnN0IGludCBRICA9IG10eC0+cV9bal07Ci0gICAgY29uc3QgaW50IGlRID0gbXR4LT5pcV9bal07Ci0gICAgY29uc3QgaW50IEIgPSBCSUFTKDB4MDApOyAgICAgLy8gbmV1dHJhbCBiaWFzCi0gICAgLy8gbm90ZTogaXQncyBpbXBvcnRhbnQgdG8gdGFrZSBzaWduIG9mIHRoZSBfb3JpZ2luYWxfIGNvZWZmLAotICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gY29uc2lkZXIgbGV2ZWwgPCAwIGFmdGVyd2FyZC4KLSAgICBjb25zdCBpbnQgc2lnbiA9IChpbltqXSA8IDApOwotICAgIGludCBjb2VmZjAgPSAoc2lnbiA/IC1pbltqXSA6IGluW2pdKSArIG10eC0+c2hhcnBlbl9bal07Ci0gICAgaW50IGxldmVsMDsKLSAgICBpZiAoY29lZmYwID4gMjA0NykgY29lZmYwID0gMjA0NzsKLQotICAgIGxldmVsMCA9IFFVQU5URElWKGNvZWZmMCwgaVEsIEIpOwotICAgIC8vIHRlc3QgYWxsIGFsdGVybmF0ZSBsZXZlbCB2YWx1ZXMgYXJvdW5kIGxldmVsMC4KLSAgICBmb3IgKG0gPSAtTUlOX0RFTFRBOyBtIDw9IE1BWF9ERUxUQTsgKyttKSB7Ci0gICAgICBOb2RlKiBjb25zdCBjdXIgPSAmTk9ERShuLCBtKTsKLSAgICAgIGludCBkZWx0YV9lcnJvciwgbmV3X2Vycm9yOwotICAgICAgc2NvcmVfdCBjdXJfc2NvcmUgPSBNQVhfQ09TVDsKLSAgICAgIGludCBsZXZlbCA9IGxldmVsMCArIG07Ci0gICAgICBpbnQgbGFzdF9wcm9iYTsKLQotICAgICAgY3VyLT5zaWduID0gc2lnbjsKLSAgICAgIGN1ci0+bGV2ZWwgPSBsZXZlbDsKLSAgICAgIGN1ci0+Y3R4ID0gKGxldmVsID09IDApID8gMCA6IChsZXZlbCA9PSAxKSA/IDEgOiAyOwotICAgICAgaWYgKGxldmVsID49IDIwNDggfHwgbGV2ZWwgPCAwKSB7ICAgLy8gbm9kZSBpcyBkZWFkPwotICAgICAgICBjdXItPmNvc3QgPSBNQVhfQ09TVDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBsYXN0X3Byb2JhID0gbGFzdF9jb3N0c1tWUDhFbmNCYW5kc1tuICsgMV1dW2N1ci0+Y3R4XVswXTsKLQotICAgICAgLy8gQ29tcHV0ZSBkZWx0YV9lcnJvciA9IGhvdyBtdWNoIGNvZGluZyB0aGlzIGxldmVsIHdpbGwKLSAgICAgIC8vIHN1YnRyYWN0IGFzIGRpc3RvcnRpb24gdG8gbWF4X2Vycm9yCi0gICAgICBuZXdfZXJyb3IgPSBjb2VmZjAgLSBsZXZlbCAqIFE7Ci0gICAgICBkZWx0YV9lcnJvciA9Ci0gICAgICAgIGtXZWlnaHRUcmVsbGlzW2pdICogKGNvZWZmMCAqIGNvZWZmMCAtIG5ld19lcnJvciAqIG5ld19lcnJvcik7Ci0KLSAgICAgIC8vIEluc3BlY3QgYWxsIHBvc3NpYmxlIG5vbi1kZWFkIHByZWRlY2Vzc29ycy4gUmV0YWluIG9ubHkgdGhlIGJlc3Qgb25lLgotICAgICAgZm9yIChwID0gLU1JTl9ERUxUQTsgcCA8PSBNQVhfREVMVEE7ICsrcCkgewotICAgICAgICBjb25zdCBOb2RlKiBjb25zdCBwcmV2ID0gJk5PREUobiAtIDEsIHApOwotICAgICAgICBjb25zdCBpbnQgcHJldl9jdHggPSBwcmV2LT5jdHg7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB0Y29zdCA9IGNvc3RzW1ZQOEVuY0JhbmRzW25dXVtwcmV2X2N0eF07Ci0gICAgICAgIGNvbnN0IHNjb3JlX3QgdG90YWxfZXJyb3IgPSBwcmV2LT5lcnJvciAtIGRlbHRhX2Vycm9yOwotICAgICAgICBzY29yZV90IGNvc3QsIGJhc2VfY29zdCwgc2NvcmU7Ci0KLSAgICAgICAgaWYgKHByZXYtPmNvc3QgPj0gTUFYX0NPU1QpIHsgICAvLyBkZWFkIG5vZGU/Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCYXNlIGNvc3Qgb2YgYm90aCB0ZXJtaW5hbC9ub24tdGVybWluYWwKLSAgICAgICAgYmFzZV9jb3N0ID0gcHJldi0+Y29zdCArIFZQOExldmVsQ29zdCh0Y29zdCwgbGV2ZWwpOwotCi0gICAgICAgIC8vIEV4YW1pbmUgbm9kZSBhc3N1bWluZyBpdCdzIGEgbm9uLXRlcm1pbmFsIG9uZS4KLSAgICAgICAgY29zdCA9IGJhc2VfY29zdDsKLSAgICAgICAgaWYgKGxldmVsICYmIG4gPCAxNSkgewotICAgICAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgxLCBsYXN0X3Byb2JhKTsKLSAgICAgICAgfQotICAgICAgICBzY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgdG90YWxfZXJyb3IpOwotICAgICAgICBpZiAoc2NvcmUgPCBjdXJfc2NvcmUpIHsKLSAgICAgICAgICBjdXJfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICBjdXItPmNvc3QgID0gY29zdDsKLSAgICAgICAgICBjdXItPmVycm9yID0gdG90YWxfZXJyb3I7Ci0gICAgICAgICAgY3VyLT5wcmV2ICA9IHA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3csIHJlY29yZCBiZXN0IHRlcm1pbmFsIG5vZGUgKGFuZCB0aHVzIGJlc3QgZW50cnkgaW4gdGhlIGdyYXBoKS4KLSAgICAgICAgaWYgKGxldmVsKSB7Ci0gICAgICAgICAgY29zdCA9IGJhc2VfY29zdDsKLSAgICAgICAgICBpZiAobiA8IDE1KSBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wcm9iYSk7Ci0gICAgICAgICAgc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGNvc3QsIHRvdGFsX2Vycm9yKTsKLSAgICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBiZXN0X3BhdGhbMF0gPSBuOyAgIC8vIGJlc3QgZW9iIHBvc2l0aW9uCi0gICAgICAgICAgICBiZXN0X3BhdGhbMV0gPSBtOyAgIC8vIGJlc3QgbGV2ZWwKLSAgICAgICAgICAgIGJlc3RfcGF0aFsyXSA9IHA7ICAgLy8gYmVzdCBwcmVkZWNlc3NvcgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEZyZXNoIHN0YXJ0Ci0gIFNiTWVtb3J5U2V0KGluICsgZmlyc3QsIDAsICgxNiAtIGZpcnN0KSAqIHNpemVvZigqaW4pKTsKLSAgU2JNZW1vcnlTZXQob3V0ICsgZmlyc3QsIDAsICgxNiAtIGZpcnN0KSAqIHNpemVvZigqb3V0KSk7Ci0gIGlmIChiZXN0X3BhdGhbMF0gPT0gLTEpIHsKLSAgICByZXR1cm4gMDsgICAvLyBza2lwIQotICB9Ci0KLSAgLy8gVW53aW5kIHRoZSBiZXN0IHBhdGguCi0gIC8vIE5vdGU6IGJlc3QtcHJldiBvbiB0ZXJtaW5hbCBub2RlIGlzIG5vdCBuZWNlc3NhcmlseSBlcXVhbCB0byB0aGUKLSAgLy8gYmVzdF9wcmV2IGZvciBub24tdGVybWluYWwuIFNvIHdlIHBhdGNoIGJlc3RfcGF0aFsyXSBpbi4KLSAgbiA9IGJlc3RfcGF0aFswXTsKLSAgYmVzdF9ub2RlID0gYmVzdF9wYXRoWzFdOwotICBOT0RFKG4sIGJlc3Rfbm9kZSkucHJldiA9IGJlc3RfcGF0aFsyXTsgICAvLyBmb3JjZSBiZXN0LXByZXYgZm9yIHRlcm1pbmFsCi0gIG56ID0gMDsKLQotICBmb3IgKDsgbiA+PSBmaXJzdDsgLS1uKSB7Ci0gICAgY29uc3QgTm9kZSogY29uc3Qgbm9kZSA9ICZOT0RFKG4sIGJlc3Rfbm9kZSk7Ci0gICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOwotICAgIG91dFtuXSA9IG5vZGUtPnNpZ24gPyAtbm9kZS0+bGV2ZWwgOiBub2RlLT5sZXZlbDsKLSAgICBueiB8PSAobm9kZS0+bGV2ZWwgIT0gMCk7Ci0gICAgaW5bal0gPSBvdXRbbl0gKiBtdHgtPnFfW2pdOwotICAgIGJlc3Rfbm9kZSA9IG5vZGUtPnByZXY7Ci0gIH0KLSAgcmV0dXJuIG56OwotfQotCi0jdW5kZWYgTk9ERQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGVyZm9ybXM6IGRpZmZlcmVuY2UsIHRyYW5zZm9ybSwgcXVhbnRpemUsIGJhY2stdHJhbnNmb3JtLCBhZGQKLS8vIGFsbCBhdCBvbmNlLiBPdXRwdXQgaXMgdGhlIHJlY29uc3RydWN0ZWQgYmxvY2sgaW4gKnl1dl9vdXQsIGFuZCB0aGUKLS8vIHF1YW50aXplZCBsZXZlbHMgaW4gKmxldmVscy4KLQotc3RhdGljIGludCBSZWNvbnN0cnVjdEludHJhMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOwotICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGOwotICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107Ci0gIGludCBueiA9IDA7Ci0gIGludCBuOwotICBpbnQxNl90IHRtcFsxNl1bMTZdLCBkY190bXBbMTZdOwotCi0gIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7Ci0gICAgVlA4RlRyYW5zZm9ybShzcmMgKyBWUDhTY2FuW25dLCByZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0pOwotICB9Ci0gIFZQOEZUcmFuc2Zvcm1XSFQodG1wWzBdLCBkY190bXApOwotICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrKGRjX3RtcCwgcmQtPnlfZGNfbGV2ZWxzLCAwLCAmZHFtLT55Ml8pIDw8IDI0OwotCi0gIGlmIChET19UUkVMTElTX0kxNiAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKLSAgICBpbnQgeCwgeTsKLSAgICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7Ci0gICAgZm9yICh5ID0gMCwgbiA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gsICsrbikgewotICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gICAgICAgIGNvbnN0IGludCBub25femVybyA9Ci0gICAgICAgICAgIFRyZWxsaXNRdWFudGl6ZUJsb2NrKGl0LCB0bXBbbl0sIHJkLT55X2FjX2xldmVsc1tuXSwgY3R4LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT55MV8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfaTE2Xyk7Ci0gICAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gbm9uX3plcm87Ci0gICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7Ci0gICAgICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrKHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCAxLCAmZHFtLT55MV8pIDw8IG47Ci0gICAgfQotICB9Ci0KLSAgLy8gVHJhbnNmb3JtIGJhY2sKLSAgVlA4SVRyYW5zZm9ybVdIVChkY190bXAsIHRtcFswXSk7Ci0gIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7Ci0gICAgVlA4SVRyYW5zZm9ybShyZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuW25dLCAxKTsKLSAgfQotCi0gIHJldHVybiBuejsKLX0KLQotc3RhdGljIGludCBSZWNvbnN0cnVjdEludHJhNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbGV2ZWxzWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV07Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgaW50IG56ID0gMDsKLSAgaW50MTZfdCB0bXBbMTZdOwotCi0gIFZQOEZUcmFuc2Zvcm0oc3JjLCByZWYsIHRtcCk7Ci0gIGlmIChET19UUkVMTElTX0k0ICYmIGl0LT5kb190cmVsbGlzXykgewotICAgIGNvbnN0IGludCB4ID0gaXQtPmk0XyAmIDMsIHkgPSBpdC0+aTRfID4+IDI7Ci0gICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgIG56ID0gVHJlbGxpc1F1YW50aXplQmxvY2soaXQsIHRtcCwgbGV2ZWxzLCBjdHgsIDMsICZkcW0tPnkxXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRxbS0+bGFtYmRhX3RyZWxsaXNfaTRfKTsKLSAgfSBlbHNlIHsKLSAgICBueiA9IFZQOEVuY1F1YW50aXplQmxvY2sodG1wLCBsZXZlbHMsIDAsICZkcW0tPnkxXyk7Ci0gIH0KLSAgVlA4SVRyYW5zZm9ybShyZWYsIHRtcCwgeXV2X291dCwgMCk7Ci0gIHJldHVybiBuejsKLX0KLQotc3RhdGljIGludCBSZWNvbnN0cnVjdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LCBpbnQgbW9kZSkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV07Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgVV9PRkY7Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgaW50IG56ID0gMDsKLSAgaW50IG47Ci0gIGludDE2X3QgdG1wWzhdWzE2XTsKLQotICBmb3IgKG4gPSAwOyBuIDwgODsgKytuKSB7Ci0gICAgVlA4RlRyYW5zZm9ybShzcmMgKyBWUDhTY2FuWzE2ICsgbl0sIHJlZiArIFZQOFNjYW5bMTYgKyBuXSwgdG1wW25dKTsKLSAgfQotICBpZiAoRE9fVFJFTExJU19VViAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKLSAgICBpbnQgY2gsIHgsIHk7Ci0gICAgZm9yIChjaCA9IDAsIG4gPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gsICsrbikgewotICAgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKLSAgICAgICAgICBjb25zdCBpbnQgbm9uX3plcm8gPQotICAgICAgICAgICAgVHJlbGxpc1F1YW50aXplQmxvY2soaXQsIHRtcFtuXSwgcmQtPnV2X2xldmVsc1tuXSwgY3R4LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRxbS0+dXZfLCBkcW0tPmxhbWJkYV90cmVsbGlzX3V2Xyk7Ci0gICAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPSBub25femVybzsKLSAgICAgICAgICBueiB8PSBub25femVybyA8PCBuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAobiA9IDA7IG4gPCA4OyArK24pIHsKLSAgICAgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2sodG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCAwLCAmZHFtLT51dl8pIDw8IG47Ci0gICAgfQotICB9Ci0KLSAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgewotICAgIFZQOElUcmFuc2Zvcm0ocmVmICsgVlA4U2NhblsxNiArIG5dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuWzE2ICsgbl0sIDEpOwotICB9Ci0gIHJldHVybiAobnogPDwgMTYpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUkQtb3B0IGRlY2lzaW9uLiBSZWNvbnN0cnVjdCBlYWNoIG1vZGVzLCBldmFsdWUgZGlzdG9ydGlvbiBhbmQgYml0LWNvc3QuCi0vLyBQaWNrIHRoZSBtb2RlIGlzIGxvd2VyIFJELWNvc3QgPSBSYXRlICsgbGFtYmEgKiBEaXN0b3J0aW9uLgotCi1zdGF0aWMgdm9pZCBTd2FwUHRyKHVpbnQ4X3QqKiBhLCB1aW50OF90KiogYikgewotICB1aW50OF90KiBjb25zdCB0bXAgPSAqYTsKLSAgKmEgPSAqYjsKLSAgKmIgPSB0bXA7Ci19Ci0KLXN0YXRpYyB2b2lkIFN3YXBPdXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFN3YXBQdHIoJml0LT55dXZfb3V0XywgJml0LT55dXZfb3V0Ml8pOwotfQotCi1zdGF0aWMgdm9pZCBQaWNrQmVzdEludHJhMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107Ci0gIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV9pMTZfOwotICBjb25zdCBpbnQgdGxhbWJkYSA9IGRxbS0+dGxhbWJkYV87Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIFZQOE1vZGVTY29yZSByZDE2OwotICBpbnQgbW9kZTsKLQotICByZC0+bW9kZV9pMTYgPSAtMTsKLSAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKLSAgICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGOyAgLy8gc2NyYXRjaCBidWZmZXIKLSAgICBpbnQgbno7Ci0KLSAgICAvLyBSZWNvbnN0cnVjdAotICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCAmcmQxNiwgdG1wX2RzdCwgbW9kZSk7Ci0KLSAgICAvLyBNZWFzdXJlIFJELXNjb3JlCi0gICAgcmQxNi5EID0gVlA4U1NFMTZ4MTYoc3JjLCB0bXBfZHN0KTsKLSAgICByZDE2LlNEID0gdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvMTZ4MTYoc3JjLCB0bXBfZHN0LCBrV2VpZ2h0WSkpCi0gICAgICAgICAgICA6IDA7Ci0gICAgcmQxNi5SID0gVlA4R2V0Q29zdEx1bWExNihpdCwgJnJkMTYpOwotICAgIHJkMTYuUiArPSBWUDhGaXhlZENvc3RzSTE2W21vZGVdOwotCi0gICAgLy8gU2luY2Ugd2UgYWx3YXlzIGV4YW1pbmUgSW50cmExNiBmaXJzdCwgd2UgY2FuIG92ZXJ3cml0ZSAqcmQgZGlyZWN0bHkuCi0gICAgU2V0UkRTY29yZShsYW1iZGEsICZyZDE2KTsKLSAgICBpZiAobW9kZSA9PSAwIHx8IHJkMTYuc2NvcmUgPCByZC0+c2NvcmUpIHsKLSAgICAgIENvcHlTY29yZShyZCwgJnJkMTYpOwotICAgICAgcmQtPm1vZGVfaTE2ID0gbW9kZTsKLSAgICAgIHJkLT5ueiA9IG56OwotICAgICAgU2JNZW1vcnlDb3B5KHJkLT55X2FjX2xldmVscywgcmQxNi55X2FjX2xldmVscywgc2l6ZW9mKHJkMTYueV9hY19sZXZlbHMpKTsKLSAgICAgIFNiTWVtb3J5Q29weShyZC0+eV9kY19sZXZlbHMsIHJkMTYueV9kY19sZXZlbHMsIHNpemVvZihyZDE2LnlfZGNfbGV2ZWxzKSk7Ci0gICAgICBTd2FwT3V0KGl0KTsKLSAgICB9Ci0gIH0KLSAgU2V0UkRTY29yZShkcW0tPmxhbWJkYV9tb2RlXywgcmQpOyAgIC8vIGZpbmFsaXplIHNjb3JlIGZvciBtb2RlIGRlY2lzaW9uLgotICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgcmQtPm1vZGVfaTE2KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gcmV0dXJuIHRoZSBjb3N0IGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cnJvdW5kaW5nIHByZWRpY3Rpb24gbW9kZXMuCi1zdGF0aWMgY29uc3QgdWludDE2X3QqIEdldENvc3RNb2RlSTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgbW9kZXNbMTZdKSB7Ci0gIGNvbnN0IGludCBwcmVkc193ID0gaXQtPmVuY18tPnByZWRzX3dfOwotICBjb25zdCBpbnQgeCA9IChpdC0+aTRfICYgMyksIHkgPSBpdC0+aTRfID4+IDI7Ci0gIGNvbnN0IGludCBsZWZ0ID0gKHggPT0gMCkgPyBpdC0+cHJlZHNfW3kgKiBwcmVkc193IC0gMV0gOiBtb2Rlc1tpdC0+aTRfIC0gMV07Ci0gIGNvbnN0IGludCB0b3AgPSAoeSA9PSAwKSA/IGl0LT5wcmVkc19bLXByZWRzX3cgKyB4XSA6IG1vZGVzW2l0LT5pNF8gLSA0XTsKLSAgcmV0dXJuIFZQOEZpeGVkQ29zdHNJNFt0b3BdW2xlZnRdOwotfQotCi1zdGF0aWMgaW50IFBpY2tCZXN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBjb25zdCBpbnQgbGFtYmRhID0gZHFtLT5sYW1iZGFfaTRfOwotICBjb25zdCBpbnQgdGxhbWJkYSA9IGRxbS0+dGxhbWJkYV87Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYzAgPSBpdC0+eXV2X2luXyArIFlfT0ZGOwotICB1aW50OF90KiBjb25zdCBiZXN0X2Jsb2NrcyA9IGl0LT55dXZfb3V0Ml8gKyBZX09GRjsKLSAgaW50IHRvdGFsX2hlYWRlcl9iaXRzID0gMDsKLSAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7Ci0KLSAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBJbml0U2NvcmUoJnJkX2Jlc3QpOwotICByZF9iZXN0LnNjb3JlID0gMjExOyAgLy8gJzIxMScgaXMgdGhlIHZhbHVlIG9mIFZQOEJpdENvc3QoMCwgMTQ1KQotICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIHJkX2k0OwotICAgIGludCBtb2RlOwotICAgIGludCBiZXN0X21vZGUgPSAtMTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBzcmMwICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICBjb25zdCB1aW50MTZfdCogY29uc3QgbW9kZV9jb3N0cyA9IEdldENvc3RNb2RlSTQoaXQsIHJkLT5tb2Rlc19pNCk7Ci0gICAgdWludDhfdCogYmVzdF9ibG9jayA9IGJlc3RfYmxvY2tzICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICB1aW50OF90KiB0bXBfZHN0ID0gaXQtPnl1dl9wXyArIEk0VE1QOyAgICAvLyBzY3JhdGNoIGJ1ZmZlci4KLQotICAgIEluaXRTY29yZSgmcmRfaTQpOwotICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7Ci0gICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9CTU9ERVM7ICsrbW9kZSkgewotICAgICAgVlA4TW9kZVNjb3JlIHJkX3RtcDsKLSAgICAgIGludDE2X3QgdG1wX2xldmVsc1sxNl07Ci0KLSAgICAgIC8vIFJlY29uc3RydWN0Ci0gICAgICByZF90bXAubnogPQotICAgICAgICAgIFJlY29uc3RydWN0SW50cmE0KGl0LCB0bXBfbGV2ZWxzLCBzcmMsIHRtcF9kc3QsIG1vZGUpIDw8IGl0LT5pNF87Ci0KLSAgICAgIC8vIENvbXB1dGUgUkQtc2NvcmUKLSAgICAgIHJkX3RtcC5EID0gVlA4U1NFNHg0KHNyYywgdG1wX2RzdCk7Ci0gICAgICByZF90bXAuU0QgPQotICAgICAgICAgIHRsYW1iZGEgPyBNVUxUXzhCKHRsYW1iZGEsIFZQOFREaXN0bzR4NChzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkKLSAgICAgICAgICAgICAgICAgIDogMDsKLSAgICAgIHJkX3RtcC5SID0gVlA4R2V0Q29zdEx1bWE0KGl0LCB0bXBfbGV2ZWxzKTsKLSAgICAgIHJkX3RtcC5SICs9IG1vZGVfY29zdHNbbW9kZV07Ci0KLSAgICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdG1wKTsKLSAgICAgIGlmIChiZXN0X21vZGUgPCAwIHx8IHJkX3RtcC5zY29yZSA8IHJkX2k0LnNjb3JlKSB7Ci0gICAgICAgIENvcHlTY29yZSgmcmRfaTQsICZyZF90bXApOwotICAgICAgICBiZXN0X21vZGUgPSBtb2RlOwotICAgICAgICBTd2FwUHRyKCZ0bXBfZHN0LCAmYmVzdF9ibG9jayk7Ci0gICAgICAgIFNiTWVtb3J5Q29weShyZF9iZXN0LnlfYWNfbGV2ZWxzW2l0LT5pNF9dLCB0bXBfbGV2ZWxzLCBzaXplb2YodG1wX2xldmVscykpOwotICAgICAgfQotICAgIH0KLSAgICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCAmcmRfaTQpOwotICAgIEFkZFNjb3JlKCZyZF9iZXN0LCAmcmRfaTQpOwotICAgIHRvdGFsX2hlYWRlcl9iaXRzICs9IG1vZGVfY29zdHNbYmVzdF9tb2RlXTsKLSAgICBpZiAocmRfYmVzdC5zY29yZSA+PSByZC0+c2NvcmUgfHwKLSAgICAgICAgdG90YWxfaGVhZGVyX2JpdHMgPiBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18pIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvLyBDb3B5IHNlbGVjdGVkIHNhbXBsZXMgaWYgbm90IGluIHRoZSByaWdodCBwbGFjZSBhbHJlYWR5LgotICAgIGlmIChiZXN0X2Jsb2NrICE9IGJlc3RfYmxvY2tzICsgVlA4U2NhbltpdC0+aTRfXSkKLSAgICAgIFZQOENvcHk0eDQoYmVzdF9ibG9jaywgYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dKTsKLSAgICByZC0+bW9kZXNfaTRbaXQtPmk0X10gPSBiZXN0X21vZGU7Ci0gICAgaXQtPnRvcF9uel9baXQtPmk0XyAmIDNdID0gaXQtPmxlZnRfbnpfW2l0LT5pNF8gPj4gMl0gPSAocmRfaTQubnogPyAxIDogMCk7Ci0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGJlc3RfYmxvY2tzKSk7Ci0KLSAgLy8gZmluYWxpemUgc3RhdGUKLSAgQ29weVNjb3JlKHJkLCAmcmRfYmVzdCk7Ci0gIFZQOFNldEludHJhNE1vZGUoaXQsIHJkLT5tb2Rlc19pNCk7Ci0gIFN3YXBPdXQoaXQpOwotICBTYk1lbW9yeUNvcHkocmQtPnlfYWNfbGV2ZWxzLCByZF9iZXN0LnlfYWNfbGV2ZWxzLCBzaXplb2YocmQtPnlfYWNfbGV2ZWxzKSk7Ci0gIHJldHVybiAxOyAgIC8vIHNlbGVjdCBpbnRyYTR4NCBvdmVyIGludHJhMTZ4MTYKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgUGlja0Jlc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX3V2XzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRjsKLSAgdWludDhfdCogY29uc3QgdG1wX2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBVX09GRjsgIC8vIHNjcmF0Y2ggYnVmZmVyCi0gIHVpbnQ4X3QqIGNvbnN0IGRzdDAgPSBpdC0+eXV2X291dF8gKyBVX09GRjsKLSAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7Ci0gIGludCBtb2RlOwotCi0gIHJkLT5tb2RlX3V2ID0gLTE7Ci0gIEluaXRTY29yZSgmcmRfYmVzdCk7Ci0gIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fUFJFRF9NT0RFUzsgKyttb2RlKSB7Ci0gICAgVlA4TW9kZVNjb3JlIHJkX3V2OwotCi0gICAgLy8gUmVjb25zdHJ1Y3QKLSAgICByZF91di5ueiA9IFJlY29uc3RydWN0VVYoaXQsICZyZF91diwgdG1wX2RzdCwgbW9kZSk7Ci0KLSAgICAvLyBDb21wdXRlIFJELXNjb3JlCi0gICAgcmRfdXYuRCAgPSBWUDhTU0UxNng4KHNyYywgdG1wX2RzdCk7Ci0gICAgcmRfdXYuU0QgPSAwOyAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FsbCBURGlzdG8/IGl0IHRlbmRzIHRvIGZsYXR0ZW4gYXJlYXMuCi0gICAgcmRfdXYuUiAgPSBWUDhHZXRDb3N0VVYoaXQsICZyZF91dik7Ci0gICAgcmRfdXYuUiArPSBWUDhGaXhlZENvc3RzVVZbbW9kZV07Ci0KLSAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkX3V2KTsKLSAgICBpZiAobW9kZSA9PSAwIHx8IHJkX3V2LnNjb3JlIDwgcmRfYmVzdC5zY29yZSkgewotICAgICAgQ29weVNjb3JlKCZyZF9iZXN0LCAmcmRfdXYpOwotICAgICAgcmQtPm1vZGVfdXYgPSBtb2RlOwotICAgICAgU2JNZW1vcnlDb3B5KHJkLT51dl9sZXZlbHMsIHJkX3V2LnV2X2xldmVscywgc2l6ZW9mKHJkLT51dl9sZXZlbHMpKTsKLSAgICAgIFNiTWVtb3J5Q29weShkc3QwLCB0bXBfZHN0LCBVVl9TSVpFKTsgICAvLyAgVE9ETzogU3dhcFVWT3V0KCkgPwotICAgIH0KLSAgfQotICBWUDhTZXRJbnRyYVVWTW9kZShpdCwgcmQtPm1vZGVfdXYpOwotICBBZGRTY29yZShyZCwgJnJkX2Jlc3QpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmluYWwgcmVjb25zdHJ1Y3Rpb24gYW5kIHF1YW50aXphdGlvbi4KLQotc3RhdGljIHZvaWQgU2ltcGxlUXVhbnRpemUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBpbnQgaXNfaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOwotICBpbnQgbnogPSAwOwotCi0gIGlmIChpc19pMTYpIHsKLSAgICBueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFlfT0ZGLCBpdC0+cHJlZHNfWzBdKTsKLSAgfSBlbHNlIHsKLSAgICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOwotICAgIGRvIHsKLSAgICAgIGNvbnN0IGludCBtb2RlID0KLSAgICAgICAgICBpdC0+cHJlZHNfWyhpdC0+aTRfICYgMykgKyAoaXQtPmk0XyA+PiAyKSAqIGVuYy0+cHJlZHNfd19dOwotICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRiArIFZQOFNjYW5baXQtPmk0X107Ci0gICAgICB1aW50OF90KiBjb25zdCBkc3QgPSBpdC0+eXV2X291dF8gKyBZX09GRiArIFZQOFNjYW5baXQtPmk0X107Ci0gICAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOwotICAgICAgbnogfD0gUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHJkLT55X2FjX2xldmVsc1tpdC0+aTRfXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBtb2RlKSA8PCBpdC0+aTRfOwotICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfb3V0XyArIFlfT0ZGKSk7Ci0gIH0KLQotICBueiB8PSBSZWNvbnN0cnVjdFVWKGl0LCByZCwgaXQtPnl1dl9vdXRfICsgVV9PRkYsIGl0LT5tYl8tPnV2X21vZGVfKTsKLSAgcmQtPm56ID0gbno7Ci19Ci0KLS8vIFJlZmluZSBpbnRyYTE2L2ludHJhNCBzdWItbW9kZXMgYmFzZWQgb24gZGlzdG9ydGlvbiBvbmx5IChub3QgcmF0ZSkuCi1zdGF0aWMgdm9pZCBEaXN0b1JlZmluZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCB0cnlfYm90aF9pNF9pMTYpIHsKLSAgY29uc3QgaW50IGlzX2kxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKLSAgc2NvcmVfdCBiZXN0X3Njb3JlID0gTUFYX0NPU1Q7Ci0KLSAgaWYgKHRyeV9ib3RoX2k0X2kxNiB8fCBpc19pMTYpIHsKLSAgICBpbnQgbW9kZTsKLSAgICBpbnQgYmVzdF9tb2RlID0gLTE7Ci0gICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFMTZ4MTYoc3JjLCByZWYpOwotICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgewotICAgICAgICBiZXN0X21vZGUgPSBtb2RlOwotICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICB9Ci0gICAgfQotICAgIFZQOFNldEludHJhMTZNb2RlKGl0LCBiZXN0X21vZGUpOwotICB9Ci0gIGlmICh0cnlfYm90aF9pNF9pMTYgfHwgIWlzX2kxNikgewotICAgIHVpbnQ4X3QgbW9kZXNfaTRbMTZdOwotICAgIC8vIFdlIGRvbid0IGV2YWx1YXRlIHRoZSByYXRlIGhlcmUsIGJ1dCBqdXN0IGFjY291bnQgZm9yIGl0IHRocm91Z2ggYQotICAgIC8vIGNvbnN0YW50IHBlbmFsdHkgKGk0IG1vZGUgdXN1YWxseSBuZWVkcyBtb3JlIGJpdHMgY29tcGFyZWQgdG8gaTE2KS4KLSAgICBzY29yZV90IHNjb3JlX2k0ID0gKHNjb3JlX3QpSTRfUEVOQUxUWTsKLQotICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7Ci0gICAgZG8gewotICAgICAgaW50IG1vZGU7Ci0gICAgICBpbnQgYmVzdF9zdWJfbW9kZSA9IC0xOwotICAgICAgc2NvcmVfdCBiZXN0X3N1Yl9zY29yZSA9IE1BWF9DT1NUOwotICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRiArIFZQOFNjYW5baXQtPmk0X107Ci0KLSAgICAgIC8vIFRPRE8oc2thbCk6IHdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBwcmVkaWN0aW9uIHBpeGVscyBoZXJlLAotICAgICAgLy8gYnV0IGp1c3QgdGhlIGRpc3RvcnRpb24gYWdhaW5zdCAnc3JjJy4KLSAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7Ci0gICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJNE1vZGVPZmZzZXRzW21vZGVdOwotICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFNHg0KHNyYywgcmVmKTsKLSAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zdWJfc2NvcmUpIHsKLSAgICAgICAgICBiZXN0X3N1Yl9tb2RlID0gbW9kZTsKLSAgICAgICAgICBiZXN0X3N1Yl9zY29yZSA9IHNjb3JlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtb2Rlc19pNFtpdC0+aTRfXSA9IGJlc3Rfc3ViX21vZGU7Ci0gICAgICBzY29yZV9pNCArPSBiZXN0X3N1Yl9zY29yZTsKLSAgICAgIGlmIChzY29yZV9pNCA+PSBiZXN0X3Njb3JlKSBicmVhazsKLSAgICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBpdC0+eXV2X2luXyArIFlfT0ZGKSk7Ci0gICAgaWYgKHNjb3JlX2k0IDwgYmVzdF9zY29yZSkgewotICAgICAgVlA4U2V0SW50cmE0TW9kZShpdCwgbW9kZXNfaTQpOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW50cnkgcG9pbnQKLQotaW50IFZQOERlY2ltYXRlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKLSAgICAgICAgICAgICAgICBWUDhSRExldmVsIHJkX29wdCkgewotICBpbnQgaXNfc2tpcHBlZDsKLSAgY29uc3QgaW50IG1ldGhvZCA9IGl0LT5lbmNfLT5tZXRob2RfOwotCi0gIEluaXRTY29yZShyZCk7Ci0KLSAgLy8gV2UgY2FuIHBlcmZvcm0gcHJlZGljdGlvbnMgZm9yIEx1bWExNngxNiBhbmQgQ2hyb21hOHg4IGFscmVhZHkuCi0gIC8vIEx1bWE0eDQgcHJlZGljdGlvbnMgbmVlZHMgdG8gYmUgZG9uZSBhcy13ZS1nby4KLSAgVlA4TWFrZUx1bWExNlByZWRzKGl0KTsKLSAgVlA4TWFrZUNocm9tYThQcmVkcyhpdCk7Ci0KLSAgaWYgKHJkX29wdCA+IFJEX09QVF9OT05FKSB7Ci0gICAgaXQtPmRvX3RyZWxsaXNfID0gKHJkX29wdCA+PSBSRF9PUFRfVFJFTExJU19BTEwpOwotICAgIFBpY2tCZXN0SW50cmExNihpdCwgcmQpOwotICAgIGlmIChtZXRob2QgPj0gMikgewotICAgICAgUGlja0Jlc3RJbnRyYTQoaXQsIHJkKTsKLSAgICB9Ci0gICAgUGlja0Jlc3RVVihpdCwgcmQpOwotICAgIGlmIChyZF9vcHQgPT0gUkRfT1BUX1RSRUxMSVMpIHsgICAvLyBmaW5pc2ggb2ZmIHdpdGggdHJlbGxpcy1vcHRpbSBub3cKLSAgICAgIGl0LT5kb190cmVsbGlzXyA9IDE7Ci0gICAgICBTaW1wbGVRdWFudGl6ZShpdCwgcmQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBGb3IgbWV0aG9kID09IDIsIHBpY2sgdGhlIGJlc3QgaW50cmE0L2ludHJhMTYgYmFzZWQgb24gU1NFICh+dGFkIHNsb3dlcikuCi0gICAgLy8gRm9yIG1ldGhvZCA8PSAxLCB3ZSByZWZpbmUgaW50cmE0IG9yIGludHJhMTYgKGJ1dCBkb24ndCByZS1leGFtaW5lIG1vZGUpLgotICAgIERpc3RvUmVmaW5lKGl0LCAobWV0aG9kID49IDIpKTsKLSAgICBTaW1wbGVRdWFudGl6ZShpdCwgcmQpOwotICB9Ci0gIGlzX3NraXBwZWQgPSAocmQtPm56ID09IDApOwotICBWUDhTZXRTa2lwKGl0LCBpc19za2lwcGVkKTsKLSAgcmV0dXJuIGlzX3NraXBwZWQ7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3Rva2VuLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdG9rZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4MGViNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdG9rZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgotLy8KLS8vICBBICd0b2tlbicgaXMgYSBiaXQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvYmFiaWxpdHksIGVpdGhlciBmaXhlZAotLy8gb3IgYSBsYXRlci10by1iZS1kZXRlcm1pbmVkIGFmdGVyIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNvbGxlY3RlZC4KLS8vIEZvciBkeW5hbWljIHByb2JhYmlsaXR5LCB3ZSBqdXN0IHJlY29yZCB0aGUgc2xvdCBpZCAoaWR4KSBmb3IgdGhlIHByb2JhYmlsaXR5Ci0vLyB2YWx1ZSBpbiB0aGUgZmluYWwgcHJvYmFiaWxpdHkgYXJyYXkgKHVpbnQ4X3QqIHByb2JhcyBpbiBWUDhFbWl0VG9rZW5zKS4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQotCi0vLyB3ZSB1c2UgcGFnZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgU2JNZW1vcnlDb3B5KCkKLSNkZWZpbmUgTUFYX05VTV9UT0tFTiA4MTkyICAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgdG9rZW4gcGVyIHBhZ2UKLSNkZWZpbmUgRklYRURfUFJPQkFfQklUICgxdSA8PCAxNCkKLQotc3RydWN0IFZQOFRva2VucyB7Ci0gIHVpbnQxNl90IHRva2Vuc19bTUFYX05VTV9UT0tFTl07ICAvLyBiaXQjMTU6IGJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0ICMxNDogY29uc3RhbnQgcHJvYmEgb3IgaWR4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRzIDAuLjEzOiBzbG90IG9yIGNvbnN0YW50IHByb2JhCi0gIFZQOFRva2VucyogbmV4dF87Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgYi0+dG9rZW5zXyA9IE5VTEw7Ci0gIGItPnBhZ2VzXyA9IE5VTEw7Ci0gIGItPmxhc3RfcGFnZV8gPSAmYi0+cGFnZXNfOwotICBiLT5sZWZ0XyA9IDA7Ci0gIGItPmVycm9yXyA9IDA7Ci19Ci0KLXZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgaWYgKGIgIT0gTlVMTCkgewotICAgIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgICB3aGlsZSAocCAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKLSAgICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSgodm9pZCopcCk7Ci0gICAgICBwID0gbmV4dDsKLSAgICB9Ci0gICAgVlA4VEJ1ZmZlckluaXQoYik7Ci0gIH0KLX0KLQotc3RhdGljIGludCBUQnVmZmVyTmV3UGFnZShWUDhUQnVmZmVyKiBjb25zdCBiKSB7Ci0gIFZQOFRva2VucyogY29uc3QgcGFnZSA9IGItPmVycm9yXyA/IE5VTEwgOiAoVlA4VG9rZW5zKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqcGFnZSkpOwotICBpZiAocGFnZSA9PSBOVUxMKSB7Ci0gICAgYi0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAqYi0+bGFzdF9wYWdlXyA9IHBhZ2U7Ci0gIGItPmxhc3RfcGFnZV8gPSAmcGFnZS0+bmV4dF87Ci0gIGItPmxlZnRfID0gTUFYX05VTV9UT0tFTjsKLSAgYi0+dG9rZW5zXyA9IHBhZ2UtPnRva2Vuc187Ci0gIHBhZ2UtPm5leHRfID0gTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgVE9LRU5fSUQodCwgYiwgY3R4LCBwKSBcCi0gICAgKChwKSArIE5VTV9QUk9CQVMgKiAoKGN0eCkgKyBOVU1fQ1RYICogKChiKSArIE5VTV9CQU5EUyAqICh0KSkpKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXQsIHVpbnQzMl90IHByb2JhX2lkeCkgewotICBTQl9EQ0hFQ0socHJvYmFfaWR4IDwgRklYRURfUFJPQkFfQklUKTsKLSAgU0JfRENIRUNLKGJpdCA9PSAwIHx8IGJpdCA9PSAxKTsKLSAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgewotICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKLSAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBwcm9iYV9pZHg7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkQ29uc3RhbnRUb2tlbihWUDhUQnVmZmVyKiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0LCBpbnQgcHJvYmEpIHsKLSAgU0JfRENIRUNLKHByb2JhIDwgMjU2KTsKLSAgU0JfRENIRUNLKGJpdCA9PSAwIHx8IGJpdCA9PSAxKTsKLSAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgewotICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKLSAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBGSVhFRF9QUk9CQV9CSVQgfCBwcm9iYTsKLSAgfQotfQotCi1pbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgaW50IGNvZWZmX3R5cGUsIGludCBmaXJzdCwgaW50IGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgewotICBpbnQgbiA9IGZpcnN0OwotICB1aW50MzJfdCBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgbiwgY3R4LCAwKTsKLSAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIGxhc3QgPj0gMCwgYmFzZV9pZCArIDApKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aGlsZSAobiA8IDE2KSB7Ci0gICAgY29uc3QgaW50IGMgPSBjb2VmZnNbbisrXTsKLSAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOwotICAgIGludCB2ID0gc2lnbiA/IC1jIDogYzsKLSAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiAhPSAwLCBiYXNlX2lkICsgMSkpIHsKLSAgICAgIGN0eCA9IDA7Ci0gICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIGN0eCwgMCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxLCBiYXNlX2lkICsgMikpIHsKLSAgICAgIGN0eCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gNCwgYmFzZV9pZCArIDMpKSB7Ci0gICAgICAgIGlmIChBZGRUb2tlbih0b2tlbnMsIHYgIT0gMiwgYmFzZV9pZCArIDQpKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgdiA9PSA0LCBiYXNlX2lkICsgNSk7Ci0gICAgICB9IGVsc2UgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxMCwgYmFzZV9pZCArIDYpKSB7Ci0gICAgICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gNiwgYmFzZV9pZCArIDcpKSB7Ci0gICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHYgPT0gNiwgMTU5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA+PSA5LCAxNjUpOwotICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhKHYgJiAxKSwgMTQ1KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG1hc2s7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKLSAgICAgICAgaWYgKHYgPCAzICsgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDkpOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDI7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0MzsKLSAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDkpOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDEpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDM7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NDsKLSAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDMpKSB7ICAgLy8gVlA4Q2F0NSAgKDViKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDEwKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAyKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCA0OwotICAgICAgICAgIHRhYiA9IFZQOENhdDU7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOENhdDYgKDExYikKLSAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA4KTsKLSAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyAxMCk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMTA7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NjsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobWFzaykgewotICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhISh2ICYgbWFzayksICp0YWIrKyk7Ci0gICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY3R4ID0gMjsKLSAgICB9Ci0gICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHNpZ24sIDEyOCk7Ci0gICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCBjdHgsIDApOwotICAgIGlmIChuID09IDE2IHx8ICFBZGRUb2tlbih0b2tlbnMsIG4gPD0gbGFzdCwgYmFzZV9pZCArIDApKSB7Ci0gICAgICByZXR1cm4gMTsgICAvLyBFT0IKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLSN1bmRlZiBUT0tFTl9JRAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhpcyBmdW5jdGlvbiB3b3JrcywgYnV0IGlzbid0IGN1cnJlbnRseSB1c2VkLiBTYXZlZCBmb3IgbGF0ZXIuCi0KLSNpZiAwCi0KLXN0YXRpYyB2b2lkIFJlY29yZChpbnQgYml0LCBwcm9iYV90KiBjb25zdCBzdGF0cykgewotICBwcm9iYV90IHAgPSAqc3RhdHM7Ci0gIGlmIChwID49IDB4ZmZmZjAwMDB1KSB7ICAgICAgICAgICAgICAgLy8gYW4gb3ZlcmZsb3cgaXMgaW5ib3VuZC4KLSAgICBwID0gKChwICsgMXUpID4+IDEpICYgMHg3ZmZmN2ZmZnU7ICAvLyAtPiBkaXZpZGUgdGhlIHN0YXRzIGJ5IDIuCi0gIH0KLSAgLy8gcmVjb3JkIGJpdCBjb3VudCAobG93ZXIgMTYgYml0cykgYW5kIGluY3JlbWVudCB0b3RhbCBjb3VudCAodXBwZXIgMTYgYml0cykuCi0gIHAgKz0gMHgwMDAxMDAwMHUgKyBiaXQ7Ci0gICpzdGF0cyA9IHA7Ci19Ci0KLXZvaWQgVlA4VG9rZW5Ub1N0YXRzKGNvbnN0IFZQOFRCdWZmZXIqIGNvbnN0IGIsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgd2hpbGUgKHAgIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBOID0gKHAtPm5leHRfID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOwotICAgIGludCBuID0gTUFYX05VTV9UT0tFTjsKLSAgICB3aGlsZSAobi0tID4gTikgewotICAgICAgY29uc3QgdWludDE2X3QgdG9rZW4gPSBwLT50b2tlbnNfW25dOwotICAgICAgaWYgKCEodG9rZW4gJiBGSVhFRF9QUk9CQV9CSVQpKSB7Ci0gICAgICAgIFJlY29yZCgodG9rZW4gPj4gMTUpICYgMSwgc3RhdHMgKyAodG9rZW4gJiAweDNmZmZ1KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgPSBwLT5uZXh0XzsKLSAgfQotfQotCi0jZW5kaWYgICAvLyAwCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbCBjb2RpbmcgcGFzcywgd2l0aCBrbm93biBwcm9iYWJpbGl0aWVzCi0KLWludCBWUDhFbWl0VG9rZW5zKFZQOFRCdWZmZXIqIGNvbnN0IGIsIFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMsIGludCBmaW5hbF9wYXNzKSB7Ci0gIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgKHZvaWQpZmluYWxfcGFzczsKLSAgaWYgKGItPmVycm9yXykgcmV0dXJuIDA7Ci0gIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKLSAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOwotICAgIGludCBuID0gTUFYX05VTV9UT0tFTjsKLSAgICB3aGlsZSAobi0tID4gTikgewotICAgICAgY29uc3QgdWludDE2X3QgdG9rZW4gPSBwLT50b2tlbnNfW25dOwotICAgICAgY29uc3QgaW50IGJpdCA9ICh0b2tlbiA+PiAxNSkgJiAxOwotICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7Ci0gICAgICAgIFZQOFB1dEJpdChidywgYml0LCB0b2tlbiAmIDB4ZmZ1KTsgIC8vIGNvbnN0YW50IHByb2JhCi0gICAgICB9IGVsc2UgewotICAgICAgICBWUDhQdXRCaXQoYncsIGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZmluYWxfcGFzcykgU2JNZW1vcnlEZWFsbG9jYXRlKCh2b2lkKilwKTsKLSAgICBwID0gbmV4dDsKLSAgfQotICBpZiAoZmluYWxfcGFzcykgYi0+cGFnZXNfID0gTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbHNlICAgICAvLyBESVNBQkxFX1RPS0VOX0JVRkZFUgotCi12b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgKHZvaWQpYjsKLX0KLXZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgKHZvaWQpYjsKLX0KLQotI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdnA4bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA3MGIzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBtYWluIGVudHJ5IGZvciB0aGUgbG9zc2xlc3MgZW5jb2Rlci4KLS8vCi0vLyBBdXRob3I6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotLy8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi9kc3AvbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfd3JpdGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvaHVmZm1hbl9lbmNvZGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBQQUxFVFRFX0tFWV9SSUdIVF9TSElGVCAgIDIyICAvLyBLZXkgZm9yIDFLIGJ1ZmZlci4KLSNkZWZpbmUgTUFYX0hVRkZfSU1BR0VfU0laRSAgICAgICAoMTYgKiAxMDI0ICogMTAyNCkKLSNkZWZpbmUgTUFYX0NPTE9SU19GT1JfR1JBUEggICAgICA2NAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGFsZXR0ZQotCi1zdGF0aWMgaW50IENvbXBhcmVDb2xvcnMoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGEgPSAqKGNvbnN0IHVpbnQzMl90KilwMTsKLSAgY29uc3QgdWludDMyX3QgYiA9ICooY29uc3QgdWludDMyX3QqKXAyOwotICBTQl9EQ0hFQ0soYSAhPSBiKTsKLSAgcmV0dXJuIChhIDwgYikgPyAtMSA6IDE7Ci19Ci0KLS8vIElmIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIGltYWdlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNQVhfUEFMRVRURV9TSVpFLAotLy8gY3JlYXRlcyBhIHBhbGV0dGUgYW5kIHJldHVybnMgdHJ1ZSwgZWxzZSByZXR1cm5zIGZhbHNlLgotc3RhdGljIGludCBBbmFseXplQW5kQ3JlYXRlUGFsZXR0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYWxldHRlW01BWF9QQUxFVFRFX1NJWkVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHBhbGV0dGVfc2l6ZSkgewotICBpbnQgaSwgeCwgeSwga2V5OwotICBpbnQgbnVtX2NvbG9ycyA9IDA7Ci0gIHVpbnQ4X3QgaW5fdXNlW01BWF9QQUxFVFRFX1NJWkUgKiA0XSA9IHsgMCB9OwotICB1aW50MzJfdCBjb2xvcnNbTUFYX1BBTEVUVEVfU0laRSAqIDRdOwotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0hhc2hNdWwgPSAweDFlMzVhN2JkOwotICBjb25zdCB1aW50MzJfdCogYXJnYiA9IHBpYy0+YXJnYjsKLSAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OwotICB1aW50MzJfdCBsYXN0X3BpeCA9IH5hcmdiWzBdOyAgIC8vIHNvIHdlJ3JlIHN1cmUgdGhhdCBsYXN0X3BpeCAhPSBhcmdiWzBdCi0KLSAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGlmIChhcmdiW3hdID09IGxhc3RfcGl4KSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgbGFzdF9waXggPSBhcmdiW3hdOwotICAgICAga2V5ID0gKGtIYXNoTXVsICogbGFzdF9waXgpID4+IFBBTEVUVEVfS0VZX1JJR0hUX1NISUZUOwotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCFpbl91c2Vba2V5XSkgewotICAgICAgICAgIGNvbG9yc1trZXldID0gbGFzdF9waXg7Ci0gICAgICAgICAgaW5fdXNlW2tleV0gPSAxOwotICAgICAgICAgICsrbnVtX2NvbG9yczsKLSAgICAgICAgICBpZiAobnVtX2NvbG9ycyA+IE1BWF9QQUxFVFRFX1NJWkUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvcnNba2V5XSA9PSBsYXN0X3BpeCkgewotICAgICAgICAgIC8vIFRoZSBjb2xvciBpcyBhbHJlYWR5IHRoZXJlLgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFNvbWUgb3RoZXIgY29sb3Igc2l0cyB0aGVyZS4KLSAgICAgICAgICAvLyBEbyBsaW5lYXIgY29uZmxpY3QgcmVzb2x1dGlvbi4KLSAgICAgICAgICArK2tleTsKLSAgICAgICAgICBrZXkgJj0gKE1BWF9QQUxFVFRFX1NJWkUgKiA0IC0gMSk7ICAvLyBrZXkgbWFzayBmb3IgMUsgYnVmZmVyLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGFyZ2IgKz0gcGljLT5hcmdiX3N0cmlkZTsKLSAgfQotCi0gIC8vIFRPRE8oc2thbCk6IGNvdWxkIHdlIHJldXNlIGluX3VzZVtdIHRvIHNwZWVkIHVwIEVuY29kZVBhbGV0dGUoKT8KLSAgbnVtX2NvbG9ycyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YoaW5fdXNlKSAvIHNpemVvZihpbl91c2VbMF0pKTsgKytpKSB7Ci0gICAgaWYgKGluX3VzZVtpXSkgewotICAgICAgcGFsZXR0ZVtudW1fY29sb3JzXSA9IGNvbG9yc1tpXTsKLSAgICAgICsrbnVtX2NvbG9yczsKLSAgICB9Ci0gIH0KLQotICBTYlN5c3RlbVNvcnQocGFsZXR0ZSwgbnVtX2NvbG9ycywgc2l6ZW9mKCpwYWxldHRlKSwgQ29tcGFyZUNvbG9ycyk7Ci0gICpwYWxldHRlX3NpemUgPSBudW1fY29sb3JzOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBBbmFseXplRW50cm9weShjb25zdCB1aW50MzJfdCogYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29uc3Qgbm9ucHJlZGljdGVkX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29uc3QgcHJlZGljdGVkX2JpdHMpIHsKLSAgaW50IHgsIHk7Ci0gIGNvbnN0IHVpbnQzMl90KiBsYXN0X2xpbmUgPSBOVUxMOwotICB1aW50MzJfdCBsYXN0X3BpeCA9IGFyZ2JbMF07ICAgIC8vIHNvIHdlJ3JlIHN1cmUgdGhhdCBwaXhfZGlmZiA9PSAwCi0KLSAgVlA4TEhpc3RvZ3JhbSogbm9ucHJlZGljdGVkID0gTlVMTDsKLSAgVlA4TEhpc3RvZ3JhbSogcHJlZGljdGVkID0KLSAgICAgIChWUDhMSGlzdG9ncmFtKilTYk1lbW9yeUFsbG9jYXRlKDIgKiBzaXplb2YoKnByZWRpY3RlZCkpOwotICBpZiAocHJlZGljdGVkID09IE5VTEwpIHJldHVybiAwOwotICBub25wcmVkaWN0ZWQgPSBwcmVkaWN0ZWQgKyAxOwotCi0gIFZQOExIaXN0b2dyYW1Jbml0KHByZWRpY3RlZCwgMCk7Ci0gIFZQOExIaXN0b2dyYW1Jbml0KG5vbnByZWRpY3RlZCwgMCk7Ci0gIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwaXggPSBhcmdiW3hdOwotICAgICAgY29uc3QgdWludDMyX3QgcGl4X2RpZmYgPSBWUDhMU3ViUGl4ZWxzKHBpeCwgbGFzdF9waXgpOwotICAgICAgaWYgKHBpeF9kaWZmID09IDApIGNvbnRpbnVlOwotICAgICAgaWYgKGxhc3RfbGluZSAhPSBOVUxMICYmIHBpeCA9PSBsYXN0X2xpbmVbeF0pIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBsYXN0X3BpeCA9IHBpeDsKLSAgICAgIHsKLSAgICAgICAgY29uc3QgUGl4T3JDb3B5IHBpeF90b2tlbiA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4KTsKLSAgICAgICAgY29uc3QgUGl4T3JDb3B5IHBpeF9kaWZmX3Rva2VuID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXhfZGlmZik7Ci0gICAgICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkobm9ucHJlZGljdGVkLCAmcGl4X3Rva2VuKTsKLSAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShwcmVkaWN0ZWQsICZwaXhfZGlmZl90b2tlbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGxhc3RfbGluZSA9IGFyZ2I7Ci0gICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKLSAgfQotICAqbm9ucHJlZGljdGVkX2JpdHMgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzQnVsayhub25wcmVkaWN0ZWQpOwotICAqcHJlZGljdGVkX2JpdHMgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzQnVsayhwcmVkaWN0ZWQpOwotICBTYk1lbW9yeURlYWxsb2NhdGUocHJlZGljdGVkKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgVlA4TEVuY0FuYWx5emUoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywgV2ViUEltYWdlSGludCBpbWFnZV9oaW50KSB7Ci0gIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIFNCX0RDSEVDSyhwaWMgIT0gTlVMTCAmJiBwaWMtPmFyZ2IgIT0gTlVMTCk7Ci0KLSAgZW5jLT51c2VfcGFsZXR0ZV8gPQotICAgICAgQW5hbHl6ZUFuZENyZWF0ZVBhbGV0dGUocGljLCBlbmMtPnBhbGV0dGVfLCAmZW5jLT5wYWxldHRlX3NpemVfKTsKLQotICBpZiAoaW1hZ2VfaGludCA9PSBXRUJQX0hJTlRfR1JBUEgpIHsKLSAgICBpZiAoZW5jLT51c2VfcGFsZXR0ZV8gJiYgZW5jLT5wYWxldHRlX3NpemVfIDwgTUFYX0NPTE9SU19GT1JfR1JBUEgpIHsKLSAgICAgIGVuYy0+dXNlX3BhbGV0dGVfID0gMDsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWVuYy0+dXNlX3BhbGV0dGVfKSB7Ci0gICAgaWYgKGltYWdlX2hpbnQgPT0gV0VCUF9ISU5UX1BIT1RPKSB7Ci0gICAgICBlbmMtPnVzZV9wcmVkaWN0XyA9IDE7Ci0gICAgICBlbmMtPnVzZV9jcm9zc19jb2xvcl8gPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBkb3VibGUgbm9uX3ByZWRfZW50cm9weSwgcHJlZF9lbnRyb3B5OwotICAgICAgaWYgKCFBbmFseXplRW50cm9weShwaWMtPmFyZ2IsIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0LCBwaWMtPmFyZ2Jfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9uX3ByZWRfZW50cm9weSwgJnByZWRfZW50cm9weSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpZiAocHJlZF9lbnRyb3B5IDwgMC45NSAqIG5vbl9wcmVkX2VudHJvcHkpIHsKLSAgICAgICAgZW5jLT51c2VfcHJlZGljdF8gPSAxOwotICAgICAgICAvLyBUT0RPKHZpa2FzYSk6IE9ic2VydmVkIHNvbWUgY29ycmVsYXRpb24gb2YgY3Jvc3NfY29sb3IgdHJhbnNmb3JtIHdpdGgKLSAgICAgICAgLy8gcHJlZGljdC4gTmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIgYW5kIGFkZCBzZXBhcmF0ZSBoZXVyaXN0aWMKLSAgICAgICAgLy8gZm9yIHNldHRpbmcgdXNlX2Nyb3NzX2NvbG9yIGZsYWcuCi0gICAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcygKLSAgICBjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBoaXN0b2dyYW1faW1hZ2UsCi0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGVzKSB7Ci0gIGludCBpLCBrOwotICBpbnQgb2sgPSAxOwotICB1aW50NjRfdCB0b3RhbF9sZW5ndGhfc2l6ZSA9IDA7Ci0gIHVpbnQ4X3QqIG1lbV9idWYgPSBOVUxMOwotICBjb25zdCBpbnQgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBoaXN0b2dyYW1faW1hZ2UtPnNpemU7Ci0KLSAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBoaXN0b2dyYW1zIGFuZCBnZXQgdGhlIGFnZ3JlZ2F0ZSBudW1iZXIgb2YgY29kZXMgdXNlZC4KLSAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKLSAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1tpXTsKLSAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbNSAqIGldOwotICAgIGZvciAoayA9IDA7IGsgPCA1OyArK2spIHsKLSAgICAgIGNvbnN0IGludCBudW1fc3ltYm9scyA9IChrID09IDApID8gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGhpc3RvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGsgPT0gNCkgPyBOVU1fRElTVEFOQ0VfQ09ERVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDI1NjsKLSAgICAgIGNvZGVzW2tdLm51bV9zeW1ib2xzID0gbnVtX3N5bWJvbHM7Ci0gICAgICB0b3RhbF9sZW5ndGhfc2l6ZSArPSBudW1fc3ltYm9sczsKLSAgICB9Ci0gIH0KLQotICAvLyBBbGxvY2F0ZSBhbmQgU2V0IEh1ZmZtYW4gY29kZXMuCi0gIHsKLSAgICB1aW50MTZfdCogY29kZXM7Ci0gICAgdWludDhfdCogbGVuZ3RoczsKLSAgICBtZW1fYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKHRvdGFsX2xlbmd0aF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpsZW5ndGhzKSArIHNpemVvZigqY29kZXMpKTsKLSAgICBpZiAobWVtX2J1ZiA9PSBOVUxMKSB7Ci0gICAgICBvayA9IDA7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gICAgY29kZXMgPSAodWludDE2X3QqKW1lbV9idWY7Ci0gICAgbGVuZ3RocyA9ICh1aW50OF90KikmY29kZXNbdG90YWxfbGVuZ3RoX3NpemVdOwotICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgewotICAgICAgY29uc3QgaW50IGJpdF9sZW5ndGggPSBodWZmbWFuX2NvZGVzW2ldLm51bV9zeW1ib2xzOwotICAgICAgaHVmZm1hbl9jb2Rlc1tpXS5jb2RlcyA9IGNvZGVzOwotICAgICAgaHVmZm1hbl9jb2Rlc1tpXS5jb2RlX2xlbmd0aHMgPSBsZW5ndGhzOwotICAgICAgY29kZXMgKz0gYml0X2xlbmd0aDsKLSAgICAgIGxlbmd0aHMgKz0gYml0X2xlbmd0aDsKLSAgICB9Ci0gIH0KLQotICAvLyBDcmVhdGUgSHVmZm1hbiB0cmVlcy4KLSAgZm9yIChpID0gMDsgb2sgJiYgKGkgPCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSk7ICsraSkgewotICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07Ci0gICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbaV07Ci0gICAgb2sgPSBvayAmJiBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmxpdGVyYWxfLCAxNSwgY29kZXMgKyAwKTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+cmVkXywgMTUsIGNvZGVzICsgMSk7Ci0gICAgb2sgPSBvayAmJiBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmJsdWVfLCAxNSwgY29kZXMgKyAyKTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+YWxwaGFfLCAxNSwgY29kZXMgKyAzKTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+ZGlzdGFuY2VfLCAxNSwgY29kZXMgKyA0KTsKLSAgfQotCi0gRW5kOgotICBpZiAoIW9rKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKG1lbV9idWYpOwotICAgIC8vIElmIG9uZSBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoKSBhYm92ZSBmYWlscywgd2UgbmVlZCB0byBjbGVhbiB1cCBiZWhpbmQuCi0gICAgU2JNZW1vcnlTZXQoaHVmZm1hbl9jb2RlcywgMCwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplICogc2l6ZW9mKCpodWZmbWFuX2NvZGVzKSk7Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5UcmVlT2ZIdWZmbWFuVHJlZVRvQml0TWFzaygKLSAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgY29uc3QgdWludDhfdCogY29kZV9sZW5ndGhfYml0ZGVwdGgpIHsKLSAgLy8gUkZDIDE5NTEgd2lsbCBjYWxtIHlvdSBkb3duIGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCB0aGlzIGZ1bm55IHNlcXVlbmNlLgotICAvLyBUaGlzIHNlcXVlbmNlIGlzIHR1bmVkIGZyb20gdGhhdCwgYnV0IG1vcmUgd2VpZ2h0ZWQgZm9yIGxvd2VyIHN5bWJvbCBjb3VudCwKLSAgLy8gYW5kIG1vcmUgc3Bpa2luZyBoaXN0b2dyYW1zLgotICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RvcmFnZU9yZGVyW0NPREVfTEVOR1RIX0NPREVTXSA9IHsKLSAgICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci0gIH07Ci0gIGludCBpOwotICAvLyBUaHJvdyBhd2F5IHRyYWlsaW5nIHplcm9zOgotICBpbnQgY29kZXNfdG9fc3RvcmUgPSBDT0RFX0xFTkdUSF9DT0RFUzsKLSAgZm9yICg7IGNvZGVzX3RvX3N0b3JlID4gNDsgLS1jb2Rlc190b19zdG9yZSkgewotICAgIGlmIChjb2RlX2xlbmd0aF9iaXRkZXB0aFtrU3RvcmFnZU9yZGVyW2NvZGVzX3RvX3N0b3JlIC0gMV1dICE9IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBWUDhMV3JpdGVCaXRzKGJ3LCA0LCBjb2Rlc190b19zdG9yZSAtIDQpOwotICBmb3IgKGkgPSAwOyBpIDwgY29kZXNfdG9fc3RvcmU7ICsraSkgewotICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbaV1dKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKAotICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7Ci0gIGludCBrOwotICBpbnQgY291bnQgPSAwOwotICBmb3IgKGsgPSAwOyBrIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9sczsgKytrKSB7Ci0gICAgaWYgKGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2tdICE9IDApIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICBpZiAoY291bnQgPiAxKSByZXR1cm47Ci0gICAgfQotICB9Ci0gIGZvciAoayA9IDA7IGsgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzOyArK2spIHsKLSAgICBodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1trXSA9IDA7Ci0gICAgaHVmZm1hbl9jb2RlLT5jb2Rlc1trXSA9IDA7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU3RvcmVIdWZmbWFuVHJlZVRvQml0TWFzaygKLSAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICBjb25zdCBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsIGNvbnN0IGludCBudW1fdG9rZW5zLAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rva2VuczsgKytpKSB7Ci0gICAgY29uc3QgaW50IGl4ID0gdG9rZW5zW2ldLmNvZGU7Ci0gICAgY29uc3QgaW50IGV4dHJhX2JpdHMgPSB0b2tlbnNbaV0uZXh0cmFfYml0czsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCBodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1tpeF0sIGh1ZmZtYW5fY29kZS0+Y29kZXNbaXhdKTsKLSAgICBzd2l0Y2ggKGl4KSB7Ci0gICAgICBjYXNlIDE2OgotICAgICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAyLCBleHRyYV9iaXRzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE3OgotICAgICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBleHRyYV9iaXRzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE4OgotICAgICAgICBWUDhMV3JpdGVCaXRzKGJ3LCA3LCBleHRyYV9iaXRzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQgU3RvcmVGdWxsSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSkgewotICBpbnQgb2sgPSAwOwotICB1aW50OF90IGNvZGVfbGVuZ3RoX2JpdGRlcHRoW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OwotICB1aW50MTZfdCBjb2RlX2xlbmd0aF9iaXRkZXB0aF9zeW1ib2xzW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OwotICBjb25zdCBpbnQgbWF4X3Rva2VucyA9IHRyZWUtPm51bV9zeW1ib2xzOwotICBpbnQgbnVtX3Rva2VuczsKLSAgSHVmZm1hblRyZWVDb2RlIGh1ZmZtYW5fY29kZTsKLSAgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgdG9rZW5zID0KLSAgICAgIChIdWZmbWFuVHJlZVRva2VuKilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpbWF4X3Rva2Vucywgc2l6ZW9mKCp0b2tlbnMpKTsKLSAgaWYgKHRva2VucyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBodWZmbWFuX2NvZGUubnVtX3N5bWJvbHMgPSBDT0RFX0xFTkdUSF9DT0RFUzsKLSAgaHVmZm1hbl9jb2RlLmNvZGVfbGVuZ3RocyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoOwotICBodWZmbWFuX2NvZGUuY29kZXMgPSBjb2RlX2xlbmd0aF9iaXRkZXB0aF9zeW1ib2xzOwotCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsIDApOwotICBudW1fdG9rZW5zID0gVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZSh0cmVlLCB0b2tlbnMsIG1heF90b2tlbnMpOwotICB7Ci0gICAgaW50IGhpc3RvZ3JhbVtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rva2VuczsgKytpKSB7Ci0gICAgICArK2hpc3RvZ3JhbVt0b2tlbnNbaV0uY29kZV07Ci0gICAgfQotCi0gICAgaWYgKCFWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG9ncmFtLCA3LCAmaHVmZm1hbl9jb2RlKSkgewotICAgICAgZ290byBFbmQ7Ci0gICAgfQotICB9Ci0KLSAgU3RvcmVIdWZmbWFuVHJlZU9mSHVmZm1hblRyZWVUb0JpdE1hc2soYncsIGNvZGVfbGVuZ3RoX2JpdGRlcHRoKTsKLSAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbCgmaHVmZm1hbl9jb2RlKTsKLSAgewotICAgIGludCB0cmFpbGluZ196ZXJvX2JpdHMgPSAwOwotICAgIGludCB0cmltbWVkX2xlbmd0aCA9IG51bV90b2tlbnM7Ci0gICAgaW50IHdyaXRlX3RyaW1tZWRfbGVuZ3RoOwotICAgIGludCBsZW5ndGg7Ci0gICAgaW50IGkgPSBudW1fdG9rZW5zOwotICAgIHdoaWxlIChpLS0gPiAwKSB7Ci0gICAgICBjb25zdCBpbnQgaXggPSB0b2tlbnNbaV0uY29kZTsKLSAgICAgIGlmIChpeCA9PSAwIHx8IGl4ID09IDE3IHx8IGl4ID09IDE4KSB7Ci0gICAgICAgIC0tdHJpbW1lZF9sZW5ndGg7ICAgLy8gZGlzY291bnQgdHJhaWxpbmcgemVyb3MKLSAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2l4XTsKLSAgICAgICAgaWYgKGl4ID09IDE3KSB7Ci0gICAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IDM7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXggPT0gMTgpIHsKLSAgICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gNzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHdyaXRlX3RyaW1tZWRfbGVuZ3RoID0gKHRyaW1tZWRfbGVuZ3RoID4gMSAmJiB0cmFpbGluZ196ZXJvX2JpdHMgPiAxMik7Ci0gICAgbGVuZ3RoID0gd3JpdGVfdHJpbW1lZF9sZW5ndGggPyB0cmltbWVkX2xlbmd0aCA6IG51bV90b2tlbnM7Ci0gICAgVlA4TFdyaXRlQml0cyhidywgMSwgd3JpdGVfdHJpbW1lZF9sZW5ndGgpOwotICAgIGlmICh3cml0ZV90cmltbWVkX2xlbmd0aCkgewotICAgICAgY29uc3QgaW50IG5iaXRzID0gVlA4TEJpdHNMb2cyQ2VpbGluZyh0cmltbWVkX2xlbmd0aCAtIDEpOwotICAgICAgY29uc3QgaW50IG5iaXRwYWlycyA9IChuYml0cyA9PSAwKSA/IDEgOiAobmJpdHMgKyAxKSAvIDI7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBuYml0cGFpcnMgLSAxKTsKLSAgICAgIFNCX0RDSEVDSyh0cmltbWVkX2xlbmd0aCA+PSAyKTsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIG5iaXRwYWlycyAqIDIsIHRyaW1tZWRfbGVuZ3RoIC0gMik7Ci0gICAgfQotICAgIFN0b3JlSHVmZm1hblRyZWVUb0JpdE1hc2soYncsIHRva2VucywgbGVuZ3RoLCAmaHVmZm1hbl9jb2RlKTsKLSAgfQotICBvayA9IDE7Ci0gRW5kOgotICBTYk1lbW9yeURlYWxsb2NhdGUodG9rZW5zKTsKLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50IFN0b3JlSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKLSAgaW50IGk7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGludCBzeW1ib2xzWzJdID0geyAwLCAwIH07Ci0gIGNvbnN0IGludCBrTWF4Qml0cyA9IDg7Ci0gIGNvbnN0IGludCBrTWF4U3ltYm9sID0gMSA8PCBrTWF4Qml0czsKLQotICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYSBzbWFsbCB0cmVlLgotICBmb3IgKGkgPSAwOyBpIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9scyAmJiBjb3VudCA8IDM7ICsraSkgewotICAgIGlmIChodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1tpXSAhPSAwKSB7Ci0gICAgICBpZiAoY291bnQgPCAyKSBzeW1ib2xzW2NvdW50XSA9IGk7Ci0gICAgICArK2NvdW50OwotICAgIH0KLSAgfQotCi0gIGlmIChjb3VudCA9PSAwKSB7ICAgLy8gZW1pdCBtaW5pbWFsIHRyZWUgZm9yIGVtcHR5IGNhc2VzCi0gICAgLy8gYml0czogc21hbGwgdHJlZSBtYXJrZXI6IDEsIGNvdW50LTE6IDAsIGxhcmdlIDgtYml0IGNvZGU6IDAsIGNvZGU6IDAKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCA0LCAweDAxKTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChjb3VudCA8PSAyICYmIHN5bWJvbHNbMF0gPCBrTWF4U3ltYm9sICYmIHN5bWJvbHNbMV0gPCBrTWF4U3ltYm9sKSB7Ci0gICAgVlA4TFdyaXRlQml0cyhidywgMSwgMSk7ICAvLyBTbWFsbCB0cmVlIG1hcmtlciB0byBlbmNvZGUgMSBvciAyIHN5bWJvbHMuCi0gICAgVlA4TFdyaXRlQml0cyhidywgMSwgY291bnQgLSAxKTsKLSAgICBpZiAoc3ltYm9sc1swXSA8PSAxKSB7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAwKTsgIC8vIENvZGUgYml0IGZvciBzbWFsbCAoMSBiaXQpIHN5bWJvbCB2YWx1ZS4KLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIHN5bWJvbHNbMF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAxKTsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDgsIHN5bWJvbHNbMF0pOwotICAgIH0KLSAgICBpZiAoY291bnQgPT0gMikgewotICAgICAgVlA4TFdyaXRlQml0cyhidywgOCwgc3ltYm9sc1sxXSk7Ci0gICAgfQotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBTdG9yZUZ1bGxIdWZmbWFuQ29kZShidywgaHVmZm1hbl9jb2RlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZUh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2luZGV4KSB7Ci0gIGNvbnN0IGludCBkZXB0aCA9IGNvZGUtPmNvZGVfbGVuZ3Roc1tjb2RlX2luZGV4XTsKLSAgY29uc3QgaW50IHN5bWJvbCA9IGNvZGUtPmNvZGVzW2NvZGVfaW5kZXhdOwotICBWUDhMV3JpdGVCaXRzKGJ3LCBkZXB0aCwgc3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQgU3RvcmVJbWFnZVRvQml0TWFzaygKLSAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IHdpZHRoLCBpbnQgaGlzdG9fYml0cywKLSAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgIGNvbnN0IHVpbnQxNl90KiBoaXN0b2dyYW1fc3ltYm9scywKLSAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZXMpIHsKLSAgLy8geCBhbmQgeSB0cmFjZSB0aGUgcG9zaXRpb24gaW4gdGhlIGltYWdlLgotICBpbnQgeCA9IDA7Ci0gIGludCB5ID0gMDsKLSAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b19iaXRzKSA6IDE7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgcmVmcy0+c2l6ZTsgKytpKSB7Ci0gICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gJnJlZnMtPnJlZnNbaV07Ci0gICAgY29uc3QgaW50IGhpc3RvZ3JhbV9peCA9IGhpc3RvZ3JhbV9zeW1ib2xzW2hpc3RvX2JpdHMgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSA+PiBoaXN0b19iaXRzKSAqIGhpc3RvX3hzaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggPj4gaGlzdG9fYml0cykgOiAwXTsKLSAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gaHVmZm1hbl9jb2RlcyArIDUgKiBoaXN0b2dyYW1faXg7Ci0gICAgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKLSAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5Q2FjaGVJZHgodik7Ci0gICAgICBjb25zdCBpbnQgbGl0ZXJhbF9peCA9IDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKyBjb2RlOwotICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMsIGxpdGVyYWxfaXgpOwotICAgIH0gZWxzZSBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7Ci0gICAgICBzdGF0aWMgY29uc3QgaW50IG9yZGVyW10gPSB7IDEsIDIsIDAsIDMgfTsKLSAgICAgIGludCBrOwotICAgICAgZm9yIChrID0gMDsgayA8IDQ7ICsraykgewotICAgICAgICBjb25zdCBpbnQgY29kZSA9IFBpeE9yQ29weUxpdGVyYWwodiwgb3JkZXJba10pOwotICAgICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcyArIGssIGNvZGUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgYml0cywgbl9iaXRzOwotICAgICAgaW50IGNvZGUsIGRpc3RhbmNlOwotCi0gICAgICBQcmVmaXhFbmNvZGUodi0+bGVuLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOwotICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMsIDI1NiArIGNvZGUpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgbl9iaXRzLCBiaXRzKTsKLQotICAgICAgZGlzdGFuY2UgPSBQaXhPckNvcHlEaXN0YW5jZSh2KTsKLSAgICAgIFByZWZpeEVuY29kZShkaXN0YW5jZSwgJmNvZGUsICZuX2JpdHMsICZiaXRzKTsKLSAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgNCwgY29kZSk7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCBuX2JpdHMsIGJpdHMpOwotICAgIH0KLSAgICB4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKLSAgICB3aGlsZSAoeCA+PSB3aWR0aCkgewotICAgICAgeCAtPSB3aWR0aDsKLSAgICAgICsreTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gU3BlY2lhbCBjYXNlIG9mIEVuY29kZUltYWdlSW50ZXJuYWwoKSBmb3IgY2FjaGUtYml0cz0wLCBoaXN0b19iaXRzPTMxCi1zdGF0aWMgaW50IEVuY29kZUltYWdlTm9IdWZmbWFuKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSkgewotICBpbnQgaTsKLSAgaW50IG9rID0gMDsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzOwotICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2Rlc1s1XSA9IHsgeyAwLCBOVUxMLCBOVUxMIH0gfTsKLSAgY29uc3QgdWludDE2X3QgaGlzdG9ncmFtX3N5bWJvbHNbMV0gPSB7IDAgfTsgICAgLy8gb25seSBvbmUgdHJlZSwgb25lIHN5bWJvbAotICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBoaXN0b2dyYW1faW1hZ2UgPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoMSwgMCk7Ci0gIGlmIChoaXN0b2dyYW1faW1hZ2UgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgotICBpZiAoIVZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMod2lkdGgsIGhlaWdodCwgYXJnYiwgcXVhbGl0eSwgMCwgMSwgJnJlZnMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBCdWlsZCBoaXN0b2dyYW0gaW1hZ2UgYW5kIHN5bWJvbHMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgotICBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKCZyZWZzLCBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbMF0pOwotCi0gIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCi0gIFNCX0RDSEVDSyhoaXN0b2dyYW1faW1hZ2UtPnNpemUgPT0gMSk7Ci0gIGlmICghR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcyhoaXN0b2dyYW1faW1hZ2UsIGh1ZmZtYW5fY29kZXMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIC8vIE5vIGNvbG9yIGNhY2hlLCBubyBIdWZmbWFuIGltYWdlLgotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAwKTsKLQotICAvLyBTdG9yZSBIdWZmbWFuIGNvZGVzLgotICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOwotICAgIGlmICghU3RvcmVIdWZmbWFuQ29kZShidywgY29kZXMpKSB7Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKGNvZGVzKTsKLSAgfQotCi0gIC8vIFN0b3JlIGFjdHVhbCBsaXRlcmFscy4KLSAgU3RvcmVJbWFnZVRvQml0TWFzayhidywgd2lkdGgsIDAsICZyZWZzLCBoaXN0b2dyYW1fc3ltYm9scywgaHVmZm1hbl9jb2Rlcyk7Ci0gIG9rID0gMTsKLQotIEVycm9yOgotICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG9ncmFtX2ltYWdlKTsKLSAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGh1ZmZtYW5fY29kZXNbMF0uY29kZXMpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgRW5jb2RlSW1hZ2VJbnRlcm5hbChWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9iaXRzLCBpbnQgaGlzdG9ncmFtX2JpdHMpIHsKLSAgaW50IG9rID0gMDsKLSAgY29uc3QgaW50IHVzZV8yZF9sb2NhbGl0eSA9IDE7Ci0gIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOwotICBjb25zdCB1aW50MzJfdCBoaXN0b2dyYW1faW1hZ2VfeHlzaXplID0KLSAgICAgIFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b2dyYW1fYml0cykgKgotICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b2dyYW1fYml0cyk7Ci0gIFZQOExIaXN0b2dyYW1TZXQqIGhpc3RvZ3JhbV9pbWFnZSA9Ci0gICAgICBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwgMCk7Ci0gIGludCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IDA7Ci0gIHNpemVfdCBiaXRfYXJyYXlfc2l6ZSA9IDA7Ci0gIEh1ZmZtYW5UcmVlQ29kZSogaHVmZm1hbl9jb2RlcyA9IE5VTEw7Ci0gIFZQOExCYWNrd2FyZFJlZnMgcmVmczsKLSAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzID0KLSAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWhpc3RvZ3JhbV9pbWFnZV94eXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX3N5bWJvbHMpKTsKLSAgU0JfRENIRUNLKGhpc3RvZ3JhbV9iaXRzID49IE1JTl9IVUZGTUFOX0JJVFMpOwotICBTQl9EQ0hFQ0soaGlzdG9ncmFtX2JpdHMgPD0gTUFYX0hVRkZNQU5fQklUUyk7Ci0KLSAgaWYgKGhpc3RvZ3JhbV9pbWFnZSA9PSBOVUxMIHx8IGhpc3RvZ3JhbV9zeW1ib2xzID09IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG9ncmFtX2ltYWdlKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG9ncmFtX3N5bWJvbHMpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgotICBpZiAoIVZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMod2lkdGgsIGhlaWdodCwgYXJnYiwgcXVhbGl0eSwgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV8yZF9sb2NhbGl0eSwgJnJlZnMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBCdWlsZCBoaXN0b2dyYW0gaW1hZ2UgYW5kIHN5bWJvbHMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgotICBpZiAoIVZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyh3aWR0aCwgaGVpZ2h0LCAmcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgaGlzdG9ncmFtX2JpdHMsIGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX3N5bWJvbHMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBDcmVhdGUgSHVmZm1hbiBiaXQgbGVuZ3RocyBhbmQgY29kZXMgZm9yIGVhY2ggaGlzdG9ncmFtIGltYWdlLgotICBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKLSAgYml0X2FycmF5X3NpemUgPSA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7Ci0gIGh1ZmZtYW5fY29kZXMgPSAoSHVmZm1hblRyZWVDb2RlKilXZWJQU2FmZUNhbGxvYyhiaXRfYXJyYXlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZm1hbl9jb2RlcykpOwotICBpZiAoaHVmZm1hbl9jb2RlcyA9PSBOVUxMIHx8Ci0gICAgICAhR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcyhoaXN0b2dyYW1faW1hZ2UsIGh1ZmZtYW5fY29kZXMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBGcmVlIGNvbWJpbmVkIGhpc3RvZ3JhbXMuCi0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotICBoaXN0b2dyYW1faW1hZ2UgPSBOVUxMOwotCi0gIC8vIENvbG9yIENhY2hlIHBhcmFtZXRlcnMuCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsIHVzZV9jb2xvcl9jYWNoZSk7Ci0gIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCA0LCBjYWNoZV9iaXRzKTsKLSAgfQotCi0gIC8vIEh1ZmZtYW4gaW1hZ2UgKyBtZXRhIGh1ZmZtYW4uCi0gIHsKLSAgICBjb25zdCBpbnQgd3JpdGVfaGlzdG9ncmFtX2ltYWdlID0gKGhpc3RvZ3JhbV9pbWFnZV9zaXplID4gMSk7Ci0gICAgVlA4TFdyaXRlQml0cyhidywgMSwgd3JpdGVfaGlzdG9ncmFtX2ltYWdlKTsKLSAgICBpZiAod3JpdGVfaGlzdG9ncmFtX2ltYWdlKSB7Ci0gICAgICB1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtX2FyZ2IgPQotICAgICAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWhpc3RvZ3JhbV9pbWFnZV94eXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhpc3RvZ3JhbV9hcmdiKSk7Ci0gICAgICBpbnQgbWF4X2luZGV4ID0gMDsKLSAgICAgIHVpbnQzMl90IGk7Ci0gICAgICBpZiAoaGlzdG9ncmFtX2FyZ2IgPT0gTlVMTCkgZ290byBFcnJvcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2VfeHlzaXplOyArK2kpIHsKLSAgICAgICAgY29uc3QgaW50IHN5bWJvbF9pbmRleCA9IGhpc3RvZ3JhbV9zeW1ib2xzW2ldICYgMHhmZmZmOwotICAgICAgICBoaXN0b2dyYW1fYXJnYltpXSA9IDB4ZmYwMDAwMDAgfCAoc3ltYm9sX2luZGV4IDw8IDgpOwotICAgICAgICBpZiAoc3ltYm9sX2luZGV4ID49IG1heF9pbmRleCkgewotICAgICAgICAgIG1heF9pbmRleCA9IHN5bWJvbF9pbmRleCArIDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gbWF4X2luZGV4OwotCi0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBoaXN0b2dyYW1fYml0cyAtIDIpOwotICAgICAgb2sgPSBFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgaGlzdG9ncmFtX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b2dyYW1fYml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgaGlzdG9ncmFtX2JpdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLSAgICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1fYXJnYik7Ci0gICAgICBpZiAoIW9rKSBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotCi0gIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCi0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKLSAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKLSAgICAgIGlmICghU3RvcmVIdWZmbWFuQ29kZShidywgY29kZXMpKSBnb3RvIEVycm9yOwotICAgICAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbChjb2Rlcyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgotICBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgaGlzdG9ncmFtX2JpdHMsICZyZWZzLAotICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9zeW1ib2xzLCBodWZmbWFuX2NvZGVzKTsKLSAgb2sgPSAxOwotCi0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotCi0gIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmcyk7Ci0gIGlmIChodWZmbWFuX2NvZGVzICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaHVmZm1hbl9jb2Rlcy0+Y29kZXMpOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShodWZmbWFuX2NvZGVzKTsKLSAgfQotICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG9ncmFtX3N5bWJvbHMpOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUcmFuc2Zvcm1zCi0KLS8vIENoZWNrIGlmIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0IGdyZWVuIGZyb20gcmVkIGFuZCBibHVlLiBXZQotLy8gb25seSBpbXBhY3QgZW50cm9weSBpbiByZWQvYmx1ZSBjb21wb25lbnRzLCBkb24ndCBib3RoZXIgdG8gbG9vayBhdCBvdGhlcnMuCi1zdGF0aWMgaW50IEV2YWxBbmRBcHBseVN1YnRyYWN0R3JlZW4oVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgaWYgKCFlbmMtPnVzZV9wYWxldHRlXykgewotICAgIGludCBpOwotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiID0gZW5jLT5hcmdiXzsKLSAgICBkb3VibGUgYml0X2Nvc3RfYmVmb3JlLCBiaXRfY29zdF9hZnRlcjsKLSAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IChWUDhMSGlzdG9ncmFtKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqaGlzdG8pKTsKLSAgICBpZiAoaGlzdG8gPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICBWUDhMSGlzdG9ncmFtSW5pdChoaXN0bywgMSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSBhcmdiW2ldOwotICAgICAgKytoaXN0by0+cmVkX1soYyA+PiAxNikgJiAweGZmXTsKLSAgICAgICsraGlzdG8tPmJsdWVfWyhjID4+IDApICYgMHhmZl07Ci0gICAgfQotICAgIGJpdF9jb3N0X2JlZm9yZSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOwotCi0gICAgVlA4TEhpc3RvZ3JhbUluaXQoaGlzdG8sIDEpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBjID0gYXJnYltpXTsKLSAgICAgIGNvbnN0IGludCBncmVlbiA9IChjID4+IDgpICYgMHhmZjsKLSAgICAgICsraGlzdG8tPnJlZF9bKChjID4+IDE2KSAtIGdyZWVuKSAmIDB4ZmZdOwotICAgICAgKytoaXN0by0+Ymx1ZV9bKChjID4+IDApIC0gZ3JlZW4pICYgMHhmZl07Ci0gICAgfQotICAgIGJpdF9jb3N0X2FmdGVyID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvKTsKLQotICAgIC8vIENoZWNrIGlmIHN1YnRyYWN0aW5nIGdyZWVuIHlpZWxkcyBsb3cgZW50cm9weS4KLSAgICBlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8gPSAoYml0X2Nvc3RfYWZ0ZXIgPCBiaXRfY29zdF9iZWZvcmUpOwotICAgIGlmIChlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8pIHsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIFRSQU5TRk9STV9QUkVTRU5UKTsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDIsIFNVQlRSQUNUX0dSRUVOKTsKLSAgICAgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQoZW5jLT5hcmdiXywgd2lkdGggKiBoZWlnaHQpOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBBcHBseVByZWRpY3RGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBjb25zdCBpbnQgcHJlZF9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187Ci0gIGNvbnN0IGludCB0cmFuc2Zvcm1fd2lkdGggPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgcHJlZF9iaXRzKTsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV9oZWlnaHQgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIHByZWRfYml0cyk7Ci0KLSAgVlA4TFJlc2lkdWFsSW1hZ2Uod2lkdGgsIGhlaWdodCwgcHJlZF9iaXRzLCBlbmMtPmFyZ2JfLCBlbmMtPmFyZ2Jfc2NyYXRjaF8sCi0gICAgICAgICAgICAgICAgICAgIGVuYy0+dHJhbnNmb3JtX2RhdGFfKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAyLCBQUkVESUNUT1JfVFJBTlNGT1JNKTsKLSAgU0JfRENIRUNLKHByZWRfYml0cyA+PSAyKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMywgcHJlZF9iaXRzIC0gMik7Ci0gIGlmICghRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV93aWR0aCwgdHJhbnNmb3JtX2hlaWdodCwgcXVhbGl0eSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBjb25zdCBpbnQgY2NvbG9yX3RyYW5zZm9ybV9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187Ci0gIGNvbnN0IGludCB0cmFuc2Zvcm1fd2lkdGggPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzKTsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV9oZWlnaHQgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGNjb2xvcl90cmFuc2Zvcm1fYml0cyk7Ci0gIGNvbnN0IGludCBzdGVwID0gKHF1YWxpdHkgPT0gMCkgPyAzMiA6IDg7Ci0KLSAgVlA4TENvbG9yU3BhY2VUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzLCBzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPmFyZ2JfLCBlbmMtPnRyYW5zZm9ybV9kYXRhXyk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDEsIFRSQU5TRk9STV9QUkVTRU5UKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMiwgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNKTsKLSAgU0JfRENIRUNLKGNjb2xvcl90cmFuc2Zvcm1fYml0cyA+PSAyKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMywgY2NvbG9yX3RyYW5zZm9ybV9iaXRzIC0gMik7Ci0gIGlmICghRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV93aWR0aCwgdHJhbnNmb3JtX2hlaWdodCwgcXVhbGl0eSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFdyaXRlUmlmZkhlYWRlcihjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLCBzaXplX3QgdnA4bF9zaXplKSB7Ci0gIHVpbnQ4X3QgcmlmZltSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhMX1NJR05BVFVSRV9TSVpFXSA9IHsKLSAgICAnUicsICdJJywgJ0YnLCAnRicsIDAsIDAsIDAsIDAsICdXJywgJ0UnLCAnQicsICdQJywKLSAgICAnVicsICdQJywgJzgnLCAnTCcsIDAsIDAsIDAsIDAsIFZQOExfTUFHSUNfQllURSwKLSAgfTsKLSAgUHV0TEUzMihyaWZmICsgVEFHX1NJWkUsICh1aW50MzJfdClyaWZmX3NpemUpOwotICBQdXRMRTMyKHJpZmYgKyBSSUZGX0hFQURFUl9TSVpFICsgVEFHX1NJWkUsICh1aW50MzJfdCl2cDhsX3NpemUpOwotICBpZiAoIXBpYy0+d3JpdGVyKHJpZmYsIHNpemVvZihyaWZmKSwgcGljKSkgewotICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKLSAgfQotICByZXR1cm4gVlA4X0VOQ19PSzsKLX0KLQotc3RhdGljIGludCBXcml0ZUltYWdlU2l6ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoIC0gMTsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0IC0gMTsKLSAgU0JfRENIRUNLKHdpZHRoIDwgV0VCUF9NQVhfRElNRU5TSU9OICYmIGhlaWdodCA8IFdFQlBfTUFYX0RJTUVOU0lPTik7Ci0KLSAgVlA4TFdyaXRlQml0cyhidywgVlA4TF9JTUFHRV9TSVpFX0JJVFMsIHdpZHRoKTsKLSAgVlA4TFdyaXRlQml0cyhidywgVlA4TF9JTUFHRV9TSVpFX0JJVFMsIGhlaWdodCk7Ci0gIHJldHVybiAhYnctPmVycm9yXzsKLX0KLQotc3RhdGljIGludCBXcml0ZVJlYWxBbHBoYUFuZFZlcnNpb24oVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBoYXNfYWxwaGEpIHsKLSAgVlA4TFdyaXRlQml0cyhidywgMSwgaGFzX2FscGhhKTsKLSAgVlA4TFdyaXRlQml0cyhidywgVlA4TF9WRVJTSU9OX0JJVFMsIFZQOExfVkVSU0lPTik7Ci0gIHJldHVybiAhYnctPmVycm9yXzsKLX0KLQotc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFdyaXRlSW1hZ2UoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBjb2RlZF9zaXplKSB7Ci0gIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHdlYnBsbF9kYXRhID0gVlA4TEJpdFdyaXRlckZpbmlzaChidyk7Ci0gIGNvbnN0IHNpemVfdCB3ZWJwbGxfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7Ci0gIGNvbnN0IHNpemVfdCB2cDhsX3NpemUgPSBWUDhMX1NJR05BVFVSRV9TSVpFICsgd2VicGxsX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBwYWQgPSB2cDhsX3NpemUgJiAxOwotICBjb25zdCBzaXplX3QgcmlmZl9zaXplID0gVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSArIHZwOGxfc2l6ZSArIHBhZDsKLQotICBlcnIgPSBXcml0ZVJpZmZIZWFkZXIocGljLCByaWZmX3NpemUsIHZwOGxfc2l6ZSk7Ci0gIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLQotICBpZiAoIXBpYy0+d3JpdGVyKHdlYnBsbF9kYXRhLCB3ZWJwbGxfc2l6ZSwgcGljKSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBpZiAocGFkKSB7Ci0gICAgY29uc3QgdWludDhfdCBwYWRfYnl0ZVsxXSA9IHsgMCB9OwotICAgIGlmICghcGljLT53cml0ZXIocGFkX2J5dGUsIDEsIHBpYykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLSAgKmNvZGVkX3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIHJpZmZfc2l6ZTsKLSAgcmV0dXJuIFZQOF9FTkNfT0s7Ci0KLSBFcnJvcjoKLSAgcmV0dXJuIGVycjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIGFyZ2IgKFcgeCBIKSBidWZmZXIsIDIgcm93cyBvZiBjb250ZXh0IGZvcgotLy8gcHJlZGljdGlvbiBhbmQgdHJhbnNmb3JtIGRhdGEuCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgY29uc3QgaW50IHRpbGVfc2l6ZSA9IDEgPDwgZW5jLT50cmFuc2Zvcm1fYml0c187Ci0gIGNvbnN0IHVpbnQ2NF90IGltYWdlX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgY29uc3QgdWludDY0X3QgYXJnYl9zY3JhdGNoX3NpemUgPSB0aWxlX3NpemUgKiB3aWR0aCArIHdpZHRoOwotICBjb25zdCB1aW50NjRfdCB0cmFuc2Zvcm1fZGF0YV9zaXplID0KLSAgICAgICh1aW50NjRfdClWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgZW5jLT50cmFuc2Zvcm1fYml0c18pICoKLSAgICAgICh1aW50NjRfdClWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGVuYy0+dHJhbnNmb3JtX2JpdHNfKTsKLSAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9Ci0gICAgICBpbWFnZV9zaXplICsgYXJnYl9zY3JhdGNoX3NpemUgKyB0cmFuc2Zvcm1fZGF0YV9zaXplOwotICB1aW50MzJfdCogbWVtID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbSkpOwotICBpZiAobWVtID09IE5VTEwpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICBlbmMtPmFyZ2JfID0gbWVtOwotICBtZW0gKz0gaW1hZ2Vfc2l6ZTsKLSAgZW5jLT5hcmdiX3NjcmF0Y2hfID0gbWVtOwotICBtZW0gKz0gYXJnYl9zY3JhdGNoX3NpemU7Ci0gIGVuYy0+dHJhbnNmb3JtX2RhdGFfID0gbWVtOwotICBlbmMtPmN1cnJlbnRfd2lkdGhfID0gd2lkdGg7Ci0KLSBFcnJvcjoKLSAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgQXBwbHlQYWxldHRlKHVpbnQzMl90KiBzcmMsIHVpbnQzMl90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3N0cmlkZSwgdWludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcGFsZXR0ZSwgaW50IHBhbGV0dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4Yml0cywgdWludDhfdCogcm93KSB7Ci0gIGludCBpLCB4LCB5OwotICBpbnQgdXNlX0xVVCA9IDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgewotICAgIGlmICgocGFsZXR0ZVtpXSAmIDB4ZmZmZjAwZmZ1KSAhPSAwKSB7Ci0gICAgICB1c2VfTFVUID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmICh1c2VfTFVUKSB7Ci0gICAgaW50IGludl9wYWxldHRlW01BWF9QQUxFVFRFX1NJWkVdID0geyAwIH07Ci0gICAgZm9yIChpID0gMDsgaSA8IHBhbGV0dGVfc2l6ZTsgKytpKSB7Ci0gICAgICBjb25zdCBpbnQgY29sb3IgPSAocGFsZXR0ZVtpXSA+PiA4KSAmIDB4ZmY7Ci0gICAgICBpbnZfcGFsZXR0ZVtjb2xvcl0gPSBpOwotICAgIH0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xvciA9IChzcmNbeF0gPj4gOCkgJiAweGZmOwotICAgICAgICByb3dbeF0gPSBpbnZfcGFsZXR0ZVtjb2xvcl07Ci0gICAgICB9Ci0gICAgICBWUDhMQnVuZGxlQ29sb3JNYXAocm93LCB3aWR0aCwgeGJpdHMsIGRzdCk7Ci0gICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBVc2UgMSBwaXhlbCBjYWNoZSBmb3IgQVJHQiBwaXhlbHMuCi0gICAgdWludDMyX3QgbGFzdF9waXggPSBwYWxldHRlWzBdOwotICAgIGludCBsYXN0X2lkeCA9IDA7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICBjb25zdCB1aW50MzJfdCBwaXggPSBzcmNbeF07Ci0gICAgICAgIGlmIChwaXggIT0gbGFzdF9waXgpIHsKLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsZXR0ZV9zaXplOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChwaXggPT0gcGFsZXR0ZVtpXSkgewotICAgICAgICAgICAgICBsYXN0X2lkeCA9IGk7Ci0gICAgICAgICAgICAgIGxhc3RfcGl4ID0gcGl4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcm93W3hdID0gbGFzdF9pZHg7Ci0gICAgICB9Ci0gICAgICBWUDhMQnVuZGxlQ29sb3JNYXAocm93LCB3aWR0aCwgeGJpdHMsIGRzdCk7Ci0gICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgIH0KLSAgfQotfQotCi0vLyBOb3RlOiBFeHBlY3RzICJlbmMtPnBhbGV0dGVfIiB0byBiZSBzZXQgcHJvcGVybHkuCi0vLyBBbHNvLCAiZW5jLT5wYWxldHRlXyIgd2lsbCBiZSBtb2RpZmllZCBhZnRlciB0aGlzIGNhbGwgYW5kIHNob3VsZCBub3QgYmUgdXNlZAotLy8gbGF0ZXIuCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgRW5jb2RlUGFsZXR0ZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMsIGludCBxdWFsaXR5KSB7Ci0gIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7Ci0gIGludCBpOwotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICB1aW50MzJfdCogc3JjID0gcGljLT5hcmdiOwotICB1aW50MzJfdCogZHN0OwotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7Ci0gIHVpbnQzMl90KiBjb25zdCBwYWxldHRlID0gZW5jLT5wYWxldHRlXzsKLSAgY29uc3QgaW50IHBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKLSAgdWludDhfdCogcm93ID0gTlVMTDsKLSAgaW50IHhiaXRzOwotCi0gIC8vIFJlcGxhY2UgZWFjaCBpbnB1dCBwaXhlbCBieSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgaW5kZXguCi0gIC8vIFRoaXMgaXMgZG9uZSBsaW5lIGJ5IGxpbmUuCi0gIGlmIChwYWxldHRlX3NpemUgPD0gNCkgewotICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAyKSA/IDMgOiAyOwotICB9IGVsc2UgewotICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAxNikgPyAxIDogMDsKLSAgfQotCi0gIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHhiaXRzKSwgaGVpZ2h0KTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotICBkc3QgPSBlbmMtPmFyZ2JfOwotCi0gIHJvdyA9IFdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCl3aWR0aCwgc2l6ZW9mKCpyb3cpKTsKLSAgaWYgKHJvdyA9PSBOVUxMKSByZXR1cm4gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotCi0gIEFwcGx5UGFsZXR0ZShzcmMsIGRzdCwgcGljLT5hcmdiX3N0cmlkZSwgZW5jLT5jdXJyZW50X3dpZHRoXywKLSAgICAgICAgICAgICAgIHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSwgd2lkdGgsIGhlaWdodCwgeGJpdHMsIHJvdyk7Ci0KLSAgLy8gU2F2ZSBwYWxldHRlIHRvIGJpdHN0cmVhbS4KLSAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAyLCBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0pOwotICBTQl9EQ0hFQ0socGFsZXR0ZV9zaXplID49IDEpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCA4LCBwYWxldHRlX3NpemUgLSAxKTsKLSAgZm9yIChpID0gcGFsZXR0ZV9zaXplIC0gMTsgaSA+PSAxOyAtLWkpIHsKLSAgICBwYWxldHRlW2ldID0gVlA4TFN1YlBpeGVscyhwYWxldHRlW2ldLCBwYWxldHRlW2kgLSAxXSk7Ci0gIH0KLSAgaWYgKCFFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCAxLCBxdWFsaXR5KSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotIEVycm9yOgotICBTYk1lbW9yeURlYWxsb2NhdGUocm93KTsKLSAgcmV0dXJuIGVycjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGludCBHZXRIaXN0b0JpdHMoaW50IG1ldGhvZCwgaW50IHVzZV9wYWxldHRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgY29uc3QgdWludDY0X3QgaGlzdF9zaXplID0gc2l6ZW9mKFZQOExIaXN0b2dyYW0pOwotICAvLyBNYWtlIHRpbGUgc2l6ZSBhIGZ1bmN0aW9uIG9mIGVuY29kaW5nIG1ldGhvZCAoUmFuZ2U6IDAgdG8gNikuCi0gIGludCBoaXN0b19iaXRzID0gKHVzZV9wYWxldHRlID8gOSA6IDcpIC0gbWV0aG9kOwotICB3aGlsZSAoMSkgewotICAgIGNvbnN0IHVpbnQ2NF90IGh1ZmZfaW1hZ2Vfc2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b19iaXRzKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b19iaXRzKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdF9zaXplOwotICAgIGlmIChodWZmX2ltYWdlX3NpemUgPD0gTUFYX0hVRkZfSU1BR0VfU0laRSkgYnJlYWs7Ci0gICAgKytoaXN0b19iaXRzOwotICB9Ci0gIHJldHVybiAoaGlzdG9fYml0cyA8IE1JTl9IVUZGTUFOX0JJVFMpID8gTUlOX0hVRkZNQU5fQklUUyA6Ci0gICAgICAgICAoaGlzdG9fYml0cyA+IE1BWF9IVUZGTUFOX0JJVFMpID8gTUFYX0hVRkZNQU5fQklUUyA6IGhpc3RvX2JpdHM7Ci19Ci0KLXN0YXRpYyB2b2lkIEZpbmlzaEVuY1BhcmFtcyhWUDhMRW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKLSAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgY29uc3QgaW50IG1ldGhvZCA9IGNvbmZpZy0+bWV0aG9kOwotICBjb25zdCBmbG9hdCBxdWFsaXR5ID0gY29uZmlnLT5xdWFsaXR5OwotICBjb25zdCBpbnQgdXNlX3BhbGV0dGUgPSBlbmMtPnVzZV9wYWxldHRlXzsKLSAgZW5jLT50cmFuc2Zvcm1fYml0c18gPSAobWV0aG9kIDwgNCkgPyA1IDogKG1ldGhvZCA+IDQpID8gMyA6IDQ7Ci0gIGVuYy0+aGlzdG9fYml0c18gPSBHZXRIaXN0b0JpdHMobWV0aG9kLCB1c2VfcGFsZXR0ZSwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOwotICBlbmMtPmNhY2hlX2JpdHNfID0gKHF1YWxpdHkgPD0gMjUuZikgPyAwIDogNzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOExFbmNvZGVyCi0KLXN0YXRpYyBWUDhMRW5jb2RlciogVlA4TEVuY29kZXJOZXcoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBWUDhMRW5jb2RlciogY29uc3QgZW5jID0gKFZQOExFbmNvZGVyKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmVuYykpOwotICBpZiAoZW5jID09IE5VTEwpIHsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGVuYy0+Y29uZmlnXyA9IGNvbmZpZzsKLSAgZW5jLT5waWNfID0gcGljdHVyZTsKLSAgcmV0dXJuIGVuYzsKLX0KLQotc3RhdGljIHZvaWQgVlA4TEVuY29kZXJEZWxldGUoVlA4TEVuY29kZXIqIGVuYykgewotICBTYk1lbW9yeURlYWxsb2NhdGUoZW5jLT5hcmdiXyk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShlbmMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBjYWxsCi0KLVdlYlBFbmNvZGluZ0Vycm9yIFZQOExFbmNvZGVTdHJlYW0oY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgY29uc3QgaW50IHF1YWxpdHkgPSAoaW50KWNvbmZpZy0+cXVhbGl0eTsKLSAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0gIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSBWUDhMRW5jb2Rlck5ldyhjb25maWcsIHBpY3R1cmUpOwotICBjb25zdCBzaXplX3QgYnl0ZV9wb3NpdGlvbiA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7Ci0KLSAgaWYgKGVuYyA9PSBOVUxMKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQW5hbHl6ZSBpbWFnZSAoZW50cm9weSwgbnVtX3BhbGV0dGVzIGV0YykKLQotICBpZiAoIVZQOExFbmNBbmFseXplKGVuYywgY29uZmlnLT5pbWFnZV9oaW50KSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgRmluaXNoRW5jUGFyYW1zKGVuYyk7Ci0KLSAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSB7Ci0gICAgZXJyID0gRW5jb2RlUGFsZXR0ZShidywgZW5jLCBxdWFsaXR5KTsKLSAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0gICAgLy8gQ29sb3IgY2FjaGUgaXMgZGlzYWJsZWQgZm9yIHBhbGV0dGUuCi0gICAgZW5jLT5jYWNoZV9iaXRzXyA9IDA7Ci0gIH0KLQotICAvLyBJbiBjYXNlIGltYWdlIGlzIG5vdCBwYWNrZWQuCi0gIGlmIChlbmMtPmFyZ2JfID09IE5VTEwpIHsKLSAgICBpbnQgeTsKLSAgICBlcnIgPSBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihlbmMsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIFNiTWVtb3J5Q29weShlbmMtPmFyZ2JfICsgeSAqIHdpZHRoLAotICAgICAgICAgICAgIHBpY3R1cmUtPmFyZ2IgKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgd2lkdGggKiBzaXplb2YoKmVuYy0+YXJnYl8pKTsKLSAgICB9Ci0gICAgZW5jLT5jdXJyZW50X3dpZHRoXyA9IHdpZHRoOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEFwcGx5IHRyYW5zZm9ybXMgYW5kIHdyaXRlIHRyYW5zZm9ybSBkYXRhLgotCi0gIGlmICghRXZhbEFuZEFwcGx5U3VidHJhY3RHcmVlbihlbmMsIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgYncpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBpZiAoZW5jLT51c2VfcHJlZGljdF8pIHsKLSAgICBpZiAoIUFwcGx5UHJlZGljdEZpbHRlcihlbmMsIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgcXVhbGl0eSwgYncpKSB7Ci0gICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgewotICAgIGlmICghQXBwbHlDcm9zc0NvbG9yRmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LCBidykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAhVFJBTlNGT1JNX1BSRVNFTlQpOyAgLy8gTm8gbW9yZSB0cmFuc2Zvcm1zLgotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBFc3RpbWF0ZSB0aGUgY29sb3IgY2FjaGUgc2l6ZS4KLQotICBpZiAoZW5jLT5jYWNoZV9iaXRzXyA+IDApIHsKLSAgICBpZiAoIVZQOExDYWxjdWxhdGVFc3RpbWF0ZUZvckNhY2hlU2l6ZShlbmMtPmFyZ2JfLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgJmVuYy0+Y2FjaGVfYml0c18pKSB7Ci0gICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVuY29kZSBhbmQgd3JpdGUgdGhlIHRyYW5zZm9ybWVkIGltYWdlLgotCi0gIGlmICghRW5jb2RlSW1hZ2VJbnRlcm5hbChidywgZW5jLT5hcmdiXywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgZW5jLT5jYWNoZV9iaXRzXywgZW5jLT5oaXN0b19iaXRzXykpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpY3R1cmUtPnN0YXRzOwotICAgIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyA9IDA7Ci0gICAgaWYgKGVuYy0+dXNlX3ByZWRpY3RfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gMTsKLSAgICBpZiAoZW5jLT51c2VfY3Jvc3NfY29sb3JfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gMjsKLSAgICBpZiAoZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gNDsKLSAgICBpZiAoZW5jLT51c2VfcGFsZXR0ZV8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSA4OwotICAgIHN0YXRzLT5oaXN0b2dyYW1fYml0cyA9IGVuYy0+aGlzdG9fYml0c187Ci0gICAgc3RhdHMtPnRyYW5zZm9ybV9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187Ci0gICAgc3RhdHMtPmNhY2hlX2JpdHMgPSBlbmMtPmNhY2hlX2JpdHNfOwotICAgIHN0YXRzLT5wYWxldHRlX3NpemUgPSBlbmMtPnBhbGV0dGVfc2l6ZV87Ci0gICAgc3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gYnl0ZV9wb3NpdGlvbik7Ci0gIH0KLQotIEVycm9yOgotICBWUDhMRW5jb2RlckRlbGV0ZShlbmMpOwotICByZXR1cm4gZXJyOwotfQotCi1pbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gIGludCBoYXNfYWxwaGE7Ci0gIHNpemVfdCBjb2RlZF9zaXplOwotICBpbnQgcGVyY2VudCA9IDA7Ci0gIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7Ci0gIFZQOExCaXRXcml0ZXIgYnc7Ci0KLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVI7Ci0gICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgZXJyKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gIGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLSAgaWYgKCFWUDhMQml0V3JpdGVySW5pdCgmYncsICh3aWR0aCAqIGhlaWdodCkgPj4gMSkpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEsICZwZXJjZW50KSkgewotIFVzZXJBYm9ydDoKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQ7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBSZXNldCBzdGF0cyAoZm9yIHB1cmUgbG9zc2xlc3MgY29kaW5nKQotICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgewotICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWN0dXJlLT5zdGF0czsKLSAgICBTYk1lbW9yeVNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOwotICAgIHN0YXRzLT5QU05SWzBdID0gOTkuZjsKLSAgICBzdGF0cy0+UFNOUlsxXSA9IDk5LmY7Ci0gICAgc3RhdHMtPlBTTlJbMl0gPSA5OS5mOwotICAgIHN0YXRzLT5QU05SWzNdID0gOTkuZjsKLSAgICBzdGF0cy0+UFNOUls0XSA9IDk5LmY7Ci0gIH0KLQotICAvLyBXcml0ZSBpbWFnZSBzaXplLgotICBpZiAoIVdyaXRlSW1hZ2VTaXplKHBpY3R1cmUsICZidykpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGhhc19hbHBoYSA9IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KHBpY3R1cmUpOwotICAvLyBXcml0ZSB0aGUgbm9uLXRyaXZpYWwgQWxwaGEgZmxhZyBhbmQgbG9zc2xlc3MgdmVyc2lvbi4KLSAgaWYgKCFXcml0ZVJlYWxBbHBoYUFuZFZlcnNpb24oJmJ3LCBoYXNfYWxwaGEpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCA1LCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OwotCi0gIC8vIEVuY29kZSBtYWluIGltYWdlIHN0cmVhbS4KLSAgZXJyID0gVlA4TEVuY29kZVN0cmVhbShjb25maWcsIHBpY3R1cmUsICZidyk7Ci0gIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLQotICAvLyBUT0RPKHNrYWwpOiBoYXZlIGEgZmluZS1ncmFpbmVkIHByb2dyZXNzIHJlcG9ydCBpbiBWUDhMRW5jb2RlU3RyZWFtKCkuCi0gIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDkwLCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OwotCi0gIC8vIEZpbmlzaCB0aGUgUklGRiBjaHVuay4KLSAgZXJyID0gV3JpdGVJbWFnZShwaWN0dXJlLCAmYncsICZjb2RlZF9zaXplKTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotCi0gIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEwMCwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKLQotICAvLyBTYXZlIHNpemUuCi0gIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgcGljdHVyZS0+c3RhdHMtPmNvZGVkX3NpemUgKz0gKGludCljb2RlZF9zaXplOwotICAgIHBpY3R1cmUtPnN0YXRzLT5sb3NzbGVzc19zaXplID0gKGludCljb2RlZF9zaXplOwotICB9Ci0KLSAgaWYgKHBpY3R1cmUtPmV4dHJhX2luZm8gIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBtYl93ID0gKHdpZHRoICsgMTUpID4+IDQ7Ci0gICAgY29uc3QgaW50IG1iX2ggPSAoaGVpZ2h0ICsgMTUpID4+IDQ7Ci0gICAgU2JNZW1vcnlTZXQocGljdHVyZS0+ZXh0cmFfaW5mbywgMCwgbWJfdyAqIG1iX2ggKiBzaXplb2YoKnBpY3R1cmUtPmV4dHJhX2luZm8pKTsKLSAgfQotCi0gRXJyb3I6Ci0gIGlmIChidy5lcnJvcl8pIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgVlA4TEJpdFdyaXRlckRlc3Ryb3koJmJ3KTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSB7Ci0gICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgZXJyKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdnA4bGkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWYwMWY1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIExvc3NsZXNzIGVuY29kZXI6IGludGVybmFsIGhlYWRlci4KLS8vCi0vLyBBdXRob3I6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfRU5DX1ZQOExJX0hfCi0jZGVmaW5lIFdFQlBfRU5DX1ZQOExJX0hfCi0KLSNpbmNsdWRlICIuL2hpc3RvZ3JhbS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF93cml0ZXIuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2VuY29kZS5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWdfOyAgICAvLyB1c2VyIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlcnMKLSAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY187ICAgICAgLy8gaW5wdXQgcGljdHVyZS4KLQotICB1aW50MzJfdCogYXJnYl87ICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm1lZCBhcmdiIGltYWdlIGRhdGEuCi0gIHVpbnQzMl90KiBhcmdiX3NjcmF0Y2hfOyAgICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciBhcmdiIHJvd3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHVzZWQgZm9yIHByZWRpY3Rpb24pLgotICB1aW50MzJfdCogdHJhbnNmb3JtX2RhdGFfOyAgICAvLyBTY3JhdGNoIG1lbW9yeSBmb3IgdHJhbnNmb3JtIGRhdGEuCi0gIGludCAgICAgICBjdXJyZW50X3dpZHRoXzsgICAgIC8vIENvcnJlc3BvbmRzIHRvIHBhY2tlZCBpbWFnZSB3aWR0aC4KLQotICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBxdWFsaXR5IHBhcmFtZXRlci4KLSAgaW50IGhpc3RvX2JpdHNfOwotICBpbnQgdHJhbnNmb3JtX2JpdHNfOwotICBpbnQgY2FjaGVfYml0c187ICAgICAgICAvLyBJZiBlcXVhbCB0byAwLCBkb24ndCB1c2UgY29sb3IgY2FjaGUuCi0KLSAgLy8gRW5jb2RpbmcgcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gaW1hZ2UgY2hhcmFjdGVyaXN0aWNzLgotICBpbnQgdXNlX2Nyb3NzX2NvbG9yXzsKLSAgaW50IHVzZV9zdWJ0cmFjdF9ncmVlbl87Ci0gIGludCB1c2VfcHJlZGljdF87Ci0gIGludCB1c2VfcGFsZXR0ZV87Ci0gIGludCBwYWxldHRlX3NpemVfOwotICB1aW50MzJfdCBwYWxldHRlX1tNQVhfUEFMRVRURV9TSVpFXTsKLX0gVlA4TEVuY29kZXI7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCi0KLS8vIEVuY29kZXMgdGhlIHBpY3R1cmUuCi0vLyBSZXR1cm5zIDAgaWYgY29uZmlnIG9yIHBpY3R1cmUgaXMgTlVMTCBvciBwaWN0dXJlIGRvZXNuJ3QgaGF2ZSB2YWxpZCBhcmdiCi0vLyBpbnB1dC4KLWludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7Ci0KLS8vIEVuY29kZXMgdGhlIG1haW4gaW1hZ2Ugc3RyZWFtIHVzaW5nIHRoZSBzdXBwbGllZCBiaXQgd3JpdGVyLgotV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfRU5DX1ZQOExJX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9BbmRyb2lkLm1rIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODZiOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDk4IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYmV4YW1wbGVfdXRpbAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBleGFtcGxlX3V0aWwuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworCitMT0NBTF9NT0RVTEUgOj0gZXhhbXBsZV91dGlsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY3dlYnAKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgTm90ZTogdG8gZW5hYmxlIGpwZWcvcG5nIGVuY29kaW5nIHRoZSBzb3VyY2VzIGZyb20gQU9TUCBjYW4gYmUgdXNlZCB3aXRoCisjIG1pbm9yIG1vZGlmaWNhdGlvbiB0byB0aGVpciBBbmRyb2lkLm1rIGZpbGVzLgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBjd2VicC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGV4YW1wbGVfdXRpbCBpbWFnZWlvX3V0aWwgaW1hZ2VkZWMgd2VicGRlbXV4IHdlYnAKKworTE9DQUxfTU9EVUxFIDo9IGN3ZWJwCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBkd2VicAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBkd2VicC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGV4YW1wbGVfdXRpbCBpbWFnZWRlYyBpbWFnZWVuYyB3ZWJwZGVtdXggd2VicAorTE9DQUxfTU9EVUxFIDo9IGR3ZWJwCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB3ZWJwbXV4CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHdlYnBtdXguYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBleGFtcGxlX3V0aWwgaW1hZ2Vpb191dGlsIHdlYnBtdXggd2VicAorCitMT0NBTF9NT0RVTEUgOj0gd2VicG11eF9leGFtcGxlCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbWcyd2VicAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBpbWcyd2VicC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGV4YW1wbGVfdXRpbCBpbWFnZWlvX3V0aWwgaW1hZ2VkZWMgd2VicG11eCB3ZWJwZGVtdXggXAorICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJwCisKK0xPQ0FMX01PRFVMRSA6PSBpbWcyd2VicF9leGFtcGxlCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB3ZWJwaW5mbworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICB3ZWJwaW5mby5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGV4YW1wbGVfdXRpbCBpbWFnZWlvX3V0aWwgd2VicAorCitMT0NBTF9NT0RVTEUgOj0gd2VicGluZm9fZXhhbXBsZQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwODcyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTE5IEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworCitiaW5fUFJPR1JBTVMgPQoraWYgV0FOVF9ERU1VWAorICBiaW5fUFJPR1JBTVMgKz0gZHdlYnAgY3dlYnAKK2VuZGlmCitpZiBCVUlMRF9BTklNRElGRgorICBub2luc3RfUFJPR1JBTVMgPSBhbmltX2RpZmYgYW5pbV9kdW1wCitlbmRpZgoraWYgQlVJTERfR0lGMldFQlAKKyAgYmluX1BST0dSQU1TICs9IGdpZjJ3ZWJwCitlbmRpZgoraWYgQlVJTERfSU1HMldFQlAKKyAgYmluX1BST0dSQU1TICs9IGltZzJ3ZWJwCitlbmRpZgoraWYgV0FOVF9NVVgKKyAgYmluX1BST0dSQU1TICs9IHdlYnBtdXgKK2VuZGlmCitpZiBCVUlMRF9WV0VCUAorICBiaW5fUFJPR1JBTVMgKz0gdndlYnAKK2VuZGlmCitpZiBCVUlMRF9XRUJQSU5GTworICBiaW5fUFJPR1JBTVMgKz0gd2VicGluZm8KK2VuZGlmCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmV4YW1wbGVfdXRpbC5sYQorCitsaWJleGFtcGxlX3V0aWxfbGFfU09VUkNFUyA9IGV4YW1wbGVfdXRpbC5jIGV4YW1wbGVfdXRpbC5oCitsaWJleGFtcGxlX3V0aWxfbGFfTElCQUREID0gLi4vc3JjL2xpYndlYnAubGEKKworYW5pbV9kaWZmX1NPVVJDRVMgPSBhbmltX2RpZmYuYyBhbmltX3V0aWwuYyBhbmltX3V0aWwuaAorYW5pbV9kaWZmX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChHSUZfSU5DTFVERVMpCithbmltX2RpZmZfTERBREQgID0KK2FuaW1fZGlmZl9MREFERCArPSAuLi9zcmMvZGVtdXgvbGlid2VicGRlbXV4LmxhCithbmltX2RpZmZfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCithbmltX2RpZmZfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2FuaW1fZGlmZl9MREFERCArPSAkKEdJRl9MSUJTKSAtbG0KKworYW5pbV9kdW1wX1NPVVJDRVMgPSBhbmltX2R1bXAuYyBhbmltX3V0aWwuYyBhbmltX3V0aWwuaAorYW5pbV9kdW1wX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChQTkdfSU5DTFVERVMpCithbmltX2R1bXBfQ1BQRkxBR1MgKz0gJChHSUZfSU5DTFVERVMpCithbmltX2R1bXBfTERBREQgID0KK2FuaW1fZHVtcF9MREFERCArPSAuLi9zcmMvZGVtdXgvbGlid2VicGRlbXV4LmxhCithbmltX2R1bXBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCithbmltX2R1bXBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2FuaW1fZHVtcF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZW5jLmxhCithbmltX2R1bXBfTERBREQgKz0gJChQTkdfTElCUykgJChHSUZfTElCUykgJChUSUZGX0xJQlMpIC1sbQorCitjd2VicF9TT1VSQ0VTICA9IGN3ZWJwLmMgc3RvcHdhdGNoLmgKK2N3ZWJwX0NQUEZMQUdTICA9ICQoQU1fQ1BQRkxBR1MpCitjd2VicF9MREFERCAgPQorY3dlYnBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCitjd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorY3dlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWRlYy5sYQorY3dlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2N3ZWJwX0xEQUREICs9ICQoSlBFR19MSUJTKSAkKFBOR19MSUJTKSAkKFRJRkZfTElCUykKKworZHdlYnBfU09VUkNFUyA9IGR3ZWJwLmMgc3RvcHdhdGNoLmgKK2R3ZWJwX0NQUEZMQUdTICA9ICQoQU1fQ1BQRkxBR1MpCitkd2VicF9DUFBGTEFHUyArPSAkKEpQRUdfSU5DTFVERVMpICQoUE5HX0lOQ0xVREVTKQorZHdlYnBfTERBREQgID0KK2R3ZWJwX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQorZHdlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWRlYy5sYQorZHdlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWVuYy5sYQorZHdlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2R3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitkd2VicF9MREFERCArPSQoUE5HX0xJQlMpICQoSlBFR19MSUJTKQorCitnaWYyd2VicF9TT1VSQ0VTID0gZ2lmMndlYnAuYyBnaWZkZWMuYyBnaWZkZWMuaAorZ2lmMndlYnBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKEdJRl9JTkNMVURFUykKK2dpZjJ3ZWJwX0xEQUREICA9CitnaWYyd2VicF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2dpZjJ3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCitnaWYyd2VicF9MREFERCArPSAuLi9zcmMvbXV4L2xpYndlYnBtdXgubGEKK2dpZjJ3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitnaWYyd2VicF9MREFERCArPSAkKEdJRl9MSUJTKQorCit2d2VicF9TT1VSQ0VTID0gdndlYnAuYwordndlYnBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKEdMX0lOQ0xVREVTKQordndlYnBfTERBREQgID0KK3Z3ZWJwX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQordndlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK3Z3ZWJwX0xEQUREICs9IC4uL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgubGEKK3Z3ZWJwX0xEQUREICs9ICQoR0xfTElCUykKKword2VicG11eF9TT1VSQ0VTID0gd2VicG11eC5jCit3ZWJwbXV4X0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK3dlYnBtdXhfTERBREQgID0KK3dlYnBtdXhfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCit3ZWJwbXV4X0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCit3ZWJwbXV4X0xEQUREICs9IC4uL3NyYy9tdXgvbGlid2VicG11eC5sYQord2VicG11eF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorCitpbWcyd2VicF9TT1VSQ0VTID0gaW1nMndlYnAuYworaW1nMndlYnBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQoraW1nMndlYnBfTERBREQgID0KK2ltZzJ3ZWJwX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQoraW1nMndlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2ltZzJ3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VkZWMubGEKK2ltZzJ3ZWJwX0xEQUREICs9IC4uL3NyYy9tdXgvbGlid2VicG11eC5sYQoraW1nMndlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2ltZzJ3ZWJwX0xEQUREICs9ICQoUE5HX0xJQlMpICQoSlBFR19MSUJTKSAkKFRJRkZfTElCUykKKword2VicGluZm9fU09VUkNFUyA9IHdlYnBpbmZvLmMKK3dlYnBpbmZvX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK3dlYnBpbmZvX0xEQUREICA9Cit3ZWJwaW5mb19MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK3dlYnBpbmZvX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCit3ZWJwaW5mb19MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBhbmltX2RpZmZfTERBREQgKz0gLi4vc3JjL2xpYndlYnBkZWNvZGVyLmxhCisgIGFuaW1fZHVtcF9MREFERCArPSAuLi9zcmMvbGlid2VicGRlY29kZXIubGEKKyAgdndlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnBkZWNvZGVyLmxhCitlbHNlCisgIGFuaW1fZGlmZl9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorICBhbmltX2R1bXBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKKyAgdndlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2RpZmYuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NGE5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2RpZmYuYwpAQCAtMCwwICsxLDMxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENoZWNrcyBpZiBnaXZlbiBwYWlyIG9mIGFuaW1hdGVkIEdJRi9XZWJQIGltYWdlcyBhcmUgaWRlbnRpY2FsOgorLy8gVGhhdCBpczogdGhlaXIgcmVjb25zdHJ1Y3RlZCBjYW52YXNlcyBtYXRjaCBwaXhlbC1ieS1waXhlbCBhbmQgdGhlaXIgb3RoZXIKKy8vIGFuaW1hdGlvbiBwcm9wZXJ0aWVzIChsb29wIGNvdW50IGV0YykgYWxzbyBtYXRjaC4KKy8vCisvLyBleGFtcGxlOiBhbmltX2RpZmYgZm9vLmdpZiBiYXIud2VicAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciAnc3RydG9kJy4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciAnc3RyY21wJy4KKworI2luY2x1ZGUgIi4vYW5pbV91dGlsLmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworLy8gUmV0dXJucyB0cnVlIGlmICdhICsgYicgd2lsbCBvdmVyZmxvdy4KK3N0YXRpYyBpbnQgQWRkaXRpb25XaWxsT3ZlcmZsb3coaW50IGEsIGludCBiKSB7CisgIHJldHVybiAoYiA+IDApICYmIChhID4gSU5UX01BWCAtIGIpOworfQorCitzdGF0aWMgaW50IEZyYW1lc0FyZUVxdWFsKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmExLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGNvbnN0IGludCBzdHJpZGUgPSB3aWR0aCAqIDQ7ICAvLyBBbHdheXMgdHJ1ZSBmb3IgJ0RlY29kZWRGcmFtZS5yZ2JhJy4KKyAgcmV0dXJuICFtZW1jbXAocmdiYTEsIHJnYmEyLCBzdHJpZGUgKiBoZWlnaHQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeGVsc0FyZVNpbWlsYXIodWludDMyX3Qgc3JjLCB1aW50MzJfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9hbGxvd2VkX2RpZmYpIHsKKyAgY29uc3QgaW50IHNyY19hID0gKHNyYyA+PiAyNCkgJiAweGZmOworICBjb25zdCBpbnQgc3JjX3IgPSAoc3JjID4+IDE2KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfZyA9IChzcmMgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgc3JjX2IgPSAoc3JjID4+IDApICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9hID0gKGRzdCA+PiAyNCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X3IgPSAoZHN0ID4+IDE2KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfZyA9IChkc3QgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2IgPSAoZHN0ID4+IDApICYgMHhmZjsKKworICByZXR1cm4gKGFicyhzcmNfciAqIHNyY19hIC0gZHN0X3IgKiBkc3RfYSkgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKSAmJgorICAgICAgICAgKGFicyhzcmNfZyAqIHNyY19hIC0gZHN0X2cgKiBkc3RfYSkgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKSAmJgorICAgICAgICAgKGFicyhzcmNfYiAqIHNyY19hIC0gZHN0X2IgKiBkc3RfYSkgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKSAmJgorICAgICAgICAgKGFicyhzcmNfYSAtIGRzdF9hKSA8PSBtYXhfYWxsb3dlZF9kaWZmKTsKK30KKworc3RhdGljIGludCBGcmFtZXNBcmVTaW1pbGFyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1heF9hbGxvd2VkX2RpZmYpIHsKKyAgaW50IGksIGo7CisgIGFzc2VydChtYXhfYWxsb3dlZF9kaWZmID4gMCk7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCBpbnQgc3RyaWRlID0gd2lkdGggKiA0OworICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IGogKiBzdHJpZGUgKyBpOworICAgICAgaWYgKCFQaXhlbHNBcmVTaW1pbGFyKHJnYmExW29mZnNldF0sIHJnYmEyW29mZnNldF0sIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gTWluaW1pemUgbnVtYmVyIG9mIGZyYW1lcyBieSBjb21iaW5pbmcgc3VjY2Vzc2l2ZSBmcmFtZXMgdGhhdCBoYXZlIGF0IG1heAorLy8gJ21heF9kaWZmJyBkaWZmZXJlbmNlIHBlciBjaGFubmVsIGJldHdlZW4gY29ycmVzcG9uZGluZyBwaXhlbHMuCitzdGF0aWMgdm9pZCBNaW5pbWl6ZUFuaW1hdGlvbkZyYW1lcyhBbmltYXRlZEltYWdlKiBjb25zdCBpbWcsIGludCBtYXhfZGlmZikgeworICB1aW50MzJfdCBpOworICBmb3IgKGkgPSAxOyBpIDwgaW1nLT5udW1fZnJhbWVzOyArK2kpIHsKKyAgICBEZWNvZGVkRnJhbWUqIGNvbnN0IGZyYW1lMSA9ICZpbWctPmZyYW1lc1tpIC0gMV07CisgICAgRGVjb2RlZEZyYW1lKiBjb25zdCBmcmFtZTIgPSAmaW1nLT5mcmFtZXNbaV07CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTEgPSBmcmFtZTEtPnJnYmE7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTIgPSBmcmFtZTItPnJnYmE7CisgICAgaW50IHNob3VsZF9tZXJnZV9mcmFtZXMgPSAwOworICAgIC8vIElmIG1lcmdpbmcgZnJhbWVzIHdpbGwgcmVzdWx0IGluIGludGVnZXIgb3ZlcmZsb3cgZm9yICdkdXJhdGlvbicsCisgICAgLy8gc2tpcCBtZXJnaW5nLgorICAgIGlmIChBZGRpdGlvbldpbGxPdmVyZmxvdyhmcmFtZTEtPmR1cmF0aW9uLCBmcmFtZTItPmR1cmF0aW9uKSkgY29udGludWU7CisgICAgaWYgKG1heF9kaWZmID4gMCkgeworICAgICAgc2hvdWxkX21lcmdlX2ZyYW1lcyA9IEZyYW1lc0FyZVNpbWlsYXIocmdiYTEsIHJnYmEyLCBpbWctPmNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+Y2FudmFzX2hlaWdodCwgbWF4X2RpZmYpOworICAgIH0gZWxzZSB7CisgICAgICBzaG91bGRfbWVyZ2VfZnJhbWVzID0KKyAgICAgICAgICBGcmFtZXNBcmVFcXVhbChyZ2JhMSwgcmdiYTIsIGltZy0+Y2FudmFzX3dpZHRoLCBpbWctPmNhbnZhc19oZWlnaHQpOworICAgIH0KKyAgICBpZiAoc2hvdWxkX21lcmdlX2ZyYW1lcykgeyAgLy8gTWVyZ2UgJ2krMSd0aCBmcmFtZSBpbnRvICdpJ3RoIGZyYW1lLgorICAgICAgZnJhbWUxLT5kdXJhdGlvbiArPSBmcmFtZTItPmR1cmF0aW9uOworICAgICAgaWYgKGkgKyAxIDwgaW1nLT5udW1fZnJhbWVzKSB7CisgICAgICAgIG1lbW1vdmUoJmltZy0+ZnJhbWVzW2ldLCAmaW1nLT5mcmFtZXNbaSArIDFdLAorICAgICAgICAgICAgICAgIChpbWctPm51bV9mcmFtZXMgLSBpIC0gMSkgKiBzaXplb2YoKmltZy0+ZnJhbWVzKSk7CisgICAgICB9CisgICAgICAtLWltZy0+bnVtX2ZyYW1lczsKKyAgICAgIC0taTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBDb21wYXJlVmFsdWVzKHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIGNvbnN0IGNoYXIqIG91dHB1dF9zdHIpIHsKKyAgaWYgKGEgIT0gYikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVkIHZzICVkXG4iLCBvdXRwdXRfc3RyLCBhLCBiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBDb21wYXJlQmFja2dyb3VuZENvbG9yKHVpbnQzMl90IGJnMSwgdWludDMyX3QgYmcyLCBpbnQgcHJlbXVsdGlwbHkpIHsKKyAgaWYgKHByZW11bHRpcGx5KSB7CisgICAgY29uc3QgaW50IGFscGhhMSA9IChiZzEgPj4gMjQpICYgMHhmZjsKKyAgICBjb25zdCBpbnQgYWxwaGEyID0gKGJnMiA+PiAyNCkgJiAweGZmOworICAgIGlmIChhbHBoYTEgPT0gMCAmJiBhbHBoYTIgPT0gMCkgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGJnMSAhPSBiZzIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkJhY2tncm91bmQgY29sb3IgbWlzbWF0Y2g6IDB4JTA4eCB2cyAweCUwOHhcbiIsCisgICAgICAgICAgICBiZzEsIGJnMik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIE5vdGU6IEFzIGxvbmcgYXMgZnJhbWUgZHVyYXRpb25zIGFuZCByZWNvbnN0cnVjdGVkIGZyYW1lcyBhcmUgaWRlbnRpY2FsLCBpdAorLy8gaXMgT0sgZm9yIG90aGVyIGFzcGVjdHMgbGlrZSBvZmZzZXRzLCBkaXNwb3NlL2JsZW5kIG1ldGhvZCB0byB2YXJ5Lgorc3RhdGljIGludCBDb21wYXJlQW5pbWF0ZWRJbWFnZVBhaXIoY29uc3QgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1nMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlbXVsdGlwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluX3BzbnIpIHsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgaW50IGlzX211bHRpX2ZyYW1lX2ltYWdlID0gKGltZzEtPm51bV9mcmFtZXMgPiAxKTsKKyAgdWludDMyX3QgaTsKKworICBvayA9IENvbXBhcmVWYWx1ZXMoaW1nMS0+Y2FudmFzX3dpZHRoLCBpbWcyLT5jYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAiQ2FudmFzIHdpZHRoIG1pc21hdGNoIikgJiYgb2s7CisgIG9rID0gQ29tcGFyZVZhbHVlcyhpbWcxLT5jYW52YXNfaGVpZ2h0LCBpbWcyLT5jYW52YXNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIkNhbnZhcyBoZWlnaHQgbWlzbWF0Y2giKSAmJiBvazsKKyAgb2sgPSBDb21wYXJlVmFsdWVzKGltZzEtPm51bV9mcmFtZXMsIGltZzItPm51bV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAiRnJhbWUgY291bnQgbWlzbWF0Y2giKSAmJiBvazsKKyAgaWYgKCFvaykgcmV0dXJuIDA7ICAvLyBUaGVzZSBhcmUgZmF0YWwgZmFpbHVyZXMsIGNhbid0IHByb2NlZWQuCisKKyAgaWYgKGlzX211bHRpX2ZyYW1lX2ltYWdlKSB7ICAvLyBDaGVja3MgcmVsZXZhbnQgZm9yIG11bHRpLWZyYW1lIGltYWdlcyBvbmx5LgorICAgIG9rID0gQ29tcGFyZVZhbHVlcyhpbWcxLT5sb29wX2NvdW50LCBpbWcyLT5sb29wX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAiTG9vcCBjb3VudCBtaXNtYXRjaCIpICYmIG9rOworICAgIG9rID0gQ29tcGFyZUJhY2tncm91bmRDb2xvcihpbWcxLT5iZ2NvbG9yLCBpbWcyLT5iZ2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBseSkgJiYgb2s7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaW1nMS0+bnVtX2ZyYW1lczsgKytpKSB7CisgICAgLy8gUGl4ZWwtYnktcGl4ZWwgY29tcGFyaXNvbi4KKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMSA9IGltZzEtPmZyYW1lc1tpXS5yZ2JhOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmEyID0gaW1nMi0+ZnJhbWVzW2ldLnJnYmE7CisgICAgaW50IG1heF9kaWZmOworICAgIGRvdWJsZSBwc25yOworICAgIGlmIChpc19tdWx0aV9mcmFtZV9pbWFnZSkgeyAgLy8gQ2hlY2sgcmVsZXZhbnQgZm9yIG11bHRpLWZyYW1lIGltYWdlcyBvbmx5LgorICAgICAgY29uc3QgY2hhciBmb3JtYXRbXSA9ICJGcmFtZSAjJWQsIGR1cmF0aW9uIG1pc21hdGNoIjsKKyAgICAgIGNoYXIgdG1wW3NpemVvZihmb3JtYXQpICsgOF07CisgICAgICBvayA9IG9rICYmIChzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCBmb3JtYXQsIGkpID49IDApOworICAgICAgb2sgPSBvayAmJiBDb21wYXJlVmFsdWVzKGltZzEtPmZyYW1lc1tpXS5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcyLT5mcmFtZXNbaV0uZHVyYXRpb24sIHRtcCk7CisgICAgfQorICAgIEdldERpZmZBbmRQU05SKHJnYmExLCByZ2JhMiwgaW1nMS0+Y2FudmFzX3dpZHRoLCBpbWcxLT5jYW52YXNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHByZW11bHRpcGx5LCAmbWF4X2RpZmYsICZwc25yKTsKKyAgICBpZiAobWluX3BzbnIgPiAwLikgeworICAgICAgaWYgKHBzbnIgPCBtaW5fcHNucikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZyYW1lICMlZCwgcHNuciA9ICUuMmxmIChtaW5fcHNuciA9ICVmKVxuIiwgaSwKKyAgICAgICAgICAgICAgICBwc25yLCBtaW5fcHNucik7CisgICAgICAgIG9rID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1heF9kaWZmICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGcmFtZSAjJWQsIG1heCBwaXhlbCBkaWZmOiAlZFxuIiwgaSwgbWF4X2RpZmYpOworICAgICAgICBvayA9IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IGFuaW1fZGlmZiA8aW1hZ2UxPiA8aW1hZ2UyPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxuT3B0aW9uczpcbiIpOworICBwcmludGYoIiAgLWR1bXBfZnJhbWVzIDxmb2xkZXI+IGR1bXAgZGVjb2RlZCBmcmFtZXMgaW4gUEFNIGZvcm1hdFxuIik7CisgIHByaW50ZigiICAtbWluX3BzbnIgPGZsb2F0PiAuLi4gbWluaW11bSBwZXItZnJhbWUgUFNOUlxuIik7CisgIHByaW50ZigiICAtcmF3X2NvbXBhcmlzb24gLi4uLi4gaWYgdGhpcyBmbGFnIGlzIG5vdCB1c2VkLCBSR0IgaXNcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIHByZW11bHRpcGxpZWQgYmVmb3JlIGNvbXBhcmlzb25cbiIpOworICBwcmludGYoIiAgLW1heF9kaWZmIDxpbnQ+IC4uLi4uIG1heGltdW0gYWxsb3dlZCBkaWZmZXJlbmNlIHBlciBjaGFubmVsXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiBzdWJzZXF1ZW50XG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzXG4iKTsKKyAgcHJpbnRmKCIgIC1oIC4uLi4uLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHBcbiIpOworICBwcmludGYoIiAgLXZlcnNpb24gLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICBpbnQgcmV0dXJuX2NvZGUgPSAtMTsKKyAgaW50IGR1bXBfZnJhbWVzID0gMDsKKyAgY29uc3QgY2hhciogZHVtcF9mb2xkZXIgPSBOVUxMOworICBkb3VibGUgbWluX3BzbnIgPSAwLjsKKyAgaW50IGdvdF9pbnB1dDEgPSAwOworICBpbnQgZ290X2lucHV0MiA9IDA7CisgIGludCBwcmVtdWx0aXBseSA9IDE7CisgIGludCBtYXhfZGlmZiA9IDA7CisgIGludCBpLCBjOworICBjb25zdCBjaGFyKiBmaWxlc1syXSA9IHsgTlVMTCwgTlVMTCB9OworICBBbmltYXRlZEltYWdlIGltYWdlc1syXTsKKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWR1bXBfZnJhbWVzIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIHsKKyAgICAgICAgZHVtcF9mcmFtZXMgPSAxOworICAgICAgICBkdW1wX2ZvbGRlciA9IGFyZ3ZbKytjXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1taW5fcHNuciIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHYgPSBhcmd2WysrY107CisgICAgICAgIGNoYXIqIGVuZCA9IE5VTEw7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkID0gc3RydG9kKHYsICZlbmQpOworICAgICAgICBpZiAoZW5kID09IHYpIHsKKyAgICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgJyVzJyBpcyBub3QgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4iLCB2KTsKKyAgICAgICAgfQorICAgICAgICBtaW5fcHNuciA9IGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcmF3X2NvbXBhcmlzb24iKSkgeworICAgICAgcHJlbXVsdGlwbHkgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1heF9kaWZmIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QgdiA9IGFyZ3ZbKytjXTsKKyAgICAgICAgY2hhciogZW5kID0gTlVMTDsKKyAgICAgICAgY29uc3QgaW50IG4gPSAoaW50KXN0cnRvbCh2LCAmZW5kLCAxMCk7CisgICAgICAgIGlmIChlbmQgPT0gdikgeworICAgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISAnJXMnIGlzIG5vdCBhbiBpbnRlZ2VyLlxuIiwgdik7CisgICAgICAgIH0KKyAgICAgICAgbWF4X2RpZmYgPSBuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGludCBkZWNfdmVyc2lvbiwgZGVtdXhfdmVyc2lvbjsKKyAgICAgIEdldEFuaW1hdGVkSW1hZ2VWZXJzaW9ucygmZGVjX3ZlcnNpb24sICZkZW11eF92ZXJzaW9uKTsKKyAgICAgIHByaW50ZigiV2ViUCBEZWNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG5XZWJQIERlbXV4IHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgIChkZWNfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZGVjX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIChkZWNfdmVyc2lvbiA+PiAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlbXV4X3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGRlbXV4X3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIChkZW11eF92ZXJzaW9uID4+IDApICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFnb3RfaW5wdXQxKSB7CisgICAgICAgIGZpbGVzWzBdID0gYXJndltjXTsKKyAgICAgICAgZ290X2lucHV0MSA9IDE7CisgICAgICB9IGVsc2UgaWYgKCFnb3RfaW5wdXQyKSB7CisgICAgICAgIGZpbGVzWzFdID0gYXJndltjXTsKKyAgICAgICAgZ290X2lucHV0MiA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICB9CisgICAgfQorICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoYXJnYyA8IDMpIHsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKworICBpZiAoIWdvdF9pbnB1dDIpIHsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGR1bXBfZnJhbWVzKSB7CisgICAgcHJpbnRmKCJEdW1waW5nIGRlY29kZWQgZnJhbWVzIGluOiAlc1xuIiwgZHVtcF9mb2xkZXIpOworICB9CisKKyAgbWVtc2V0KGltYWdlcywgMCwgc2l6ZW9mKGltYWdlcykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgcHJpbnRmKCJEZWNvZGluZyBmaWxlOiAlc1xuIiwgZmlsZXNbaV0pOworICAgIGlmICghUmVhZEFuaW1hdGVkSW1hZ2UoZmlsZXNbaV0sICZpbWFnZXNbaV0sIGR1bXBfZnJhbWVzLCBkdW1wX2ZvbGRlcikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgZmlsZTogJXNcbiBBYm9ydGluZy5cbiIsIGZpbGVzW2ldKTsKKyAgICAgIHJldHVybl9jb2RlID0gLTI7CisgICAgICBnb3RvIEVuZDsKKyAgICB9IGVsc2UgeworICAgICAgTWluaW1pemVBbmltYXRpb25GcmFtZXMoJmltYWdlc1tpXSwgbWF4X2RpZmYpOworICAgIH0KKyAgfQorCisgIGlmICghQ29tcGFyZUFuaW1hdGVkSW1hZ2VQYWlyKCZpbWFnZXNbMF0sICZpbWFnZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW11bHRpcGx5LCBtaW5fcHNucikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRmlsZXMgJXMgYW5kICVzIGRpZmZlci5cbiIsIGZpbGVzWzBdLCBmaWxlc1sxXSk7CisgICAgcmV0dXJuX2NvZGUgPSAtMzsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIlxuRmlsZXMgJXMgYW5kICVzIGFyZSBpZGVudGljYWwuXG4iLCBmaWxlc1swXSwgZmlsZXNbMV0pOworICAgIHJldHVybl9jb2RlID0gMDsKKyAgfQorIEVuZDoKKyAgQ2xlYXJBbmltYXRlZEltYWdlKCZpbWFnZXNbMF0pOworICBDbGVhckFuaW1hdGVkSW1hZ2UoJmltYWdlc1sxXSk7CisgIHJldHVybiByZXR1cm5fY29kZTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZHVtcC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5NmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZHVtcC5jCkBAIC0wLDAgKzEsMTE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRGVjb2RlcyBhbiBhbmltYXRlZCBXZWJQIGZpbGUgYW5kIGR1bXBzIHRoZSBkZWNvZGVkIGZyYW1lcyBhcyBQTkcgb3IgVElGRi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciAnc3RyY21wJy4KKworI2luY2x1ZGUgIi4vYW5pbV91dGlsLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlX2VuYy5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOiBhbmltX2R1bXAgW29wdGlvbnNdIGZpbGVzLi4uXG4iKTsKKyAgcHJpbnRmKCJcbk9wdGlvbnM6XG4iKTsKKyAgcHJpbnRmKCIgIC1mb2xkZXIgPHN0cmluZz4gLi4uLiBkdW1wIGZvbGRlciAoZGVmYXVsdDogJy4nKVxuIik7CisgIHByaW50ZigiICAtcHJlZml4IDxzdHJpbmc+IC4uLi4gcHJlZml4IGZvciBkdW1wZWQgZnJhbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICdkdW1wXycpXG4iKTsKKyAgcHJpbnRmKCIgIC10aWZmIC4uLi4uLi4uLi4uLi4uLiBzYXZlIGZyYW1lcyBhcyBUSUZGXG4iKTsKKyAgcHJpbnRmKCIgIC1wYW0gLi4uLi4uLi4uLi4uLi4uLiBzYXZlIGZyYW1lcyBhcyBQQU1cbiIpOworICBwcmludGYoIiAgLWggLi4uLi4uLi4uLi4uLi4uLi4uIHRoaXMgaGVscFxuIik7CisgIHByaW50ZigiICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIGludCBlcnJvciA9IDA7CisgIGNvbnN0IGNoYXIqIGR1bXBfZm9sZGVyID0gIi4iOworICBjb25zdCBjaGFyKiBwcmVmaXggPSAiZHVtcF8iOworICBjb25zdCBjaGFyKiBzdWZmaXggPSAicG5nIjsKKyAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0ID0gUE5HOworICBpbnQgYzsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZm9yIChjID0gMTsgIWVycm9yICYmIGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWZvbGRlciIpKSB7CisgICAgICBpZiAoYyArIDEgPT0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1pc3NpbmcgYXJndW1lbnQgYWZ0ZXIgb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZHVtcF9mb2xkZXIgPSBhcmd2WysrY107CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJlZml4IikpIHsKKyAgICAgIGlmIChjICsgMSA9PSBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc2luZyBhcmd1bWVudCBhZnRlciBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwcmVmaXggPSBhcmd2WysrY107CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdGlmZiIpKSB7CisgICAgICBmb3JtYXQgPSBUSUZGOworICAgICAgc3VmZml4ID0gInRpZmYiOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBhbSIpKSB7CisgICAgICBmb3JtYXQgPSBQQU07CisgICAgICBzdWZmaXggPSAicGFtIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBpbnQgZGVjX3ZlcnNpb24sIGRlbXV4X3ZlcnNpb247CisgICAgICBHZXRBbmltYXRlZEltYWdlVmVyc2lvbnMoJmRlY192ZXJzaW9uLCAmZGVtdXhfdmVyc2lvbik7CisgICAgICBwcmludGYoIldlYlAgRGVjb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuV2ViUCBEZW11eCB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAoZGVjX3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGRlY192ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVjX3ZlcnNpb24gPj4gMCkgJiAweGZmLAorICAgICAgICAgICAgIChkZW11eF92ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChkZW11eF92ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVtdXhfdmVyc2lvbiA+PiAwKSAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQzMl90IGk7CisgICAgICBBbmltYXRlZEltYWdlIGltYWdlOworICAgICAgY29uc3QgY2hhciogY29uc3QgZmlsZSA9IGFyZ3ZbY107CisgICAgICBtZW1zZXQoJmltYWdlLCAwLCBzaXplb2YoaW1hZ2UpKTsKKyAgICAgIHByaW50ZigiRGVjb2RpbmcgZmlsZTogJXMgYXMgJXMvJXN4eHh4LiVzXG4iLAorICAgICAgICAgICAgIGZpbGUsIGR1bXBfZm9sZGVyLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICBpZiAoIVJlYWRBbmltYXRlZEltYWdlKGZpbGUsICZpbWFnZSwgMCwgTlVMTCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkZWNvZGluZyBmaWxlOiAlc1xuIEFib3J0aW5nLlxuIiwgZmlsZSk7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyAhZXJyb3IgJiYgaSA8IGltYWdlLm51bV9mcmFtZXM7ICsraSkgeworICAgICAgICBjaGFyIG91dF9maWxlWzEwMjRdOworICAgICAgICBXZWJQRGVjQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgV2ViUEluaXREZWNCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIGJ1ZmZlci5jb2xvcnNwYWNlID0gTU9ERV9SR0JBOworICAgICAgICBidWZmZXIuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKyAgICAgICAgYnVmZmVyLndpZHRoID0gaW1hZ2UuY2FudmFzX3dpZHRoOworICAgICAgICBidWZmZXIuaGVpZ2h0ID0gaW1hZ2UuY2FudmFzX2hlaWdodDsKKyAgICAgICAgYnVmZmVyLnUuUkdCQS5yZ2JhID0gaW1hZ2UuZnJhbWVzW2ldLnJnYmE7CisgICAgICAgIGJ1ZmZlci51LlJHQkEuc3RyaWRlID0gYnVmZmVyLndpZHRoICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgYnVmZmVyLnUuUkdCQS5zaXplID0gYnVmZmVyLnUuUkdCQS5zdHJpZGUgKiBidWZmZXIuaGVpZ2h0OworICAgICAgICBzbnByaW50ZihvdXRfZmlsZSwgc2l6ZW9mKG91dF9maWxlKSwgIiVzLyVzJS40ZC4lcyIsCisgICAgICAgICAgICAgICAgIGR1bXBfZm9sZGVyLCBwcmVmaXgsIGksIHN1ZmZpeCk7CisgICAgICAgIGlmICghV2ViUFNhdmVJbWFnZSgmYnVmZmVyLCBmb3JtYXQsIG91dF9maWxlKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgc2F2aW5nIGltYWdlICclcydcbiIsIG91dF9maWxlKTsKKyAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIH0KKyAgICAgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmJ1ZmZlcik7CisgICAgICB9CisgICAgICBDbGVhckFuaW1hdGVkSW1hZ2UoJmltYWdlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTA1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuYwpAQCAtMCwwICsxLDc5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgYW5pbWF0ZWQgaW1hZ2VzCisKKyNpbmNsdWRlICIuL2FuaW1fdXRpbC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9HSUYpCisjaW5jbHVkZSA8Z2lmX2xpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAid2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlbXV4LmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IGtOdW1DaGFubmVscyA9IDQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21tb24gdXRpbGl0aWVzLgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfR0lGKQorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmcmFtZSBjb3ZlcnMgdGhlIGZ1bGwgY2FudmFzLgorc3RhdGljIGludCBJc0Z1bGxGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIHJldHVybiAod2lkdGggPT0gY2FudmFzX3dpZHRoICYmIGhlaWdodCA9PSBjYW52YXNfaGVpZ2h0KTsKK30KKyNlbmRpZiAvLyBXRUJQX0hBVkVfR0lGCisKK3N0YXRpYyBpbnQgQ2hlY2tTaXplRm9yT3ZlcmZsb3codWludDY0X3Qgc2l6ZSkgeworICByZXR1cm4gKHNpemUgPT0gKHNpemVfdClzaXplKTsKK30KKworc3RhdGljIGludCBBbGxvY2F0ZUZyYW1lcyhBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwgdWludDMyX3QgbnVtX2ZyYW1lcykgeworICB1aW50MzJfdCBpOworICB1aW50OF90KiBtZW0gPSBOVUxMOworICBEZWNvZGVkRnJhbWUqIGZyYW1lcyA9IE5VTEw7CisgIGNvbnN0IHVpbnQ2NF90IHJnYmFfc2l6ZSA9CisgICAgICAodWludDY0X3QpaW1hZ2UtPmNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVscyAqIGltYWdlLT5jYW52YXNfaGVpZ2h0OworICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gKHVpbnQ2NF90KW51bV9mcmFtZXMgKiByZ2JhX3NpemUgKiBzaXplb2YoKm1lbSk7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX2ZyYW1lX3NpemUgPSAodWludDY0X3QpbnVtX2ZyYW1lcyAqIHNpemVvZigqZnJhbWVzKTsKKyAgaWYgKCFDaGVja1NpemVGb3JPdmVyZmxvdyh0b3RhbF9zaXplKSB8fAorICAgICAgIUNoZWNrU2l6ZUZvck92ZXJmbG93KHRvdGFsX2ZyYW1lX3NpemUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtID0gKHVpbnQ4X3QqKW1hbGxvYygoc2l6ZV90KXRvdGFsX3NpemUpOworICBmcmFtZXMgPSAoRGVjb2RlZEZyYW1lKiltYWxsb2MoKHNpemVfdCl0b3RhbF9mcmFtZV9zaXplKTsKKworICBpZiAobWVtID09IE5VTEwgfHwgZnJhbWVzID09IE5VTEwpIHsKKyAgICBmcmVlKG1lbSk7CisgICAgZnJlZShmcmFtZXMpOworICAgIHJldHVybiAwOworICB9CisgIGZyZWUoaW1hZ2UtPnJhd19tZW0pOworICBpbWFnZS0+bnVtX2ZyYW1lcyA9IG51bV9mcmFtZXM7CisgIGltYWdlLT5mcmFtZXMgPSBmcmFtZXM7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fZnJhbWVzOyArK2kpIHsKKyAgICBmcmFtZXNbaV0ucmdiYSA9IG1lbSArIGkgKiByZ2JhX3NpemU7CisgICAgZnJhbWVzW2ldLmR1cmF0aW9uID0gMDsKKyAgICBmcmFtZXNbaV0uaXNfa2V5X2ZyYW1lID0gMDsKKyAgfQorICBpbWFnZS0+cmF3X21lbSA9IG1lbTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQ2xlYXJBbmltYXRlZEltYWdlKEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlKSB7CisgIGlmIChpbWFnZSAhPSBOVUxMKSB7CisgICAgZnJlZShpbWFnZS0+cmF3X21lbSk7CisgICAgZnJlZShpbWFnZS0+ZnJhbWVzKTsKKyAgICBpbWFnZS0+bnVtX2ZyYW1lcyA9IDA7CisgICAgaW1hZ2UtPmZyYW1lcyA9IE5VTEw7CisgICAgaW1hZ2UtPnJhd19tZW0gPSBOVUxMOworICB9Cit9CisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9HSUYpCisvLyBDbGVhciB0aGUgY2FudmFzIHRvIHRyYW5zcGFyZW50Lgorc3RhdGljIHZvaWQgWmVyb0ZpbGxDYW52YXModWludDhfdCogcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbnZhc193aWR0aCwgdWludDMyX3QgY2FudmFzX2hlaWdodCkgeworICBtZW1zZXQocmdiYSwgMCwgY2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzICogY2FudmFzX2hlaWdodCk7Cit9CisKKy8vIENsZWFyIGdpdmVuIGZyYW1lIHJlY3RhbmdsZSB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyB2b2lkIFplcm9GaWxsRnJhbWVSZWN0KHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSwgaW50IHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IGo7CisgIGFzc2VydCh3aWR0aCAqIGtOdW1DaGFubmVscyA8PSByZ2JhX3N0cmlkZSk7CisgIHJnYmEgKz0geV9vZmZzZXQgKiByZ2JhX3N0cmlkZSArIHhfb2Zmc2V0ICoga051bUNoYW5uZWxzOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBtZW1zZXQocmdiYSwgMCwgd2lkdGggKiBrTnVtQ2hhbm5lbHMpOworICAgIHJnYmEgKz0gcmdiYV9zdHJpZGU7CisgIH0KK30KKworLy8gQ29weSB3aWR0aCAqIGhlaWdodCBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0Jy4KK3N0YXRpYyB2b2lkIENvcHlDYW52YXMoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKTsKKyAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAqIGtOdW1DaGFubmVscyAqIGhlaWdodCk7Cit9CisKKy8vIENvcHkgcGl4ZWxzIGluIHRoZSBnaXZlbiByZWN0YW5nbGUgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyB0aGUgJ3N0cmlkZScuCitzdGF0aWMgdm9pZCBDb3B5RnJhbWVSZWN0YW5nbGUoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2Zmc2V0LCBpbnQgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBqOworICBjb25zdCBpbnQgd2lkdGhfaW5fYnl0ZXMgPSB3aWR0aCAqIGtOdW1DaGFubmVsczsKKyAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHlfb2Zmc2V0ICogc3RyaWRlICsgeF9vZmZzZXQgKiBrTnVtQ2hhbm5lbHM7CisgIGFzc2VydCh3aWR0aF9pbl9ieXRlcyA8PSBzdHJpZGUpOworICBzcmMgKz0gb2Zmc2V0OworICBkc3QgKz0gb2Zmc2V0OworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoX2luX2J5dGVzKTsKKyAgICBzcmMgKz0gc3RyaWRlOworICAgIGRzdCArPSBzdHJpZGU7CisgIH0KK30KKyNlbmRpZiAvLyBXRUJQX0hBVkVfR0lGCisKKy8vIENhbm9uaWNhbGl6ZSBhbGwgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHRyYW5zcGFyZW50IGJsYWNrIHRvIGFpZCBjb21wYXJpc29uLgorc3RhdGljIHZvaWQgQ2xlYW51cFRyYW5zcGFyZW50UGl4ZWxzKHVpbnQzMl90KiByZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJnYmFfZW5kID0gcmdiYSArIHdpZHRoICogaGVpZ2h0OworICB3aGlsZSAocmdiYSA8IHJnYmFfZW5kKSB7CisgICAgY29uc3QgdWludDhfdCBhbHBoYSA9ICgqcmdiYSA+PiAyNCkgJiAweGZmOworICAgIGlmIChhbHBoYSA9PSAwKSB7CisgICAgICAqcmdiYSA9IDA7CisgICAgfQorICAgICsrcmdiYTsKKyAgfQorfQorCisvLyBEdW1wIGZyYW1lIHRvIGEgUEFNIGZpbGUuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorc3RhdGljIGludCBEdW1wRnJhbWUoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9udW0sIGNvbnN0IHVpbnQ4X3QgcmdiYVtdLAorICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc193aWR0aCwgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgaW50IG9rID0gMDsKKyAgc2l6ZV90IG1heF9sZW47CisgIGludCB5OworICBjb25zdCBjaGFyKiBiYXNlX25hbWUgPSBOVUxMOworICBjaGFyKiBmaWxlX25hbWUgPSBOVUxMOworICBGSUxFKiBmID0gTlVMTDsKKyAgY29uc3QgY2hhciogcm93OworCisgIGlmIChkdW1wX2ZvbGRlciA9PSBOVUxMKSBkdW1wX2ZvbGRlciA9ICIuIjsKKworICBiYXNlX25hbWUgPSBzdHJyY2hyKGZpbGVuYW1lLCAnLycpOworICBiYXNlX25hbWUgPSAoYmFzZV9uYW1lID09IE5VTEwpID8gZmlsZW5hbWUgOiBiYXNlX25hbWUgKyAxOworICBtYXhfbGVuID0gc3RybGVuKGR1bXBfZm9sZGVyKSArIDEgKyBzdHJsZW4oYmFzZV9uYW1lKQorICAgICAgICAgICsgc3RybGVuKCJfZnJhbWVfIikgKyBzdHJsZW4oIi5wYW0iKSArIDg7CisgIGZpbGVfbmFtZSA9IChjaGFyKiltYWxsb2MobWF4X2xlbiAqIHNpemVvZigqZmlsZV9uYW1lKSk7CisgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgaWYgKHNucHJpbnRmKGZpbGVfbmFtZSwgbWF4X2xlbiwgIiVzLyVzX2ZyYW1lXyVkLnBhbSIsCisgICAgICAgICAgICAgICBkdW1wX2ZvbGRlciwgYmFzZV9uYW1lLCBmcmFtZV9udW0pIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgZ2VuZXJhdGluZyBmaWxlIG5hbWVcbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgZiA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7CisgIGlmIChmID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgZmlsZSBmb3Igd3JpdGluZzogJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgb2sgPSAwOworICAgIGdvdG8gRW5kOworICB9CisgIGlmIChmcHJpbnRmKGYsICJQN1xuV0lEVEggJWRcbkhFSUdIVCAlZFxuIgorICAgICAgICAgICAgICAiREVQVEggNFxuTUFYVkFMIDI1NVxuVFVQTFRZUEUgUkdCX0FMUEhBXG5FTkRIRFJcbiIsCisgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCkgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXcml0ZSBlcnJvciBmb3IgZmlsZSAlc1xuIiwgZmlsZV9uYW1lKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICByb3cgPSAoY29uc3QgY2hhciopcmdiYTsKKyAgZm9yICh5ID0gMDsgeSA8IGNhbnZhc19oZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUocm93LCBjYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHMsIDEsIGYpICE9IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyB0byBmaWxlOiAlc1xuIiwgZmlsZV9uYW1lKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICByb3cgKz0gY2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzOworICB9CisgIG9rID0gMTsKKyBFbmQ6CisgIGlmIChmICE9IE5VTEwpIGZjbG9zZShmKTsKKyAgZnJlZShmaWxlX25hbWUpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQIERlY29kaW5nLgorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIFdlYlAgYml0c3RyZWFtLgorc3RhdGljIGludCBJc1dlYlAoY29uc3QgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSkgeworICByZXR1cm4gKFdlYlBHZXRJbmZvKHdlYnBfZGF0YS0+Ynl0ZXMsIHdlYnBfZGF0YS0+c2l6ZSwgTlVMTCwgTlVMTCkgIT0gMCk7Cit9CisKKy8vIFJlYWQgYW5pbWF0ZWQgV2ViUCBiaXRzdHJlYW0gJ3dlYnBfZGF0YScgaW50byAnQW5pbWF0ZWRJbWFnZScgc3RydWN0Lgorc3RhdGljIGludCBSZWFkQW5pbWF0ZWRXZWJQKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLCBpbnQgZHVtcF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdKSB7CisgIGludCBvayA9IDA7CisgIGludCBkdW1wX29rID0gMTsKKyAgdWludDMyX3QgZnJhbWVfaW5kZXggPSAwOworICBpbnQgcHJldl9mcmFtZV90aW1lc3RhbXAgPSAwOworICBXZWJQQW5pbURlY29kZXIqIGRlYzsKKyAgV2ViUEFuaW1JbmZvIGFuaW1faW5mbzsKKworICBtZW1zZXQoaW1hZ2UsIDAsIHNpemVvZigqaW1hZ2UpKTsKKworICBkZWMgPSBXZWJQQW5pbURlY29kZXJOZXcod2VicF9kYXRhLCBOVUxMKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBwYXJzaW5nIGltYWdlOiAlc1xuIiwgZmlsZW5hbWUpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKCFXZWJQQW5pbURlY29kZXJHZXRJbmZvKGRlYywgJmFuaW1faW5mbykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGdldHRpbmcgZ2xvYmFsIGluZm8gYWJvdXQgdGhlIGFuaW1hdGlvblxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBBbmltYXRpb24gcHJvcGVydGllcy4KKyAgaW1hZ2UtPmNhbnZhc193aWR0aCA9IGFuaW1faW5mby5jYW52YXNfd2lkdGg7CisgIGltYWdlLT5jYW52YXNfaGVpZ2h0ID0gYW5pbV9pbmZvLmNhbnZhc19oZWlnaHQ7CisgIGltYWdlLT5sb29wX2NvdW50ID0gYW5pbV9pbmZvLmxvb3BfY291bnQ7CisgIGltYWdlLT5iZ2NvbG9yID0gYW5pbV9pbmZvLmJnY29sb3I7CisKKyAgLy8gQWxsb2NhdGUgZnJhbWVzLgorICBpZiAoIUFsbG9jYXRlRnJhbWVzKGltYWdlLCBhbmltX2luZm8uZnJhbWVfY291bnQpKSByZXR1cm4gMDsKKworICAvLyBEZWNvZGUgZnJhbWVzLgorICB3aGlsZSAoV2ViUEFuaW1EZWNvZGVySGFzTW9yZUZyYW1lcyhkZWMpKSB7CisgICAgRGVjb2RlZEZyYW1lKiBjdXJyX2ZyYW1lOworICAgIHVpbnQ4X3QqIGN1cnJfcmdiYTsKKyAgICB1aW50OF90KiBmcmFtZV9yZ2JhOworICAgIGludCB0aW1lc3RhbXA7CisKKyAgICBpZiAoIVdlYlBBbmltRGVjb2RlckdldE5leHQoZGVjLCAmZnJhbWVfcmdiYSwgJnRpbWVzdGFtcCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgZnJhbWUgIyV1XG4iLCBmcmFtZV9pbmRleCk7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgYXNzZXJ0KGZyYW1lX2luZGV4IDwgYW5pbV9pbmZvLmZyYW1lX2NvdW50KTsKKyAgICBjdXJyX2ZyYW1lID0gJmltYWdlLT5mcmFtZXNbZnJhbWVfaW5kZXhdOworICAgIGN1cnJfcmdiYSA9IGN1cnJfZnJhbWUtPnJnYmE7CisgICAgY3Vycl9mcmFtZS0+ZHVyYXRpb24gPSB0aW1lc3RhbXAgLSBwcmV2X2ZyYW1lX3RpbWVzdGFtcDsKKyAgICBjdXJyX2ZyYW1lLT5pc19rZXlfZnJhbWUgPSAwOyAgLy8gVW51c2VkLgorICAgIG1lbWNweShjdXJyX3JnYmEsIGZyYW1lX3JnYmEsCisgICAgICAgICAgIGltYWdlLT5jYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHMgKiBpbWFnZS0+Y2FudmFzX2hlaWdodCk7CisKKyAgICAvLyBOZWVkZWQgb25seSBiZWNhdXNlIHdlIG1heSB3YW50IHRvIGNvbXBhcmUgd2l0aCBHSUYgbGF0ZXIuCisgICAgQ2xlYW51cFRyYW5zcGFyZW50UGl4ZWxzKCh1aW50MzJfdCopY3Vycl9yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y2FudmFzX3dpZHRoLCBpbWFnZS0+Y2FudmFzX2hlaWdodCk7CisKKyAgICBpZiAoZHVtcF9mcmFtZXMgJiYgZHVtcF9vaykgeworICAgICAgZHVtcF9vayA9IER1bXBGcmFtZShmaWxlbmFtZSwgZHVtcF9mb2xkZXIsIGZyYW1lX2luZGV4LCBjdXJyX3JnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jYW52YXNfd2lkdGgsIGltYWdlLT5jYW52YXNfaGVpZ2h0KTsKKyAgICAgIGlmICghZHVtcF9vaykgeyAgLy8gUHJpbnQgZXJyb3Igb25jZSwgYnV0IGNvbnRpbnVlIGRlY29kZSBsb29wLgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1bXBpbmcgZnJhbWVzIHRvICVzXG4iLCBkdW1wX2ZvbGRlcik7CisgICAgICB9CisgICAgfQorCisgICAgKytmcmFtZV9pbmRleDsKKyAgICBwcmV2X2ZyYW1lX3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgfQorICBvayA9IGR1bXBfb2s7CisKKyBFbmQ6CisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHSUYgRGVjb2RpbmcuCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9HSUYpCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgR0lGIGJpdHN0cmVhbS4KK3N0YXRpYyBpbnQgSXNHSUYoY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIGRhdGEtPnNpemUgPiBHSUZfU1RBTVBfTEVOICYmCisgICAgICAgICAoIW1lbWNtcChHSUZfU1RBTVAsIGRhdGEtPmJ5dGVzLCBHSUZfU1RBTVBfTEVOKSB8fAorICAgICAgICAgICFtZW1jbXAoR0lGODdfU1RBTVAsIGRhdGEtPmJ5dGVzLCBHSUZfU1RBTVBfTEVOKSB8fAorICAgICAgICAgICFtZW1jbXAoR0lGODlfU1RBTVAsIGRhdGEtPmJ5dGVzLCBHSUZfU1RBTVBfTEVOKSk7Cit9CisKKy8vIEdJRkxJQl9NQUpPUiBpcyBvbmx5IGRlZmluZWQgaW4gbGliZ2lmID49IDQuMi4wLgorI2lmIGRlZmluZWQoR0lGTElCX01BSk9SKSAmJiBkZWZpbmVkKEdJRkxJQl9NSU5PUikKKyMgZGVmaW5lIExPQ0FMX0dJRl9WRVJTSU9OICgoR0lGTElCX01BSk9SIDw8IDgpIHwgR0lGTElCX01JTk9SKQorIyBkZWZpbmUgTE9DQUxfR0lGX1BSRVJFUShtYWosIG1pbikgXAorICAgIChMT0NBTF9HSUZfVkVSU0lPTiA+PSAoKChtYWopIDw8IDgpIHwgKG1pbikpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0dJRl9WRVJTSU9OIDAKKyMgZGVmaW5lIExPQ0FMX0dJRl9QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisjaWYgIUxPQ0FMX0dJRl9QUkVSRVEoNSwgMCkKKworLy8gQWRkZWQgaW4gdjUuMAordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgRGlzcG9zYWxNb2RlOworI2RlZmluZSBESVNQT1NBTF9VTlNQRUNJRklFRCAgICAgIDAgICAgICAgLy8gTm8gZGlzcG9zYWwgc3BlY2lmaWVkCisjZGVmaW5lIERJU1BPU0VfRE9fTk9UICAgICAgICAgICAgMSAgICAgICAvLyBMZWF2ZSBpbWFnZSBpbiBwbGFjZQorI2RlZmluZSBESVNQT1NFX0JBQ0tHUk9VTkQgICAgICAgIDIgICAgICAgLy8gU2V0IGFyZWEgdG8gYmFja2dyb3VuZCBjb2xvcgorI2RlZmluZSBESVNQT1NFX1BSRVZJT1VTICAgICAgICAgIDMgICAgICAgLy8gUmVzdG9yZSB0byBwcmV2aW91cyBjb250ZW50CisgIGludCBVc2VySW5wdXRGbGFnOyAgICAgICAvLyBVc2VyIGNvbmZpcm1hdGlvbiByZXF1aXJlZCBiZWZvcmUgZGlzcG9zYWwKKyAgaW50IERlbGF5VGltZTsgICAgICAgICAgIC8vIFByZS1kaXNwbGF5IGRlbGF5IGluIDAuMDFzZWMgdW5pdHMKKyAgaW50IFRyYW5zcGFyZW50Q29sb3I7ICAgIC8vIFBhbGV0dGUgaW5kZXggZm9yIHRyYW5zcGFyZW5jeSwgLTEgaWYgbm9uZQorI2RlZmluZSBOT19UUkFOU1BBUkVOVF9DT0xPUiAgICAgLTEKK30gR3JhcGhpY3NDb250cm9sQmxvY2s7CisKK3N0YXRpYyBpbnQgREdpZkV4dGVuc2lvblRvR0NCKGNvbnN0IHNpemVfdCBHaWZFeHRlbnNpb25MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHaWZCeXRlVHlwZSogR2lmRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250cm9sQmxvY2sqIGdjYikgeworICBpZiAoR2lmRXh0ZW5zaW9uTGVuZ3RoICE9IDQpIHsKKyAgICByZXR1cm4gR0lGX0VSUk9SOworICB9CisgIGdjYi0+RGlzcG9zYWxNb2RlID0gKEdpZkV4dGVuc2lvblswXSA+PiAyKSAmIDB4MDc7CisgIGdjYi0+VXNlcklucHV0RmxhZyA9IChHaWZFeHRlbnNpb25bMF0gJiAweDAyKSAhPSAwOworICBnY2ItPkRlbGF5VGltZSA9IEdpZkV4dGVuc2lvblsxXSB8IChHaWZFeHRlbnNpb25bMl0gPDwgOCk7CisgIGlmIChHaWZFeHRlbnNpb25bMF0gJiAweDAxKSB7CisgICAgZ2NiLT5UcmFuc3BhcmVudENvbG9yID0gKGludClHaWZFeHRlbnNpb25bM107CisgIH0gZWxzZSB7CisgICAgZ2NiLT5UcmFuc3BhcmVudENvbG9yID0gTk9fVFJBTlNQQVJFTlRfQ09MT1I7CisgIH0KKyAgcmV0dXJuIEdJRl9PSzsKK30KKworc3RhdGljIGludCBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihHaWZGaWxlVHlwZSogR2lmRmlsZSwgaW50IEltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29udHJvbEJsb2NrKiBnY2IpIHsKKyAgaW50IGk7CisgIGlmIChJbWFnZUluZGV4IDwgMCB8fCBJbWFnZUluZGV4ID4gR2lmRmlsZS0+SW1hZ2VDb3VudCAtIDEpIHsKKyAgICByZXR1cm4gR0lGX0VSUk9SOworICB9CisgIGdjYi0+RGlzcG9zYWxNb2RlID0gRElTUE9TQUxfVU5TUEVDSUZJRUQ7CisgIGdjYi0+VXNlcklucHV0RmxhZyA9IDA7CisgIGdjYi0+RGVsYXlUaW1lID0gMDsKKyAgZ2NiLT5UcmFuc3BhcmVudENvbG9yID0gTk9fVFJBTlNQQVJFTlRfQ09MT1I7CisKKyAgZm9yIChpID0gMDsgaSA8IEdpZkZpbGUtPlNhdmVkSW1hZ2VzW0ltYWdlSW5kZXhdLkV4dGVuc2lvbkJsb2NrQ291bnQ7IGkrKykgeworICAgIEV4dGVuc2lvbkJsb2NrKiBlcCA9ICZHaWZGaWxlLT5TYXZlZEltYWdlc1tJbWFnZUluZGV4XS5FeHRlbnNpb25CbG9ja3NbaV07CisgICAgaWYgKGVwLT5GdW5jdGlvbiA9PSBHUkFQSElDU19FWFRfRlVOQ19DT0RFKSB7CisgICAgICByZXR1cm4gREdpZkV4dGVuc2lvblRvR0NCKAorICAgICAgICAgIGVwLT5CeXRlQ291bnQsIChjb25zdCBHaWZCeXRlVHlwZSopZXAtPkJ5dGVzLCBnY2IpOworICAgIH0KKyAgfQorICByZXR1cm4gR0lGX0VSUk9SOworfQorCisjZGVmaW5lIENPTlRJTlVFX0VYVF9GVU5DX0NPREUgMHgwMAorCisvLyBTaWduYXR1cmUgd2FzIGNoYW5nZWQgaW4gdjUuMAorI2RlZmluZSBER2lmT3BlbkZpbGVOYW1lKGEsIGIpIERHaWZPcGVuRmlsZU5hbWUoYSkKKworI2VuZGlmICAvLyAhTE9DQUxfR0lGX1BSRVJFUSg1LCAwKQorCisvLyBTaWduYXR1cmUgY2hhbmdlZCBpbiB2NS4xCisjaWYgIUxPQ0FMX0dJRl9QUkVSRVEoNSwgMSkKKyNkZWZpbmUgREdpZkNsb3NlRmlsZShhLCBiKSBER2lmQ2xvc2VGaWxlKGEpCisjZW5kaWYKKworc3RhdGljIHZvaWQgR0lGRGlzcGxheUVycm9yKGNvbnN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCBnaWZfZXJyb3IpIHsKKyAgLy8gbGliZ2lmIDQuMi4wIGhhcyByZXRpcmVkIFByaW50R2lmRXJyb3IoKSBhbmQgYWRkZWQgR2lmRXJyb3JTdHJpbmcoKS4KKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDQsIDIpCisjaWYgTE9DQUxfR0lGX1BSRVJFUSg1LCAwKQorICBjb25zdCBjaGFyKiBlcnJvcl9zdHIgPQorICAgICAgR2lmRXJyb3JTdHJpbmcoKGdpZiA9PSBOVUxMKSA/IGdpZl9lcnJvciA6IGdpZi0+RXJyb3IpOworI2Vsc2UKKyAgY29uc3QgY2hhciogZXJyb3Jfc3RyID0gR2lmRXJyb3JTdHJpbmcoKTsKKyAgKHZvaWQpZ2lmOworI2VuZGlmCisgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkgZXJyb3Jfc3RyID0gIlVua25vd24gZXJyb3IiOworICBmcHJpbnRmKHN0ZGVyciwgIkdJRkxpYiBFcnJvciAlZDogJXNcbiIsIGdpZl9lcnJvciwgZXJyb3Jfc3RyKTsKKyNlbHNlCisgICh2b2lkKWdpZjsKKyAgZnByaW50ZihzdGRlcnIsICJHSUZMaWIgRXJyb3IgJWQ6ICIsIGdpZl9lcnJvcik7CisgIFByaW50R2lmRXJyb3IoKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgSXNLZXlGcmFtZUdJRihjb25zdCBHaWZJbWFnZURlc2MqIHByZXZfZGVzYywgaW50IHByZXZfZGlzcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVkRnJhbWUqIGNvbnN0IHByZXZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc193aWR0aCwgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgaWYgKHByZXZfZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDE7CisgIGlmIChwcmV2X2Rpc3Bvc2UgPT0gRElTUE9TRV9CQUNLR1JPVU5EKSB7CisgICAgaWYgKElzRnVsbEZyYW1lKHByZXZfZGVzYy0+V2lkdGgsIHByZXZfZGVzYy0+SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHByZXZfZnJhbWUtPmlzX2tleV9mcmFtZSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR2V0VHJhbnNwYXJlbnRJbmRleEdJRihHaWZGaWxlVHlwZSogZ2lmKSB7CisgIEdyYXBoaWNzQ29udHJvbEJsb2NrIGZpcnN0X2djYjsKKyAgbWVtc2V0KCZmaXJzdF9nY2IsIDAsIHNpemVvZihmaXJzdF9nY2IpKTsKKyAgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoZ2lmLCAwLCAmZmlyc3RfZ2NiKTsKKyAgcmV0dXJuIGZpcnN0X2djYi5UcmFuc3BhcmVudENvbG9yOworfQorCitzdGF0aWMgdWludDMyX3QgR2V0QmFja2dyb3VuZENvbG9yR0lGKEdpZkZpbGVUeXBlKiBnaWYpIHsKKyAgY29uc3QgaW50IHRyYW5zcGFyZW50X2luZGV4ID0gR2V0VHJhbnNwYXJlbnRJbmRleEdJRihnaWYpOworICBjb25zdCBDb2xvck1hcE9iamVjdCogY29uc3QgY29sb3JfbWFwID0gZ2lmLT5TQ29sb3JNYXA7CisgIGlmICh0cmFuc3BhcmVudF9pbmRleCAhPSBOT19UUkFOU1BBUkVOVF9DT0xPUiAmJgorICAgICAgZ2lmLT5TQmFja0dyb3VuZENvbG9yID09IHRyYW5zcGFyZW50X2luZGV4KSB7CisgICAgcmV0dXJuIDB4MDAwMDAwMDA7ICAvLyBTcGVjaWFsIGNhc2U6IHRyYW5zcGFyZW50IGJsYWNrLgorICB9IGVsc2UgaWYgKGNvbG9yX21hcCA9PSBOVUxMIHx8IGNvbG9yX21hcC0+Q29sb3JzID09IE5VTEwKKyAgICAgICAgICAgICB8fCBnaWYtPlNCYWNrR3JvdW5kQ29sb3IgPj0gY29sb3JfbWFwLT5Db2xvckNvdW50KSB7CisgICAgcmV0dXJuIDB4ZmZmZmZmZmY7ICAvLyBJbnZhbGlkOiBhc3N1bWUgd2hpdGUuCisgIH0gZWxzZSB7CisgICAgY29uc3QgR2lmQ29sb3JUeXBlIGNvbG9yID0gY29sb3JfbWFwLT5Db2xvcnNbZ2lmLT5TQmFja0dyb3VuZENvbG9yXTsKKyAgICByZXR1cm4gKDB4ZmYgPDwgMjQpIHwKKyAgICAgICAgICAgKGNvbG9yLlJlZCA8PCAxNikgfAorICAgICAgICAgICAoY29sb3IuR3JlZW4gPDwgOCkgfAorICAgICAgICAgICAoY29sb3IuQmx1ZSA8PCAwKTsKKyAgfQorfQorCisvLyBGaW5kIGFwcHJvcHJpYXRlIGFwcCBleHRlbnNpb24gYW5kIGdldCBsb29wIGNvdW50IGZyb20gdGhlIG5leHQgZXh0ZW5zaW9uLgorLy8gV2UgdXNlIENocm9tZSdzIGludGVycHJldGF0aW9uIG9mIHRoZSAnbG9vcF9jb3VudCcgc2VtYW50aWNzOgorLy8gICBpZiBub3QgcHJlc2VudCAtPiBsb29wIG9uY2UKKy8vICAgaWYgcHJlc2VudCBhbmQgbG9vcF9jb3VudCA9PSAwLCByZXR1cm4gMCAoJ2luZmluaXRlJykuCisvLyAgIGlmIHByZXNlbnQgYW5kIGxvb3BfY291bnQgIT0gMCwgaXQncyB0aGUgbnVtYmVyIG9mICpleHRyYSogbG9vcHMKKy8vICAgICBzbyB3ZSBuZWVkIHRvIHJldHVybiBsb29wX2NvdW50ICsgMSBhcyB0b3RhbCBsb29wIG51bWJlci4KK3N0YXRpYyB1aW50MzJfdCBHZXRMb29wQ291bnRHSUYoY29uc3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGdpZi0+SW1hZ2VDb3VudDsgKytpKSB7CisgICAgY29uc3QgU2F2ZWRJbWFnZSogY29uc3QgaW1hZ2UgPSAmZ2lmLT5TYXZlZEltYWdlc1tpXTsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyAoaiArIDEpIDwgaW1hZ2UtPkV4dGVuc2lvbkJsb2NrQ291bnQ7ICsraikgeworICAgICAgY29uc3QgRXh0ZW5zaW9uQmxvY2sqIGNvbnN0IGViMSA9IGltYWdlLT5FeHRlbnNpb25CbG9ja3MgKyBqOworICAgICAgY29uc3QgRXh0ZW5zaW9uQmxvY2sqIGNvbnN0IGViMiA9IGltYWdlLT5FeHRlbnNpb25CbG9ja3MgKyBqICsgMTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHNpZ25hdHVyZSA9IChjb25zdCBjaGFyKillYjEtPkJ5dGVzOworICAgICAgY29uc3QgaW50IHNpZ25hdHVyZV9pc19vayA9CisgICAgICAgICAgKGViMS0+RnVuY3Rpb24gPT0gQVBQTElDQVRJT05fRVhUX0ZVTkNfQ09ERSkgJiYKKyAgICAgICAgICAoZWIxLT5CeXRlQ291bnQgPT0gMTEpICYmCisgICAgICAgICAgKCFtZW1jbXAoc2lnbmF0dXJlLCAiTkVUU0NBUEUyLjAiLCAxMSkgfHwKKyAgICAgICAgICAgIW1lbWNtcChzaWduYXR1cmUsICJBTklNRVhUUzEuMCIsIDExKSk7CisgICAgICBpZiAoc2lnbmF0dXJlX2lzX29rICYmCisgICAgICAgICAgZWIyLT5GdW5jdGlvbiA9PSBDT05USU5VRV9FWFRfRlVOQ19DT0RFICYmIGViMi0+Qnl0ZUNvdW50ID49IDMgJiYKKyAgICAgICAgICBlYjItPkJ5dGVzWzBdID09IDEpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZXh0cmFfbG9vcCA9ICgodWludDMyX3QpKGViMi0+Qnl0ZXNbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKGViMi0+Qnl0ZXNbMV0pIDw8IDApOworICAgICAgICByZXR1cm4gKGV4dHJhX2xvb3AgPiAwKSA/IGV4dHJhX2xvb3AgKyAxIDogMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7ICAvLyBEZWZhdWx0LgorfQorCisvLyBHZXQgZHVyYXRpb24gb2YgJ24ndGggZnJhbWUgaW4gbWlsbGlzZWNvbmRzLgorc3RhdGljIGludCBHZXRGcmFtZUR1cmF0aW9uR0lGKEdpZkZpbGVUeXBlKiBnaWYsIGludCBuKSB7CisgIEdyYXBoaWNzQ29udHJvbEJsb2NrIGdjYjsKKyAgbWVtc2V0KCZnY2IsIDAsIHNpemVvZihnY2IpKTsKKyAgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoZ2lmLCBuLCAmZ2NiKTsKKyAgcmV0dXJuIGdjYi5EZWxheVRpbWUgKiAxMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGZyYW1lICd0YXJnZXQnIGNvbXBsZXRlbHkgY292ZXJzICdjb3ZlcmVkJy4KK3N0YXRpYyBpbnQgQ292ZXJzRnJhbWVHSUYoY29uc3QgR2lmSW1hZ2VEZXNjKiBjb25zdCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdpZkltYWdlRGVzYyogY29uc3QgY292ZXJlZCkgeworICByZXR1cm4gdGFyZ2V0LT5MZWZ0IDw9IGNvdmVyZWQtPkxlZnQgJiYKKyAgICAgICAgIGNvdmVyZWQtPkxlZnQgKyBjb3ZlcmVkLT5XaWR0aCA8PSB0YXJnZXQtPkxlZnQgKyB0YXJnZXQtPldpZHRoICYmCisgICAgICAgICB0YXJnZXQtPlRvcCA8PSBjb3ZlcmVkLT5Ub3AgJiYKKyAgICAgICAgIGNvdmVyZWQtPlRvcCArIGNvdmVyZWQtPkhlaWdodCA8PSB0YXJnZXQtPlRvcCArIHRhcmdldC0+SGVpZ2h0OworfQorCitzdGF0aWMgdm9pZCBSZW1hcFBpeGVsc0dJRihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xvck1hcE9iamVjdCogY29uc3QgY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVudF9jb2xvciwgaW50IGxlbiwgdWludDhfdCogZHN0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBpZiAoc3JjW2ldICE9IHRyYW5zcGFyZW50X2NvbG9yKSB7CisgICAgICAvLyBJZiBhIHBpeGVsIGluIHRoZSBjdXJyZW50IGZyYW1lIGlzIHRyYW5zcGFyZW50LCB3ZSBkb24ndCBtb2RpZnkgaXQsIHNvCisgICAgICAvLyB0aGF0IHdlIGNhbiBzZWUtdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBmcm9tIGFuIGVhcmxpZXIgZnJhbWUuCisgICAgICBjb25zdCBHaWZDb2xvclR5cGUgYyA9IGNtYXAtPkNvbG9yc1tzcmNbaV1dOworICAgICAgZHN0WzQgKiBpICsgMF0gPSBjLlJlZDsKKyAgICAgIGRzdFs0ICogaSArIDFdID0gYy5HcmVlbjsKKyAgICAgIGRzdFs0ICogaSArIDJdID0gYy5CbHVlOworICAgICAgZHN0WzQgKiBpICsgM10gPSAweGZmOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IFJlYWRGcmFtZUdJRihjb25zdCBTYXZlZEltYWdlKiBjb25zdCBnaWZfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xvck1hcE9iamVjdCogY21hcCwgaW50IHRyYW5zcGFyZW50X2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9zdHJpZGUsIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBHaWZJbWFnZURlc2MqIGltYWdlX2Rlc2MgPSAmZ2lmX2ltYWdlLT5JbWFnZURlc2M7CisgIGNvbnN0IHVpbnQ4X3QqIGluOworICB1aW50OF90KiBvdXQ7CisgIGludCBqOworCisgIGlmIChpbWFnZV9kZXNjLT5Db2xvck1hcCkgY21hcCA9IGltYWdlX2Rlc2MtPkNvbG9yTWFwOworCisgIGlmIChjbWFwID09IE5VTEwgfHwgY21hcC0+Q29sb3JDb3VudCAhPSAoMSA8PCBjbWFwLT5CaXRzUGVyUGl4ZWwpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJQb3RlbnRpYWxseSBjb3JydXB0IGNvbG9yIG1hcC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaW4gPSAoY29uc3QgdWludDhfdCopZ2lmX2ltYWdlLT5SYXN0ZXJCaXRzOworICBvdXQgPSBkc3QgKyBpbWFnZV9kZXNjLT5Ub3AgKiBvdXRfc3RyaWRlICsgaW1hZ2VfZGVzYy0+TGVmdCAqIGtOdW1DaGFubmVsczsKKworICBmb3IgKGogPSAwOyBqIDwgaW1hZ2VfZGVzYy0+SGVpZ2h0OyArK2opIHsKKyAgICBSZW1hcFBpeGVsc0dJRihpbiwgY21hcCwgdHJhbnNwYXJlbnRfY29sb3IsIGltYWdlX2Rlc2MtPldpZHRoLCBvdXQpOworICAgIGluICs9IGltYWdlX2Rlc2MtPldpZHRoOworICAgIG91dCArPSBvdXRfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLyBSZWFkIGFuaW1hdGVkIEdJRiBiaXRzdHJlYW0gZnJvbSAnZmlsZW5hbWUnIGludG8gJ0FuaW1hdGVkSW1hZ2UnIHN0cnVjdC4KK3N0YXRpYyBpbnQgUmVhZEFuaW1hdGVkR0lGKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVtcF9mcmFtZXMsIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSkgeworICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgdWludDMyX3QgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworICB1aW50MzJfdCBpOworICBpbnQgZ2lmX2Vycm9yOworICBHaWZGaWxlVHlwZSogZ2lmOworCisgIGdpZiA9IERHaWZPcGVuRmlsZU5hbWUoZmlsZW5hbWUsIE5VTEwpOworICBpZiAoZ2lmID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGZpbGU6ICVzLlxuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgZ2lmX2Vycm9yID0gREdpZlNsdXJwKGdpZik7CisgIGlmIChnaWZfZXJyb3IgIT0gR0lGX09LKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcGFyc2UgaW1hZ2U6ICVzLlxuIiwgZmlsZW5hbWUpOworICAgIEdJRkRpc3BsYXlFcnJvcihnaWYsIGdpZl9lcnJvcik7CisgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQW5pbWF0aW9uIHByb3BlcnRpZXMuCisgIGltYWdlLT5jYW52YXNfd2lkdGggPSAodWludDMyX3QpZ2lmLT5TV2lkdGg7CisgIGltYWdlLT5jYW52YXNfaGVpZ2h0ID0gKHVpbnQzMl90KWdpZi0+U0hlaWdodDsKKyAgaWYgKGltYWdlLT5jYW52YXNfd2lkdGggPiBNQVhfQ0FOVkFTX1NJWkUgfHwKKyAgICAgIGltYWdlLT5jYW52YXNfaGVpZ2h0ID4gTUFYX0NBTlZBU19TSVpFKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGNhbnZhcyBkaW1lbnNpb246ICVkIHggJWRcbiIsCisgICAgICAgICAgICBpbWFnZS0+Y2FudmFzX3dpZHRoLCBpbWFnZS0+Y2FudmFzX2hlaWdodCk7CisgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgIHJldHVybiAwOworICB9CisgIGltYWdlLT5sb29wX2NvdW50ID0gR2V0TG9vcENvdW50R0lGKGdpZik7CisgIGltYWdlLT5iZ2NvbG9yID0gR2V0QmFja2dyb3VuZENvbG9yR0lGKGdpZik7CisKKyAgZnJhbWVfY291bnQgPSAodWludDMyX3QpZ2lmLT5JbWFnZUNvdW50OworICBpZiAoZnJhbWVfY291bnQgPT0gMCkgeworICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChpbWFnZS0+Y2FudmFzX3dpZHRoID09IDAgfHwgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPT0gMCkgeworICAgIGltYWdlLT5jYW52YXNfd2lkdGggPSBnaWYtPlNhdmVkSW1hZ2VzWzBdLkltYWdlRGVzYy5XaWR0aDsKKyAgICBpbWFnZS0+Y2FudmFzX2hlaWdodCA9IGdpZi0+U2F2ZWRJbWFnZXNbMF0uSW1hZ2VEZXNjLkhlaWdodDsKKyAgICBnaWYtPlNhdmVkSW1hZ2VzWzBdLkltYWdlRGVzYy5MZWZ0ID0gMDsKKyAgICBnaWYtPlNhdmVkSW1hZ2VzWzBdLkltYWdlRGVzYy5Ub3AgPSAwOworICAgIGlmIChpbWFnZS0+Y2FudmFzX3dpZHRoID09IDAgfHwgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGNhbnZhcyBzaXplIGluIEdJRi5cbiIpOworICAgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIC8vIEFsbG9jYXRlIGZyYW1lcy4KKyAgQWxsb2NhdGVGcmFtZXMoaW1hZ2UsIGZyYW1lX2NvdW50KTsKKworICBjYW52YXNfd2lkdGggPSBpbWFnZS0+Y2FudmFzX3dpZHRoOworICBjYW52YXNfaGVpZ2h0ID0gaW1hZ2UtPmNhbnZhc19oZWlnaHQ7CisKKyAgLy8gRGVjb2RlIGFuZCByZWNvbnN0cnVjdCBmcmFtZXMuCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9jb3VudDsgKytpKSB7CisgICAgY29uc3QgaW50IGNhbnZhc193aWR0aF9pbl9ieXRlcyA9IGNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVsczsKKyAgICBjb25zdCBTYXZlZEltYWdlKiBjb25zdCBjdXJyX2dpZl9pbWFnZSA9ICZnaWYtPlNhdmVkSW1hZ2VzW2ldOworICAgIEdyYXBoaWNzQ29udHJvbEJsb2NrIGN1cnJfZ2NiOworICAgIERlY29kZWRGcmFtZSogY3Vycl9mcmFtZTsKKyAgICB1aW50OF90KiBjdXJyX3JnYmE7CisKKyAgICBtZW1zZXQoJmN1cnJfZ2NiLCAwLCBzaXplb2YoY3Vycl9nY2IpKTsKKyAgICBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihnaWYsIGksICZjdXJyX2djYik7CisKKyAgICBjdXJyX2ZyYW1lID0gJmltYWdlLT5mcmFtZXNbaV07CisgICAgY3Vycl9yZ2JhID0gY3Vycl9mcmFtZS0+cmdiYTsKKyAgICBjdXJyX2ZyYW1lLT5kdXJhdGlvbiA9IEdldEZyYW1lRHVyYXRpb25HSUYoZ2lmLCBpKTsKKyAgICAvLyBGb3JjZSBmcmFtZXMgd2l0aCBhIHNtYWxsIG9yIG5vIGR1cmF0aW9uIHRvIDEwMG1zIHRvIGJlIGNvbnNpc3RlbnQKKyAgICAvLyB3aXRoIHdlYiBicm93c2VycyBhbmQgb3RoZXIgdHJhbnNjb2RpbmcgdG9vbHMgKGxpa2UgZ2lmMndlYnAgaXRzZWxmKS4KKyAgICBpZiAoY3Vycl9mcmFtZS0+ZHVyYXRpb24gPD0gMTApIGN1cnJfZnJhbWUtPmR1cmF0aW9uID0gMTAwOworCisgICAgaWYgKGkgPT0gMCkgeyAgLy8gSW5pdGlhbGl6ZSBhcyB0cmFuc3BhcmVudC4KKyAgICAgIGN1cnJfZnJhbWUtPmlzX2tleV9mcmFtZSA9IDE7CisgICAgICBaZXJvRmlsbENhbnZhcyhjdXJyX3JnYmEsIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlY29kZWRGcmFtZSogY29uc3QgcHJldl9mcmFtZSA9ICZpbWFnZS0+ZnJhbWVzW2kgLSAxXTsKKyAgICAgIGNvbnN0IEdpZkltYWdlRGVzYyogY29uc3QgcHJldl9kZXNjID0gJmdpZi0+U2F2ZWRJbWFnZXNbaSAtIDFdLkltYWdlRGVzYzsKKyAgICAgIEdyYXBoaWNzQ29udHJvbEJsb2NrIHByZXZfZ2NiOworICAgICAgbWVtc2V0KCZwcmV2X2djYiwgMCwgc2l6ZW9mKHByZXZfZ2NiKSk7CisgICAgICBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihnaWYsIGkgLSAxLCAmcHJldl9nY2IpOworCisgICAgICBjdXJyX2ZyYW1lLT5pc19rZXlfZnJhbWUgPQorICAgICAgICAgIElzS2V5RnJhbWVHSUYocHJldl9kZXNjLCBwcmV2X2djYi5EaXNwb3NhbE1vZGUsIHByZXZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworCisgICAgICBpZiAoY3Vycl9mcmFtZS0+aXNfa2V5X2ZyYW1lKSB7ICAvLyBJbml0aWFsaXplIGFzIHRyYW5zcGFyZW50LgorICAgICAgICBaZXJvRmlsbENhbnZhcyhjdXJyX3JnYmEsIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJldl9mcmFtZV9kaXNwb3NlZCwgY3Vycl9mcmFtZV9vcGFxdWU7CisgICAgICAgIGludCBwcmV2X2ZyYW1lX2NvbXBsZXRlbHlfY292ZXJlZDsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHByZXZpb3VzIGNhbnZhcy4KKyAgICAgICAgdWludDhfdCogY29uc3QgcHJldl9yZ2JhID0gaW1hZ2UtPmZyYW1lc1tpIC0gMV0ucmdiYTsKKyAgICAgICAgQ29weUNhbnZhcyhwcmV2X3JnYmEsIGN1cnJfcmdiYSwgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KTsKKworICAgICAgICAvLyBEaXNwb3NlIHByZXZpb3VzIGZyYW1lIHJlY3RhbmdsZS4KKyAgICAgICAgcHJldl9mcmFtZV9kaXNwb3NlZCA9CisgICAgICAgICAgICAocHJldl9nY2IuRGlzcG9zYWxNb2RlID09IERJU1BPU0VfQkFDS0dST1VORCB8fAorICAgICAgICAgICAgIHByZXZfZ2NiLkRpc3Bvc2FsTW9kZSA9PSBESVNQT1NFX1BSRVZJT1VTKTsKKyAgICAgICAgY3Vycl9mcmFtZV9vcGFxdWUgPQorICAgICAgICAgICAgKGN1cnJfZ2NiLlRyYW5zcGFyZW50Q29sb3IgPT0gTk9fVFJBTlNQQVJFTlRfQ09MT1IpOworICAgICAgICBwcmV2X2ZyYW1lX2NvbXBsZXRlbHlfY292ZXJlZCA9CisgICAgICAgICAgICBjdXJyX2ZyYW1lX29wYXF1ZSAmJgorICAgICAgICAgICAgQ292ZXJzRnJhbWVHSUYoJmN1cnJfZ2lmX2ltYWdlLT5JbWFnZURlc2MsIHByZXZfZGVzYyk7CisKKyAgICAgICAgaWYgKHByZXZfZnJhbWVfZGlzcG9zZWQgJiYgIXByZXZfZnJhbWVfY29tcGxldGVseV9jb3ZlcmVkKSB7CisgICAgICAgICAgc3dpdGNoIChwcmV2X2djYi5EaXNwb3NhbE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgRElTUE9TRV9CQUNLR1JPVU5EOiB7CisgICAgICAgICAgICAgIFplcm9GaWxsRnJhbWVSZWN0KGN1cnJfcmdiYSwgY2FudmFzX3dpZHRoX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPkxlZnQsIHByZXZfZGVzYy0+VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPldpZHRoLCBwcmV2X2Rlc2MtPkhlaWdodCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBESVNQT1NFX1BSRVZJT1VTOiB7CisgICAgICAgICAgICAgIGludCBzcmNfZnJhbWVfbnVtID0gaSAtIDI7CisgICAgICAgICAgICAgIHdoaWxlIChzcmNfZnJhbWVfbnVtID49IDApIHsKKyAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRyb2xCbG9jayBzcmNfZnJhbWVfZ2NiOworICAgICAgICAgICAgICAgIG1lbXNldCgmc3JjX2ZyYW1lX2djYiwgMCwgc2l6ZW9mKHNyY19mcmFtZV9nY2IpKTsKKyAgICAgICAgICAgICAgICBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihnaWYsIHNyY19mcmFtZV9udW0sICZzcmNfZnJhbWVfZ2NiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2ZyYW1lX2djYi5EaXNwb3NhbE1vZGUgIT0gRElTUE9TRV9QUkVWSU9VUykgYnJlYWs7CisgICAgICAgICAgICAgICAgLS1zcmNfZnJhbWVfbnVtOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfZnJhbWVfbnVtID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHBpeGVscyBpbnNpZGUgcHJldmlvdXMgZnJhbWUgcmVjdGFuZ2xlIHRvCisgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBwaXhlbHMgaW4gc291cmNlIGNhbnZhcy4KKyAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBzcmNfZnJhbWVfcmdiYSA9CisgICAgICAgICAgICAgICAgICAgIGltYWdlLT5mcmFtZXNbc3JjX2ZyYW1lX251bV0ucmdiYTsKKyAgICAgICAgICAgICAgICBDb3B5RnJhbWVSZWN0YW5nbGUoc3JjX2ZyYW1lX3JnYmEsIGN1cnJfcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPkxlZnQsIHByZXZfZGVzYy0+VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPldpZHRoLCBwcmV2X2Rlc2MtPkhlaWdodCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU291cmNlIGNhbnZhcyBkb2Vzbid0IGV4aXN0LiBTbyBjbGVhciBwcmV2aW91cyBmcmFtZQorICAgICAgICAgICAgICAgIC8vIHJlY3RhbmdsZSB0byBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgIFplcm9GaWxsRnJhbWVSZWN0KGN1cnJfcmdiYSwgY2FudmFzX3dpZHRoX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+TGVmdCwgcHJldl9kZXNjLT5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5XaWR0aCwgcHJldl9kZXNjLT5IZWlnaHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7ICAvLyBOb3RoaW5nIHRvIGRvLgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIERlY29kZSBjdXJyZW50IGZyYW1lLgorICAgIGlmICghUmVhZEZyYW1lR0lGKGN1cnJfZ2lmX2ltYWdlLCBnaWYtPlNDb2xvck1hcCwgY3Vycl9nY2IuVHJhbnNwYXJlbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfd2lkdGhfaW5fYnl0ZXMsIGN1cnJfcmdiYSkpIHsKKyAgICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChkdW1wX2ZyYW1lcykgeworICAgICAgaWYgKCFEdW1wRnJhbWUoZmlsZW5hbWUsIGR1bXBfZm9sZGVyLCBpLCBjdXJyX3JnYmEsCisgICAgICAgICAgICAgICAgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpKSB7CisgICAgICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgcmV0dXJuIDE7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgSXNHSUYoY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEpIHsKKyAgKHZvaWQpZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgUmVhZEFuaW1hdGVkR0lGKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVtcF9mcmFtZXMsIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSkgeworICAodm9pZClmaWxlbmFtZTsKKyAgKHZvaWQpaW1hZ2U7CisgICh2b2lkKWR1bXBfZnJhbWVzOworICAodm9pZClkdW1wX2ZvbGRlcjsKKyAgZnByaW50ZihzdGRlcnIsICJHSUYgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJnaWYtZGV2ICIKKyAgICAgICAgICAicGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gV0VCUF9IQVZFX0dJRgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmVhZEFuaW1hdGVkSW1hZ2UoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVtcF9mcmFtZXMsIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSkgeworICBpbnQgb2sgPSAwOworICBXZWJQRGF0YSB3ZWJwX2RhdGE7CisKKyAgV2ViUERhdGFJbml0KCZ3ZWJwX2RhdGEpOworICBtZW1zZXQoaW1hZ2UsIDAsIHNpemVvZigqaW1hZ2UpKTsKKworICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmd2VicF9kYXRhLmJ5dGVzLCAmd2VicF9kYXRhLnNpemUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIGZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoSXNXZWJQKCZ3ZWJwX2RhdGEpKSB7CisgICAgb2sgPSBSZWFkQW5pbWF0ZWRXZWJQKGZpbGVuYW1lLCAmd2VicF9kYXRhLCBpbWFnZSwgZHVtcF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfZm9sZGVyKTsKKyAgfSBlbHNlIGlmIChJc0dJRigmd2VicF9kYXRhKSkgeworICAgIG9rID0gUmVhZEFuaW1hdGVkR0lGKGZpbGVuYW1lLCBpbWFnZSwgZHVtcF9mcmFtZXMsIGR1bXBfZm9sZGVyKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVbmtub3duIGZpbGUgdHlwZTogJXMuIFN1cHBvcnRlZCBmaWxlIHR5cGVzIGFyZSBXZWJQIGFuZCBHSUZcbiIsCisgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgb2sgPSAwOworICB9CisgIGlmICghb2spIENsZWFyQW5pbWF0ZWRJbWFnZShpbWFnZSk7CisgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgQWNjdW11bGF0ZShkb3VibGUgdjEsIGRvdWJsZSB2MiwgZG91YmxlKiBjb25zdCBtYXhfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb25zdCBzc2UpIHsKKyAgY29uc3QgZG91YmxlIGRpZmYgPSBmYWJzKHYxIC0gdjIpOworICBpZiAoZGlmZiA+ICptYXhfZGlmZikgKm1heF9kaWZmID0gZGlmZjsKKyAgKnNzZSArPSBkaWZmICogZGlmZjsKK30KKwordm9pZCBHZXREaWZmQW5kUFNOUihjb25zdCB1aW50OF90IHJnYmExW10sIGNvbnN0IHVpbnQ4X3QgcmdiYTJbXSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IHByZW11bHRpcGx5LAorICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG1heF9kaWZmLCBkb3VibGUqIGNvbnN0IHBzbnIpIHsKKyAgY29uc3QgdWludDMyX3Qgc3RyaWRlID0gd2lkdGggKiBrTnVtQ2hhbm5lbHM7CisgIGNvbnN0IGludCBrQWxwaGFDaGFubmVsID0ga051bUNoYW5uZWxzIC0gMTsKKyAgZG91YmxlIGZfbWF4X2RpZmYgPSAwLjsKKyAgZG91YmxlIHNzZSA9IDAuOworICB1aW50MzJfdCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgc3RyaWRlOyB4ICs9IGtOdW1DaGFubmVscykgeworICAgICAgaW50IGs7CisgICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gKHNpemVfdCl5ICogc3RyaWRlICsgeDsKKyAgICAgIGNvbnN0IGludCBhbHBoYTEgPSByZ2JhMVtvZmZzZXQgKyBrQWxwaGFDaGFubmVsXTsKKyAgICAgIGNvbnN0IGludCBhbHBoYTIgPSByZ2JhMltvZmZzZXQgKyBrQWxwaGFDaGFubmVsXTsKKyAgICAgIEFjY3VtdWxhdGUoYWxwaGExLCBhbHBoYTIsICZmX21heF9kaWZmLCAmc3NlKTsKKyAgICAgIGlmICghcHJlbXVsdGlwbHkpIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGtBbHBoYUNoYW5uZWw7ICsraykgeworICAgICAgICAgIEFjY3VtdWxhdGUocmdiYTFbb2Zmc2V0ICsga10sIHJnYmEyW29mZnNldCArIGtdLCAmZl9tYXhfZGlmZiwgJnNzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHByZW11bHRpcGx5IFIvRy9CIGNoYW5uZWxzIHdpdGggYWxwaGEgdmFsdWUKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGtBbHBoYUNoYW5uZWw7ICsraykgeworICAgICAgICAgIEFjY3VtdWxhdGUocmdiYTFbb2Zmc2V0ICsga10gKiBhbHBoYTEgLyAyNTUuLAorICAgICAgICAgICAgICAgICAgICAgcmdiYTJbb2Zmc2V0ICsga10gKiBhbHBoYTIgLyAyNTUuLAorICAgICAgICAgICAgICAgICAgICAgJmZfbWF4X2RpZmYsICZzc2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgICptYXhfZGlmZiA9IChpbnQpZl9tYXhfZGlmZjsKKyAgaWYgKCptYXhfZGlmZiA9PSAwKSB7CisgICAgKnBzbnIgPSA5OS47ICAvLyBQU05SIHdoZW4gaW1hZ2VzIGFyZSBpZGVudGljYWwuCisgIH0gZWxzZSB7CisgICAgc3NlIC89IHN0cmlkZSAqIGhlaWdodDsKKyAgICAqcHNuciA9IDQuMzQyOTQ0OCAqIGxvZygyNTUuICogMjU1LiAvIHNzZSk7CisgIH0KK30KKwordm9pZCBHZXRBbmltYXRlZEltYWdlVmVyc2lvbnMoaW50KiBjb25zdCBkZWNvZGVyX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGRlbXV4X3ZlcnNpb24pIHsKKyAgKmRlY29kZXJfdmVyc2lvbiA9IFdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICAqZGVtdXhfdmVyc2lvbiA9IFdlYlBHZXREZW11eFZlcnNpb24oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2MzEyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIGFuaW1hdGVkIGltYWdlcworCisjaWZuZGVmIFdFQlBfRVhBTVBMRVNfQU5JTV9VVElMX0hfCisjZGVmaW5lIFdFQlBfRVhBTVBMRVNfQU5JTV9VVElMX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCogcmdiYTsgICAgICAgICAvLyBEZWNvZGVkIGFuZCByZWNvbnN0cnVjdGVkIGZ1bGwgZnJhbWUuCisgIGludCBkdXJhdGlvbjsgICAgICAgICAgLy8gRnJhbWUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorICBpbnQgaXNfa2V5X2ZyYW1lOyAgICAgIC8vIFRydWUgaWYgdGhpcyBmcmFtZSBpcyBhIGtleS1mcmFtZS4KK30gRGVjb2RlZEZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IGNhbnZhc193aWR0aDsKKyAgdWludDMyX3QgY2FudmFzX2hlaWdodDsKKyAgdWludDMyX3QgYmdjb2xvcjsKKyAgdWludDMyX3QgbG9vcF9jb3VudDsKKyAgRGVjb2RlZEZyYW1lKiBmcmFtZXM7CisgIHVpbnQzMl90IG51bV9mcmFtZXM7CisgIHZvaWQqIHJhd19tZW07Cit9IEFuaW1hdGVkSW1hZ2U7CisKKy8vIERlYWxsb2NhdGUgZXZlcnl0aGluZyBpbiAnaW1hZ2UnIChidXQgbm90IHRoZSBvYmplY3QgaXRzZWxmKS4KK3ZvaWQgQ2xlYXJBbmltYXRlZEltYWdlKEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlKTsKKworLy8gUmVhZCBhbmltYXRlZCBpbWFnZSBmaWxlIGludG8gJ0FuaW1hdGVkSW1hZ2UnIHN0cnVjdC4KKy8vIElmICdkdW1wX2ZyYW1lcycgaXMgdHJ1ZSwgZHVtcCBmcmFtZXMgdG8gJ2R1bXBfZm9sZGVyJy4KKy8vIFByZXZpb3VzIGNvbnRlbnQgb2YgJ2ltYWdlJyBpcyBvYmxpdGVyYXRlZC4KKy8vIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGNvbnRlbnQgb2YgJ2ltYWdlJyBtdXN0IGJlIGRlbGV0ZWQgYnkKKy8vIGNhbGxpbmcgJ0NsZWFyQW5pbWF0ZWRJbWFnZScuCitpbnQgUmVhZEFuaW1hdGVkSW1hZ2UoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVtcF9mcmFtZXMsIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSk7CisKKy8vIEdpdmVuIHR3byBSR0JBIGJ1ZmZlcnMsIGNhbGN1bGF0ZSBtYXggcGl4ZWwgZGlmZmVyZW5jZSBhbmQgUFNOUi4KKy8vIElmICdwcmVtdWx0aXBseScgaXMgdHJ1ZSwgUi9HL0IgdmFsdWVzIHdpbGwgYmUgcHJlLW11bHRpcGxpZWQgYnkgdGhlCisvLyB0cmFuc3BhcmVuY3kgYmVmb3JlIGNvbXBhcmlzb24uCit2b2lkIEdldERpZmZBbmRQU05SKGNvbnN0IHVpbnQ4X3QgcmdiYTFbXSwgY29uc3QgdWludDhfdCByZ2JhMltdLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgcHJlbXVsdGlwbHksCisgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbWF4X2RpZmYsIGRvdWJsZSogY29uc3QgcHNucik7CisKKy8vIFJldHVybiBsaWJyYXJ5IHZlcnNpb25zIHVzZWQgYnkgYW5pbV91dGlsLgordm9pZCBHZXRBbmltYXRlZEltYWdlVmVyc2lvbnMoaW50KiBjb25zdCBkZWNvZGVyX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGRlbXV4X3ZlcnNpb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9FWEFNUExFU19BTklNX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2N3ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9jd2VicC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzE5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9jd2VicC5jCkBAIC0wLDAgKzEsMTEzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBzaW1wbGUgY29tbWFuZCBsaW5lIGNhbGxpbmcgdGhlIFdlYlBFbmNvZGUgZnVuY3Rpb24uCisvLyAgRW5jb2RlcyBhIHJhdyAuWVVWIGludG8gV2ViUCBiaXRzdHJlYW0KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlX2RlYy5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9zdG9wd2F0Y2guaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisjaWZuZGVmIFdFQlBfRExMCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiB2b2lkKiBWUDhHZXRDUFVJbmZvOyAgIC8vIG9wYXF1ZSBmb3J3YXJkIGRlY2xhcmF0aW9uLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisjZW5kaWYgIC8vIFdFQlBfRExMCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKK3N0YXRpYyBpbnQgUmVhZFlVVihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgY29uc3QgaW50IHVzZV9hcmdiID0gcGljLT51c2VfYXJnYjsKKyAgY29uc3QgaW50IHV2X3dpZHRoID0gKHBpYy0+d2lkdGggKyAxKSAvIDI7CisgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAocGljLT5oZWlnaHQgKyAxKSAvIDI7CisgIGNvbnN0IGludCB5X3BsYW5lX3NpemUgPSBwaWMtPndpZHRoICogcGljLT5oZWlnaHQ7CisgIGNvbnN0IGludCB1dl9wbGFuZV9zaXplID0gdXZfd2lkdGggKiB1dl9oZWlnaHQ7CisgIGNvbnN0IHNpemVfdCBleHBlY3RlZF9kYXRhX3NpemUgPSB5X3BsYW5lX3NpemUgKyAyICogdXZfcGxhbmVfc2l6ZTsKKworICBpZiAoZGF0YV9zaXplICE9IGV4cGVjdGVkX2RhdGFfc2l6ZSkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgImlucHV0IGRhdGEgZG9lc24ndCBoYXZlIHRoZSBleHBlY3RlZCBzaXplICglZCBpbnN0ZWFkIG9mICVkKVxuIiwKKyAgICAgICAgICAgIChpbnQpZGF0YV9zaXplLCAoaW50KWV4cGVjdGVkX2RhdGFfc2l6ZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwaWMtPnVzZV9hcmdiID0gMDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpYykpIHJldHVybiAwOworICBJbWdJb1V0aWxDb3B5UGxhbmUoZGF0YSwgcGljLT53aWR0aCwgcGljLT55LCBwaWMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworICBJbWdJb1V0aWxDb3B5UGxhbmUoZGF0YSArIHlfcGxhbmVfc2l6ZSwgdXZfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBwaWMtPnUsIHBpYy0+dXZfc3RyaWRlLCB1dl93aWR0aCwgdXZfaGVpZ2h0KTsKKyAgSW1nSW9VdGlsQ29weVBsYW5lKGRhdGEgKyB5X3BsYW5lX3NpemUgKyB1dl9wbGFuZV9zaXplLCB1dl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIHBpYy0+diwgcGljLT51dl9zdHJpZGUsIHV2X3dpZHRoLCB1dl9oZWlnaHQpOworICByZXR1cm4gdXNlX2FyZ2IgPyBXZWJQUGljdHVyZVlVVkFUb0FSR0IocGljKSA6IDE7Cit9CisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKworc3RhdGljIGludCBSZWFkUGljdHVyZShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpbnQgb2sgPSAwOworICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgIGlmIChwaWMtPndpZHRoICE9IDAgJiYgcGljLT5oZWlnaHQgIT0gMCkgeworICAgIG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgICBvayA9IG9rICYmIFJlYWRZVVYoZGF0YSwgZGF0YV9zaXplLCBwaWMpOworICB9IGVsc2UgeworICAgIC8vIElmIG5vIHNpemUgc3BlY2lmaWVkLCB0cnkgdG8gZGVjb2RlIGl0IHVzaW5nIFdJQy4KKyAgICBvayA9IFJlYWRQaWN0dXJlV2l0aFdJQyhmaWxlbmFtZSwgcGljLCBrZWVwX2FscGhhLCBtZXRhZGF0YSk7CisgICAgaWYgKCFvaykgeworICAgICAgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICAgICAgb2sgPSBvayAmJiBSZWFkV2ViUChkYXRhLCBkYXRhX3NpemUsIHBpYywga2VlcF9hbHBoYSwgbWV0YWRhdGEpOworICAgIH0KKyAgfQorICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ291bGQgbm90IHByb2Nlc3MgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICB9CisgIGZyZWUoKHZvaWQqKWRhdGEpOworICByZXR1cm4gb2s7Cit9CisKKyNlbHNlICAvLyAhSEFWRV9XSU5DT0RFQ19ICisKK3N0YXRpYyBpbnQgUmVhZFBpY3R1cmUoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICBpbnQgb2sgPSAwOworCisgIG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgaWYgKCFvaykgZ290byBFbmQ7CisKKyAgaWYgKHBpYy0+d2lkdGggPT0gMCB8fCBwaWMtPmhlaWdodCA9PSAwKSB7CisgICAgV2ViUEltYWdlUmVhZGVyIHJlYWRlciA9IFdlYlBHdWVzc0ltYWdlUmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgb2sgPSByZWFkZXIoZGF0YSwgZGF0YV9zaXplLCBwaWMsIGtlZXBfYWxwaGEsIG1ldGFkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiBpbWFnZSBzaXplIGlzIHNwZWNpZmllZCwgaW5mZXIgaXQgYXMgWVVWIGZvcm1hdC4KKyAgICBvayA9IFJlYWRZVVYoZGF0YSwgZGF0YV9zaXplLCBwaWMpOworICB9CisgRW5kOgorICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ291bGQgbm90IHByb2Nlc3MgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICB9CisgIGZyZWUoKHZvaWQqKWRhdGEpOworICByZXR1cm4gb2s7Cit9CisKKyNlbmRpZiAgLy8gIUhBVkVfV0lOQ09ERUNfSAorCitzdGF0aWMgdm9pZCBBbGxvY0V4dHJhSW5mbyhXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGNvbnN0IGludCBtYl93ID0gKHBpYy0+d2lkdGggKyAxNSkgLyAxNjsKKyAgY29uc3QgaW50IG1iX2ggPSAocGljLT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgcGljLT5leHRyYV9pbmZvID0gKHVpbnQ4X3QqKW1hbGxvYyhtYl93ICogbWJfaCAqIHNpemVvZigqcGljLT5leHRyYV9pbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50Qnl0ZUNvdW50KGNvbnN0IGludCBieXRlc1s0XSwgaW50IHRvdGFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHRvdGFscykgeworICBpbnQgczsKKyAgaW50IHRvdGFsID0gMDsKKyAgZm9yIChzID0gMDsgcyA8IDQ7ICsrcykgeworICAgIGZwcmludGYoc3RkZXJyLCAifCAlN2QgIiwgYnl0ZXNbc10pOworICAgIHRvdGFsICs9IGJ5dGVzW3NdOworICAgIGlmICh0b3RhbHMpIHRvdGFsc1tzXSArPSBieXRlc1tzXTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgInwgJTdkICAoJS4xZiUlKVxuIiwgdG90YWwsIDEwMC5mICogdG90YWwgLyB0b3RhbF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRQZXJjZW50cyhjb25zdCBpbnQgY291bnRzWzRdKSB7CisgIGludCBzOworICBjb25zdCBpbnQgdG90YWwgPSBjb3VudHNbMF0gKyBjb3VudHNbMV0gKyBjb3VudHNbMl0gKyBjb3VudHNbM107CisgIGZvciAocyA9IDA7IHMgPCA0OyArK3MpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInwgICAgICAlMmQlJSIsIChpbnQpKDEwMC4gKiBjb3VudHNbc10gLyB0b3RhbCArIC41KSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJ8ICU3ZFxuIiwgdG90YWwpOworfQorCitzdGF0aWMgdm9pZCBQcmludFZhbHVlcyhjb25zdCBpbnQgdmFsdWVzWzRdKSB7CisgIGludCBzOworICBmb3IgKHMgPSAwOyBzIDwgNDsgKytzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ8ICU3ZCAiLCB2YWx1ZXNbc10pOworICB9CisgIGZwcmludGYoc3RkZXJyLCAifFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50RnVsbExvc3NsZXNzSW5mbyhjb25zdCBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGRlc2NyaXB0aW9uKSB7CisgIGZwcmludGYoc3RkZXJyLCAiTG9zc2xlc3MtJXMgY29tcHJlc3NlZCBzaXplOiAlZCBieXRlc1xuIiwKKyAgICAgICAgICBkZXNjcmlwdGlvbiwgc3RhdHMtPmxvc3NsZXNzX3NpemUpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBIZWFkZXIgc2l6ZTogJWQgYnl0ZXMsIGltYWdlIGRhdGEgc2l6ZTogJWRcbiIsCisgICAgICAgICAgc3RhdHMtPmxvc3NsZXNzX2hkcl9zaXplLCBzdGF0cy0+bG9zc2xlc3NfZGF0YV9zaXplKTsKKyAgaWYgKHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcykgeworICAgIGZwcmludGYoc3RkZXJyLCAiICAqIExvc3NsZXNzIGZlYXR1cmVzIHVzZWQ6Iik7CisgICAgaWYgKHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyAmIDEpIGZwcmludGYoc3RkZXJyLCAiIFBSRURJQ1RJT04iKTsKKyAgICBpZiAoc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzICYgMikgZnByaW50ZihzdGRlcnIsICIgQ1JPU1MtQ09MT1ItVFJBTlNGT1JNIik7CisgICAgaWYgKHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyAmIDQpIGZwcmludGYoc3RkZXJyLCAiIFNVQlRSQUNULUdSRUVOIik7CisgICAgaWYgKHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyAmIDgpIGZwcmludGYoc3RkZXJyLCAiIFBBTEVUVEUiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICIgICogUHJlY2lzaW9uIEJpdHM6IGhpc3RvZ3JhbT0lZCB0cmFuc2Zvcm09JWQgY2FjaGU9JWRcbiIsCisgICAgICAgICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzLCBzdGF0cy0+dHJhbnNmb3JtX2JpdHMsIHN0YXRzLT5jYWNoZV9iaXRzKTsKKyAgaWYgKHN0YXRzLT5wYWxldHRlX3NpemUgPiAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgICogUGFsZXR0ZSBzaXplOiAgICVkXG4iLCBzdGF0cy0+cGFsZXR0ZV9zaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQcmludEV4dHJhSW5mb0xvc3NsZXNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaG9ydF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSkgeworICBjb25zdCBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzID0gcGljLT5zdGF0czsKKyAgaWYgKHNob3J0X291dHB1dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJTdkICUyLjJmXG4iLCBzdGF0cy0+Y29kZWRfc2l6ZSwgc3RhdHMtPlBTTlJbM10pOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZTogICAgICAlc1xuIiwgZmlsZV9uYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRpbWVuc2lvbjogJWQgeCAlZFxuIiwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0OiAgICAlZCBieXRlcyAoJS4yZiBicHApXG4iLCBzdGF0cy0+Y29kZWRfc2l6ZSwKKyAgICAgICAgICAgIDguZiAqIHN0YXRzLT5jb2RlZF9zaXplIC8gcGljLT53aWR0aCAvIHBpYy0+aGVpZ2h0KTsKKyAgICBQcmludEZ1bGxMb3NzbGVzc0luZm8oc3RhdHMsICJBUkdCIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgUHJpbnRFeHRyYUluZm9Mb3NzeShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQgc2hvcnRfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnVsbF9kZXRhaWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUpIHsKKyAgY29uc3QgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpYy0+c3RhdHM7CisgIGlmIChzaG9ydF9vdXRwdXQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiU3ZCAlMi4yZlxuIiwgc3RhdHMtPmNvZGVkX3NpemUsIHN0YXRzLT5QU05SWzNdKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgbnVtX2k0ID0gc3RhdHMtPmJsb2NrX2NvdW50WzBdOworICAgIGNvbnN0IGludCBudW1faTE2ID0gc3RhdHMtPmJsb2NrX2NvdW50WzFdOworICAgIGNvbnN0IGludCBudW1fc2tpcCA9IHN0YXRzLT5ibG9ja19jb3VudFsyXTsKKyAgICBjb25zdCBpbnQgdG90YWwgPSBudW1faTQgKyBudW1faTE2OworICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZTogICAgICAlc1xuIiwgZmlsZV9uYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRpbWVuc2lvbjogJWQgeCAlZCVzXG4iLAorICAgICAgICAgICAgcGljLT53aWR0aCwgcGljLT5oZWlnaHQsCisgICAgICAgICAgICBzdGF0cy0+YWxwaGFfZGF0YV9zaXplID8gIiAod2l0aCBhbHBoYSkiIDogIiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0OiAgICAiCisgICAgICAgICAgICAiJWQgYnl0ZXMgWS1VLVYtQWxsLVBTTlIgJTIuMmYgJTIuMmYgJTIuMmYgICAlMi4yZiBkQlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgKCUuMmYgYnBwKVxuIiwKKyAgICAgICAgICAgIHN0YXRzLT5jb2RlZF9zaXplLAorICAgICAgICAgICAgc3RhdHMtPlBTTlJbMF0sIHN0YXRzLT5QU05SWzFdLCBzdGF0cy0+UFNOUlsyXSwgc3RhdHMtPlBTTlJbM10sCisgICAgICAgICAgICA4LmYgKiBzdGF0cy0+Y29kZWRfc2l6ZSAvIHBpYy0+d2lkdGggLyBwaWMtPmhlaWdodCk7CisgICAgaWYgKHRvdGFsID4gMCkgeworICAgICAgaW50IHRvdGFsc1s0XSA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgZnByaW50ZihzdGRlcnIsICJibG9jayBjb3VudDogIGludHJhNDogICAgICU2ZCAgKCUuMmYlJSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRyYTE2OiAgICAlNmQgICglLjJmJSUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgc2tpcHBlZDogICAgJTZkICAoJS4yZiUlKVxuIiwKKyAgICAgICAgICAgICAgbnVtX2k0LCAxMDAuZiAqIG51bV9pNCAvIHRvdGFsLAorICAgICAgICAgICAgICBudW1faTE2LCAxMDAuZiAqIG51bV9pMTYgLyB0b3RhbCwKKyAgICAgICAgICAgICAgbnVtX3NraXAsIDEwMC5mICogbnVtX3NraXAgLyB0b3RhbCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImJ5dGVzIHVzZWQ6ICBoZWFkZXI6ICAgICAgICAgJTZkICAoJS4xZiUlKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgbW9kZS1wYXJ0aXRpb246ICU2ZCAgKCUuMWYlJSlcbiIsCisgICAgICAgICAgICAgIHN0YXRzLT5oZWFkZXJfYnl0ZXNbMF0sCisgICAgICAgICAgICAgIDEwMC5mICogc3RhdHMtPmhlYWRlcl9ieXRlc1swXSAvIHN0YXRzLT5jb2RlZF9zaXplLAorICAgICAgICAgICAgICBzdGF0cy0+aGVhZGVyX2J5dGVzWzFdLAorICAgICAgICAgICAgICAxMDAuZiAqIHN0YXRzLT5oZWFkZXJfYnl0ZXNbMV0gLyBzdGF0cy0+Y29kZWRfc2l6ZSk7CisgICAgICBpZiAoc3RhdHMtPmFscGhhX2RhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgdHJhbnNwYXJlbmN5OiAgICU2ZCAoJS4xZiBkQilcbiIsCisgICAgICAgICAgICAgICAgc3RhdHMtPmFscGhhX2RhdGFfc2l6ZSwgc3RhdHMtPlBTTlJbNF0pOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIgUmVzaWR1YWxzIGJ5dGVzICAiCisgICAgICAgICAgICAgICAgICAgICAgInxzZWdtZW50IDF8c2VnbWVudCAyfHNlZ21lbnQgMyIKKyAgICAgICAgICAgICAgICAgICAgICAifHNlZ21lbnQgNHwgIHRvdGFsXG4iKTsKKyAgICAgIGlmIChmdWxsX2RldGFpbHMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGludHJhNC1jb2VmZnM6ICAiKTsKKyAgICAgICAgUHJpbnRCeXRlQ291bnQoc3RhdHMtPnJlc2lkdWFsX2J5dGVzWzBdLCBzdGF0cy0+Y29kZWRfc2l6ZSwgdG90YWxzKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgaW50cmExNi1jb2VmZnM6ICAiKTsKKyAgICAgICAgUHJpbnRCeXRlQ291bnQoc3RhdHMtPnJlc2lkdWFsX2J5dGVzWzFdLCBzdGF0cy0+Y29kZWRfc2l6ZSwgdG90YWxzKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGNocm9tYSBjb2VmZnM6ICAiKTsKKyAgICAgICAgUHJpbnRCeXRlQ291bnQoc3RhdHMtPnJlc2lkdWFsX2J5dGVzWzJdLCBzdGF0cy0+Y29kZWRfc2l6ZSwgdG90YWxzKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIG1hY3JvYmxvY2tzOiAgIik7CisgICAgICBQcmludFBlcmNlbnRzKHN0YXRzLT5zZWdtZW50X3NpemUpOworICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICBxdWFudGl6ZXI6ICAiKTsKKyAgICAgIFByaW50VmFsdWVzKHN0YXRzLT5zZWdtZW50X3F1YW50KTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgZmlsdGVyIGxldmVsOiAgIik7CisgICAgICBQcmludFZhbHVlcyhzdGF0cy0+c2VnbWVudF9sZXZlbCk7CisgICAgICBpZiAoZnVsbF9kZXRhaWxzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIistLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIHNlZ21lbnRzIHRvdGFsOiAgIik7CisgICAgICAgIFByaW50Qnl0ZUNvdW50KHRvdGFscywgc3RhdHMtPmNvZGVkX3NpemUsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHMtPmxvc3NsZXNzX3NpemUgPiAwKSB7CisgICAgICBQcmludEZ1bGxMb3NzbGVzc0luZm8oc3RhdHMsICJhbHBoYSIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBQcmludE1hcEluZm8oY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBpZiAocGljLT5leHRyYV9pbmZvICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgbWJfdyA9IChwaWMtPndpZHRoICsgMTUpIC8gMTY7CisgICAgY29uc3QgaW50IG1iX2ggPSAocGljLT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgICBjb25zdCBpbnQgdHlwZSA9IHBpYy0+ZXh0cmFfaW5mb190eXBlOworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCBtYl9oOyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBtYl93OyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGMgPSBwaWMtPmV4dHJhX2luZm9beCArIHkgKiBtYl93XTsKKyAgICAgICAgaWYgKHR5cGUgPT0gMSkgeyAgIC8vIGludHJhNC9pbnRyYTE2CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyIsICIrLiJbY10pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgeyAgICAvLyBzZWdtZW50cworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMiLCAiLi0qWCJbY10pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMykgeyAgICAvLyBxdWFudGl6ZXJzCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlLjJkICIsIGMpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNiB8fCB0eXBlID09IDcpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUzZCAiLCBjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjB4JS4yeCAiLCBjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IE15V3JpdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgRklMRSogY29uc3Qgb3V0ID0gKEZJTEUqKXBpYy0+Y3VzdG9tX3B0cjsKKyAgcmV0dXJuIGRhdGFfc2l6ZSA/IChmd3JpdGUoZGF0YSwgZGF0YV9zaXplLCAxLCBvdXQpID09IDEpIDogMTsKK30KKworLy8gRHVtcHMgYSBwaWN0dXJlIGFzIGEgUEdNIGZpbGUgdXNpbmcgdGhlIElNQzQgbGF5b3V0Lgorc3RhdGljIGludCBEdW1wUGljdHVyZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgY29uc3QgY2hhciogUEdNX25hbWUpIHsKKyAgaW50IHk7CisgIGNvbnN0IGludCB1dl93aWR0aCA9IChwaWN0dXJlLT53aWR0aCArIDEpIC8gMjsKKyAgY29uc3QgaW50IHV2X2hlaWdodCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxKSAvIDI7CisgIGNvbnN0IGludCBzdHJpZGUgPSAocGljdHVyZS0+d2lkdGggKyAxKSAmIH4xOworICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHBpY3R1cmUtPnk7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0gcGljdHVyZS0+dTsKKyAgY29uc3QgdWludDhfdCogc3JjX3YgPSBwaWN0dXJlLT52OworICBjb25zdCB1aW50OF90KiBzcmNfYSA9IHBpY3R1cmUtPmE7CisgIGNvbnN0IGludCBhbHBoYV9oZWlnaHQgPQorICAgICAgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3kocGljdHVyZSkgPyBwaWN0dXJlLT5oZWlnaHQgOiAwOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0ICsgdXZfaGVpZ2h0ICsgYWxwaGFfaGVpZ2h0OworICBGSUxFKiBjb25zdCBmID0gZm9wZW4oUEdNX25hbWUsICJ3YiIpOworICBpZiAoZiA9PSBOVUxMKSByZXR1cm4gMDsKKyAgZnByaW50ZihmLCAiUDVcbiVkICVkXG4yNTVcbiIsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgZm9yICh5ID0gMDsgeSA8IHBpY3R1cmUtPmhlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShzcmNfeSwgcGljdHVyZS0+d2lkdGgsIDEsIGYpICE9IDEpIHJldHVybiAwOworICAgIGlmIChwaWN0dXJlLT53aWR0aCAmIDEpIGZwdXRjKDAsIGYpOyAgLy8gcGFkCisgICAgc3JjX3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7CisgIH0KKyAgZm9yICh5ID0gMDsgeSA8IHV2X2hlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShzcmNfdSwgdXZfd2lkdGgsIDEsIGYpICE9IDEpIHJldHVybiAwOworICAgIGlmIChmd3JpdGUoc3JjX3YsIHV2X3dpZHRoLCAxLCBmKSAhPSAxKSByZXR1cm4gMDsKKyAgICBzcmNfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgc3JjX3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICB9CisgIGZvciAoeSA9IDA7IHkgPCBhbHBoYV9oZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUoc3JjX2EsIHBpY3R1cmUtPndpZHRoLCAxLCBmKSAhPSAxKSByZXR1cm4gMDsKKyAgICBpZiAocGljdHVyZS0+d2lkdGggJiAxKSBmcHV0YygwLCBmKTsgIC8vIHBhZAorICAgIHNyY19hICs9IHBpY3R1cmUtPmFfc3RyaWRlOworICB9CisgIGZjbG9zZShmKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YSB3cml0aW5nLgorCitlbnVtIHsKKyAgTUVUQURBVEFfRVhJRiA9ICgxIDw8IDApLAorICBNRVRBREFUQV9JQ0MgID0gKDEgPDwgMSksCisgIE1FVEFEQVRBX1hNUCAgPSAoMSA8PCAyKSwKKyAgTUVUQURBVEFfQUxMICA9IE1FVEFEQVRBX0VYSUYgfCBNRVRBREFUQV9JQ0MgfCBNRVRBREFUQV9YTVAKK307CisKK3N0YXRpYyBjb25zdCBpbnQga0NodW5rSGVhZGVyU2l6ZSA9IDg7CitzdGF0aWMgY29uc3QgaW50IGtUYWdTaXplID0gNDsKKworc3RhdGljIHZvaWQgUHJpbnRNZXRhZGF0YUluZm8oY29uc3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGFkYXRhX3dyaXR0ZW4pIHsKKyAgaWYgKG1ldGFkYXRhID09IE5VTEwgfHwgbWV0YWRhdGFfd3JpdHRlbiA9PSAwKSByZXR1cm47CisKKyAgZnByaW50ZihzdGRlcnIsICJNZXRhZGF0YTpcbiIpOworICBpZiAobWV0YWRhdGFfd3JpdHRlbiAmIE1FVEFEQVRBX0lDQykgeworICAgIGZwcmludGYoc3RkZXJyLCAiICAqIElDQyBwcm9maWxlOiAgJTZkIGJ5dGVzXG4iLCAoaW50KW1ldGFkYXRhLT5pY2NwLnNpemUpOworICB9CisgIGlmIChtZXRhZGF0YV93cml0dGVuICYgTUVUQURBVEFfRVhJRikgeworICAgIGZwcmludGYoc3RkZXJyLCAiICAqIEVYSUYgZGF0YTogICAgJTZkIGJ5dGVzXG4iLCAoaW50KW1ldGFkYXRhLT5leGlmLnNpemUpOworICB9CisgIGlmIChtZXRhZGF0YV93cml0dGVuICYgTUVUQURBVEFfWE1QKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgICogWE1QIGRhdGE6ICAgICAlNmQgYnl0ZXNcbiIsIChpbnQpbWV0YWRhdGEtPnhtcC5zaXplKTsKKyAgfQorfQorCisvLyBPdXRwdXRzLCBpbiBsaXR0bGUgZW5kaWFuLCAnbnVtJyBieXRlcyBmcm9tICd2YWwnIHRvICdvdXQnLgorc3RhdGljIGludCBXcml0ZUxFKEZJTEUqIGNvbnN0IG91dCwgdWludDMyX3QgdmFsLCBpbnQgbnVtKSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgYnVmW2ldID0gKHVpbnQ4X3QpKHZhbCAmIDB4ZmYpOworICAgIHZhbCA+Pj0gODsKKyAgfQorICByZXR1cm4gKGZ3cml0ZShidWYsIG51bSwgMSwgb3V0KSA9PSAxKTsKK30KKworc3RhdGljIGludCBXcml0ZUxFMjQoRklMRSogY29uc3Qgb3V0LCB1aW50MzJfdCB2YWwpIHsKKyAgcmV0dXJuIFdyaXRlTEUob3V0LCB2YWwsIDMpOworfQorCitzdGF0aWMgaW50IFdyaXRlTEUzMihGSUxFKiBjb25zdCBvdXQsIHVpbnQzMl90IHZhbCkgeworICByZXR1cm4gV3JpdGVMRShvdXQsIHZhbCwgNCk7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVNZXRhZGF0YUNodW5rKEZJTEUqIGNvbnN0IG91dCwgY29uc3QgY2hhciBmb3VyY2NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpIHsKKyAgY29uc3QgdWludDhfdCB6ZXJvID0gMDsKKyAgY29uc3Qgc2l6ZV90IG5lZWRfcGFkZGluZyA9IHBheWxvYWQtPnNpemUgJiAxOworICBpbnQgb2sgPSAoZndyaXRlKGZvdXJjYywga1RhZ1NpemUsIDEsIG91dCkgPT0gMSk7CisgIG9rID0gb2sgJiYgV3JpdGVMRTMyKG91dCwgKHVpbnQzMl90KXBheWxvYWQtPnNpemUpOworICBvayA9IG9rICYmIChmd3JpdGUocGF5bG9hZC0+Ynl0ZXMsIHBheWxvYWQtPnNpemUsIDEsIG91dCkgPT0gMSk7CisgIHJldHVybiBvayAmJiAoZndyaXRlKCZ6ZXJvLCBuZWVkX3BhZGRpbmcsIG5lZWRfcGFkZGluZywgb3V0KSA9PSBuZWVkX3BhZGRpbmcpOworfQorCisvLyBTZXRzICdmbGFnJyBpbiAndnA4eF9mbGFncycgYW5kIHVwZGF0ZXMgJ21ldGFkYXRhX3NpemUnIHdpdGggdGhlIHNpemUgb2YgdGhlCisvLyBjaHVuayBpZiB0aGVyZSBpcyBtZXRhZGF0YSBhbmQgJ2tlZXAnIGlzIHRydWUuCitzdGF0aWMgaW50IFVwZGF0ZUZsYWdzQW5kU2l6ZShjb25zdCBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcCwgaW50IGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdnA4eF9mbGFncywgdWludDY0X3QqIG1ldGFkYXRhX3NpemUpIHsKKyAgaWYgKGtlZXAgJiYgcGF5bG9hZC0+Ynl0ZXMgIT0gTlVMTCAmJiBwYXlsb2FkLT5zaXplID4gMCkgeworICAgICp2cDh4X2ZsYWdzIHw9IGZsYWc7CisgICAgKm1ldGFkYXRhX3NpemUgKz0ga0NodW5rSGVhZGVyU2l6ZSArIHBheWxvYWQtPnNpemUgKyAocGF5bG9hZC0+c2l6ZSAmIDEpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLyBXcml0ZXMgYSBXZWJQIGZpbGUgdXNpbmcgdGhlIGltYWdlIGNvbnRhaW5lZCBpbiAnbWVtb3J5X3dyaXRlcicgYW5kIHRoZQorLy8gbWV0YWRhdGEgZnJvbSAnbWV0YWRhdGEnLiBNZXRhZGF0YSBpcyBjb250cm9sbGVkIGJ5ICdrZWVwX21ldGFkYXRhJyBhbmQgdGhlCisvLyBhdmFpbGFiaWxpdHkgaW4gJ21ldGFkYXRhJy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisvLyBGb3IgZGV0YWlscyBzZWUgZG9jL3dlYnAtY29udGFpbmVyLXNwZWMudHh0I2V4dGVuZGVkLWZpbGUtZm9ybWF0Lgorc3RhdGljIGludCBXcml0ZVdlYlBXaXRoTWV0YWRhdGEoRklMRSogY29uc3Qgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQTWVtb3J5V3JpdGVyKiBjb25zdCBtZW1vcnlfd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG1ldGFkYXRhX3dyaXR0ZW4pIHsKKyAgY29uc3QgY2hhciBrVlA4WEhlYWRlcltdID0gIlZQOFhceDBhXHgwMFx4MDBceDAwIjsKKyAgY29uc3QgaW50IGtBbHBoYUZsYWcgPSAweDEwOworICBjb25zdCBpbnQga0VYSUZGbGFnICA9IDB4MDg7CisgIGNvbnN0IGludCBrSUNDUEZsYWcgID0gMHgyMDsKKyAgY29uc3QgaW50IGtYTVBGbGFnICAgPSAweDA0OworICBjb25zdCBzaXplX3Qga1JpZmZIZWFkZXJTaXplID0gMTI7CisgIGNvbnN0IHNpemVfdCBrTWF4Q2h1bmtQYXlsb2FkID0gfjAgLSBrQ2h1bmtIZWFkZXJTaXplIC0gMTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5TaXplID0ga1JpZmZIZWFkZXJTaXplICsga0NodW5rSGVhZGVyU2l6ZTsKKyAgdWludDMyX3QgZmxhZ3MgPSAwOworICB1aW50NjRfdCBtZXRhZGF0YV9zaXplID0gMDsKKyAgY29uc3QgaW50IHdyaXRlX2V4aWYgPSBVcGRhdGVGbGFnc0FuZFNpemUoJm1ldGFkYXRhLT5leGlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShrZWVwX21ldGFkYXRhICYgTUVUQURBVEFfRVhJRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFWElGRmxhZywgJmZsYWdzLCAmbWV0YWRhdGFfc2l6ZSk7CisgIGNvbnN0IGludCB3cml0ZV9pY2NwID0gVXBkYXRlRmxhZ3NBbmRTaXplKCZtZXRhZGF0YS0+aWNjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoa2VlcF9tZXRhZGF0YSAmIE1FVEFEQVRBX0lDQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJQ0NQRmxhZywgJmZsYWdzLCAmbWV0YWRhdGFfc2l6ZSk7CisgIGNvbnN0IGludCB3cml0ZV94bXAgID0gVXBkYXRlRmxhZ3NBbmRTaXplKCZtZXRhZGF0YS0+eG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShrZWVwX21ldGFkYXRhICYgTUVUQURBVEFfWE1QKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1hNUEZsYWcsICZmbGFncywgJm1ldGFkYXRhX3NpemUpOworICB1aW50OF90KiB3ZWJwID0gbWVtb3J5X3dyaXRlci0+bWVtOworICBzaXplX3Qgd2VicF9zaXplID0gbWVtb3J5X3dyaXRlci0+c2l6ZTsKKworICAqbWV0YWRhdGFfd3JpdHRlbiA9IDA7CisKKyAgaWYgKHdlYnBfc2l6ZSA8IGtNaW5TaXplKSByZXR1cm4gMDsKKyAgaWYgKHdlYnBfc2l6ZSAtIGtDaHVua0hlYWRlclNpemUgKyBtZXRhZGF0YV9zaXplID4ga01heENodW5rUGF5bG9hZCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIEFkZGl0aW9uIG9mIG1ldGFkYXRhIHdvdWxkIGV4Y2VlZCAiCisgICAgICAgICAgICAgICAgICAgICJjb250YWluZXIgc2l6ZSBsaW1pdC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1ldGFkYXRhX3NpemUgPiAwKSB7CisgICAgY29uc3QgaW50IGtWUDhYQ2h1bmtTaXplID0gMTg7CisgICAgY29uc3QgaW50IGhhc192cDh4ID0gIW1lbWNtcCh3ZWJwICsga1JpZmZIZWFkZXJTaXplLCAiVlA4WCIsIGtUYWdTaXplKTsKKyAgICBjb25zdCB1aW50MzJfdCByaWZmX3NpemUgPSAodWludDMyX3QpKHdlYnBfc2l6ZSAtIGtDaHVua0hlYWRlclNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhc192cDh4ID8gMCA6IGtWUDhYQ2h1bmtTaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9zaXplKTsKKyAgICAvLyBSSUZGCisgICAgaW50IG9rID0gKGZ3cml0ZSh3ZWJwLCBrVGFnU2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgICAvLyBSSUZGIHNpemUgKGZpbGUgaGVhZGVyIHNpemUgaXMgbm90IHJlY29yZGVkKQorICAgIG9rID0gb2sgJiYgV3JpdGVMRTMyKG91dCwgcmlmZl9zaXplKTsKKyAgICB3ZWJwICs9IGtDaHVua0hlYWRlclNpemU7CisgICAgd2VicF9zaXplIC09IGtDaHVua0hlYWRlclNpemU7CisgICAgLy8gV0VCUAorICAgIG9rID0gb2sgJiYgKGZ3cml0ZSh3ZWJwLCBrVGFnU2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgICB3ZWJwICs9IGtUYWdTaXplOworICAgIHdlYnBfc2l6ZSAtPSBrVGFnU2l6ZTsKKyAgICBpZiAoaGFzX3ZwOHgpIHsgIC8vIHVwZGF0ZSB0aGUgZXhpc3RpbmcgVlA4WCBmbGFncworICAgICAgd2VicFtrQ2h1bmtIZWFkZXJTaXplXSB8PSAodWludDhfdCkoZmxhZ3MgJiAweGZmKTsKKyAgICAgIG9rID0gb2sgJiYgKGZ3cml0ZSh3ZWJwLCBrVlA4WENodW5rU2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgICAgIHdlYnAgKz0ga1ZQOFhDaHVua1NpemU7CisgICAgICB3ZWJwX3NpemUgLT0ga1ZQOFhDaHVua1NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBpc19sb3NzbGVzcyA9ICFtZW1jbXAod2VicCwgIlZQOEwiLCBrVGFnU2l6ZSk7CisgICAgICBpZiAoaXNfbG9zc2xlc3MpIHsKKyAgICAgICAgLy8gUHJlc2VuY2Ugb2YgYWxwaGEgaXMgc3RvcmVkIGluIHRoZSAzN3RoIGJpdCAoMjl0aCBhZnRlciB0aGUKKyAgICAgICAgLy8gc2lnbmF0dXJlKSBvZiBWUDhMIGRhdGEuCisgICAgICAgIGlmICh3ZWJwW2tDaHVua0hlYWRlclNpemUgKyA0XSAmICgxIDw8IDQpKSBmbGFncyB8PSBrQWxwaGFGbGFnOworICAgICAgfQorICAgICAgb2sgPSBvayAmJiAoZndyaXRlKGtWUDhYSGVhZGVyLCBrQ2h1bmtIZWFkZXJTaXplLCAxLCBvdXQpID09IDEpOworICAgICAgb2sgPSBvayAmJiBXcml0ZUxFMzIob3V0LCBmbGFncyk7CisgICAgICBvayA9IG9rICYmIFdyaXRlTEUyNChvdXQsIHBpY3R1cmUtPndpZHRoIC0gMSk7CisgICAgICBvayA9IG9rICYmIFdyaXRlTEUyNChvdXQsIHBpY3R1cmUtPmhlaWdodCAtIDEpOworICAgIH0KKyAgICBpZiAod3JpdGVfaWNjcCkgeworICAgICAgb2sgPSBvayAmJiBXcml0ZU1ldGFkYXRhQ2h1bmsob3V0LCAiSUNDUCIsICZtZXRhZGF0YS0+aWNjcCk7CisgICAgICAqbWV0YWRhdGFfd3JpdHRlbiB8PSBNRVRBREFUQV9JQ0M7CisgICAgfQorICAgIC8vIEltYWdlCisgICAgb2sgPSBvayAmJiAoZndyaXRlKHdlYnAsIHdlYnBfc2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgICBpZiAod3JpdGVfZXhpZikgeworICAgICAgb2sgPSBvayAmJiBXcml0ZU1ldGFkYXRhQ2h1bmsob3V0LCAiRVhJRiIsICZtZXRhZGF0YS0+ZXhpZik7CisgICAgICAqbWV0YWRhdGFfd3JpdHRlbiB8PSBNRVRBREFUQV9FWElGOworICAgIH0KKyAgICBpZiAod3JpdGVfeG1wKSB7CisgICAgICBvayA9IG9rICYmIFdyaXRlTWV0YWRhdGFDaHVuayhvdXQsICJYTVAgIiwgJm1ldGFkYXRhLT54bXApOworICAgICAgKm1ldGFkYXRhX3dyaXR0ZW4gfD0gTUVUQURBVEFfWE1QOworICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KKworICAvLyBObyBtZXRhZGF0YSwganVzdCB3cml0ZSB0aGUgb3JpZ2luYWwgaW1hZ2UgZmlsZS4KKyAgcmV0dXJuIChmd3JpdGUod2VicCwgd2VicF9zaXplLCAxLCBvdXQpID09IDEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFByb2dyZXNzUmVwb3J0KGludCBwZXJjZW50LCBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBmcHJpbnRmKHN0ZGVyciwgIlslc106ICUzZCAlJSAgICAgIFxyIiwKKyAgICAgICAgICAoY2hhciopcGljdHVyZS0+dXNlcl9kYXRhLCBwZXJjZW50KTsKKyAgcmV0dXJuIDE7ICAvLyBhbGwgb2sKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSGVscFNob3J0KHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTpcblxuIik7CisgIHByaW50ZigiICAgY3dlYnAgW29wdGlvbnNdIC1xIHF1YWxpdHkgaW5wdXQucG5nIC1vIG91dHB1dC53ZWJwXG5cbiIpOworICBwcmludGYoIndoZXJlIHF1YWxpdHkgaXMgYmV0d2VlbiAwIChwb29yKSB0byAxMDAgKHZlcnkgZ29vZCkuXG4iKTsKKyAgcHJpbnRmKCJUeXBpY2FsIHZhbHVlIGlzIGFyb3VuZCA4MC5cblxuIik7CisgIHByaW50ZigiVHJ5IC1sb25naGVscCBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIGFkdmFuY2VkIG9wdGlvbnMuXG4iKTsKK30KKworc3RhdGljIHZvaWQgSGVscExvbmcodm9pZCkgeworICBwcmludGYoIlVzYWdlOlxuIik7CisgIHByaW50ZigiIGN3ZWJwIFstcHJlc2V0IDwuLi4+XSBbb3B0aW9uc10gaW5fZmlsZSBbLW8gb3V0X2ZpbGVdXG5cbiIpOworICBwcmludGYoIklmIGlucHV0IHNpemUgKC1zKSBmb3IgYW4gaW1hZ2UgaXMgbm90IHNwZWNpZmllZCwgaXQgaXNcbiIKKyAgICAgICAgICJhc3N1bWVkIHRvIGJlIGEgUE5HLCBKUEVHLCBUSUZGIG9yIFdlYlAgZmlsZS5cbiIpOworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICBwcmludGYoIldpbmRvd3MgYnVpbGRzIGNhbiB0YWtlIGFzIGlucHV0IGFueSBvZiB0aGUgZmlsZXMgaGFuZGxlZCBieSBXSUMuXG4iKTsKKyNlbmRpZgorICBwcmludGYoIlxuT3B0aW9uczpcbiIpOworICBwcmludGYoIiAgLWggLyAtaGVscCAuLi4uLi4uLi4uLi4uIHNob3J0IGhlbHBcbiIpOworICBwcmludGYoIiAgLUggLyAtbG9uZ2hlbHAgLi4uLi4uLi4uIGxvbmcgaGVscFxuIik7CisgIHByaW50ZigiICAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uLi4gcXVhbGl0eSBmYWN0b3IgKDA6c21hbGwuLjEwMDpiaWcpLCAiCisgICAgICAgICAiZGVmYXVsdD03NVxuIik7CisgIHByaW50ZigiICAtYWxwaGFfcSA8aW50PiAuLi4uLi4uLi4gdHJhbnNwYXJlbmN5LWNvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMCksIgorICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0xMDBcbiIpOworICBwcmludGYoIiAgLXByZXNldCA8c3RyaW5nPiAuLi4uLi4uIHByZXNldCBzZXR0aW5nLCBvbmUgb2Y6XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2luZywgaWNvbiwgdGV4dFxuIik7CisgIHByaW50ZigiICAgICAtcHJlc2V0IG11c3QgY29tZSBmaXJzdCwgYXMgaXQgb3ZlcndyaXRlcyBvdGhlciBwYXJhbWV0ZXJzXG4iKTsKKyAgcHJpbnRmKCIgIC16IDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBhY3RpdmF0ZXMgbG9zc2xlc3MgcHJlc2V0IHdpdGggZ2l2ZW5cbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBpbiBbMDpmYXN0LCAuLi4sIDk6c2xvd2VzdF1cbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiICAtbSA8aW50PiAuLi4uLi4uLi4uLi4uLi4gY29tcHJlc3Npb24gbWV0aG9kICgwPWZhc3QsIDY9c2xvd2VzdCksICIKKyAgICAgICAgICJkZWZhdWx0PTRcbiIpOworICBwcmludGYoIiAgLXNlZ21lbnRzIDxpbnQ+IC4uLi4uLi4uIG51bWJlciBvZiBzZWdtZW50cyB0byB1c2UgKDEuLjQpLCAiCisgICAgICAgICAiZGVmYXVsdD00XG4iKTsKKyAgcHJpbnRmKCIgIC1zaXplIDxpbnQ+IC4uLi4uLi4uLi4uLiB0YXJnZXQgc2l6ZSAoaW4gYnl0ZXMpXG4iKTsKKyAgcHJpbnRmKCIgIC1wc25yIDxmbG9hdD4gLi4uLi4uLi4uLiB0YXJnZXQgUFNOUiAoaW4gZEIuIHR5cGljYWxseTogNDIpXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIiAgLXMgPGludD4gPGludD4gLi4uLi4uLi4uIGlucHV0IHNpemUgKHdpZHRoIHggaGVpZ2h0KSBmb3IgWVVWXG4iKTsKKyAgcHJpbnRmKCIgIC1zbnMgPGludD4gLi4uLi4uLi4uLi4uLiBzcGF0aWFsIG5vaXNlIHNoYXBpbmcgKDA6b2ZmLCAxMDA6bWF4KSwgIgorICAgICAgICAgImRlZmF1bHQ9NTBcbiIpOworICBwcmludGYoIiAgLWYgPGludD4gLi4uLi4uLi4uLi4uLi4uIGZpbHRlciBzdHJlbmd0aCAoMD1vZmYuLjEwMCksICIKKyAgICAgICAgICJkZWZhdWx0PTYwXG4iKTsKKyAgcHJpbnRmKCIgIC1zaGFycG5lc3MgPGludD4gLi4uLi4uLiAiCisgICAgICAgICAiZmlsdGVyIHNoYXJwbmVzcyAoMDptb3N0IC4uIDc6bGVhc3Qgc2hhcnApLCBkZWZhdWx0PTBcbiIpOworICBwcmludGYoIiAgLXN0cm9uZyAuLi4uLi4uLi4uLi4uLi4uIHVzZSBzdHJvbmcgZmlsdGVyIGluc3RlYWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBzaW1wbGUgKGRlZmF1bHQpXG4iKTsKKyAgcHJpbnRmKCIgIC1ub3N0cm9uZyAuLi4uLi4uLi4uLi4uLiB1c2Ugc2ltcGxlIGZpbHRlciBpbnN0ZWFkIG9mIHN0cm9uZ1xuIik7CisgIHByaW50ZigiICAtc2hhcnBfeXV2IC4uLi4uLi4uLi4uLi4gdXNlIHNoYXJwZXIgKGFuZCBzbG93ZXIpIFJHQi0+WVVWICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVyc2lvblxuIik7CisgIHByaW50ZigiICAtcGFydGl0aW9uX2xpbWl0IDxpbnQ+IC4gbGltaXQgcXVhbGl0eSB0byBmaXQgdGhlIDUxMmsgbGltaXQgb25cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyAgICAgICAgICJ0aGUgZmlyc3QgcGFydGl0aW9uICgwPW5vIGRlZ3JhZGF0aW9uIC4uLiAxMDA9ZnVsbClcbiIpOworICBwcmludGYoIiAgLXBhc3MgPGludD4gLi4uLi4uLi4uLi4uIGFuYWx5c2lzIHBhc3MgbnVtYmVyICgxLi4xMClcbiIpOworICBwcmludGYoIiAgLWNyb3AgPHg+IDx5PiA8dz4gPGg+IC4uIGNyb3AgcGljdHVyZSB3aXRoIHRoZSBnaXZlbiByZWN0YW5nbGVcbiIpOworICBwcmludGYoIiAgLXJlc2l6ZSA8dz4gPGg+IC4uLi4uLi4uIHJlc2l6ZSBwaWN0dXJlIChhZnRlciBhbnkgY3JvcHBpbmcpXG4iKTsKKyAgcHJpbnRmKCIgIC1tdCAuLi4uLi4uLi4uLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nIGlmIGF2YWlsYWJsZVxuIik7CisgIHByaW50ZigiICAtbG93X21lbW9yeSAuLi4uLi4uLi4uLi4gcmVkdWNlIG1lbW9yeSB1c2FnZSAoc2xvd2VyIGVuY29kaW5nKVxuIik7CisgIHByaW50ZigiICAtbWFwIDxpbnQ+IC4uLi4uLi4uLi4uLi4gcHJpbnQgbWFwIG9mIGV4dHJhIGluZm9cbiIpOworICBwcmludGYoIiAgLXByaW50X3BzbnIgLi4uLi4uLi4uLi4uIHByaW50cyBhdmVyYWdlZCBQU05SIGRpc3RvcnRpb25cbiIpOworICBwcmludGYoIiAgLXByaW50X3NzaW0gLi4uLi4uLi4uLi4uIHByaW50cyBhdmVyYWdlZCBTU0lNIGRpc3RvcnRpb25cbiIpOworICBwcmludGYoIiAgLXByaW50X2xzaW0gLi4uLi4uLi4uLi4uIHByaW50cyBsb2NhbC1zaW1pbGFyaXR5IGRpc3RvcnRpb25cbiIpOworICBwcmludGYoIiAgLWQgPGZpbGUucGdtPiAuLi4uLi4uLi4uIGR1bXAgdGhlIGNvbXByZXNzZWQgb3V0cHV0IChQR00gZmlsZSlcbiIpOworICBwcmludGYoIiAgLWFscGhhX21ldGhvZCA8aW50PiAuLi4uIHRyYW5zcGFyZW5jeS1jb21wcmVzc2lvbiBtZXRob2QgKDAuLjEpLCAiCisgICAgICAgICAiZGVmYXVsdD0xXG4iKTsKKyAgcHJpbnRmKCIgIC1hbHBoYV9maWx0ZXIgPHN0cmluZz4gLiBwcmVkaWN0aXZlIGZpbHRlcmluZyBmb3IgYWxwaGEgcGxhbmUsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Y6IG5vbmUsIGZhc3QgKGRlZmF1bHQpIG9yIGJlc3RcbiIpOworICBwcmludGYoIiAgLWV4YWN0IC4uLi4uLi4uLi4uLi4uLi4uIHByZXNlcnZlIFJHQiB2YWx1ZXMgaW4gdHJhbnNwYXJlbnQgYXJlYSwgIgorICAgICAgICAgImRlZmF1bHQ9b2ZmXG4iKTsKKyAgcHJpbnRmKCIgIC1ibGVuZF9hbHBoYSA8aGV4PiAuLi4uLiBibGVuZCBjb2xvcnMgYWdhaW5zdCBiYWNrZ3JvdW5kIGNvbG9yXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIFJHQiB2YWx1ZXMgd3JpdHRlbiBpblxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGFkZWNpbWFsLCBlLmcuIDB4YzBlMGQwIGZvciByZWQ9MHhjMFxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuPTB4ZTAgYW5kIGJsdWU9MHhkMFxuIik7CisgIHByaW50ZigiICAtbm9hbHBoYSAuLi4uLi4uLi4uLi4uLi4gZGlzY2FyZCBhbnkgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1sb3NzbGVzcyAuLi4uLi4uLi4uLi4uLiBlbmNvZGUgaW1hZ2UgbG9zc2xlc3NseSwgZGVmYXVsdD1vZmZcbiIpOworICBwcmludGYoIiAgLW5lYXJfbG9zc2xlc3MgPGludD4gLi4uIHVzZSBuZWFyLWxvc3NsZXNzIGltYWdlXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc2luZyAoMC4uMTAwPW9mZiksICIKKyAgICAgICAgICJkZWZhdWx0PTEwMFxuIik7CisgIHByaW50ZigiICAtaGludCA8c3RyaW5nPiAuLi4uLi4uLi4gc3BlY2lmeSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MgaGludCxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZjogcGhvdG8sIHBpY3R1cmUgb3IgZ3JhcGhcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCIgIC1tZXRhZGF0YSA8c3RyaW5nPiAuLi4uLiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0b1xuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisgIHByaW50ZigiY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmIHByZXNlbnQuXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAiVmFsaWQgdmFsdWVzOiBhbGwsIG5vbmUgKGRlZmF1bHQpLCBleGlmLCBpY2MsIHhtcFxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIiAgLXNob3J0IC4uLi4uLi4uLi4uLi4uLi4uIGNvbmRlbnNlIHByaW50ZWQgbWVzc2FnZVxuIik7CisgIHByaW50ZigiICAtcXVpZXQgLi4uLi4uLi4uLi4uLi4uLi4gZG9uJ3QgcHJpbnQgYW55dGhpbmdcbiIpOworICBwcmludGYoIiAgLXZlcnNpb24gLi4uLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKKyNpZm5kZWYgV0VCUF9ETEwKKyAgcHJpbnRmKCIgIC1ub2FzbSAuLi4uLi4uLi4uLi4uLi4uLiBkaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zXG4iKTsKKyNlbmRpZgorICBwcmludGYoIiAgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2UsIGUuZy4gcHJpbnQgZW5jb2RpbmcvZGVjb2RpbmcgIgorICAgICAgICAgInRpbWVzXG4iKTsKKyAgcHJpbnRmKCIgIC1wcm9ncmVzcyAuLi4uLi4uLi4uLi4uLiByZXBvcnQgZW5jb2RpbmcgcHJvZ3Jlc3NcbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiRXhwZXJpbWVudGFsIE9wdGlvbnM6XG4iKTsKKyAgcHJpbnRmKCIgIC1qcGVnX2xpa2UgLi4uLi4uLi4uLi4uLiByb3VnaGx5IG1hdGNoIGV4cGVjdGVkIEpQRUcgc2l6ZVxuIik7CisgIHByaW50ZigiICAtYWYgLi4uLi4uLi4uLi4uLi4uLi4uLi4gYXV0by1hZGp1c3QgZmlsdGVyIHN0cmVuZ3RoXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmUgPGludD4gLi4uLi4uLi4uLi4uLiBwcmUtcHJvY2Vzc2luZyBmaWx0ZXJcbiIpOworICBwcmludGYoIlxuIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcnJvciBtZXNzYWdlcworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Vycm9yTWVzc2FnZXNbVlA4X0VOQ19FUlJPUl9MQVNUXSA9IHsKKyAgIk9LIiwKKyAgIk9VVF9PRl9NRU1PUlk6IE91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBvYmplY3RzIiwKKyAgIkJJVFNUUkVBTV9PVVRfT0ZfTUVNT1JZOiBPdXQgb2YgbWVtb3J5IHJlLWFsbG9jYXRpbmcgYnl0ZSBidWZmZXIiLAorICAiTlVMTF9QQVJBTUVURVI6IE5VTEwgcGFyYW1ldGVyIHBhc3NlZCB0byBmdW5jdGlvbiIsCisgICJJTlZBTElEX0NPTkZJR1VSQVRJT046IGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCIsCisgICJCQURfRElNRU5TSU9OOiBCYWQgcGljdHVyZSBkaW1lbnNpb24uIE1heGltdW0gd2lkdGggYW5kIGhlaWdodCAiCisgICJhbGxvd2VkIGlzIDE2MzgzIHBpeGVscy4iLAorICAiUEFSVElUSU9OMF9PVkVSRkxPVzogUGFydGl0aW9uICMwIGlzIHRvbyBiaWcgdG8gZml0IDUxMmsuXG4iCisgICJUbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhpcyBwYXJ0aXRpb24sIHRyeSB1c2luZyBsZXNzIHNlZ21lbnRzICIKKyAgIndpdGggdGhlIC1zZWdtZW50cyBvcHRpb24sIGFuZCBldmVudHVhbGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mICIKKyAgImhlYWRlciBiaXRzIHVzaW5nIC1wYXJ0aXRpb25fbGltaXQuIE1vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlICIKKyAgImluIHRoZSBtYW51YWwgKGBtYW4gY3dlYnBgKSIsCisgICJQQVJUSVRJT05fT1ZFUkZMT1c6IFBhcnRpdGlvbiBpcyB0b28gYmlnIHRvIGZpdCAxNk0iLAorICAiQkFEX1dSSVRFOiBQaWN0dXJlIHdyaXRlciByZXR1cm5lZCBhbiBJL08gZXJyb3IiLAorICAiRklMRV9UT09fQklHOiBGaWxlIHdvdWxkIGJlIHRvbyBiaWcgdG8gZml0IGluIDRHIiwKKyAgIlVTRVJfQUJPUlQ6IGVuY29kaW5nIGFib3J0IHJlcXVlc3RlZCBieSB1c2VyIgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7CisgIGNvbnN0IGNoYXIgKmluX2ZpbGUgPSBOVUxMLCAqb3V0X2ZpbGUgPSBOVUxMLCAqZHVtcF9maWxlID0gTlVMTDsKKyAgRklMRSAqb3V0ID0gTlVMTDsKKyAgaW50IGM7CisgIGludCBzaG9ydF9vdXRwdXQgPSAwOworICBpbnQgcXVpZXQgPSAwOworICBpbnQga2VlcF9hbHBoYSA9IDE7CisgIGludCBibGVuZF9hbHBoYSA9IDA7CisgIHVpbnQzMl90IGJhY2tncm91bmRfY29sb3IgPSAweGZmZmZmZnU7CisgIGludCBjcm9wID0gMCwgY3JvcF94ID0gMCwgY3JvcF95ID0gMCwgY3JvcF93ID0gMCwgY3JvcF9oID0gMDsKKyAgaW50IHJlc2l6ZV93ID0gMCwgcmVzaXplX2ggPSAwOworICBpbnQgbG9zc2xlc3NfcHJlc2V0ID0gNjsKKyAgaW50IHVzZV9sb3NzbGVzc19wcmVzZXQgPSAtMTsgIC8vIC0xPXVuc2V0LCAwPWRvbid0IHVzZSwgMT11c2UgaXQKKyAgaW50IHNob3dfcHJvZ3Jlc3MgPSAwOworICBpbnQga2VlcF9tZXRhZGF0YSA9IDA7CisgIGludCBtZXRhZGF0YV93cml0dGVuID0gMDsKKyAgV2ViUFBpY3R1cmUgcGljdHVyZTsKKyAgaW50IHByaW50X2Rpc3RvcnRpb24gPSAtMTsgICAgICAgIC8vIC0xPW9mZiwgMD1QU05SLCAxPVNTSU0sIDI9TFNJTQorICBXZWJQUGljdHVyZSBvcmlnaW5hbF9waWN0dXJlOyAgICAvLyB3aGVuIFBTTlIgb3IgU1NJTSBpcyByZXF1ZXN0ZWQKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIFdlYlBBdXhTdGF0cyBzdGF0czsKKyAgV2ViUE1lbW9yeVdyaXRlciBtZW1vcnlfd3JpdGVyOworICBNZXRhZGF0YSBtZXRhZGF0YTsKKyAgU3RvcHdhdGNoIHN0b3Bfd2F0Y2g7CisKKyAgTWV0YWRhdGFJbml0KCZtZXRhZGF0YSk7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZtZW1vcnlfd3JpdGVyKTsKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnBpY3R1cmUpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZvcmlnaW5hbF9waWN0dXJlKSB8fAorICAgICAgIVdlYlBDb25maWdJbml0KCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChhcmdjID09IDEpIHsKKyAgICBIZWxwU2hvcnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHBTaG9ydCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItSCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1sb25naGVscCIpKSB7CisgICAgICBIZWxwTG9uZygpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgb3V0X2ZpbGUgPSBhcmd2WysrY107CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgZHVtcF9maWxlID0gYXJndlsrK2NdOworICAgICAgY29uZmlnLnNob3dfY29tcHJlc3NlZCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJpbnRfcHNuciIpKSB7CisgICAgICBjb25maWcuc2hvd19jb21wcmVzc2VkID0gMTsKKyAgICAgIHByaW50X2Rpc3RvcnRpb24gPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByaW50X3NzaW0iKSkgeworICAgICAgY29uZmlnLnNob3dfY29tcHJlc3NlZCA9IDE7CisgICAgICBwcmludF9kaXN0b3J0aW9uID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmludF9sc2ltIikpIHsKKyAgICAgIGNvbmZpZy5zaG93X2NvbXByZXNzZWQgPSAxOworICAgICAgcHJpbnRfZGlzdG9ydGlvbiA9IDI7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2hvcnQiKSkgeworICAgICAgKytzaG9ydF9vdXRwdXQ7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcyIpICYmIGMgPCBhcmdjIC0gMikgeworICAgICAgcGljdHVyZS53aWR0aCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBwaWN0dXJlLmhlaWdodCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBpZiAocGljdHVyZS53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBwaWN0dXJlLndpZHRoIDwgMCB8fAorICAgICAgICAgIHBpY3R1cmUuaGVpZ2h0ID4gV0VCUF9NQVhfRElNRU5TSU9OIHx8ICBwaWN0dXJlLmhlaWdodCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIlNwZWNpZmllZCBkaW1lbnNpb24gKCVkIHggJWQpIGlzIG91dCBvZiByYW5nZS5cbiIsCisgICAgICAgICAgICAgICAgcGljdHVyZS53aWR0aCwgcGljdHVyZS5oZWlnaHQpOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW0iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5tZXRob2QgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgdXNlX2xvc3NsZXNzX3ByZXNldCA9IDA7ICAgLy8gZGlzYWJsZSAteiBvcHRpb24KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcucXVhbGl0eSA9IEV4VXRpbEdldEZsb2F0KGFyZ3ZbKytjXSwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIHVzZV9sb3NzbGVzc19wcmVzZXQgPSAwOyAgIC8vIGRpc2FibGUgLXogb3B0aW9uCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIteiIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgbG9zc2xlc3NfcHJlc2V0ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGlmICh1c2VfbG9zc2xlc3NfcHJlc2V0ICE9IDApIHVzZV9sb3NzbGVzc19wcmVzZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhX3EiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5hbHBoYV9xdWFsaXR5ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYV9tZXRob2QiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5hbHBoYV9jb21wcmVzc2lvbiA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGFfY2xlYW51cCIpKSB7CisgICAgICAvLyBUaGlzIGZsYWcgaXMgb2Jzb2xldGUsIGRvZXMgb3Bwb3NpdGUgb2YgLWV4YWN0LgorICAgICAgY29uZmlnLmV4YWN0ID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1leGFjdCIpKSB7CisgICAgICBjb25maWcuZXhhY3QgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWJsZW5kX2FscGhhIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBibGVuZF9hbHBoYSA9IDE7CisgICAgICAvLyBiYWNrZ3JvdW5kIGNvbG9yIGlzIGdpdmVuIGluIGhleCB3aXRoIGFuIG9wdGlvbmFsICcweCcgcHJlZml4CisgICAgICBiYWNrZ3JvdW5kX2NvbG9yID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMTYsICZwYXJzZV9lcnJvcik7CisgICAgICBiYWNrZ3JvdW5kX2NvbG9yID0gYmFja2dyb3VuZF9jb2xvciAmIDB4MDBmZmZmZmZ1OworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhX2ZpbHRlciIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgKytjOworICAgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIm5vbmUiKSkgeworICAgICAgICBjb25maWcuYWxwaGFfZmlsdGVyaW5nID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiZmFzdCIpKSB7CisgICAgICAgIGNvbmZpZy5hbHBoYV9maWx0ZXJpbmcgPSAxOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJiZXN0IikpIHsKKyAgICAgICAgY29uZmlnLmFscGhhX2ZpbHRlcmluZyA9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbnJlY29nbml6ZWQgYWxwaGEgZmlsdGVyOiAlc1xuIiwgYXJndltjXSk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9hbHBoYSIpKSB7CisgICAgICBrZWVwX2FscGhhID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb3NzbGVzcyIpKSB7CisgICAgICBjb25maWcubG9zc2xlc3MgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5lYXJfbG9zc2xlc3MiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5uZWFyX2xvc3NsZXNzID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNvbmZpZy5sb3NzbGVzcyA9IDE7ICAvLyB1c2UgbmVhci1sb3NzbGVzcyBvbmx5IHdpdGggbG9zc2xlc3MKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oaW50IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICArK2M7CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAicGhvdG8iKSkgeworICAgICAgICBjb25maWcuaW1hZ2VfaGludCA9IFdFQlBfSElOVF9QSE9UTzsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAicGljdHVyZSIpKSB7CisgICAgICAgIGNvbmZpZy5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX1BJQ1RVUkU7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgImdyYXBoIikpIHsKKyAgICAgICAgY29uZmlnLmltYWdlX2hpbnQgPSBXRUJQX0hJTlRfR1JBUEg7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbnJlY29nbml6ZWQgaW1hZ2UgaGludDogJXNcbiIsIGFyZ3ZbY10pOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNpemUiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy50YXJnZXRfc2l6ZSA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHNuciIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnRhcmdldF9QU05SID0gRXhVdGlsR2V0RmxvYXQoYXJndlsrK2NdLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNucyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnNuc19zdHJlbmd0aCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZiIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLmZpbHRlcl9zdHJlbmd0aCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWYiKSkgeworICAgICAgY29uZmlnLmF1dG9maWx0ZXIgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWpwZWdfbGlrZSIpKSB7CisgICAgICBjb25maWcuZW11bGF0ZV9qcGVnX3NpemUgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW10IikpIHsKKyAgICAgICsrY29uZmlnLnRocmVhZF9sZXZlbDsgIC8vIGluY3JlYXNlIHRocmVhZCBsZXZlbAorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvd19tZW1vcnkiKSkgeworICAgICAgY29uZmlnLmxvd19tZW1vcnkgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXN0cm9uZyIpKSB7CisgICAgICBjb25maWcuZmlsdGVyX3R5cGUgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vc3Ryb25nIikpIHsKKyAgICAgIGNvbmZpZy5maWx0ZXJfdHlwZSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2hhcnBuZXNzIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuZmlsdGVyX3NoYXJwbmVzcyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2hhcnBfeXV2IikpIHsKKyAgICAgIGNvbmZpZy51c2Vfc2hhcnBfeXV2ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wYXNzIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcucGFzcyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJlIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcucHJlcHJvY2Vzc2luZyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2VnbWVudHMiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5zZWdtZW50cyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGFydGl0aW9uX2xpbWl0IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcucGFydGl0aW9uX2xpbWl0ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tYXAiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIHBpY3R1cmUuZXh0cmFfaW5mb190eXBlID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1jcm9wIikgJiYgYyA8IGFyZ2MgLSA0KSB7CisgICAgICBjcm9wID0gMTsKKyAgICAgIGNyb3BfeCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjcm9wX3kgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY3JvcF93ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNyb3BfaCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcmVzaXplIikgJiYgYyA8IGFyZ2MgLSAyKSB7CisgICAgICByZXNpemVfdyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICByZXNpemVfaCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisjaWZuZGVmIFdFQlBfRExMCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9hc20iKSkgeworICAgICAgVlA4R2V0Q1BVSW5mbyA9IE5VTEw7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGNvbnN0IGludCB2ZXJzaW9uID0gV2ViUEdldEVuY29kZXJWZXJzaW9uKCk7CisgICAgICBwcmludGYoIiVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYsICh2ZXJzaW9uID4+IDgpICYgMHhmZiwgdmVyc2lvbiAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJvZ3Jlc3MiKSkgeworICAgICAgc2hvd19wcm9ncmVzcyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcXVpZXQiKSkgeworICAgICAgcXVpZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByZXNldCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgV2ViUFByZXNldCBwcmVzZXQ7CisgICAgICArK2M7CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiZGVmYXVsdCIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX0RFRkFVTFQ7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgInBob3RvIikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfUEhPVE87CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgInBpY3R1cmUiKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9QSUNUVVJFOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJkcmF3aW5nIikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfRFJBV0lORzsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiaWNvbiIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX0lDT047CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgInRleHQiKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9URVhUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5yZWNvZ25pemVkIHByZXNldDogJXNcbiIsIGFyZ3ZbY10pOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgaWYgKCFXZWJQQ29uZmlnUHJlc2V0KCZjb25maWcsIHByZXNldCwgY29uZmlnLnF1YWxpdHkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENvdWxkIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiB3aXRoIHByZXNldC5cbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1ldGFkYXRhIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogb3B0aW9uOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgIH0ga1Rva2Vuc1tdID0geworICAgICAgICB7ICJhbGwiLCAgTUVUQURBVEFfQUxMIH0sCisgICAgICAgIHsgIm5vbmUiLCAwIH0sCisgICAgICAgIHsgImV4aWYiLCBNRVRBREFUQV9FWElGIH0sCisgICAgICAgIHsgImljYyIsICBNRVRBREFUQV9JQ0MgfSwKKyAgICAgICAgeyAieG1wIiwgIE1FVEFEQVRBX1hNUCB9LAorICAgICAgfTsKKyAgICAgIGNvbnN0IHNpemVfdCBrTnVtVG9rZW5zID0gc2l6ZW9mKGtUb2tlbnMpIC8gc2l6ZW9mKGtUb2tlbnNbMF0pOworICAgICAgY29uc3QgY2hhciogc3RhcnQgPSBhcmd2WysrY107CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisKKyAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgY29uc3QgY2hhciogdG9rZW4gPSBzdHJjaHIoc3RhcnQsICcsJyk7CisgICAgICAgIGlmICh0b2tlbiA9PSBOVUxMKSB0b2tlbiA9IGVuZDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwga051bVRva2VuczsgKytpKSB7CisgICAgICAgICAgaWYgKChzaXplX3QpKHRva2VuIC0gc3RhcnQpID09IHN0cmxlbihrVG9rZW5zW2ldLm9wdGlvbikgJiYKKyAgICAgICAgICAgICAgIXN0cm5jbXAoc3RhcnQsIGtUb2tlbnNbaV0ub3B0aW9uLCBzdHJsZW4oa1Rva2Vuc1tpXS5vcHRpb24pKSkgeworICAgICAgICAgICAgaWYgKGtUb2tlbnNbaV0uZmxhZyAhPSAwKSB7CisgICAgICAgICAgICAgIGtlZXBfbWV0YWRhdGEgfD0ga1Rva2Vuc1tpXS5mbGFnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAga2VlcF9tZXRhZGF0YSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0ga051bVRva2VucykgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVua25vd24gbWV0YWRhdGEgdHlwZSAnJS4qcydcbiIsCisgICAgICAgICAgICAgICAgICAoaW50KSh0b2tlbiAtIHN0YXJ0KSwgc3RhcnQpOworICAgICAgICAgIEhlbHBMb25nKCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gdG9rZW4gKyAxOworICAgICAgfQorI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICAgICAgaWYgKGtlZXBfbWV0YWRhdGEgIT0gMCAmJiBrZWVwX21ldGFkYXRhICE9IE1FVEFEQVRBX0lDQykgeworICAgICAgICAvLyBUT0RPKGp6ZXJuKTogcmVtb3ZlIHdoZW4gLW1ldGFkYXRhIGlzIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IG9ubHkgSUNDIHByb2ZpbGUgZXh0cmFjdGlvbiBpcyBjdXJyZW50bHkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIVxuIik7CisgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12IikpIHsKKyAgICAgIHZlcmJvc2UgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLS0iKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgaW5fZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYXJndltjXVswXSA9PSAnLScpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVua25vd24gb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgSGVscExvbmcoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaW5fZmlsZSA9IGFyZ3ZbY107CisgICAgfQorCisgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICBIZWxwTG9uZygpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoaW5fZmlsZSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCFcbiIpOworICAgIEhlbHBTaG9ydCgpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAodXNlX2xvc3NsZXNzX3ByZXNldCA9PSAxKSB7CisgICAgaWYgKCFXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoJmNvbmZpZywgbG9zc2xlc3NfcHJlc2V0KSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGxvc3NsZXNzIHByZXNldCAoLXogJWQpXG4iLCBsb3NzbGVzc19wcmVzZXQpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGxvc3NsZXNzIG1vZGUgYW5kIGxvZworICAvLyB3YXJuaW5nIGZvciBzdWNoIG9wdGlvbnMuCisgIGlmICghcXVpZXQgJiYgY29uZmlnLmxvc3NsZXNzID09IDEpIHsKKyAgICBpZiAoY29uZmlnLnRhcmdldF9zaXplID4gMCB8fCBjb25maWcudGFyZ2V0X1BTTlIgPiAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY29kaW5nIGZvciBzcGVjaWZpZWQgc2l6ZSBvciBQU05SIGlzIG5vdCBzdXBwb3J0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgbG9zc2xlc3MgZW5jb2RpbmcuIElnbm9yaW5nIHN1Y2ggb3B0aW9uKHMpIVxuIik7CisgICAgfQorICAgIGlmIChjb25maWcucGFydGl0aW9uX2xpbWl0ID4gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJ0aXRpb24gbGltaXQgb3B0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgbG9zc2xlc3MiCisgICAgICAgICAgICAgICAgICAgICAgIiBlbmNvZGluZy4gSWdub3JpbmcgdGhpcyBvcHRpb24hXG4iKTsKKyAgICB9CisgIH0KKyAgLy8gSWYgYSB0YXJnZXQgc2l6ZSBvciBQU05SIHdhcyBnaXZlbiwgYnV0IHNvbWVob3cgdGhlIC1wYXNzIG9wdGlvbiB3YXMKKyAgLy8gb21pdHRlZCwgZm9yY2UgYSByZWFzb25hYmxlIHZhbHVlLgorICBpZiAoY29uZmlnLnRhcmdldF9zaXplID4gMCB8fCBjb25maWcudGFyZ2V0X1BTTlIgPiAwKSB7CisgICAgaWYgKGNvbmZpZy5wYXNzID09IDEpIGNvbmZpZy5wYXNzID0gNjsKKyAgfQorCisgIGlmICghV2ViUFZhbGlkYXRlQ29uZmlnKCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgSW52YWxpZCBjb25maWd1cmF0aW9uLlxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIFJlYWQgdGhlIGlucHV0LiBXZSBuZWVkIHRvIGRlY2lkZSBpZiB3ZSBwcmVmZXIgQVJHQiBvciBZVVZBCisgIC8vIHNhbXBsZXMsIGRlcGVuZGluZyBvbiB0aGUgZXhwZWN0ZWQgY29tcHJlc3Npb24gbW9kZSAodGhpcyBzYXZlcworICAvLyBzb21lIGNvbnZlcnNpb24gc3RlcHMpLgorICBwaWN0dXJlLnVzZV9hcmdiID0gKGNvbmZpZy5sb3NzbGVzcyB8fCBjb25maWcudXNlX3NoYXJwX3l1diB8fAorICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVwcm9jZXNzaW5nID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgIGNyb3AgfHwgKHJlc2l6ZV93IHwgcmVzaXplX2gpID4gMCk7CisgIGlmICh2ZXJib3NlKSB7CisgICAgU3RvcHdhdGNoUmVzZXQoJnN0b3Bfd2F0Y2gpOworICB9CisgIGlmICghUmVhZFBpY3R1cmUoaW5fZmlsZSwgJnBpY3R1cmUsIGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgKGtlZXBfbWV0YWRhdGEgPT0gMCkgPyBOVUxMIDogJm1ldGFkYXRhKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCByZWFkIGlucHV0IHBpY3R1cmUgZmlsZSAnJXMnXG4iLCBpbl9maWxlKTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIHBpY3R1cmUucHJvZ3Jlc3NfaG9vayA9IChzaG93X3Byb2dyZXNzICYmICFxdWlldCkgPyBQcm9ncmVzc1JlcG9ydCA6IE5VTEw7CisKKyAgaWYgKGJsZW5kX2FscGhhKSB7CisgICAgV2ViUEJsZW5kQWxwaGEoJnBpY3R1cmUsIGJhY2tncm91bmRfY29sb3IpOworICB9CisKKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBjb25zdCBkb3VibGUgcmVhZF90aW1lID0gU3RvcHdhdGNoUmVhZEFuZFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWUgdG8gcmVhZCBpbnB1dDogJS4zZnNcbiIsIHJlYWRfdGltZSk7CisgIH0KKworICAvLyBPcGVuIHRoZSBvdXRwdXQKKyAgaWYgKG91dF9maWxlICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgdXNlX3N0ZG91dCA9ICFzdHJjbXAob3V0X2ZpbGUsICItIik7CisgICAgb3V0ID0gdXNlX3N0ZG91dCA/IEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoc3Rkb3V0KSA6IGZvcGVuKG91dF9maWxlLCAid2IiKTsKKyAgICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCBvcGVuIG91dHB1dCBmaWxlICclcydcbiIsIG91dF9maWxlKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghc2hvcnRfb3V0cHV0ICYmICFxdWlldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmluZyBmaWxlICclcydcbiIsIG91dF9maWxlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGtlZXBfbWV0YWRhdGEgPT0gMCkgeworICAgICAgcGljdHVyZS53cml0ZXIgPSBNeVdyaXRlcjsKKyAgICAgIHBpY3R1cmUuY3VzdG9tX3B0ciA9ICh2b2lkKilvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBpY3R1cmUud3JpdGVyID0gV2ViUE1lbW9yeVdyaXRlOworICAgICAgcGljdHVyZS5jdXN0b21fcHRyID0gKHZvaWQqKSZtZW1vcnlfd3JpdGVyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPSBOVUxMOworICAgIGlmICghcXVpZXQgJiYgIXNob3J0X291dHB1dCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgZmlsZSBzcGVjaWZpZWQgKG5vIC1vIGZsYWcpLiBFbmNvZGluZyB3aWxsXG4iKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiYmUgcGVyZm9ybWVkLCBidXQgaXRzIHJlc3VsdHMgZGlzY2FyZGVkLlxuXG4iKTsKKyAgICB9CisgIH0KKyAgaWYgKCFxdWlldCkgeworICAgIHBpY3R1cmUuc3RhdHMgPSAmc3RhdHM7CisgICAgcGljdHVyZS51c2VyX2RhdGEgPSAodm9pZCopaW5fZmlsZTsKKyAgfQorCisgIC8vIENyb3AgJiByZXNpemUuCisgIGlmICh2ZXJib3NlKSB7CisgICAgU3RvcHdhdGNoUmVzZXQoJnN0b3Bfd2F0Y2gpOworICB9CisgIGlmIChjcm9wICE9IDApIHsKKyAgICAvLyBXZSB1c2Ugc2VsZi1jcm9wcGluZyB1c2luZyBhIHZpZXcuCisgICAgaWYgKCFXZWJQUGljdHVyZVZpZXcoJnBpY3R1cmUsIGNyb3BfeCwgY3JvcF95LCBjcm9wX3csIGNyb3BfaCwgJnBpY3R1cmUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgY3JvcCBwaWN0dXJlXG4iKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisgIGlmICgocmVzaXplX3cgfCByZXNpemVfaCkgPiAwKSB7CisgICAgaWYgKCFXZWJQUGljdHVyZVJlc2NhbGUoJnBpY3R1cmUsIHJlc2l6ZV93LCByZXNpemVfaCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCByZXNpemUgcGljdHVyZVxuIik7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorICBpZiAodmVyYm9zZSAmJiAoY3JvcCAhPSAwIHx8IChyZXNpemVfdyB8IHJlc2l6ZV9oKSA+IDApKSB7CisgICAgY29uc3QgZG91YmxlIHByZXByb2NfdGltZSA9IFN0b3B3YXRjaFJlYWRBbmRSZXNldCgmc3RvcF93YXRjaCk7CisgICAgZnByaW50ZihzdGRlcnIsICJUaW1lIHRvIGNyb3AvcmVzaXplIHBpY3R1cmU6ICUuM2ZzXG4iLCBwcmVwcm9jX3RpbWUpOworICB9CisKKyAgaWYgKHBpY3R1cmUuZXh0cmFfaW5mb190eXBlID4gMCkgeworICAgIEFsbG9jRXh0cmFJbmZvKCZwaWN0dXJlKTsKKyAgfQorICBpZiAocHJpbnRfZGlzdG9ydGlvbiA+PSAwKSB7ICAvLyBTYXZlIG9yaWdpbmFsIHBpY3R1cmUgZm9yIGxhdGVyIGNvbXBhcmlzb24KKyAgICBXZWJQUGljdHVyZUNvcHkoJnBpY3R1cmUsICZvcmlnaW5hbF9waWN0dXJlKTsKKyAgfQorCisgIC8vIENvbXByZXNzLgorICBpZiAodmVyYm9zZSkgeworICAgIFN0b3B3YXRjaFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgfQorICBpZiAoIVdlYlBFbmNvZGUoJmNvbmZpZywgJnBpY3R1cmUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IGVuY29kZSBwaWN0dXJlIGFzIFdlYlBcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY29kZTogJWQgKCVzKVxuIiwKKyAgICAgICAgICAgIHBpY3R1cmUuZXJyb3JfY29kZSwga0Vycm9yTWVzc2FnZXNbcGljdHVyZS5lcnJvcl9jb2RlXSk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBpZiAodmVyYm9zZSkgeworICAgIGNvbnN0IGRvdWJsZSBlbmNvZGVfdGltZSA9IFN0b3B3YXRjaFJlYWRBbmRSZXNldCgmc3RvcF93YXRjaCk7CisgICAgZnByaW50ZihzdGRlcnIsICJUaW1lIHRvIGVuY29kZSBwaWN0dXJlOiAlLjNmc1xuIiwgZW5jb2RlX3RpbWUpOworICB9CisKKyAgLy8gV3JpdGUgaW5mbworICBpZiAoZHVtcF9maWxlKSB7CisgICAgaWYgKHBpY3R1cmUudXNlX2FyZ2IpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY2FuJ3QgZHVtcCBmaWxlICgtZCBvcHRpb24pIGluIGxvc3NsZXNzIG1vZGUuIik7CisgICAgfSBlbHNlIGlmICghRHVtcFBpY3R1cmUoJnBpY3R1cmUsIGR1bXBfZmlsZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZywgY291bGRuJ3QgZHVtcCBwaWN0dXJlICVzXG4iLCBkdW1wX2ZpbGUpOworICAgIH0KKyAgfQorCisgIGlmIChrZWVwX21ldGFkYXRhICE9IDApIHsKKyAgICBpZiAob3V0ICE9IE5VTEwpIHsKKyAgICAgIGlmICghV3JpdGVXZWJQV2l0aE1ldGFkYXRhKG91dCwgJnBpY3R1cmUsICZtZW1vcnlfd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGFkYXRhLCBrZWVwX21ldGFkYXRhLCAmbWV0YWRhdGFfd3JpdHRlbikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIFdlYlAgZmlsZSB3aXRoIG1ldGFkYXRhIVxuIik7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIG91dHB1dCBpcyBkaXNhYmxlZCwganVzdCBkaXNwbGF5IHRoZSBtZXRhZGF0YSBzdGF0cy4KKyAgICAgIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZDsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICB9ICppdGVyLCBpbmZvW10gPSB7CisgICAgICAgIHsgJm1ldGFkYXRhLmV4aWYsIE1FVEFEQVRBX0VYSUYgfSwKKyAgICAgICAgeyAmbWV0YWRhdGEuaWNjcCwgTUVUQURBVEFfSUNDIH0sCisgICAgICAgIHsgJm1ldGFkYXRhLnhtcCwgTUVUQURBVEFfWE1QIH0sCisgICAgICAgIHsgTlVMTCwgMCB9CisgICAgICB9OworICAgICAgdWludDMyX3QgdW51c2VkMSA9IDA7CisgICAgICB1aW50NjRfdCB1bnVzZWQyID0gMDsKKworICAgICAgZm9yIChpdGVyID0gaW5mbzsgaXRlci0+cGF5bG9hZCAhPSBOVUxMOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKFVwZGF0ZUZsYWdzQW5kU2l6ZShpdGVyLT5wYXlsb2FkLCAhIShrZWVwX21ldGFkYXRhICYgaXRlci0+ZmxhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnVudXNlZDEsICZ1bnVzZWQyKSkgeworICAgICAgICAgIG1ldGFkYXRhX3dyaXR0ZW4gfD0gaXRlci0+ZmxhZzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghcXVpZXQpIHsKKyAgICBpZiAoIXNob3J0X291dHB1dCB8fCBwcmludF9kaXN0b3J0aW9uIDwgMCkgeworICAgICAgaWYgKGNvbmZpZy5sb3NzbGVzcykgeworICAgICAgICBQcmludEV4dHJhSW5mb0xvc3NsZXNzKCZwaWN0dXJlLCBzaG9ydF9vdXRwdXQsIGluX2ZpbGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRFeHRyYUluZm9Mb3NzeSgmcGljdHVyZSwgc2hvcnRfb3V0cHV0LCBjb25maWcubG93X21lbW9yeSwgaW5fZmlsZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghc2hvcnRfb3V0cHV0ICYmIHBpY3R1cmUuZXh0cmFfaW5mb190eXBlID4gMCkgeworICAgICAgUHJpbnRNYXBJbmZvKCZwaWN0dXJlKTsKKyAgICB9CisgICAgaWYgKHByaW50X2Rpc3RvcnRpb24gPj0gMCkgeyAgICAvLyBwcmludCBkaXN0b3J0aW9uCisgICAgICBzdGF0aWMgY29uc3QgY2hhciogZGlzdG9ydGlvbl9uYW1lc1tdID0geyAiUFNOUiIsICJTU0lNIiwgIkxTSU0iIH07CisgICAgICBmbG9hdCB2YWx1ZXNbNV07CisgICAgICBpZiAoIVdlYlBQaWN0dXJlRGlzdG9ydGlvbigmcGljdHVyZSwgJm9yaWdpbmFsX3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9kaXN0b3J0aW9uLCB2YWx1ZXMpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgY29tcHV0aW5nIHRoZSBkaXN0b3J0aW9uLlxuIik7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIXNob3J0X291dHB1dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBkaXN0b3J0aW9uX25hbWVzW3ByaW50X2Rpc3RvcnRpb25dKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCOiUuMmYgRzolLjJmIFI6JS4yZiBBOiUuMmYgIFRvdGFsOiUuMmZcbiIsCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSwgdmFsdWVzWzNdLCB2YWx1ZXNbNF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlN2QgJS40ZlxuIiwgcGljdHVyZS5zdGF0cy0+Y29kZWRfc2l6ZSwgdmFsdWVzWzRdKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzaG9ydF9vdXRwdXQpIHsKKyAgICAgIFByaW50TWV0YWRhdGFJbmZvKCZtZXRhZGF0YSwgbWV0YWRhdGFfd3JpdHRlbik7CisgICAgfQorICB9CisgIHJldHVybl92YWx1ZSA9IDA7CisKKyBFcnJvcjoKKyAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZtZW1vcnlfd3JpdGVyKTsKKyAgZnJlZShwaWN0dXJlLmV4dHJhX2luZm8pOworICBNZXRhZGF0YUZyZWUoJm1ldGFkYXRhKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWN0dXJlKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZvcmlnaW5hbF9waWN0dXJlKTsKKyAgaWYgKG91dCAhPSBOVUxMICYmIG91dCAhPSBzdGRvdXQpIHsKKyAgICBmY2xvc2Uob3V0KTsKKyAgfQorCisgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9kd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZHdlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQwNjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZHdlYnAuYwpAQCAtMCwwICsxLDQxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBDb21tYW5kLWxpbmUgdG9vbCBmb3IgZGVjb2RpbmcgYSBXZWJQIGltYWdlLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2VfZW5jLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby93ZWJwZGVjLmgiCisjaW5jbHVkZSAiLi9zdG9wd2F0Y2guaCIKKworc3RhdGljIGludCB2ZXJib3NlID0gMDsKK3N0YXRpYyBpbnQgcXVpZXQgPSAwOworI2lmbmRlZiBXRUJQX0RMTAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gdm9pZCogVlA4R2V0Q1BVSW5mbzsgICAvLyBvcGFxdWUgZm9yd2FyZCBkZWNsYXJhdGlvbi4KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorI2VuZGlmICAvLyBXRUJQX0RMTAorCisKK3N0YXRpYyBpbnQgU2F2ZU91dHB1dChjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0LCBjb25zdCBjaGFyKiBjb25zdCBvdXRfZmlsZSkgeworICBjb25zdCBpbnQgdXNlX3N0ZG91dCA9IChvdXRfZmlsZSAhPSBOVUxMKSAmJiAhc3RyY21wKG91dF9maWxlLCAiLSIpOworICBpbnQgb2sgPSAxOworICBTdG9wd2F0Y2ggc3RvcF93YXRjaDsKKworICBpZiAodmVyYm9zZSkgeworICAgIFN0b3B3YXRjaFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgfQorICBvayA9IFdlYlBTYXZlSW1hZ2UoYnVmZmVyLCBmb3JtYXQsIG91dF9maWxlKTsKKworICBpZiAob2spIHsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBpZiAodXNlX3N0ZG91dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkIHRvIHN0ZG91dFxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkIGZpbGUgJXNcbiIsIG91dF9maWxlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgIGNvbnN0IGRvdWJsZSB3cml0ZV90aW1lID0gU3RvcHdhdGNoUmVhZEFuZFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVGltZSB0byB3cml0ZSBvdXRwdXQ6ICUuM2ZzXG4iLCB3cml0ZV90aW1lKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHVzZV9zdGRvdXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyB0byBzdGRvdXQgISFcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgZmlsZSAlcyAhIVxuIiwgb3V0X2ZpbGUpOworICAgIH0KKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOiBkd2VicCBpbl9maWxlIFtvcHRpb25zXSBbLW8gb3V0X2ZpbGVdXG5cbiIKKyAgICAgICAgICJEZWNvZGVzIHRoZSBXZWJQIGltYWdlIGZpbGUgdG8gUE5HIGZvcm1hdCBbRGVmYXVsdF1cbiIKKyAgICAgICAgICJVc2UgZm9sbG93aW5nIG9wdGlvbnMgdG8gY29udmVydCBpbnRvIGFsdGVybmF0ZSBpbWFnZSBmb3JtYXRzOlxuIgorICAgICAgICAgIiAgLXBhbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFJHQkEgc2FtcGxlcyBhcyBhIGNvbG9yIFBBTVxuIgorICAgICAgICAgIiAgLXBwbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFJHQiBzYW1wbGVzIGFzIGEgY29sb3IgUFBNXG4iCisgICAgICAgICAiICAtYm1wIC4uLi4uLi4uLiBzYXZlIGFzIHVuY29tcHJlc3NlZCBCTVAgZm9ybWF0XG4iCisgICAgICAgICAiICAtdGlmZiAuLi4uLi4uLiBzYXZlIGFzIHVuY29tcHJlc3NlZCBUSUZGIGZvcm1hdFxuIgorICAgICAgICAgIiAgLXBnbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFlVViBzYW1wbGVzIGFzIGEgZ3JheXNjYWxlIFBHTVxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgZmlsZSB3aXRoIElNQzQgbGF5b3V0XG4iCisgICAgICAgICAiICAteXV2IC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgWVVWIHNhbXBsZXMgaW4gZmxhdCBsYXlvdXRcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICIgT3RoZXIgb3B0aW9ucyBhcmU6XG4iCisgICAgICAgICAiICAtdmVyc2lvbiAuLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgorICAgICAgICAgIiAgLW5vZmFuY3kgLi4uLi4gZG9uJ3QgdXNlIHRoZSBmYW5jeSBZVVY0MjAgdXBzY2FsZXJcbiIKKyAgICAgICAgICIgIC1ub2ZpbHRlciAuLi4uIGRpc2FibGUgaW4tbG9vcCBmaWx0ZXJpbmdcbiIKKyAgICAgICAgICIgIC1ub2RpdGhlciAuLi4uIGRpc2FibGUgZGl0aGVyaW5nXG4iCisgICAgICAgICAiICAtZGl0aGVyIDxkPiAuLiBkaXRoZXJpbmcgc3RyZW5ndGggKGluIDAuLjEwMClcbiIKKyAgICAgICAgICIgIC1hbHBoYV9kaXRoZXIgIHVzZSBhbHBoYS1wbGFuZSBkaXRoZXJpbmcgaWYgbmVlZGVkXG4iCisgICAgICAgICAiICAtbXQgLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nXG4iCisgICAgICAgICAiICAtY3JvcCA8eD4gPHk+IDx3PiA8aD4gLi4uIGNyb3Agb3V0cHV0IHdpdGggdGhlIGdpdmVuIHJlY3RhbmdsZVxuIgorICAgICAgICAgIiAgLXJlc2l6ZSA8dz4gPGg+IC4uLi4uLi4uLiBzY2FsZSB0aGUgb3V0cHV0ICgqYWZ0ZXIqIGFueSBjcm9wcGluZylcbiIKKyAgICAgICAgICIgIC1mbGlwIC4uLi4uLi4uIGZsaXAgdGhlIG91dHB1dCB2ZXJ0aWNhbGx5XG4iCisgICAgICAgICAiICAtYWxwaGEgLi4uLi4uLiBvbmx5IHNhdmUgdGhlIGFscGhhIHBsYW5lXG4iCisgICAgICAgICAiICAtaW5jcmVtZW50YWwgLiB1c2UgaW5jcmVtZW50YWwgZGVjb2RpbmcgKHVzZWZ1bCBmb3IgdGVzdHMpXG4iCisgICAgICAgICAiICAtaCAuLi4uLi4uLi4uLiB0aGlzIGhlbHAgbWVzc2FnZVxuIgorICAgICAgICAgIiAgLXYgLi4uLi4uLi4uLi4gdmVyYm9zZSAoZS5nLiBwcmludCBlbmNvZGluZy9kZWNvZGluZyB0aW1lcylcbiIKKyAgICAgICAgICIgIC1xdWlldCAuLi4uLi4uIHF1aWV0IG1vZGUsIGRvbid0IHByaW50IGFueXRoaW5nXG4iCisjaWZuZGVmIFdFQlBfRExMCisgICAgICAgICAiICAtbm9hc20gLi4uLi4uLiBkaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zXG4iCisjZW5kaWYKKyAgICAgICAgKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtGb3JtYXRUeXBlW10gPSB7CisgICJ1bnNwZWNpZmllZCIsICJsb3NzeSIsICJsb3NzbGVzcyIKK307CisKK3N0YXRpYyB1aW50OF90KiBBbGxvY2F0ZUV4dGVybmFsQnVmZmVyKFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2V4dGVybmFsX21lbW9yeSkgeworICB1aW50OF90KiBleHRlcm5hbF9idWZmZXIgPSBOVUxMOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXRfYnVmZmVyID0gJmNvbmZpZy0+b3V0cHV0OworICBpbnQgdyA9IGNvbmZpZy0+aW5wdXQud2lkdGg7CisgIGludCBoID0gY29uZmlnLT5pbnB1dC5oZWlnaHQ7CisgIGlmIChjb25maWctPm9wdGlvbnMudXNlX3NjYWxpbmcpIHsKKyAgICB3ID0gY29uZmlnLT5vcHRpb25zLnNjYWxlZF93aWR0aDsKKyAgICBoID0gY29uZmlnLT5vcHRpb25zLnNjYWxlZF9oZWlnaHQ7CisgIH0gZWxzZSBpZiAoY29uZmlnLT5vcHRpb25zLnVzZV9jcm9wcGluZykgeworICAgIHcgPSBjb25maWctPm9wdGlvbnMuY3JvcF93aWR0aDsKKyAgICBoID0gY29uZmlnLT5vcHRpb25zLmNyb3BfaGVpZ2h0OworICB9CisgIGlmIChmb3JtYXQgPj0gUkdCICYmIGZvcm1hdCA8PSByZ2JBXzQ0NDQpIHsKKyAgICBjb25zdCBpbnQgYnBwID0gKGZvcm1hdCA9PSBSR0IgfHwgZm9ybWF0ID09IEJHUikgPyAzCisgICAgICAgICAgICAgICAgICA6IChmb3JtYXQgPT0gUkdCQV80NDQ0IHx8IGZvcm1hdCA9PSByZ2JBXzQ0NDQgfHwKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBSR0JfNTY1KSA/IDIKKyAgICAgICAgICAgICAgICAgIDogNDsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSBicHAgKiB3ICsgNzsgICAvLyA8LSBqdXN0IGZvciBleGVyY2lzaW5nCisgICAgZXh0ZXJuYWxfYnVmZmVyID0gKHVpbnQ4X3QqKW1hbGxvYyhzdHJpZGUgKiBoKTsKKyAgICBpZiAoZXh0ZXJuYWxfYnVmZmVyID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5zdHJpZGUgPSBzdHJpZGU7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnNpemUgPSBzdHJpZGUgKiBoOworICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5yZ2JhID0gZXh0ZXJuYWxfYnVmZmVyOworICB9IGVsc2UgeyAgICAvLyBZVVYgYW5kIFlVVkEKKyAgICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UpOworICAgIHVpbnQ4X3QqIHRtcDsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSB3ICsgMzsKKyAgICB1aW50MzJfdCB1dl9zdHJpZGUgPSAodyArIDEpIC8gMiArIDEzOworICAgIHVpbnQzMl90IHRvdGFsX3NpemUgPSBzdHJpZGUgKiBoICogKGhhc19hbHBoYSA/IDIgOiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAyICogdXZfc3RyaWRlICogKGggKyAxKSAvIDI7CisgICAgYXNzZXJ0KGZvcm1hdCA+PSBZVVYgJiYgZm9ybWF0IDw9IFlVVkEpOworICAgIGV4dGVybmFsX2J1ZmZlciA9ICh1aW50OF90KiltYWxsb2ModG90YWxfc2l6ZSk7CisgICAgaWYgKGV4dGVybmFsX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICB0bXAgPSBleHRlcm5hbF9idWZmZXI7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnkgPSB0bXA7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnlfc3RyaWRlID0gc3RyaWRlOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55X3NpemUgPSBzdHJpZGUgKiBoOworICAgIHRtcCArPSBvdXRwdXRfYnVmZmVyLT51LllVVkEueV9zaXplOworICAgIGlmIChoYXNfYWxwaGEpIHsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hID0gdG1wOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc3RyaWRlID0gc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc2l6ZSA9IHN0cmlkZSAqIGg7CisgICAgICB0bXAgKz0gb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmEgPSBOVUxMOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc3RyaWRlID0gMDsKKyAgICB9CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnUgPSB0bXA7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnVfc3RyaWRlID0gdXZfc3RyaWRlOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51X3NpemUgPSB1dl9zdHJpZGUgKiAoaCArIDEpIC8gMjsKKyAgICB0bXAgKz0gb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnVfc2l6ZTsKKworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52ID0gdG1wOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudl9zaXplID0gdXZfc3RyaWRlICogKGggKyAxKSAvIDI7CisgICAgdG1wICs9IG91dHB1dF9idWZmZXItPnUuWVVWQS52X3NpemU7CisgICAgYXNzZXJ0KHRtcCA8PSBleHRlcm5hbF9idWZmZXIgKyB0b3RhbF9zaXplKTsKKyAgfQorICBvdXRwdXRfYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkgPSB1c2VfZXh0ZXJuYWxfbWVtb3J5OworICByZXR1cm4gZXh0ZXJuYWxfYnVmZmVyOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGNoYXIgKmluX2ZpbGUgPSBOVUxMOworICBjb25zdCBjaGFyICpvdXRfZmlsZSA9IE5VTEw7CisKKyAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXRfYnVmZmVyID0gJmNvbmZpZy5vdXRwdXQ7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgYml0c3RyZWFtID0gJmNvbmZpZy5pbnB1dDsKKyAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0ID0gUE5HOworICB1aW50OF90KiBleHRlcm5hbF9idWZmZXIgPSBOVUxMOworICBpbnQgdXNlX2V4dGVybmFsX21lbW9yeSA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworCisgIGludCBpbmNyZW1lbnRhbCA9IDA7CisgIGludCBjOworCisgIGlmICghV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1vIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBvdXRfZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYSIpKSB7CisgICAgICBmb3JtYXQgPSBBTFBIQV9QTEFORV9PTkxZOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vZmFuY3kiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMubm9fZmFuY3lfdXBzYW1wbGluZyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9maWx0ZXIiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMuYnlwYXNzX2ZpbHRlcmluZyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGFtIikpIHsKKyAgICAgIGZvcm1hdCA9IFBBTTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcG0iKSkgeworICAgICAgZm9ybWF0ID0gUFBNOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWJtcCIpKSB7CisgICAgICBmb3JtYXQgPSBCTVA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdGlmZiIpKSB7CisgICAgICBmb3JtYXQgPSBUSUZGOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXF1aWV0IikpIHsKKyAgICAgIHF1aWV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGNvbnN0IGludCB2ZXJzaW9uID0gV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgICAgICBwcmludGYoIiVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYsICh2ZXJzaW9uID4+IDgpICYgMHhmZiwgdmVyc2lvbiAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGdtIikpIHsKKyAgICAgIGZvcm1hdCA9IFBHTTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi15dXYiKSkgeworICAgICAgZm9ybWF0ID0gUkFXX1lVVjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1waXhlbF9mb3JtYXQiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZtdCA9IGFyZ3ZbKytjXTsKKyAgICAgIGlmICAgICAgKCFzdHJjbXAoZm10LCAiUkdCIikpICBmb3JtYXQgPSBSR0I7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIlJHQkEiKSkgZm9ybWF0ID0gUkdCQTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiQkdSIikpICBmb3JtYXQgPSBCR1I7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIkJHUkEiKSkgZm9ybWF0ID0gQkdSQTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiQVJHQiIpKSBmb3JtYXQgPSBBUkdCOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJSR0JBXzQ0NDQiKSkgZm9ybWF0ID0gUkdCQV80NDQ0OworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJSR0JfNTY1IikpIGZvcm1hdCA9IFJHQl81NjU7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgInJnYkEiKSkgZm9ybWF0ID0gcmdiQTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiYmdyQSIpKSBmb3JtYXQgPSBiZ3JBOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJBcmdiIikpIGZvcm1hdCA9IEFyZ2I7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgInJnYkFfNDQ0NCIpKSBmb3JtYXQgPSByZ2JBXzQ0NDQ7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIllVViIpKSAgZm9ybWF0ID0gWVVWOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJZVVZBIikpIGZvcm1hdCA9IFlVVkE7CisgICAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBwYXJzZSBwaXhlbF9mb3JtYXQgJXNcbiIsIGZtdCk7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1leHRlcm5hbF9tZW1vcnkiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIHVzZV9leHRlcm5hbF9tZW1vcnkgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgcGFyc2VfZXJyb3IgfD0gKHVzZV9leHRlcm5hbF9tZW1vcnkgPiAyIHx8IHVzZV9leHRlcm5hbF9tZW1vcnkgPCAwKTsKKyAgICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHBhcnNlICdleHRlcm5hbF9tZW1vcnknIHZhbHVlICVzXG4iLCBhcmd2W2NdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tdCIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy51c2VfdGhyZWFkcyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGFfZGl0aGVyIikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmFscGhhX2RpdGhlcmluZ19zdHJlbmd0aCA9IDEwMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2RpdGhlciIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy5kaXRoZXJpbmdfc3RyZW5ndGggPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWRpdGhlciIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLm9wdGlvbnMuZGl0aGVyaW5nX3N0cmVuZ3RoID0KKyAgICAgICAgICBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWNyb3AiKSAmJiBjIDwgYXJnYyAtIDQpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLnVzZV9jcm9wcGluZyA9IDE7CisgICAgICBjb25maWcub3B0aW9ucy5jcm9wX2xlZnQgICA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjb25maWcub3B0aW9ucy5jcm9wX3RvcCAgICA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjb25maWcub3B0aW9ucy5jcm9wX3dpZHRoICA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjb25maWcub3B0aW9ucy5jcm9wX2hlaWdodCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICgoIXN0cmNtcChhcmd2W2NdLCAiLXNjYWxlIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLXJlc2l6ZSIpKSAmJgorICAgICAgICAgICAgICAgYyA8IGFyZ2MgLSAyKSB7ICAvLyAnLXNjYWxlJyBpcyBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CisgICAgICBjb25maWcub3B0aW9ucy51c2Vfc2NhbGluZyA9IDE7CisgICAgICBjb25maWcub3B0aW9ucy5zY2FsZWRfd2lkdGggID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLnNjYWxlZF9oZWlnaHQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWZsaXAiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMuZmxpcCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdiIpKSB7CisgICAgICB2ZXJib3NlID0gMTsKKyNpZm5kZWYgV0VCUF9ETEwKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2FzbSIpKSB7CisgICAgICBWUDhHZXRDUFVJbmZvID0gTlVMTDsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWluY3JlbWVudGFsIikpIHsKKyAgICAgIGluY3JlbWVudGFsID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi0tIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIGluX2ZpbGUgPSBhcmd2WysrY107CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICBpbl9maWxlID0gYXJndltjXTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBpZiAoaW5fZmlsZSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJtaXNzaW5nIGlucHV0IGZpbGUhIVxuIik7CisgICAgSGVscCgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChxdWlldCkgdmVyYm9zZSA9IDA7CisKKyAgeworICAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gVlA4X1NUQVRVU19PSzsKKyAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgICBpZiAoIUxvYWRXZWJQKGluX2ZpbGUsICZkYXRhLCAmZGF0YV9zaXplLCBiaXRzdHJlYW0pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgUE5HOgorI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gYml0c3RyZWFtLT5oYXNfYWxwaGEgPyBNT0RFX0JHUkEgOiBNT0RFX0JHUjsKKyNlbHNlCisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBiaXRzdHJlYW0tPmhhc19hbHBoYSA/IE1PREVfUkdCQSA6IE1PREVfUkdCOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQU06CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUE06CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQjsgIC8vIGRyb3BzIGFscGhhIGZvciBQUE0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJNUDoKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9CR1JBIDogTU9ERV9CR1I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUSUZGOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gYml0c3RyZWFtLT5oYXNfYWxwaGEgPyBNT0RFX1JHQkEgOiBNT0RFX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBHTToKKyAgICAgIGNhc2UgUkFXX1lVVjoKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9ZVVZBIDogTU9ERV9ZVVY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBTFBIQV9QTEFORV9PTkxZOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9ZVVZBOworICAgICAgICBicmVhazsKKyAgICAgIC8vIGZvcmNlZCBtb2RlczoKKyAgICAgIGNhc2UgUkdCOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0I7IGJyZWFrOworICAgICAgY2FzZSBSR0JBOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0JBOyBicmVhazsKKyAgICAgIGNhc2UgQkdSOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9CR1I7IGJyZWFrOworICAgICAgY2FzZSBCR1JBOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9CR1JBOyBicmVhazsKKyAgICAgIGNhc2UgQVJHQjogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQVJHQjsgYnJlYWs7CisgICAgICBjYXNlIFJHQkFfNDQ0NDogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCQV80NDQ0OyBicmVhazsKKyAgICAgIGNhc2UgUkdCXzU2NTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCXzU2NTsgYnJlYWs7CisgICAgICBjYXNlIHJnYkE6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX3JnYkE7IGJyZWFrOworICAgICAgY2FzZSBiZ3JBOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9iZ3JBOyBicmVhazsKKyAgICAgIGNhc2UgQXJnYjogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQXJnYjsgYnJlYWs7CisgICAgICBjYXNlIHJnYkFfNDQ0NDogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfcmdiQV80NDQ0OyBicmVhazsKKyAgICAgIGNhc2UgWVVWOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9ZVVY7IGJyZWFrOworICAgICAgY2FzZSBZVVZBOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9ZVVZBOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAodXNlX2V4dGVybmFsX21lbW9yeSA+IDAgJiYgZm9ybWF0ID49IFJHQikgeworICAgICAgZXh0ZXJuYWxfYnVmZmVyID0gQWxsb2NhdGVFeHRlcm5hbEJ1ZmZlcigmY29uZmlnLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9leHRlcm5hbF9tZW1vcnkpOworICAgICAgaWYgKGV4dGVybmFsX2J1ZmZlciA9PSBOVUxMKSBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgeworICAgICAgU3RvcHdhdGNoIHN0b3Bfd2F0Y2g7CisgICAgICBpZiAodmVyYm9zZSkgU3RvcHdhdGNoUmVzZXQoJnN0b3Bfd2F0Y2gpOworCisgICAgICBpZiAoaW5jcmVtZW50YWwpIHsKKyAgICAgICAgc3RhdHVzID0gRGVjb2RlV2ViUEluY3JlbWVudGFsKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBEZWNvZGVXZWJQKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZyk7CisgICAgICB9CisgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBjb25zdCBkb3VibGUgZGVjb2RlX3RpbWUgPSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoJnN0b3Bfd2F0Y2gpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWUgdG8gZGVjb2RlIHBpY3R1cmU6ICUuM2ZzXG4iLCBkZWNvZGVfdGltZSk7CisgICAgICB9CisgICAgfQorCisgICAgb2sgPSAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spOworICAgIGlmICghb2spIHsKKyAgICAgIFByaW50V2ViUEVycm9yKGluX2ZpbGUsIHN0YXR1cyk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9maWxlICE9IE5VTEwpIHsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRlY29kZWQgJXMuIERpbWVuc2lvbnM6ICVkIHggJWQgJXMuIEZvcm1hdDogJXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAiTm93IHNhdmluZy4uLlxuIiwKKyAgICAgICAgICAgICAgaW5fZmlsZSwgb3V0cHV0X2J1ZmZlci0+d2lkdGgsIG91dHB1dF9idWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgYml0c3RyZWFtLT5oYXNfYWxwaGEgPyAiICh3aXRoIGFscGhhKSIgOiAiIiwKKyAgICAgICAgICAgICAga0Zvcm1hdFR5cGVbYml0c3RyZWFtLT5mb3JtYXRdKTsKKyAgICB9CisgICAgb2sgPSBTYXZlT3V0cHV0KG91dHB1dF9idWZmZXIsIGZvcm1hdCwgb3V0X2ZpbGUpOworICB9IGVsc2UgeworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBjYW4gYmUgZGVjb2RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgIihkaW1lbnNpb25zOiAlZCB4ICVkICVzLiBGb3JtYXQ6ICVzKS5cbiIsCisgICAgICAgICAgICAgIGluX2ZpbGUsIG91dHB1dF9idWZmZXItPndpZHRoLCBvdXRwdXRfYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgIGJpdHN0cmVhbS0+aGFzX2FscGhhID8gIiAod2l0aCBhbHBoYSkiIDogIiIsCisgICAgICAgICAgICAgIGtGb3JtYXRUeXBlW2JpdHN0cmVhbS0+Zm9ybWF0XSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdGhpbmcgd3JpdHRlbjsgIgorICAgICAgICAgICAgICAgICAgICAgICJ1c2UgLW8gZmxhZyB0byBzYXZlIHRoZSByZXN1bHQgYXMgZS5nLiBQTkcuXG4iKTsKKyAgICB9CisgIH0KKyBFeGl0OgorICBXZWJQRnJlZURlY0J1ZmZlcihvdXRwdXRfYnVmZmVyKTsKKyAgZnJlZSgodm9pZCopZXh0ZXJuYWxfYnVmZmVyKTsKKyAgZnJlZSgodm9pZCopZGF0YSk7CisgIHJldHVybiBvayA/IDAgOiAtMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1YTEyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5jCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIGV4YW1wbGUgcHJvZ3JhbXMuCisvLworCisjaW5jbHVkZSAiLi9leGFtcGxlX3V0aWwuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL211eF90eXBlcy5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmcgcGFyc2luZworCit1aW50MzJfdCBFeFV0aWxHZXRVSW50KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCBiYXNlLCBpbnQqIGNvbnN0IGVycm9yKSB7CisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IHVpbnQzMl90IG4gPSAodiAhPSBOVUxMKSA/ICh1aW50MzJfdClzdHJ0b3VsKHYsICZlbmQsIGJhc2UpIDogMHU7CisgIGlmIChlbmQgPT0gdiAmJiBlcnJvciAhPSBOVUxMICYmICEqZXJyb3IpIHsKKyAgICAqZXJyb3IgPSAxOworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhICclcycgaXMgbm90IGFuIGludGVnZXIuXG4iLAorICAgICAgICAgICAgKHYgIT0gTlVMTCkgPyB2IDogIihudWxsKSIpOworICB9CisgIHJldHVybiBuOworfQorCitpbnQgRXhVdGlsR2V0SW50KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCBiYXNlLCBpbnQqIGNvbnN0IGVycm9yKSB7CisgIHJldHVybiAoaW50KUV4VXRpbEdldFVJbnQodiwgYmFzZSwgZXJyb3IpOworfQorCitpbnQgRXhVdGlsR2V0SW50cyhjb25zdCBjaGFyKiB2LCBpbnQgYmFzZSwgaW50IG1heF9vdXRwdXQsIGludCBvdXRwdXRbXSkgeworICBpbnQgbiwgZXJyb3IgPSAwOworICBmb3IgKG4gPSAwOyB2ICE9IE5VTEwgJiYgbiA8IG1heF9vdXRwdXQ7ICsrbikgeworICAgIGNvbnN0IGludCB2YWx1ZSA9IEV4VXRpbEdldEludCh2LCBiYXNlLCAmZXJyb3IpOworICAgIGlmIChlcnJvcikgcmV0dXJuIC0xOworICAgIG91dHB1dFtuXSA9IHZhbHVlOworICAgIHYgPSBzdHJjaHIodiwgJywnKTsKKyAgICBpZiAodiAhPSBOVUxMKSArK3Y7ICAgLy8gc2tpcCBvdmVyIHRoZSB0cmFpbGluZyAnLCcKKyAgfQorICByZXR1cm4gbjsKK30KKworZmxvYXQgRXhVdGlsR2V0RmxvYXQoY29uc3QgY2hhciogY29uc3QgdiwgaW50KiBjb25zdCBlcnJvcikgeworICBjaGFyKiBlbmQgPSBOVUxMOworICBjb25zdCBmbG9hdCBmID0gKHYgIT0gTlVMTCkgPyAoZmxvYXQpc3RydG9kKHYsICZlbmQpIDogMC5mOworICBpZiAoZW5kID09IHYgJiYgZXJyb3IgIT0gTlVMTCAmJiAhKmVycm9yKSB7CisgICAgKmVycm9yID0gMTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISAnJXMnIGlzIG5vdCBhIGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiIsCisgICAgICAgICAgICAodiAhPSBOVUxMKSA/IHYgOiAiKG51bGwpIik7CisgIH0KKyAgcmV0dXJuIGY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFJlc2V0Q29tbWFuZExpbmVBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MpIHsKKyAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCk7CisgIGFyZ3MtPmFyZ2NfID0gYXJnYzsKKyAgYXJncy0+YXJndl8gPSBhcmd2OworICBhcmdzLT5vd25fYXJndl8gPSAwOworICBXZWJQRGF0YUluaXQoJmFyZ3MtPmFyZ3ZfZGF0YV8pOworfQorCit2b2lkIEV4VXRpbERlbGV0ZUNvbW1hbmRMaW5lQXJndW1lbnRzKENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzKSB7CisgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICBpZiAoYXJncy0+b3duX2FyZ3ZfKSB7CisgICAgICBmcmVlKCh2b2lkKilhcmdzLT5hcmd2Xyk7CisgICAgICBXZWJQRGF0YUNsZWFyKCZhcmdzLT5hcmd2X2RhdGFfKTsKKyAgICB9CisgICAgUmVzZXRDb21tYW5kTGluZUFyZ3VtZW50cygwLCBOVUxMLCBhcmdzKTsKKyAgfQorfQorCisjZGVmaW5lIE1BWF9BUkdDIDE2Mzg0CitpbnQgRXhVdGlsSW5pdENvbW1hbmRMaW5lQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzKSB7CisgIGlmIChhcmdzID09IE5VTEwgfHwgYXJndiA9PSBOVUxMKSByZXR1cm4gMDsKKyAgUmVzZXRDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdjLCBhcmd2LCBhcmdzKTsKKyAgaWYgKGFyZ2MgPT0gMSAmJiBhcmd2WzBdWzBdICE9ICctJykgeworICAgIGNoYXIqIGN1cjsKKyAgICBjb25zdCBjaGFyIHNlcFtdID0gIiBcdFxyXG5cZlx2IjsKKyAgICBpZiAoIUV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShhcmd2WzBdLCAmYXJncy0+YXJndl9kYXRhXykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmdzLT5vd25fYXJndl8gPSAxOworICAgIGFyZ3MtPmFyZ3ZfID0gKGNvbnN0IGNoYXIqKiltYWxsb2MoTUFYX0FSR0MgKiBzaXplb2YoKmFyZ3MtPmFyZ3ZfKSk7CisgICAgaWYgKGFyZ3MtPmFyZ3ZfID09IE5VTEwpIHJldHVybiAwOworCisgICAgYXJnYyA9IDA7CisgICAgZm9yIChjdXIgPSBzdHJ0b2soKGNoYXIqKWFyZ3MtPmFyZ3ZfZGF0YV8uYnl0ZXMsIHNlcCk7CisgICAgICAgICBjdXIgIT0gTlVMTDsKKyAgICAgICAgIGN1ciA9IHN0cnRvayhOVUxMLCBzZXApKSB7CisgICAgICBpZiAoYXJnYyA9PSBNQVhfQVJHQykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBcmd1bWVudHMgbGltaXQgJWQgcmVhY2hlZFxuIiwgTUFYX0FSR0MpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGFzc2VydChzdHJsZW4oY3VyKSAhPSAwKTsKKyAgICAgIGFyZ3MtPmFyZ3ZfW2FyZ2MrK10gPSBjdXI7CisgICAgfQorICAgIGFyZ3MtPmFyZ2NfID0gYXJnYzsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSkgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3Qgc2l6ZTsKKyAgaWYgKHdlYnBfZGF0YSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZzaXplKSkgcmV0dXJuIDA7CisgIHdlYnBfZGF0YS0+Ynl0ZXMgPSBkYXRhOworICB3ZWJwX2RhdGEtPnNpemUgPSBzaXplOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3NjJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgZXhhbXBsZSBwcm9ncmFtcy4KKy8vCisKKyNpZm5kZWYgV0VCUF9FWEFNUExFU19FWEFNUExFX1VUSUxfSF8KKyNkZWZpbmUgV0VCUF9FWEFNUExFU19FWEFNUExFX1VUSUxfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJ3ZWJwL211eF90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJpbmcgcGFyc2luZworCisvLyBQYXJzZXMgJ3YnIHVzaW5nIHN0cnRvKHVsfGx8ZCkoKS4gSWYgZXJyb3IgaXMgbm9uLU5VTEwsICcqZXJyb3InIGlzIHNldCB0bworLy8gdHJ1ZSBvbiBmYWlsdXJlIHdoaWxlIG9uIHN1Y2Nlc3MgaXQgaXMgbGVmdCB1bm1vZGlmaWVkIHRvIGFsbG93IGNoYWluaW5nIG9mCisvLyBjYWxscy4gQW4gZXJyb3IgaXMgb25seSBwcmludGVkIG9uIHRoZSBmaXJzdCBvY2N1cnJlbmNlLgordWludDMyX3QgRXhVdGlsR2V0VUludChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQgYmFzZSwgaW50KiBjb25zdCBlcnJvcik7CitpbnQgRXhVdGlsR2V0SW50KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCBiYXNlLCBpbnQqIGNvbnN0IGVycm9yKTsKK2Zsb2F0IEV4VXRpbEdldEZsb2F0KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCogY29uc3QgZXJyb3IpOworCisvLyBUaGlzIHZhcmlhbnQgb2YgRXhVdGlsR2V0SW50KCkgd2lsbCBwYXJzZSBtdWx0aXBsZSBpbnRlZ2VycyBmcm9tIGEKKy8vIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBVcCB0byAnbWF4X291dHB1dCcgaW50ZWdlcnMgYXJlIHBhcnNlZC4KKy8vIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIHRoZSBvdXRwdXRbXSBhcnJheSwgYW5kIHRoZSBudW1iZXIgb2YgaW50ZWdlcnMKKy8vIGFjdHVhbGx5IHBhcnNlZCBpcyByZXR1cm5lZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCitpbnQgRXhVdGlsR2V0SW50cyhjb25zdCBjaGFyKiB2LCBpbnQgYmFzZSwgaW50IG1heF9vdXRwdXQsIGludCBvdXRwdXRbXSk7CisKKy8vIFJlYWRzIGEgZmlsZSBuYW1lZCAnZmlsZW5hbWUnIGludG8gYSBXZWJQRGF0YSBzdHJ1Y3R1cmUuIFRoZSBjb250ZW50IG9mCisvLyB3ZWJwX2RhdGEgaXMgb3ZlcndyaXR0ZW4uIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbWFuZC1saW5lIGFyZ3VtZW50cworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBhcmdjXzsKKyAgY29uc3QgY2hhcioqIGFyZ3ZfOworICBXZWJQRGF0YSBhcmd2X2RhdGFfOworICBpbnQgb3duX2FyZ3ZfOworfSBDb21tYW5kTGluZUFyZ3VtZW50czsKKworLy8gSW5pdGlhbGl6ZXMgdGhlIHN0cnVjdHVyZSBmcm9tIHRoZSBjb21tYW5kLWxpbmUgcGFyYW1ldGVycy4gSWYgdGhlcmUgaXMKKy8vIG9ubHkgb25lIHBhcmFtZXRlciBhbmQgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhICctJywgdGhlbiBpdCBpcyBhc3N1bWVkIHRvCisvLyBiZSBhIGZpbGUgbmFtZS4gVGhpcyBmaWxlIHdpbGwgYmUgcmVhZCBhbmQgdG9rZW5pemVkIGludG8gY29tbWFuZC1saW5lCisvLyBhcmd1bWVudHMuIFRoZSBjb250ZW50IG9mICdhcmdzJyBpcyBvdmVyd3JpdHRlbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAobWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgbm9uCisvLyBleGlzdGluZyBmaWxlLCB0b28gbWFueSBhcmd1bWVudHMsIC4uLikuCitpbnQgRXhVdGlsSW5pdENvbW1hbmRMaW5lQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzKTsKKworLy8gRGVhbGxvY2F0ZSBhbGwgbWVtb3J5IGFuZCByZXNldCAnYXJncycuCit2b2lkIEV4VXRpbERlbGV0ZUNvbW1hbmRMaW5lQXJndW1lbnRzKENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRVhBTVBMRVNfRVhBTVBMRV9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWYyd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmMndlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFmMjczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmMndlYnAuYwpAQCAtMCwwICsxLDYwNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBzaW1wbGUgdG9vbCB0byBjb252ZXJ0IGFuaW1hdGVkIEdJRnMgdG8gV2ViUAorLy8KKy8vIEF1dGhvcnM6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorLy8gICAgICAgICAgVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0VCUF9IQVZFX0dJRgorCisjaWYgZGVmaW5lZChIQVZFX1VOSVNURF9IKSAmJiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdpZl9saWIuaD4KKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIndlYnAvbXV4LmgiCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL2dpZmRlYy5oIgorCisjaWYgIWRlZmluZWQoU1RESU5fRklMRU5PKQorI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgdHJhbnNwYXJlbnRfaW5kZXggPSBHSUZfSU5ERVhfSU5WQUxJRDsgIC8vIE9wYXF1ZSBieSBkZWZhdWx0LgorCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Vycm9yTWVzc2FnZXNbLVdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSArIDFdID0geworICAiV0VCUF9NVVhfTk9UX0ZPVU5EIiwgIldFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQiLCAiV0VCUF9NVVhfQkFEX0RBVEEiLAorICAiV0VCUF9NVVhfTUVNT1JZX0VSUk9SIiwgIldFQlBfTVVYX05PVF9FTk9VR0hfREFUQSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBFcnJvclN0cmluZyhXZWJQTXV4RXJyb3IgZXJyKSB7CisgIGFzc2VydChlcnIgPD0gV0VCUF9NVVhfTk9UX0ZPVU5EICYmIGVyciA+PSBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEpOworICByZXR1cm4ga0Vycm9yTWVzc2FnZXNbLWVycl07Cit9CisKK2VudW0geworICBNRVRBREFUQV9JQ0MgID0gKDEgPDwgMCksCisgIE1FVEFEQVRBX1hNUCAgPSAoMSA8PCAxKSwKKyAgTUVUQURBVEFfQUxMICA9IE1FVEFEQVRBX0lDQyB8IE1FVEFEQVRBX1hNUAorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6XG4iKTsKKyAgcHJpbnRmKCIgZ2lmMndlYnAgW29wdGlvbnNdIGdpZl9maWxlIC1vIHdlYnBfZmlsZVxuIik7CisgIHByaW50ZigiT3B0aW9uczpcbiIpOworICBwcmludGYoIiAgLWggLyAtaGVscCAuLi4uLi4uLi4uLi4uIHRoaXMgaGVscFxuIik7CisgIHByaW50ZigiICAtbG9zc3kgLi4uLi4uLi4uLi4uLi4uLi4gZW5jb2RlIGltYWdlIHVzaW5nIGxvc3N5IGNvbXByZXNzaW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1taXhlZCAuLi4uLi4uLi4uLi4uLi4uLiBmb3IgZWFjaCBmcmFtZSBpbiB0aGUgaW1hZ2UsIHBpY2sgbG9zc3lcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBoZXVyaXN0aWNhbGx5XG4iKTsKKyAgcHJpbnRmKCIgIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4uLiBxdWFsaXR5IGZhY3RvciAoMDpzbWFsbC4uMTAwOmJpZylcbiIpOworICBwcmludGYoIiAgLW0gPGludD4gLi4uLi4uLi4uLi4uLi4uIGNvbXByZXNzaW9uIG1ldGhvZCAoMD1mYXN0LCA2PXNsb3dlc3QpXG4iKTsKKyAgcHJpbnRmKCIgIC1taW5fc2l6ZSAuLi4uLi4uLi4uLi4uLiBtaW5pbWl6ZSBvdXRwdXQgc2l6ZSAoZGVmYXVsdDpvZmYpXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc2xlc3MgY29tcHJlc3Npb24gYnkgZGVmYXVsdDsgY2FuIGJlXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQgd2l0aCAtcSwgLW0sIC1sb3NzeSBvciAtbWl4ZWRcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXG4iKTsKKyAgcHJpbnRmKCIgIC1rbWluIDxpbnQ+IC4uLi4uLi4uLi4uLiBtaW4gZGlzdGFuY2UgYmV0d2VlbiBrZXkgZnJhbWVzXG4iKTsKKyAgcHJpbnRmKCIgIC1rbWF4IDxpbnQ+IC4uLi4uLi4uLi4uLiBtYXggZGlzdGFuY2UgYmV0d2VlbiBrZXkgZnJhbWVzXG4iKTsKKyAgcHJpbnRmKCIgIC1mIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBmaWx0ZXIgc3RyZW5ndGggKDA9b2ZmLi4xMDApXG4iKTsKKyAgcHJpbnRmKCIgIC1tZXRhZGF0YSA8c3RyaW5nPiAuLi4uLiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0b1xuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisgIHByaW50ZigiY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmIHByZXNlbnRcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOworICBwcmludGYoIlZhbGlkIHZhbHVlczogYWxsLCBub25lLCBpY2MsIHhtcCAoZGVmYXVsdClcbiIpOworICBwcmludGYoIiAgLWxvb3BfY29tcGF0aWJpbGl0eSAuLi4uIHVzZSBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIENocm9tZVxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBwcmlvciB0byBNNjIgKGluY2x1c2l2ZSlcbiIpOworICBwcmludGYoIiAgLW10IC4uLi4uLi4uLi4uLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcgaWYgYXZhaWxhYmxlXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIiAgLXZlcnNpb24gLi4uLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKKyAgcHJpbnRmKCIgIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlXG4iKTsKKyAgcHJpbnRmKCIgIC1xdWlldCAuLi4uLi4uLi4uLi4uLi4uLiBkb24ndCBwcmludCBhbnl0aGluZ1xuIik7CisgIHByaW50ZigiXG4iKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgdmVyYm9zZSA9IDA7CisgIGludCBnaWZfZXJyb3IgPSBHSUZfRVJST1I7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9PSzsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgY2hhciAqaW5fZmlsZSA9IE5VTEwsICpvdXRfZmlsZSA9IE5VTEw7CisgIEZJTEUqIG91dCA9IE5VTEw7CisgIEdpZkZpbGVUeXBlKiBnaWYgPSBOVUxMOworICBpbnQgZnJhbWVfZHVyYXRpb24gPSAwOworICBpbnQgZnJhbWVfdGltZXN0YW1wID0gMDsKKyAgR0lGRGlzcG9zZU1ldGhvZCBvcmlnX2Rpc3Bvc2UgPSBHSUZfRElTUE9TRV9OT05FOworCisgIFdlYlBQaWN0dXJlIGZyYW1lOyAgICAgICAgICAgICAgICAvLyBGcmFtZSByZWN0YW5nbGUgb25seSAobm90IGRpc3Bvc2VkKS4KKyAgV2ViUFBpY3R1cmUgY3Vycl9jYW52YXM7ICAgICAgICAgIC8vIE5vdCBkaXNwb3NlZC4KKyAgV2ViUFBpY3R1cmUgcHJldl9jYW52YXM7ICAgICAgICAgIC8vIERpc3Bvc2VkLgorCisgIFdlYlBBbmltRW5jb2RlciogZW5jID0gTlVMTDsKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBlbmNfb3B0aW9uczsKKyAgV2ViUENvbmZpZyBjb25maWc7CisKKyAgaW50IGZyYW1lX251bWJlciA9IDA7ICAgICAvLyBXaGV0aGVyIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBmaXJzdCBmcmFtZS4KKyAgaW50IGRvbmU7CisgIGludCBjOworICBpbnQgcXVpZXQgPSAwOworICBXZWJQRGF0YSB3ZWJwX2RhdGE7CisKKyAgaW50IGtlZXBfbWV0YWRhdGEgPSBNRVRBREFUQV9YTVA7ICAvLyBJQ0Mgbm90IG91dHB1dCBieSBkZWZhdWx0LgorICBXZWJQRGF0YSBpY2NfZGF0YTsKKyAgaW50IHN0b3JlZF9pY2MgPSAwOyAgICAgICAgIC8vIFdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IHN0b3JlZCBhbiBJQ0MgcHJvZmlsZS4KKyAgV2ViUERhdGEgeG1wX2RhdGE7CisgIGludCBzdG9yZWRfeG1wID0gMDsgICAgICAgICAvLyBXaGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBzdG9yZWQgYW4gWE1QIHByb2ZpbGUuCisgIGludCBsb29wX2NvdW50ID0gMDsgICAgICAgICAvLyBkZWZhdWx0OiBpbmZpbml0ZQorICBpbnQgc3RvcmVkX2xvb3BfY291bnQgPSAwOyAgLy8gV2hldGhlciB3ZSBoYXZlIGZvdW5kIGFuIGV4cGxpY2l0IGxvb3AgY291bnQuCisgIGludCBsb29wX2NvbXBhdGliaWxpdHkgPSAwOworICBXZWJQTXV4KiBtdXggPSBOVUxMOworCisgIGludCBkZWZhdWx0X2ttaW4gPSAxOyAgLy8gV2hldGhlciB0byB1c2UgZGVmYXVsdCBrbWluIHZhbHVlLgorICBpbnQgZGVmYXVsdF9rbWF4ID0gMTsKKworICBpZiAoIVdlYlBDb25maWdJbml0KCZjb25maWcpIHx8ICFXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdCgmZW5jX29wdGlvbnMpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZmcmFtZSkgfHwgIVdlYlBQaWN0dXJlSW5pdCgmY3Vycl9jYW52YXMpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZwcmV2X2NhbnZhcykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBWZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbmZpZy5sb3NzbGVzcyA9IDE7ICAvLyBVc2UgbG9zc2xlc3MgY29tcHJlc3Npb24gYnkgZGVmYXVsdC4KKworICBXZWJQRGF0YUluaXQoJndlYnBfZGF0YSk7CisgIFdlYlBEYXRhSW5pdCgmaWNjX2RhdGEpOworICBXZWJQRGF0YUluaXQoJnhtcF9kYXRhKTsKKworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgSGVscCgpOworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgb3V0X2ZpbGUgPSBhcmd2WysrY107CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9zc3kiKSkgeworICAgICAgY29uZmlnLmxvc3NsZXNzID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1taXhlZCIpKSB7CisgICAgICBlbmNfb3B0aW9ucy5hbGxvd19taXhlZCA9IDE7CisgICAgICBjb25maWcubG9zc2xlc3MgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvb3BfY29tcGF0aWJpbGl0eSIpKSB7CisgICAgICBsb29wX2NvbXBhdGliaWxpdHkgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXEiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5xdWFsaXR5ID0gRXhVdGlsR2V0RmxvYXQoYXJndlsrK2NdLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW0iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5tZXRob2QgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1pbl9zaXplIikpIHsKKyAgICAgIGVuY19vcHRpb25zLm1pbmltaXplX3NpemUgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWttYXgiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGVuY19vcHRpb25zLmttYXggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgZGVmYXVsdF9rbWF4ID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1rbWluIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBlbmNfb3B0aW9ucy5rbWluID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGRlZmF1bHRfa21pbiA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZiIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLmZpbHRlcl9zdHJlbmd0aCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWV0YWRhdGEiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBvcHRpb247CisgICAgICAgIGludCBmbGFnOworICAgICAgfSBrVG9rZW5zW10gPSB7CisgICAgICAgIHsgImFsbCIsICBNRVRBREFUQV9BTEwgfSwKKyAgICAgICAgeyAibm9uZSIsIDAgfSwKKyAgICAgICAgeyAiaWNjIiwgIE1FVEFEQVRBX0lDQyB9LAorICAgICAgICB7ICJ4bXAiLCAgTUVUQURBVEFfWE1QIH0sCisgICAgICB9OworICAgICAgY29uc3Qgc2l6ZV90IGtOdW1Ub2tlbnMgPSBzaXplb2Yoa1Rva2VucykgLyBzaXplb2YoKmtUb2tlbnMpOworICAgICAgY29uc3QgY2hhciogc3RhcnQgPSBhcmd2WysrY107CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisKKyAgICAgIGtlZXBfbWV0YWRhdGEgPSAwOworICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBjb25zdCBjaGFyKiB0b2tlbiA9IHN0cmNocihzdGFydCwgJywnKTsKKyAgICAgICAgaWYgKHRva2VuID09IE5VTEwpIHRva2VuID0gZW5kOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtVG9rZW5zOyArK2kpIHsKKyAgICAgICAgICBpZiAoKHNpemVfdCkodG9rZW4gLSBzdGFydCkgPT0gc3RybGVuKGtUb2tlbnNbaV0ub3B0aW9uKSAmJgorICAgICAgICAgICAgICAhc3RybmNtcChzdGFydCwga1Rva2Vuc1tpXS5vcHRpb24sIHN0cmxlbihrVG9rZW5zW2ldLm9wdGlvbikpKSB7CisgICAgICAgICAgICBpZiAoa1Rva2Vuc1tpXS5mbGFnICE9IDApIHsKKyAgICAgICAgICAgICAga2VlcF9tZXRhZGF0YSB8PSBrVG9rZW5zW2ldLmZsYWc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBrZWVwX21ldGFkYXRhID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSBrTnVtVG9rZW5zKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5rbm93biBtZXRhZGF0YSB0eXBlICclLipzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpKHRva2VuIC0gc3RhcnQpLCBzdGFydCk7CisgICAgICAgICAgSGVscCgpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IHRva2VuICsgMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tdCIpKSB7CisgICAgICArK2NvbmZpZy50aHJlYWRfbGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBjb25zdCBpbnQgZW5jX3ZlcnNpb24gPSBXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAgICAgIGNvbnN0IGludCBtdXhfdmVyc2lvbiA9IFdlYlBHZXRNdXhWZXJzaW9uKCk7CisgICAgICBwcmludGYoIldlYlAgRW5jb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuV2ViUCBNdXggdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKGVuY192ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChlbmNfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgZW5jX3ZlcnNpb24gJiAweGZmLCAobXV4X3ZlcnNpb24gPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAobXV4X3ZlcnNpb24gPj4gOCkgJiAweGZmLCBtdXhfdmVyc2lvbiAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcXVpZXQiKSkgeworICAgICAgcXVpZXQgPSAxOworICAgICAgZW5jX29wdGlvbnMudmVyYm9zZSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdiIpKSB7CisgICAgICB2ZXJib3NlID0gMTsKKyAgICAgIGVuY19vcHRpb25zLnZlcmJvc2UgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLS0iKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgaW5fZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYXJndltjXVswXSA9PSAnLScpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVua25vd24gb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICBpbl9maWxlID0gYXJndltjXTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICAvLyBBcHByb3ByaWF0ZSBkZWZhdWx0IGttaW4sIGttYXggdmFsdWVzIGZvciBsb3NzeSBhbmQgbG9zc2xlc3MuCisgIGlmIChkZWZhdWx0X2ttaW4pIHsKKyAgICBlbmNfb3B0aW9ucy5rbWluID0gY29uZmlnLmxvc3NsZXNzID8gOSA6IDM7CisgIH0KKyAgaWYgKGRlZmF1bHRfa21heCkgeworICAgIGVuY19vcHRpb25zLmttYXggPSBjb25maWcubG9zc2xlc3MgPyAxNyA6IDU7CisgIH0KKworICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZygmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIEludmFsaWQgY29uZmlndXJhdGlvbi5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKGluX2ZpbGUgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQhXG4iKTsKKyAgICBIZWxwKCk7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBTdGFydCB0aGUgZGVjb2RlciBvYmplY3QKKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDUsMCkKKyAgZ2lmID0gIXN0cmNtcChpbl9maWxlLCAiLSIpID8gREdpZk9wZW5GaWxlSGFuZGxlKFNURElOX0ZJTEVOTywgJmdpZl9lcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogREdpZk9wZW5GaWxlTmFtZShpbl9maWxlLCAmZ2lmX2Vycm9yKTsKKyNlbHNlCisgIGdpZiA9ICFzdHJjbXAoaW5fZmlsZSwgIi0iKSA/IERHaWZPcGVuRmlsZUhhbmRsZShTVERJTl9GSUxFTk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERHaWZPcGVuRmlsZU5hbWUoaW5fZmlsZSk7CisjZW5kaWYKKyAgaWYgKGdpZiA9PSBOVUxMKSBnb3RvIEVuZDsKKworICAvLyBMb29wIG92ZXIgR0lGIGltYWdlcworICBkb25lID0gMDsKKyAgZG8geworICAgIEdpZlJlY29yZFR5cGUgdHlwZTsKKyAgICBpZiAoREdpZkdldFJlY29yZFR5cGUoZ2lmLCAmdHlwZSkgPT0gR0lGX0VSUk9SKSBnb3RvIEVuZDsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBJTUFHRV9ERVNDX1JFQ09SRF9UWVBFOiB7CisgICAgICAgIEdJRkZyYW1lUmVjdCBnaWZfcmVjdDsKKyAgICAgICAgR2lmSW1hZ2VEZXNjKiBjb25zdCBpbWFnZV9kZXNjID0gJmdpZi0+SW1hZ2U7CisKKyAgICAgICAgaWYgKCFER2lmR2V0SW1hZ2VEZXNjKGdpZikpIGdvdG8gRW5kOworCisgICAgICAgIGlmIChmcmFtZV9udW1iZXIgPT0gMCkgeworICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBwcmludGYoIkNhbnZhcyBzY3JlZW46ICVkIHggJWRcbiIsIGdpZi0+U1dpZHRoLCBnaWYtPlNIZWlnaHQpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBGaXggc29tZSBicm9rZW4gR0lGIGdsb2JhbCBoZWFkZXJzIHRoYXQgcmVwb3J0CisgICAgICAgICAgLy8gMCB4IDAgc2NyZWVuIGRpbWVuc2lvbi4KKyAgICAgICAgICBpZiAoZ2lmLT5TV2lkdGggPT0gMCB8fCBnaWYtPlNIZWlnaHQgPT0gMCkgeworICAgICAgICAgICAgaW1hZ2VfZGVzYy0+TGVmdCA9IDA7CisgICAgICAgICAgICBpbWFnZV9kZXNjLT5Ub3AgPSAwOworICAgICAgICAgICAgZ2lmLT5TV2lkdGggPSBpbWFnZV9kZXNjLT5XaWR0aDsKKyAgICAgICAgICAgIGdpZi0+U0hlaWdodCA9IGltYWdlX2Rlc2MtPkhlaWdodDsKKyAgICAgICAgICAgIGlmIChnaWYtPlNXaWR0aCA8PSAwIHx8IGdpZi0+U0hlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJGaXhlZCBjYW52YXMgc2NyZWVuIGRpbWVuc2lvbiB0bzogJWQgeCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGdpZi0+U1dpZHRoLCBnaWYtPlNIZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBBbGxvY2F0ZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAgICAgICBmcmFtZS53aWR0aCA9IGdpZi0+U1dpZHRoOworICAgICAgICAgIGZyYW1lLmhlaWdodCA9IGdpZi0+U0hlaWdodDsKKyAgICAgICAgICBmcmFtZS51c2VfYXJnYiA9IDE7CisgICAgICAgICAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZmcmFtZSkpIGdvdG8gRW5kOworICAgICAgICAgIEdJRkNsZWFyUGljKCZmcmFtZSwgTlVMTCk7CisgICAgICAgICAgV2ViUFBpY3R1cmVDb3B5KCZmcmFtZSwgJmN1cnJfY2FudmFzKTsKKyAgICAgICAgICBXZWJQUGljdHVyZUNvcHkoJmZyYW1lLCAmcHJldl9jYW52YXMpOworCisgICAgICAgICAgLy8gQmFja2dyb3VuZCBjb2xvci4KKyAgICAgICAgICBHSUZHZXRCYWNrZ3JvdW5kQ29sb3IoZ2lmLT5TQ29sb3JNYXAsIGdpZi0+U0JhY2tHcm91bmRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNfb3B0aW9ucy5hbmltX3BhcmFtcy5iZ2NvbG9yKTsKKworICAgICAgICAgIC8vIEluaXRpYWxpemUgZW5jb2Rlci4KKyAgICAgICAgICBlbmMgPSBXZWJQQW5pbUVuY29kZXJOZXcoY3Vycl9jYW52YXMud2lkdGgsIGN1cnJfY2FudmFzLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY19vcHRpb25zKTsKKyAgICAgICAgICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IhIENvdWxkIG5vdCBjcmVhdGUgZW5jb2RlciBvYmplY3QuIFBvc3NpYmx5IGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICJhIG1lbW9yeSBlcnJvci5cbiIpOworICAgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU29tZSBldmVuIG1vcmUgYnJva2VuIEdJRiBjYW4gaGF2ZSBzdWItcmVjdCB3aXRoIHplcm8gd2lkdGgvaGVpZ2h0LgorICAgICAgICBpZiAoaW1hZ2VfZGVzYy0+V2lkdGggPT0gMCB8fCBpbWFnZV9kZXNjLT5IZWlnaHQgPT0gMCkgeworICAgICAgICAgIGltYWdlX2Rlc2MtPldpZHRoID0gZ2lmLT5TV2lkdGg7CisgICAgICAgICAgaW1hZ2VfZGVzYy0+SGVpZ2h0ID0gZ2lmLT5TSGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHSUZSZWFkRnJhbWUoZ2lmLCB0cmFuc3BhcmVudF9pbmRleCwgJmdpZl9yZWN0LCAmZnJhbWUpKSB7CisgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gQmxlbmQgZnJhbWUgcmVjdGFuZ2xlIHdpdGggcHJldmlvdXMgY2FudmFzIHRvIGNvbXBvc2UgZnVsbCBjYW52YXMuCisgICAgICAgIC8vIE5vdGUgdGhhdCAnY3Vycl9jYW52YXMnIGlzIHNhbWUgYXMgJ3ByZXZfY2FudmFzJyBhdCB0aGlzIHBvaW50LgorICAgICAgICBHSUZCbGVuZEZyYW1lcygmZnJhbWUsICZnaWZfcmVjdCwgJmN1cnJfY2FudmFzKTsKKworICAgICAgICBpZiAoIVdlYlBBbmltRW5jb2RlckFkZChlbmMsICZjdXJyX2NhbnZhcywgZnJhbWVfdGltZXN0YW1wLCAmY29uZmlnKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgYWRkaW5nIGZyYW1lICMlZDogJXNcbiIsIGZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICAgIFdlYlBBbmltRW5jb2RlckdldEVycm9yKGVuYykpOworICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsrZnJhbWVfbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIGNhbnZhc2VzLgorICAgICAgICBHSUZEaXNwb3NlRnJhbWUob3JpZ19kaXNwb3NlLCAmZ2lmX3JlY3QsICZwcmV2X2NhbnZhcywgJmN1cnJfY2FudmFzKTsKKyAgICAgICAgR0lGQ29weVBpeGVscygmY3Vycl9jYW52YXMsICZwcmV2X2NhbnZhcyk7CisKKyAgICAgICAgLy8gRm9yY2UgZnJhbWVzIHdpdGggYSBzbWFsbCBvciBubyBkdXJhdGlvbiB0byAxMDBtcyB0byBiZSBjb25zaXN0ZW50CisgICAgICAgIC8vIHdpdGggd2ViIGJyb3dzZXJzIGFuZCBvdGhlciB0cmFuc2NvZGluZyB0b29scy4gVGhpcyBhbHNvIGF2b2lkcworICAgICAgICAvLyBpbmNvcnJlY3QgZHVyYXRpb25zIGJldHdlZW4gZnJhbWVzIHdoZW4gcGFkZGluZyBmcmFtZXMgYXJlCisgICAgICAgIC8vIGRpc2NhcmRlZC4KKyAgICAgICAgaWYgKGZyYW1lX2R1cmF0aW9uIDw9IDEwKSB7CisgICAgICAgICAgZnJhbWVfZHVyYXRpb24gPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgdGltZXN0YW1wIChmb3IgbmV4dCBmcmFtZSkuCisgICAgICAgIGZyYW1lX3RpbWVzdGFtcCArPSBmcmFtZV9kdXJhdGlvbjsKKworICAgICAgICAvLyBJbiBHSUYsIGdyYXBoaWMgY29udHJvbCBleHRlbnNpb25zIGFyZSBvcHRpb25hbCBmb3IgYSBmcmFtZSwgc28gd2UKKyAgICAgICAgLy8gbWF5IG5vdCBnZXQgb25lIGJlZm9yZSByZWFkaW5nIHRoZSBuZXh0IGZyYW1lLiBUbyBoYW5kbGUgdGhpcyBjYXNlLAorICAgICAgICAvLyB3ZSByZXNldCBmcmFtZSBwcm9wZXJ0aWVzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICBvcmlnX2Rpc3Bvc2UgPSBHSUZfRElTUE9TRV9OT05FOworICAgICAgICBmcmFtZV9kdXJhdGlvbiA9IDA7CisgICAgICAgIHRyYW5zcGFyZW50X2luZGV4ID0gR0lGX0lOREVYX0lOVkFMSUQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBFWFRFTlNJT05fUkVDT1JEX1RZUEU6IHsKKyAgICAgICAgaW50IGV4dGVuc2lvbjsKKyAgICAgICAgR2lmQnl0ZVR5cGUgKmRhdGEgPSBOVUxMOworICAgICAgICBpZiAoREdpZkdldEV4dGVuc2lvbihnaWYsICZleHRlbnNpb24sICZkYXRhKSA9PSBHSUZfRVJST1IpIHsKKyAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSBjb250aW51ZTsKKworICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbikgeworICAgICAgICAgIGNhc2UgQ09NTUVOVF9FWFRfRlVOQ19DT0RFOiB7CisgICAgICAgICAgICBicmVhazsgIC8vIERvIG5vdGhpbmcgZm9yIG5vdy4KKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHUkFQSElDU19FWFRfRlVOQ19DT0RFOiB7CisgICAgICAgICAgICBpZiAoIUdJRlJlYWRHcmFwaGljc0V4dGVuc2lvbihkYXRhLCAmZnJhbWVfZHVyYXRpb24sICZvcmlnX2Rpc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwYXJlbnRfaW5kZXgpKSB7CisgICAgICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgUExBSU5URVhUX0VYVF9GVU5DX0NPREU6IHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEFQUExJQ0FUSU9OX0VYVF9GVU5DX0NPREU6IHsKKyAgICAgICAgICAgIGlmIChkYXRhWzBdICE9IDExKSBicmVhazsgICAgLy8gQ2h1bmsgaXMgdG9vIHNob3J0CisgICAgICAgICAgICBpZiAoIW1lbWNtcChkYXRhICsgMSwgIk5FVFNDQVBFMi4wIiwgMTEpIHx8CisgICAgICAgICAgICAgICAgIW1lbWNtcChkYXRhICsgMSwgIkFOSU1FWFRTMS4wIiwgMTEpKSB7CisgICAgICAgICAgICAgIGlmICghR0lGUmVhZExvb3BDb3VudChnaWYsICZkYXRhLCAmbG9vcF9jb3VudCkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTG9vcCBjb3VudDogJWRcbiIsIGxvb3BfY291bnQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0b3JlZF9sb29wX2NvdW50ID0gbG9vcF9jb21wYXRpYmlsaXR5ID8gKGxvb3BfY291bnQgIT0gMCkgOiAxOworICAgICAgICAgICAgfSBlbHNlIHsgIC8vIEFuIGV4dGVuc2lvbiBjb250YWluaW5nIG1ldGFkYXRhLgorICAgICAgICAgICAgICAvLyBXZSBvbmx5IHN0b3JlIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBjaHVuayBvZiBlYWNoIHR5cGUsIGFuZAorICAgICAgICAgICAgICAvLyBvbmx5IGlmIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgY29uc3QgaW50IGlzX3htcCA9IChrZWVwX21ldGFkYXRhICYgTUVUQURBVEFfWE1QKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0b3JlZF94bXAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtZW1jbXAoZGF0YSArIDEsICJYTVAgRGF0YVhNUCIsIDExKTsKKyAgICAgICAgICAgICAgY29uc3QgaW50IGlzX2ljYyA9IChrZWVwX21ldGFkYXRhICYgTUVUQURBVEFfSUNDKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0b3JlZF9pY2MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtZW1jbXAoZGF0YSArIDEsICJJQ0NSR0JHMTAxMiIsIDExKTsKKyAgICAgICAgICAgICAgaWYgKGlzX3htcCB8fCBpc19pY2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUdJRlJlYWRNZXRhZGF0YShnaWYsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3htcCA/ICZ4bXBfZGF0YSA6ICZpY2NfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNfaWNjKSB7CisgICAgICAgICAgICAgICAgICBzdG9yZWRfaWNjID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3htcCkgeworICAgICAgICAgICAgICAgICAgc3RvcmVkX3htcCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgYnJlYWs7ICAvLyBza2lwCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoREdpZkdldEV4dGVuc2lvbk5leHQoZ2lmLCAmZGF0YSkgPT0gR0lGX0VSUk9SKSBnb3RvIEVuZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVEVSTUlOQVRFX1JFQ09SRF9UWVBFOiB7CisgICAgICAgIGRvbmUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNraXBwaW5nIG92ZXIgdW5rbm93biByZWNvcmQgdHlwZSAlZFxuIiwgdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlICghZG9uZSk7CisKKyAgLy8gTGFzdCBOVUxMIGZyYW1lLgorICBpZiAoIVdlYlBBbmltRW5jb2RlckFkZChlbmMsIE5VTEwsIGZyYW1lX3RpbWVzdGFtcCwgTlVMTCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZsdXNoaW5nIFdlYlAgbXV4ZXIuXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihlbmMpKTsKKyAgfQorCisgIGlmICghV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoZW5jLCAmd2VicF9kYXRhKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIFdlYlBBbmltRW5jb2RlckdldEVycm9yKGVuYykpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKCFsb29wX2NvbXBhdGliaWxpdHkpIHsKKyAgICBpZiAoIXN0b3JlZF9sb29wX2NvdW50KSB7CisgICAgICAvLyBpZiBubyBsb29wLWNvdW50IGVsZW1lbnQgaXMgc2VlbiwgdGhlIGRlZmF1bHQgaXMgJzEnIChsb29wLW9uY2UpCisgICAgICAvLyBhbmQgd2UgbmVlZCB0byBzaWduYWwgaXQgZXhwbGljaXRseSBpbiBXZWJQLiBOb3RlIGhvd2V2ZXIgdGhhdAorICAgICAgLy8gaW4gY2FzZSB0aGVyZSdzIGEgc2luZ2xlIGZyYW1lLCB3ZSBzdGlsbCBkb24ndCBuZWVkIHRvIHN0b3JlIGl0LgorICAgICAgaWYgKGZyYW1lX251bWJlciA+IDEpIHsKKyAgICAgICAgc3RvcmVkX2xvb3BfY291bnQgPSAxOworICAgICAgICBsb29wX2NvdW50ID0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxvb3BfY291bnQgPiAwKSB7CisgICAgICAvLyBhZGFwdCBHSUYncyBzZW1hbnRpYyB0byBXZWJQJ3MgKGV4Y2VwdCBpbiB0aGUgaW5maW5pdGUtbG9vcCBjYXNlKQorICAgICAgbG9vcF9jb3VudCArPSAxOworICAgIH0KKyAgfQorICAvLyBsb29wX2NvdW50IG9mIDAgaXMgdGhlIGRlZmF1bHQgKGluZmluaXRlKSwgc28gbm8gbmVlZCB0byBzaWduYWwgaXQKKyAgaWYgKGxvb3BfY291bnQgPT0gMCkgc3RvcmVkX2xvb3BfY291bnQgPSAwOworCisgIGlmIChzdG9yZWRfbG9vcF9jb3VudCB8fCBzdG9yZWRfaWNjIHx8IHN0b3JlZF94bXApIHsKKyAgICAvLyBSZS1tdXggdG8gYWRkIGxvb3AgY291bnQgYW5kL29yIG1ldGFkYXRhIGFzIG5lZWRlZC4KKyAgICBtdXggPSBXZWJQTXV4Q3JlYXRlKCZ3ZWJwX2RhdGEsIDEpOworICAgIGlmIChtdXggPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ291bGQgbm90IHJlLW11eCB0byBhZGQgbG9vcCBjb3VudC9tZXRhZGF0YS5cbiIpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisKKyAgICBpZiAoc3RvcmVkX2xvb3BfY291bnQpIHsgIC8vIFVwZGF0ZSBsb29wIGNvdW50LgorICAgICAgV2ViUE11eEFuaW1QYXJhbXMgbmV3X3BhcmFtczsKKyAgICAgIGVyciA9IFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMobXV4LCAmbmV3X3BhcmFtcyk7CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgKCVzKTogQ291bGQgbm90IGZldGNoIGxvb3AgY291bnQuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVycikpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICAgIG5ld19wYXJhbXMubG9vcF9jb3VudCA9IGxvb3BfY291bnQ7CisgICAgICBlcnIgPSBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJm5ld19wYXJhbXMpOworICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SICglcyk6IENvdWxkIG5vdCB1cGRhdGUgbG9vcCBjb3VudC5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdG9yZWRfaWNjKSB7ICAgLy8gQWRkIElDQ1AgY2h1bmsuCisgICAgICBlcnIgPSBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfZGF0YSwgMSk7CisgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklDQyBzaXplOiAlZFxuIiwgKGludClpY2NfZGF0YS5zaXplKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoJXMpOiBDb3VsZCBub3Qgc2V0IElDQyBjaHVuay5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdG9yZWRfeG1wKSB7ICAgLy8gQWRkIFhNUCBjaHVuay4KKyAgICAgIGVyciA9IFdlYlBNdXhTZXRDaHVuayhtdXgsICJYTVAgIiwgJnhtcF9kYXRhLCAxKTsKKyAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWE1QIHNpemU6ICVkXG4iLCAoaW50KXhtcF9kYXRhLnNpemUpOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SICglcyk6IENvdWxkIG5vdCBzZXQgWE1QIGNodW5rLlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgfQorCisgICAgZXJyID0gV2ViUE11eEFzc2VtYmxlKG11eCwgJndlYnBfZGF0YSk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoJXMpOiBDb3VsZCBub3QgYXNzZW1ibGUgd2hlbiByZS1tdXhpbmcgdG8gYWRkICIKKyAgICAgICAgICAgICAgImxvb3AgY291bnQvbWV0YWRhdGEuXG4iLCBFcnJvclN0cmluZyhlcnIpKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgfQorCisgIGlmIChvdXRfZmlsZSAhPSBOVUxMKSB7CisgICAgaWYgKCFJbWdJb1V0aWxXcml0ZUZpbGUob3V0X2ZpbGUsIHdlYnBfZGF0YS5ieXRlcywgd2VicF9kYXRhLnNpemUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgb3V0cHV0IGZpbGU6ICVzXG4iLCBvdXRfZmlsZSk7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgaWYgKCFxdWlldCkgeworICAgICAgaWYgKCFzdHJjbXAob3V0X2ZpbGUsICItIikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZCAlZCBieXRlcyB0byBTVERJT1xuIiwKKyAgICAgICAgICAgICAgICAoaW50KXdlYnBfZGF0YS5zaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2F2ZWQgb3V0cHV0IGZpbGUgKCVkIGJ5dGVzKTogJXNcbiIsCisgICAgICAgICAgICAgICAgKGludCl3ZWJwX2RhdGEuc2l6ZSwgb3V0X2ZpbGUpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdGhpbmcgd3JpdHRlbjsgdXNlIC1vIGZsYWcgdG8gc2F2ZSB0aGUgcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgICAiKCVkIGJ5dGVzKS5cbiIsIChpbnQpd2VicF9kYXRhLnNpemUpOworICAgIH0KKyAgfQorCisgIC8vIEFsbCBPSy4KKyAgb2sgPSAxOworICBnaWZfZXJyb3IgPSBHSUZfT0s7CisKKyBFbmQ6CisgIFdlYlBEYXRhQ2xlYXIoJmljY19kYXRhKTsKKyAgV2ViUERhdGFDbGVhcigmeG1wX2RhdGEpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisgIFdlYlBQaWN0dXJlRnJlZSgmZnJhbWUpOworICBXZWJQUGljdHVyZUZyZWUoJmN1cnJfY2FudmFzKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwcmV2X2NhbnZhcyk7CisgIFdlYlBBbmltRW5jb2RlckRlbGV0ZShlbmMpOworICBpZiAob3V0ICE9IE5VTEwgJiYgb3V0X2ZpbGUgIT0gTlVMTCkgZmNsb3NlKG91dCk7CisKKyAgaWYgKGdpZl9lcnJvciAhPSBHSUZfT0spIHsKKyAgICBHSUZEaXNwbGF5RXJyb3IoZ2lmLCBnaWZfZXJyb3IpOworICB9CisgIGlmIChnaWYgIT0gTlVMTCkgeworI2lmIExPQ0FMX0dJRl9QUkVSRVEoNSwxKQorICAgIERHaWZDbG9zZUZpbGUoZ2lmLCAmZ2lmX2Vycm9yKTsKKyNlbHNlCisgICAgREdpZkNsb3NlRmlsZShnaWYpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gIW9rOworfQorCisjZWxzZSAgLy8gIVdFQlBfSEFWRV9HSUYKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBzdXBwb3J0IG5vdCBlbmFibGVkIGluICVzLlxuIiwgYXJndlswXSk7CisgICh2b2lkKWFyZ2M7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxOTM1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5jCkBAIC0wLDAgKzEsNDE2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gR0lGIGRlY29kZS4KKworI2luY2x1ZGUgIi4vZ2lmZGVjLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgV0VCUF9IQVZFX0dJRgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL211eF90eXBlcy5oIgorCisjZGVmaW5lIEdJRl9UUkFOU1BBUkVOVF9DT0xPUiAweDAwMDAwMDAwdQorI2RlZmluZSBHSUZfV0hJVEVfQ09MT1IgICAgICAgMHhmZmZmZmZmZnUKKyNkZWZpbmUgR0lGX1RSQU5TUEFSRU5UX01BU0sgIDB4MDEKKyNkZWZpbmUgR0lGX0RJU1BPU0VfTUFTSyAgICAgIDB4MDcKKyNkZWZpbmUgR0lGX0RJU1BPU0VfU0hJRlQgICAgIDIKKworLy8gZnJvbSB1dGlscy91dGlscy5oCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gdm9pZCBXZWJQQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CitleHRlcm4gdm9pZCBXZWJQQ29weVBpeGVscyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCit2b2lkIEdJRkdldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvck1hcE9iamVjdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJnY29sb3JfaW5kZXgsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBiZ2NvbG9yKSB7CisgIGlmICh0cmFuc3BhcmVudF9pbmRleCAhPSBHSUZfSU5ERVhfSU5WQUxJRCAmJgorICAgICAgYmdjb2xvcl9pbmRleCA9PSB0cmFuc3BhcmVudF9pbmRleCkgeworICAgICpiZ2NvbG9yID0gR0lGX1RSQU5TUEFSRU5UX0NPTE9SOyAgLy8gU3BlY2lhbCBjYXNlLgorICB9IGVsc2UgaWYgKGNvbG9yX21hcCA9PSBOVUxMIHx8IGNvbG9yX21hcC0+Q29sb3JzID09IE5VTEwKKyAgICAgICAgICAgICB8fCBiZ2NvbG9yX2luZGV4ID49IGNvbG9yX21hcC0+Q29sb3JDb3VudCkgeworICAgICpiZ2NvbG9yID0gR0lGX1dISVRFX0NPTE9SOworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkdJRiBkZWNvZGUgd2FybmluZzogaW52YWxpZCBiYWNrZ3JvdW5kIGNvbG9yIGluZGV4LiBBc3N1bWluZyAiCisgICAgICAgICAgICAid2hpdGUgYmFja2dyb3VuZC5cbiIpOworICB9IGVsc2UgeworICAgIGNvbnN0IEdpZkNvbG9yVHlwZSBjb2xvciA9IGNvbG9yX21hcC0+Q29sb3JzW2JnY29sb3JfaW5kZXhdOworICAgICpiZ2NvbG9yID0gKDB4ZmZ1ICAgICAgIDw8IDI0KQorICAgICAgICAgICAgIHwgKGNvbG9yLlJlZCAgIDw8IDE2KQorICAgICAgICAgICAgIHwgKGNvbG9yLkdyZWVuIDw8ICA4KQorICAgICAgICAgICAgIHwgKGNvbG9yLkJsdWUgIDw8ICAwKTsKKyAgfQorfQorCitpbnQgR0lGUmVhZEdyYXBoaWNzRXh0ZW5zaW9uKGNvbnN0IEdpZkJ5dGVUeXBlKiBjb25zdCBidWYsIGludCogY29uc3QgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRkRpc3Bvc2VNZXRob2QqIGNvbnN0IGRpc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgdHJhbnNwYXJlbnRfaW5kZXgpIHsKKyAgY29uc3QgaW50IGZsYWdzID0gYnVmWzFdOworICBjb25zdCBpbnQgZGlzcG9zZV9yYXcgPSAoZmxhZ3MgPj4gR0lGX0RJU1BPU0VfU0hJRlQpICYgR0lGX0RJU1BPU0VfTUFTSzsKKyAgY29uc3QgaW50IGR1cmF0aW9uX3JhdyA9IGJ1ZlsyXSB8IChidWZbM10gPDwgOCk7ICAvLyBJbiAxMCBtcyB1bml0cy4KKyAgaWYgKGJ1ZlswXSAhPSA0KSByZXR1cm4gMDsKKyAgKmR1cmF0aW9uID0gZHVyYXRpb25fcmF3ICogMTA7ICAvLyBEdXJhdGlvbiBpcyBpbiAxIG1zIHVuaXRzLgorICBzd2l0Y2ggKGRpc3Bvc2VfcmF3KSB7CisgICAgY2FzZSAzOgorICAgICAgKmRpc3Bvc2UgPSBHSUZfRElTUE9TRV9SRVNUT1JFX1BSRVZJT1VTOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgKmRpc3Bvc2UgPSBHSUZfRElTUE9TRV9CQUNLR1JPVU5EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgKmRpc3Bvc2UgPSBHSUZfRElTUE9TRV9OT05FOworICAgICAgYnJlYWs7CisgIH0KKyAgKnRyYW5zcGFyZW50X2luZGV4ID0KKyAgICAgIChmbGFncyAmIEdJRl9UUkFOU1BBUkVOVF9NQVNLKSA/IGJ1Zls0XSA6IEdJRl9JTkRFWF9JTlZBTElEOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBSZW1hcChjb25zdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCB0cmFuc3BhcmVudF9pbmRleCwgdWludDMyX3QqIGRzdCkgeworICBpbnQgaTsKKyAgY29uc3QgR2lmQ29sb3JUeXBlKiBjb2xvcnM7CisgIGNvbnN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjbWFwID0KKyAgICAgIGdpZi0+SW1hZ2UuQ29sb3JNYXAgPyBnaWYtPkltYWdlLkNvbG9yTWFwIDogZ2lmLT5TQ29sb3JNYXA7CisgIGlmIChjbWFwID09IE5VTEwpIHJldHVybiAxOworICBpZiAoY21hcC0+Q29sb3JzID09IE5VTEwgfHwgY21hcC0+Q29sb3JDb3VudCA8PSAwKSByZXR1cm4gMDsKKyAgY29sb3JzID0gY21hcC0+Q29sb3JzOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGlmIChzcmNbaV0gPT0gdHJhbnNwYXJlbnRfaW5kZXgpIHsKKyAgICAgIGRzdFtpXSA9IEdJRl9UUkFOU1BBUkVOVF9DT0xPUjsKKyAgICB9IGVsc2UgaWYgKHNyY1tpXSA8IGNtYXAtPkNvbG9yQ291bnQpIHsKKyAgICAgIGNvbnN0IEdpZkNvbG9yVHlwZSBjID0gY29sb3JzW3NyY1tpXV07CisgICAgICBkc3RbaV0gPSBjLkJsdWUgfCAoYy5HcmVlbiA8PCA4KSB8IChjLlJlZCA8PCAxNikgfCAoMHhmZnUgPDwgMjQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBHSUZSZWFkRnJhbWUoR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICBHSUZGcmFtZVJlY3QqIGNvbnN0IGdpZl9yZWN0LCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBXZWJQUGljdHVyZSBzdWJfaW1hZ2U7CisgIGNvbnN0IEdpZkltYWdlRGVzYyogY29uc3QgaW1hZ2VfZGVzYyA9ICZnaWYtPkltYWdlOworICB1aW50MzJfdCogZHN0ID0gTlVMTDsKKyAgdWludDhfdCogdG1wID0gTlVMTDsKKyAgY29uc3QgR0lGRnJhbWVSZWN0IHJlY3QgPSB7CisgICAgICBpbWFnZV9kZXNjLT5MZWZ0LCBpbWFnZV9kZXNjLT5Ub3AsIGltYWdlX2Rlc2MtPldpZHRoLCBpbWFnZV9kZXNjLT5IZWlnaHQKKyAgfTsKKyAgY29uc3QgdWludDY0X3QgbWVtb3J5X25lZWRlZCA9IDQgKiByZWN0LndpZHRoICogKHVpbnQ2NF90KXJlY3QuaGVpZ2h0OworICBpbnQgb2sgPSAwOworICAqZ2lmX3JlY3QgPSByZWN0OworCisgIGlmIChtZW1vcnlfbmVlZGVkICE9IChzaXplX3QpbWVtb3J5X25lZWRlZCB8fCBtZW1vcnlfbmVlZGVkID4gKDRVTEwgPDwgMzIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbWFnZSBpcyB0b28gbGFyZ2UgKCVkIHggJWQpLiIsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFVzZSBhIHZpZXcgZm9yIHRoZSBzdWItcGljdHVyZToKKyAgaWYgKCFXZWJQUGljdHVyZVZpZXcocGljdHVyZSwgcmVjdC54X29mZnNldCwgcmVjdC55X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsICZzdWJfaW1hZ2UpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJTdWItaW1hZ2UgJWR4JWQgYXQgcG9zaXRpb24gJWQsJWQgaXMgaW52YWxpZCFcbiIsCisgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgcmVjdC54X29mZnNldCwgcmVjdC55X29mZnNldCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZHN0ID0gc3ViX2ltYWdlLmFyZ2I7CisKKyAgdG1wID0gKHVpbnQ4X3QqKW1hbGxvYyhyZWN0LndpZHRoICogc2l6ZW9mKCp0bXApKTsKKyAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIEVuZDsKKworICBpZiAoaW1hZ2VfZGVzYy0+SW50ZXJsYWNlKSB7ICAvLyBJbnRlcmxhY2VkIGltYWdlLgorICAgIC8vIFdlIG5lZWQgNCBwYXNzZXMsIHdpdGggdGhlIGZvbGxvd2luZyBvZmZzZXRzIGFuZCBqdW1wcy4KKyAgICBjb25zdCBpbnQgaW50ZXJsYWNlX29mZnNldHNbXSA9IHsgMCwgNCwgMiwgMSB9OworICAgIGNvbnN0IGludCBpbnRlcmxhY2VfanVtcHNbXSAgID0geyA4LCA4LCA0LCAyIH07CisgICAgaW50IHBhc3M7CisgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDQ7ICsrcGFzcykgeworICAgICAgY29uc3Qgc2l6ZV90IHN0cmlkZSA9IChzaXplX3Qpc3ViX2ltYWdlLmFyZ2Jfc3RyaWRlOworICAgICAgaW50IHkgPSBpbnRlcmxhY2Vfb2Zmc2V0c1twYXNzXTsKKyAgICAgIHVpbnQzMl90KiByb3cgPSBkc3QgKyB5ICogc3RyaWRlOworICAgICAgY29uc3Qgc2l6ZV90IGp1bXAgPSBpbnRlcmxhY2VfanVtcHNbcGFzc10gKiBzdHJpZGU7CisgICAgICBmb3IgKDsgeSA8IHJlY3QuaGVpZ2h0OyB5ICs9IGludGVybGFjZV9qdW1wc1twYXNzXSwgcm93ICs9IGp1bXApIHsKKyAgICAgICAgaWYgKERHaWZHZXRMaW5lKGdpZiwgdG1wLCByZWN0LndpZHRoKSA9PSBHSUZfRVJST1IpIGdvdG8gRW5kOworICAgICAgICBpZiAoIVJlbWFwKGdpZiwgdG1wLCByZWN0LndpZHRoLCB0cmFuc3BhcmVudF9pbmRleCwgcm93KSkgZ290byBFbmQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeyAgLy8gTm9uLWludGVybGFjZWQgaW1hZ2UuCisgICAgaW50IHk7CisgICAgdWludDMyX3QqIHB0ciA9IGRzdDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcmVjdC5oZWlnaHQ7ICsreSwgcHRyICs9IHN1Yl9pbWFnZS5hcmdiX3N0cmlkZSkgeworICAgICAgaWYgKERHaWZHZXRMaW5lKGdpZiwgdG1wLCByZWN0LndpZHRoKSA9PSBHSUZfRVJST1IpIGdvdG8gRW5kOworICAgICAgaWYgKCFSZW1hcChnaWYsIHRtcCwgcmVjdC53aWR0aCwgdHJhbnNwYXJlbnRfaW5kZXgsIHB0cikpIGdvdG8gRW5kOworICAgIH0KKyAgfQorICBvayA9IDE7CisKKyBFbmQ6CisgIGlmICghb2spIHBpY3R1cmUtPmVycm9yX2NvZGUgPSBzdWJfaW1hZ2UuZXJyb3JfY29kZTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZzdWJfaW1hZ2UpOworICBmcmVlKHRtcCk7CisgIHJldHVybiBvazsKK30KKworaW50IEdJRlJlYWRMb29wQ291bnQoR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxvb3BfY291bnQpIHsKKyAgYXNzZXJ0KCFtZW1jbXAoKmJ1ZiArIDEsICJORVRTQ0FQRTIuMCIsIDExKSB8fAorICAgICAgICAgIW1lbWNtcCgqYnVmICsgMSwgIkFOSU1FWFRTMS4wIiwgMTEpKTsKKyAgaWYgKERHaWZHZXRFeHRlbnNpb25OZXh0KGdpZiwgYnVmKSA9PSBHSUZfRVJST1IpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKmJ1ZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7ICAvLyBMb29wIGNvdW50IHN1Yi1ibG9jayBtaXNzaW5nLgorICB9CisgIGlmICgoKmJ1ZilbMF0gPCAzIHx8ICgqYnVmKVsxXSAhPSAxKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gd3Jvbmcgc2l6ZS9tYXJrZXIKKyAgfQorICAqbG9vcF9jb3VudCA9ICgqYnVmKVsyXSB8ICgoKmJ1ZilbM10gPDwgOCk7CisgIHJldHVybiAxOworfQorCitpbnQgR0lGUmVhZE1ldGFkYXRhKEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgY29uc3QgaW50IGlzX3htcCA9ICFtZW1jbXAoKmJ1ZiArIDEsICJYTVAgRGF0YVhNUCIsIDExKTsKKyAgY29uc3QgaW50IGlzX2ljYyA9ICFtZW1jbXAoKmJ1ZiArIDEsICJJQ0NSR0JHMTAxMiIsIDExKTsKKyAgYXNzZXJ0KGlzX3htcCB8fCBpc19pY2MpOworICAodm9pZClpc19pY2M7ICAvLyBzaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorICAvLyBDb25zdHJ1Y3QgbWV0YWRhdGEgZnJvbSBzdWItYmxvY2tzLgorICAvLyBVc3VhbCBjYXNlIChpbmNsdWRpbmcgSUNDIHByb2ZpbGUpOiBJbiBlYWNoIHN1Yi1ibG9jaywgdGhlCisgIC8vIGZpcnN0IGJ5dGUgc3BlY2lmaWVzIGl0cyBzaXplIGluIGJ5dGVzICgwIHRvIDI1NSkgYW5kIHRoZQorICAvLyByZXN0IG9mIHRoZSBieXRlcyBjb250YWluIHRoZSBkYXRhLgorICAvLyBTcGVjaWFsIGNhc2UgZm9yIFhNUCBkYXRhOiBJbiBlYWNoIHN1Yi1ibG9jaywgdGhlIGZpcnN0IGJ5dGUKKyAgLy8gaXMgYWxzbyBwYXJ0IG9mIHRoZSBYTVAgcGF5bG9hZC4gWE1QIGluIEdJRiBhbHNvIGhhcyBhIDI1NworICAvLyBieXRlIHBhZGRpbmcgZGF0YS4gU2VlIHRoZSBYTVAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgd2hpbGUgKDEpIHsKKyAgICBXZWJQRGF0YSBzdWJibG9jazsKKyAgICBjb25zdCB1aW50OF90KiB0bXA7CisgICAgaWYgKERHaWZHZXRFeHRlbnNpb25OZXh0KGdpZiwgYnVmKSA9PSBHSUZfRVJST1IpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKmJ1ZiA9PSBOVUxMKSBicmVhazsgIC8vIEZpbmlzaGVkLgorICAgIHN1YmJsb2NrLnNpemUgPSBpc194bXAgPyAoKmJ1ZilbMF0gKyAxIDogKCpidWYpWzBdOworICAgIGFzc2VydChzdWJibG9jay5zaXplID4gMCk7CisgICAgc3ViYmxvY2suYnl0ZXMgPSBpc194bXAgPyAqYnVmIDogKmJ1ZiArIDE7CisgICAgLy8gTm90ZTogV2Ugc3RvcmUgcmV0dXJuZWQgdmFsdWUgaW4gJ3RtcCcgZmlyc3QsIHRvIGF2b2lkCisgICAgLy8gbGVha2luZyBvbGQgbWVtb3J5IGluIG1ldGFkYXRhLT5ieXRlcyBvbiBlcnJvci4KKyAgICB0bXAgPSAodWludDhfdCopcmVhbGxvYygodm9pZCopbWV0YWRhdGEtPmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLT5zaXplICsgc3ViYmxvY2suc2l6ZSk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtY3B5KCh2b2lkKikodG1wICsgbWV0YWRhdGEtPnNpemUpLAorICAgICAgICAgICBzdWJibG9jay5ieXRlcywgc3ViYmxvY2suc2l6ZSk7CisgICAgbWV0YWRhdGEtPmJ5dGVzID0gdG1wOworICAgIG1ldGFkYXRhLT5zaXplICs9IHN1YmJsb2NrLnNpemU7CisgIH0KKyAgaWYgKGlzX3htcCkgeworICAgIC8vIFhNUCBwYWRkaW5nIGRhdGEgaXMgMHgwMSwgMHhmZiwgMHhmZSAuLi4gMHgwMSwgMHgwMC4KKyAgICBjb25zdCBzaXplX3QgeG1wX3BhZGluZ19zaXplID0gMjU3OworICAgIGlmIChtZXRhZGF0YS0+c2l6ZSA+IHhtcF9wYWRpbmdfc2l6ZSkgeworICAgICAgbWV0YWRhdGEtPnNpemUgLT0geG1wX3BhZGluZ19zaXplOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ2xlYXJSZWN0YW5nbGUoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBpLCBqOworICBjb25zdCBzaXplX3Qgc3RyaWRlID0gcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgIHVpbnQzMl90KiBkc3QgPSBwaWN0dXJlLT5hcmdiICsgdG9wICogc3RyaWRlICsgbGVmdDsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqLCBkc3QgKz0gc3RyaWRlKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIGRzdFtpXSA9IEdJRl9UUkFOU1BBUkVOVF9DT0xPUjsKKyAgfQorfQorCit2b2lkIEdJRkNsZWFyUGljKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCkgeworICBpZiAocmVjdCAhPSBOVUxMKSB7CisgICAgQ2xlYXJSZWN0YW5nbGUocGljLCByZWN0LT54X29mZnNldCwgcmVjdC0+eV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgQ2xlYXJSZWN0YW5nbGUocGljLCAwLCAwLCBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgIH0KK30KKwordm9pZCBHSUZDb3B5UGl4ZWxzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgV2ViUENvcHlQaXhlbHMoc3JjLCBkc3QpOworfQorCit2b2lkIEdJRkRpc3Bvc2VGcmFtZShHSUZEaXNwb3NlTWV0aG9kIGRpc3Bvc2UsIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcykgeworICBhc3NlcnQocmVjdCAhPSBOVUxMKTsKKyAgaWYgKGRpc3Bvc2UgPT0gR0lGX0RJU1BPU0VfQkFDS0dST1VORCkgeworICAgIEdJRkNsZWFyUGljKGN1cnJfY2FudmFzLCByZWN0KTsKKyAgfSBlbHNlIGlmIChkaXNwb3NlID09IEdJRl9ESVNQT1NFX1JFU1RPUkVfUFJFVklPVVMpIHsKKyAgICBjb25zdCBzaXplX3Qgc3JjX3N0cmlkZSA9IHByZXZfY2FudmFzLT5hcmdiX3N0cmlkZTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gcHJldl9jYW52YXMtPmFyZ2IgKyByZWN0LT54X29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWN0LT55X29mZnNldCAqIHNyY19zdHJpZGU7CisgICAgY29uc3Qgc2l6ZV90IGRzdF9zdHJpZGUgPSBjdXJyX2NhbnZhcy0+YXJnYl9zdHJpZGU7CisgICAgdWludDMyX3QqIGNvbnN0IGRzdCA9IGN1cnJfY2FudmFzLT5hcmdiICsgcmVjdC0+eF9vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjdC0+eV9vZmZzZXQgKiBkc3Rfc3RyaWRlOworICAgIGFzc2VydChwcmV2X2NhbnZhcyAhPSBOVUxMKTsKKyAgICBXZWJQQ29weVBsYW5lKCh1aW50OF90KilzcmMsIChpbnQpKDQgKiBzcmNfc3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICh1aW50OF90Kilkc3QsIChpbnQpKDQgKiBkc3Rfc3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgIDQgKiByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKKyAgfQorfQorCit2b2lkIEdJRkJsZW5kRnJhbWVzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBpbnQgaSwgajsKKyAgY29uc3Qgc2l6ZV90IHNyY19zdHJpZGUgPSBzcmMtPmFyZ2Jfc3RyaWRlOworICBjb25zdCBzaXplX3QgZHN0X3N0cmlkZSA9IGRzdC0+YXJnYl9zdHJpZGU7CisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBmb3IgKGogPSByZWN0LT55X29mZnNldDsgaiA8IHJlY3QtPnlfb2Zmc2V0ICsgcmVjdC0+aGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSByZWN0LT54X29mZnNldDsgaSA8IHJlY3QtPnhfb2Zmc2V0ICsgcmVjdC0+d2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3Qgc3JjX3BpeGVsID0gc3JjLT5hcmdiW2ogKiBzcmNfc3RyaWRlICsgaV07CisgICAgICBjb25zdCBpbnQgc3JjX2FscGhhID0gc3JjX3BpeGVsID4+IDI0OworICAgICAgaWYgKHNyY19hbHBoYSAhPSAwKSB7CisgICAgICAgIGRzdC0+YXJnYltqICogZHN0X3N0cmlkZSArIGldID0gc3JjX3BpeGVsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEdJRkRpc3BsYXlFcnJvcihjb25zdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgZ2lmX2Vycm9yKSB7CisgIC8vIGxpYmdpZiA0LjIuMCBoYXMgcmV0aXJlZCBQcmludEdpZkVycm9yKCkgYW5kIGFkZGVkIEdpZkVycm9yU3RyaW5nKCkuCisjaWYgTE9DQUxfR0lGX1BSRVJFUSg0LDIpCisjaWYgTE9DQUxfR0lGX1BSRVJFUSg1LDApCisgIC8vIFN0YXRpYyBzdHJpbmcgYWN0dWFsbHksIGhlbmNlIHRoZSBjb25zdCBjaGFyKiBjYXN0LgorICBjb25zdCBjaGFyKiBlcnJvcl9zdHIgPSAoY29uc3QgY2hhciopR2lmRXJyb3JTdHJpbmcoCisgICAgICAoZ2lmID09IE5VTEwpID8gZ2lmX2Vycm9yIDogZ2lmLT5FcnJvcik7CisjZWxzZQorICBjb25zdCBjaGFyKiBlcnJvcl9zdHIgPSAoY29uc3QgY2hhciopR2lmRXJyb3JTdHJpbmcoKTsKKyAgKHZvaWQpZ2lmOworI2VuZGlmCisgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkgZXJyb3Jfc3RyID0gIlVua25vd24gZXJyb3IiOworICBmcHJpbnRmKHN0ZGVyciwgIkdJRkxpYiBFcnJvciAlZDogJXNcbiIsIGdpZl9lcnJvciwgZXJyb3Jfc3RyKTsKKyNlbHNlCisgICh2b2lkKWdpZjsKKyAgZnByaW50ZihzdGRlcnIsICJHSUZMaWIgRXJyb3IgJWQ6ICIsIGdpZl9lcnJvcik7CisgIFByaW50R2lmRXJyb3IoKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCit9CisKKyNlbHNlICAvLyAhV0VCUF9IQVZFX0dJRgorCitzdGF0aWMgdm9pZCBFcnJvckdJRk5vdEF2YWlsYWJsZSgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJHSUYgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJnaWYtZGV2ICIKKyAgICAgICAgICAicGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKK30KKwordm9pZCBHSUZHZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3Qgc3RydWN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjb2xvcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmdjb2xvcl9pbmRleCwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGJnY29sb3IpIHsKKyAgKHZvaWQpY29sb3JfbWFwOworICAodm9pZCliZ2NvbG9yX2luZGV4OworICAodm9pZCl0cmFuc3BhcmVudF9pbmRleDsKKyAgKHZvaWQpYmdjb2xvcjsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKworaW50IEdJRlJlYWRHcmFwaGljc0V4dGVuc2lvbihjb25zdCBHaWZCeXRlVHlwZSogY29uc3QgZGF0YSwgaW50KiBjb25zdCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0lGRGlzcG9zZU1ldGhvZCogY29uc3QgZGlzcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB0cmFuc3BhcmVudF9pbmRleCkgeworICAodm9pZClkYXRhOworICAodm9pZClkdXJhdGlvbjsKKyAgKHZvaWQpZGlzcG9zZTsKKyAgKHZvaWQpdHJhbnNwYXJlbnRfaW5kZXg7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7CisgIHJldHVybiAwOworfQorCitpbnQgR0lGUmVhZEZyYW1lKHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgIEdJRkZyYW1lUmVjdCogY29uc3QgZ2lmX3JlY3QsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICAodm9pZClnaWY7CisgICh2b2lkKXRyYW5zcGFyZW50X2luZGV4OworICAodm9pZClnaWZfcmVjdDsKKyAgKHZvaWQpcGljdHVyZTsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBHSUZSZWFkTG9vcENvdW50KHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbG9vcF9jb3VudCkgeworICAodm9pZClnaWY7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbG9vcF9jb3VudDsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBHSUZSZWFkTWV0YWRhdGEoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUERhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWdpZjsKKyAgKHZvaWQpYnVmOworICAodm9pZCltZXRhZGF0YTsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgR0lGRGlzcG9zZUZyYW1lKEdJRkRpc3Bvc2VNZXRob2QgZGlzcG9zZSwgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMpIHsKKyAgKHZvaWQpZGlzcG9zZTsKKyAgKHZvaWQpcmVjdDsKKyAgKHZvaWQpcHJldl9jYW52YXM7CisgICh2b2lkKWN1cnJfY2FudmFzOworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCit2b2lkIEdJRkJsZW5kRnJhbWVzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgICh2b2lkKXNyYzsKKyAgKHZvaWQpcmVjdDsKKyAgKHZvaWQpZHN0OworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCit2b2lkIEdJRkRpc3BsYXlFcnJvcihjb25zdCBzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IGdpZl9lcnJvcikgeworICAodm9pZClnaWY7CisgICh2b2lkKWdpZl9lcnJvcjsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKwordm9pZCBHSUZDbGVhclBpYyhzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0KSB7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpcmVjdDsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKwordm9pZCBHSUZDb3B5UGl4ZWxzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgICh2b2lkKXNyYzsKKyAgKHZvaWQpZHN0OworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCisjZW5kaWYgIC8vIFdFQlBfSEFWRV9HSUYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViYTlkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5oCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gR0lGIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0VYQU1QTEVTX0dJRkRFQ19IXworI2RlZmluZSBXRUJQX0VYQU1QTEVTX0dJRkRFQ19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0VCUF9IQVZFX0dJRgorI2luY2x1ZGUgPGdpZl9saWIuaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEdJRkxJQl9NQUpPUiBpcyBvbmx5IGRlZmluZWQgaW4gbGliZ2lmID49IDQuMi4wLgorI2lmIGRlZmluZWQoR0lGTElCX01BSk9SKSAmJiBkZWZpbmVkKEdJRkxJQl9NSU5PUikKKyMgZGVmaW5lIExPQ0FMX0dJRl9WRVJTSU9OICgoR0lGTElCX01BSk9SIDw8IDgpIHwgR0lGTElCX01JTk9SKQorIyBkZWZpbmUgTE9DQUxfR0lGX1BSRVJFUShtYWosIG1pbikgXAorICAgIChMT0NBTF9HSUZfVkVSU0lPTiA+PSAoKChtYWopIDw8IDgpIHwgKG1pbikpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0dJRl9WRVJTSU9OIDAKKyMgZGVmaW5lIExPQ0FMX0dJRl9QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisjZGVmaW5lIEdJRl9JTkRFWF9JTlZBTElEICgtMSkKKwordHlwZWRlZiBlbnVtIEdJRkRpc3Bvc2VNZXRob2QgeworICBHSUZfRElTUE9TRV9OT05FLAorICBHSUZfRElTUE9TRV9CQUNLR1JPVU5ELAorICBHSUZfRElTUE9TRV9SRVNUT1JFX1BSRVZJT1VTCit9IEdJRkRpc3Bvc2VNZXRob2Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHhfb2Zmc2V0LCB5X29mZnNldCwgd2lkdGgsIGhlaWdodDsKK30gR0lGRnJhbWVSZWN0OworCitzdHJ1Y3QgV2ViUERhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKyNpZm5kZWYgV0VCUF9IQVZFX0dJRgorc3RydWN0IENvbG9yTWFwT2JqZWN0Oworc3RydWN0IEdpZkZpbGVUeXBlOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdpZkJ5dGVUeXBlOworI2VuZGlmCisKKy8vIEdpdmVuIHRoZSBpbmRleCBvZiBiYWNrZ3JvdW5kIGNvbG9yIGFuZCB0cmFuc3BhcmVudCBjb2xvciwgcmV0dXJucyB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgYmFja2dyb3VuZCBjb2xvciAoaW4gQkdSQSBmb3JtYXQpIGluICdiZ2NvbG9yJy4KK3ZvaWQgR0lGR2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IHN0cnVjdCBDb2xvck1hcE9iamVjdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJnY29sb3JfaW5kZXgsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBiZ2NvbG9yKTsKKworLy8gUGFyc2VzIHRoZSBnaXZlbiBncmFwaGljcyBleHRlbnNpb24gZGF0YSB0byBnZXQgZnJhbWUgZHVyYXRpb24gKGluIDFtcworLy8gdW5pdHMpLCBkaXNwb3NlIG1ldGhvZCBhbmQgdHJhbnNwYXJlbnQgY29sb3IgaW5kZXguCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBHSUZSZWFkR3JhcGhpY3NFeHRlbnNpb24oY29uc3QgR2lmQnl0ZVR5cGUqIGNvbnN0IGJ1ZiwgaW50KiBjb25zdCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0lGRGlzcG9zZU1ldGhvZCogY29uc3QgZGlzcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB0cmFuc3BhcmVudF9pbmRleCk7CisKKy8vIFJlYWRzIHRoZSBuZXh0IEdJRiBmcmFtZSBmcm9tICdnaWYnIGludG8gJ3BpY3R1cmUnLiBBbHNvLCByZXR1cm5zIHRoZSBHSUYKKy8vIGZyYW1lIGRpbWVuc2lvbnMgYW5kIG9mZnNldHMgaW4gJ3JlY3QnLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgR0lGUmVhZEZyYW1lKHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgIEdJRkZyYW1lUmVjdCogY29uc3QgZ2lmX3JlY3QsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7CisKKy8vIFBhcnNlcyBsb29wIGNvdW50IGZyb20gdGhlIGdpdmVuIE5ldHNjYXBlIGV4dGVuc2lvbiBkYXRhLgoraW50IEdJRlJlYWRMb29wQ291bnQoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsb29wX2NvdW50KTsKKworLy8gUGFyc2VzIHRoZSBnaXZlbiBJQ0Mgb3IgWE1QIGV4dGVuc2lvbiBkYXRhIGFuZCBzdG9yZXMgaXQgaW50byAnbWV0YWRhdGEnLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgR0lGUmVhZE1ldGFkYXRhKHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBEYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKy8vIERpc3Bvc2UgdGhlIHBpeGVscyB3aXRoaW4gJ3JlY3QnIG9mICdjdXJyX2NhbnZhcycgYmFzZWQgb24gJ2Rpc3Bvc2UnIG1ldGhvZAorLy8gYW5kICdwcmV2X2NhbnZhcycuCit2b2lkIEdJRkRpc3Bvc2VGcmFtZShHSUZEaXNwb3NlTWV0aG9kIGRpc3Bvc2UsIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzKTsKKworLy8gR2l2ZW4gJ3NyYycgcGljdHVyZSBhbmQgaXRzIGZyYW1lIHJlY3RhbmdsZSAncmVjdCcsIGJsZW5kIGl0IGludG8gJ2RzdCcuCit2b2lkIEdJRkJsZW5kRnJhbWVzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgZHN0KTsKKworLy8gUHJpbnRzIGFuIGVycm9yIHN0cmluZyBiYXNlZCBvbiAnZ2lmX2Vycm9yJy4KK3ZvaWQgR0lGRGlzcGxheUVycm9yKGNvbnN0IHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgZ2lmX2Vycm9yKTsKKworLy8gSW4gdGhlIGdpdmVuICdwaWMnLCBjbGVhciB0aGUgcGl4ZWxzIGluICdyZWN0JyB0byB0cmFuc3BhcmVudCBjb2xvci4KK3ZvaWQgR0lGQ2xlYXJQaWMoc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCk7CisKKy8vIENvcHkgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcgaG9ub3Jpbmcgc3RyaWRlcy4gJ3NyYycgYW5kICdkc3QnIGFyZSBhc3N1bWVkCisvLyB0byBiZSBhbHJlYWR5IGFsbG9jYXRlZC4KK3ZvaWQgR0lGQ29weVBpeGVscyhjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VYQU1QTEVTX0dJRkRFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvaW1nMndlYnAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2ltZzJ3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NTBjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2ltZzJ3ZWJwLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgZ2VuZXJhdGUgYW4gYW5pbWF0ZWQgV2ViUCBvdXQgb2YgYSBzZXF1ZW5jZSBvZiBpbWFnZXMKKy8vICAoUE5HLCBKUEVHLCAuLi4pCisvLworLy8gIEV4YW1wbGUgdXNhZ2U6CisvLyAgICAgaW1nMndlYnAgLW8gb3V0LndlYnAgLXEgNDAgLW1peGVkIC1kdXJhdGlvbiA0MCBpbnB1dD8/LnBuZworLy8KKy8vIEF1dGhvcjogc2thbEBnb29nbGUuY29tIChQYXNjYWwgTWFzc2ltaW5vKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlX2RlYy5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9zdG9wd2F0Y2guaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIndlYnAvbXV4LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOlxuXG4iKTsKKyAgcHJpbnRmKCIgIGltZzJ3ZWJwIFtmaWxlLWxldmVsIG9wdGlvbnNdIFtpbWFnZSBmaWxlcy4uLl0gIgorICAgICAgICAgIltwZXItZnJhbWUgb3B0aW9ucy4uLl1cbiIpOworICBwcmludGYoIlxuIik7CisKKyAgcHJpbnRmKCJGaWxlLWxldmVsIG9wdGlvbnMgKG9ubHkgdXNlZCBhdCB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24pOlxuIik7CisgIHByaW50ZigiIC1taW5fc2l6ZSAuLi4uLi4uLi4uLi4gbWluaW1pemUgc2l6ZVxuIik7CisgIHByaW50ZigiIC1sb29wIDxpbnQ+IC4uLi4uLi4uLi4gbG9vcCBjb3VudCAoZGVmYXVsdDogMCwgPSBpbmZpbml0ZSBsb29wKVxuIik7CisgIHByaW50ZigiIC1rbWF4IDxpbnQ+IC4uLi4uLi4uLi4gbWF4aW11bSBudW1iZXIgb2YgZnJhbWUgYmV0d2VlbiBrZXktZnJhbWVzXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgKDA9b25seSBrZXlmcmFtZXMpXG4iKTsKKyAgcHJpbnRmKCIgLWttaW4gPGludD4gLi4uLi4uLi4uLiBtaW5pbXVtIG51bWJlciBvZiBmcmFtZSBiZXR3ZWVuIGtleS1mcmFtZXNcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAoMD1kaXNhYmxlIGtleS1mcmFtZXMgYWx0b2dldGhlcilcbiIpOworICBwcmludGYoIiAtbWl4ZWQgLi4uLi4uLi4uLi4uLi4uIHVzZSBtaXhlZCBsb3NzeS9sb3NzbGVzcyBhdXRvbWF0aWMgbW9kZVxuIik7CisgIHByaW50ZigiIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZSBtb2RlXG4iKTsKKyAgcHJpbnRmKCIgLWggLi4uLi4uLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHBcbiIpOworICBwcmludGYoIiAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKKyAgcHJpbnRmKCJcbiIpOworCisgIHByaW50ZigiUGVyLWZyYW1lIG9wdGlvbnMgKG9ubHkgdXNlZCBmb3Igc3Vic2VxdWVudCBpbWFnZXMgaW5wdXQpOlxuIik7CisgIHByaW50ZigiIC1kIDxpbnQ+IC4uLi4uLi4uLi4uLi4gZnJhbWUgZHVyYXRpb24gaW4gbXMgKGRlZmF1bHQ6IDEwMClcbiIpOworICBwcmludGYoIiAtbG9zc2xlc3MgIC4uLi4uLi4uLi4uIHVzZSBsb3NzbGVzcyBtb2RlIChkZWZhdWx0KVxuIik7CisgIHByaW50ZigiIC1sb3NzeSAuLi4gLi4uLi4uLi4uLi4gdXNlIGxvc3N5IG1vZGVcbiIpOworICBwcmludGYoIiAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uIHF1YWxpdHlcbiIpOworICBwcmludGYoIiAtbSA8aW50PiAuLi4uLi4uLi4uLi4uIG1ldGhvZCB0byB1c2VcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJleGFtcGxlOiBpbWcyd2VicCAtbG9vcCAyIGluMC5wbmcgLWxvc3N5IGluMS5qcGdcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAtZCA4MCBpbjIudGlmZiAtbyBvdXQud2VicFxuIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgUmVhZEltYWdlKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgIFdlYlBJbWFnZVJlYWRlciByZWFkZXI7CisgIGludCBvazsKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgLy8gVHJ5IHRvIGRlY29kZSB0aGUgZmlsZSB1c2luZyBXSUMgZmFsbGluZyBiYWNrIHRvIHRoZSBvdGhlciByZWFkZXJzIGZvcgorICAvLyBlLmcuLCBXZWJQLgorICBvayA9IFJlYWRQaWN0dXJlV2l0aFdJQyhmaWxlbmFtZSwgcGljLCAxLCBOVUxMKTsKKyAgaWYgKG9rKSByZXR1cm4gMTsKKyNlbmRpZgorICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSkpIHJldHVybiAwOworICByZWFkZXIgPSBXZWJQR3Vlc3NJbWFnZVJlYWRlcihkYXRhLCBkYXRhX3NpemUpOworICBvayA9IHJlYWRlcihkYXRhLCBkYXRhX3NpemUsIHBpYywgMSwgTlVMTCk7CisgIGZyZWUoKHZvaWQqKWRhdGEpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgU2V0TG9vcENvdW50KGludCBsb29wX2NvdW50LCBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKSB7CisgIGludCBvayA9IDE7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIHVpbnQzMl90IGZlYXR1cmVzOworICBXZWJQTXV4QW5pbVBhcmFtcyBuZXdfcGFyYW1zOworICBXZWJQTXV4KiBjb25zdCBtdXggPSBXZWJQTXV4Q3JlYXRlKHdlYnBfZGF0YSwgMSk7CisgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgZXJyID0gV2ViUE11eEdldEZlYXR1cmVzKG11eCwgJmZlYXR1cmVzKTsKKyAgb2sgPSAoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgaWYgKCFvayB8fCAhKGZlYXR1cmVzICYgQU5JTUFUSU9OX0ZMQUcpKSBnb3RvIEVuZDsKKworICBlcnIgPSBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJm5ld19wYXJhbXMpOworICBvayA9IChlcnIgPT0gV0VCUF9NVVhfT0spOworICBpZiAob2spIHsKKyAgICBuZXdfcGFyYW1zLmxvb3BfY291bnQgPSBsb29wX2NvdW50OworICAgIGVyciA9IFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMobXV4LCAmbmV3X3BhcmFtcyk7CisgICAgb2sgPSAoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgfQorICBpZiAob2spIHsKKyAgICBXZWJQRGF0YUNsZWFyKHdlYnBfZGF0YSk7CisgICAgZXJyID0gV2ViUE11eEFzc2VtYmxlKG11eCwgd2VicF9kYXRhKTsKKyAgICBvayA9IChlcnIgPT0gV0VCUF9NVVhfT0spOworICB9CisKKyBFbmQ6CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVyaW5nIGxvb3AtY291bnQgc2V0dGluZ1xuIik7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIGNvbnN0IGNoYXIqIG91dHB1dCA9IE5VTEw7CisgIFdlYlBBbmltRW5jb2RlciogZW5jID0gTlVMTDsKKyAgaW50IHZlcmJvc2UgPSAwOworICBpbnQgcGljX251bSA9IDA7CisgIGludCBkdXJhdGlvbiA9IDEwMDsKKyAgaW50IHRpbWVzdGFtcF9tcyA9IDA7CisgIGludCBsb29wX2NvdW50ID0gMDsKKyAgaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBhbmltX2NvbmZpZzsKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIFdlYlBQaWN0dXJlIHBpYzsKKyAgV2ViUERhdGEgd2VicF9kYXRhOworICBpbnQgYzsKKyAgaW50IGhhdmVfaW5wdXQgPSAwOworICBDb21tYW5kTGluZUFyZ3VtZW50cyBjbWRfYXJnczsKKyAgaW50IG9rID0gRXhVdGlsSW5pdENvbW1hbmRMaW5lQXJndW1lbnRzKGFyZ2MgLSAxLCBhcmd2ICsgMSwgJmNtZF9hcmdzKTsKKyAgaWYgKCFvaykgcmV0dXJuIDE7CisgIGFyZ2MgPSBjbWRfYXJncy5hcmdjXzsKKyAgYXJndiA9IGNtZF9hcmdzLmFyZ3ZfOworCisgIFdlYlBEYXRhSW5pdCgmd2VicF9kYXRhKTsKKyAgaWYgKCFXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdCgmYW5pbV9jb25maWcpIHx8CisgICAgICAhV2ViUENvbmZpZ0luaXQoJmNvbmZpZykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJnBpYykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIG9rID0gMDsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIDFzdCBwYXNzIG9mIG9wdGlvbiBwYXJzaW5nCisgIGZvciAoYyA9IDA7IG9rICYmIGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoYXJndltjXVswXSA9PSAnLScpIHsKKyAgICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW8iKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgYXJndltjXSA9IE5VTEw7CisgICAgICAgIG91dHB1dCA9IGFyZ3ZbKytjXTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWttaW4iKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgYXJndltjXSA9IE5VTEw7CisgICAgICAgIGFuaW1fY29uZmlnLmttaW4gPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIta21heCIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBhcmd2W2NdID0gTlVMTDsKKyAgICAgICAgYW5pbV9jb25maWcua21heCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb29wIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGFyZ3ZbY10gPSBOVUxMOworICAgICAgICBsb29wX2NvdW50ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgICAgaWYgKGxvb3BfY291bnQgPCAwKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG5vbi1wb3NpdGl2ZSBsb29wLWNvdW50ICglZClcbiIsIGxvb3BfY291bnQpOworICAgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWluX3NpemUiKSkgeworICAgICAgICBhbmltX2NvbmZpZy5taW5pbWl6ZV9zaXplID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1peGVkIikpIHsKKyAgICAgICAgYW5pbV9jb25maWcuYWxsb3dfbWl4ZWQgPSAxOworICAgICAgICBjb25maWcubG9zc2xlc3MgPSAwOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdiIpKSB7CisgICAgICAgIHZlcmJvc2UgPSAxOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgICAgSGVscCgpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgICBjb25zdCBpbnQgZW5jX3ZlcnNpb24gPSBXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAgICAgICAgY29uc3QgaW50IG11eF92ZXJzaW9uID0gV2ViUEdldE11eFZlcnNpb24oKTsKKyAgICAgICAgcHJpbnRmKCJXZWJQIEVuY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbldlYlAgTXV4IHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICAgKGVuY192ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChlbmNfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICBlbmNfdmVyc2lvbiAmIDB4ZmYsIChtdXhfdmVyc2lvbiA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgKG11eF92ZXJzaW9uID4+IDgpICYgMHhmZiwgbXV4X3ZlcnNpb24gJiAweGZmKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG9rID0gIXBhcnNlX2Vycm9yOworICAgICAgaWYgKCFvaykgZ290byBFbmQ7CisgICAgICBhcmd2W2NdID0gTlVMTDsgICAvLyBtYXJrIG9wdGlvbiBhcyAncGFyc2VkJyBkdXJpbmcgMXN0IHBhc3MKKyAgICB9IGVsc2UgeworICAgICAgaGF2ZV9pbnB1dCB8PSAxOworICAgIH0KKyAgfQorICBpZiAoIWhhdmVfaW5wdXQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUocykgZm9yIGdlbmVyYXRpbmcgYW5pbWF0aW9uIVxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBpbWFnZS1yZWFkaW5nIHBhc3MKKyAgcGljX251bSA9IDA7CisgIGNvbmZpZy5sb3NzbGVzcyA9IDE7CisgIGZvciAoYyA9IDA7IG9rICYmIGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoYXJndltjXSA9PSBOVUxMKSBjb250aW51ZTsKKyAgICBpZiAoYXJndltjXVswXSA9PSAnLScpIHsgICAgLy8gcGFyc2UgbG9jYWwgb3B0aW9ucworICAgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9zc3kiKSkgeworICAgICAgICBpZiAoIWFuaW1fY29uZmlnLmFsbG93X21peGVkKSBjb25maWcubG9zc2xlc3MgPSAwOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9zc2xlc3MiKSkgeworICAgICAgICBpZiAoIWFuaW1fY29uZmlnLmFsbG93X21peGVkKSBjb25maWcubG9zc2xlc3MgPSAxOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcSIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBjb25maWcucXVhbGl0eSA9IEV4VXRpbEdldEZsb2F0KGFyZ3ZbKytjXSwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW0iKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgY29uZmlnLm1ldGhvZCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGR1cmF0aW9uID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbmVnYXRpdmUgZHVyYXRpb24gKCVkKVxuIiwgZHVyYXRpb24pOworICAgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOyAgIC8vIHNob3VsZG4ndCBiZSBoZXJlLgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIFslc11cbiIsIGFyZ3ZbY10pOworICAgICAgfQorICAgICAgb2sgPSAhcGFyc2VfZXJyb3I7CisgICAgICBpZiAoIW9rKSBnb3RvIEVuZDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChvaykgeworICAgICAgb2sgPSBXZWJQVmFsaWRhdGVDb25maWcoJmNvbmZpZyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjb25maWd1cmF0aW9uLlxuIik7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgIH0KKworICAgIC8vIHJlYWQgbmV4dCBpbnB1dCBpbWFnZQorICAgIHBpYy51c2VfYXJnYiA9IDE7CisgICAgb2sgPSBSZWFkSW1hZ2UoYXJndltjXSwgJnBpYyk7CisgICAgaWYgKCFvaykgZ290byBFbmQ7CisKKyAgICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICAgIHdpZHRoICA9IHBpYy53aWR0aDsKKyAgICAgIGhlaWdodCA9IHBpYy5oZWlnaHQ7CisgICAgICBlbmMgPSBXZWJQQW5pbUVuY29kZXJOZXcod2lkdGgsIGhlaWdodCwgJmFuaW1fY29uZmlnKTsKKyAgICAgIG9rID0gKGVuYyAhPSBOVUxMKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY3JlYXRlIFdlYlBBbmltRW5jb2RlciBvYmplY3QuXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2spIHsKKyAgICAgIG9rID0gKHdpZHRoID09IHBpYy53aWR0aCAmJiBoZWlnaHQgPT0gcGljLmhlaWdodCk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRnJhbWUgIyVkIGRpbWVuc2lvbiBtaXNtYXRjaGVkISAiCisgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIHggJWQuIFdhcyBleHBlY3RpbmcgJWQgeCAlZC5cbiIsCisgICAgICAgICAgICAgICAgcGljX251bSwgcGljLndpZHRoLCBwaWMuaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2spIHsKKyAgICAgIG9rID0gV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgJnBpYywgdGltZXN0YW1wX21zLCAmY29uZmlnKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBhZGRpbmcgZnJhbWUgIyVkXG4iLCBwaWNfbnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgV2ViUFBpY3R1cmVGcmVlKCZwaWMpOworICAgIGlmICghb2spIGdvdG8gRW5kOworCisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQWRkZWQgZnJhbWUgIyUzZCBhdCB0aW1lICU0ZCAoZmlsZTogJXMpXG4iLAorICAgICAgICAgICAgICBwaWNfbnVtLCB0aW1lc3RhbXBfbXMsIGFyZ3ZbY10pOworICAgIH0KKyAgICB0aW1lc3RhbXBfbXMgKz0gZHVyYXRpb247CisgICAgKytwaWNfbnVtOworICB9CisKKyAgLy8gYWRkIGEgbGFzdCBmYWtlIGZyYW1lIHRvIHNpZ25hbCB0aGUgbGFzdCBkdXJhdGlvbgorICBvayA9IG9rICYmIFdlYlBBbmltRW5jb2RlckFkZChlbmMsIE5VTEwsIHRpbWVzdGFtcF9tcywgTlVMTCk7CisgIG9rID0gb2sgJiYgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoZW5jLCAmd2VicF9kYXRhKTsKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVyaW5nIGZpbmFsIGFuaW1hdGlvbiBhc3NlbWJseS5cbiIpOworICB9CisKKyBFbmQ6CisgIC8vIGZyZWUgcmVzb3VyY2VzCisgIFdlYlBBbmltRW5jb2RlckRlbGV0ZShlbmMpOworCisgIGlmIChvayAmJiBsb29wX2NvdW50ID4gMCkgeyAgLy8gUmUtbXV4IHRvIGFkZCBsb29wIGNvdW50LgorICAgIG9rID0gU2V0TG9vcENvdW50KGxvb3BfY291bnQsICZ3ZWJwX2RhdGEpOworICB9CisKKyAgaWYgKG9rKSB7CisgICAgaWYgKG91dHB1dCAhPSBOVUxMKSB7CisgICAgICBvayA9IEltZ0lvVXRpbFdyaXRlRmlsZShvdXRwdXQsIHdlYnBfZGF0YS5ieXRlcywgd2VicF9kYXRhLnNpemUpOworICAgICAgaWYgKG9rKSBmcHJpbnRmKHN0ZGVyciwgIm91dHB1dCBmaWxlOiAlcyAgICAgIiwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJbbm8gb3V0cHV0IGZpbGUgc3BlY2lmaWVkXSAgICIpOworICAgIH0KKyAgfQorCisgIGlmIChvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiWyVkIGZyYW1lcywgJXUgYnl0ZXNdLlxuIiwKKyAgICAgICAgICAgIHBpY19udW0sICh1bnNpZ25lZCBpbnQpd2VicF9kYXRhLnNpemUpOworICB9CisgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisgIEV4VXRpbERlbGV0ZUNvbW1hbmRMaW5lQXJndW1lbnRzKCZjbWRfYXJncyk7CisgIHJldHVybiBvayA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvc3RvcHdhdGNoLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9zdG9wd2F0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2UzODI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvc3RvcHdhdGNoLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBIZWxwZXIgZnVuY3Rpb25zIHRvIG1lYXN1cmUgZWxhcHNlZCB0aW1lLgorLy8KKy8vIEF1dGhvcjogTWlrb2xhaiBaYWxld3NraSAobWlrb2xhanpAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0VYQU1QTEVTX1NUT1BXQVRDSF9IXworI2RlZmluZSBXRUJQX0VYQU1QTEVTX1NUT1BXQVRDSF9IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWYgZGVmaW5lZCBfV0lOMzIgJiYgIWRlZmluZWQgX19HTlVDX18KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3R5cGVkZWYgTEFSR0VfSU5URUdFUiBTdG9wd2F0Y2g7CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3B3YXRjaFJlc2V0KFN0b3B3YXRjaCogd2F0Y2gpIHsKKyAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIod2F0Y2gpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIFN0b3B3YXRjaFJlYWRBbmRSZXNldChTdG9wd2F0Y2gqIHdhdGNoKSB7CisgIGNvbnN0IExBUkdFX0lOVEVHRVIgb2xkX3ZhbHVlID0gKndhdGNoOworICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgIGlmICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIod2F0Y2gpKQorICAgIHJldHVybiAwLjA7CisgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSkpCisgICAgcmV0dXJuIDAuMDsKKyAgaWYgKGZyZXEuUXVhZFBhcnQgPT0gMCkKKyAgICByZXR1cm4gMC4wOworICByZXR1cm4gKHdhdGNoLT5RdWFkUGFydCAtIG9sZF92YWx1ZS5RdWFkUGFydCkgLyAoZG91YmxlKWZyZXEuUXVhZFBhcnQ7Cit9CisKKworI2Vsc2UgICAgLyogIV9XSU4zMiAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gbWVtY3B5CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBTdG9wd2F0Y2g7CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3B3YXRjaFJlc2V0KFN0b3B3YXRjaCogd2F0Y2gpIHsKKyAgZ2V0dGltZW9mZGF5KHdhdGNoLCBOVUxMKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoU3RvcHdhdGNoKiB3YXRjaCkgeworICBzdHJ1Y3QgdGltZXZhbCBvbGRfdmFsdWU7CisgIGRvdWJsZSBkZWx0YV9zZWMsIGRlbHRhX3VzZWM7CisgIFNiTWVtb3J5Q29weSgmb2xkX3ZhbHVlLCB3YXRjaCwgc2l6ZW9mKG9sZF92YWx1ZSkpOworICBnZXR0aW1lb2ZkYXkod2F0Y2gsIE5VTEwpOworICBkZWx0YV9zZWMgPSAoZG91YmxlKXdhdGNoLT50dl9zZWMgLSBvbGRfdmFsdWUudHZfc2VjOworICBkZWx0YV91c2VjID0gKGRvdWJsZSl3YXRjaC0+dHZfdXNlYyAtIG9sZF92YWx1ZS50dl91c2VjOworICByZXR1cm4gZGVsdGFfc2VjICsgZGVsdGFfdXNlYyAvIDEwMDAwMDAuMDsKK30KKworI2VuZGlmICAgLyogX1dJTjMyICovCisKKyNlbmRpZiAgLyogV0VCUF9FWEFNUExFU19TVE9QV0FUQ0hfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3Qud2VicCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3Qud2VicApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRiY2ExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdC53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3RfcmVmLnBwbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3RfcmVmLnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzcxOWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdF9yZWYucHBtCkBAIC0wLDAgKzEsNCBAQAorUDYKKzEyOCAxMjgKKzI1NQory+H7y+H7y+H7y+H7y+H7y+H7y+H7y+H7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T90OP90OP90OP90OP90uT+0uT+0uT+0uT+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uT+0uT+0uT+0uT+0+X/0+X/0+X/0+X/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7y+H7y+H7y+H7y+H7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T9z+T90OP90OP90OP90uT+0uT+0uT+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uT+0uT+0uT+0uT+0+X/0+X/0+X/0+X/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7y+H7y+H7y+H7y+H7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T9z+T7z+T7z+T7z+T70OX90OX90OX90OX90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uT+0uT+0uT+0uT+0+X/0+X/0+X/0+X/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7y+H7y+H7y+H7y+H7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zOH7zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T9zuX7zuX7zuX7zuX7z+b9z+b9z+b9z+b90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uT+0uT+0uT+0uT+0+X/0+X/0+X/0+X/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7zOL9zOL9zOL9zOL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+zuX7zuX5zuX5zuX5z+b6z+b6z+b6z+b90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0+X/0+X/0+X/0+X/1Ob/1Ob/1Ob/1Ob/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1en/1en/1en/1en/1en/1en/1en/1en/1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60uj50uj50uj50uj50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7zOL9zOL9zOL9zOL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX90uj70uj70uj70uj70Ob60Ob60Ob60Ob60OX90OX+0OX+0OX+0OX+0OX+0OX+0OX+0+X/0+X/0+X/0+X/1Ob/1Ob/1Ob/1Ob/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1en/1en/1en/1en/1en/1en/1en/1en/1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60uj50uj50uj50uj50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7zOL9zOL9zOL9zOL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX90Ob60uX40uX40uX40uX40uX40uX40Ob60OX90OX+0OX+0OX+0OX+0OX+0OX+0OX+0+X/0+X/0+X/0+X/1Ob/1Ob/1Ob/1Ob/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1en/1en/1en/1en/1en/1en/1en/1en/1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60uj50uj50uj50uj50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3y+H7y+H7y+H7y+H7zOL9zOL9zOL9zOL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T/0OP/0OP/0OP/z+T9z+T9z+T90OP90uT+0uX90uX90uX9z+Hzz+Hzz+Hzz+Hx1OX21OX21OX21OX40uX60uX90uX90OX90OX90OX90OX90OX+0+X/0+X/0+X/0+X/1Ob/1Ob/1Ob/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1Oj/1en/1en/1en/1en/1en/1en/1en/1en/1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1Or71Or71Or71Or71Or71Or71Or71Or70+n60+n60+n60+n60uj50uj50uj50uj50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0ub/0OX+0uT+0OP9zuH60uL70OH61eX/zuH91Ob/1Ob/0+P9z9/4ydrwt8bch5aqiZepkJutsbvOn6q7qbPFzNbo1uHy0+Hx1uj41OX21+n70uX40uX61ur/0Ob60ub+0+b+0+b+0+b+0+b+1Oj/1Oj/1Oj/1Oj91en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ev/1ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91+v+1+v+1+v+1+v+1ur91ur91ur91ur91en71en71en71en71Oj61Oj61Oj61Oj60+b50+b50+b50+b50uX40uX40uX40uX40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uT+0uT+0+P91+j/1eP+0t/61eT/zNv4yNnynavFbXuVZHGIaHSMbHaMc3uPhYudeX+Rh42fkZeopKq6sLbGvcbVztzq0+Tz1eb31OX21uj60+b50OT51Or+0+b70+b70+b70+b71Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91+v+1+v+1+v+1+v+1ur91ur91ur91ur91en71en71en71en71Oj61Oj61Oj61Oj60+b50+b50+b50+b50uX40uX40uX40uX40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+zOH5zuP70+X/1ej/0uL70+P91OL92eb/0+H7qbfSbHqVXGqEbXqUaHGMbXePgouhhomejZClf4KWh4uef4KUsLPFuL3LlZupv8vZ0+Py1ub21+b41OX21uj61en70OT30+b70+b70+b70+b71Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91+v+1+v+1+v+1+v+1ur91ur91ur91ur91en71en71en71en71Oj61Oj61Oj61Oj60+b50+b50+b50+b50uX40uX40uX40uX40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3zeL9zeL9zeL9zeL9zuP+zuP+zuP+zuP+zuP7zuP7zuP7zuP7z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0+j/0ub/0OP9z+L70+P91eX/sb/agY+qcoCbV2R+XGmCfoukmKK9anGNh46qen+YhIWdm5yygoSahYabgoWWl5qpsrTBr7O/lp+ssb3LxtTk1OLy2ej51OP01uj61eb50+b70+b70+b70+b71Oj91Oj91Oj91Oj91en+1en+1en+1en+1en+1en+1en+1en+1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91ev91+v+1+v+1+v+1+v+1ur91ur91ur91ur91en71en71en71en71Oj61Oj61Oj61Oj60+b50+b50+b50+b50uX40uX40uX40uX40Ob40Ob40Ob40Ob4z+X3z+X3z+X3z+X3zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0+j/yd732uz/1Ob/yNnyeYmjTVt2WGaBVmN9W2R/ZW+JaXCMh46qZmqHjI+seHqXfX2YfnuVcW+GkZCll5apiYiYl5eknqGtxszavcbVmKKxr7nL1uHy1+X32uj51+b61ub91Oj91Oj91Oj91Oj91Oj91Oj91Oj91ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1+3/1+3/1+3/1+3/1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1ur91en71Oj61en71en71en71en70+b50+b50+b50+b50+b50+b50+b50+b50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0ub/0uT+xdfxZneQTV13TFp0TVpzT1hxX2aAanGNfoGecnaTcnOTiImphYWkc3ORdnOPf32Wnp2ym5qsgICNmpqlpKiyt7vHi5CekZeoiJGhrbbI093v2uT32+n61uj61Oj91Oj91Oj91Oj91Oj91Oj91Oj91ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1+3/1+3/1+3/1+3/1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1ur91en71Oj61en71en71en71en70+b50+b50+b50+b50+b50+b50+b50+b50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0ub/z+T9vc/pWGuFSVpzTFx2UF55Tlt0YmmCc3iRjpOsgIKffoCdgoKiqajLgYGhfX2bcXGNfn+XnJ2ynJ6tgoWRsbS/pKiyf4SPqKy6e4COiY+fmJ6vs7vO19/y1+X31uj61Oj91Oj91Oj91Oj91Oj91Oj91Oj91ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1+3/1+3/1+3/1+3/1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1ur91en71Oj61en71en71en71en70+b50+b50+b50+b50+b50+b50+b50+b50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob4zuP+zuP+zuP+zuP+z+T/z+T/z+T/z+T/z+T9z+T9z+T9z+T90OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX90OX90OX+0OX+zd/5W22HR1dxTFp0SVdyRlFtb3iTm5+0oaS4kZWqeXqQc3OPpKTCvbnZsrDMiYujbG2EenuQdniJnJ6rq6+5zM/aj5ObjI+am56pmJuof4SRkJWjqrDA1Nrq1+Lz1+b61Oj91Oj91Oj91Oj91Oj91Oj91Oj91ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1ur/1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1uz+1+3/1+3/1+3/1+3/1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+1ur91en71Oj61en71en71en71en70+b50+b50+b50+b50+b50+b50+b50+b50Ob40Ob40Ob40Ob40Ob40Ob40Ob40Ob40OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+z+X/z+X/z+b+z+b+zuP6z+X51ur/0uX9us3ma36aSlh2TFd2TFRxRk5rUVh0bHGIxsjao6Wy4eTvt7fEhYSWo6K3zs3i3dzv7Ov7uLjFo6KyeXmGl5ejsrK7urrGiIiRlZacnZ6kra23lZijgoWRoaWxrLG/1d7t1uX31+n71Oj60+b51Or+1Or+1On/1en+1ur/2er92er92er92er92er92er92er91ur91ur91ur91ur91+v+1+v+1+v+1+v+1+3/1+391+391+391+391+391+391+391+391+391+391+391+391+391+391+392e392e392e392e391+z71+z71+z71+z71+391uz71ev61Or51Or51Or51Or51Or50+n40+n40+n40+n40uj30uj30uj30uj30Ob20Ob20Ob20Ob20Ob20Ob20Ob20Ob20OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+z+X/z+X/z+b+0OX91er/0OT5z+P4rMDVVmmCSVh2Tlx5SFBwTFNwSE9sZWmGjY+ok5WisrK72tvh0tLbgoGRlJOjurnJzMzZsLC7l5ejjIyYeXmGt7fAo6Osnp6qf3+Lm5qhr620qqqzu7vFqq24nJ+qmp6qo6m3zNrq0uPz2uv72u3/1en71Or+1On/1en+2er92er92er92er92er92er92er92er91ur91ur91ur91ur91+v+1+v+1+v+1+v+1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61+/71u361ez51Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+z+b+z+b+0OX+0OX90OT70OT7vc3jU2N7RlZwSVd0U159TVV0TFNwSE9sbHCNk5WtiIuanaGpjpGXiY2Vamx5hYeWd3mGkJOfaWt4amx5c3aFiIuayc3XhYiTeHqHj4+cpqWvqaixmpqjra23srbAlZijpqu2h46YprLAyNbm1+j31+n52er91en+1en+1en+2er92er92er92er92er92er92er92er91ur91ur91ur91ur91+v+1+v+1+v+1+v+1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61+/71u361ez51Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+z+b+0OX90OX90uX90uX9o7PMVGR9SVdxSVdyUV17UFx6T1d3TFRxRk1qY2aEen+WaWx+eHuGeX2Fen6IXV9vfoCPpai0a216aWt4ZWh3XmFydHeIjpCdfoCNh4mYc3aFaWl0o6KrwsLMlZWeiY2XfYCLkZahhouVl56pzNXi1uLw3ev73Ov91+n71en71en+2er92er92er92er92er92er92er92er91ur91ur91ur91ur91+v+1+v+1+v+1+v+1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61+/71u361ez51Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0+j/zuP61en/yNzzcYGaSVpySlhySVdyT1t5SlZ0UFh4VFx7Rk5rVl16dn2Yb3ONWFxwcXaEZmt3goeTZmp7iIydgYaRc3iEhouYeX2OaGt/ZWl9WF1rdHmHh4ucY2V3YmJvhoSQsLC7vb3IsbS9x8vTt73Eoaatt7vGtrrFwMfS1+Pv2eb32ej51uj62ez/1ur91ur91ur91ur91+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+2ez/2ez/2ez/2ez/1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61ez51ez51ez51ez51Ov41Ov41Ov41Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX9zuT40+b7xNfvXm+HSFhxTVt2RFFsUFx4Tlp4SVVzTFRzTVV0SFBtXWWCa3KOU1pzU1dvV1twZmp7cXSGdHiMam2BXWFyWl5sbXGCXmJ2W15zZGh9Zmp7ZGh5aWyAZWh5fn6LmJajoqKtqam0oqWtu7/HqrC3sbe+wcXLzM/XtrrFwcjT2uXz2uj42+z91ur91ur91ur91ur91ur91+v+1+v+1+v+1+v+1+v+1+v+1+v+1+v+2ez/2ez/2ez/2ez/1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61ez51ez51ez51ez51Ov41Ov41Ov41Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX91en+ssbbVGR6RVVtTVt0QU9qV2OBTVh3SlNyU1t6SVFxSlNyW2OAXmaETldyTFNvUFRxSU5oV1xzaW2CWF10YWV9VlxvWF5xVVttXWJ3V1xzXWJ5a3GEZmx/VltwVFdrcXCAlZOhqqq2mJikiIyUjI+XhYuPsra7t7i7zMvP2t3lvcHMucLP1OLy2+r71en71ur91ev91ev91ev91uz+1uz+1uz+1uz+1+v+1+v+1+v+1+v+2ez/2ez/2ez/2ez/1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61ez51ez51ez51ez51Ov41Ov41Ov41Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0OX+0uX9s8TaTl50SVpwSVdxSFZxUV96Slh2TFd2Tlp4RVBvTFd2UVp5Vl57V199VVx5T1ZzUVVzVFd0e4CaXGF6U1dxUFVvUFVsT1RpVltwbXKHVFhyT1RtbXKHeH2RX2R7WFxxen2MnJyoj4+blpaien6IhomUe3+Jd3eAjIuRxsXMzMzVpaq0sLfBxdDe1+X22+v62er61ur91ur91ev91uz+1uz+1uz+1uz+1+v+1+v+1+v+1+v+2ez/2ez/2ez/2ez/1+391+391+391+391+391+391+391+391+/71+/71+/71+/71+/71+/71+/71+/72e372e372e372e371+z61+z61+z61+z61ez51ez51ez51ez51Ov41Ov41Ov41Ov41Ov41Ov41Ov41Ov40+r30+r30+r30+r30un20un20un20un20Oj00Oj00Oj00Oj00ub+0ub+0ub+0ub+0+j/0+j/0+j/0+j/0uT+1Ob/1ej/0OP90OP91ej/1ej/qLjSWmiBTlt0Tlt0T114UV96TVt2TFp0TFx2Slp3QlFvUF57UV17V19/V11+V1t7VVh3UVVzXF99aGyGVFhyTE9tSU1rREdkREhfRUlegoecbHGLVFhyfoKaf4SbVFd0YWV/cXaEpqq0h4uVfoCNcXCAh4aWjYycgoCQiYeUoZ+pxcXQs7fBoaWwpKmzxczV2eLs3Or63u3/2uv71uv61uz71+391/D+2fH/1+392e392e392e392e392e392e392e391+391+/71+/71+/72fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD62fD62fD62fD61+/51+/51+/51+/51u361u361u361u361ez51ez51ez51ez51ez51Ov41Ov41Ov40+r30+r30un20un20+r30un20un20un20un20Oj00Oj00Oj00ub+0ub+0ub+0ub+0+j/0+j/0+j/0+j/0uT+1un/0uT+0+X/0OP90OP9fY+pT195Tlp2TlZzTFdzUV15TFdzTlx3Tlx3SFhySVpzSFd0U2F+U159W2GBYmWGaGmLV1h4V1t5Vlp3Wl54VFd0UFRyT1NxTlFvQkdhSU5je4CVXmN9W195lpuygIWcWFx5UVZwam99iI2XoqSxrbC/d3aGiYibiYaampaqiYeVcnB9l5ejv7/LhIePoqWtu8HGydDa3en32eb43Ov93e//2u/+2e/+1u/91e371+392e392e392e392e392e392e392e391+/71+/71+/71+/72fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD62fD62fD62fD61+/51+/51+/51+/51u361u361u361u361ez51ez51ez51ez51ez51ez51ez51Ov40+r30+r30+r30+r30+r30+r30un20un20un20un20Oj00Oj00ub+0ub+0ub+0ub+0+j/0+j/0+j/0+j/1Ob/0+P91ub/1eX/2+v/d4ehTV13RFFsTFdzTFRxU1t4Vl57T1t3U156TFdzQlBrTFp0T114VWF9WmJ/bHOQX2OBb3CPf4GeXmJ/VVh2XGF6V1x2R0ppSExqTVBtRkpiSU9iWF5xWl52eX6Vn6W4d3uQVVpxW190dHmHdHmFh4mWjY+ehYSUiYiYo6GxrKq6u7vIdnaCf3+Ln5+rpqqyqay0pKiwub7I2+b02+n52+v62er52/D+2fD91u/71e361+392e392e392e392e392e392e392e391+/71+/71+/71+/72fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD62fD62fD62fD61+/51+/51+/51+/51u361u361u361u361ez51ez51ez51ez51ez51ez51ez51ez51Ov40+r30+r30+r30+r30+r30+r30un20un20un20un20Oj00ub+0ub+0ub+0ub+0+j/0+j/0+j/1Oj/1ub/1OT+0+P91+j/fo6oSFhySFhySVdySVVxTVVyUVp3TlZzUVp3UFh2TlZzSlZyU195T1x2VV55XmWBVlp3XmJ/c3aThoileX2aVVpzXWJ5WF13UFRxUFRxTVFrTlNqUFZpTFFkU1dvfoKXnqS3anCCXWJ3W190cnaHVVpoWlxra219gYCQmpqmsa+9wL7Mqam2ZmZzeHiFiYmVjI+alpqimJyknqOtxs/e3ev73Or62+v62e371u362fD92vH+2e392e392e392e392e392e392e392e391+/71+/71+/71+/72fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD92fD62fD62fD62fD61+/51+/51+/51+/51u361u361u361u361ez51ez51ez51ez51ez51ez51ez51ez51Ov41Ov41Ov40+r30+r30+r30+r30+r30un20un20un20un20ub+0ub+0ub+0ub+0ub+0ub+0ub+0+b+2ur/z934ztz3aHaQSFZxSFZxSFZxR1VwSFRwT1d0VV16TFRxTFRxT1ZzTFNwU1x3T1hxVl13VVx2XWJ7cHSOam+Ia22Ien2Xa3CJWF13TFBoTlNqVFd0T1NwV1x2TFBoTVFmUFVqVltyYWV9VVttVVtta3CFWF1yXmJ2XmJ2ZWh5YmRzZWVyn5+rqaazop+si4maa219Zml4dHeEf3+MjY2YjY2YoqSxn6Wzztro3Or42en23vH92e352fD61ez52u/+2u/+2u/+2u/+2u/+2u/+2u/+2u/+2fD92fD92fD92fD92fD92fD92fD92fD92vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH72vH72vH72vH72fD62fD62fD62fD61+/71+/71+/71+/71u361u361u361u361u361u361u361u361u361ez51Ov41Ov41Ov41Ov41Ov41Ov40+r30un20un20un20ub+0ub+0ub+0ub+0ub+0ub+0ub+0+b+1eX/ztz3ZHKNRlRvSVdyRVNtRlRvTVh0U156VV16SFBtTFNwSlFvVVx5XGOAc3eUW193XGF4XmN6ZGmAY2h/Y2h/ZGZ/X2J6U1dvTlNqWF1yXGF4XGF6T1RtUFVsYWV9UVZtSE1kTFBqSU5oTVFmZGp9eX6TZWp/Vlpvam2CgIGWi42cgYGOh4eTqKawnp6oeXuLhYeYgIKRen2MfXuMj4+ckZGeqKq3lZupwMnZ2eTy2eb02ur33O/62e352/L92u/92u/+2u/+2u/+2u/+2u/+2u/+2u/+2fD92fD92fD92fD92fD92fD92fD92fD92vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH72vH72vH72vH72fD62fD62fD62fD61+/71+/71+/71+/71u361u361u361u361u361u361u361u361u361u361u361ez51Ov41Ov41Ov41Ov41Ov40+r30un20un20ub+0ub+0ub+0ub+0ub+0ub+0ub+0+b+1eP+d4KeSFRwTVh0T1t3TFdzTlp2VF97UFx4TFRxSVFvTFNwT1NxXF9+aWyLgYShbXCIU1ZrZGh9hYidV1twW15zVVpvTlNoVltyX2h+XmZ6d3+TcXiRUFdxUFhvY2uBREpkR05qTlVxRk1pWGF3dH2QgIicVltyU1VtdHePkJGmlJaonZ2qm5uksbC3iYuQeHqHf4KUhIaXi42efXuMlJOjnJqotLTBkZakprC9y9bi3Ov23e343fD51+322u/62u/92u/+2u/+2u/+2u/+2u/+2u/+2u/+2fD92fD92fD92fD92fD92fD92fD92fD92vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH72vH72vH72vH72fD62fD62fD62fD61+/71+/71+/71+/71u361u361u361u361u361u361u361u361u361u361u361u361Ov41Ov41Ov41Ov41Ov41Ov40+r30un20ub/0ub+0ub+0ub+0ub+0+b+0+b+1eX+fYulRE9rSVVxTVh0SlZyTVh0UFx4U156TFd2SFBwR05rRUxpTlFvZGiFjJCqpqnEm56zW15ye3+TaWyBU1ZrUVVqTVFmR0xhSlNmX2h7bHSIV192VFt0XmV/SlNpR05oTlVxTFNvRk1qRk1pSVBqcnqQVl50TFBoT1FseHqTmJqwhIWah4aWjY2YuLe+lZSdgoKPhIaXhIaXeHeJdHOEkI+fm5uotLTBq626l5yoqbC6zdni2+ry2ur03/L73PL62u/92u/+2u/+2u/+2u/+2u/+2u/+2u/92fD92fD92fD92fD92fD92fD92fD92fD92vH+2vH+2vH+2vH+2vH+2vH+2vH+2vH72vH72vH72vH72vH72fD62fD62fD62fD61+/51+/71+/71+/71u361u361u361u361u361u361u361u361u361u361u361u361Ov41Ov41Ov41Ov41Ov41Ov41Ov40+r30+j/0OX+0+X/0+X/0uX90+P71OT6bXuVTFdzSlNwSlNwTlZzVFx5WmJ/WGF+TlZ2R09xRkxvR01tSVBsUVhyYmp+mqK0tLrNiI2iZmuAaW2CXGF4TlNqSk9mUVZtTFBlVltwXmN4Y2h/RklmTVRxSE9sRk9qTlVxWmF9RklmUVVyTVBtVFd0ZWqETVFrTVFrV1p0fX+aeHqTW1xyYmFzZmV2mJakj42bjYuYjoycn5ywXVxvYV9yi4man5+sxMTQu7vHpKStoaSvpq23y9fe3ez03fD33fD53O/63O393O393O393PH/3PH/2/L/2/L92/L92/L92/L92/L92/L92/L92/L92/L93PP+3PP+3PP+3PP+3PP+3PP+3PP+3PP72/L62/L62vH52vH52vH52vH52vH52vH52fD42fD62fD62fD61+/51+/51+/51+/51+/51+/51+/51+/51u341u341u341u341ez31ez31ez31ez31Ov21Ov21Ov20+r00OP91un/0+b+1OT91OT91+X/cH6XVGF6TlZzTFRzTFRzTlZ2Vl5+Vl5+TlZ2RU1sR01wTlR3TFNwRk1pW2N5cHiMnaa2q7TEXmN4X2R7XGF4V1xzVFhwTlNqTlNqXGF2aW+BWl5zZGmCRklmR05rSU9wR09sU1p2ZmuFXmN9fYGbW195UFRxZWmGT1RtTlNsYmR/jY+qXV94XV50e3qPenmMnJqqjoyclZCfl5OknpuvXVptW1psa2p9m52ss7O/urnCvr3ErKy2qK20sbvE0N3k3/H42ur03e363e363O/63O/63PH93PH92/L92/L92/L92/L92/L92/L92/L92/L92/L92/L93PP73PP73PP73PP73PP73PP73PP73PP73PP73PP72/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31+/31+/31+/31+/31u321u321u321u321ez01ez01ez01ez01Ovz1Ovz1Ovz0+ry1+n70uP21eX71+b91uT+hJCqSVZwV199UFh4TVV3TVV3UFh6VV1/TlZ4R09xRExtTlR3SU9wQklmSlFtTFRqbXaJr7fJcHiLV1xzY2h/Wl52TVFpU1dvT1RrUFVqYWV6XGJ0aW+BYWV9QUViTFNwTFNwR09sSlFrV1xzc3eMo6W+dHePWFt2aWuGSk1qUVRvcHKNf4GaTU9oXF1zeXiLiYiYo6GxjYuYnZiojYiac3CEcm+CYV9yXl1wiYybr6+6s7K7t7a9wMDJnaOqr7a/v8zT2+ry3Oz33e363e363O/63O/63PH93PH92/L92/L92/L92/L92/L92/L92/L92/L92/L92/L93PP73PP73PP73PP73PP73PP73PP73PP73PP73PP73PP73PP72vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31+/31+/31+/31+/31u321u321u321u321ez01ez01ez01ez01Ovz1Ovz1Ovz0+ry1eX01+j31uX31+T5jJiwUFp0U1x3TFRxUVp5TlZ4TlZ4UVp7T1d5SFByRk5wSVFxUVd4V157TFNvTVRtSE9pU1txeoKWW2N3WF13Vlt0SE1mQEVcSU5lYmZ+UFVqcniLaW9/ZGp6UFVqSE1mT1ZySE9sTVVyRk1pSE1kWFxxam2CZWl+f4GagIKbUFNraWuEd3mRbG+HVFdsX2F2e3qNjo2dop+tkI6coZyrk46fj4yfkI2hcnGEWlhrbXB/oaGslpWeurnAy8vUm56mnqWvrLe/y9bf2+r03e363e363O/63O/63PH93PH92/L92/L92/L92/L92/L92/L92/L92/L92/L92/L93PP73PP73PP73PP73PP73PP73PP73PP73PP73PP73PP73PP72vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31+/31+/31+/31+/31u321u321u321u321ez01ez01ez01ez01Ovz1Ovz1Ovz0+rylaSvr77IvcvZeoWWU1xyVl13UVh0Vl16U1t6VFx7UFh4TFRzRk5tSVFxT1d3VFx7V156UVh0SlFrRUxlRUxlTlVvVV1zR05oR0xlUFRxTlNsVVpxTVFpcHSJW190eoCQanF7fYSOWF5vSE1kVFt3T1ZzTlZ2U1p3VVdySElfVFVrcnOIf4CVd3iNaGl+c3SJVVhtTVBlVVhtc3SJjYyclZWirau5lZOfpJ+vqqW3qKS4op6yoZ+ycXCCbXB/m5umoZ+prKuytLS+s7e/n6Svq7K7qrG72eTw4e/93Oz54fP/4fP/3PH93PH92/L92/L93PP+3PP+3PP+3PP+3PP+3PP+3PP+3PP+3fT93fT93fT93fT93fT93fT93fT93fT93PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31u321u321u321u321u321u321u321u321ez01ez01ez01OvzZXF6aXR+TlplT1hoUFhsWF10WF13W157UVh2U1t4U1t4UFh2TlZzUVp3VFx5VFx5TVRtTVRtQkljQUhiTVRtRUxlQkljQEdjSU1qT1NwT1Rtam+IcneOaGyBZGp9TVNjUFdhYWhyTVNjVltwVFt0UVh2T1d0VFt3VlhxVldsaWp/cXOFYWN0cXOFjI6ddniJU1ZqVFdsV1tvaGp7kZChpqaznJqmnZuotrHAo56wjouejIickI+impirkJOij4+bmpiijYyTubnCxcXOpqq0r7O+pqu3tr/M4e/93u/74fP/4fP/3PH93PH92/L92/L93PP+3PP+3PP+3PP+3PP+3PP+3PP+3PP+3fT93fT93fT93fT93fT93fT93fT93fT93PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31u321u321u321u321u321u321u321u321ez01ez01ez01OvzgImUeYKNYmt4TlRkVlxvWFxxV1twXmF5U1pzVV55VV55UVt2U1x3VV55U1x3TldwRk5kQUlfQkphPkVeR05oR05qNz5aO0JfP0JhP0JfQkdhWF13SU5lY2h9iY+iR01dRElXT1VlYWZ5X2R5SlNpTVRtV2F3ZGyAW11vZmV2c3KCaGZ3ZmV2bWx9mpirnqGycXSIX2N4YWR4W11vgH+PpqaznZuonJqmram4lpGjfXmNeneLe3qNhoWXlZemkJCcjo2WjIuRqamywMDJsrbAuLvGtLfEnKKwwc/d3Oz54fP/3vH93PH93PH92/L92/L93PP+3PP+3PP+3PP+3PP+3PP+3PP+3PP+3fT93fT93fT93fT93fT93fT93fT93fT93PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31u321u321u321u321u321u321u321u321ez01ez01ez01OvzhYyWdHuGcHSAbHF/aGx6ZWh5VFZoX2F2Wl5zWGF0VV1zUFhvUVhyVFt0TlVvRUxlQUhiREhfQUZfQEdhRUxoPURhPURhQEdkPkFfPkFeSk5rSE1mQUZdUFVqT1RpT1VoWF5xc3mMZWp/T1RpU1txRk5kTFZpVFxwWFxwWlxtXmFyaWh6ZGN2aml5i4mao6K0cnOIeX2QfoGTeHqJd3mGhISQl5ejiYeUfnuJh4WTiYeXjYmdhoWXi4malJajjIyXmpiiuLe+u7vFvr7Hv7/Lvb3ItrbBqq+6j5um0+Pw4fH+3O/63vH93PH93PH92/L93PP+3PP+3PP+3PP+3PP+3PP+3PP+3PP+3fT93fT93fT93fT93fT93fT93fT93fT93PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31u321u321u321u321u321u321u321u321ez01ez01ez01Ovzj5OdlZijiIyWi46YxsnUsbG9mpqlm5uoc3aCaGp5cHOFVlptVVpxUFVvTE9sRkloRkloR0hoRUZlQUVjQERiQERkPkRkPkViPkViP0ZiSE9rRk1pQUhiQUhiQkljTlZsWGF0U1ttXWV5ZGyAVV1zTFNsSlFrTFNsVFd0SEpoT1FqXV50Y2R5eHqJsbG+h4aWbXCBfX6TkZSjnqGtlpilgoWRf4GOdnaCf3+Mc3OAi4uXj46egH+PhYWRk5OfnZ2pnJukray2urnCvr3GpKOsubjBvr3GsrbAl56pnKiz3+/54fH72+353/L+3fL/2u/63vP/3vT93vT93vT93vT93vT93vT93vT93vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3fb63fb63fb63fb63PT53PT53PT53PT52/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31e/21e/21e/21e/21O301O301O300+zzj5CWiYuQm5yioqOps7S62drfyMnPrK2zvb7Et7fAqKq3W11vYmN7YmSBTU5tSU1rSkxrTE1sSUpqRkdpQERkQERkPkRkPkViP0ZiPkVhR05qREpmQkllQUhkP0ZiRk1mRExiQEhcSVFlY2uBUVpwSVBqRk1mT1ZyTVBvTE9tUFNtXV94XV5zcHKEhYWRfn2Nf4GTfoCRdniHh4mWoqWwo6WycHKBdniHgYGOhYWRc3OAkJCdjo6bfn6LjY2anZ2qmpeknJukpKOs09LbpKOsray2s7K7sLC5sbbAgoyW0t3p3+/54fH+4fP/3/T/3fL+3vT93vT93vT93vT93vT93vT93vT93vT93vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3fb63fb63fb63fb63PT53PT53PT53PT52/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31e/21e/21e/21e/21O301O301O300+zzwcLGpKWpjI2QlJWYl5ic3t/jzs/TxcbJv8DEtLa7t7fCe3qNY2R9aGiGVld5TE1vSUxpSk1qSEpoRUZlQERiQERiPkViPkViP0ZiPkVhRUxoQUhkQUhkQUhkPkVhQEdjRUxoPkVeRUxlXWV7SlNpR09jTlZqVl5yUFVvTlNsT1FqWFxxUVNoYmR2b22Ae3qNe32RbXCBUVRjW11qhYiTi42ahoiXjI6dhoaTZGRxYmJveXmGiIiVjIyYj4+ck5OfnZuom5qjnp2msrG6np2mpqWvoZ+pkJCatLnEmJ+qrLbA4u354fH73vH92/D73fL+3vT93vT93vT93vT93vT93vT93vT93vT93vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3fb63fb63fb63fb63PT53PT53PT53PT52/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31e/21e/21e/21e/21O301O301O300+zzycvNtLa4pqiqkZOVi4yOt7i63N3f2tvduLm7srO3x8fQqqm5eniPZGSAX19/Tk9vREZhREZhQUReP0FeQERhQERiPkViPkViQEdjPkVhREpmP0ZiPURfQEdjPkVhQEdjRk1pQEdjSlFrWGF3UFhvSlNmWGFzUFhsR0xjUVZtXF90UVVqU1RpXF5wdHOEdnSHgYKXaWt9VVdmaWt4eHuGhYeUh4mYj5GhkJCdXl5renqHgoKPiYmWh4eUkZGelJShlJGeo6KroZ+psbC5hoWOo6KroqGqn5+psrbArbK9i5Gc2uPt4/L94fP93vP/4fb/3vT93vT93vT93vT93vT93vT93vT93vT93vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3fb63fb63fb63fb63PT53PT53PT53PT52/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41+/31+/31+/31+/31e/21e/21e/21e/21O301O301O300+zzqauqvsC/kZSTiIuJbXBven17y83M3+Lh1tbW0tLUwcDHwL7LsrHElpSrZGV+T09rSExhR0pfSEpjRkhhQEVePUBdOkFdPURfPkVhP0ZiPkVhO0JePkVhP0ZiQEdjQUhkTVRtU1pzSFBmRk5kU1txT1dtUVpwTFRqSk9pX2R7Sk5jX2N3XV9xamx7bGx5f3+MeXuNVlhqV1ppcnSBbHB6gIKPlZemoqSzlJShd3eEfX2Ji4uXhoaTlJShoaGtk5Ofm5illJOcm5qjxsXOo6Krnp2mqqmysK+439/pu7vHlJijusTO3ez04fP93/b+2/L63vT93vT93vT93vT93/b+3/b+3/b+3/b+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vf73vf73vf73vf73fb63fb63fb63fb63PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41/H41/H41/H41/H41vD31vD31vD31e/2fn+BsbK0iYuNgYKFZGVokJGUr7Cyzs7OuLa309DU3Nre0tDXsK26qqm5d3aIV1htT1NkTlFlTlFlTE9kQEVcPkJcOkFdPkVhP0ZiPkVhO0JePURfQEdjP0ZiPkVhPURdPUVbRk5kRExiTVVrU1txUVpwVFt0VVx2VltyZWqBVFdsWFxwY2V3amx5eXmFjo6beXuNXF5wbG9+eXuIi46YlJajdniHfoCPlZWikZGegoKPk5OflZWiiYmWlpajmJiln52qoZ+ppqWvn56osbC5o6KrqaixqqmysbC5tLO9rLC6i5Gb3+v02+303vT93/f/3vT93vT93vT93vT93/b+3/b+3/b+3/b+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vf73vf73vf73vf73fb63fb63fb63fb63PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41/H41/H41/H41/H41vD31vD31vD31e/2oaKllJWYgoSHe32AZGVphYaJmJqdmpqcm5iaxcDB29nc09DUzczQxsXMsLC5ZWlzVltmVFhmUVVmT1NmQUZdPkJcO0JeP0ZiPkVhO0JePURfPURfP0ZiPkVhPURfO0JcQkphRU1hQEheTVVrSVFoSlNpTlVvVl50ZGl+e4GUV1tvZGh5c3aFen2MoqKvcXCAVlhqeHqMcnSEdniFgISOk5WiZml4ZGZ2jo6bkJCdd3eEh4eUo6Owvr7Ll5ekm5uonJqmmpiir623wcDJpaSttLO9ray2sK+4pqOrzcnUvb3GnqOtqba93vD33vT63fb63vT93vT93vT93vT93/b+3/b+3/b+3/b+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vb+3vf73vf73vf73vf73fb63fb63fb63fb63PP73PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41/H41/H41/H41/H41vD31vD31vD31e/2sLG0sLG0paaqjo+Te32AZWZqbW9yX15jr6yw1dPWl5WYpqSokI+UjIuPlZaciYmTXmJsVltmU1dlUFRlQkZbP0RbP0JfPkVhO0JePURfPURfPkVhOkFdO0JePURfPkVhRk5kQUlfO0RaSlFrSE9pQkljO0JcQUhiVltwYWZ5XWFyaGx6eXuLf4GQnp2taml5d3mLYmR2amx7fX+MZml2foCNb3F+enqHmJikjo6akJCch4eTfn6Jk5Ofq6u4k5OenJukoZ+pmJeho6KrnZylqqmyn56otrS7paKq0tDXwMHHr7S7pbC22unw3/H34/b93vT63vT93vT93vT93/b+3/b73/b73/b73vb+3vb+3vb+3vb+3vb+3vf73vf73vf73vf73vf73vf73vf73fb63fb63fb63fb63PT53PP73PP73PP72/L62/L62/L62/L62vH52vH52vH52vH52fD42fD42fD42fD41/H41/H41/H41/H41vD31vD31vD31e/2trS5qKarn56jmpidfn2Benl+i4mOdHN4cXB0q6qvxMLJjYyTVlVeV1ZfbGp3eXmFbHB6VFdiU1ZhVVdmR0peR0liQERhPkViP0ZjPkdiPUZhO0VdO0VdO0VfO0VfO0VfP0hhP0hhP0hhP0hjQElkPkdiPkdiQUhkTVFpTlNoX2N0cXaEh4mWf4GOdnSFc3KCenmJa2p6dnSFf36OeXmGlZWik5OflpaisbC5qaivnp2mlZSdgYCJlJGekI6boZ6roqGql5afi4mQo6Kp0M/WqqmwpaSrsK+zsbC0qquvs7i6sra7sLa9tLvC1uHm3+/24fP63fb63vf73vf73/j94fn94vj94ff74ff94ff94ff94ff94vj+4vj94vj94vj94fn94fn93/j73vf63vf63vf63vf63vf63fb53fb63fb63fb63PT53PT53PT53PT52/P42/P42/P42/P42vL32vL32vL32vL31/H21/H21/H21/H21vD01vD01vD01e/zcnF2paSpm5qenJufe3p/k5GWhIKHd3Z6gH+GpaSrurnCmJehYV5rX11qYl9tZGJwc3N/XF9oTlFcXF5rTlFlR0liREdkPkFfP0ZjPkZjPUZhO0VdO0VdO0VfO0RhO0RhPkdiPkdfPkdiPkdiPUZhPUZhP0dkRUxoVVpzT1RpXWFygIWTgoWRc3aCeXiIa2p6b21+ZGNzf36OiYiYfn6LfX2Jmpqlk5OcsK+2rKuwqKatm5qhlZSdrKu0lJGelJGepaStlpWelJOaoqGotLO4xcTI09LWvbvArK2wqquturu/u7/FpKiwwMbNnqSr5O/34vT73vf73fb63PT54vr+3vf63/f44/n+4ff94ff94ff94ff94vj94vj94vn64vn64fn94fn93/j73vf63vf63vf63vf63vf63fb53fb53fb53fb53PT43PT43PT43PT42/P42/P42/P42/P42vL32vL32vL32vL31/L01/L01/L01/L01vHz1vHz1vHz1fDyfXuAd3Z6cnF2dnR5gYCFsK+zoZ+kkI+Ui4mQiYiPiYiRmpiihIGOjImWYV5sWldlXl5qW15pWl1oXV9sUFRlSk5jR0xlQERiP0ZjPkZjPUZhO0VfO0VfO0VfO0RhO0RhPUZhPUZePUZhPUZhPUZhPUZhP0dkRUxoXGF6T1RpY2Z4gIWTamx5XF5re3qLX15vVlVlYmFxcXCAf36OfX2Jc3OAjY2YjY2Wqaivq6qvr620nZyjoZ+pxsXOqKWykI6bray2kZCanp2kpaSroZ+kwsHG6+rvzMvPxsbIsbGzxcbJvr/Fr7K6vcDIk5ifwczU3/H43/b73vT63/b73/b64/n+4vr73vf64ff94ff94ff94ff94vj94vj94vn64vn64fn94fn93/j73vf63vf63vf63vf63vf63fb53fb53fb53fb53PT43PT43PT43PT42/P42/P42/P42/P42vL32vL32vL32vL31/L01/L01/L01/L01vHz1vHz1vHz1fDyv77CiYiNXFtfZWRphIKHsbC0trS5l5ablJOai4mQhIKMW1pjhYKPv73Jk5CeY2FvXV1pVlpka295X2JvTlFjTlFmR0xlR0poP0ZiPkZjPUZhO0VfO0VfO0VfO0RhO0VfPUZePUZePUZhPUZhQElkPkdiPkZjQUhkR0xlWF1yY2Z4ZGl3XV9sZWh0f36OYmFxXFtrc3KCeHeHe3qLgoKPeXmGiYmVlZWeo6Kpqqmts7K5np2klJOcqqmyoZ6rpKKvt7a/jIuUpKOqqqmwpqWqqaisx8bLwcDFvb2/v7/Burm+xsfNubnCvsHJvsHJjZSd0uHp3vH45Pf+5Pr/4vj94ff73/j54fn94ff94ff94ff94ff94vj94vj94vn64vn64fn94fn93/j73vf63vf63vf63vf63vf63fb53fb53fb53fb53PT43PT43PT43PT42/P42/P42/P42/P42vL32vL32vL32vL31/L01/L01/L01/L01vHz1vHz1vHz1fDyqaistLO4ZWRpf36CoZ+kl5abrayxrKuwmpiflpWcnp2mfn2GV1VirKq3zcvZaGVzYmJtcHN+Wl1lY2ZxX2RyTVBkSU5lSk9pQUhkPUZhPUViO0RhO0RhO0RhO0VfO0VfO0VdO0VdO0VfO0VfPkdiO0VfQUlmSlFtSk9pV1xxWl1vbHF/X2Jven2JgH+PbWx9aWh4cnGBfn2NdnSFdHSBdHSBlJSfnZ2mrKuyrKuwqqmwmpifk5Gbnp2mpaOwvbrHpqWvlpWejYyTmpifnJufpqWqv77CxsXJwL7BxcLGv77C1NPasrK7u7vFvsHJn6SvhZCaydnh5Pb93O/24ff74/n+4/v95P3/4vj+4vj+4vj+4vj+4vj94vj94vn64vn64fn94fn94fn94fn93/j73/j73/j73/j73vf63vf63vf63vf63fb53fb53fb53fb52/P32/P32/P32/P32vL22vL22vL22vL21/L01/L01/L01/L01vHz1vHz1vHz1fDyu7q/wsHGoZ+kjIuPqaiso6KmlpWalJOXqKatnJuinp2msK+4goCNW1hlXlxquLbEXV1pWFxmX2NrXF9qbHF9Zmp7REhdR0xjREpkPkdiPUViO0RhO0RhO0RhO0VfO0VfO0VdO0VdO0VfO0VfPUZhO0VfP0dkR05qUFVvUVZrU1ZobHF/dniFeXuIZWR0ZWR0eHeHeHeHc3KChIKTiYmWcXF+iYmVqKixxsXMvbvAsbC3vbvCn56oj46Xk5Cde3mGgH+IkI+YpKOqk5GYkI+UpqWqu7q/y8nOyMbJy8jMwsDFwL/Gu7rEv7/IwsLMsLS/fYaQkJyl3+/36Pn/4fT54ff74fn64fn94vj+4vj+4vj+4vj+4vj94vj94vn64vn64fn94fn94fn94fn93/j73/j73/j73/j73vf63vf63vf63vf63fb53fb53fb53fb52/P32/P32/P32/P32vL22vL22vL22vL21/L01/L01/L01/L01vHz1vHz1vHz1fDy0M/Ur62ypaSppqWql5abm5qenZyhkZCVkZCXiIeOlpWeuLfAxsTQXlxpYl9tcW99U1NeWl1oW15mYWRvaGx4fYGPRkxePUFWRk1mQElkPUViPUViO0RhO0RhO0VfO0VdO0VdO0VdO0VfO0VfOkReOkRePUViQUhkRkpkTlNoTVBiXWJwgYSQj5GehIKTh4aWeHeHgYCQeXiIgH+PjY2af3+MdHSAjo6XsbC3urm+pqWsubi/ray2lpWepaOwj42amJehmpiilZSbmpifjo2Rqaisu7q/y8nO4t/j1M7TxMHGzMjQz87Xzs3Wu7vFpqq0o6q0eYKNrLjB6Pf/5fn+3/b63/j53/j74vj+4vj+4vj+4vj+4vj94vj94vn64vn64fn94fn94fn94fn93/j73/j73/j73/j73vf63vf63vf63vf63fb53fb53fb53fb52/P02/P02/P02/P02vLz2vLz2vLz2vLz1/L01/L01/L01/L01vHz1vHz1vHz1fDyyMfMqqmtlpWar62yqaiso6Kms7K3rayxo6Kme3p/h4aNnJukpKKvbGp3VlRiVlZjTlBdWl1oaWx3YmVwY2ZxaW15cnaHRkxeQkphREpkP0ZiPkViPURhO0RhO0VfO0VdO0VdO0VfO0VfO0VfOUJdOkReO0RhPURfQEdhP0RbRkldcHOFjI6dnJ6rl5ekgoGRgoGReHeHf36OgICNh4eUhISQdnaBhoaPv77FsrG2qqmwlpWciYiRoZ+puLfAqaixu7rErayzuLe+oZ+ml5abrayxvr3BxMLHzcvOzcvOube7vbq/sK+2s7K7wcHLwcHLvsHMoqaygomUy9fe5fT76Pv/4vj93/j74fn94fn+4vj+4vj94vj94vj94fn64fn64fn64fn94fn94fn93/j73/j73/j73/j73vf63vf63vf63vf63fb53fb53fb53fb52/P02/P02/P02/P02vLz2vLz2vLz2vLz1/L01/L01/L01/L01vHz1vHz1vHz1fDyx8fJz8/SwMDCpaWok5OVqKiqt7e5r6+xm5ubnJycgYKFcnN5mJiiaGh0Tk1dTlBfU1VkYWNybGx4ZmZybGx4cnSBfX+OZml6QUVaSEpjSk5rREdkPkFfOUBdO0JeQEdhP0ZiP0ZjPkViPkViPURfO0JeO0JePURfO0JcQUZfREhiQEJbTE9jbXB/jpCdmJuoi4uXenqHgYGOcnJ+eHiEdHSAf3+LgoKMtre9ubrAsLG3paaslZacq6yys7S6sbK4r620srG2t7a6urm+n56joZ+kvbvAx8bLwcDFsrG2tLO4urm+s7K30M/WxsXMxMLJvr3GtLTAjpGclZyl3erx6Pf/5fj/4ff94fv+4fv+4vr+4/r75Pv94/v94v394v394vr74vr74vr74vr74fn64fn64fn64fn63/j53/j53/j53/j53vf43vf43vf43vf42/b22/b22/b22/b22vT02vT02vT02vT02fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/w3t7hyMjLvb2/s7O2lZWXk5OVwMDCx8fJq6urr6+vuru+iYuOW15mVFZjUFNiWFtsVlhqYmRzb297sbG9m5umfn6JaGh0a2p6Xl90SElfSEplTU9sRklmP0JfOUBcO0JePkViPkViPkViPkViPkVhPURfO0JeO0JeO0JcQEdhPkFeQEVeUVVqTlFjVVdkgYWPlZWhhYWQh4eTaWl0ZmZybGx4gICMiYmVsLC5tLa7sbK4o6SqhYaMr7C2pqitsrO5ubi9srG2uLe7wcDFubi9m5qeoqGlu7q/ycjNubi9rKuwt7a6tLO42dfcxMLHyMfOwL3HpaStsrK7h4yWpa+53+v05vf/5Pr/4fv+4fv74vr74/r75Pv94/v94v394v394vv54vv54vv54vv54fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf42/b22/b22/b22/b22vT02vT02vT02vT02fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/w39/i0tLUmpqcnZ2fo6Olk5OVra2ws7O2r6+vn5+fl5ibr7Czen6Gamx5TlBfUVRld3mLaGp5enqHlJShyMjUXFxobGx5dHOEeXuNUFFmRUdfSEplR0poQUViPURfPkVhPkViPkViPURhPURhPkVhPkVhPURfO0JePURdOUBaQERhP0RdUFRpXmJzZGZzd3qFXV1pbW15iYmVe3uHamp2enqGhoaRk5OeoqKrs7S6ubrAsrO5lpedkZOYs7S6qaqwuLe7srG2rayxr62yvr3BuLe7sbC0paSpvr3Bx8bLurm+lJOXvbvAt7a6wL/Ezs3Ux8bPsK+4vb3Gmp6peH+Jsb3G6fj/5Pf+4vr+4fv74vr74vr74/v94/v94v394v394vv54vv54vv54vv54fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf42/b22/b22/b22/b22vT02vT02vT02vT02fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wzMzO19fas7O2qqqssLCyrKyvmpqclJSWoaGhpaWlo6SmpKWpmJykgoWRV1ppVFZocHKEXF5tf36OZmZzk5OfWlpliYmWoaGtpKa2dHeIRUhdRkhhTFBqR0poP0ZiO0JePURhPURhPURhPURhPURfPkVhPkVhPURfPkVeOkFbOz9cQEVeTlFmY2Z4hYeUo6axjIyXgICMd3eChISPe3uHf3+LkJCcjo6amJiitLa7s7S6s7S6pKWrgYKIpKWroaKotLO4s7K3sbC0t7a6zMvPvbvAvr3Bubi9v77Cu7q/xsXJmJeczMvPwsHG7Ovw4d/mxMLMx8bPtra/sLO+eYCLiZOd6/f/4/T74/n+4fv74vr74vr74/v94/v94v394v394vv54vv54vv54vv54fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf42/b22/b22/b22/b22vT02vT02vT02vT02fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wxMTGzMzOz8/SuLi6urq9s7O2wsLFrKyvmJiYkJCQk5SWl5icnJ+oh4mWTE5dSUxdcXOCbG9+a2p6Tk1dRkZTT09cZWVxfn6LeXuIhYeWX2N3PkBYT1RtRklmQUhkPkVhPkViPkViPkViPkViOUBcOkFdPkVhPkVhPURdPURdOz9cSE1mSExhXF9xgYSQrLC6r6+6k5OehoaRiYmVjo6aiIiUl5ejiIiUnZ2mpaasr7C2srO5uLm/mpuhjY6UsLG3tLO4ubi9sbC0urm+xcTIx8bLvbvAubi9xcTIyMfMxcTIpKOoqKar1tXa4+Lm3dzj1NPcy8nTwMDJzdDblpumkJeiyM7c6/f/4/n+4/v94v394v394v394v394/v94/v94/364vv54fr44fr44fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf43Pf33Pf33Pf33Pf32/b22/b22/b22/b22fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wwMDCt7e5y8vNvr7AqKiqtra4yMjLx8fJsrKyqqqqrK2wn6GkmJykm52qR0lYSUxdU1VkZWh3hIKTWFdoTUxcXl5rXV1pcHB7jpGcr7HAk5aqSUxkSU5oSExpQUhkQUhkP0ZjPkViPkViPkViOkFdOkFdPURfPkVhPkVeQEdhPkFeQUZfQUVaXWFycnSBe3+JfX2IiIiUgYGNhYWQj4+bl5ejpaWxn5+rpqawqquxuLm/tre9ra+0sbK4hoeNqquxu7q/zMvPwsHGq6qvubi9zczQxMLHurm+t7a6vbvAvr3BsbC0v77C397jxMLH3dzj7ez2wsHLx8fQ0NDcxcfUj5Sfqq+96/T/5fn+4vr74v394v394v394v394/v94/v94/364vv54fr44fr44fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf43Pf33Pf33Pf33Pf32/b22/b22/b22/b22fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wwcHEurq9xcXHvr7AkJCTpaWou7u+wcHExcXFvr6+s7S3sLG0rLC4lJajTE5dT1FjXF5tYWNyhYSUaml7VFNjYmJvWlplampzr7K6ur3JX2N0VlpvQEVePkFeRk1pQkllQklmP0ZjPkViPkViOkFdO0JePURfPURfP0ZfPkVeQERhQEVeR0pfXF9xe36Len6Ic3N/hoaRhYWQf3+Li4uWmJikk5Oej4+bpKStzc7Uu73Cs7S6pKWrn6Gmra+0nZ6ksbC0v77Cz87TrayxsbC0np2ir62ywsHGv77Cs7K3uLe7q6qvurm+v77CzczQ9/b92dfhxMLMvb3GxsbS19fkmpypkJOiydDb6Pn/4vr74v393/793/794v394/v95Pv94/364vv54fr44fr44fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf43Pf33Pf33Pf33Pf32/b22/b22/b22/b22fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wx8fJxMTGvb2/vb2/pqapubm7sbGzs7OzwcG/x8fHsrO2sLG0qqqzoaGtTk1fSUxdVVdpaWt9UE9icXCCZWR0Xl5rYWFsampzra23qay3fX+Oe32RU1VtRkhjSExpR0poREpmQUplPkdiPkVhOkFdO0JePkVhPURfP0ZfOUBaQERhRkpkPT9XTE9jfoKOd3qFb296goKOl5ejgYGNgoKOiIiUlpaihYWQlpedlZacs7S6v8DGjI2ToaKovb3GpqitqKarxcTIzs3StLO4rKuwt7a6wL/EsrG2u7q/xcTIx8bLtrS5wL/Ezs3S3Nvf1NPX19bd4+Lpv8DGrKy2wMDMtLTBf3+MnKGs4fD35fn74vr74v394v394v394/v94/364/364vv54fr44fr44fr44fr44fr44fr43/j53/j53/j53/j53vf43vf43vf43vf43Pf33Pf33Pf33Pf32/b22/b22/b22/b22fHy2fHy2fHy2fHy1/Dx1/Dx1/Dx1u/wkZGRwMDAq6ury8vLvr6+wcHBubm5vb29xMTBv7+/zs7Qrayzr6y5n52tUE1hTk1iSEZdcW+GXFtwenmMgH+PXFxpgoKObGx2fX6EgoKMmJikray9nZuyTkxlTkxoSk1qSlRsR1RrQU5lPUZePURdOkFbOz9cPUBdP0RdP0RdP0JfP0JfQUZfP0RYZm14foSLc3d/dnZ/jo6Xfn6HkJCdd3eEnp6rh4eTkI+WpaSri4mTo6Krk5GYnJukr6y5oZ+poqGlsrK0z8/SwMDCxsbIsbGzo6OlsbGzvb2/yMjLx8fJwsLFxMTGx8fJzc3PzMzO8fD09vT5yMfMrayzv77FxcTNkY+clpqkuMLL5vb95Pb56///4/364/773v354v745P754/344vv34vv34fr24fr24fr24fr43/n33/n33/n33/n33vj23vj23vj23vj23ff03ff03ff03ff03Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HveHh4zMzM0tLStra2zMzMnJych4eHsLCwpqakoqKiuLi6srG4sK26op+tT0xfTEheVlRrV1VsTUxhaGZ5mJilZGRwnJylc3N9aWhvhYSLpaStsa+9ycbaiYadWFRvVFRwRE1lTltyRFBoPkdfOkFbOkFbPkFePkFeP0RdP0RdP0JfP0JfQkZjPUFYWl9teX6IdHiCcHB5iIiRiYmVk5Ofi4uXenqHlJSfj46Xn56llpWejYyVlZSdj46XtrPAu7rEmpidsrK0wcHEuLi6v7/Bx8fJrKyvoaGju7u+xsbIvr7AwcHEwMDCxcXHzMzOx8fJ4+PlwsLF0tDVt7a6wL/Gv77Fq6qzjo6Xoqmy4evz5fb56fr+5f374fr44v/63v334//54/344vv34vv34fr24fr24fr24fr23/n33/n33/n33/n33vj23vj23vj23vj23ff03ff03ff03ff03Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvbGxqlpaUz8/Nv7+9uLi2fn57hYWCv7+9oaGenp6co6OlsbC0qaixq6m2SEZUT01dWFdqWFdqU1FiXFxpdHSBd3eCe3uFZmhtb210lpWcr623vrvIvbrLsq/CW1dtVldwQkljUVt2SVNtQkllPURfPkFeP0JfPkFeP0RdP0RdP0RdP0RdP0JfQkdeTVNhc3iEeHqHenqHf3+Mlpaje3uHmpqjhYWOgoKOeniFmJajnZyll5afl5aflpWeqqmwx8bNsK+zs7O2q6utsbGzsrK0q6utv7/BxsbIs7O2wcHEx8fJwcHEubm7vb2/yMjLyMjLvb2/x8fJuLe7wcDFubi/ycjPubjBi4uUjJCbxtDZ7fr/6Pn95fn55f/93/v24f/54//54/344vv34vv34fr24fr24fr24fr23/n33/n33/n33/n33vj23vj23vj23vj23ff03ff03ff03ff03Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvYWFeeXl32dnWy8vIyMjGhYWCd3d0oaGen6GctLSynZ2dn5+ipqWsnJukVlRhTElWTk5bVVViUFBcRUVQYWFsTU1WTU5UaGlva2pvnp2ivbvCo6KrxMHPu7nJd3OHUVBlRkpkTVRwTlVxSExpRUhlQUViPkFePUFbP0RbP0RbP0RdP0RdP0JfREhiQkhYcXaBc3aCcXF+d3aGl5ekhYWOi4yRj4+YlJSfcW99jImWpaStqKawnZuom5qjkI+Wu7q/uLi6uLi6u7u+xMTGu7u+tLS3srK07e3wuLi6xcXHwsLFxcXHvb2/tLS3t7e5ubm7qKiqycnMxMLHurm+sbC3uLe+yMfQnp6ogoeRk5qj3Ont4vL25vr64/r54//54v745P754/344vv34vv34fr24fr24fr24fr23/n33/n33/n33/n33vj23vj23vj23vj23ff03ff03ff03ff03Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvVldTb3Brvb65vb65j5CMdndygIF9lJWQgoR/srOvs7OxhISEoaGjjIuPlpWca2pxZGRtVFRdVFRdT09YWlthVFVbTk9TZGVpb21yiIeMpaSpo6KpwsHLpqSxcW99ZWR0U1ZrP0RdT1RtT1RtSExpQkZjOz9cPkJcP0RYP0RYPkJaPkJcQUViPkJcP0VXen+Nc3aCb297bWx9jY2alpafgoSJnZ2mk5Oej42bcnB9j46XsbC5sK26np2mjIuRj46TsbGzwcHExMTGurq9xsbIxsbIycnMzMzOuLi6zMzOx8fJxcXHwMDCwMDCurq9srK0urq96Ojq3Nvfv77CvbvCuLe+zczVyMjSh4uVeYCJqbO57fr/5Pf35f375P754f335f/65P754/344/344vv34vv34vv34vv33/n33/n33/n33/n33vj23vj23vj23vj23Pbz3Pbz3Pbz3Pbz3Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvVFVQYmNefX55q6yooqOeYmNeh4iEc3Rwa2xoi4yHi4uIgIB+gICAh4eJsLCysK+zaWptXV5iWFpdZGVpWlteXF1hVFVYZWZqb29xd3d5ubm7nJufubi/jIuUsK+4hoaTY2V3TE9kUFRpUFNrT1FsSU1qP0JfPkJcP0RYQEVaP0RbP0RdP0JfP0RdQkhbam99gIKPe3uIZGRxeHiFnJyohoaPkZGbmJiko6Gtk5CdeHeAj46XsK+4sbC5mJeehoWMq6qvu7u+xMTGycnMvr7AzMzOyMjL4uLkzc3PuLi6y8vNycnMx8fJwsLFwcHEwsLFu7u+wMDCxMLHyMfMx8bNqKat0tDaxcXOn6Ote4CLho2U1OHl5fj45fn54/344//55f/65P754/344/344vv34vv34vv34vv33/n33/n33/n33/n33vj23vj23vj23vj23Pbz3Pbz3Pbz3Pbz3Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvVVZPZWZfbG1mqaqjiYuEV1hRhIV+bW9oZGVec3RwamtmZGRiYWFeZWVln5+fjo6OaWpsamttXl9iXV5hZWZphIWHTE1PaWpscnJ0a2trnp6ei4uNl5eaamltZmVshYSNfX2IZml2VVdpUFFmUFNrT1RtREdkO0JcQEVaQUdaQEVcP0RdP0JfQEVeQkhbU1dleX2HeXmCbW13d3eChYWRgYGOhYWRmpqljYyVn56ln56ogoGLlJOcs7K7mpekjIuUpKOou7u+xcXH1dXXz8/SxsbI1NTWyMjL39/iu7u+zc3Px8fJyMjLzMzOy8vNxsbIwsLFzs7Qx8bLrKuwtrS7q6qxurnCzs7XvsHMe4CLgomQn6yx4/P05vr65v765f/65f/65P754/344/344vv34vv34vv34vv33/n33/n33/n33/n33vj23vj23vj23vj23Pbz3Pbz3Pbz3Pbz3Pbz3Pbz3Pbz2/Ty2vPx2vPx2vPx2vPx2fLw2fLw2fLw1/HvVVZRW1xXZmhjbG1mZmhhXl9YZWZfY2RdW1xVXl9bXl9bWltWaWlmY2Nhjo6MdHRyY2VkZGZlXV9eVFZVZWhme31/YmNla21sc3NzaWlpbGxskZGRfX19dnZ4eHh6e3p/iYiNgIGHZGRwVlhoVFVqVFZvSU5oQEVeQUdaQUdaQEVaP0RbP0JfQEVePkJXQkZXa216gICJbGx2eHiEh4eUaml5dHSBgoKOiYiPlpWcn56oqKawenmCiIaTjoyahYKPlJOXpKSmt7e5xMTGzs7Qzs7Q0NDT19fa1NTW29vdz8/Szs7Qz8/SzMzOy8vNzc3PxcXHyMjLwsHGvr3EtLO6t7a9srG60tDa0tLdjI+ahImQfoiO3u/w6v396v/+4/345f/65P754/344/344vv34vv34vv34vv33/n34fj34fj34fj33/f23/f23/f23/f23fTz3fTz3fTz3fTz3fTz3fTz3fTz3PPy2/Lx2/Lx2/Lx2/Lx2vHw2vHw2vHw2fDvT09NW1tYaWlmhYaBa2xoZWZiY2RdY2RdTk9KVFRRVVVTUVFPcHBtcHBtWFhWZGRiampoYmJfW1tYV1dVZmZkampqampqZmZkaGhlZGRiYWFeXl5caWlmf39/eHh4cXFxdHRybW1tb21yX19pUE9fTE1iR0liQURcQUVWTE9hTlFmP0FaQURcP0FaP0JXQkZaYWNyhoaRfX2Ia2t4iYmWiIiVZGRxf3+Ljo6Xh4eQj4+YmJiiqqq2i4uXmJiljY2YjYyQnp6hsLCywMDCy8vNwMDCz8/S1NTWyMjL29vdxcXH0tLUxsbIx8fJxsbIzc3PxsbGy8vNycjPvr3ErayxpaSps7K7xsTQ0tDat7a/h4uTkZqd6vf56fv56f765P335v/55f745P335P334/v24/v24/v24/r34fj04/j04/j04/j04vfz4vfz4vfz4vfz4fby4fby4fby4fby3/Tx3/Tx3/Tx3vPw3vPw3fLv3fLv3fLv3fLv3PHt3PHt3PHtU1NTTk5Oa2tpc3NxcXJtXV5aYmNcaWplUVFPTExJWlpXTU1KYmJfjo6MXl5cWlpXaWlmYmJfXFxaW1tYYmJfaGhlYWFeZGRiZWVjVlZUZGRiYWFeX19dZWVjZWVjbW1rc3JvamllaWlphYSIX19rVFNjVFZoUVVmTFBcVVplVVhqRUhcQUVaP0FaP0JXQkRYSUhYbGx5hoaTfX2JgoKOqam0pKSwhISPX19rcHB5f3+IlJSflZWilJShoaGtqqqzkI+Unp6htLS3t7e5y8vNycnMxcXHzs7Qx8fJ29vdzc3P09PVxMTGycnM09PV3d3f2traxsbIxsXMxMLJy8nOnZyhr623v73Jy8fS1tXenJ2jj5Wa3+3s6/776f755v/55v/55f745P335P334/v24/v24/v24/v24/j04/j04/j04/j04vfz4vfz4vfz4vfz4fby4fby4fby4fby3/Tx3/Tx3/Tx3vPw3vPw3fLv3fLv3fLv3fLv3PHt3PHt3PHtSkpKTU1NXV1baGhlZmhjYmNeX2FaZmhjVFRRT09NX19dVFRRVVVTgoKAfn57U1NQYmNeXV5aW1xXXF1YYmNeZWZiXl9bZWZiaWlmUFBOXV1bZWVjaGhlbW1rampoZGRicHBtYmJfX19fjY6Qe32CXl5oWlplWFxkVVtfXGJpWl5qRklbQERXQERYQkZbSEleVFNlaWl2enqHd3eCjY2Wo6SqsrO5xcbMiYmVYmJvWlpmgYGOk5Oejo6Xk5Octra/trS5nJyeuLi6uLi6wsLF0tLUwsLF0NDT1NTW1NTW09PV0NDTx8fJxsbIyMjLpaWot7e3u7u+xMLHycjNv77Cx8bLm5qjsrG6zcnUvr3GwMHHjpSY3Orp5fj26f755P335v/55f745P335P334/v24/v24/v24/v24/j04/j04/j04/j04vfz4vfz4vfz4vfz4fby4fby4fby4fby3/Tx3/Tx3/Tx3vPw3vPw3vPw3fLv3fLv3fLv3fLv3PHt3PHtQUFBTExMVVVTY2NhYmNeWltWXl9YYWJdV1dVWFhWVVVTTk5MWFhWZWVjk5OQTExJW1xXV1hUV1hUWltWX2FcXF1YXF1YX2FcXl5cWlpXXV1bZWVjZWVjbW1rampoWlpXZmZkW11cXmFfdnh3iImMa2xvXV5iWltdWF1cXWJjWFxkREZTQEJUREVaTE1iVFZoTEpbYWFtfn6JgICJhYaMoaKltre5xsfLxsbShYWRWFdoYmJvi4uUhIWLl5ehpKWrnp2ipaWoqKiqwMDCtra4u7u+y8vNzMzOwMDCzMzOxsbIxsbIzs7QycnMjo6QeXl7i4uLqKiqwsLFwL/Ev77C1dTbq6qxk5GbubbAz87X1tfdlZufzdva6Pr46v/66P/65v/55f745P335P334/v24/v24/v24/v24/j04/j04/j04/j04vfz4vfz4vfz4vfz4fby4fby4fby4fby3/Tx3/Tx3/Tx3vPw3vPw3vPw3fLv3fLv3fLv3fLv3PHt3PHtSEhITk5OVlZUZmZkXV5aTk9KUVNMX2FcV1dVXFxaUFBOUFBOXl5cY2NhfX16VlZUWFpVX2FaV1hRX2FaYWJbXF1WWltUX2FcYmJfXV1bWlpXXl5cZWVjZWVjZGRiVVVTWFtaWFtaXmFfY2VkZGRkaWlpaGhlVFZTVFZRW11aXl9jUVFbSUlWRURUTUxcXl1tXV1qYWFsaWlygYKIfX6BiYuNr7Gwvr/BycnTzs7bh4aWUVFecXF6mJqfmJiij5CWfn2BxcXHrKyvv7/By8vNwMDCwsLFvr7Azc3PxsbIuLi6vb2/zs7Qzc3P09PVzs7QzMzOr6+xvr7AycjNuLe+vbvC0M/Wk5GYubbAzczV3N3jzdPX1ePi6fv55vv34/v25v/55f745P335P334/v24/v24/v24/v25Pn25Pn25Pn25Pn24/j04/j04/j04/j04vfz4vfz4vfz4vfz3/Tx3/Tx3/Tx3vPw3/Tx3/Tx3vPw3vPw3fLv3fLv3fLv3fLvT09PR0dHUVFPXV1bVldTTU5JVVZPYWJdXV1bX19dX19dW1tYVlZUYWFeYWFeXV1bVFVQaGliVVZPYmNcYmNcXV5XV1hRXl9bW1tYXV1bVlZUXV1bZWVjZGRiZGRiVlhXU1dYWF1eW1xeYmRjYmJiY2NhbGxqV1hUWltWYmRfYWJkVFVbSkpURkZRSkpWV1djYWFqaWpwXF1jf4CEent+fX9+paimsbK0wcHL0NDdzc3ac3OAXl5qm5ukm5ukoqKrmpidv7/Bs7O2xcXHs7O2yMjLwsLFy8vN09PV0tLUqqqsn5+iubm7y8vN09PV1NTW4+Pl6enrt7e5xMLHy8nQsrG6wsHIr620r6u2wcDJzs/V2d7j2+no6Pr45vv35P335v/55f745P335P334/v24/v24/v24/v25Pn25Pn25Pn25Pn24/j04/j04/j04/j04vfz4vfz4vfz4vfz3/Tx3/Tx3/Tx3vPw3/Tx3/Tx3vPw3vPw3fLv3fLv3fLv3fLvWlpaUFBQUVFPT09NUFFNTk9KV1hRXl9bW1tYXl5cX19dXFxaVlZUY2NhXl5cWlpXX2FcZGVeWFpTZGVeYWJbX2FaYmNcVFVQWlpXXV1bXFxaX19dY2NhX19dYWFeVlhXVVpbUFVXTlNVY2RmaWlrXV1dY2FiW1pXVldTY2NhZGRkXFtfV1ZdVFNaU1FWVFNXXV5idnd5Y2RmcXJ0dHd2d3l4m52cmJqcqaqwycnT19fhvr7JW1toeHiFiIiVlJSdiYiNvb2/3d3foqKksLCyvr7AzMzOwsLFy8vN0tLUpqaplpaYvb2/xsbI1dXX2trc5ubp5ubp29vbv7/BzczVv77HzczTyMfOo5+qt7a/wMHH3ePo4e/t6Pr46P345f745v/55f745P335P334/v24/v24/v24/v25Pn25Pn25Pn25Pn24/j04/j04/j04/j04vfz4vfz4vfz4vfz3/Tx3/Tx3/Tx3vPw3/Tx3/Tx3vPw3vPw3fLv3fLv3fLv3fLvWFhYYWFeWFhWVFRRT1BMT1BMV1hRWltWW1xXZWVjX19dYmJfW1tYX19dWFhWVVZRYmNcZGVeU1RNWFpTZGVeY2RdXV5XVVZPV1hUU1NQXV1bWFhWXV1bWFhWW1tYVFZTTlNUR0xNRUlKX2FjYWFjXV1dYl9hX15cVlZUY2NhXl5eVlZYVFRWV1daWlpcV1dXWlxbZmloX2JhX2JhZmlocXNyjY+OgYKFi4yRxcbM1tfd0tPZpaWxdnaBZWVxh4eTh4aNj46T4uHlm5qetLS3xcXHzc3PyMjLyMjL0tLUzc3P5ubp0tLUzc3PzMzO39/i5eXo8fHz5OTkx8fJxsXM0M/WyMfOxMLHvbnBrayzxcbJztTW3+vr6ff06vv46v356f755f745P335P334/v24/v24/v25fr25Pn25Pn25Pn25Pn24/j04/j04/j04/j04vfz4vfz4vfz4vfz3/Tx3/Pz3/Pz3vLy3/Tx3/Tx3vPw3vPw3fLv3fHx3fHx3fHxVVVTXF1YX2FcVVZRUVNOSUpGT1BMXF1YWltWXV5aXl9bXV5aXV5aV1hUWltWWFpVYWJbZGVeW1xVTU5HXl9YV1hRWltUWltUVldTV1hUX2FcWFpVYWJdUVNOWFpVXFxaTlBNVlhXR0lIWFhYZWVlXl5cYWFeY2NhVVVTZWVjZGRiWlpaU1NTX19fW1tbT09PW1tbaGhoWFhWZGRiampoeXl3h4eHgICCjIuPv77F0tLUyMjLtrS5o6Kmfn2EXl1mdnOAiIaTn56ok5GYnp2i3t7h0tLUzMzMx8fJxcXH39/iycnM1tbZ0NDT0tLU2dnb3t7e6urq6urq1dXVxcXHyMjL19fawMDCwMDCt7e5vb7Ayc7Py9LS2d/d7Pby7Pj06v356f756P325frz6f735frz5Pny5Pn04/b25Pf35Pf05fj24/by5fj05fj04vTx4vTx4vTx4vTy4fPx4fPz4fL24fL24fL24fPx4fPw4fPx4fPx3/Ly3/H03/H03/H0T1BMVVZRXV5aWltWSElFRUZBTU5JWFpVVFVQXV5aXl9bV1hUXl9bWFpVVFVQXV5aXF1WXV5XWFpTRUY/V1hRVVZPWltUWltUWFpVXV5aW1xXWltWXl9bU1RPUVNOXV5aU1NQXFxaUFBOVlZUWlpXUVFPV1dVXFxaUFBOWFhWaWlmXl5cTExJVVVTV1dVU1NQXl5eY2NhX2FcY2RfcnNvd3hzdHRycXFze3p/l5abpKSmgoKCn5+fubm7mJecgYCJZGJwfXqIh4WRjYyVlpWcqaiswsLFwMDAx8fJ0NDT1tbZurq9z8/S29vdyMjLycnM3d3d19fX39/f1tbWxMTEzc3NzMzMxcXFwcHBx8fHsLKxxcfGxcnIwsfG7PHw7/j07P766v/66f736f735fr26P345frz4vfy5vn35fj44/bz4vTy5vn24/by4vbv5fj04vTx4vTy4fPx3/Ly4fPz4fL24fL44fL24fPx4fPx4fPx4fPz3/Ly3/H03/H33/H3SUpGUVNOXl9bXl9bSkxHQkQ/R0hEVFVQU1RPXF1YXV5aVldTXl9bWFpVVFVQXV5aWltUW1xVXV5XR0hBVldQVldQW1xVWFpTWFpTXl9YWltUWFpTXF1WTk9IT1BJXl9bXV5aWltWUVNOU1RPXl9bUVNOU1RPWFpVUVNOV1hUamtmWFpVTU5JUVNOWltWW1tYX19dZWVjX2FcZGVeZmhhZGVhcHBtbGxsaWhsfn2Bf39/cnJwgIB+paWliYiNo6KpZWNwYl9sbGp3tLO9tLO6nZyhsbGzlpaYtLS31dXX29vd3Nzezc3P1tbZyMjL0NDT09PT0NDQ3Nzc09PTzc3N1NTUxsbGyMjIxsbGvr6+i42Mubu6ztPSwcbF19zb9P767P746Pv05fj05fj06fv55fj25Pf05vn34vTy4/bz5fj05vn24/by5fj05fj04vTx5Pf04/bz4vT04vT04fPz4fL24fL24fL24fPx4fPx4fPz4fPz3/Ly3/H03/H03/H0SElFVFVQYmNeXl9bTU5JPj86RUZBW1xXWFpVXF1YXV5aXF1YXV5aV1hUWltWWFpVXl9YXl9YYmNcU1RNW1xVW1xVXV5XVldQWltUXV5XWltUVVZPW1xVSElCUVNMX2FaVVZRV1hUV1hUUVNOXF1YT1BMU1RPXV5aUFFNXF1YaWplWFpVVldTVVZRYmNeXl9bY2NhYWJdZmhhY2RdYmNcZGVeZWZiX19fYWFjcXFzbW1taGhlcXFvf39/e3t+wsHGe3qEXFtkW1pjZGNqamltiIeMqKiqlZWXq6uty8vNx8fJ39/i1NTW1dXX1dXX09PV2dnZ2dnZ39/f4eHh1NTUzc3N1dXVzMzMubm5ycnMnJ2fsrO2s7i50NXWzNDS6fDw7fv56/v67P376fn66fn96fj/6Pf/5fT75ff65Pf35Pf34/bz5Pf04vTy4vTx5Pf05Pf04/b24/b24vT04fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPz3/Ly3/Ly3/Ly3/H0SUpGSUpGWltWXF1YTE1IOTo2QkQ/XV5aVldTVVZRWFpVXF1YW1xXWltWXl9bV1hUYWJbXF1WXV5XWFpTTk9IVFVOWFpTWFpTWltRXV5VYmNaXF1UXF1UVFVMV1hPWltUU1RNWFpTXV5XTE1GWltUW1xVX2FaYmNcT1BJXV5XZGVeYmNcXl9YV1hRYWJbXV5aW1xXXl9baGliZGVcYWJYX2FaXV5aYmJfVlZYampsampoX2FcamtmY2NhaGhqpqWqzMvPjo2UlZSbenl+f36CqqqspaWoYmJkra2wvr7ApKSmvr7AwMDCzc3P09PV0tLU3Nzc5eXl39/f4uLi3Nzc1NTUyMjIwcHBxsbIxcTInZ6isLG0rbK0wsfJ29/i4ujq6vT46fb61eLpt8LMl6Oxl6K0mqO5oau+t8XTsMDLuszTzd7k4vP34fPz3fDt5Pf03fDw4fPz4fPz3/Ly4fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPz4fPzTE1ITE1IXF1YXl9bUVNOP0A7RUZBW1xXT1BMUVNOWltWVldTWltWWltWWltWVVZRXF1WW1xVXV5XXF1WSkxFUFFKVVZPVVZPV1hPXF1UYWJYWltRUVNJVFVMWFpQW1xTT1BJV1hRYmNcVVZPVFVOV1hRW1xVW1xVTk9IZGVeYWJbW1xVXF1WVVZPXV5XWFpTXF1YY2RdWltRXV5VY2RbXV5VWltUX19dWlpaZmZmYmJfWltWX2FcYmJfX19fi4uNnp6htrS5srG2iYiNfn6AnJyeuLi6a2ttgoKFj4+RnJyeqKiqtLS3srK0vb2/zc3P0NDQ2tra39/f6enp5ubm29vbzMzMuLi6zs3Sv77CoaKlqaqtq7CytLm7ztPV4ebrz9bdx87XrbS/n6W2rLHGnaK7hIekhIumhJClgJCfi5uol6iyqLnAxtfd3O3x3vDz5Pb54vP33/H03vHx4fPz4fPz4fPx4fPx4fL24fL24fL24fPz4fPz4fPz4fPx4fPxVldTUVNOW1xXWltWW1xXR0hESElFWFpVTk9KU1RPWltWWFpVWltWVldTWFpVT1BMV1hRWFpTV1hRWFpTR0hBTU5HUFFKUVNMU1RKW1xTX2FXVVZNTU5FUVNJVVZNWltRXF1WUVNMWFpTWFpTVldQWltUWFpTVVZPT1BJZGVeXl9YV1hRXF1WVFVOW1xVVVZPWltWWltUXV5VX2JVXmFUYmNaVVZPYWFeXFxcYmJiXFxaWFpVYmNeaWlmXl5eaWlpa2trf3+BtLS3oaGjh4eJnJyepaWoampsh4eJxMTGlJSWhoaIlZWXubm7ubm7gYGEkZGR0tLS8PDw1NTU2dnZ5eXl2dnZxsbIwsHGzs3UmpuhrK2zsLO5pamvu7/F3uLo6/Hz1tzhx8zWuL3L3+P4sbPOjY6thIuofouieombfYydf46fjp6tkKGtorK/vs7Z2erx4/T64fL23fDw4fPz4fPx4fPx4fPx4fL24fL44fL24fPz4fPz4fPx4fPx4fPwV1hUVFVQXV5aXF1YYWJdTU5JSkxHV1hUSUpGUFFNTk9KW1xXW1xXUFFNWltWSUpGVVZPVldQT1BJUFFNREVASUpGTk9KTk9KUFFKWltRXl9WU1RKT1BHT1BHTk9GWFpQW1xVTk9IVVZPVldQSUpEU1RNV1hRVVZPUFFKXF1WX2FaWltUXl9YVVZPW1xVVFVQXF1YWltWX2FXY2RbV1hPXF1UYWJdXl5cXV1bYWFeXF1YXl9bZGVhbG1pZWVjYmJiVFRRZGRil5eXoqKifX19q6urm5ubU1NVeXl7u7u+hYWHcHBygICCvr7AmJibhoaGcHBwtra25OTk7e3t5ubm4uLi3d3dz8/PxMLHxMLHwcLGjo+TsbK2l5icqKms0tbZ6Ozv09fau7/HvcHNuLvPnJ63gIKfgYWifYaee4ide4ideYabeIWafYmeiJWqlaO0oa+9y9zj4fL44fL24fPz4fPx4fPw4fPw4fPz4fL24fL24fPz4fPz4fPx4fPx4fPxU1RPVldTV1hUVVZRVVZRVldTUFFNWFpVR0hESkxHT1BMYWJdTE1IW1xXUFFNSUpGUVNOTU5JU1RPVFRRSUlHTk5MTExMTU1KU1RPU1RNVVZPVVZPUVNMV1hRU1RNVldQVldQUFFKT1BJU1RNR0hBUVNMUFFKU1RNVVZNVVZNXF1WXl9YWFpVVVZRVVZRTU1KVFRRWltWXV5XX2FaYWJbW1xVWFpVXl5cW1tYXFxaZGVhZGVeYWJbbG1pZmZkX19dVVZRWltUamtmfX55b29sgoKAaWlmWFhYbGxsoaGhgYGBjIyMlZWVnp6efn5+aGhoZGRik5OQuLi2zs7M5eXj1dXT1tbUr6+sx8fHurq90NDTsbGzqamrn5+inZ2fpaapzc7S5ujtr6+4qau4m52vjo+lhoefhIahiI2klJitn6S7pKnAk5eviY6of4SddHuVhY+ipLLC1eXw4fL43vLy3/Tw3/Tt4/jx4vTx4/Py4/Py4/P04vLz4vL24vL24vL2SkxHUFFNVldTVldTW1xXWFpVTk9KU1RPR0hESUpGVVZRX2FcTE1IV1hUTk9KRUZBUVNOTE1ITk5MVVVTTExMTExMR0dJSkpKT1BMUFFKVFVOVFVOU1RNTU5HWltUW1xVVldQUFFKT1BJU1RNTk9ITE1GU1RNT1BJVVZNVVZNWFpTXV5XVldTVFVQT09NSEhGUFBOWFhWXV5aYWJbY2RdXl9bWFhWXV1bXl5cX19dXl9bXl9YVVZPXl9bWFhWVFVQUVNMVldOY2RdbW9oYmNeeHl0ZmZkXFxaX19ff39/cXFxh4eHhoaGdnZ2bW1tXFxcXl5ccXJtpqijiYuG19nUq6yoxMXAjY2LzMzMt7e3zs7O0NDQ29vbvb29urq6qqqs3dzj0tDavr7JrKu7lJaoh4idiImiiYujhYefhoihkJOrm522oqS9lpixjpCphIifeYKYh5Wmo7G/1ebt3vDz2/Ds4fbv3/Tt4vTx4/Py4/Py4/P04vLz4vL24vH44vH4RkdCTk9KVFVQVldTVldTVFVQSkxHT1BMUFFNTE1IWltWVFVQSkxHVldTVldTTk9KT1BMTU5JTU1KU1NQUFBQR0dHQEBCR0dHSUpGUVNMTU5HVVZPTk9IV1hRXV5XXl9YVldQUFFKT1BJU1RNVVZPSElCT1BJTk9IVVZNVVZNVldOW1xVUVNMVVZRUVNOUFFNT09NVlZUV1hUWltUZWZfZGVhWlpXXl5cW1tYYWFeWFpVXl9YW1xVXV5aUFBOSkxHVVZPXF1UYWJbYmNcVFVQZWZiW1tYUVFPXFxaX19dZWVlcXFxeHh4aWlpcXFzVlZWXFxaZmZkbGxqeXl3traze3t5l5eVcnJwtLS0s7OzxsbGwcHByMjIrKysvb29u7u+4uHox8XSzczclpWokZOpf4CYe3uXhISigIKfd3mWfoCbj5Gqo6a7srbJn6O0kJapgIice4aYgpChrLvG2uvx5vn54/j04fbx4vTy4/Py4/P04/P04vLz4vL24vL24vL2QEA+RkZESkpISkpIVlZUUFBOQkJAREVAUVNOSkxHW1xXVFVQSkxHVFVQVVZRSUpGSUpGUFFNTk5MT09NU1NTRUVFOjo9RUVFSElFSElFUVNOUVNOTk9KUVNOVFVQWltWVldTUFFNT1BMU1RPWFpVSUpGSkxHTk9ISkxCVFVMWFpQXV5XTk9IU1RPTU5JSkxHUFBOUFBOT1BMUFFKXV5XYmNeWFhWVlZUXFxaY2NhUFFNVldQV1hRV1hUSkpIR0hEVldQXV5VXl9YWFpTUFFNY2RfYmJfXV1bVFRRXFxaX19faGhoW1tbVFRWXl5hTExOTk5OYmJfZGRiaWlmgoKAZWVjbW1rXV1bn5+fs7Ozurq6vr6+hYWFe3t7np6ewsLF2dfcxsXOxsbSsK+/1tfsv8DZlZWxhoakd3iXeHmYfX+cgIKbi46jlJepnaKwmp+tjZWpdH+Rd4GTjJulz97m3O3z3/H05Pf34/P04/P04/P04/P04vLz4vLz4vLz4vL2Pj4+QUFBTU1NRkZGSEhISkpKQUFBQEA+UFFNUFFNWFpVTU5JQEE9SElFTk9KRUZBR0hERkdCRkZER0dFTk5OQUFBOTk7Pj4+RERBQEA+TExJTU1KTExJSkpITk5MT09NVVVTTU1KSUlHUFBOXV1bU1NQSkpITU5JU1RKV1hPXl9YXl9YUFFNRUZBSEhGSUlHTExJUFBOVldTU1RNXl9YXV5aU1NQVFRRVVVTXV1bVVZRVVZPWltUVVZRSEhGTU5JV1hRX2FXYWJbXV5XVVZRXF1YWlpXUFBOVVZRWFhWUVFPW1tbVVVVTU1PT05TR0dJUFBQWlpaWlpaXFxcVFRUW1tbXFxcaWlpi4uLwsLClpaWsLCwc3NzgICAiIiInp6evb26ycnHwMHFlZWexcfW0NLmmJqyh4ele32ceHmYeHqVfX+XgoaamJytmp6qqK27oqq9i5Omcn2Oc3+Njp2ot8bQ3O302+zy4/P35PT24/P05PT24/P04vLz4vLz4vLzNjY2Ozs7R0dHPj4+REREQUFBPj4+QUFBTU1KSkxHUFFNTk9KQkQ/SElFTE1IREVAREVARUZBRUVCRERBU1NTRkZGODg6Ojo9Ozs7QEA+Pz89SUlHR0dFTExJR0dFRkZET09NTExJRkZEUVFPWFhWU1NQTk5MSElFTE1GU1RKXF1WXl9YV1hUR0hERkZERERBR0dFSkpIUVNOTU5HW1xVXV5aU1NQT09NVlZUWFhWVVZRUFFKVldQTE1ISUlHU1RPXl9YZmheZmhhYmNcVldTUVNOU1NQWFhWTk9KVFVQV1dVUFBQUVFUR0dJSEdMQUBFTk5QW1tbVVVVX19fV1dXU1NTXV1dWlpaYmJinJycfn5+ampqbGxsb29vgoKCi4uLsbKtx8jEqqyreHl/pqq0fX+OgYKXeHmRcnSPeXuWe36Wd3qPgYWYjZCimp6so6i2oqi6kJiscnqNbHeIcn2OjJqqssDO4/P+4vH44/P35PT44vLz4/P04/P04vLx4vLxPj5AOjo9RkZIRkZISkpNSEhKQkJFOTk5TU1KSUpGR0hEREVAQkQ/RkdCTE1IR0hEQkQ/RkdCRkZEQkJAVFRUSkpKODg6OTk7ODg4Nzc3Pj4+QkJCTExMRUVFR0dHR0dHSkpKRkZGR0dHUVFRUVFRVVVVT09PRERBTU5HUFFIVldQVldQV1hUSUpGTExJTExJTk5MTExJTU5JSElCXl9YZmhjXFxaVFRRV1dVW1tYWltWVVZPV1hRT1BMSEhGVFVQYmNcaWphaGliYWJbWFpVRkdCSkpIWFhWT1BMWFpVVVVTTk5OU1NVUFBTUVBVREJHSkpNVVVXUFBTXl5hSkpNSEhKUFBTYmJkXl5hY2NlWFhbVlZYW1tdZGRmfn6AgoKFr6+vlpaWo6SmbW90jZCYen6Ib3F+cXOCcHOHe3+Ue3+UcnaLdHiNhIecgoabjpGml5yxjZGmaXGFZm+Cc36QiJOll6W3xNLi3Ovz4vH44vL24vLz4/P04/Py4/Py4vPwPz8/Pj4+SUlJR0dJPz9BOzs+QUFEQUFBRUVCSElFRUZBP0A7P0A7QkQ/TE1ITU5JREVASUpGSUlHRERBUVFRTk5OOjo6Ozs7Nzc3NjY2PT09QUFBSkpKTk5OTU1NTk5OR0dHPj4+SkpKUFBQTU1NVlZWTExMRkZER0hETU5HVVZPVldQXV5aT1BMUVFPUVFPSkpIRUVCSElFRkdCVVZRYmNeVlZUSkpIT09NWltWVldTWFpVUVNOWFpVTExJXV1bXl9YZGVcY2RdXF1WYWJdTk9KTk5MU1NQXF1YWFpVWFhWSkpIUVFRUFBTVVRYTEpPRkVJSUhNTk1RWlpcUFBTTU1PT09RW1tdW1tdXV1fX19iV1daVFRWaWlrjo6Qb29xgoKFeXl7iImNZmhren6Ea290ZmpyaWx3b3F+dniHcnSEZml6d3iNhIWbfn+VhIaeiIujhYmhdnqPiZGkcXmNcHmPiJGqmKW6xdTe2+rx3/Dz3/Dx4vLz4/Py4/Py4/PyNDgwNzk0QkVBTE5NPj9BMjM2Njg3RkhFQEA+RkZERkZEPj47R0dFQUE/RkZESEhGRERBTExJSkpISkpIVlZUXV1bVFRRRkZENDQyOTk3Ozs5QEA+RERBTExJSkpIQkJAQkVBRUdGSUxKRUZIRkdJTlBPQEJBR0lGRERBSUlHVVZRW1xXT1BMTE1IOTk3Pz8/R0dFQkJARkZERUVCXV1bW1tYUVFPTk5MTE1IU1RPTk9KV1dVU1NQTU1NSUlJVVVTZWZfZGVcYWJbZWZfY2RfVFVQTU1KTk5MV1dVXFxaW1tYVFVQTU1KTk5MVVVVU1NVREVKRUZMRkdNVldbTU5RSUpOSUpNVVZYW1tbUVFRVVVVVlZWT09PXV1dZWVlZWVlZWZpXl9iaWpsYWJkY2Rob3BzaGlsZWZqZGVrcXF6c3N/amp3cnGBi4mcmJesh4iehISfb3GMY2Z6d32Ne4GUc3uRdHuYfoeikJuszNnf3+zv4vDv5PT24fHy4/b24fPzQUU6QUU9RUdCREZFOTo9MDEzNjg3SUxIRUVCTExJR0dFODg2NjYzQEA+R0dFRUVCPz89TU1KUFBOUVFPYWFeYmJfWFhWVFRRPz89QEA+Ozs5RERBRkZETExJSkpIQUE/Sk1JRUdGR0hKRkdJREVHSUpNSk1MRkhFRkZGR0dHVlZUWFpVUVNOVFRRPz8/Ozs7RkZEQEA+RkZETk5MaWlmX19dU1NQU1NQTU5JT1BMT09NSkpIUVFRRkZGRERGQkJCVldQYWJbYWJbVFVQXF1YVlZUTU1KTU1KU1NTV1dXUFBOWFpVSUpGTk5MTk5OT09RRkdNRERNR0hOVFVbTk9TRUZJRUZIVldaU1NTTU1NVFRUWFhYUVFRVlZWW1tbV1dXXl9iVVZYXl9iXV5hXV5hYmNlYmNlXV5hYmNmZGVpe32CZmZwdnaCjYycq6q9jImhiYmlaWqCYWR2c3iGo6a6e4CXdHiWdHuXgIibkJ2k2+jq5PLx4/P05PT22+3t5Pf3QkY7PUA4PkA7PkA/Nzg6LS8xMjQzQkVBTU1KT09NRkZEMjIwMjIwPz89RUVCR0dFQEA+SUlHSkpITExJVVVTYmJfY2NhYWFeT09NRUVCOTk3QkJARERBTExJSkpIQkJAREZCPkA/P0BCP0BCOjs+QEFETlBPSUxITExMTk5OWlpXXF1YVVZRT09NUFBQQEBATExJTU1KSUlHSkpIYmJfX19dVFRRTExJVVZRTU5JT09NTk5MTk5OPT09Ojo9Pz8/UFFNWFpTW1xXR0hEXFxaTExJRkZGSUlJUVFRV1dXTExJWFpVSkxHT09NT09PSkpNR0hMQEFHRUZMTk9TT1BURkdJRkdJV1pYTU1NSEhITk5OVFRUVlZWVVVVU1NTV1dXVFVXVVZYXF1fVldaYmNlXV5hXV5hYmNlYmNmZGVpYmNpXl5oaGhzbGx5enmJi4meiImicXKIaWt6mpyprLDBlpqvcXOQcneQcnuLdoCIxdLU4vDv4fH04/P35fb33/DxVFdNTlFJP0E9QEJBQEFEMzQ3MjQzP0E+Tk5MSUlHPz89Nzc0Pj47Ozs5PT06SkpIR0dFSEhGSEhGUVFPSkpIUVFPU1NQWFhWXV1bSEhGNzc0QUE/Pz89SUlHTU1KR0dFOj05Oz49QEFEPT5AOz0/Oz0/RUdGREZCR0dHT09PT09NWFpVV1hUSkpISkpKPz8/TExJSEhGQUE/R0dFWlpXVFRRSkpISkpISElFSElFSEhGR0dFQEBAOzs7ODg6QUFBXF1YWFpVWFpVVVVTTExJPz8/SUlJR0dHSkpKUVFRUVFPX2FcUVNOUVFPU1NTRkZIQEFFOz1CQkRHR0hMUFFUTU5QTU9OWFtaSkpKRUVFSUlJTk5OSUlJVFRUVFRUVlZWT1BTTk9RVFVXVldaWFpcX2FjWFpcW1xeXl9jZWZqZmhtUVNYZWVvZGRweHiFhoWVkZOoen2OX2JvbXF7jY+el5itfn+XdHiNcXeFd4GJn6qt3Onr5PH44vH44/P34fHyW15UT1NKODo2ODo5QEFEMTI0MzY0PkA9TExJSkpIQUE/Ojo4SEhGOzs5Pz89UVFPQkJAPz89UVFPU1NQTk5MT09NT09NTk5MWlpXRUVCOjo4RUVCRUVCRkZETExJUFBOOTs4MDIxOTo9NDY4MDEzODk7PkA/QEI/RkZGUVFRU1NQTk9KWFpVU1NQPj4+QkJCT09NTExJR0dFRkZET09NSEhGQkJAQkJARUZBP0A7QUE/RERBREREPz8/Ojo9RUVFUFBOUFFNW1tYQUE/Pj4+Ojo6RkZIUFBTRkZGTU1NTk5MWFpVU1RPTU1KU1NTSUlMP0BEOjs/R0hMU1RWSUpNTU9OTlBPVVdUT09PTk5ORkZGTU1NSEhIUVFRT09PUVFRTE1PTk9RT1BTTU5QWFpcXV5hVldaUFFUVldaVldbXl9jXV5iW1xiX2FmZmZwbW15en2JYWNwW15mZWlxbXB9iYiYe3qPb3GCbHF7aXB3h4+Txc/V4evz3uvy3+zx6fb6VFdNTE9HREZBOz49QEFENjc5MTMyQEI/TExJUVFPR0dFNzc0TU1KRUVCQUE/Tk5MRUVCQUE/UFBOTExJV1dVTExJRkZESUlHVlZUQUE/NDQyPz89QkJASUlHSkpIVFRRPkA9Nzk4ODk7LzAyMTI0Pj9BP0FAR0lGR0dHRUVFSEhGUVNOW1xXXl5cTExMTExMTExJSUlHSkpIRUVCSUlHSUlHQUE/R0dFQEE9REVASEhGQEA+QkJCSEhIRUVHQkJCSkpITU1KWlpXQkJCQEBATk5QR0dJTU1PREREQUFBPj47Tk9KWFpVTU1KUFBQSUlJQkRGQkRHTk9RWltdTE5NTE5NSk1JUVRQVlZWUVFRRUVFTExMSEhITk5OU1NTVlZWUFFUT1BTUFFURkdJVFVXW1xeVVZYVFVXUVNVVFVXXF1fXl9jT1BUVldbY2Roa2xyZGhwU1ZeV1xeZWZqc3N9gICNdnSFb297ZWlxZWtwdn6Btr3E3OPsuMHM4uzy4u/zTVBGTVBITlBMPT8+PT5ANzg6ODo5TE5KR0dFTk5MSEhGPj47UFBOTk5MPj47SkpIQkJAQEA+TU1KRkZEVVVTVFRRTk5MSEhGV1dVQEA+MzMxOzs5RERBUVFPSUlHVVVTRkhFOz49ODk7MzQ3ODk7QEFEOj07PkA9SEhIPj4+SEhGXV5aYWJdXFxaWlpaTExMTExJTU1KSEhGQEA+RERBRUVCNzc0SUlHQEE9Oz04RkZEQkJARERESkpKTk5QR0dHR0dFTExJW1tbRUVFTk5QUVFUQD9EQkJFOzs7Pj4+Pz89UVNOXl9bTExJSkpKSUlJR0hKSElMTU5QVVdWTlBPSEpHRUdETU9MU1NTVlZWTExMT09PTU1NSkpKV1dXV1dXVldaTU5QSUpNSUpNUFFUUFFUWltdV1hbTE1PTk9RW1xeX2FjVVZYVVZYXl9iYmNlWF1fVFhbZGVoZGVoZGNqdnR+d3SBamlyYmZpYmhqanB0o6mwv8bQjZSezNbc2ePmSU1CU1ZOUFNOPT8+PT5AMTI0OTs6SEpHTU1KRkZEPz89QEA+QUE/VVVTPj47VFRRRkZER0dFVVVTTU1KTExJT09NT09NTExJXFxaRUVCNjYzPj47RkZEW1tYRkZETk5MQkVBODo5MjM2NDY4MjM2OTs6SEpHSUxIRERERkZESUpGSkxHW1xXUFFNSkpIPz89R0dFVFRRSkpIODg2Pj47TU1KOzs5SEhGRkdCP0A7Tk5MSUlHRkZGU1NTVVVVPz8/R0dHTU1NXl5eSkpNSUlMRURIREJHOzo/ODg6Pj4+PT06SElFXl9bR0dFRkZGSEhKQkRGRkdJR0hKU1VUT1FQR0lGQEI/SUxIR0dFWFhYV1dXVlZWU1NTSEhIWFhYVVVVUVRTUVNVR0hKTU5QTU5QTk9RWFpcXF1fUVNVUFFUVlhXWFtaW11cVVdWXmFfYWJkXmNkUFVWYWNiYmRjYmFlaGZtbWxzYmFoXmNkZWpraWxydnuCgoeTfYSOu8LJ2ePmR0g/UFFKV1hUTU1NQEBCLy8xQkJCQkJASk1IOj04MzYyNzk4PkA/VFZTRkhEVFZRREVATU5JVldTT1BMTk9KSkxHTU5JSElFUVFPT09NOTo2RkdCVldTYWJdR0hETE1ISkpKPj5AMjI0MjI0RERESUlJPz89RERBTExJSEhGTU5JTk9KVldQXl9YU1RNSElFSkpITU1KRERBNDQyOjo4ODg2ODg2RUVCTk5MQEA+RUVCVFRRQUE/TExJWFhWSUlJT09PRUVFVFRWUFBTVlVaRkVJQkFIOjk+ODg6Pz8/QEA+SkpIXV1bQUE/Pz8/SkpNQUJGRkdKSElNRkdJWFpcTU9OSUxKTU9MSUlHVFRRXl5cTU1KVFRRUFBOTk5MVFRRU1VUUVRTTlBPTE5NSUxKSUxKUVRTXF5dW1xeVVZYVVZYVldaXl9iW1xeW1xeXV5hXF1fX2FjXF1fXl9iYWJkXl9jXl9jX2FjXl9iaWpsaGlvZWlxX2RwXmNvgIeOlZyjQEE4TU5HT1BMSUlJRERGMTEzOjo6Ozs5UFNOQUQ/MzY0NDc2ODo5TlBPQEI+T1NKTk9KTE1IT1BMTE1IUFFNRkdCTE1IQUI+VVVTW1tYR0hEP0A7SElCWltUSElCSkxHRkZIMzI3MjI0QkJFTExMUFBQQUE/Pz89Pz89Pz89SEhGTk9KUFFNXF1WVVZPTk9ISkxHUFBOTk5MOzs5NDQyNjYzNzc0R0dFUFBOQkJAQUE/UVFPSUlHRUVCUFBOU1NQV1dXSUlJR0dJPz9BRkVJQD9EPTtCOTg9Nzc5Pz9BREREWlpXYWFeTExMQEBCSkpNOTo+P0BEREVIRkdKT1BTR0hKR0lISk1MSkpIT1BMWltWVVZRWFpVVldTUVNOVlZUUFNRWFtaV1pYTE5NSEpJRkhHSk1MVVdWXF1fVFVXUVNVVFVXWltdV1hbU1RWWFpcW1xeWFpcW1xeWltdXl9iUVNVVldaXF1fYmJiY2NlX2FmYWRsWFxmWF1oc3mAfYSLR0g/TE1GVFVQRkZGUVFUMTEzMTExOzs5TU9KQURALzEwLzAyNDY4Sk1MPT87Sk1ITk9KSUpGT1BMTU5JR0hEP0A7SUpGRUZBRkZEVVVTV1hUUFFNTk9IV1hRSkxFUVNOTExMOTk7LCwvOzs7VVVVVVVTTk5MQEA+QEA+Pj4+RUVCR0dFTE1IVldTTk9IR0hBQkQ/TU1KUFBOSEhGODg2MjIwOTk3QEA+U1NQRERBPT06Tk5MSkpIRkZEUFBOVFRRV1dVSkpKTk5OSEhKQEBCOzo/Pz5CSUhNQEBCPz9BTU1NWlpXWlpXUVFROzs+R0dJOjs/Oz1AP0BEQkRHTU5QSElMR0lISEpJTU1KTk5MVVVTWlpXVlZUVVVTUFBOVFRRUVRTV1pYVlhXT1FQSEpJR0lIR0lIT1FQWFpcUVNVTk9RVldaWFpcWltdUFFUV1hbWFpcVldaWFpcV1hbXV5hUFFUUVNVXV5hX2FjV1hbVFVbW15mU1ZeTE9XX2VqX2VqTE1EUVNMTk9KQEBAU1NVPj5ANzc3Ozs5TE5KRkhFMjM2MzQ3Njc5TE1PPkA9TU9MUFBOSUlHT09NRUVCQkJAQUE/RkZERERBTU1KVlZUVldTRkdCRkdAVldQUVNMVldTRkZGNDQ3Ozs7Nzc3TExJVFRRSElFRUZBREREQUFBR0dHSUlHRkZEVFVQUVNOTU5JTU1KVVVTTU1KUFBOPT06KyspOTk3Pz89VFRRRERBPj47TExJTExJSUlHTk5MUFBOXFxaSUlHVVVVTExMV1daTU1PRkVJODc7NjY4PT0/SEhIUVFPXFxaSkpKTU1PSEhKODk9OTo+QEFFSElNSUpNRUZIQURCP0FAT09PUVFRU1NTVlZWTk5OUVFRTk5OUFBQU1VUTE5NTU9OU1VUTlBPSUxKSEpJTU9OV1hbVFVXSkxOTU5QVFVXVFVXSUpNVFVXVFVXV1hbVFVXVldaVVZYU1RWSkxOWFpcV1hbT1RWSU1TUFRaUVVdT1NYWl5hV1xeVldOVVZPTU5JRERET09RVFRWSEhIOjo4PkA9PT8+KistJigrNjc6QEFEQEJBRUdGRkZGPj4+RkZGRkZGTU1NUFBQUFBQTU1KQUE/UVFPV1hUSElFSUpETk9IVFVOUFFNSkpIR0dHVFRURkZESUlHVldTU1RPPj86ODg4NjY4Pj4+QUFBPj47SEhGUFBOU1NQU1NQTU1KTk5MUVFPSUlHNzc0NDQyPz89VlZUT09NRUVCRkZEVVVTTU1KSUlHTU1KWFpVWFhWV1dVTExMVFRUTExOLS0wMzM2MTEzPj5ASEhIVVVTXFxaT09PTExOPz9BNjc6Ojs/PT5BR0hMREVHRkdJPT8+RUdGTExMVFRWTExOT09RTExOTk5QR0dJUVFRU1VUT1FQUVRTT1FQV1pYUFNRT1FQWlxbVldaVVZYR0hKTE1PUFFUWFpcRkdJSElMUFFUUVNVVFVXV1hbU1RWWltdTU5QUFFUTVFTUFVXSk5UQkZMTE9VVlpfVFhaVFVXV1hPTE1GSElFPz8/RERGR0dJPj4+MTEvNzk4Nzg6KSotKisvMjM3NDY5NDY4Oj07REREPT09PT09QUFBREREQEBAQEBARERERUVCVVVTVldTP0A7QEE6RkdAVldQW1xXUVFPW1tbU1NQRUVCTk9KUVNOT1BJODk0QUFBPj5APj5APT09PT09SkpIUFBOSkpISUlHTU1KSEhGTk5MT09NQEA+QUE/QkJAVVVTVlZUTk5MSEhGU1NQSUlHTU1KSkpIVVZRU1RPTExJUVFPTk5OT09POzs+SUlMODg6Ozs+UVFRT09NW1tYXFxcQkJFRERGP0BEP0BEOz1APj9CREVHREVHOTs6Oz49RUVHUFBTSkpNR0dJR0dJSkpNRkZITExOSk1MTU9OUVRTUFNRU1VUU1VUVVdWVFZVT1BTTk9RRUZISUpNSUpNUFFUQkRGRkdJTE1PUFFUU1RWVFVXTU5QVldaVFVXT1RVRk1NUFZYUFRaRUhOSU1TVFVYUVRTUVRTVVZNUFFKRUZBQkJCPz9BRUVHQkJCODg2MjQzMjM2KCksLzA2MzQ6Njc6Nzg6PT8+RkZIOjo9Ojo9Pz9BQUFEOjo9Ojo9QUFBVFRRVlZUV1hUTU5JSkxFRkdATk9IT1BMVFRRXl5cXV1bR0hETU5JUVNMRUY/OTo2SUlMR0ZKPz9BOjo9OTk5SEhITU1KR0dFR0dFSkpIR0dFTk5MU1NQR0dFPz89Ozs5T09NV1dVVFRRR0dFSUlHSkpITk5MRkZEUVNOTE1ITU5JTExJTk5MTk5ORkZGQEBAR0dJTU1PVVVVR0dFWFhWTk5OQUFEODg6Nzg7OTo+P0BEQEFFOjs+Pj9BP0FAQEJBRUVHTk5QTExORkZIRUVHR0dJRUVHRUVHRkhHTU9OT1FQU1VUVFZVUVRTVlhXT1FQVFVXTk9RRUZIRUZIQkRGTU5QSElMTk9RSElMSkxOUFFUUVNVSElMUFFUV1hbTVFTQUdJTVNVUVdcSU1TTVFUVFVXVFRRVlZUSkxFSUpESElFPz89QkJCUVFRSUlJNDQ0LS8xMjM2KywwLzAzLS8yOTo+Oz0/P0FASkpNNDQ3QEBCQEBCPj5AOjo9Ojo9Pj5AQEBAVVVTW1xXR0hEP0A7QkQ/T1BMV1hUUFBOXFxaXFxaTE1IR0hETE1IREVAPT06TExOTU1PQUFEPT0/Nzc3QUFBSkpITExJSEhGQkJAPj47QEA+QEA+QkJAPj4+OTk5SEhIUFBQTU1KRkZESkpIRkZERkZETExJTU5JTk9KSkpISUlHTU1KW1tbWFhYVVVVTExOUFBTUVFRRERBVVVTUFBQOTk7NDQ3Nzg7PT5BSUpOSUpNOTo9P0BCREVHQkRGQkJFRUVHRkZIQkJCQkJCRUVHRkZIQUFERUdGTlBPTlBPU1VUUFNRSUxKVlhXVlhXVVZYT1BTSkxOSkxORUZISkxORkdJRkdJRkdJSElMTE1PUFFUSElMTU5QV1hbR0xNPUJFSlBTT1VXSk9RTFBRUFNRTlBNVFRRTk9KT1BMUFFNR0hEREVAR0dFQkJFODc7OjtBMDE3Nzg7MDEzMTI0NDY4Ojs+Pj9BRUVHNzc5Nzc5QUFESUlMOTk7MzM2Ojo9SEhIWlpXVVVTRUVCPj47RkZETExJW1tYUFBOWlpaXFxcUFBOQkJATU1KQkJAQkJCREZFSUxKOz49RkhHPT8+ODo5TU9ORkhHTE5NQEI/OTs4PT87P0E+Oz49Nzg6MzQ4PT5BR0hKSEpJSUxITE5JSk1JSEpHRkhHSEpJTlBPRkhHRkhHRkhHTE1PP0BCOjs+QUJFSUpNRUdGP0E+VFZTT1FQQEFEODk7LzAzOTo+RkdJVVdWPT8+Oz0/Ojs+P0BEPT5BRUZIU1VUT1FORUdEPT8+QEFEP0BCTE5NTlBPUFNRUVRTUVRTSk1MTlBPWFtaVFVXUFFUSUpNTk9RSkxOR0hKR0hKSUpNREZFR0lIR0lITU9ORkhHTE5NVlhXTU5QSU5PSE1OTVFTTFBRSE1OSU5PTVFQUVRTUFBOTU1KTE1IREU+Oz04QUE/Pj5AMzI5MTE6LzA2Oz1ANjc5Njg3OTs6OTo9Ojs+Pj5AMjI0Nzc5Pz9BPT0/MjI0Ly8xNjY4PT09SUlHVlZUTk5MPj47RUVCUFBOVFRRWlpaWFhYXFxcSUlJQUFBR0dHRkZGQEBAP0FAQkVEREZFQkVEOj07ODo5Sk1MRUdGSUxKPkA/MzYyMzYyOj07ODk7NDY5MjM5Njc9QEFFREZFRUdER0lFRkhFRUdGREZFSkxOTk9RREVHQUJFRkdJUVNVREVHOTo9QkRGQUJFREZFQEI/T1FOVFZVSUpNQUJFMjM3OTo+RUZIVlhXRUdGOz0/Nzg7Ojs/Pj9CSUpNVFZTVFZRSk1IQkVBREVHP0BER0hKSEpJTE5NUVRTTU9OSEpJTE5NVFZVV1hbT1BTSUpNTU5QUFFUSkxORUZIQUJFR0lISEpJTlBPTE5NSk1MU1VUVFZVTU9ORkpMRUlKSU5PSE1ORUlKR0xNSU5PTFBRSUlHUVFPVFVQRkdAOTo2Pz89PT0/MzI5LCw2LS80P0BEP0BCMjQzPT8+Oz0/Pj9BP0BEMTI2Njc6Nzg7LS8yKywwMTI2Oz0/Pj4+SEhGVVVTUVFPQUE/QUE/SkpIVVVTVVVVWlpaV1dXUFBQQEBASkpKRUVFRUVFQURCQEJBSEpJQURCOTs6OTs6SEpJRUdGTU9OREZFOTs4Nzk2PT8+OTo9NDY5MTI4ODk/P0BEPT8+Oz46P0E9QkVBRkhHSUxKR0hKSkxOP0BCP0BCP0BCUVNVTk9RTE1PPj9BRUZISUxKP0E+TlBNU1VUSElMQEFEOjs/QUJGR0hKVlhXU1VUPj9BNzg7ODk9NDY5R0hKUVRQV1pVT1FNSUxIRUZIPj9CSkxOSElMRkdJR0hKRUZIQkRGRkdJTE1PTk9RSUpNR0hKRUZISkxOSkxOSElMRUZIRUdGRkhHSk1MRUdGQkVETU9OUVRTTlBPSE1OR0xNTFBRSk9QQkdIREhJR0xNSU5PUVFPVVVTVVZRR0hBPT45QkJAQUFEOTg/Ly84KywyPj9CRUZINjg3QURCOjs+Ojs+Pj9CMTI2Ojs/Ojs/MjM3MDE0MzQ4Ojs+Pz8/TU1KTExJRERBPj47RkZESEhGUVFPV1dXVVVVWlpaUFBQRUVFSUlJTk5OR0dHQEJBODo5PT8+Oj07Nzk4OTs6RkhHREZFSEpJREZFPT87OTs4REZFPj9BNDY5LzA2Njc9Pj9CPkA/PT87RkhERkhFRkhHRkhHPj9BRkdJP0BCQkRGOz0/RUZIOz0/OTo9Nzg6P0BCPT8+PT8+UFNRTE5NPT5ANjc6Njc6QUJGREVHSk1MXF5dR0hKPj9CODk9Ojs/TU5QUFNPVFZRT1FNSUxIR0hKQUJGSElMR0hKRUZIRUZIP0BCP0BCQkRGRkdJSElMTU5QTk9RP0BCSUpNSkxOSUpNRUZIRkhHTlBPSk1MRkhHSUxKTU9OVlhXTE5NRUlKREhJSE1OR0xNP0RFQUZHREhJRkpMU1NQV1dVV1hUUFFKPT45Pz89RERGQUBHRUVOMTI4Nzg7MzQ3Nzk4QEJBQEFENDY4Nzs+JiowMzc9MTQ6LTE3Ki0zKi0zLS8yOjo6Tk5MUVFPSUlHPz89QUE/R0dFTExJTk5OVVVVV1dXTk5OQUFBSEhIUVFRR0dHRUdGP0FAOTs6QURCODo5OTs6REZFQEJBRUdGQkVEQEI/PT87R0lIOTo9MTI2LS80Nzg+Oz1AQURCPkA9QkVAP0E+Oj07Nzk4Pj9BOz0/Njc5Nzg6Njc5ODk7Nzg6MzQ3OTo+Ojs/OTo9Pj9BR0hKUFFURkdKNDY5ODk9P0BERUZIRUdGXF5dTE1PPT5BMTI2Njc6RkdJUVRQWFtWXmFcSk1JSElMOz1AP0BEPj9CP0BEP0BEOz1AOjs/QEFFSElNR0hKP0BCSkxOOTo9QUJFTE1PREVHPT5ASEpJT1FQSk1MRkhHRkhHRUdGTlBPSEpJQUZHQEVGREhJQUZHPkJEO0BBQkdIR0xNT09NVVVTVVZRT1BJODk0ODg2PT0/Pj1EODhBLzA2ODk9Njc5OTs6QURCPj9BMTI2Mzc9JCgtLDA2KCsxKi0zKCsxKi0zMDE0Ozs7TExJTk5MSEhGQEA+PT06Pz89SEhGSkpKVVVVVFRUUVFRPT09R0dHTU1NSUlJQEJBPT8+OTs6SEpJP0FAPkA/REZFQkVEQURCQkVERUdER0lGSUxKOz0/NDY5MTI4MzQ6Nzg7PkA/PkA9R0lFRUdEQkVEQURCPj9BOTo9MTI0MzQ3Njc5ODk7ODk7Njc6Nzg+Oz1CODk9ODk7REVHTk9TREVKMTI4Nzg7PT5BQUJFREZFW11cUFFUQkRHOTo+RkdKTU5QU1VRV1pVXV9bUFNPTE1PP0BEOz1AOjs/P0BEPj9CNzg7OTo+QUJGSUpOTU5QR0hKUFFUQEFER0hKSUpNR0hKR0hKUFNRT1FQTlBPRUdGR0lIRUdGTU9OTU9ORkpMREhJRkpMREhJO0BBO0BBQkdIRUlKU1NQVVVTUFFNR0hBMzQwOTk3Ozs+MjE4Kys0LC0zNzg7Njc5MzY0PkA/Pj9BNDY5LTE3JioyLzI6LDA4JSkxJSkxKi02MjM5UFBQUVFPQkJANDQyPT06Pz89Ozs5PT06SUlJT09PVVVVU1NTOzs7QUFBSUlJREREQEJBPT8+PkA/Sk1MRUdGP0FAP0FAP0FAOTs6P0FAR0lGTE5KSUxKOz0/NDY5MTI4LzA2MDE0OTs6Oj05RkhEQkVBPT8+ODo5OTo9Njc5MDEzMzQ3NDY4Nzg6Nzg6NDY5MzQ6ODk/NDY5Njc6SElNSUpOP0BGNjc9MzQ4ODk9P0BCREZFU1VUUFFUREVIPj9CR0hMSUpNT1FOU1VQWlxXVVdUT1BTP0BEOTpAOTpAPj9FOjtBNzg+ODk/PT5EQEFFQUJFQUJFTk9RRUZIRUZIRkdJSkxOTE1PR0lIR0lITU9OSk1MR0lIQURCRkhHSEpJQkdIP0RFQEVGPUFCOT4/O0BBQkdIQkdITk5MUVNOT1BJRkdAOjs3Ojo4Nzc5LCsyJSYsLC0zNDY5MTI0Njg3Pj9BOz0/MDE0KSw0IyYvJioyIiUtIiUtIyYsKi0zMzQ4REZFTExJRkZEPz89ODg2RERBTExJR0dFQkJCTk5OUFBOVFRROzs5SUlHQEBAPj4+OTs6QEJBR0lIUFNRT1FQRUdGREZFP0FAPT8+QkVETE5KUVRQR0lIOTo9MTI2LS80Njc9MjM3Oj07PT87QEI/PT87OTs6Nzg6ODk9Njc6MDE0MzQ4MTI2MzQ4MzQ4MTI2MjI7MzM9MTI4Nzg7SUpOTk9TREVKNzg+MTI4ODk9PT5AQUJFU1RWVldaSkxORkdKTk9TSElMSUxISk1IUVRPVFZTTU9OOz0/OTo+Njc9OjtBOTpAMTI4Nzg+Pj9FQUJIPj9CP0BCSElMQUJFODk7P0BCSkxOSUpNRkhHSk1MTE5NUVRTTlBPQURCRkhHSUpNREhJP0RFP0RFO0BBNzs9O0BBQkdIQEVGUFFNTU5HT1BJU1RNTU5JQkJCPTtANDM6KSowKCkvNzg7MzQ3NDY4OTo9Nzg7LzA2Kio2JSUxJCQtJSUvKCkvMTI2MjM2MDEzPkA/QkVEQEJBOTs6Oz49QURCRkhHTE5NUFBQSEhGUVNOUVNOSElFTE1ISEhGQkJCNzg6QEFERkhFTU9MTE5KSk1JSUpNQEFEPj9BREZFT1FOTlBNQURCNzg6MzQ6LCw2MTI4MTI2ODk7OTs6Oj07ODk7Nzg7Nzg+MTQ6MTQ9MDM7LzI9LTE7NjlBMjY+MDM7MDA5MDA5LzA2Nzg7R0hKSkxPQEFHMzQ6MTI4OTpAP0BEPT5BRkdKVldaRUZIRUZIQEBCTExORkZGSUlHVVVTVVVTTk5MR0dHRUZIODk9MzQ6Njc9MTE6ODhBNjY/ODhBP0BERUZISElMQkRGPT5APT5AR0hKRUZIRUZIQkRGSUpNTk9RR0hKR0hKRUZISElMOjs/PT5BPj9COjs/OTo+OTo+PT5BOjs/UFFKSUpEWltUTU5JRERBPT09NzY6MjE4KisxLC0zOjs/MjM2LS8xMzQ4MTI4KCgxKSk0JSUyJSUxJiYwJigtLS8yNDY4Njg3P0FAOj07Nzk4Nzk4P0FAP0FAQkVEQURCPz8/R0dHSkxHT1BJODkyPj86Pz8/Ozs+ODk9QUJFRkhFTlBMUVRPR0lGRkdJRkdKQkRGQUJFR0lITlBNSk1MPT5AMjM5LCw2MzQ6Njc9OTo+MjM2P0BCP0BEOz1CNDY7Mzc/LDA6Ky06MDI/MTNANzlGMTQ/LDA4LS05MjI7MDE3MjM3Ojs+UVNWRkdNNjc9MzQ6Nzg+RUZMPT5EQkRHTk9TR0hKPj9BPz9BTExOSEhIRkZGU1NQV1dVUFFNRUVCTk9RP0BEMzQ6MjM5Ly84NjY/MTE9Pj5HP0BEREVHR0hKQEFEOjs+PT5AREVHREVHPj9BPT5ASElMTk9RTU5QRkdJQUJFR0hKREVIQEFFOz1ANzg7PT5BPT5BPj9CPT5BUVNMR0hBV1hRT1BMQkJASUlJNjQ5MTA3KywyMTI4Pj9CMDEzKywvMTI2LzA2JSUvJiYyJCQxJSUxKSkyJSYsKisvOTo9PkA/PkA/OTs6MzY0MjQzOj07QkVEPkA/PkA/R0dJR0dHTk5MTE1IQUI+SUlHOzs7PT0/OTo+Pj9BPkA9REZBU1VQQEI/Oz0/QEFFQEFEOTo9Oj07R0lGTlBPP0BCMDE3Ly84MzQ6ODk/PT5BODk7Pj9BODk9MzQ6MzQ6MjY+Ky85Kiw5LzE+MTNANzlGMTQ/LDA4MjI+Ly84LC0zMzQ4P0BCT1BUQEFHMjM5MjM5Njc9REVKOz1CQUJGTU5RSElMOz0/SkpNSUlMRkZGSEhIVlZUVFRRTU5JSEhGWFtaV1hcODk9Njc9MzQ6NjY/MTE6ODhBPT5BQEFFQUJGOjs/Nzg7Oz1AP0BEQUJGP0BCPj9BSElMTk9RTU5QRkdJQUJFR0hKP0BEOTo+Njc6NDY5QkRHRUZJQkRHREVITE1GUVNMVFVOTk9KTU1KQEBAMzI3Ly00KCkvMTI4PT5BKSosKistLzAzLC0zJCQtJSUxJCQxJiYyKiozIyQqJigrOz0/QkVERUdGNjc5LzAyNjc5Njc5Ojs+QUJFQEFERERGRERGTk5MUFBOT09NTU1KSkpNQUFEPj9CREVHPkA9PkA7TlBMOj05MTI0MDE0QEFEPj9BOj07QkVBTE5NPT5ALS80MDA5Njc9MjM5MzQ4MTI0Nzg6Nzg7Njc9MzQ6LzI6LTE7LC87Ky06LTA9NjhFMjZAMDM7MTE9MTE6LC0zMDE0RkdJU1RXSUpQNjc9LS80Njc9PT5EOTpAQUJGUVNWSUpNPT5APj5AQEBCRUVFRkZGVFRRVlZUT1BMRkZEWlxbYWJkQUJGMjM3LzA2MTI4OTlCNjc9QkRJRUZJRUZJPT5BNDY5Ojs/Oz1AQEFFP0BCPT5AREVHSElMR0hKR0hKRUZISElMR0hMPT5BNDY5MTI2Pj9CQkRHQEFFP0BEU1RNSUpEUVNMVldTRUVCQEBAOTg9Ly00KCkvMTI4Oz1AKywvKistKSotIyQqJCQtJSUxIyMwJCQwJiYwJigtKSotQkRGSUxKMjM2LzAzLC0xMzQ4Oz1ANjc6Nzg7MzQ4OTg9PT0/R0dHTExMQUFBPz8/MzM2LSwxKywwMjM2QURASEpGVFZRR0lGMTI0LzAzPT5APj9BQURCRUdEQkVEODk7LC0zKys0MTI4NDY7Nzg7MDEzNzg6ODk9ODk/Nzg+LDA4KCs2LTA9MDI/Ky06Ky06Ky85Ky83LS05LCw2LC0zNDY5TE1PTE1QTk9VOjtBLzA2NDY7ODk/OTpAQEFFSUpOQEFEOTo9QUFEPT0/Ojo6QUFBVFRRW1tYTE1ITExJWlxbVFVXTU5QPT5BMTI2LzA2KisxOTpAOz1COz1CPj9FNDY7Njc9PT5EP0BGPj9COz0/Oz0/QkRGRUZISUpNSUpNSElMRkdJREVHRUZINjc5MTI0P0BCSElMSElMREVHP0A5QEE6UFFKVVZRVFRRRkZGNDM4KCYtKCkvNzg+QkRHLzAyKSosKSotIyQqJSUvIyMvIiIvJCQwKiozKCkvMDE0R0hKVFVXODk9LzAzKywwLS8yLzAzMDE0Ojs/MjM3LCswOzo/QkJFSEhIRUVFQEBCNzY6MC8zNDY5OTo9Oj05P0E9T1FNTE5KOjs+Nzg7ODk7Oz0/PkA/PT87PkA/Nzg6LS80LCw2NDY7NDY7NDY5LC0wODk7Njc6MTI4LS80Ky83KSw3LC87LC87Kiw5Kiw5Ki04Ki02LS05LCw2JigtOTo+SkxOSkxPUVNYTE1TMDE3MjM5OTpANDY7QkRHREVIPj9BOz0/SEhKOTk7ODg4Pj4+TU1KT09NSUpGTU5JUFNPVFZVVVZYTk9ROjs/MDE0LzA2NDY7ODk/Njc9Nzg+MzQ6MDE3ODk/Oz1COjtBOTo+NDY4PT5ARUZIR0hKR0hKRUZIQkRGREVHQUJFOTo9ODk7PT5AREVHRUZIPj9BOjs0Pj84UFFKV1hUTU1KQkJCMzI3JSQrKisxP0BGSkxPMzQ3LC0wLC0xKSowKys0KCgzJCQxKio2NjY/JCUrMTI2QkRGU1RWOjs/LS80LC0zKywyMjM5LS80MDE3KSowMC82OTg9SEhKSEhIRUVFPz9BOTg9Ly00Ojs/Oz0/ODo3OTs3TlBMSk1JOTo9Njc6ODk7QEFEQEJBOTs4ODo5Njc5LzA2LS03NDY7MTI4MTI2LC0wNzg6NDY5OTpAQUJIKy83KSw3LC87KCo3KSs4KSs4KSw3KSw0KSk0MDA5KywyNzg7QkRGRkdKRkdNOjtBOTpAMDE3MjM5MzQ6Pj9CQEFFOz0/Ojs+Pj5AOjo9Pj4+PT09SUlHT09NU1RPUVNOTE5KUVRTTlBPSUpNNDY5LS8yMTI2Oz1COjtBNjY/MzM9MjI7MTE6NzdAOztFOz1CQEFFOTo9Oz0/QEFEP0BCREVHR0hKSUpNSEpJPT8+Njg3Nzk4PT8+QURCRkhHQURCPj84Ojs0SUpEVFVQSUlHSEhIOjk+JiUsKywyREVKUVNWNzg6MTI0MjM3LzA2MjI7JSUxIiIvKio2OTlCKCkvNzg7P0BCUVNVOTo+KywyLzA2LC0zLC0zOTpAODk/Njc9NDM6Ojk+QUFESEhIQkJCOjo9NzY6KyoxODk9Nzg6Oz46Oj04UVRPRUdELS8xKywwMjM2Pj9BPkA/MjQxMzY0NDY4MDE3LS03MDE3LC0zMDE0LzAyMjM2Nzg7Nzg+MzQ6Ki02Ki04Ky06JCYzKCo3KCo3KCs2KCszKys3KSkyLC0zOTo+R0hKSUpOT1BWUVNYQEFHMDE3KisxNDY7Oz1AP0BEODk7ODk7Pz9BPT0/Nzc3Ozs7RkZET09NVFVQUFFNTE5KU1VRTE5NR0hKLzAzLS8yKywwOz1CPz9INjY/MjI7MzM9MzM9MjI7MzM9Njc9Nzg7NDY4OTo9OTo9QEFERUZISElMSUpNREZFNDc2MzY0ODo5QEJBQEJBRkhHSEpJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdndlYnAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Z3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5YzcyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Z3ZWJwLmMKQEAgLTAsMCArMSw1OTcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgU2ltcGxlIE9wZW5HTC1iYXNlZCBXZWJQIGZpbGUgdmlld2VyLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoX191bml4X18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMDExMkwgIC8vIGZvciBzZXRlbnYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0dMKQorCisjaWYgZGVmaW5lZChIQVZFX0dMVVRfR0xVVF9IKQorI2luY2x1ZGUgPEdMVVQvZ2x1dC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxHTC9nbHV0Lmg+CisjaWZkZWYgRlJFRUdMVVQKKyNpbmNsdWRlIDxHTC9mcmVlZ2x1dC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdFQlBfSEFWRV9RQ01TCisjaW5jbHVkZSA8cWNtcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZGVtdXguaCIKKworI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworLy8gVW5mb3J0dW5hdGUgZ2xvYmFsIHZhcmlhYmxlcy4gR2F0aGVyZWQgaW50byBhIHN0cnVjdCBmb3IgY29tZm9ydC4KK3N0YXRpYyBzdHJ1Y3QgeworICBpbnQgaGFzX2FuaW1hdGlvbjsKKyAgaW50IGhhc19jb2xvcl9wcm9maWxlOworICBpbnQgZG9uZTsKKyAgaW50IGRlY29kaW5nX2Vycm9yOworICBpbnQgcHJpbnRfaW5mbzsKKyAgaW50IG9ubHlfZGVsdGFzOworICBpbnQgdXNlX2NvbG9yX3Byb2ZpbGU7CisKKyAgaW50IGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKyAgaW50IGxvb3BfY291bnQ7CisgIHVpbnQzMl90IGJnX2NvbG9yOworCisgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZTsKKyAgV2ViUERhdGEgZGF0YTsKKyAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICBjb25zdCBXZWJQRGVjQnVmZmVyKiBwaWM7CisgIFdlYlBEZW11eGVyKiBkbXV4OworICBXZWJQSXRlcmF0b3IgY3Vycl9mcmFtZTsKKyAgV2ViUEl0ZXJhdG9yIHByZXZfZnJhbWU7CisgIFdlYlBDaHVua0l0ZXJhdG9yIGljY3A7CisgIGludCB2aWV3cG9ydF93aWR0aCwgdmlld3BvcnRfaGVpZ2h0OworfSBrUGFyYW1zOworCitzdGF0aWMgdm9pZCBDbGVhclByZXZpb3VzUGljKHZvaWQpIHsKKyAgV2ViUEZyZWVEZWNCdWZmZXIoKFdlYlBEZWNCdWZmZXIqKWtQYXJhbXMucGljKTsKKyAga1BhcmFtcy5waWMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBDbGVhclBhcmFtcyh2b2lkKSB7CisgIENsZWFyUHJldmlvdXNQaWMoKTsKKyAgV2ViUERhdGFDbGVhcigma1BhcmFtcy5kYXRhKTsKKyAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZrUGFyYW1zLmN1cnJfZnJhbWUpOworICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJmtQYXJhbXMucHJldl9mcmFtZSk7CisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZrUGFyYW1zLmljY3ApOworICBXZWJQRGVtdXhEZWxldGUoa1BhcmFtcy5kbXV4KTsKKyAga1BhcmFtcy5kbXV4ID0gTlVMTDsKK30KKworLy8gU2V0cyB0aGUgcHJldmlvdXMgZnJhbWUgdG8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGNhbnZhcyBhbmQgaGFzIGl0IGRpc3Bvc2UKKy8vIHRvIGJhY2tncm91bmQgdG8gY2F1c2UgdGhlIGNhbnZhcyB0byBiZSBjbGVhcmVkLgorc3RhdGljIHZvaWQgQ2xlYXJQcmV2aW91c0ZyYW1lKHZvaWQpIHsKKyAgV2ViUEl0ZXJhdG9yKiBjb25zdCBwcmV2ID0gJmtQYXJhbXMucHJldl9mcmFtZTsKKyAgcHJldi0+d2lkdGggPSBrUGFyYW1zLmNhbnZhc193aWR0aDsKKyAgcHJldi0+aGVpZ2h0ID0ga1BhcmFtcy5jYW52YXNfaGVpZ2h0OworICBwcmV2LT54X29mZnNldCA9IHByZXYtPnlfb2Zmc2V0ID0gMDsKKyAgcHJldi0+ZGlzcG9zZV9tZXRob2QgPSBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBwcm9maWxlIGhhbmRsaW5nCitzdGF0aWMgaW50IEFwcGx5Q29sb3JQcm9maWxlKGNvbnN0IFdlYlBEYXRhKiBjb25zdCBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCByZ2JhKSB7CisjaWZkZWYgV0VCUF9IQVZFX1FDTVMKKyAgaW50IGksIG9rID0gMDsKKyAgdWludDhfdCogbGluZTsKKyAgdWludDhfdCBtYWpvcl9yZXZpc2lvbjsKKyAgcWNtc19wcm9maWxlKiBpbnB1dF9wcm9maWxlID0gTlVMTDsKKyAgcWNtc19wcm9maWxlKiBvdXRwdXRfcHJvZmlsZSA9IE5VTEw7CisgIHFjbXNfdHJhbnNmb3JtKiB0cmFuc2Zvcm0gPSBOVUxMOworICBjb25zdCBxY21zX2RhdGFfdHlwZSBpbnB1dF90eXBlID0gUUNNU19EQVRBX1JHQkFfODsKKyAgY29uc3QgcWNtc19kYXRhX3R5cGUgb3V0cHV0X3R5cGUgPSBRQ01TX0RBVEFfUkdCQV84OworICBjb25zdCBxY21zX2ludGVudCBpbnRlbnQgPSBRQ01TX0lOVEVOVF9ERUZBVUxUOworCisgIGlmIChwcm9maWxlID09IE5VTEwgfHwgcmdiYSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHByb2ZpbGUtPmJ5dGVzID09IE5VTEwgfHwgcHJvZmlsZS0+c2l6ZSA8IDEwKSByZXR1cm4gMTsKKyAgbWFqb3JfcmV2aXNpb24gPSBwcm9maWxlLT5ieXRlc1s4XTsKKworICBxY21zX2VuYWJsZV9pY2N2NCgpOworICBpbnB1dF9wcm9maWxlID0gcWNtc19wcm9maWxlX2Zyb21fbWVtb3J5KHByb2ZpbGUtPmJ5dGVzLCBwcm9maWxlLT5zaXplKTsKKyAgLy8gcWNtc19wcm9maWxlX2lzX2JvZ3VzKCkgaXMgYnJva2VuIHdpdGggSUNDdjQuCisgIGlmIChpbnB1dF9wcm9maWxlID09IE5VTEwgfHwKKyAgICAgIChtYWpvcl9yZXZpc2lvbiA8IDQgJiYgcWNtc19wcm9maWxlX2lzX2JvZ3VzKGlucHV0X3Byb2ZpbGUpKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ29sb3IgcHJvZmlsZSBpcyBib2d1cyFcbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBvdXRwdXRfcHJvZmlsZSA9IHFjbXNfcHJvZmlsZV9zUkdCKCk7CisgIGlmIChvdXRwdXRfcHJvZmlsZSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBvdXRwdXQgY29sb3IgcHJvZmlsZSFcbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBxY21zX3Byb2ZpbGVfcHJlY2FjaGVfb3V0cHV0X3RyYW5zZm9ybShvdXRwdXRfcHJvZmlsZSk7CisgIHRyYW5zZm9ybSA9IHFjbXNfdHJhbnNmb3JtX2NyZWF0ZShpbnB1dF9wcm9maWxlLCBpbnB1dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb2ZpbGUsIG91dHB1dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50KTsKKyAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBjb2xvciB0cmFuc2Zvcm0hXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgbGluZSA9IHJnYmEtPnUuUkdCQS5yZ2JhOworICBmb3IgKGkgPSAwOyBpIDwgcmdiYS0+aGVpZ2h0OyArK2ksIGxpbmUgKz0gcmdiYS0+dS5SR0JBLnN0cmlkZSkgeworICAgIHFjbXNfdHJhbnNmb3JtX2RhdGEodHJhbnNmb3JtLCBsaW5lLCBsaW5lLCByZ2JhLT53aWR0aCk7CisgIH0KKyAgb2sgPSAxOworCisgRXJyb3I6CisgIGlmIChpbnB1dF9wcm9maWxlICE9IE5VTEwpIHFjbXNfcHJvZmlsZV9yZWxlYXNlKGlucHV0X3Byb2ZpbGUpOworICBpZiAob3V0cHV0X3Byb2ZpbGUgIT0gTlVMTCkgcWNtc19wcm9maWxlX3JlbGVhc2Uob3V0cHV0X3Byb2ZpbGUpOworICBpZiAodHJhbnNmb3JtICE9IE5VTEwpIHFjbXNfdHJhbnNmb3JtX3JlbGVhc2UodHJhbnNmb3JtKTsKKyAgcmV0dXJuIG9rOworI2Vsc2UKKyAgKHZvaWQpcHJvZmlsZTsKKyAgKHZvaWQpcmdiYTsKKyAgcmV0dXJuIDE7CisjZW5kaWYgIC8vIFdFQlBfSEFWRV9RQ01TCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWxlIGRlY29kaW5nCisKK3N0YXRpYyBpbnQgRGVjb2RlKHZvaWQpIHsgICAvLyBGaWxscyBrUGFyYW1zLmN1cnJfZnJhbWUKKyAgY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyID0gJmtQYXJhbXMuY3Vycl9mcmFtZTsKKyAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZyA9ICZrUGFyYW1zLmNvbmZpZzsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0X2J1ZmZlciA9ICZjb25maWctPm91dHB1dDsKKyAgaW50IG9rID0gMDsKKworICBDbGVhclByZXZpb3VzUGljKCk7CisgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7CisgIG9rID0gKFdlYlBEZWNvZGUoY3Vyci0+ZnJhZ21lbnQuYnl0ZXMsIGN1cnItPmZyYWdtZW50LnNpemUsCisgICAgICAgICAgICAgICAgICAgY29uZmlnKSA9PSBWUDhfU1RBVFVTX09LKTsKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRGVjb2Rpbmcgb2YgZnJhbWUgIyVkIGZhaWxlZCFcbiIsIGN1cnItPmZyYW1lX251bSk7CisgIH0gZWxzZSB7CisgICAga1BhcmFtcy5waWMgPSBvdXRwdXRfYnVmZmVyOworICAgIGlmIChrUGFyYW1zLnVzZV9jb2xvcl9wcm9maWxlKSB7CisgICAgICBvayA9IEFwcGx5Q29sb3JQcm9maWxlKCZrUGFyYW1zLmljY3AuY2h1bmssIG91dHB1dF9idWZmZXIpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFwcGx5aW5nIGNvbG9yIHByb2ZpbGUgdG8gZnJhbWUgIyVkIGZhaWxlZCFcbiIsCisgICAgICAgICAgICAgICAgY3Vyci0+ZnJhbWVfbnVtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfY2FsbGJhY2soaW50IHdoYXQpIHsKKyAgaWYgKHdoYXQgPT0gMCAmJiAha1BhcmFtcy5kb25lKSB7CisgICAgaW50IGR1cmF0aW9uID0gMDsKKyAgICBpZiAoa1BhcmFtcy5kbXV4ICE9IE5VTEwpIHsKKyAgICAgIFdlYlBJdGVyYXRvciogY29uc3QgY3VyciA9ICZrUGFyYW1zLmN1cnJfZnJhbWU7CisgICAgICBpZiAoIVdlYlBEZW11eE5leHRGcmFtZShjdXJyKSkgeworICAgICAgICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoY3Vycik7CisgICAgICAgIGlmIChXZWJQRGVtdXhHZXRGcmFtZShrUGFyYW1zLmRtdXgsIDEsIGN1cnIpKSB7CisgICAgICAgICAgLS1rUGFyYW1zLmxvb3BfY291bnQ7CisgICAgICAgICAga1BhcmFtcy5kb25lID0gKGtQYXJhbXMubG9vcF9jb3VudCA9PSAwKTsKKyAgICAgICAgICBpZiAoa1BhcmFtcy5kb25lKSByZXR1cm47CisgICAgICAgICAgQ2xlYXJQcmV2aW91c0ZyYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAga1BhcmFtcy5kZWNvZGluZ19lcnJvciA9IDE7CisgICAgICAgICAga1BhcmFtcy5kb25lID0gMTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGR1cmF0aW9uID0gY3Vyci0+ZHVyYXRpb247CisgICAgICAvLyBCZWhhdmlvciBjb3BpZWQgZnJvbSBDaHJvbWUsIGNmOgorICAgICAgLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL3RoaXJkX3BhcnR5L1dlYktpdC9Tb3VyY2UvCisgICAgICAvLyBwbGF0Zm9ybS9ncmFwaGljcy9EZWZlcnJlZEltYWdlRGVjb2Rlci5jcHA/CisgICAgICAvLyByY2w9YjRjMzMwNDlmMDk2Y2QyODNmMzJiZTlhNThiOWE5ZTc2ODIyN2MyNiZsPTI0NgorICAgICAgaWYgKGR1cmF0aW9uIDw9IDEwKSBkdXJhdGlvbiA9IDEwMDsKKyAgICB9CisgICAgaWYgKCFEZWNvZGUoKSkgeworICAgICAga1BhcmFtcy5kZWNvZGluZ19lcnJvciA9IDE7CisgICAgICBrUGFyYW1zLmRvbmUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBnbHV0UG9zdFJlZGlzcGxheSgpOworICAgICAgZ2x1dFRpbWVyRnVuYyhkdXJhdGlvbiwgZGVjb2RlX2NhbGxiYWNrLCB3aGF0KTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENhbGxiYWNrcworCitzdGF0aWMgdm9pZCBIYW5kbGVLZXkodW5zaWduZWQgY2hhciBrZXksIGludCBwb3NfeCwgaW50IHBvc195KSB7CisgICh2b2lkKXBvc194OworICAodm9pZClwb3NfeTsKKyAgaWYgKGtleSA9PSAncScgfHwga2V5ID09ICdRJyB8fCBrZXkgPT0gMjcgLyogRXNjICovKSB7CisjaWZkZWYgRlJFRUdMVVQKKyAgICBnbHV0TGVhdmVNYWluTG9vcCgpOworI2Vsc2UKKyAgICBDbGVhclBhcmFtcygpOworICAgIGV4aXQoMCk7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChrZXkgPT0gJ2MnKSB7CisgICAgaWYgKGtQYXJhbXMuaGFzX2NvbG9yX3Byb2ZpbGUgJiYgIWtQYXJhbXMuZGVjb2RpbmdfZXJyb3IpIHsKKyAgICAgIGtQYXJhbXMudXNlX2NvbG9yX3Byb2ZpbGUgPSAxIC0ga1BhcmFtcy51c2VfY29sb3JfcHJvZmlsZTsKKworICAgICAgaWYgKGtQYXJhbXMuaGFzX2FuaW1hdGlvbikgeworICAgICAgICAvLyBSZXN0YXJ0IHRoZSBjb21wbGV0ZWQgYW5pbWF0aW9uIHRvIHBpY2t1cCB0aGUgY29sb3IgcHJvZmlsZSBjaGFuZ2UuCisgICAgICAgIGlmIChrUGFyYW1zLmRvbmUgJiYga1BhcmFtcy5sb29wX2NvdW50ID09IDApIHsKKyAgICAgICAgICBrUGFyYW1zLmxvb3BfY291bnQgPQorICAgICAgICAgICAgICAoaW50KVdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0xPT1BfQ09VTlQpICsgMTsKKyAgICAgICAgICBrUGFyYW1zLmRvbmUgPSAwOworICAgICAgICAgIC8vIFN0YXJ0IHRoZSBkZWNvZGUgbG9vcCBpbW1lZGlhdGVseS4KKyAgICAgICAgICBnbHV0VGltZXJGdW5jKDAsIGRlY29kZV9jYWxsYmFjaywgMCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlY29kZSgpOworICAgICAgICBnbHV0UG9zdFJlZGlzcGxheSgpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChrZXkgPT0gJ2knKSB7CisgICAgLy8gTm90ZTogZG9lc24ndCBoYW5kbGUgcmVmcmVzaCBvZiBhbmltYXRpb24ncyBsYXN0LWZyYW1lIChpdCdzIHF1aXRlCisgICAgLy8gbW9yZSBpbnZvbHZlZCB0byBkbywgc2luY2UgeW91IG5lZWQgdG8gc2F2ZSB0aGUgcHJldmlvdXMgZnJhbWUpLgorICAgIGtQYXJhbXMucHJpbnRfaW5mbyA9IDEgLSBrUGFyYW1zLnByaW50X2luZm87CisgICAgaWYgKCFrUGFyYW1zLmhhc19hbmltYXRpb24pIENsZWFyUHJldmlvdXNGcmFtZSgpOworICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CisgIH0gZWxzZSBpZiAoa2V5ID09ICdkJykgeworICAgIGtQYXJhbXMub25seV9kZWx0YXMgPSAxIC0ga1BhcmFtcy5vbmx5X2RlbHRhczsKKyAgICBnbHV0UG9zdFJlZGlzcGxheSgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhhbmRsZVJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIC8vIE5vdGU6IHJlc2hhcGUgZG9lc24ndCBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8sIGFuZCBtaWdodAorICAvLyBiZSBoYW5kbGluZyBsYXJnZXItdGhhbi1zY3JlZW4gcGljdHVyZXMgaW5jb3JyZWN0bHkuCisgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgIGdsTG9hZElkZW50aXR5KCk7CisgIGtQYXJhbXMudmlld3BvcnRfd2lkdGggPSB3aWR0aDsKKyAga1BhcmFtcy52aWV3cG9ydF9oZWlnaHQgPSBoZWlnaHQ7CisgIGlmICgha1BhcmFtcy5oYXNfYW5pbWF0aW9uKSBDbGVhclByZXZpb3VzRnJhbWUoKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRTdHJpbmcoY29uc3QgY2hhciogY29uc3QgdGV4dCkgeworICB2b2lkKiBjb25zdCBmb250ID0gR0xVVF9CSVRNQVBfOV9CWV8xNTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IHRleHRbaV07ICsraSkgeworICAgIGdsdXRCaXRtYXBDaGFyYWN0ZXIoZm9udCwgdGV4dFtpXSk7CisgIH0KK30KKworc3RhdGljIGZsb2F0IEdldENvbG9yZih1aW50MzJfdCBjb2xvciwgaW50IHNoaWZ0KSB7CisgIHJldHVybiAoY29sb3IgPj4gc2hpZnQpIC8gMjU1LmY7Cit9CisKK3N0YXRpYyB2b2lkIERyYXdDaGVja2VyQm9hcmQodm9pZCkgeworICBjb25zdCBpbnQgc3F1YXJlX3NpemUgPSA4OyAgLy8gbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgaW50IHgsIHk7CisgIEdMaW50IHZpZXdwb3J0WzRdOyAgLy8geCwgeSwgd2lkdGgsIGhlaWdodAorCisgIGdsUHVzaE1hdHJpeCgpOworCisgIGdsR2V0SW50ZWdlcnYoR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKKyAgLy8gc2hpZnQgdG8gaW50ZWdlciBjb29yZGluYXRlcyB3aXRoICgwLDApIGJlaW5nIHRvcC1sZWZ0LgorICBnbE9ydGhvKDAsIHZpZXdwb3J0WzJdLCB2aWV3cG9ydFszXSwgMCwgLTEsIDEpOworICBmb3IgKHkgPSAwOyB5IDwgdmlld3BvcnRbM107IHkgKz0gc3F1YXJlX3NpemUpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdmlld3BvcnRbMl07IHggKz0gc3F1YXJlX3NpemUpIHsKKyAgICAgIGNvbnN0IEdMdWJ5dGUgY29sb3IgPSAxMjggKyA2NCAqICghKCh4ICsgeSkgJiBzcXVhcmVfc2l6ZSkpOworICAgICAgZ2xDb2xvcjN1Yihjb2xvciwgY29sb3IsIGNvbG9yKTsKKyAgICAgIGdsUmVjdGkoeCwgeSwgeCArIHNxdWFyZV9zaXplLCB5ICsgc3F1YXJlX3NpemUpOworICAgIH0KKyAgfQorICBnbFBvcE1hdHJpeCgpOworfQorCitzdGF0aWMgdm9pZCBIYW5kbGVEaXNwbGF5KHZvaWQpIHsKKyAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgcGljID0ga1BhcmFtcy5waWM7CisgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgY3VyciA9ICZrUGFyYW1zLmN1cnJfZnJhbWU7CisgIFdlYlBJdGVyYXRvciogY29uc3QgcHJldiA9ICZrUGFyYW1zLnByZXZfZnJhbWU7CisgIEdMZmxvYXQgeG9mZiwgeW9mZjsKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm47CisgIGdsUHVzaE1hdHJpeCgpOworICBnbFBpeGVsWm9vbSgoR0xmbG9hdCkoKzEuIC8ga1BhcmFtcy5jYW52YXNfd2lkdGggKiBrUGFyYW1zLnZpZXdwb3J0X3dpZHRoKSwKKyAgICAgICAgICAgICAgKEdMZmxvYXQpKC0xLiAvIGtQYXJhbXMuY2FudmFzX2hlaWdodCAqIGtQYXJhbXMudmlld3BvcnRfaGVpZ2h0KSk7CisgIHhvZmYgPSAoR0xmbG9hdCkoMi4gKiBjdXJyLT54X29mZnNldCAvIGtQYXJhbXMuY2FudmFzX3dpZHRoKTsKKyAgeW9mZiA9IChHTGZsb2F0KSgyLiAqIGN1cnItPnlfb2Zmc2V0IC8ga1BhcmFtcy5jYW52YXNfaGVpZ2h0KTsKKyAgZ2xSYXN0ZXJQb3MyZigtMS5mICsgeG9mZiwgMS5mIC0geW9mZik7CisgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1JPV19MRU5HVEgsIHBpYy0+dS5SR0JBLnN0cmlkZSAvIDQpOworCisgIGlmIChrUGFyYW1zLm9ubHlfZGVsdGFzKSB7CisgICAgRHJhd0NoZWNrZXJCb2FyZCgpOworICB9IGVsc2UgaWYgKHByZXYtPmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCB8fAorICAgICAgY3Vyci0+YmxlbmRfbWV0aG9kID09IFdFQlBfTVVYX05PX0JMRU5EKSB7CisgICAgLy8gZ2xTY2lzc29yKCkgdGFrZXMgd2luZG93IGNvb3JkaW5hdGVzICgwLDAgYXQgYm90dG9tIGxlZnQpLgorICAgIGludCB3aW5kb3dfeCwgd2luZG93X3k7CisgICAgaW50IGZyYW1lX3csIGZyYW1lX2g7CisgICAgaWYgKHByZXYtPmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgeworICAgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIGZyYW1lIHJlY3RhbmdsZS4KKyAgICAgIHdpbmRvd194ID0gcHJldi0+eF9vZmZzZXQ7CisgICAgICB3aW5kb3dfeSA9IGtQYXJhbXMuY2FudmFzX2hlaWdodCAtIHByZXYtPnlfb2Zmc2V0IC0gcHJldi0+aGVpZ2h0OworICAgICAgZnJhbWVfdyA9IHByZXYtPndpZHRoOworICAgICAgZnJhbWVfaCA9IHByZXYtPmhlaWdodDsKKyAgICB9IGVsc2UgeyAgLy8gY3Vyci0+YmxlbmRfbWV0aG9kID09IFdFQlBfTVVYX05PX0JMRU5ELgorICAgICAgLy8gV2Ugc2ltdWxhdGUgbm8tYmxlbmRpbmcgYmVoYXZpb3IgYnkgZmlyc3QgY2xlYXJpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICAgIC8vIHJlY3RhbmdsZSAodG8gYSBjaGVja2VyLWJvYXJkKSBhbmQgdGhlbiBhbHBoYS1ibGVuZGluZyBhZ2FpbnN0IGl0LgorICAgICAgd2luZG93X3ggPSBjdXJyLT54X29mZnNldDsKKyAgICAgIHdpbmRvd195ID0ga1BhcmFtcy5jYW52YXNfaGVpZ2h0IC0gY3Vyci0+eV9vZmZzZXQgLSBjdXJyLT5oZWlnaHQ7CisgICAgICBmcmFtZV93ID0gY3Vyci0+d2lkdGg7CisgICAgICBmcmFtZV9oID0gY3Vyci0+aGVpZ2h0OworICAgIH0KKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIC8vIE9ubHkgdXBkYXRlIHRoZSByZXF1ZXN0ZWQgYXJlYSwgbm90IHRoZSB3aG9sZSBjYW52YXMuCisgICAgd2luZG93X3ggPSB3aW5kb3dfeCAqIGtQYXJhbXMudmlld3BvcnRfd2lkdGggLyBrUGFyYW1zLmNhbnZhc193aWR0aDsKKyAgICB3aW5kb3dfeSA9IHdpbmRvd195ICoga1BhcmFtcy52aWV3cG9ydF9oZWlnaHQgLyBrUGFyYW1zLmNhbnZhc19oZWlnaHQ7CisgICAgZnJhbWVfdyA9IGZyYW1lX3cgKiBrUGFyYW1zLnZpZXdwb3J0X3dpZHRoIC8ga1BhcmFtcy5jYW52YXNfd2lkdGg7CisgICAgZnJhbWVfaCA9IGZyYW1lX2ggKiBrUGFyYW1zLnZpZXdwb3J0X2hlaWdodCAvIGtQYXJhbXMuY2FudmFzX2hlaWdodDsKKyAgICBnbFNjaXNzb3Iod2luZG93X3gsIHdpbmRvd195LCBmcmFtZV93LCBmcmFtZV9oKTsKKworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7ICAvLyB1c2UgY2xlYXIgY29sb3IKKyAgICBEcmF3Q2hlY2tlckJvYXJkKCk7CisKKyAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgfQorCisgICpwcmV2ID0gKmN1cnI7CisKKyAgZ2xEcmF3UGl4ZWxzKHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwKKyAgICAgICAgICAgICAgIChHTHZvaWQqKXBpYy0+dS5SR0JBLnJnYmEpOworICBpZiAoa1BhcmFtcy5wcmludF9pbmZvKSB7CisgICAgY2hhciB0bXBbMzJdOworCisgICAgZ2xDb2xvcjRmKDAuOTBmLCAwLjBmLCAwLjkwZiwgMS4wZik7CisgICAgZ2xSYXN0ZXJQb3MyZigtMC45NWYsIDAuOTBmKTsKKyAgICBQcmludFN0cmluZyhrUGFyYW1zLmZpbGVfbmFtZSk7CisKKyAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiRGltZW5zaW9uOiVkIHggJWQiLCBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgICAgZ2xDb2xvcjRmKDAuOTBmLCAwLjBmLCAwLjkwZiwgMS4wZik7CisgICAgZ2xSYXN0ZXJQb3MyZigtMC45NWYsIDAuODBmKTsKKyAgICBQcmludFN0cmluZyh0bXApOworICAgIGlmIChjdXJyLT54X29mZnNldCAhPSAwIHx8IGN1cnItPnlfb2Zmc2V0ICE9IDApIHsKKyAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIgKG9mZnNldDolZCwlZCkiLAorICAgICAgICAgICAgICAgY3Vyci0+eF9vZmZzZXQsIGN1cnItPnlfb2Zmc2V0KTsKKyAgICAgIGdsUmFzdGVyUG9zMmYoLTAuOTVmLCAwLjcwZik7CisgICAgICBQcmludFN0cmluZyh0bXApOworICAgIH0KKyAgfQorICBnbFBvcE1hdHJpeCgpOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9XSU4zMikKKyAgZ2xGbHVzaCgpOworI2Vsc2UKKyAgZ2x1dFN3YXBCdWZmZXJzKCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgU3RhcnREaXNwbGF5KHZvaWQpIHsKKyAgY29uc3QgaW50IHdpZHRoID0ga1BhcmFtcy5jYW52YXNfd2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBrUGFyYW1zLmNhbnZhc19oZWlnaHQ7CisgIC8vIFRPRE8od2VicDozNjUpIEdMVVRfRE9VQkxFIHJlc3VsdHMgaW4gZmxpY2tlcmluZyAvIG9sZCBmcmFtZXMgdG8gYmUKKyAgLy8gcGFydGlhbGx5IGRpc3BsYXllZCB3aXRoIGFuaW1hdGVkIHdlYnAgKyBhbHBoYS4KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfV0lOMzIpCisgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0JBKTsKKyNlbHNlCisgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9ET1VCTEUgfCBHTFVUX1JHQkEpOworI2VuZGlmCisgIGdsdXRJbml0V2luZG93U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgZ2x1dENyZWF0ZVdpbmRvdygiV2ViUCB2aWV3ZXIiKTsKKyAgZ2x1dERpc3BsYXlGdW5jKEhhbmRsZURpc3BsYXkpOworICBnbHV0UmVzaGFwZUZ1bmMoSGFuZGxlUmVzaGFwZSk7CisgIGdsdXRJZGxlRnVuYyhOVUxMKTsKKyAgZ2x1dEtleWJvYXJkRnVuYyhIYW5kbGVLZXkpOworICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICBnbEVuYWJsZShHTF9CTEVORCk7CisgIGdsQ2xlYXJDb2xvcihHZXRDb2xvcmYoa1BhcmFtcy5iZ19jb2xvciwgMCksCisgICAgICAgICAgICAgICBHZXRDb2xvcmYoa1BhcmFtcy5iZ19jb2xvciwgOCksCisgICAgICAgICAgICAgICBHZXRDb2xvcmYoa1BhcmFtcy5iZ19jb2xvciwgMTYpLAorICAgICAgICAgICAgICAgR2V0Q29sb3JmKGtQYXJhbXMuYmdfY29sb3IsIDI0KSk7CisgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgIERyYXdDaGVja2VyQm9hcmQoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IHZ3ZWJwIGluX2ZpbGUgW29wdGlvbnNdXG5cbiIKKyAgICAgICAgICJEZWNvZGVzIHRoZSBXZWJQIGltYWdlIGZpbGUgYW5kIHZpc3VhbGl6ZSBpdCB1c2luZyBPcGVuR0xcbiIKKyAgICAgICAgICJPcHRpb25zIGFyZTpcbiIKKyAgICAgICAgICIgIC12ZXJzaW9uIC4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCisgICAgICAgICAiICAtbm9pY2MgLi4uLi4uLiBkb24ndCB1c2UgdGhlIGljYyBwcm9maWxlIGlmIHByZXNlbnRcbiIKKyAgICAgICAgICIgIC1ub2ZhbmN5IC4uLi4uIGRvbid0IHVzZSB0aGUgZmFuY3kgWVVWNDIwIHVwc2NhbGVyXG4iCisgICAgICAgICAiICAtbm9maWx0ZXIgLi4uLiBkaXNhYmxlIGluLWxvb3AgZmlsdGVyaW5nXG4iCisgICAgICAgICAiICAtZGl0aGVyIDxpbnQ+ICBkaXRoZXJpbmcgc3RyZW5ndGggKDAuLjEwMCksIGRlZmF1bHQ9NTBcbiIKKyAgICAgICAgICIgIC1ub2FscGhhZGl0aGVyIGRpc2FibGUgYWxwaGEgcGxhbmUgZGl0aGVyaW5nXG4iCisgICAgICAgICAiICAtbXQgLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nXG4iCisgICAgICAgICAiICAtaW5mbyAuLi4uLi4uLiBwcmludCBpbmZvXG4iCisgICAgICAgICAiICAtaCAuLi4uLi4uLi4uLiB0aGlzIGhlbHAgbWVzc2FnZVxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIktleWJvYXJkIHNob3J0Y3V0czpcbiIKKyAgICAgICAgICIgICdjJyAuLi4uLi4uLi4uLi4uLi4uIHRvZ2dsZSB1c2Ugb2YgY29sb3IgcHJvZmlsZVxuIgorICAgICAgICAgIiAgJ2knIC4uLi4uLi4uLi4uLi4uLi4gb3ZlcmxheSBmaWxlIGluZm9ybWF0aW9uXG4iCisgICAgICAgICAiICAnZCcgLi4uLi4uLi4uLi4uLi4uLiBkaXNhYmxlIGJsZW5kaW5nICYgZGlzcG9zYWwgKGRlYnVnKVxuIgorICAgICAgICAgIiAgJ3EnIC8gJ1EnIC8gRVNDIC4uLi4gcXVpdFxuIgorICAgICAgICApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIGludCBjOworICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnID0gJmtQYXJhbXMuY29uZmlnOworICBXZWJQSXRlcmF0b3IqIGNvbnN0IGN1cnIgPSAma1BhcmFtcy5jdXJyX2ZyYW1lOworCisgIGlmICghV2ViUEluaXREZWNvZGVyQ29uZmlnKGNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25maWctPm9wdGlvbnMuZGl0aGVyaW5nX3N0cmVuZ3RoID0gNTA7CisgIGNvbmZpZy0+b3B0aW9ucy5hbHBoYV9kaXRoZXJpbmdfc3RyZW5ndGggPSAxMDA7CisgIGtQYXJhbXMudXNlX2NvbG9yX3Byb2ZpbGUgPSAxOworCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vaWNjIikpIHsKKyAgICAgIGtQYXJhbXMudXNlX2NvbG9yX3Byb2ZpbGUgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vZmFuY3kiKSkgeworICAgICAgY29uZmlnLT5vcHRpb25zLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vZmlsdGVyIikpIHsKKyAgICAgIGNvbmZpZy0+b3B0aW9ucy5ieXBhc3NfZmlsdGVyaW5nID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2FscGhhZGl0aGVyIikpIHsKKyAgICAgIGNvbmZpZy0+b3B0aW9ucy5hbHBoYV9kaXRoZXJpbmdfc3RyZW5ndGggPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWRpdGhlciIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgY29uZmlnLT5vcHRpb25zLmRpdGhlcmluZ19zdHJlbmd0aCA9CisgICAgICAgICAgRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1pbmZvIikpIHsKKyAgICAgIGtQYXJhbXMucHJpbnRfaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBjb25zdCBpbnQgZGVjX3ZlcnNpb24gPSBXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgICAgIGNvbnN0IGludCBkbXV4X3ZlcnNpb24gPSBXZWJQR2V0RGVtdXhWZXJzaW9uKCk7CisgICAgICBwcmludGYoIldlYlAgRGVjb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuV2ViUCBEZW11eCB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAoZGVjX3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGRlY192ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICBkZWNfdmVyc2lvbiAmIDB4ZmYsIChkbXV4X3ZlcnNpb24gPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAoZG11eF92ZXJzaW9uID4+IDgpICYgMHhmZiwgZG11eF92ZXJzaW9uICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tdCIpKSB7CisgICAgICBjb25maWctPm9wdGlvbnMudXNlX3RocmVhZHMgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLS0iKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkga1BhcmFtcy5maWxlX25hbWUgPSBhcmd2WysrY107CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7CisgICAgICBwcmludGYoIlVua25vd24gb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICBrUGFyYW1zLmZpbGVfbmFtZSA9IGFyZ3ZbY107CisgICAgfQorCisgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaWYgKGtQYXJhbXMuZmlsZV9uYW1lID09IE5VTEwpIHsKKyAgICBwcmludGYoIm1pc3NpbmcgaW5wdXQgZmlsZSEhXG4iKTsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGtQYXJhbXMuZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZrUGFyYW1zLmRhdGEuYnl0ZXMsICZrUGFyYW1zLmRhdGEuc2l6ZSkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFXZWJQR2V0SW5mbyhrUGFyYW1zLmRhdGEuYnl0ZXMsIGtQYXJhbXMuZGF0YS5zaXplLCBOVUxMLCBOVUxMKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiSW5wdXQgZmlsZSBkb2Vzbid0IGFwcGVhciB0byBiZSBXZWJQIGZvcm1hdC5cbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBrUGFyYW1zLmRtdXggPSBXZWJQRGVtdXgoJmtQYXJhbXMuZGF0YSk7CisgIGlmIChrUGFyYW1zLmRtdXggPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBkZW11eGluZyBvYmplY3QhXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAga1BhcmFtcy5jYW52YXNfd2lkdGggPSBXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOworICBrUGFyYW1zLmNhbnZhc19oZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKKyAgaWYgKGtQYXJhbXMucHJpbnRfaW5mbykgeworICAgIHByaW50ZigiQ2FudmFzOiAlZCB4ICVkXG4iLCBrUGFyYW1zLmNhbnZhc193aWR0aCwga1BhcmFtcy5jYW52YXNfaGVpZ2h0KTsKKyAgfQorCisgIENsZWFyUHJldmlvdXNGcmFtZSgpOworCisgIG1lbXNldCgma1BhcmFtcy5pY2NwLCAwLCBzaXplb2Yoa1BhcmFtcy5pY2NwKSk7CisgIGtQYXJhbXMuaGFzX2NvbG9yX3Byb2ZpbGUgPQorICAgICAgISEoV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfRk9STUFUX0ZMQUdTKSAmIElDQ1BfRkxBRyk7CisgIGlmIChrUGFyYW1zLmhhc19jb2xvcl9wcm9maWxlKSB7CisjaWZkZWYgV0VCUF9IQVZFX1FDTVMKKyAgICBpZiAoIVdlYlBEZW11eEdldENodW5rKGtQYXJhbXMuZG11eCwgIklDQ1AiLCAxLCAma1BhcmFtcy5pY2NwKSkgZ290byBFcnJvcjsKKyAgICBwcmludGYoIlZQOFg6IEZvdW5kIGNvbG9yIHByb2ZpbGVcbiIpOworI2Vsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNvbG9yIHByb2ZpbGUgcHJlc2VudCwgYnV0IHFjbXMgaXMgdW5hdmFpbGFibGUhXG4iCisgICAgICAgICAgICAiQnVpbGQgbGlicWNtcyBmcm9tIE1vemlsbGEgb3IgQ2hyb21pdW0gYW5kIGRlZmluZSBXRUJQX0hBVkVfUUNNUyAiCisgICAgICAgICAgICAiYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisjZW5kaWYKKyAgfQorCisgIGlmICghV2ViUERlbXV4R2V0RnJhbWUoa1BhcmFtcy5kbXV4LCAxLCBjdXJyKSkgZ290byBFcnJvcjsKKworICBrUGFyYW1zLmhhc19hbmltYXRpb24gPSAoY3Vyci0+bnVtX2ZyYW1lcyA+IDEpOworICBrUGFyYW1zLmxvb3BfY291bnQgPSAoaW50KVdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0xPT1BfQ09VTlQpOworICBrUGFyYW1zLmJnX2NvbG9yID0gV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfQkFDS0dST1VORF9DT0xPUik7CisgIHByaW50ZigiVlA4WDogRm91bmQgJWQgaW1hZ2VzIGluIGZpbGUgKGxvb3AgY291bnQgPSAlZClcbiIsCisgICAgICAgICBjdXJyLT5udW1fZnJhbWVzLCBrUGFyYW1zLmxvb3BfY291bnQpOworCisgIC8vIERlY29kZSBmaXJzdCBmcmFtZQorICBpZiAoIURlY29kZSgpKSBnb3RvIEVycm9yOworCisgIC8vIFBvc2l0aW9uIGl0ZXJhdG9yIHRvIGxhc3QgZnJhbWUuIE5leHQgY2FsbCB0byBIYW5kbGVEaXNwbGF5IHdpbGwgd3JhcCBvdmVyLgorICAvLyBXZSB0YWtlIHRoaXMgaW50byBhY2NvdW50IGJ5IGJ1bXBpbmcgdXAgbG9vcF9jb3VudC4KKyAgV2ViUERlbXV4R2V0RnJhbWUoa1BhcmFtcy5kbXV4LCAwLCBjdXJyKTsKKyAgaWYgKGtQYXJhbXMubG9vcF9jb3VudCkgKytrUGFyYW1zLmxvb3BfY291bnQ7CisKKyNpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIC8vIFdvcmsgYXJvdW5kIEdMVVQgY29tcG9zaXRvciBidWcuCisgIC8vIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2ZyZWVnbHV0LytidWcvMzY5ODkxCisgIHNldGVudigiWExJQl9TS0lQX0FSR0JfVklTVUFMUyIsICIxIiwgMSk7CisjZW5kaWYKKworICAvLyBTdGFydCBkaXNwbGF5IChhbmQgdGltZXIpCisgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKyNpZmRlZiBGUkVFR0xVVAorICBnbHV0U2V0T3B0aW9uKEdMVVRfQUNUSU9OX09OX1dJTkRPV19DTE9TRSwgR0xVVF9BQ1RJT05fQ09OVElOVUVfRVhFQ1VUSU9OKTsKKyNlbmRpZgorICBTdGFydERpc3BsYXkoKTsKKworICBpZiAoa1BhcmFtcy5oYXNfYW5pbWF0aW9uKSBnbHV0VGltZXJGdW5jKDAsIGRlY29kZV9jYWxsYmFjaywgMCk7CisgIGdsdXRNYWluTG9vcCgpOworCisgIC8vIFNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB1c2luZyBGUkVFR0xVVDoKKyAgQ2xlYXJQYXJhbXMoKTsKKyAgcmV0dXJuIDA7CisKKyBFcnJvcjoKKyAgQ2xlYXJQYXJhbXMoKTsKKyAgcmV0dXJuIC0xOworfQorCisjZWxzZSAgIC8vICFXRUJQX0hBVkVfR0wKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBmcHJpbnRmKHN0ZGVyciwgIk9wZW5HTCBzdXBwb3J0IG5vdCBlbmFibGVkIGluICVzLlxuIiwgYXJndlswXSk7CisgICh2b2lkKWFyZ2M7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBpbmZvLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2QyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwaW5mby5jCkBAIC0wLDAgKzEsMTE3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBDb21tYW5kLWxpbmUgdG9vbCB0byBwcmludCBvdXQgdGhlIGNodW5rIGxldmVsIHN0cnVjdHVyZSBvZiBXZWJQIGZpbGVzCisvLyAgYWxvbmcgd2l0aCBiYXNpYyBpbnRlZ3JpdHkgY2hlY2tzLgorLy8KKy8vICBBdXRob3I6IEh1aSBTdSAoaHVpc3VAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgIndlYnAvbXV4X3R5cGVzLmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBMT0dfRVJST1IoTUVTU0FHRSkgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAod2VicF9pbmZvLT5zaG93X2RpYWdub3Npc18pIHsgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogJXNcbiIsIE1FU1NBR0UpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfV0FSTihNRVNTQUdFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHdlYnBfaW5mby0+c2hvd19kaWFnbm9zaXNfKSB7ICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiAlc1xuIiwgTUVTU0FHRSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRm9ybWF0c1szXSA9IHsKKyAgIlVua25vd24iLAorICAiTG9zc3kiLAorICAiTG9zc2xlc3MiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0xvc3NsZXNzVHJhbnNmb3Jtc1s0XSA9IHsKKyAgIlByZWRpY3RvciIsCisgICJDcm9zcyBDb2xvciIsCisgICJTdWJ0cmFjdCBHcmVlbiIsCisgICJDb2xvciBJbmRleGluZyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQWxwaGFGaWx0ZXJNZXRob2RzWzRdID0geworICAiTm9uZSIsCisgICJIb3Jpem9udGFsIiwKKyAgIlZlcnRpY2FsIiwKKyAgIkdyYWRpZW50IgorfTsKKwordHlwZWRlZiBlbnVtIHsKKyAgV0VCUF9JTkZPX09LID0gMCwKKyAgV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBLAorICBXRUJQX0lORk9fUEFSU0VfRVJST1IsCisgIFdFQlBfSU5GT19JTlZBTElEX1BBUkFNLAorICBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SLAorICBXRUJQX0lORk9fTUlTU0lOR19EQVRBLAorICBXRUJQX0lORk9fSU5WQUxJRF9DT01NQU5ECit9IFdlYlBJbmZvU3RhdHVzOworCit0eXBlZGVmIGVudW0gQ2h1bmtJRCB7CisgIENIVU5LX1ZQOCwKKyAgQ0hVTktfVlA4TCwKKyAgQ0hVTktfVlA4WCwKKyAgQ0hVTktfQUxQSEEsCisgIENIVU5LX0FOSU0sCisgIENIVU5LX0FOTUYsCisgIENIVU5LX0lDQ1AsCisgIENIVU5LX0VYSUYsCisgIENIVU5LX1hNUCwKKyAgQ0hVTktfVU5LTk9XTiwKKyAgQ0hVTktfVFlQRVMgPSBDSFVOS19VTktOT1dOCit9IENodW5rSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IHN0YXJ0XzsKKyAgc2l6ZV90IGVuZF87CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87Cit9IE1lbUJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3Qgb2Zmc2V0XzsKKyAgc2l6ZV90IHNpemVfOworICBjb25zdCB1aW50OF90KiBwYXlsb2FkXzsKKyAgQ2h1bmtJRCBpZF87Cit9IENodW5rRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgV2ViUEluZm8geworICBpbnQgY2FudmFzX3dpZHRoXzsKKyAgaW50IGNhbnZhc19oZWlnaHRfOworICBpbnQgbG9vcF9jb3VudF87CisgIGludCBudW1fZnJhbWVzXzsKKyAgaW50IGNodW5rX2NvdW50c19bQ0hVTktfVFlQRVNdOworICBpbnQgYW5tZl9zdWJjaHVua19jb3VudHNfWzNdOyAgLy8gMCBWUDg7IDEgVlA4TDsgMiBBTFBILgorICB1aW50MzJfdCBiZ2NvbG9yXzsKKyAgaW50IGZlYXR1cmVfZmxhZ3NfOworICBpbnQgaGFzX2FscGhhXzsKKyAgLy8gVXNlZCBmb3IgcGFyc2luZyBBTk1GIGNodW5rcy4KKyAgaW50IGZyYW1lX3dpZHRoXywgZnJhbWVfaGVpZ2h0XzsKKyAgc2l6ZV90IGFuaW1fZnJhbWVfZGF0YV9zaXplXzsKKyAgaW50IGlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8sIHNlZW5fYWxwaGFfc3ViY2h1bmtfLCBzZWVuX2ltYWdlX3N1YmNodW5rXzsKKyAgLy8gUHJpbnQgb3V0cHV0IGNvbnRyb2wuCisgIGludCBxdWlldF8sIHNob3dfZGlhZ25vc2lzXywgc2hvd19zdW1tYXJ5XzsKKyAgaW50IHBhcnNlX2JpdHN0cmVhbV87Cit9IFdlYlBJbmZvOworCitzdGF0aWMgdm9pZCBXZWJQSW5mb0luaXQoV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBtZW1zZXQod2VicF9pbmZvLCAwLCBzaXplb2YoKndlYnBfaW5mbykpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBrV2ViUENodW5rVGFnc1tDSFVOS19UWVBFU11bNF0gPSB7CisgIHsgJ1YnLCAnUCcsICc4JywgJyAnIH0sCisgIHsgJ1YnLCAnUCcsICc4JywgJ0wnIH0sCisgIHsgJ1YnLCAnUCcsICc4JywgJ1gnIH0sCisgIHsgJ0EnLCAnTCcsICdQJywgJ0gnIH0sCisgIHsgJ0EnLCAnTicsICdJJywgJ00nIH0sCisgIHsgJ0EnLCAnTicsICdNJywgJ0YnIH0sCisgIHsgJ0knLCAnQycsICdDJywgJ1AnIH0sCisgIHsgJ0UnLCAnWCcsICdJJywgJ0YnIH0sCisgIHsgJ1gnLCAnTScsICdQJywgJyAnIH0sCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YSByZWFkaW5nLgorCitzdGF0aWMgaW50IEdldExFMTYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gKGRhdGFbMF0gPDwgMCkgfCAoZGF0YVsxXSA8PCA4KTsKK30KKworc3RhdGljIGludCBHZXRMRTI0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIEdldExFMTYoZGF0YSkgfCAoZGF0YVsyXSA8PCAxNik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBHZXRMRTMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIEdldExFMTYoZGF0YSkgfCAoKHVpbnQzMl90KUdldExFMTYoZGF0YSArIDIpIDw8IDE2KTsKK30KKworc3RhdGljIGludCBSZWFkTEUxNihjb25zdCB1aW50OF90KiogZGF0YSkgeworICBjb25zdCBpbnQgdmFsID0gR2V0TEUxNigqZGF0YSk7CisgICpkYXRhICs9IDI7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgUmVhZExFMjQoY29uc3QgdWludDhfdCoqIGRhdGEpIHsKKyAgY29uc3QgaW50IHZhbCA9IEdldExFMjQoKmRhdGEpOworICAqZGF0YSArPSAzOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdWludDMyX3QgUmVhZExFMzIoY29uc3QgdWludDhfdCoqIGRhdGEpIHsKKyAgY29uc3QgdWludDMyX3QgdmFsID0gR2V0TEUzMigqZGF0YSk7CisgICpkYXRhICs9IDQ7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgUmVhZEZpbGVUb1dlYlBEYXRhKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSkgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3Qgc2l6ZTsKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZzaXplKSkgcmV0dXJuIDA7CisgIHdlYnBfZGF0YS0+Ynl0ZXMgPSBkYXRhOworICB3ZWJwX2RhdGEtPnNpemUgPSBzaXplOworICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbUJ1ZmZlciBvYmplY3QuCisKK3N0YXRpYyB2b2lkIEluaXRNZW1CdWZmZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0sIGNvbnN0IFdlYlBEYXRhKiB3ZWJwX2RhdGEpIHsKKyAgbWVtLT5idWZfID0gd2VicF9kYXRhLT5ieXRlczsKKyAgbWVtLT5zdGFydF8gPSAwOworICBtZW0tPmVuZF8gPSB3ZWJwX2RhdGEtPnNpemU7Cit9CisKK3N0YXRpYyBzaXplX3QgTWVtRGF0YVNpemUoY29uc3QgTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgcmV0dXJuIChtZW0tPmVuZF8gLSBtZW0tPnN0YXJ0Xyk7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBHZXRCdWZmZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgcmV0dXJuIG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworfQorCitzdGF0aWMgdm9pZCBTa2lwKE1lbUJ1ZmZlciogY29uc3QgbWVtLCBzaXplX3Qgc2l6ZSkgeworICBtZW0tPnN0YXJ0XyArPSBzaXplOworfQorCitzdGF0aWMgdWludDMyX3QgUmVhZE1lbUJ1ZkxFMzIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCB1aW50MzJfdCB2YWwgPSBHZXRMRTMyKGRhdGEpOworICBhc3NlcnQoTWVtRGF0YVNpemUobWVtKSA+PSA0KTsKKyAgU2tpcChtZW0sIDQpOworICByZXR1cm4gdmFsOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9zc3kgYml0c3RyZWFtIGFuYWx5c2lzLgorCitzdGF0aWMgaW50IEdldEJpdHMoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IG5iLAorICAgICAgICAgICAgICAgICAgIGludCogdmFsLCB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICAqdmFsID0gMDsKKyAgd2hpbGUgKG5iLS0gPiAwKSB7CisgICAgY29uc3QgdWludDY0X3QgcCA9ICgqYml0X3BvcykrKzsKKyAgICBpZiAoKHAgPj4gMykgPj0gZGF0YV9zaXplKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IGJpdCA9ICEhKGRhdGFbcCA+PiAzXSAmICgxMjggPj4gKChwICYgNykpKSk7CisgICAgICAqdmFsID0gKCp2YWwgPDwgMSkgfCBiaXQ7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEdldFNpZ25lZEJpdHMoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IG5iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogdmFsLCB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICBpbnQgc2lnbjsKKyAgaWYgKCFHZXRCaXRzKGRhdGEsIGRhdGFfc2l6ZSwgbmIsIHZhbCwgYml0X3BvcykpIHJldHVybiAwOworICBpZiAoIUdldEJpdHMoZGF0YSwgZGF0YV9zaXplLCAxLCAmc2lnbiwgYml0X3BvcykpIHJldHVybiAwOworICBpZiAoc2lnbikgKnZhbCA9IC0oKnZhbCk7CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIEdFVF9CSVRTKHYsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUdldEJpdHMoZGF0YSwgZGF0YV9zaXplLCBuLCAmKHYpLCBiaXRfcG9zKSkgeyBcCisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzeSBiaXRzdHJlYW0uIik7ICAgICAgICAgXAorICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX1NJR05FRF9CSVRTKHYsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghR2V0U2lnbmVkQml0cyhkYXRhLCBkYXRhX3NpemUsIG4sICYodiksIGJpdF9wb3MpKSB7IFwKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3N5IGJpdHN0cmVhbS4iKTsgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlTG9zc3lTZWdtZW50SGVhZGVyKGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgIGludCB1c2Vfc2VnbWVudDsKKyAgR0VUX0JJVFModXNlX3NlZ21lbnQsIDEpOworICBwcmludGYoIiAgVXNlIHNlZ21lbnQ6ICAgICAgJWRcbiIsIHVzZV9zZWdtZW50KTsKKyAgaWYgKHVzZV9zZWdtZW50KSB7CisgICAgaW50IHVwZGF0ZV9tYXAsIHVwZGF0ZV9kYXRhOworICAgIEdFVF9CSVRTKHVwZGF0ZV9tYXAsIDEpOworICAgIEdFVF9CSVRTKHVwZGF0ZV9kYXRhLCAxKTsKKyAgICBwcmludGYoIiAgVXBkYXRlIG1hcDogICAgICAgJWRcbiIKKyAgICAgICAgICAgIiAgVXBkYXRlIGRhdGE6ICAgICAgJWRcbiIsCisgICAgICAgICAgIHVwZGF0ZV9tYXAsIHVwZGF0ZV9kYXRhKTsKKyAgICBpZiAodXBkYXRlX2RhdGEpIHsKKyAgICAgIGludCBpLCBhX2RlbHRhOworICAgICAgaW50IHF1YW50aXplcls0XSA9IHswLCAwLCAwLCAwfTsKKyAgICAgIGludCBmaWx0ZXJfc3RyZW5ndGhbNF0gPSB7MCwgMCwgMCwgMH07CisgICAgICBHRVRfQklUUyhhX2RlbHRhLCAxKTsKKyAgICAgIHByaW50ZigiICBBYnNvbHV0ZSBkZWx0YTogICAlZFxuIiwgYV9kZWx0YSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGludCBiaXQ7CisgICAgICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhxdWFudGl6ZXJbaV0sIDcpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBpbnQgYml0OworICAgICAgICBHRVRfQklUUyhiaXQsIDEpOworICAgICAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZmlsdGVyX3N0cmVuZ3RoW2ldLCA2KTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiICBRdWFudGl6ZXI6ICAgICAgICAlZCAlZCAlZCAlZFxuIiwgcXVhbnRpemVyWzBdLCBxdWFudGl6ZXJbMV0sCisgICAgICAgICAgICAgcXVhbnRpemVyWzJdLCBxdWFudGl6ZXJbM10pOworICAgICAgcHJpbnRmKCIgIEZpbHRlciBzdHJlbmd0aDogICVkICVkICVkICVkXG4iLCBmaWx0ZXJfc3RyZW5ndGhbMF0sCisgICAgICAgICAgICAgZmlsdGVyX3N0cmVuZ3RoWzFdLCBmaWx0ZXJfc3RyZW5ndGhbMl0sIGZpbHRlcl9zdHJlbmd0aFszXSk7CisgICAgfQorICAgIGlmICh1cGRhdGVfbWFwKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBwcm9iX3NlZ21lbnRbM10gPSB7MjU1LCAyNTUsIDI1NX07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGludCBiaXQ7CisgICAgICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgICAgIGlmIChiaXQpIEdFVF9CSVRTKHByb2Jfc2VnbWVudFtpXSwgOCk7CisgICAgICB9CisgICAgICBwcmludGYoIiAgUHJvYiBzZWdtZW50OiAgICAgJWQgJWQgJWRcbiIsCisgICAgICAgICAgICAgcHJvYl9zZWdtZW50WzBdLCBwcm9iX3NlZ21lbnRbMV0sIHByb2Jfc2VnbWVudFsyXSk7CisgICAgfQorICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUxvc3N5RmlsdGVySGVhZGVyKGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgIGludCBzaW1wbGVfZmlsdGVyLCBsZXZlbCwgc2hhcnBuZXNzLCB1c2VfbGZfZGVsdGE7CisgIEdFVF9CSVRTKHNpbXBsZV9maWx0ZXIsIDEpOworICBHRVRfQklUUyhsZXZlbCwgNik7CisgIEdFVF9CSVRTKHNoYXJwbmVzcywgMyk7CisgIEdFVF9CSVRTKHVzZV9sZl9kZWx0YSwgMSk7CisgIHByaW50ZigiICBTaW1wbGUgZmlsdGVyOiAgICAlZFxuIiwgc2ltcGxlX2ZpbHRlcik7CisgIHByaW50ZigiICBMZXZlbDogICAgICAgICAgICAlZFxuIiwgbGV2ZWwpOworICBwcmludGYoIiAgU2hhcnBuZXNzOiAgICAgICAgJWRcbiIsIHNoYXJwbmVzcyk7CisgIHByaW50ZigiICBVc2UgbGYgZGVsdGE6ICAgICAlZFxuIiwgdXNlX2xmX2RlbHRhKTsKKyAgaWYgKHVzZV9sZl9kZWx0YSkgeworICAgIGludCB1cGRhdGU7CisgICAgR0VUX0JJVFModXBkYXRlLCAxKTsKKyAgICBwcmludGYoIiAgVXBkYXRlIGxmIGRlbHRhOiAgJWRcbiIsIHVwZGF0ZSk7CisgICAgaWYgKHVwZGF0ZSkgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNCArIDQ7ICsraSkgeworICAgICAgICBpbnQgdGVtcDsKKyAgICAgICAgR0VUX0JJVFModGVtcCwgMSk7CisgICAgICAgIGlmICh0ZW1wKSBHRVRfQklUUyh0ZW1wLCA3KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlTG9zc3lIZWFkZXIoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIHNpemVfdCBkYXRhX3NpemUgPSBjaHVua19kYXRhLT5zaXplXyAtIENIVU5LX0hFQURFUl9TSVpFOworICBjb25zdCB1aW50MzJfdCBiaXRzID0gKHVpbnQzMl90KWRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKKyAgY29uc3QgaW50IGtleV9mcmFtZSA9ICEoYml0cyAmIDEpOworICBjb25zdCBpbnQgcHJvZmlsZSA9IChiaXRzID4+IDEpICYgNzsKKyAgY29uc3QgaW50IGRpc3BsYXkgPSAoYml0cyA+PiA0KSAmIDE7CisgIGNvbnN0IHVpbnQzMl90IHBhcnRpdGlvbjBfbGVuZ3RoID0gKGJpdHMgPj4gNSk7CisgIFdlYlBJbmZvU3RhdHVzIHN0YXR1cyA9IFdFQlBfSU5GT19PSzsKKyAgdWludDY0X3QgYml0X3Bvc2l0aW9uID0gMDsKKyAgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MgPSAmYml0X3Bvc2l0aW9uOworICBpbnQgY29sb3JzcGFjZSwgY2xhbXBfdHlwZTsKKyAgcHJpbnRmKCIgIFBhcnNpbmcgbG9zc3kgYml0c3RyZWFtLi4uXG4iKTsKKyAgLy8gQ2FsbGluZyBXZWJQR2V0RmVhdHVyZXMoKSBpbiBQcm9jZXNzSW1hZ2VDaHVuaygpIHNob3VsZCBlbnN1cmUgdGhpcy4KKyAgYXNzZXJ0KGNodW5rX2RhdGEtPnNpemVfID49IENIVU5LX0hFQURFUl9TSVpFICsgMTApOworICBpZiAocHJvZmlsZSA+IDMpIHsKKyAgICBMT0dfRVJST1IoIlVua25vd24gcHJvZmlsZS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBpZiAoIWRpc3BsYXkpIHsKKyAgICBMT0dfRVJST1IoIkZyYW1lIGlzIG5vdCBkaXNwbGF5YWJsZS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBkYXRhICs9IDM7CisgIGRhdGFfc2l6ZSAtPSAzOworICBwcmludGYoIiAgS2V5IGZyYW1lOiAgICAgICAgJXNcbiIKKyAgICAgICAgICIgIFByb2ZpbGU6ICAgICAgICAgICVkXG4iCisgICAgICAgICAiICBEaXNwbGF5OiAgICAgICAgICAlc1xuIgorICAgICAgICAgIiAgUGFydC4gMCBsZW5ndGg6ICAgJWRcbiIsCisgICAgICAgICBrZXlfZnJhbWUgPyAiWWVzIiA6ICJObyIsIHByb2ZpbGUsCisgICAgICAgICBkaXNwbGF5ID8gIlllcyIgOiAiTm8iLCBwYXJ0aXRpb24wX2xlbmd0aCk7CisgIGlmIChrZXlfZnJhbWUpIHsKKyAgICBpZiAoIShkYXRhWzBdID09IDB4OWQgJiYgZGF0YVsxXSA9PSAweDAxICYmIGRhdGFbMl0gPT0gMHgyYSkpIHsKKyAgICAgIExPR19FUlJPUigiSW52YWxpZCBsb3NzeSBiaXRzdHJlYW0gc2lnbmF0dXJlLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgICAgfQorICAgIHByaW50ZigiICBXaWR0aDogICAgICAgICAgICAlZFxuIgorICAgICAgICAgICAiICBYIHNjYWxlOiAgICAgICAgICAlZFxuIgorICAgICAgICAgICAiICBIZWlnaHQ6ICAgICAgICAgICAlZFxuIgorICAgICAgICAgICAiICBZIHNjYWxlOiAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgKChkYXRhWzRdIDw8IDgpIHwgZGF0YVszXSkgJiAweDNmZmYsIGRhdGFbNF0gPj4gNiwKKyAgICAgICAgICAgKChkYXRhWzZdIDw8IDgpIHwgZGF0YVs1XSkgJiAweDNmZmYsIGRhdGFbNl0gPj4gNik7CisgICAgZGF0YSArPSA3OworICAgIGRhdGFfc2l6ZSAtPSA3OworICB9IGVsc2UgeworICAgIExPR19FUlJPUigiTm9uLWtleWZyYW1lIGRldGVjdGVkIGluIGxvc3N5IGJpdHN0cmVhbS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBpZiAocGFydGl0aW9uMF9sZW5ndGggPj0gZGF0YV9zaXplKSB7CisgICAgTE9HX0VSUk9SKCJCYWQgcGFydGl0aW9uIGxlbmd0aC4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBHRVRfQklUUyhjb2xvcnNwYWNlLCAxKTsKKyAgR0VUX0JJVFMoY2xhbXBfdHlwZSwgMSk7CisgIHByaW50ZigiICBDb2xvciBzcGFjZTogICAgICAlZFxuIiwgY29sb3JzcGFjZSk7CisgIHByaW50ZigiICBDbGFtcCB0eXBlOiAgICAgICAlZFxuIiwgY2xhbXBfdHlwZSk7CisgIHN0YXR1cyA9IFBhcnNlTG9zc3lTZWdtZW50SGVhZGVyKHdlYnBfaW5mbywgZGF0YSwgZGF0YV9zaXplLCBiaXRfcG9zKTsKKyAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgIHN0YXR1cyA9IFBhcnNlTG9zc3lGaWx0ZXJIZWFkZXIod2VicF9pbmZvLCBkYXRhLCBkYXRhX3NpemUsIGJpdF9wb3MpOworICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgeyAgLy8gUGFydGl0aW9uIG51bWJlciBhbmQgc2l6ZS4KKyAgICBjb25zdCB1aW50OF90KiBwYXJ0X3NpemUgPSBkYXRhICsgcGFydGl0aW9uMF9sZW5ndGg7CisgICAgaW50IG51bV9wYXJ0cywgaTsKKyAgICBzaXplX3QgcGFydF9kYXRhX3NpemU7CisgICAgR0VUX0JJVFMobnVtX3BhcnRzLCAyKTsKKyAgICBudW1fcGFydHMgPSAxIDw8IG51bV9wYXJ0czsKKyAgICBpZiAoKGludCkoZGF0YV9zaXplIC0gcGFydGl0aW9uMF9sZW5ndGgpIDwgKG51bV9wYXJ0cyAtIDEpICogMykgeworICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc3kgYml0c3RyZWFtLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgICB9CisgICAgcGFydF9kYXRhX3NpemUgPSBkYXRhX3NpemUgLSBwYXJ0aXRpb24wX2xlbmd0aCAtIChudW1fcGFydHMgLSAxKSAqIDM7CisgICAgcHJpbnRmKCIgIFRvdGFsIHBhcnRpdGlvbnM6ICVkXG4iLCBudW1fcGFydHMpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1fcGFydHM7ICsraSkgeworICAgICAgY29uc3Qgc2l6ZV90IHBzaXplID0KKyAgICAgICAgICBwYXJ0X3NpemVbMF0gfCAocGFydF9zaXplWzFdIDw8IDgpIHwgKHBhcnRfc2l6ZVsyXSA8PCAxNik7CisgICAgICBpZiAocHNpemUgPiBwYXJ0X2RhdGFfc2l6ZSkgeworICAgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBwYXJ0aXRpb24uIik7CisgICAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgICAgICB9CisgICAgICBwcmludGYoIiAgUGFydC4gJWQgbGVuZ3RoOiAgICVkXG4iLCBpLCAoaW50KXBzaXplKTsKKyAgICAgIHBhcnRfZGF0YV9zaXplIC09IHBzaXplOworICAgICAgcGFydF9zaXplICs9IDM7CisgICAgfQorICB9CisgIC8vIFF1YW50aXplci4KKyAgeworICAgIGludCBiYXNlX3EsIGJpdDsKKyAgICBpbnQgZHFfeTFfZGMgPSAwLCBkcV95Ml9kYyA9IDAsIGRxX3kyX2FjID0gMCwgZHFfdXZfZGMgPSAwLCBkcV91dl9hYyA9IDA7CisgICAgR0VUX0JJVFMoYmFzZV9xLCA3KTsKKyAgICBHRVRfQklUUyhiaXQsIDEpOworICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhkcV95MV9kYywgNCk7CisgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZHFfeTJfZGMsIDQpOworICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGRxX3kyX2FjLCA0KTsKKyAgICBHRVRfQklUUyhiaXQsIDEpOworICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhkcV91dl9kYywgNCk7CisgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZHFfdXZfYWMsIDQpOworICAgIHByaW50ZigiICBCYXNlIFE6ICAgICAgICAgICAlZFxuIiwgYmFzZV9xKTsKKyAgICBwcmludGYoIiAgRFEgWTEgREM6ICAgICAgICAgJWRcbiIsIGRxX3kxX2RjKTsKKyAgICBwcmludGYoIiAgRFEgWTIgREM6ICAgICAgICAgJWRcbiIsIGRxX3kyX2RjKTsKKyAgICBwcmludGYoIiAgRFEgWTIgQUM6ICAgICAgICAgJWRcbiIsIGRxX3kyX2FjKTsKKyAgICBwcmludGYoIiAgRFEgVVYgREM6ICAgICAgICAgJWRcbiIsIGRxX3V2X2RjKTsKKyAgICBwcmludGYoIiAgRFEgVVYgQUM6ICAgICAgICAgJWRcbiIsIGRxX3V2X2FjKTsKKyAgfQorICBpZiAoKCpiaXRfcG9zID4+IDMpID49IHBhcnRpdGlvbjBfbGVuZ3RoKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc3kgYml0c3RyZWFtLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvc3NsZXNzIGJpdHN0cmVhbSBhbmFseXNpcy4KKworc3RhdGljIGludCBMTEdldEJpdHMoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IG5iLAorICAgICAgICAgICAgICAgICAgICAgaW50KiB2YWwsIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgIHVpbnQzMl90IGkgPSAwOworICAqdmFsID0gMDsKKyAgd2hpbGUgKGkgPCBuYikgeworICAgIGNvbnN0IHVpbnQ2NF90IHAgPSAoKmJpdF9wb3MpKys7CisgICAgaWYgKChwID4+IDMpID49IGRhdGFfc2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBiaXQgPSAhIShkYXRhW3AgPj4gM10gJiAoMSA8PCAoKHAgJiA3KSkpKTsKKyAgICAgICp2YWwgPSAqdmFsIHwgKGJpdCA8PCBpKTsKKyAgICAgICsraTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgTExfR0VUX0JJVFModiwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUxMR2V0Qml0cyhkYXRhLCBkYXRhX3NpemUsIG4sICYodiksIGJpdF9wb3MpKSB7IFwKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3NsZXNzIGJpdHN0cmVhbS4iKTsgICAgICAgIFwKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlTG9zc2xlc3NUcmFuc2Zvcm0oV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNvbnN0ICBiaXRfcG9zKSB7CisgIGludCB1c2VfdHJhbnNmb3JtLCBibG9ja19zaXplLCBuX2NvbG9yczsKKyAgTExfR0VUX0JJVFModXNlX3RyYW5zZm9ybSwgMSk7CisgIHByaW50ZigiICBVc2UgdHJhbnNmb3JtOiAgICAlc1xuIiwgdXNlX3RyYW5zZm9ybSA/ICJZZXMiIDogIk5vIik7CisgIGlmICh1c2VfdHJhbnNmb3JtKSB7CisgICAgaW50IHR5cGU7CisgICAgTExfR0VUX0JJVFModHlwZSwgMik7CisgICAgcHJpbnRmKCIgIDFzdCB0cmFuc2Zvcm06ICAgICVzICglZClcbiIsIGtMb3NzbGVzc1RyYW5zZm9ybXNbdHlwZV0sIHR5cGUpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBQUkVESUNUT1JfVFJBTlNGT1JNOgorICAgICAgY2FzZSBDUk9TU19DT0xPUl9UUkFOU0ZPUk06CisgICAgICAgIExMX0dFVF9CSVRTKGJsb2NrX3NpemUsIDMpOworICAgICAgICBibG9ja19zaXplID0gMSA8PCAoYmxvY2tfc2l6ZSArIDIpOworICAgICAgICBwcmludGYoIiAgVHJhbi4gYmxvY2sgc2l6ZTogJWRcbiIsIGJsb2NrX3NpemUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNOgorICAgICAgICBMTF9HRVRfQklUUyhuX2NvbG9ycywgOCk7CisgICAgICAgIG5fY29sb3JzICs9IDE7CisgICAgICAgIHByaW50ZigiICBOby4gb2YgY29sb3JzOiAgICAlZFxuIiwgbl9jb2xvcnMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VMb3NzbGVzc0hlYWRlcihjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGNodW5rX2RhdGEtPnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIHVpbnQ2NF90IGJpdF9wb3NpdGlvbiA9IDA7CisgIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zID0gJmJpdF9wb3NpdGlvbjsKKyAgV2ViUEluZm9TdGF0dXMgc3RhdHVzOworICBwcmludGYoIiAgUGFyc2luZyBsb3NzbGVzcyBiaXRzdHJlYW0uLi5cbiIpOworICBpZiAoZGF0YV9zaXplIDwgVlA4TF9GUkFNRV9IRUFERVJfU0laRSkgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3NsZXNzIGJpdHN0cmVhbS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIGlmIChkYXRhWzBdICE9IFZQOExfTUFHSUNfQllURSkgeworICAgIExPR19FUlJPUigiSW52YWxpZCBsb3NzbGVzcyBiaXRzdHJlYW0gc2lnbmF0dXJlLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIGRhdGEgKz0gMTsKKyAgZGF0YV9zaXplIC09IDE7CisgIHsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhLCB2ZXJzaW9uOworICAgIExMX0dFVF9CSVRTKHdpZHRoLCAxNCk7CisgICAgTExfR0VUX0JJVFMoaGVpZ2h0LCAxNCk7CisgICAgTExfR0VUX0JJVFMoaGFzX2FscGhhLCAxKTsKKyAgICBMTF9HRVRfQklUUyh2ZXJzaW9uLCAzKTsKKyAgICB3aWR0aCArPSAxOworICAgIGhlaWdodCArPSAxOworICAgIHByaW50ZigiICBXaWR0aDogICAgICAgICAgICAlZFxuIiwgd2lkdGgpOworICAgIHByaW50ZigiICBIZWlnaHQ6ICAgICAgICAgICAlZFxuIiwgaGVpZ2h0KTsKKyAgICBwcmludGYoIiAgQWxwaGE6ICAgICAgICAgICAgJWRcbiIsIGhhc19hbHBoYSk7CisgICAgcHJpbnRmKCIgIFZlcnNpb246ICAgICAgICAgICVkXG4iLCB2ZXJzaW9uKTsKKyAgfQorICBzdGF0dXMgPSBQYXJzZUxvc3NsZXNzVHJhbnNmb3JtKHdlYnBfaW5mbywgZGF0YSwgZGF0YV9zaXplLCBiaXRfcG9zKTsKKyAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUFscGhhSGVhZGVyKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBzaXplX3QgZGF0YV9zaXplID0gY2h1bmtfZGF0YS0+c2l6ZV8gLSBDSFVOS19IRUFERVJfU0laRTsKKyAgaWYgKGRhdGFfc2l6ZSA8PSBBTFBIQV9IRUFERVJfTEVOKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgQUxQSCBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIHByaW50ZigiICBQYXJzaW5nIEFMUEggY2h1bmsuLi5cbiIpOworICB7CisgICAgY29uc3QgaW50IGNvbXByZXNzaW9uX21ldGhvZCA9IChkYXRhWzBdID4+IDApICYgMHgwMzsKKyAgICBjb25zdCBpbnQgZmlsdGVyID0gKGRhdGFbMF0gPj4gMikgJiAweDAzOworICAgIGNvbnN0IGludCBwcmVfcHJvY2Vzc2luZyA9IChkYXRhWzBdID4+IDQpICYgMHgwMzsKKyAgICBjb25zdCBpbnQgcmVzZXJ2ZWRfYml0cyA9IChkYXRhWzBdID4+IDYpICYgMHgwMzsKKyAgICBwcmludGYoIiAgQ29tcHJlc3Npb246ICAgICAgJWRcbiIsIGNvbXByZXNzaW9uX21ldGhvZCk7CisgICAgcHJpbnRmKCIgIEZpbHRlcjogICAgICAgICAgICVzICglZClcbiIsCisgICAgICAgICAgIGtBbHBoYUZpbHRlck1ldGhvZHNbZmlsdGVyXSwgZmlsdGVyKTsKKyAgICBwcmludGYoIiAgUHJlLXByb2Nlc3Npbmc6ICAgJWRcbiIsIHByZV9wcm9jZXNzaW5nKTsKKyAgICBpZiAoY29tcHJlc3Npb25fbWV0aG9kID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKKyAgICAgIExPR19FUlJPUigiSW52YWxpZCBBbHBoYSBjb21wcmVzc2lvbiBtZXRob2QuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHByZV9wcm9jZXNzaW5nID4gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUykgeworICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIEFscGhhIHByZS1wcm9jZXNzaW5nIG1ldGhvZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBpZiAocmVzZXJ2ZWRfYml0cyAhPSAwKSB7CisgICAgICBMT0dfV0FSTigiUmVzZXJ2ZWQgYml0cyBpbiBBTFBIIGNodW5rIGhlYWRlciBhcmUgbm90IGFsbCAwLiIpOworICAgIH0KKyAgICBkYXRhICs9IEFMUEhBX0hFQURFUl9MRU47CisgICAgZGF0YV9zaXplIC09IEFMUEhBX0hFQURFUl9MRU47CisgICAgaWYgKGNvbXByZXNzaW9uX21ldGhvZCA9PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTikgeworICAgICAgdWludDY0X3QgYml0X3BvcyA9IDA7CisgICAgICBXZWJQSW5mb1N0YXR1cyBzdGF0dXMgPQorICAgICAgICAgIFBhcnNlTG9zc2xlc3NUcmFuc2Zvcm0od2VicF9pbmZvLCBkYXRhLCBkYXRhX3NpemUsICZiaXRfcG9zKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgcGFyc2luZy4KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlUklGRkhlYWRlcihjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICBjb25zdCBzaXplX3QgbWluX3NpemUgPSBSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkU7CisgIHNpemVfdCByaWZmX3NpemU7CisKKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSkgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIFJJRkYgaGVhZGVyLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgaWYgKG1lbWNtcChHZXRCdWZmZXIobWVtKSwgIlJJRkYiLCBDSFVOS19TSVpFX0JZVEVTKSB8fAorICAgICAgbWVtY21wKEdldEJ1ZmZlcihtZW0pICsgQ0hVTktfSEVBREVSX1NJWkUsICJXRUJQIiwgQ0hVTktfU0laRV9CWVRFUykpIHsKKyAgICBMT0dfRVJST1IoIkNvcnJ1cHRlZCBSSUZGIGhlYWRlci4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIHJpZmZfc2l6ZSA9IEdldExFMzIoR2V0QnVmZmVyKG1lbSkgKyBUQUdfU0laRSk7CisgIGlmIChyaWZmX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgeworICAgIExPR19FUlJPUigiUklGRiBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmIChyaWZmX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIExPR19FUlJPUigiUklGRiBzaXplIGlzIG92ZXIgbGltaXQuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICByaWZmX3NpemUgKz0gQ0hVTktfSEVBREVSX1NJWkU7CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBwcmludGYoIlJJRkYgSEVBREVSOlxuIik7CisgICAgcHJpbnRmKCIgIEZpbGUgc2l6ZTogJTZkXG4iLCAoaW50KXJpZmZfc2l6ZSk7CisgIH0KKyAgaWYgKHJpZmZfc2l6ZSA8IG1lbS0+ZW5kXykgeworICAgIExPR19XQVJOKCJSSUZGIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBmaWxlIHNpemUuIik7CisgICAgbWVtLT5lbmRfID0gcmlmZl9zaXplOworICB9IGVsc2UgaWYgKHJpZmZfc2l6ZSA+IG1lbS0+ZW5kXykgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIFJJRkYgcGF5bG9hZC4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIFNraXAobWVtLCBSSUZGX0hFQURFUl9TSVpFKTsKKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlQ2h1bmsoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhKSB7CisgIG1lbXNldChjaHVua19kYXRhLCAwLCBzaXplb2YoKmNodW5rX2RhdGEpKTsKKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIGNodW5rIGhlYWRlci4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9IGVsc2UgeworICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKKyAgICBjb25zdCB1aW50MzJfdCBmb3VyY2MgPSBSZWFkTWVtQnVmTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IHBheWxvYWRfc2l6ZSA9IFJlYWRNZW1CdWZMRTMyKG1lbSk7CisgICAgY29uc3QgdWludDMyX3QgcGF5bG9hZF9zaXplX3BhZGRlZCA9IHBheWxvYWRfc2l6ZSArIChwYXlsb2FkX3NpemUgJiAxKTsKKyAgICBjb25zdCBzaXplX3QgY2h1bmtfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcGF5bG9hZF9zaXplX3BhZGRlZDsKKyAgICBpbnQgaTsKKyAgICBpZiAocGF5bG9hZF9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICAgIExPR19FUlJPUigiU2l6ZSBvZiBjaHVuayBwYXlsb2FkIGlzIG92ZXIgbGltaXQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX0lOVkFMSURfUEFSQU07CisgICAgfQorICAgIGlmIChwYXlsb2FkX3NpemVfcGFkZGVkID4gTWVtRGF0YVNpemUobWVtKSl7CisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBjaHVuayBwYXlsb2FkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IENIVU5LX1RZUEVTOyArK2kpIHsKKyAgICAgIGlmICghbWVtY21wKGtXZWJQQ2h1bmtUYWdzW2ldLCAmZm91cmNjLCBUQUdfU0laRSkpIGJyZWFrOworICAgIH0KKyAgICBjaHVua19kYXRhLT5vZmZzZXRfID0gY2h1bmtfc3RhcnRfb2Zmc2V0OworICAgIGNodW5rX2RhdGEtPnNpemVfID0gY2h1bmtfc2l6ZTsKKyAgICBjaHVua19kYXRhLT5pZF8gPSAoQ2h1bmtJRClpOworICAgIGNodW5rX2RhdGEtPnBheWxvYWRfID0gR2V0QnVmZmVyKG1lbSk7CisgICAgaWYgKGNodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19BTk1GKSB7CisgICAgICBpZiAocGF5bG9hZF9zaXplICE9IHBheWxvYWRfc2l6ZV9wYWRkZWQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJBTk1GIGNodW5rIHNpemUgc2hvdWxkIGFsd2F5cyBiZSBldmVuLiIpOworICAgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgLy8gVGhlcmUgYXJlIHN1Yi1jaHVua3MgdG8gYmUgcGFyc2VkIGluIGFuIEFOTUYgY2h1bmsuCisgICAgICBTa2lwKG1lbSwgQU5NRl9DSFVOS19TSVpFKTsKKyAgICB9IGVsc2UgeworICAgICAgU2tpcChtZW0sIHBheWxvYWRfc2l6ZV9wYWRkZWQpOworICAgIH0KKyAgICByZXR1cm4gV0VCUF9JTkZPX09LOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBhbmFseXNpcy4KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NWUDhYQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4XSB8fAorICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOExdIHx8CisgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICBMT0dfRVJST1IoIkFscmVhZHkgc2VlbiBhIFZQOC9WUDhML1ZQOFggY2h1bmsgd2hlbiBwYXJzaW5nIFZQOFggY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAoY2h1bmtfZGF0YS0+c2l6ZV8gIT0gVlA4WF9DSFVOS19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIkNvcnJ1cHRlZCBWUDhYIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF07CisgIHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gPSAqZGF0YTsKKyAgZGF0YSArPSA0OworICB3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gPSAxICsgUmVhZExFMjQoJmRhdGEpOworICB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID0gMSArIFJlYWRMRTI0KCZkYXRhKTsKKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIHByaW50ZigiICBJQ0NQOiAlZFxuICBBbHBoYTogJWRcbiAgRVhJRjogJWRcbiAgWE1QOiAlZFxuICBBbmltYXRpb246ICVkXG4iLAorICAgICAgICAgICAod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIElDQ1BfRkxBRykgIT0gMCwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBBTFBIQV9GTEFHKSAhPSAwLAorICAgICAgICAgICAod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEVYSUZfRkxBRykgIT0gMCwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBYTVBfRkxBRykgIT0gMCwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRykgIT0gMCk7CisgICAgcHJpbnRmKCIgIENhbnZhcyBzaXplICVkIHggJWRcbiIsCisgICAgICAgICAgIHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXywgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0Xyk7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyA+IE1BWF9DQU5WQVNfU0laRSkgeworICAgIExPR19XQVJOKCJDYW52YXMgd2lkdGggaXMgb3V0IG9mIHJhbmdlIGluIFZQOFggY2h1bmsuIik7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPiBNQVhfQ0FOVkFTX1NJWkUpIHsKKyAgICBMT0dfV0FSTigiQ2FudmFzIGhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgaW4gVlA4WCBjaHVuay4iKTsKKyAgfQorICBpZiAoKHVpbnQ2NF90KXdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyAqIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPgorICAgICAgTUFYX0lNQUdFX0FSRUEpIHsKKyAgICBMT0dfV0FSTigiQ2FudmFzIGFyZWEgaXMgb3V0IG9mIHJhbmdlIGluIFZQOFggY2h1bmsuIik7CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NBTklNQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIGlmICghd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgTE9HX0VSUk9SKCJBTklNIGNodW5rIGRldGVjdGVkIGJlZm9yZSBWUDhYIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKGNodW5rX2RhdGEtPnNpemVfICE9IEFOSU1fQ0hVTktfU0laRSArIENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJDb3JydXB0ZWQgQU5JTSBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIHdlYnBfaW5mby0+Ymdjb2xvcl8gPSBSZWFkTEUzMigmZGF0YSk7CisgIHdlYnBfaW5mby0+bG9vcF9jb3VudF8gPSBSZWFkTEUxNigmZGF0YSk7CisgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dOworICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgcHJpbnRmKCIgIEJhY2tncm91bmQgY29sb3I6KEFSR0IpICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmJnY29sb3JfID4+IDI0KSAmIDB4ZmYsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmJnY29sb3JfID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmJnY29sb3JfID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgd2VicF9pbmZvLT5iZ2NvbG9yXyAmIDB4ZmYpOworICAgIHByaW50ZigiICBMb29wIGNvdW50ICAgICAgOiAlZFxuIiwgd2VicF9pbmZvLT5sb29wX2NvdW50Xyk7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+bG9vcF9jb3VudF8gPiBNQVhfTE9PUF9DT1VOVCkgeworICAgIExPR19XQVJOKCJMb29wIGNvdW50IGlzIG91dCBvZiByYW5nZSBpbiBBTklNIGNodW5rLiIpOworICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzQU5NRkNodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBpbnQgb2Zmc2V0X3gsIG9mZnNldF95LCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgYmxlbmQsIGRpc3Bvc2UsIHRlbXA7CisgIGlmICh3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8pIHsKKyAgICBMT0dfRVJST1IoIkFOTUYgY2h1bmsgZGV0ZWN0ZWQgd2l0aGluIGFub3RoZXIgQU5NRiBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmICghd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dKSB7CisgICAgTE9HX0VSUk9SKCJBTk1GIGNodW5rIGRldGVjdGVkIGJlZm9yZSBBTklNIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKGNodW5rX2RhdGEtPnNpemVfIDw9IENIVU5LX0hFQURFUl9TSVpFICsgQU5NRl9DSFVOS19TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgQU5NRiBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIG9mZnNldF94ID0gMiAqIFJlYWRMRTI0KCZkYXRhKTsKKyAgb2Zmc2V0X3kgPSAyICogUmVhZExFMjQoJmRhdGEpOworICB3aWR0aCA9IDEgKyBSZWFkTEUyNCgmZGF0YSk7CisgIGhlaWdodCA9IDEgKyBSZWFkTEUyNCgmZGF0YSk7CisgIGR1cmF0aW9uID0gUmVhZExFMjQoJmRhdGEpOworICB0ZW1wID0gKmRhdGE7CisgIGRpc3Bvc2UgPSB0ZW1wICYgMTsKKyAgYmxlbmQgPSAodGVtcCA+PiAxKSAmIDE7CisgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOTUZdOworICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgcHJpbnRmKCIgIE9mZnNldF9YOiAlZFxuICBPZmZzZXRfWTogJWRcbiAgV2lkdGg6ICVkXG4gIEhlaWdodDogJWRcbiIKKyAgICAgICAgICAgIiAgRHVyYXRpb246ICVkXG4gIERpc3Bvc2U6ICVkXG4gIEJsZW5kOiAlZFxuIiwKKyAgICAgICAgICAgb2Zmc2V0X3gsIG9mZnNldF95LCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbiwgZGlzcG9zZSwgYmxlbmQpOworICB9CisgIGlmIChkdXJhdGlvbiA+IE1BWF9EVVJBVElPTikgeworICAgIExPR19FUlJPUigiSW52YWxpZCBkdXJhdGlvbiBwYXJhbWV0ZXIgaW4gQU5NRiBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKG9mZnNldF94ID4gTUFYX1BPU0lUSU9OX09GRlNFVCB8fCBvZmZzZXRfeSA+IE1BWF9QT1NJVElPTl9PRkZTRVQpIHsKKyAgICBMT0dfRVJST1IoIkludmFsaWQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gQU5NRiBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKCh1aW50NjRfdClvZmZzZXRfeCArIHdpZHRoID4gKHVpbnQ2NF90KXdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyB8fAorICAgICAgKHVpbnQ2NF90KW9mZnNldF95ICsgaGVpZ2h0ID4gKHVpbnQ2NF90KXdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8pIHsKKyAgICBMT0dfRVJST1IoIkZyYW1lIGV4Y2VlZHMgY2FudmFzIGluIEFOTUYgY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19JTlZBTElEX1BBUkFNOworICB9CisgIHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXyA9IDE7CisgIHdlYnBfaW5mby0+c2Vlbl9hbHBoYV9zdWJjaHVua18gPSAwOworICB3ZWJwX2luZm8tPnNlZW5faW1hZ2Vfc3ViY2h1bmtfID0gMDsKKyAgd2VicF9pbmZvLT5mcmFtZV93aWR0aF8gPSB3aWR0aDsKKyAgd2VicF9pbmZvLT5mcmFtZV9oZWlnaHRfID0gaGVpZ2h0OworICB3ZWJwX2luZm8tPmFuaW1fZnJhbWVfZGF0YV9zaXplXyA9CisgICAgICBjaHVua19kYXRhLT5zaXplXyAtIENIVU5LX0hFQURFUl9TSVpFIC0gQU5NRl9DSFVOS19TSVpFOworICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0ltYWdlQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgY29uc3QgVlA4U3RhdHVzQ29kZSB2cDhfc3RhdHVzID0KKyAgICAgIFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBjaHVua19kYXRhLT5zaXplXywgJmZlYXR1cmVzKTsKKyAgaWYgKHZwOF9zdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIExPR19FUlJPUigiVlA4L1ZQOEwgYml0c3RyZWFtIGVycm9yLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBhc3NlcnQoZmVhdHVyZXMuZm9ybWF0ID49IDAgJiYgZmVhdHVyZXMuZm9ybWF0IDw9IDIpOworICAgIHByaW50ZigiICBXaWR0aDogJWRcbiAgSGVpZ2h0OiAlZFxuICBBbHBoYTogJWRcbiAgQW5pbWF0aW9uOiAlZFxuIgorICAgICAgICAgICAiICBGb3JtYXQ6ICVzICglZClcbiIsCisgICAgICAgICAgIGZlYXR1cmVzLndpZHRoLCBmZWF0dXJlcy5oZWlnaHQsIGZlYXR1cmVzLmhhc19hbHBoYSwKKyAgICAgICAgICAgZmVhdHVyZXMuaGFzX2FuaW1hdGlvbiwga0Zvcm1hdHNbZmVhdHVyZXMuZm9ybWF0XSwgZmVhdHVyZXMuZm9ybWF0KTsKKyAgfQorICBpZiAod2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfKSB7CisgICAgKyt3ZWJwX2luZm8tPmFubWZfc3ViY2h1bmtfY291bnRzX1tjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfVlA4ID8gMCA6IDFdOworICAgIGlmIChjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfVlA4TCAmJiB3ZWJwX2luZm8tPnNlZW5fYWxwaGFfc3ViY2h1bmtfKSB7CisgICAgICBMT0dfRVJST1IoIkJvdGggVlA4TCBhbmQgQUxQSCBzdWItY2h1bmtzIGFyZSBwcmVzZW50IGluIGFuIEFOTUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5mcmFtZV93aWR0aF8gIT0gZmVhdHVyZXMud2lkdGggfHwKKyAgICAgICAgd2VicF9pbmZvLT5mcmFtZV9oZWlnaHRfICE9IGZlYXR1cmVzLmhlaWdodCkgeworICAgICAgTE9HX0VSUk9SKCJGcmFtZSBzaXplIGluIFZQOC9WUDhMIHN1Yi1jaHVuayBkaWZmZXJzIGZyb20gQU5NRiBoZWFkZXIuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5zZWVuX2ltYWdlX3N1YmNodW5rXykgeworICAgICAgTE9HX0VSUk9SKCJDb25zZWN1dGl2ZSBWUDgvVlA4TCBzdWItY2h1bmtzIGluIGFuIEFOTUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICB3ZWJwX2luZm8tPnNlZW5faW1hZ2Vfc3ViY2h1bmtfID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOF0gfHwKKyAgICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOExdKSB7CisgICAgICBMT0dfRVJST1IoIk11bHRpcGxlIFZQOC9WUDhMIGNodW5rcyBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmIChjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfVlA4TCAmJgorICAgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQUxQSEFdKSB7CisgICAgICBMT0dfV0FSTigiQm90aCBWUDhMIGFuZCBBTFBIIGNodW5rcyBhcmUgZGV0ZWN0ZWQuIik7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV0gfHwKKyAgICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOTUZdKSB7CisgICAgICBMT0dfRVJST1IoIlZQOC9WUDhMIGNodW5rIGFuZCBBTklNL0FOTUYgY2h1bmsgYXJlIGJvdGggZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgICBpZiAod2VicF9pbmZvLT5jYW52YXNfd2lkdGhfICE9IGZlYXR1cmVzLndpZHRoIHx8CisgICAgICAgICAgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyAhPSBmZWF0dXJlcy5oZWlnaHQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJbWFnZSBzaXplIGluIFZQOC9WUDhMIGNodW5rIGRpZmZlcnMgZnJvbSBWUDhYIGNodW5rLiIpOworICAgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gPSBmZWF0dXJlcy53aWR0aDsKKyAgICAgIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPSBmZWF0dXJlcy5oZWlnaHQ7CisgICAgICBpZiAod2VicF9pbmZvLT5jYW52YXNfd2lkdGhfIDwgMSB8fCB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfIDwgMSB8fAorICAgICAgICAgIHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyA+IE1BWF9DQU5WQVNfU0laRSB8fAorICAgICAgICAgIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPiBNQVhfQ0FOVkFTX1NJWkUgfHwKKyAgICAgICAgICAodWludDY0X3Qpd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfICogd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA+CisgICAgICAgICAgICAgIE1BWF9JTUFHRV9BUkVBKSB7CisgICAgICAgIExPR19XQVJOKCJJbnZhbGlkIHBhcmFtZXRlcnMgaW4gVlA4L1ZQOEwgY2h1bmsuIik7CisgICAgICB9CisgICAgfQorICAgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW2NodW5rX2RhdGEtPmlkX107CisgIH0KKyAgKyt3ZWJwX2luZm8tPm51bV9mcmFtZXNfOworICB3ZWJwX2luZm8tPmhhc19hbHBoYV8gfD0gZmVhdHVyZXMuaGFzX2FscGhhOworICBpZiAod2VicF9pbmZvLT5wYXJzZV9iaXRzdHJlYW1fKSB7CisgICAgY29uc3QgaW50IGlzX2xvc3N5ID0gKGNodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19WUDgpOworICAgIGNvbnN0IFdlYlBJbmZvU3RhdHVzIHN0YXR1cyA9CisgICAgICAgIGlzX2xvc3N5ID8gUGFyc2VMb3NzeUhlYWRlcihjaHVua19kYXRhLCB3ZWJwX2luZm8pCisgICAgICAgICAgICAgICAgIDogUGFyc2VMb3NzbGVzc0hlYWRlcihjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzQUxQSENodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgaWYgKHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXykgeworICAgICsrd2VicF9pbmZvLT5hbm1mX3N1YmNodW5rX2NvdW50c19bMl07CisgICAgaWYgKHdlYnBfaW5mby0+c2Vlbl9hbHBoYV9zdWJjaHVua18pIHsKKyAgICAgIExPR19FUlJPUigiQ29uc2VjdXRpdmUgQUxQSCBzdWItY2h1bmtzIGluIGFuIEFOTUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICB3ZWJwX2luZm8tPnNlZW5fYWxwaGFfc3ViY2h1bmtfID0gMTsKKworICAgIGlmICh3ZWJwX2luZm8tPnNlZW5faW1hZ2Vfc3ViY2h1bmtfKSB7CisgICAgICBMT0dfRVJST1IoIkFMUEhBIHN1Yi1jaHVuayBkZXRlY3RlZCBhZnRlciBWUDggc3ViLWNodW5rICIKKyAgICAgICAgICAgICAgICAiaW4gYW4gQU5NRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV0gfHwKKyAgICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOTUZdKSB7CisgICAgICBMT0dfRVJST1IoIkFMUEhBIGNodW5rIGFuZCBBTklNL0FOTUYgY2h1bmsgYXJlIGJvdGggZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgICAgTE9HX0VSUk9SKCJBTFBIQSBjaHVuayBkZXRlY3RlZCBiZWZvcmUgVlA4WCBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4XSkgeworICAgICAgTE9HX0VSUk9SKCJBTFBIQSBjaHVuayBkZXRlY3RlZCBhZnRlciBWUDggY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FMUEhBXSkgeworICAgICAgTE9HX0VSUk9SKCJNdWx0aXBsZSBBTFBIQSBjaHVua3MgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTFBIQV07CisgIH0KKyAgd2VicF9pbmZvLT5oYXNfYWxwaGFfID0gMTsKKyAgaWYgKHdlYnBfaW5mby0+cGFyc2VfYml0c3RyZWFtXykgeworICAgIGNvbnN0IFdlYlBJbmZvU3RhdHVzIHN0YXR1cyA9IFBhcnNlQWxwaGFIZWFkZXIoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0lDQ1BDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgICh2b2lkKWNodW5rX2RhdGE7CisgIGlmICghd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgTE9HX0VSUk9SKCJJQ0NQIGNodW5rIGRldGVjdGVkIGJlZm9yZSBWUDhYIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhdIHx8CisgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4TF0gfHwKKyAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXSkgeworICAgIExPR19FUlJPUigiSUNDUCBjaHVuayBkZXRlY3RlZCBhZnRlciBpbWFnZSBkYXRhLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfSUNDUF07CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIFdlYlBJbmZvU3RhdHVzIHN0YXR1cyA9IFdFQlBfSU5GT19PSzsKKyAgQ2h1bmtJRCBpZCA9IGNodW5rX2RhdGEtPmlkXzsKKyAgaWYgKGNodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19VTktOT1dOKSB7CisgICAgY2hhciBlcnJvcl9tZXNzYWdlWzUwXTsKKyAgICBzbnByaW50ZihlcnJvcl9tZXNzYWdlLCA1MCwgIlVua25vd24gY2h1bmsgYXQgb2Zmc2V0ICU2ZCwgbGVuZ3RoICU2ZCIsCisgICAgICAgICAgICAoaW50KWNodW5rX2RhdGEtPm9mZnNldF8sIChpbnQpY2h1bmtfZGF0YS0+c2l6ZV8pOworICAgIExPR19XQVJOKGVycm9yX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICAgIGNvbnN0IGNoYXIqIHRhZyA9IGtXZWJQQ2h1bmtUYWdzW2NodW5rX2RhdGEtPmlkX107CisgICAgICBwcmludGYoIkNodW5rICVjJWMlYyVjIGF0IG9mZnNldCAlNmQsIGxlbmd0aCAlNmRcbiIsCisgICAgICAgICAgICAgdGFnWzBdLCB0YWdbMV0sIHRhZ1syXSwgdGFnWzNdLCAoaW50KWNodW5rX2RhdGEtPm9mZnNldF8sCisgICAgICAgICAgICAgKGludCljaHVua19kYXRhLT5zaXplXyk7CisgICAgfQorICB9CisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENIVU5LX1ZQODoKKyAgICBjYXNlIENIVU5LX1ZQOEw6CisgICAgICBzdGF0dXMgPSBQcm9jZXNzSW1hZ2VDaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19WUDhYOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc1ZQOFhDaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19BTFBIQToKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NBTFBIQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfQU5JTToKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NBTklNQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfQU5NRjoKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NBTk1GQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfSUNDUDoKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NJQ0NQQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfRVhJRjoKKyAgICBjYXNlIENIVU5LX1hNUDoKKyAgICAgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW2lkXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXyAmJiBpZCAhPSBDSFVOS19BTk1GKSB7CisgICAgaWYgKHdlYnBfaW5mby0+YW5pbV9mcmFtZV9kYXRhX3NpemVfID09IGNodW5rX2RhdGEtPnNpemVfKSB7CisgICAgICBpZiAoIXdlYnBfaW5mby0+c2Vlbl9pbWFnZV9zdWJjaHVua18pIHsKKyAgICAgICAgTE9HX0VSUk9SKCJObyBWUDgvVlA4TCBjaHVuayBkZXRlY3RlZCBpbiBhbiBBTk1GIGNodW5rLiIpOworICAgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgd2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfID0gMDsKKyAgICB9IGVsc2UgaWYgKHdlYnBfaW5mby0+YW5pbV9mcmFtZV9kYXRhX3NpemVfID4gY2h1bmtfZGF0YS0+c2l6ZV8pIHsKKyAgICAgIHdlYnBfaW5mby0+YW5pbV9mcmFtZV9kYXRhX3NpemVfIC09IGNodW5rX2RhdGEtPnNpemVfOworICAgIH0gZWxzZSB7CisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBBTk1GIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFZhbGlkYXRlKGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgaWYgKHdlYnBfaW5mby0+bnVtX2ZyYW1lc18gPCAxKSB7CisgICAgTE9HX0VSUk9SKCJObyBpbWFnZS9mcmFtZSBkZXRlY3RlZC4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX01JU1NJTkdfREFUQTsKKyAgfQorICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgY29uc3QgaW50IGljY3AgPSAhISh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgSUNDUF9GTEFHKTsKKyAgICBjb25zdCBpbnQgZXhpZiA9ICEhKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBFWElGX0ZMQUcpOworICAgIGNvbnN0IGludCB4bXAgPSAhISh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpOworICAgIGNvbnN0IGludCBhbmltYXRpb24gPSAhISh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgQU5JTUFUSU9OX0ZMQUcpOworICAgIGNvbnN0IGludCBhbHBoYSA9ICEhKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBBTFBIQV9GTEFHKTsKKyAgICBpZiAoIWFscGhhICYmIHdlYnBfaW5mby0+aGFzX2FscGhhXykgeworICAgICAgTE9HX0VSUk9SKCJVbmV4cGVjdGVkIGFscGhhIGRhdGEgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoYWxwaGEgJiYgIXdlYnBfaW5mby0+aGFzX2FscGhhXykgeworICAgICAgTE9HX1dBUk4oIkFscGhhIGZsYWcgaXMgc2V0IHdpdGggbm8gYWxwaGEgZGF0YSBwcmVzZW50LiIpOworICAgIH0KKyAgICBpZiAoaWNjcCAmJiAhd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0lDQ1BdKSB7CisgICAgICBMT0dfRVJST1IoIk1pc3NpbmcgSUNDUCBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fTUlTU0lOR19EQVRBOworICAgIH0KKyAgICBpZiAoZXhpZiAmJiAhd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0VYSUZdKSB7CisgICAgICBMT0dfRVJST1IoIk1pc3NpbmcgRVhJRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fTUlTU0lOR19EQVRBOworICAgIH0KKyAgICBpZiAoeG1wICYmICF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfWE1QXSkgeworICAgICAgTE9HX0VSUk9SKCJNaXNzaW5nIFhNUCBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fTUlTU0lOR19EQVRBOworICAgIH0KKyAgICBpZiAoIWljY3AgJiYgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0lDQ1BdKSB7CisgICAgICBMT0dfRVJST1IoIlVuZXhwZWN0ZWQgSUNDUCBjaHVuayBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICghZXhpZiAmJiB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfRVhJRl0pIHsKKyAgICAgIExPR19FUlJPUigiVW5leHBlY3RlZCBFWElGIGNodW5rIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKCF4bXAgJiYgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1hNUF0pIHsKKyAgICAgIExPR19FUlJPUigiVW5leHBlY3RlZCBYTVAgY2h1bmsgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICAvLyBJbmNvbXBsZXRlIGFuaW1hdGlvbiBmcmFtZS4KKyAgICBpZiAod2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfKSByZXR1cm4gV0VCUF9JTkZPX01JU1NJTkdfREFUQTsKKyAgICBpZiAoIWFuaW1hdGlvbiAmJiB3ZWJwX2luZm8tPm51bV9mcmFtZXNfID4gMSkgeworICAgICAgTE9HX0VSUk9SKCJNb3JlIHRoYW4gMSBmcmFtZSBkZXRlY3RlZCBpbiBub24tYW5pbWF0aW9uIGZpbGUuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoYW5pbWF0aW9uICYmICghd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dIHx8CisgICAgICAgICF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5NRl0pKSB7CisgICAgICBMT0dfRVJST1IoIk5vIEFOSU0vQU5NRiBjaHVuayBkZXRlY3RlZCBpbiBhbmltYXRpb24gZmlsZS4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyB2b2lkIFNob3dTdW1tYXJ5KGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgaW50IGk7CisgIHByaW50ZigiU3VtbWFyeTpcbiIpOworICBwcmludGYoIk51bWJlciBvZiBmcmFtZXM6ICVkXG4iLCB3ZWJwX2luZm8tPm51bV9mcmFtZXNfKTsKKyAgcHJpbnRmKCJDaHVuayB0eXBlICA6ICBWUDggVlA4TCBWUDhYIEFMUEggQU5JTSBBTk1GKFZQOCAvVlA4TC9BTFBIKSBJQ0NQICIKKyAgICAgICJFWElGICBYTVBcbiIpOworICBwcmludGYoIkNodW5rIGNvdW50czogIik7CisgIGZvciAoaSA9IDA7IGkgPCBDSFVOS19UWVBFUzsgKytpKSB7CisgICAgcHJpbnRmKCIlNGQgIiwgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW2ldKTsKKyAgICBpZiAoaSA9PSBDSFVOS19BTk1GKSB7CisgICAgICBwcmludGYoIiU0ZCAlNGQgJTRkICAiLAorICAgICAgICAgICAgIHdlYnBfaW5mby0+YW5tZl9zdWJjaHVua19jb3VudHNfWzBdLAorICAgICAgICAgICAgIHdlYnBfaW5mby0+YW5tZl9zdWJjaHVua19jb3VudHNfWzFdLAorICAgICAgICAgICAgIHdlYnBfaW5mby0+YW5tZl9zdWJjaHVua19jb3VudHNfWzJdKTsKKyAgICB9CisgIH0KKyAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgQW5hbHl6ZVdlYlAoV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGF0YSogd2VicF9kYXRhKSB7CisgIENodW5rRGF0YSBjaHVua19kYXRhOworICBNZW1CdWZmZXIgbWVtX2J1ZmZlcjsKKyAgV2ViUEluZm9TdGF0dXMgd2VicF9pbmZvX3N0YXR1cyA9IFdFQlBfSU5GT19PSzsKKworICBJbml0TWVtQnVmZmVyKCZtZW1fYnVmZmVyLCB3ZWJwX2RhdGEpOworICB3ZWJwX2luZm9fc3RhdHVzID0gUGFyc2VSSUZGSGVhZGVyKHdlYnBfaW5mbywgJm1lbV9idWZmZXIpOworICBpZiAod2VicF9pbmZvX3N0YXR1cyAhPSBXRUJQX0lORk9fT0spIGdvdG8gRXJyb3I7CisKKyAgLy8gIExvb3AgdGhyb3VnaCBhbGwgdGhlIGNodW5rcy4gVGVybWluYXRlIGltbWVkaWF0ZWx5IGluIGNhc2Ugb2YgZXJyb3IuCisgIHdoaWxlICh3ZWJwX2luZm9fc3RhdHVzID09IFdFQlBfSU5GT19PSyAmJiBNZW1EYXRhU2l6ZSgmbWVtX2J1ZmZlcikgPiAwKSB7CisgICAgd2VicF9pbmZvX3N0YXR1cyA9IFBhcnNlQ2h1bmsod2VicF9pbmZvLCAmbWVtX2J1ZmZlciwgJmNodW5rX2RhdGEpOworICAgIGlmICh3ZWJwX2luZm9fc3RhdHVzICE9IFdFQlBfSU5GT19PSykgZ290byBFcnJvcjsKKyAgICB3ZWJwX2luZm9fc3RhdHVzID0gUHJvY2Vzc0NodW5rKCZjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICB9CisgIGlmICh3ZWJwX2luZm9fc3RhdHVzICE9IFdFQlBfSU5GT19PSykgZ290byBFcnJvcjsKKyAgaWYgKHdlYnBfaW5mby0+c2hvd19zdW1tYXJ5XykgU2hvd1N1bW1hcnkod2VicF9pbmZvKTsKKworICAvLyAgRmluYWwgY2hlY2suCisgIHdlYnBfaW5mb19zdGF0dXMgPSBWYWxpZGF0ZSh3ZWJwX2luZm8pOworCisgRXJyb3I6CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBpZiAod2VicF9pbmZvX3N0YXR1cyA9PSBXRUJQX0lORk9fT0spIHsKKyAgICAgIHByaW50ZigiTm8gZXJyb3IgZGV0ZWN0ZWQuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJFcnJvcnMgZGV0ZWN0ZWQuXG4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdlYnBfaW5mb19zdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIEhlbHBTaG9ydCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IHdlYnBpbmZvIFtvcHRpb25zXSBpbl9maWxlc1xuIgorICAgICAgICAgIlRyeSAtbG9uZ2hlbHAgZm9yIGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBvcHRpb25zLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIEhlbHBMb25nKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogd2VicGluZm8gW29wdGlvbnNdIGluX2ZpbGVzXG4iCisgICAgICAgICAiTm90ZTogdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgaW5wdXQgZmlsZXM7XG4iCisgICAgICAgICAiICAgICAgb3B0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGlucHV0IGZpbGVzLlxuIgorICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAiICAtdmVyc2lvbiAuLi4uLi4uLi4uLiBQcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC5cbiIKKyAgICAgICAgICIgIC1xdWlldCAuLi4uLi4uLi4uLi4uIERvIG5vdCBzaG93IGNodW5rIHBhcnNpbmcgaW5mb3JtYXRpb24uXG4iCisgICAgICAgICAiICAtZGlhZyAuLi4uLi4uLi4uLi4uLiBTaG93IHBhcnNpbmcgZXJyb3IgZGlhZ25vc2lzLlxuIgorICAgICAgICAgIiAgLXN1bW1hcnkgLi4uLi4uLi4uLi4gU2hvdyBjaHVuayBzdGF0cyBzdW1tYXJ5LlxuIgorICAgICAgICAgIiAgLWJpdHN0cmVhbV9pbmZvIC4uLi4gUGFyc2UgYml0c3RyZWFtIGhlYWRlci5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIGludCBjLCBxdWlldCA9IDAsIHNob3dfZGlhZyA9IDAsIHNob3dfc3VtbWFyeSA9IDA7CisgIGludCBwYXJzZV9iaXRzdHJlYW0gPSAwOworICBXZWJQSW5mb1N0YXR1cyB3ZWJwX2luZm9fc3RhdHVzID0gV0VCUF9JTkZPX09LOworICBXZWJQSW5mbyB3ZWJwX2luZm87CisKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIEhlbHBTaG9ydCgpOworICAgIHJldHVybiBXRUJQX0lORk9fT0s7CisgIH0KKworICAvLyBQYXJzZSBjb21tYW5kLWxpbmUgaW5wdXQuCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwU2hvcnQoKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fT0s7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItSCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1sb25naGVscCIpKSB7CisgICAgICBIZWxwTG9uZygpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19PSzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xdWlldCIpKSB7CisgICAgICBxdWlldCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZGlhZyIpKSB7CisgICAgICBzaG93X2RpYWcgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXN1bW1hcnkiKSkgeworICAgICAgc2hvd19zdW1tYXJ5ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1iaXRzdHJlYW1faW5mbyIpKSB7CisgICAgICBwYXJzZV9iaXRzdHJlYW0gPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgY29uc3QgaW50IHZlcnNpb24gPSBXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgICAgIHByaW50ZigiV2ViUCBEZWNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYsICh2ZXJzaW9uID4+IDgpICYgMHhmZiwgdmVyc2lvbiAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsgIC8vIEFzc3VtZSB0aGUgcmVtYWluaW5nIGFyZSBhbGwgaW5wdXQgZmlsZXMuCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoYyA9PSBhcmdjKSB7CisgICAgSGVscFNob3J0KCk7CisgICAgcmV0dXJuIFdFQlBfSU5GT19JTlZBTElEX0NPTU1BTkQ7CisgIH0KKworICAvLyBQcm9jZXNzIGlucHV0IGZpbGVzIG9uZSBieSBvbmUuCisgIGZvciAoOyBjIDwgYXJnYzsgKytjKSB7CisgICAgV2ViUERhdGEgd2VicF9kYXRhOworICAgIGNvbnN0IGNoYXIqIGluX2ZpbGUgPSBOVUxMOworICAgIFdlYlBJbmZvSW5pdCgmd2VicF9pbmZvKTsKKyAgICB3ZWJwX2luZm8ucXVpZXRfID0gcXVpZXQ7CisgICAgd2VicF9pbmZvLnNob3dfZGlhZ25vc2lzXyA9IHNob3dfZGlhZzsKKyAgICB3ZWJwX2luZm8uc2hvd19zdW1tYXJ5XyA9IHNob3dfc3VtbWFyeTsKKyAgICB3ZWJwX2luZm8ucGFyc2VfYml0c3RyZWFtXyA9IHBhcnNlX2JpdHN0cmVhbTsKKyAgICBpbl9maWxlID0gYXJndltjXTsKKyAgICBpZiAoaW5fZmlsZSA9PSBOVUxMIHx8ICFSZWFkRmlsZVRvV2ViUERhdGEoaW5fZmlsZSwgJndlYnBfZGF0YSkpIHsKKyAgICAgIHdlYnBfaW5mb19zdGF0dXMgPSBXRUJQX0lORk9fSU5WQUxJRF9DT01NQU5EOworICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiBpbnB1dCBmaWxlICVzLlxuIiwgaW5fZmlsZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCF3ZWJwX2luZm8ucXVpZXRfKSBwcmludGYoIkZpbGU6ICVzXG4iLCBpbl9maWxlKTsKKyAgICB3ZWJwX2luZm9fc3RhdHVzID0gQW5hbHl6ZVdlYlAoJndlYnBfaW5mbywgJndlYnBfZGF0YSk7CisgICAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKyAgfQorICByZXR1cm4gd2VicF9pbmZvX3N0YXR1czsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBtdXguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWU4ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicG11eC5jCkBAIC0wLDAgKzEsMTE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBTaW1wbGUgY29tbWFuZC1saW5lIHRvIGNyZWF0ZSBhIFdlYlAgY29udGFpbmVyIGZpbGUgYW5kIHRvIGV4dHJhY3Qgb3Igc3RyaXAKKy8vICByZWxldmFudCBkYXRhIGZyb20gdGhlIGNvbnRhaW5lciBmaWxlLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzICh2aWthYXMuYXJvcmFAZ21haWwuY29tKSwKKy8vICAgICAgICAgIFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKy8qICBVc2FnZSBleGFtcGxlczoKKworICBDcmVhdGUgY29udGFpbmVyIFdlYlAgZmlsZToKKyAgICB3ZWJwbXV4IC1mcmFtZSBhbmltXzEud2VicCArMTAwKzEwKzEwICAgXAorICAgICAgICAgICAgLWZyYW1lIGFuaW1fMi53ZWJwICsxMDArMjUrMjUrMSBcCisgICAgICAgICAgICAtZnJhbWUgYW5pbV8zLndlYnAgKzEwMCs1MCs1MCsxIFwKKyAgICAgICAgICAgIC1mcmFtZSBhbmltXzQud2VicCArMTAwICAgICAgICAgXAorICAgICAgICAgICAgLWxvb3AgMTAgLWJnY29sb3IgMTI4LDI1NSwyNTUsMjU1IFwKKyAgICAgICAgICAgIC1vIG91dF9hbmltYXRpb25fY29udGFpbmVyLndlYnAKKworICAgIHdlYnBtdXggLXNldCBpY2MgaW1hZ2VfcHJvZmlsZS5pY2MgaW4ud2VicCAtbyBvdXRfaWNjX2NvbnRhaW5lci53ZWJwCisgICAgd2VicG11eCAtc2V0IGV4aWYgaW1hZ2VfbWV0YWRhdGEuZXhpZiBpbi53ZWJwIC1vIG91dF9leGlmX2NvbnRhaW5lci53ZWJwCisgICAgd2VicG11eCAtc2V0IHhtcCBpbWFnZV9tZXRhZGF0YS54bXAgaW4ud2VicCAtbyBvdXRfeG1wX2NvbnRhaW5lci53ZWJwCisKKyAgRXh0cmFjdCByZWxldmFudCBkYXRhIGZyb20gV2ViUCBjb250YWluZXIgZmlsZToKKyAgICB3ZWJwbXV4IC1nZXQgZnJhbWUgbiBpbi53ZWJwIC1vIG91dF9mcmFtZS53ZWJwCisgICAgd2VicG11eCAtZ2V0IGljYyBpbi53ZWJwIC1vIGltYWdlX3Byb2ZpbGUuaWNjCisgICAgd2VicG11eCAtZ2V0IGV4aWYgaW4ud2VicCAtbyBpbWFnZV9tZXRhZGF0YS5leGlmCisgICAgd2VicG11eCAtZ2V0IHhtcCBpbi53ZWJwIC1vIGltYWdlX21ldGFkYXRhLnhtcAorCisgIFN0cmlwIGRhdGEgZnJvbSBXZWJQIENvbnRhaW5lciBmaWxlOgorICAgIHdlYnBtdXggLXN0cmlwIGljYyBpbi53ZWJwIC1vIG91dC53ZWJwCisgICAgd2VicG11eCAtc3RyaXAgZXhpZiBpbi53ZWJwIC1vIG91dC53ZWJwCisgICAgd2VicG11eCAtc3RyaXAgeG1wIGluLndlYnAgLW8gb3V0LndlYnAKKworICBDaGFuZ2UgZHVyYXRpb24gb2YgZnJhbWUgaW50ZXJ2YWxzOgorICAgIHdlYnBtdXggLWR1cmF0aW9uIDE1MCBpbi53ZWJwIC1vIG91dC53ZWJwCisgICAgd2VicG11eCAtZHVyYXRpb24gMzMsMiBpbi53ZWJwIC1vIG91dC53ZWJwCisgICAgd2VicG11eCAtZHVyYXRpb24gMjAwLDEwLDAgLWR1cmF0aW9uIDE1MCw2LDUwIGluLndlYnAgLW8gb3V0LndlYnAKKworICBNaXNjOgorICAgIHdlYnBtdXggLWluZm8gaW4ud2VicAorICAgIHdlYnBtdXggWyAtaCB8IC1oZWxwIF0KKyAgICB3ZWJwbXV4IC12ZXJzaW9uCisgICAgd2VicG11eCBhcmd1bWVudF9maWxlX25hbWUKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvbXV4LmgiCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbmZpZyBvYmplY3QgdG8gcGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKwordHlwZWRlZiBlbnVtIHsKKyAgTklMX0FDVElPTiA9IDAsCisgIEFDVElPTl9HRVQsCisgIEFDVElPTl9TRVQsCisgIEFDVElPTl9TVFJJUCwKKyAgQUNUSU9OX0lORk8sCisgIEFDVElPTl9IRUxQLAorICBBQ1RJT05fRFVSQVRJT04KK30gQWN0aW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTklMX1NVQlRZUEUgPSAwLAorICBTVUJUWVBFX0FOTUYsCisgIFNVQlRZUEVfTE9PUCwKKyAgU1VCVFlQRV9CR0NPTE9SCit9IEZlYXR1cmVTdWJUeXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZlYXR1cmVTdWJUeXBlIHN1YnR5cGVfOworICBjb25zdCBjaGFyKiBmaWxlbmFtZV87CisgIGNvbnN0IGNoYXIqIHBhcmFtc187Cit9IEZlYXR1cmVBcmc7CisKK3R5cGVkZWYgZW51bSB7CisgIE5JTF9GRUFUVVJFID0gMCwKKyAgRkVBVFVSRV9FWElGLAorICBGRUFUVVJFX1hNUCwKKyAgRkVBVFVSRV9JQ0NQLAorICBGRUFUVVJFX0FOTUYsCisgIEZFQVRVUkVfRFVSQVRJT04sCisgIExBU1RfRkVBVFVSRQorfSBGZWF0dXJlVHlwZTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtGb3VyY2NMaXN0W0xBU1RfRkVBVFVSRV0gPSB7CisgIE5VTEwsICJFWElGIiwgIlhNUCAiLCAiSUNDUCIsICJBTk1GIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtEZXNjcmlwdGlvbnNbTEFTVF9GRUFUVVJFXSA9IHsKKyAgTlVMTCwgIkVYSUYgbWV0YWRhdGEiLCAiWE1QIG1ldGFkYXRhIiwgIklDQyBwcm9maWxlIiwKKyAgIkFuaW1hdGlvbiBmcmFtZSIKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ29tbWFuZExpbmVBcmd1bWVudHMgY21kX2FyZ3NfOworCisgIEFjdGlvblR5cGUgYWN0aW9uX3R5cGVfOworICBjb25zdCBjaGFyKiBpbnB1dF87CisgIGNvbnN0IGNoYXIqIG91dHB1dF87CisgIEZlYXR1cmVUeXBlIHR5cGVfOworICBGZWF0dXJlQXJnKiBhcmdzXzsKKyAgaW50IGFyZ19jb3VudF87Cit9IENvbmZpZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBmdW5jdGlvbnMuCisKK3N0YXRpYyBpbnQgQ291bnRPY2N1cnJlbmNlcyhjb25zdCBDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcpIHsKKyAgaW50IGk7CisgIGludCBudW1fb2NjdXJlbmNlcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGFyZ3MtPmFyZ2NfOyArK2kpIHsKKyAgICBpZiAoIXN0cmNtcChhcmdzLT5hcmd2X1tpXSwgYXJnKSkgeworICAgICAgKytudW1fb2NjdXJlbmNlczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9vY2N1cmVuY2VzOworfQorCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Vycm9yTWVzc2FnZXNbLVdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSArIDFdID0geworICAiV0VCUF9NVVhfTk9UX0ZPVU5EIiwgIldFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQiLCAiV0VCUF9NVVhfQkFEX0RBVEEiLAorICAiV0VCUF9NVVhfTUVNT1JZX0VSUk9SIiwgIldFQlBfTVVYX05PVF9FTk9VR0hfREFUQSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBFcnJvclN0cmluZyhXZWJQTXV4RXJyb3IgZXJyKSB7CisgIGFzc2VydChlcnIgPD0gV0VCUF9NVVhfTk9UX0ZPVU5EICYmIGVyciA+PSBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEpOworICByZXR1cm4ga0Vycm9yTWVzc2FnZXNbLWVycl07Cit9CisKKyNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SKEVSUl9NU0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRVJSX01TRyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFJFVFVSTl9JRl9FUlJPUjMoRVJSX01TRywgRk9STUFUX1NUUjEsIEZPUk1BVF9TVFIyKSAgICAgICAgICBcCisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIEVSUl9NU0csIEZPUk1BVF9TVFIxLCBGT1JNQVRfU1RSMik7ICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBFUlJPUl9HT1RPMShFUlJfTVNHLCBMQUJFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBFUlJfTVNHKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gTEFCRUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVSUk9SX0dPVE8yKEVSUl9NU0csIEZPUk1BVF9TVFIsIExBQkVMKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIEVSUl9NU0csIEZPUk1BVF9TVFIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ290byBMQUJFTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRVJST1JfR09UTzMoRVJSX01TRywgRk9STUFUX1NUUjEsIEZPUk1BVF9TVFIyLCBMQUJFTCkgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRVJSX01TRywgRk9STUFUX1NUUjEsIEZPUk1BVF9TVFIyKTsgICAgICAgICAgICAgIFwKKyAgICBvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvIExBQkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdlYlBNdXhFcnJvciBEaXNwbGF5SW5mbyhjb25zdCBXZWJQTXV4KiBtdXgpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIHVpbnQzMl90IGZsYWc7CisKKyAgV2ViUE11eEVycm9yIGVyciA9IFdlYlBNdXhHZXRDYW52YXNTaXplKG11eCwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7ICAvLyBBcyBXZWJQTXV4Q3JlYXRlKCkgd2FzIHN1Y2Nlc3NmdWwgZWFybGllci4KKyAgcHJpbnRmKCJDYW52YXMgc2l6ZTogJWQgeCAlZFxuIiwgd2lkdGgsIGhlaWdodCk7CisKKyAgZXJyID0gV2ViUE11eEdldEZlYXR1cmVzKG11eCwgJmZsYWcpOworICBSRVRVUk5fSUZfRVJST1IoIkZhaWxlZCB0byByZXRyaWV2ZSBmZWF0dXJlc1xuIik7CisKKyAgaWYgKGZsYWcgPT0gMCkgeworICAgIHByaW50ZigiTm8gZmVhdHVyZXMgcHJlc2VudC5cbiIpOworICAgIHJldHVybiBlcnI7CisgIH0KKworICAvLyBQcmludCB0aGUgZmVhdHVyZXMgcHJlc2VudC4KKyAgcHJpbnRmKCJGZWF0dXJlcyBwcmVzZW50OiIpOworICBpZiAoZmxhZyAmIEFOSU1BVElPTl9GTEFHKSBwcmludGYoIiBhbmltYXRpb24iKTsKKyAgaWYgKGZsYWcgJiBJQ0NQX0ZMQUcpICAgICAgcHJpbnRmKCIgSUNDIHByb2ZpbGUiKTsKKyAgaWYgKGZsYWcgJiBFWElGX0ZMQUcpICAgICAgcHJpbnRmKCIgRVhJRiBtZXRhZGF0YSIpOworICBpZiAoZmxhZyAmIFhNUF9GTEFHKSAgICAgICBwcmludGYoIiBYTVAgbWV0YWRhdGEiKTsKKyAgaWYgKGZsYWcgJiBBTFBIQV9GTEFHKSAgICAgcHJpbnRmKCIgdHJhbnNwYXJlbmN5Iik7CisgIHByaW50ZigiXG4iKTsKKworICBpZiAoZmxhZyAmIEFOSU1BVElPTl9GTEFHKSB7CisgICAgY29uc3QgV2ViUENodW5rSWQgaWQgPSBXRUJQX0NIVU5LX0FOTUY7CisgICAgY29uc3QgY2hhciogY29uc3QgdHlwZV9zdHIgPSAiZnJhbWUiOworICAgIGludCBuRnJhbWVzOworCisgICAgV2ViUE11eEFuaW1QYXJhbXMgcGFyYW1zOworICAgIGVyciA9IFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMobXV4LCAmcGFyYW1zKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgICBwcmludGYoIkJhY2tncm91bmQgY29sb3IgOiAweCUuOFggIExvb3AgQ291bnQgOiAlZFxuIiwKKyAgICAgICAgICAgcGFyYW1zLmJnY29sb3IsIHBhcmFtcy5sb29wX2NvdW50KTsKKworICAgIGVyciA9IFdlYlBNdXhOdW1DaHVua3MobXV4LCBpZCwgJm5GcmFtZXMpOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOworCisgICAgcHJpbnRmKCJOdW1iZXIgb2YgJXNzOiAlZFxuIiwgdHlwZV9zdHIsIG5GcmFtZXMpOworICAgIGlmIChuRnJhbWVzID4gMCkgeworICAgICAgaW50IGk7CisgICAgICBwcmludGYoIk5vLjogd2lkdGggaGVpZ2h0IGFscGhhIHhfb2Zmc2V0IHlfb2Zmc2V0ICIpOworICAgICAgcHJpbnRmKCJkdXJhdGlvbiAgIGRpc3Bvc2UgYmxlbmQgIik7CisgICAgICBwcmludGYoImltYWdlX3NpemUgIGNvbXByZXNzaW9uXG4iKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkZyYW1lczsgaSsrKSB7CisgICAgICAgIFdlYlBNdXhGcmFtZUluZm8gZnJhbWU7CisgICAgICAgIGVyciA9IFdlYlBNdXhHZXRGcmFtZShtdXgsIGksICZmcmFtZSk7CisgICAgICAgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgZmVhdHVyZXM7CisgICAgICAgICAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBXZWJQR2V0RmVhdHVyZXMoCisgICAgICAgICAgICAgIGZyYW1lLmJpdHN0cmVhbS5ieXRlcywgZnJhbWUuYml0c3RyZWFtLnNpemUsICZmZWF0dXJlcyk7CisgICAgICAgICAgYXNzZXJ0KHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKTsgIC8vIENoZWNrZWQgYnkgV2ViUE11eENyZWF0ZSgpLgorICAgICAgICAgICh2b2lkKXN0YXR1czsKKyAgICAgICAgICBwcmludGYoIiUzZDogJTVkICU1ZCAlNXMgJThkICU4ZCAiLCBpLCBmZWF0dXJlcy53aWR0aCwKKyAgICAgICAgICAgICAgICAgZmVhdHVyZXMuaGVpZ2h0LCBmZWF0dXJlcy5oYXNfYWxwaGEgPyAieWVzIiA6ICJubyIsCisgICAgICAgICAgICAgICAgIGZyYW1lLnhfb2Zmc2V0LCBmcmFtZS55X29mZnNldCk7CisgICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgZGlzcG9zZSA9CisgICAgICAgICAgICAgICAgKGZyYW1lLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfTk9ORSkgPyAibm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJiYWNrZ3JvdW5kIjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGJsZW5kID0KKyAgICAgICAgICAgICAgICAoZnJhbWUuYmxlbmRfbWV0aG9kID09IFdFQlBfTVVYX0JMRU5EKSA/ICJ5ZXMiIDogIm5vIjsKKyAgICAgICAgICAgIHByaW50ZigiJThkICUxMHMgJTVzICIsIGZyYW1lLmR1cmF0aW9uLCBkaXNwb3NlLCBibGVuZCk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiJTEwZCAlMTFzXG4iLCAoaW50KWZyYW1lLmJpdHN0cmVhbS5zaXplLAorICAgICAgICAgICAgICAgICAoZmVhdHVyZXMuZm9ybWF0ID09IDEpID8gImxvc3N5IiA6CisgICAgICAgICAgICAgICAgIChmZWF0dXJlcy5mb3JtYXQgPT0gMikgPyAibG9zc2xlc3MiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQiKTsKKyAgICAgICAgfQorICAgICAgICBXZWJQRGF0YUNsZWFyKCZmcmFtZS5iaXRzdHJlYW0pOworICAgICAgICBSRVRVUk5fSUZfRVJST1IzKCJGYWlsZWQgdG8gcmV0cmlldmUgJXMjJWRcbiIsIHR5cGVfc3RyLCBpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZmxhZyAmIElDQ1BfRkxBRykgeworICAgIFdlYlBEYXRhIGljY19wcm9maWxlOworICAgIGVyciA9IFdlYlBNdXhHZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgICBwcmludGYoIlNpemUgb2YgdGhlIElDQyBwcm9maWxlIGRhdGE6ICVkXG4iLCAoaW50KWljY19wcm9maWxlLnNpemUpOworICB9CisKKyAgaWYgKGZsYWcgJiBFWElGX0ZMQUcpIHsKKyAgICBXZWJQRGF0YSBleGlmOworICAgIGVyciA9IFdlYlBNdXhHZXRDaHVuayhtdXgsICJFWElGIiwgJmV4aWYpOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOworICAgIHByaW50ZigiU2l6ZSBvZiB0aGUgRVhJRiBtZXRhZGF0YTogJWRcbiIsIChpbnQpZXhpZi5zaXplKTsKKyAgfQorCisgIGlmIChmbGFnICYgWE1QX0ZMQUcpIHsKKyAgICBXZWJQRGF0YSB4bXA7CisgICAgZXJyID0gV2ViUE11eEdldENodW5rKG11eCwgIlhNUCAiLCAmeG1wKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgICBwcmludGYoIlNpemUgb2YgdGhlIFhNUCBtZXRhZGF0YTogJWRcbiIsIChpbnQpeG1wLnNpemUpOworICB9CisKKyAgaWYgKChmbGFnICYgQUxQSEFfRkxBRykgJiYgIShmbGFnICYgQU5JTUFUSU9OX0ZMQUcpKSB7CisgICAgV2ViUE11eEZyYW1lSW5mbyBpbWFnZTsKKyAgICBlcnIgPSBXZWJQTXV4R2V0RnJhbWUobXV4LCAxLCAmaW1hZ2UpOworICAgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIHByaW50ZigiU2l6ZSBvZiB0aGUgaW1hZ2UgKHdpdGggYWxwaGEpOiAlZFxuIiwgKGludClpbWFnZS5iaXRzdHJlYW0uc2l6ZSk7CisgICAgfQorICAgIFdlYlBEYXRhQ2xlYXIoJmltYWdlLmJpdHN0cmVhbSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIGltYWdlXG4iKTsKKyAgfQorCisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworc3RhdGljIHZvaWQgUHJpbnRIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogd2VicG11eCAtZ2V0IEdFVF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLXNldCBTRVRfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC1kdXJhdGlvbiBEVVJBVElPTl9PUFRJT05TIFstZHVyYXRpb24gLi4uXVxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgSU5QVVQgLW8gT1VUUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtc3RyaXAgU1RSSVBfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC1mcmFtZSBGUkFNRV9PUFRJT05TIFstZnJhbWUuLi5dIFstbG9vcCBMT09QX0NPVU5UXSIKKyAgICAgICAgICJcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgIFstYmdjb2xvciBCQUNLR1JPVU5EX0NPTE9SXSAtbyBPVVRQVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC1pbmZvIElOUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCBbLWh8LWhlbHBdXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtdmVyc2lvblxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggYXJndW1lbnRfZmlsZV9uYW1lXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiR0VUX09QVElPTlM6XG4iKTsKKyAgcHJpbnRmKCIgRXh0cmFjdCByZWxldmFudCBkYXRhOlxuIik7CisgIHByaW50ZigiICAgaWNjICAgICAgIGdldCBJQ0MgcHJvZmlsZVxuIik7CisgIHByaW50ZigiICAgZXhpZiAgICAgIGdldCBFWElGIG1ldGFkYXRhXG4iKTsKKyAgcHJpbnRmKCIgICB4bXAgICAgICAgZ2V0IFhNUCBtZXRhZGF0YVxuIik7CisgIHByaW50ZigiICAgZnJhbWUgbiAgIGdldCBudGggZnJhbWVcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJTRVRfT1BUSU9OUzpcbiIpOworICBwcmludGYoIiBTZXQgY29sb3IgcHJvZmlsZS9tZXRhZGF0YTpcbiIpOworICBwcmludGYoIiAgIGljYyAgZmlsZS5pY2MgICAgIHNldCBJQ0MgcHJvZmlsZVxuIik7CisgIHByaW50ZigiICAgZXhpZiBmaWxlLmV4aWYgICAgc2V0IEVYSUYgbWV0YWRhdGFcbiIpOworICBwcmludGYoIiAgIHhtcCAgZmlsZS54bXAgICAgIHNldCBYTVAgbWV0YWRhdGFcbiIpOworICBwcmludGYoIiAgIHdoZXJlOiAgICAnZmlsZS5pY2MnIGNvbnRhaW5zIHRoZSBJQ0MgcHJvZmlsZSB0byBiZSBzZXQsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ2ZpbGUuZXhpZicgY29udGFpbnMgdGhlIEVYSUYgbWV0YWRhdGEgdG8gYmUgc2V0XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ2ZpbGUueG1wJyBjb250YWlucyB0aGUgWE1QIG1ldGFkYXRhIHRvIGJlIHNldFxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkRVUkFUSU9OX09QVElPTlM6XG4iKTsKKyAgcHJpbnRmKCIgU2V0IGR1cmF0aW9uIG9mIHNlbGVjdGVkIGZyYW1lczpcbiIpOworICBwcmludGYoIiAgIGR1cmF0aW9uICAgICAgICAgICAgc2V0IGR1cmF0aW9uIGZvciBlYWNoIGZyYW1lc1xuIik7CisgIHByaW50ZigiICAgZHVyYXRpb24sZnJhbWUgICAgICBzZXQgZHVyYXRpb24gb2YgYSBwYXJ0aWN1bGFyIGZyYW1lXG4iKTsKKyAgcHJpbnRmKCIgICBkdXJhdGlvbixzdGFydCxlbmQgIHNldCBkdXJhdGlvbiBvZiBmcmFtZXMgaW4gdGhlXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCBbc3RhcnQsZW5kXSlcbiIpOworICBwcmludGYoIiAgIHdoZXJlOiAnZHVyYXRpb24nIGlzIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiIpOworICBwcmludGYoIiAgICAgICAgICAnc3RhcnQnIGlzIHRoZSBzdGFydCBmcmFtZSBpbmRleFxuIik7CisgIHByaW50ZigiICAgICAgICAgICdlbmQnIGlzIHRoZSBpbmNsdXNpdmUgZW5kIGZyYW1lIGluZGV4XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgIFRoZSBzcGVjaWFsICdlbmQnIHZhbHVlICcwJyBtZWFuczogbGFzdCBmcmFtZS5cbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJTVFJJUF9PUFRJT05TOlxuIik7CisgIHByaW50ZigiIFN0cmlwIGNvbG9yIHByb2ZpbGUvbWV0YWRhdGE6XG4iKTsKKyAgcHJpbnRmKCIgICBpY2MgICAgICAgc3RyaXAgSUNDIHByb2ZpbGVcbiIpOworICBwcmludGYoIiAgIGV4aWYgICAgICBzdHJpcCBFWElGIG1ldGFkYXRhXG4iKTsKKyAgcHJpbnRmKCIgICB4bXAgICAgICAgc3RyaXAgWE1QIG1ldGFkYXRhXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiRlJBTUVfT1BUSU9OUyhpKTpcbiIpOworICBwcmludGYoIiBDcmVhdGUgYW5pbWF0aW9uOlxuIik7CisgIHByaW50ZigiICAgZmlsZV9pICtkaStbeGkreWlbK21pW2JpXV1dXG4iKTsKKyAgcHJpbnRmKCIgICB3aGVyZTogICAgJ2ZpbGVfaScgaXMgdGhlIGkndGggYW5pbWF0aW9uIGZyYW1lIChXZWJQIGZvcm1hdCksXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ2RpJyBpcyB0aGUgcGF1c2UgZHVyYXRpb24gYmVmb3JlIG5leHQgZnJhbWUsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ3hpJywneWknIHNwZWNpZnkgdGhlIGltYWdlIG9mZnNldCBmb3IgdGhpcyBmcmFtZSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAnbWknIGlzIHRoZSBkaXNwb3NlIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoMCBvciAxKSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAnYmknIGlzIHRoZSBibGVuZGluZyBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKCtiIG9yIC1iKSIKKyAgICAgICAgICJcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJMT09QX0NPVU5UOlxuIik7CisgIHByaW50ZigiIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGFuaW1hdGlvbi5cbiIpOworICBwcmludGYoIiBWYWxpZCByYW5nZSBpcyAwIHRvIDY1NTM1IFtEZWZhdWx0OiAwIChpbmZpbml0ZSldLlxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkJBQ0tHUk9VTkRfQ09MT1I6XG4iKTsKKyAgcHJpbnRmKCIgQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLlxuIik7CisgIHByaW50ZigiICBBLFIsRyxCXG4iKTsKKyAgcHJpbnRmKCIgIHdoZXJlOiAgICAnQScsICdSJywgJ0cnIGFuZCAnQicgYXJlIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDI1NSAiCisgICAgICAgICAic3BlY2lmeWluZ1xuIik7CisgIHByaW50ZigiICAgICAgICAgICAgdGhlIEFscGhhLCBSZWQsIEdyZWVuIGFuZCBCbHVlIGNvbXBvbmVudCB2YWx1ZXMgIgorICAgICAgICAgInJlc3BlY3RpdmVseVxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgW0RlZmF1bHQ6IDI1NSwyNTUsMjU1LDI1NV1cbiIpOworCisgIHByaW50ZigiXG5JTlBVVCAmIE9VVFBVVCBhcmUgaW4gV2ViUCBmb3JtYXQuXG4iKTsKKworICBwcmludGYoIlxuTm90ZTogVGhlIG5hdHVyZSBvZiBFWElGLCBYTVAgYW5kIElDQyBkYXRhIGlzIG5vdCBjaGVja2VkIik7CisgIHByaW50ZigiIGFuZCBpcyBhc3N1bWVkIHRvIGJlXG52YWxpZC5cbiIpOworICBwcmludGYoIlxuTm90ZTogaWYgYSBzaW5nbGUgZmlsZSBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgYXJndW1lbnQsIHRoZSAiCisgICAgICAgICAiYXJndW1lbnRzIHdpbGwgYmVcbiIpOworICBwcmludGYoInRva2VuaXplZCBmcm9tIHRoaXMgZmlsZS4gVGhlIGZpbGUgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIKKyAgICAgICAgICJ0aGUgY2hhcmFjdGVyICctJy5cbiIpOworfQorCitzdGF0aWMgdm9pZCBXYXJuQWJvdXRPZGRPZmZzZXQoY29uc3QgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgaW5mbykgeworICBpZiAoKGluZm8tPnhfb2Zmc2V0IHwgaW5mby0+eV9vZmZzZXQpICYgMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogb2RkIG9mZnNldHMgd2lsbCBiZSBzbmFwcGVkIHRvIGV2ZW4gdmFsdWVzIgorICAgICAgICAgICAgIiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwgaW5mby0+eF9vZmZzZXQsIGluZm8tPnlfb2Zmc2V0LAorICAgICAgICAgICAgaW5mby0+eF9vZmZzZXQgJiB+MSwgaW5mby0+eV9vZmZzZXQgJiB+MSk7CisgIH0KK30KKworc3RhdGljIGludCBDcmVhdGVNdXgoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsIFdlYlBNdXgqKiBtdXgpIHsKKyAgV2ViUERhdGEgYml0c3RyZWFtOworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBpZiAoIUV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShmaWxlbmFtZSwgJmJpdHN0cmVhbSkpIHJldHVybiAwOworICAqbXV4ID0gV2ViUE11eENyZWF0ZSgmYml0c3RyZWFtLCAxKTsKKyAgV2ViUERhdGFDbGVhcigmYml0c3RyZWFtKTsKKyAgaWYgKCptdXggIT0gTlVMTCkgcmV0dXJuIDE7CisgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSBtdXggb2JqZWN0IGZyb20gZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVEYXRhKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBXZWJQRGF0YSogY29uc3Qgd2VicGRhdGEpIHsKKyAgaW50IG9rID0gMDsKKyAgRklMRSogZm91dCA9IHN0cmNtcChmaWxlbmFtZSwgIi0iKSA/IGZvcGVuKGZpbGVuYW1lLCAid2IiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShzdGRvdXQpOworICBpZiAoZm91dCA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBXZWJQIGZpbGUgJXMhXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGZ3cml0ZSh3ZWJwZGF0YS0+Ynl0ZXMsIHdlYnBkYXRhLT5zaXplLCAxLCBmb3V0KSAhPSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIGZpbGUgJXMhXG4iLCBmaWxlbmFtZSk7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZCBmaWxlICVzICglZCBieXRlcylcbiIsCisgICAgICAgICAgICBmaWxlbmFtZSwgKGludCl3ZWJwZGF0YS0+c2l6ZSk7CisgICAgb2sgPSAxOworICB9CisgIGlmIChmb3V0ICE9IHN0ZG91dCkgZmNsb3NlKGZvdXQpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVXZWJQKFdlYlBNdXgqIGNvbnN0IG11eCwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgaW50IG9rOworICBXZWJQRGF0YSB3ZWJwX2RhdGE7CisgIGNvbnN0IFdlYlBNdXhFcnJvciBlcnIgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCAmd2VicF9kYXRhKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgKCVzKSBhc3NlbWJsaW5nIHRoZSBXZWJQIGZpbGUuXG4iLCBFcnJvclN0cmluZyhlcnIpKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBvayA9IFdyaXRlRGF0YShmaWxlbmFtZSwgJndlYnBfZGF0YSk7CisgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIFdlYlBNdXgqIER1cGxpY2F0ZU11eEhlYWRlcihjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgV2ViUE11eCogbmV3X211eCA9IFdlYlBNdXhOZXcoKTsKKyAgV2ViUE11eEFuaW1QYXJhbXMgcDsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgaW50IGk7CisgIGludCBvayA9IDE7CisKKyAgaWYgKG5ld19tdXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgZXJyID0gV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcyhtdXgsICZwKTsKKyAgaWYgKGVyciA9PSBXRUJQX01VWF9PSykgeworICAgIGVyciA9IFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMobmV3X211eCwgJnApOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIEVSUk9SX0dPVE8yKCJFcnJvciAoJXMpIGhhbmRsaW5nIGFuaW1hdGlvbiBwYXJhbXMuXG4iLAorICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwgRW5kKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogaXQgbWlnaHQgbm90IGJlIGFuIGFuaW1hdGlvbi4gSnVzdCBrZWVwIG1vdmluZy4gKi8KKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPD0gMzsgKytpKSB7CisgICAgV2ViUERhdGEgbWV0YWRhdGE7CisgICAgZXJyID0gV2ViUE11eEdldENodW5rKG11eCwga0ZvdXJjY0xpc3RbaV0sICZtZXRhZGF0YSk7CisgICAgaWYgKGVyciA9PSBXRUJQX01VWF9PSyAmJiBtZXRhZGF0YS5zaXplID4gMCkgeworICAgICAgZXJyID0gV2ViUE11eFNldENodW5rKG5ld19tdXgsIGtGb3VyY2NMaXN0W2ldLCAmbWV0YWRhdGEsIDEpOworICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICBFUlJPUl9HT1RPMSgiRXJyb3IgdHJhbnNmZXJyaW5nIG1ldGFkYXRhIGluIER1cGxpY2F0ZU11eCgpLiIsIEVuZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBXZWJQTXV4RGVsZXRlKG5ld19tdXgpOworICAgIG5ld19tdXggPSBOVUxMOworICB9CisgIHJldHVybiBuZXdfbXV4OworfQorCitzdGF0aWMgaW50IFBhcnNlRnJhbWVBcmdzKGNvbnN0IGNoYXIqIGFyZ3MsIFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGluZm8pIHsKKyAgaW50IGRpc3Bvc2VfbWV0aG9kLCBkdW1teTsKKyAgY2hhciBwbHVzX21pbnVzLCBibGVuZF9tZXRob2Q7CisgIGNvbnN0IGludCBudW1fYXJncyA9IHNzY2FuZihhcmdzLCAiKyVkKyVkKyVkKyVkJWMlYyslZCIsICZpbmZvLT5kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLT54X29mZnNldCwgJmluZm8tPnlfb2Zmc2V0LCAmZGlzcG9zZV9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGx1c19taW51cywgJmJsZW5kX21ldGhvZCwgJmR1bW15KTsKKyAgc3dpdGNoIChudW1fYXJncykgeworICAgIGNhc2UgMToKKyAgICAgIGluZm8tPnhfb2Zmc2V0ID0gaW5mby0+eV9vZmZzZXQgPSAwOyAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSAzOgorICAgICAgZGlzcG9zZV9tZXRob2QgPSAwOyAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSA0OgorICAgICAgcGx1c19taW51cyA9ICcrJzsKKyAgICAgIGJsZW5kX21ldGhvZCA9ICdiJzsgIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgNjoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICBjYXNlIDU6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgV2FybkFib3V0T2RkT2Zmc2V0KGluZm8pOworCisgIC8vIE5vdGU6IFRoZSBzYW5pdHkgb2YgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9uIGlzIGNoZWNrZWQgYnkKKyAgLy8gV2ViUE11eFB1c2hGcmFtZSgpLgorICBpbmZvLT5kaXNwb3NlX21ldGhvZCA9IChXZWJQTXV4QW5pbURpc3Bvc2UpZGlzcG9zZV9tZXRob2Q7CisKKyAgaWYgKGJsZW5kX21ldGhvZCAhPSAnYicpIHJldHVybiAwOworICBpZiAocGx1c19taW51cyAhPSAnLScgJiYgcGx1c19taW51cyAhPSAnKycpIHJldHVybiAwOworICBpbmZvLT5ibGVuZF9tZXRob2QgPQorICAgICAgKHBsdXNfbWludXMgPT0gJysnKSA/IFdFQlBfTVVYX0JMRU5EIDogV0VCUF9NVVhfTk9fQkxFTkQ7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFBhcnNlQmdjb2xvckFyZ3MoY29uc3QgY2hhciogYXJncywgdWludDMyX3QqIGNvbnN0IGJnY29sb3IpIHsKKyAgdWludDMyX3QgYSwgciwgZywgYjsKKyAgaWYgKHNzY2FuZihhcmdzLCAiJXUsJXUsJXUsJXUiLCAmYSwgJnIsICZnLCAmYikgIT0gNCkgcmV0dXJuIDA7CisgIGlmIChhID49IDI1NiB8fCByID49IDI1NiB8fCBnID49IDI1NiB8fCBiID49IDI1NikgcmV0dXJuIDA7CisgICpiZ2NvbG9yID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYiA8PCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGVhbi11cC4KKworc3RhdGljIHZvaWQgRGVsZXRlQ29uZmlnKENvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGlmIChjb25maWcgIT0gTlVMTCkgeworICAgIGZyZWUoY29uZmlnLT5hcmdzXyk7CisgICAgRXhVdGlsRGVsZXRlQ29tbWFuZExpbmVBcmd1bWVudHMoJmNvbmZpZy0+Y21kX2FyZ3NfKTsKKyAgICBtZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoKmNvbmZpZykpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJzaW5nLgorCisvLyBCYXNpYyBzeW50YWN0aWMgY2hlY2tzIG9uIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorLy8gUmV0dXJucyAxIG9uIHZhbGlkLCAwIG90aGVyd2lzZS4KKy8vIEFsc28gZmlsbHMgdXAgbnVtX2ZlYXR1cmVfYXJncyB0byBiZSBudW1iZXIgb2YgZmVhdHVyZSBhcmd1bWVudHMgZ2l2ZW4uCisvLyAoZS5nLiBpZiB0aGVyZSBhcmUgNCAnLWZyYW1lJ3MgYW5kIDEgJy1sb29wJywgdGhlbiBudW1fZmVhdHVyZV9hcmdzID0gNSkuCitzdGF0aWMgaW50IFZhbGlkYXRlQ29tbWFuZExpbmUoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGNtZF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtX2ZlYXR1cmVfYXJncykgeworICBpbnQgbnVtX2ZyYW1lX2FyZ3M7CisgIGludCBudW1fbG9vcF9hcmdzOworICBpbnQgbnVtX2JnY29sb3JfYXJnczsKKyAgaW50IG51bV9kdXJhdGlvbnNfYXJnczsKKyAgaW50IG9rID0gMTsKKworICBhc3NlcnQobnVtX2ZlYXR1cmVfYXJncyAhPSBOVUxMKTsKKyAgKm51bV9mZWF0dXJlX2FyZ3MgPSAwOworCisgIC8vIFNpbXBsZSBjaGVja3MuCisgIGlmIChDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWdldCIpID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgJy1nZXQnIGFyZ3VtZW50cyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItc2V0IikgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSAnLXNldCcgYXJndW1lbnRzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAoQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1zdHJpcCIpID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgJy1zdHJpcCcgYXJndW1lbnRzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAoQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1pbmZvIikgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSAnLWluZm8nIGFyZ3VtZW50cyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItbyIpID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgb3V0cHV0IGZpbGVzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorCisgIC8vIENvbXBvdW5kIGNoZWNrcy4KKyAgbnVtX2ZyYW1lX2FyZ3MgPSBDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWZyYW1lIik7CisgIG51bV9sb29wX2FyZ3MgPSBDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWxvb3AiKTsKKyAgbnVtX2JnY29sb3JfYXJncyA9IENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItYmdjb2xvciIpOworICBudW1fZHVyYXRpb25zX2FyZ3MgPSBDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWR1cmF0aW9uIik7CisKKyAgaWYgKG51bV9sb29wX2FyZ3MgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBsb29wIGNvdW50cyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKG51bV9iZ2NvbG9yX2FyZ3MgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBiYWNrZ3JvdW5kIGNvbG9ycyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKworICBpZiAoKG51bV9mcmFtZV9hcmdzID09IDApICYmIChudW1fbG9vcF9hcmdzICsgbnVtX2JnY29sb3JfYXJncyA+IDApKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBMb29wIGNvdW50IGFuZCBiYWNrZ3JvdW5kIGNvbG9yIGFyZSByZWxldmFudCBvbmx5IGluICIKKyAgICAgICAgICAgICAgICAiY2FzZSBvZiBhbmltYXRpb24uXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKG51bV9kdXJhdGlvbnNfYXJncyA+IDAgJiYgbnVtX2ZyYW1lX2FyZ3MgIT0gMCkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogQ2FuIG5vdCBjb21iaW5lIC1kdXJhdGlvbiBhbmQgLWZyYW1lIGNvbW1hbmRzLlxuIiwKKyAgICAgICAgICAgICAgICBFcnJWYWxpZGF0ZSk7CisgIH0KKworICBhc3NlcnQob2sgPT0gMSk7CisgIGlmIChudW1fZHVyYXRpb25zX2FyZ3MgPiAwKSB7CisgICAgKm51bV9mZWF0dXJlX2FyZ3MgPSBudW1fZHVyYXRpb25zX2FyZ3M7CisgIH0gZWxzZSBpZiAobnVtX2ZyYW1lX2FyZ3MgPT0gMCkgeworICAgIC8vIFNpbmdsZSBhcmd1bWVudCAoJ3NldCcgYWN0aW9uIGZvciBJQ0NQL0VYSUYvWE1QLCBPUiBhICdnZXQnIGFjdGlvbikuCisgICAgKm51bV9mZWF0dXJlX2FyZ3MgPSAxOworICB9IGVsc2UgeworICAgIC8vIE11bHRpcGxlIGFyZ3VtZW50cyAoJ3NldCcgYWN0aW9uIGZvciBhbmltYXRpb24pCisgICAgKm51bV9mZWF0dXJlX2FyZ3MgPSBudW1fZnJhbWVfYXJncyArIG51bV9sb29wX2FyZ3MgKyBudW1fYmdjb2xvcl9hcmdzOworICB9CisKKyBFcnJWYWxpZGF0ZToKKyAgcmV0dXJuIG9rOworfQorCisjZGVmaW5lIEFDVElPTl9JU19OSUwgKGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IE5JTF9BQ1RJT04pCisKKyNkZWZpbmUgRkVBVFVSRVRZUEVfSVNfTklMIChjb25maWctPnR5cGVfID09IE5JTF9GRUFUVVJFKQorCisjZGVmaW5lIENIRUNLX05VTV9BUkdTX0xFU1MoTlVNLCBMQUJFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYXJnYyA8IGkgKyAoTlVNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBUb28gZmV3IGFyZ3VtZW50cyBmb3IgJyVzJy5cbiIsIGFyZ3ZbaV0pOyAgICBcCisgICAgZ290byBMQUJFTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgQ0hFQ0tfTlVNX0FSR1NfTk9UX0VRVUFMKE5VTSwgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChhcmdjICE9IGkgKyAoTlVNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgJyVzJy5cbiIsIGFyZ3ZbaV0pOyAgIFwKKyAgICBnb3RvIExBQkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gUGFyc2VzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gZmlsbCB1cCBjb25maWcgb2JqZWN0LiBBbHNvIHBlcmZvcm1zIHNvbWUKKy8vIHNlbWFudGljIGNoZWNrcy4KK3N0YXRpYyBpbnQgUGFyc2VDb21tYW5kTGluZShDb25maWcqIGNvbmZpZykgeworICBpbnQgaSA9IDA7CisgIGludCBmZWF0dXJlX2FyZ19pbmRleCA9IDA7CisgIGludCBvayA9IDE7CisgIGludCBhcmdjID0gY29uZmlnLT5jbWRfYXJnc18uYXJnY187CisgIGNvbnN0IGNoYXIqIGNvbnN0KiBhcmd2ID0gY29uZmlnLT5jbWRfYXJnc18uYXJndl87CisKKyAgd2hpbGUgKGkgPCBhcmdjKSB7CisgICAgRmVhdHVyZUFyZyogY29uc3QgYXJnID0gJmNvbmZpZy0+YXJnc19bZmVhdHVyZV9hcmdfaW5kZXhdOworICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeyAgLy8gT25lIG9mIHRoZSBhY3Rpb24gdHlwZXMgb3Igb3V0cHV0LgorICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1zZXQiKSkgeworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCkgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX1NFVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWR1cmF0aW9uIikpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygyLCBFcnJQYXJzZSk7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMIHx8IGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IEFDVElPTl9EVVJBVElPTikgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX0RVUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZFQVRVUkVUWVBFX0lTX05JTCB8fCBjb25maWctPnR5cGVfID09IEZFQVRVUkVfRFVSQVRJT04pIHsKKyAgICAgICAgICBjb25maWctPnR5cGVfID0gRkVBVFVSRV9EVVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGZlYXR1cmVzIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBhcmctPnBhcmFtc18gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgKytmZWF0dXJlX2FyZ19pbmRleDsKKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZ2V0IikpIHsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwpIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9HRVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1zdHJpcCIpKSB7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fU1RSSVA7CisgICAgICAgICAgY29uZmlnLT5hcmdfY291bnRfID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWZyYW1lIikpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygzLCBFcnJQYXJzZSk7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMIHx8IGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IEFDVElPTl9TRVQpIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9TRVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRkVBVFVSRVRZUEVfSVNfTklMIHx8IGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9BTk1GKSB7CisgICAgICAgICAgY29uZmlnLT50eXBlXyA9IEZFQVRVUkVfQU5NRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGZlYXR1cmVzIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBhcmctPnN1YnR5cGVfID0gU1VCVFlQRV9BTk1GOworICAgICAgICBhcmctPmZpbGVuYW1lXyA9IGFyZ3ZbaSArIDFdOworICAgICAgICBhcmctPnBhcmFtc18gPSBhcmd2W2kgKyAyXTsKKyAgICAgICAgKytmZWF0dXJlX2FyZ19pbmRleDsKKyAgICAgICAgaSArPSAzOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbG9vcCIpIHx8ICFzdHJjbXAoYXJndltpXSwgIi1iZ2NvbG9yIikpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygyLCBFcnJQYXJzZSk7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMIHx8IGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IEFDVElPTl9TRVQpIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9TRVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRkVBVFVSRVRZUEVfSVNfTklMIHx8IGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9BTk1GKSB7CisgICAgICAgICAgY29uZmlnLT50eXBlXyA9IEZFQVRVUkVfQU5NRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGZlYXR1cmVzIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBhcmctPnN1YnR5cGVfID0KKyAgICAgICAgICAgICFzdHJjbXAoYXJndltpXSwgIi1sb29wIikgPyBTVUJUWVBFX0xPT1AgOiBTVUJUWVBFX0JHQ09MT1I7CisgICAgICAgIGFyZy0+cGFyYW1zXyA9IGFyZ3ZbaSArIDFdOworICAgICAgICArK2ZlYXR1cmVfYXJnX2luZGV4OworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vIikpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygyLCBFcnJQYXJzZSk7CisgICAgICAgIGNvbmZpZy0+b3V0cHV0XyA9IGFyZ3ZbaSArIDFdOworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1pbmZvIikpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTk9UX0VRVUFMKDIsIEVyclBhcnNlKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+YWN0aW9uX3R5cGVfICE9IE5JTF9BQ1RJT04pIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX0lORk87CisgICAgICAgICAgY29uZmlnLT5hcmdfY291bnRfID0gMDsKKyAgICAgICAgICBjb25maWctPmlucHV0XyA9IGFyZ3ZbaSArIDFdOworICAgICAgICB9CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICItaGVscCIpKSB7CisgICAgICAgIFByaW50SGVscCgpOworICAgICAgICBEZWxldGVDb25maWcoY29uZmlnKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXZlcnNpb24iKSkgeworICAgICAgICBjb25zdCBpbnQgdmVyc2lvbiA9IFdlYlBHZXRNdXhWZXJzaW9uKCk7CisgICAgICAgIHByaW50ZigiJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgICAodmVyc2lvbiA+PiAxNikgJiAweGZmLCAodmVyc2lvbiA+PiA4KSAmIDB4ZmYsIHZlcnNpb24gJiAweGZmKTsKKyAgICAgICAgRGVsZXRlQ29uZmlnKGNvbmZpZyk7CisgICAgICAgIGV4aXQoMCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpIHsKKyAgICAgICAgaWYgKGkgPCBhcmdjIC0gMSkgeworICAgICAgICAgICsraTsKKyAgICAgICAgICBpZiAoY29uZmlnLT5pbnB1dF8gPT0gTlVMTCkgeworICAgICAgICAgICAgY29uZmlnLT5pbnB1dF8gPSBhcmd2W2ldOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1IgYXQgJyVzJzogTXVsdGlwbGUgaW5wdXQgZmlsZXMgc3BlY2lmaWVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0sIEVyclBhcnNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICBFUlJPUl9HT1RPMigiRVJST1I6IFVua25vd24gb3B0aW9uOiAnJXMnLlxuIiwgYXJndltpXSwgRXJyUGFyc2UpOworICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyBPbmUgb2YgdGhlIGZlYXR1cmUgdHlwZXMgb3IgaW5wdXQuCisgICAgICBpZiAoQUNUSU9OX0lTX05JTCkgeworICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEFjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBiZWZvcmUgb3RoZXIgYXJndW1lbnRzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgRXJyUGFyc2UpOworICAgICAgfQorICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgImljYyIpIHx8ICFzdHJjbXAoYXJndltpXSwgImV4aWYiKSB8fAorICAgICAgICAgICFzdHJjbXAoYXJndltpXSwgInhtcCIpKSB7CisgICAgICAgIGlmIChGRUFUVVJFVFlQRV9JU19OSUwpIHsKKyAgICAgICAgICBjb25maWctPnR5cGVfID0gKCFzdHJjbXAoYXJndltpXSwgImljYyIpKSA/IEZFQVRVUkVfSUNDUCA6CisgICAgICAgICAgICAgICghc3RyY21wKGFyZ3ZbaV0sICJleGlmIikpID8gRkVBVFVSRV9FWElGIDogRkVBVFVSRV9YTVA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBmZWF0dXJlcyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IEFDVElPTl9TRVQpIHsKKyAgICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDIsIEVyclBhcnNlKTsKKyAgICAgICAgICBhcmctPmZpbGVuYW1lXyA9IGFyZ3ZbaSArIDFdOworICAgICAgICAgICsrZmVhdHVyZV9hcmdfaW5kZXg7CisgICAgICAgICAgaSArPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJmcmFtZSIpICYmCisgICAgICAgICAgICAgICAgIChjb25maWctPmFjdGlvbl90eXBlXyA9PSBBQ1RJT05fR0VUKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDIsIEVyclBhcnNlKTsKKyAgICAgICAgY29uZmlnLT50eXBlXyA9IEZFQVRVUkVfQU5NRjsKKyAgICAgICAgYXJnLT5wYXJhbXNfID0gYXJndltpICsgMV07CisgICAgICAgICsrZmVhdHVyZV9hcmdfaW5kZXg7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0gZWxzZSB7ICAvLyBBc3N1bWUgaW5wdXQgZmlsZS4KKyAgICAgICAgaWYgKGNvbmZpZy0+aW5wdXRfID09IE5VTEwpIHsKKyAgICAgICAgICBjb25maWctPmlucHV0XyA9IGFyZ3ZbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SIGF0ICclcyc6IE11bHRpcGxlIGlucHV0IGZpbGVzIHNwZWNpZmllZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXJndltpXSwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyBFcnJQYXJzZToKKyAgcmV0dXJuIG9rOworfQorCisvLyBBZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBjb25maWcgaXMgZmlsbGVkLgorc3RhdGljIGludCBWYWxpZGF0ZUNvbmZpZyhDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpbnQgb2sgPSAxOworCisgIC8vIEFjdGlvbi4KKyAgaWYgKEFDVElPTl9JU19OSUwpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE5vIGFjdGlvbiBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZTIpOworICB9CisKKyAgLy8gRmVhdHVyZSB0eXBlLgorICBpZiAoRkVBVFVSRVRZUEVfSVNfTklMICYmIGNvbmZpZy0+YWN0aW9uX3R5cGVfICE9IEFDVElPTl9JTkZPKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBObyBmZWF0dXJlIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlMik7CisgIH0KKworICAvLyBJbnB1dCBmaWxlLgorICBpZiAoY29uZmlnLT5pbnB1dF8gPT0gTlVMTCkgeworICAgIGlmIChjb25maWctPmFjdGlvbl90eXBlXyAhPSBBQ1RJT05fU0VUKSB7CisgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUyKTsKKyAgICB9IGVsc2UgaWYgKGNvbmZpZy0+dHlwZV8gIT0gRkVBVFVSRV9BTk1GKSB7CisgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUyKTsKKyAgICB9CisgIH0KKworICAvLyBPdXRwdXQgZmlsZS4KKyAgaWYgKGNvbmZpZy0+b3V0cHV0XyA9PSBOVUxMICYmIGNvbmZpZy0+YWN0aW9uX3R5cGVfICE9IEFDVElPTl9JTkZPKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBObyBvdXRwdXQgZmlsZSBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZTIpOworICB9CisKKyBFcnJWYWxpZGF0ZTI6CisgIHJldHVybiBvazsKK30KKworLy8gQ3JlYXRlIGNvbmZpZyBvYmplY3QgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorc3RhdGljIGludCBJbml0aWFsaXplQ29uZmlnKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaW50IG51bV9mZWF0dXJlX2FyZ3MgPSAwOworICBpbnQgb2s7CisKKyAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKKworICBvayA9IEV4VXRpbEluaXRDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdjLCBhcmd2LCAmY29uZmlnLT5jbWRfYXJnc18pOworICBpZiAoIW9rKSByZXR1cm4gMDsKKworICAvLyBWYWxpZGF0ZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorICBpZiAoIVZhbGlkYXRlQ29tbWFuZExpbmUoJmNvbmZpZy0+Y21kX2FyZ3NfLCAmbnVtX2ZlYXR1cmVfYXJncykpIHsKKyAgICBFUlJPUl9HT1RPMSgiRXhpdGluZyBkdWUgdG8gY29tbWFuZC1saW5lIHBhcnNpbmcgZXJyb3IuXG4iLCBFcnIxKTsKKyAgfQorCisgIGNvbmZpZy0+YXJnX2NvdW50XyA9IG51bV9mZWF0dXJlX2FyZ3M7CisgIGNvbmZpZy0+YXJnc18gPSAoRmVhdHVyZUFyZyopY2FsbG9jKG51bV9mZWF0dXJlX2FyZ3MsIHNpemVvZigqY29uZmlnLT5hcmdzXykpOworICBpZiAoY29uZmlnLT5hcmdzXyA9PSBOVUxMKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIsIEVycjEpOworICB9CisKKyAgLy8gUGFyc2UgY29tbWFuZC1saW5lLgorICBpZiAoIVBhcnNlQ29tbWFuZExpbmUoY29uZmlnKSB8fCAhVmFsaWRhdGVDb25maWcoY29uZmlnKSkgeworICAgIEVSUk9SX0dPVE8xKCJFeGl0aW5nIGR1ZSB0byBjb21tYW5kLWxpbmUgcGFyc2luZyBlcnJvci5cbiIsIEVycjEpOworICB9CisKKyBFcnIxOgorICByZXR1cm4gb2s7Cit9CisKKyN1bmRlZiBBQ1RJT05fSVNfTklMCisjdW5kZWYgRkVBVFVSRVRZUEVfSVNfTklMCisjdW5kZWYgQ0hFQ0tfTlVNX0FSR1NfTEVTUworI3VuZGVmIENIRUNLX05VTV9BUkdTX01PUkUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByb2Nlc3NpbmcuCisKK3N0YXRpYyBpbnQgR2V0RnJhbWUoY29uc3QgV2ViUE11eCogbXV4LCBjb25zdCBDb25maWcqIGNvbmZpZykgeworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfT0s7CisgIFdlYlBNdXgqIG11eF9zaW5nbGUgPSBOVUxMOworICBpbnQgbnVtID0gMDsKKyAgaW50IG9rID0gMTsKKyAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgY29uc3QgV2ViUENodW5rSWQgaWQgPSBXRUJQX0NIVU5LX0FOTUY7CisgIFdlYlBNdXhGcmFtZUluZm8gaW5mbzsKKyAgV2ViUERhdGFJbml0KCZpbmZvLmJpdHN0cmVhbSk7CisKKyAgbnVtID0gRXhVdGlsR2V0SW50KGNvbmZpZy0+YXJnc19bMF0ucGFyYW1zXywgMTAsICZwYXJzZV9lcnJvcik7CisgIGlmIChudW0gPCAwKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBGcmFtZS9GcmFnbWVudCBpbmRleCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS5cbiIsIEVyckdldCk7CisgIH0KKyAgaWYgKHBhcnNlX2Vycm9yKSBnb3RvIEVyckdldDsKKworICBlcnIgPSBXZWJQTXV4R2V0RnJhbWUobXV4LCBudW0sICZpbmZvKTsKKyAgaWYgKGVyciA9PSBXRUJQX01VWF9PSyAmJiBpbmZvLmlkICE9IGlkKSBlcnIgPSBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICBFUlJPUl9HT1RPMygiRVJST1IgKCVzKTogQ291bGQgbm90IGdldCBmcmFtZSAlZC5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwgbnVtLCBFcnJHZXQpOworICB9CisKKyAgbXV4X3NpbmdsZSA9IFdlYlBNdXhOZXcoKTsKKyAgaWYgKG11eF9zaW5nbGUgPT0gTlVMTCkgeworICAgIGVyciA9IFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKyAgICBFUlJPUl9HT1RPMigiRVJST1IgKCVzKTogQ291bGQgbm90IGFsbG9jYXRlIGEgbXV4IG9iamVjdC5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwgRXJyR2V0KTsKKyAgfQorICBlcnIgPSBXZWJQTXV4U2V0SW1hZ2UobXV4X3NpbmdsZSwgJmluZm8uYml0c3RyZWFtLCAxKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgIEVSUk9SX0dPVE8yKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgY3JlYXRlIHNpbmdsZSBpbWFnZSBtdXggb2JqZWN0LlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBFcnJHZXQpOworICB9CisKKyAgb2sgPSBXcml0ZVdlYlAobXV4X3NpbmdsZSwgY29uZmlnLT5vdXRwdXRfKTsKKworIEVyckdldDoKKyAgV2ViUERhdGFDbGVhcigmaW5mby5iaXRzdHJlYW0pOworICBXZWJQTXV4RGVsZXRlKG11eF9zaW5nbGUpOworICByZXR1cm4gb2sgJiYgIXBhcnNlX2Vycm9yOworfQorCisvLyBSZWFkIGFuZCBwcm9jZXNzIGNvbmZpZy4KK3N0YXRpYyBpbnQgUHJvY2Vzcyhjb25zdCBDb25maWcqIGNvbmZpZykgeworICBXZWJQTXV4KiBtdXggPSBOVUxMOworICBXZWJQRGF0YSBjaHVuazsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX09LOworICBpbnQgb2sgPSAxOworCisgIHN3aXRjaCAoY29uZmlnLT5hY3Rpb25fdHlwZV8pIHsKKyAgICBjYXNlIEFDVElPTl9HRVQ6IHsKKyAgICAgIG9rID0gQ3JlYXRlTXV4KGNvbmZpZy0+aW5wdXRfLCAmbXV4KTsKKyAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIHN3aXRjaCAoY29uZmlnLT50eXBlXykgeworICAgICAgICBjYXNlIEZFQVRVUkVfQU5NRjoKKyAgICAgICAgICBvayA9IEdldEZyYW1lKG11eCwgY29uZmlnKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZFQVRVUkVfSUNDUDoKKyAgICAgICAgY2FzZSBGRUFUVVJFX0VYSUY6CisgICAgICAgIGNhc2UgRkVBVFVSRV9YTVA6CisgICAgICAgICAgZXJyID0gV2ViUE11eEdldENodW5rKG11eCwga0ZvdXJjY0xpc3RbY29uZmlnLT50eXBlX10sICZjaHVuayk7CisgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgICAgRVJST1JfR09UTzMoIkVSUk9SICglcyk6IENvdWxkIG5vdCBnZXQgdGhlICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIGtEZXNjcmlwdGlvbnNbY29uZmlnLT50eXBlX10sIEVycjIpOworICAgICAgICAgIH0KKyAgICAgICAgICBvayA9IFdyaXRlRGF0YShjb25maWctPm91dHB1dF8sICZjaHVuayk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEludmFsaWQgZmVhdHVyZSBmb3IgYWN0aW9uICdnZXQnLlxuIiwgRXJyMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBQ1RJT05fU0VUOiB7CisgICAgICBzd2l0Y2ggKGNvbmZpZy0+dHlwZV8pIHsKKyAgICAgICAgY2FzZSBGRUFUVVJFX0FOTUY6IHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBXZWJQTXV4QW5pbVBhcmFtcyBwYXJhbXMgPSB7IDB4RkZGRkZGRkYsIDAgfTsKKyAgICAgICAgICBtdXggPSBXZWJQTXV4TmV3KCk7CisgICAgICAgICAgaWYgKG11eCA9PSBOVUxMKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1IgKCVzKTogQ291bGQgbm90IGFsbG9jYXRlIGEgbXV4IG9iamVjdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhXRUJQX01VWF9NRU1PUllfRVJST1IpLCBFcnIyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+YXJnX2NvdW50XzsgKytpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbmZpZy0+YXJnc19baV0uc3VidHlwZV8pIHsKKyAgICAgICAgICAgICAgY2FzZSBTVUJUWVBFX0JHQ09MT1I6IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBiZ2NvbG9yOworICAgICAgICAgICAgICAgIG9rID0gUGFyc2VCZ2NvbG9yQXJncyhjb25maWctPmFyZ3NfW2ldLnBhcmFtc18sICZiZ2NvbG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IENvdWxkIG5vdCBwYXJzZSB0aGUgYmFja2dyb3VuZCBjb2xvciBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW1zLmJnY29sb3IgPSBiZ2NvbG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgU1VCVFlQRV9MT09QOiB7CisgICAgICAgICAgICAgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbG9vcF9jb3VudCA9CisgICAgICAgICAgICAgICAgICAgIEV4VXRpbEdldEludChjb25maWctPmFyZ3NfW2ldLnBhcmFtc18sIDEwLCAmcGFyc2VfZXJyb3IpOworICAgICAgICAgICAgICAgIGlmIChsb29wX2NvdW50IDwgMCB8fCBsb29wX2NvdW50ID4gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgaXMgb25seSBhICduZWNlc3NhcnknIGNvbmRpdGlvbiBmb3IgbG9vcF9jb3VudAorICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgdmFsaWQuIFRoZSAnc3VmZmljaWVudCcgY29uZGl0aW9uZWQgaW4gY2hlY2tlZCBpbgorICAgICAgICAgICAgICAgICAgLy8gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcygpIG1ldGhvZCBjYWxsZWQgbGF0ZXIuCisgICAgICAgICAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IExvb3AgY291bnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjU1MzUuXG4iLCBFcnIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2sgPSAhcGFyc2VfZXJyb3I7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgICAgICAgICAgIHBhcmFtcy5sb29wX2NvdW50ID0gbG9vcF9jb3VudDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIFNVQlRZUEVfQU5NRjogeworICAgICAgICAgICAgICAgIFdlYlBNdXhGcmFtZUluZm8gZnJhbWU7CisgICAgICAgICAgICAgICAgZnJhbWUuaWQgPSBXRUJQX0NIVU5LX0FOTUY7CisgICAgICAgICAgICAgICAgb2sgPSBFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoY29uZmlnLT5hcmdzX1tpXS5maWxlbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lLmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgICAgICAgICAgIG9rID0gUGFyc2VGcmFtZUFyZ3MoY29uZmlnLT5hcmdzX1tpXS5wYXJhbXNfLCAmZnJhbWUpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lLmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IENvdWxkIG5vdCBwYXJzZSBmcmFtZSBwcm9wZXJ0aWVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBXZWJQTXV4UHVzaEZyYW1lKG11eCwgJmZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBXZWJQRGF0YUNsZWFyKCZmcmFtZS5iaXRzdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICAgICAgICAgIEVSUk9SX0dPVE8zKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgYWRkIGEgZnJhbWUgYXQgaW5kZXggJWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiwgRXJyb3JTdHJpbmcoZXJyKSwgaSwgRXJyMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEludmFsaWQgc3VidHlwZSBmb3IgJ2ZyYW1lJyIsIEVycjIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVyciA9IFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMobXV4LCAmcGFyYW1zKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1IgKCVzKTogQ291bGQgbm90IHNldCBhbmltYXRpb24gcGFyYW1ldGVycy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBFcnIyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZFQVRVUkVfSUNDUDoKKyAgICAgICAgY2FzZSBGRUFUVVJFX0VYSUY6CisgICAgICAgIGNhc2UgRkVBVFVSRV9YTVA6IHsKKyAgICAgICAgICBvayA9IENyZWF0ZU11eChjb25maWctPmlucHV0XywgJm11eCk7CisgICAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgICAgIG9rID0gRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGNvbmZpZy0+YXJnc19bMF0uZmlsZW5hbWVfLCAmY2h1bmspOworICAgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgICAgICBlcnIgPSBXZWJQTXV4U2V0Q2h1bmsobXV4LCBrRm91cmNjTGlzdFtjb25maWctPnR5cGVfXSwgJmNodW5rLCAxKTsKKyAgICAgICAgICBmcmVlKCh2b2lkKiljaHVuay5ieXRlcyk7CisgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgICAgRVJST1JfR09UTzMoIkVSUk9SICglcyk6IENvdWxkIG5vdCBzZXQgdGhlICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIGtEZXNjcmlwdGlvbnNbY29uZmlnLT50eXBlX10sIEVycjIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBJbnZhbGlkIGZlYXR1cmUgZm9yIGFjdGlvbiAnc2V0Jy5cbiIsIEVycjIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBvayA9IFdyaXRlV2ViUChtdXgsIGNvbmZpZy0+b3V0cHV0Xyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBQ1RJT05fRFVSQVRJT046IHsKKyAgICAgIGludCBudW1fZnJhbWVzOworICAgICAgb2sgPSBDcmVhdGVNdXgoY29uZmlnLT5pbnB1dF8sICZtdXgpOworICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgZXJyID0gV2ViUE11eE51bUNodW5rcyhtdXgsIFdFQlBfQ0hVTktfQU5NRiwgJm51bV9mcmFtZXMpOworICAgICAgb2sgPSAoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBjYW4gbm90IHBhcnNlIHRoZSBudW1iZXIgb2YgZnJhbWVzLlxuIiwgRXJyMik7CisgICAgICB9CisgICAgICBpZiAobnVtX2ZyYW1lcyA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRG9lc24ndCBsb29rIGxpa2UgdGhlIHNvdXJjZSBpcyBhbmltYXRlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGR1cmF0aW9uIHNldHRpbmcuXG4iKTsKKyAgICAgICAgb2sgPSBXcml0ZVdlYlAobXV4LCBjb25maWctPm91dHB1dF8pOworICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50KiBkdXJhdGlvbnMgPSBOVUxMOworICAgICAgICBXZWJQTXV4KiBuZXdfbXV4ID0gRHVwbGljYXRlTXV4SGVhZGVyKG11eCk7CisgICAgICAgIGlmIChuZXdfbXV4ID09IE5VTEwpIGdvdG8gRXJyMjsKKyAgICAgICAgZHVyYXRpb25zID0gKGludCopbWFsbG9jKChzaXplX3QpbnVtX2ZyYW1lcyAqIHNpemVvZigqZHVyYXRpb25zKSk7CisgICAgICAgIGlmIChkdXJhdGlvbnMgPT0gTlVMTCkgZ290byBFcnIyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZyYW1lczsgKytpKSBkdXJhdGlvbnNbaV0gPSAtMTsKKworICAgICAgICAvLyBQYXJzZSBpbnRlcnZhbHMgdG8gcHJvY2Vzcy4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+YXJnX2NvdW50XzsgKytpKSB7CisgICAgICAgICAgaW50IGs7CisgICAgICAgICAgaW50IGFyZ3NbM107CisgICAgICAgICAgaW50IGR1cmF0aW9uLCBzdGFydCwgZW5kOworICAgICAgICAgIGNvbnN0IGludCBuYl9hcmdzID0gRXhVdGlsR2V0SW50cyhjb25maWctPmFyZ3NfW2ldLnBhcmFtc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAzLCBhcmdzKTsKKyAgICAgICAgICBvayA9IChuYl9hcmdzID49IDEpOworICAgICAgICAgIGlmICghb2spIGdvdG8gRXJyMzsKKyAgICAgICAgICBkdXJhdGlvbiA9IGFyZ3NbMF07CisgICAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgeworICAgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBkdXJhdGlvbiBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlLlxuIiwgRXJyMyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG5iX2FyZ3MgPT0gMSkgeyAgIC8vIG9ubHkgZHVyYXRpb24gaXMgcHJlc2VudCAtPiB1c2UgZnVsbCBpbnRlcnZhbAorICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgZW5kID0gbnVtX2ZyYW1lczsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnQgPSBhcmdzWzFdOworICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IDApIHsKKyAgICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+IG51bV9mcmFtZXMpIHsKKyAgICAgICAgICAgICAgc3RhcnQgPSBudW1fZnJhbWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kID0gKG5iX2FyZ3MgPj0gMykgPyBhcmdzWzJdIDogc3RhcnQ7CisgICAgICAgICAgICBpZiAoZW5kID09IDAgfHwgZW5kID4gbnVtX2ZyYW1lcykgZW5kID0gbnVtX2ZyYW1lczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGsgPSBzdGFydDsgayA8PSBlbmQ7ICsraykgeworICAgICAgICAgICAgYXNzZXJ0KGsgPj0gMSAmJiBrIDw9IG51bV9mcmFtZXMpOworICAgICAgICAgICAgZHVyYXRpb25zW2sgLSAxXSA9IGR1cmF0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGx5IG5vbi1uZWdhdGl2ZSBkdXJhdGlvbnMgdG8gdGhlaXIgZGVzdGluYXRpb24gZnJhbWVzLgorICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG51bV9mcmFtZXM7ICsraSkgeworICAgICAgICAgIFdlYlBNdXhGcmFtZUluZm8gZnJhbWU7CisgICAgICAgICAgZXJyID0gV2ViUE11eEdldEZyYW1lKG11eCwgaSwgJmZyYW1lKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LIHx8IGZyYW1lLmlkICE9IFdFQlBfQ0hVTktfQU5NRikgeworICAgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SOiBjYW4gbm90IHJldHJpZXZlIGZyYW1lICMlZC5cbiIsIGksIEVycjMpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZHVyYXRpb25zW2kgLSAxXSA+PSAwKSBmcmFtZS5kdXJhdGlvbiA9IGR1cmF0aW9uc1tpIC0gMV07CisgICAgICAgICAgZXJyID0gV2ViUE11eFB1c2hGcmFtZShuZXdfbXV4LCAmZnJhbWUsIDEpOworICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUjogZXJyb3IgcHVzaCBmcmFtZSBkYXRhICMlZFxuIiwgaSwgRXJyMyk7CisgICAgICAgICAgfQorICAgICAgICAgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lLmJpdHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgV2ViUE11eERlbGV0ZShtdXgpOworICAgICAgICBvayA9IFdyaXRlV2ViUChuZXdfbXV4LCBjb25maWctPm91dHB1dF8pOworICAgICAgICBtdXggPSBuZXdfbXV4OyAgLy8gdHJhbnNmZXIgZm9yIHRoZSBXZWJQTXV4RGVsZXRlKCkgY2FsbAorICAgICAgICBuZXdfbXV4ID0gTlVMTDsKKworIEVycjM6CisgICAgICAgIGZyZWUoZHVyYXRpb25zKTsKKyAgICAgICAgV2ViUE11eERlbGV0ZShuZXdfbXV4KTsKKyAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQUNUSU9OX1NUUklQOiB7CisgICAgICBvayA9IENyZWF0ZU11eChjb25maWctPmlucHV0XywgJm11eCk7CisgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICBpZiAoY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX0lDQ1AgfHwgY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX0VYSUYgfHwKKyAgICAgICAgICBjb25maWctPnR5cGVfID09IEZFQVRVUkVfWE1QKSB7CisgICAgICAgIGVyciA9IFdlYlBNdXhEZWxldGVDaHVuayhtdXgsIGtGb3VyY2NMaXN0W2NvbmZpZy0+dHlwZV9dKTsKKyAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgIEVSUk9SX0dPVE8zKCJFUlJPUiAoJXMpOiBDb3VsZCBub3Qgc3RyaXAgdGhlICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBrRGVzY3JpcHRpb25zW2NvbmZpZy0+dHlwZV9dLCBFcnIyKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBJbnZhbGlkIGZlYXR1cmUgZm9yIGFjdGlvbiAnc3RyaXAnLlxuIiwgRXJyMik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgb2sgPSBXcml0ZVdlYlAobXV4LCBjb25maWctPm91dHB1dF8pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQUNUSU9OX0lORk86IHsKKyAgICAgIG9rID0gQ3JlYXRlTXV4KGNvbmZpZy0+aW5wdXRfLCAmbXV4KTsKKyAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIG9rID0gKERpc3BsYXlJbmZvKG11eCkgPT0gV0VCUF9NVVhfT0spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGFzc2VydCgwKTsgIC8vIEludmFsaWQgYWN0aW9uLgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyBFcnIyOgorICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4uCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgQ29uZmlnIGNvbmZpZzsKKyAgaW50IG9rID0gSW5pdGlhbGl6ZUNvbmZpZyhhcmdjIC0gMSwgYXJndiArIDEsICZjb25maWcpOworICBpZiAob2spIHsKKyAgICBvayA9IFByb2Nlc3MoJmNvbmZpZyk7CisgIH0gZWxzZSB7CisgICAgUHJpbnRIZWxwKCk7CisgIH0KKyAgRGVsZXRlQ29uZmlnKCZjb25maWcpOworICByZXR1cm4gIW9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDU2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NCBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlid2VicGV4dHJhcy5sYQorCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi9zcmMvd2VicC90eXBlcy5oCisKK2xpYndlYnBleHRyYXNfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZXh0cmFzX2xhX1NPVVJDRVMgKz0gZXh0cmFzLmMgZXh0cmFzLmggcXVhbGl0eV9lc3RpbWF0ZS5jCisKK2xpYndlYnBleHRyYXNfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQorbGlid2VicGV4dHJhc19sYV9MREZMQUdTID0gLWxtCitsaWJ3ZWJwZXh0cmFzX2xhX0xJQkFERCA9IC4uL3NyYy9saWJ3ZWJwLmxhCisKK25vaW5zdF9QUk9HUkFNUyA9Citub2luc3RfUFJPR1JBTVMgKz0gd2VicF9xdWFsaXR5CitpZiBXQU5UX0RFTVVYCisgIG5vaW5zdF9QUk9HUkFNUyArPSBnZXRfZGlzdG8KK2VuZGlmCitpZiBCVUlMRF9WV0VCUF9TREwKKyAgbm9pbnN0X1BST0dSQU1TICs9IHZ3ZWJwX3NkbAorZW5kaWYKKworZ2V0X2Rpc3RvX1NPVVJDRVMgID0gZ2V0X2Rpc3RvLmMKK2dldF9kaXN0b19DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCitnZXRfZGlzdG9fTERBREQgPQorZ2V0X2Rpc3RvX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCitnZXRfZGlzdG9fTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWRlYy5sYQorZ2V0X2Rpc3RvX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitnZXRfZGlzdG9fTERBREQgKz0gJChQTkdfTElCUykgJChKUEVHX0xJQlMpICQoVElGRl9MSUJTKQorCit3ZWJwX3F1YWxpdHlfU09VUkNFUyAgPSB3ZWJwX3F1YWxpdHkuYword2VicF9xdWFsaXR5X0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK3dlYnBfcXVhbGl0eV9MREFERCA9Cit3ZWJwX3F1YWxpdHlfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK3dlYnBfcXVhbGl0eV9MREFERCArPSBsaWJ3ZWJwZXh0cmFzLmxhCit3ZWJwX3F1YWxpdHlfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKKwordndlYnBfc2RsX1NPVVJDRVMgID0gdndlYnBfc2RsLmMgd2VicF90b19zZGwuYyB3ZWJwX3RvX3NkbC5oCit2d2VicF9zZGxfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFNETF9JTkNMVURFUykKK3Z3ZWJwX3NkbF9MREFERCA9Cit2d2VicF9zZGxfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK3Z3ZWJwX3NkbF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQordndlYnBfc2RsX0xEQUREICs9ICQoU0RMX0xJQlMpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlYjU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuYwpAQCAtMCwwICsxLDE0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBBZGRpdGlvbmFsIFdlYlAgdXRpbGl0aWVzLgorLy8KKworI2luY2x1ZGUgImV4dHJhcy9leHRyYXMuaCIKKyNpbmNsdWRlICJ3ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFhUUkFfTUFKX1ZFUlNJT04gMQorI2RlZmluZSBYVFJBX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgWFRSQV9SRVZfVkVSU0lPTiAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQR2V0RXh0cmFzVmVyc2lvbih2b2lkKSB7CisgIHJldHVybiAoWFRSQV9NQUpfVkVSU0lPTiA8PCAxNikgfCAoWFRSQV9NSU5fVkVSU0lPTiA8PCA4KSB8IFhUUkFfUkVWX1ZFUlNJT047Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQSW1wb3J0R3JheShjb25zdCB1aW50OF90KiBncmF5X2RhdGEsIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHksIHdpZHRoLCB1dl93aWR0aDsKKyAgaWYgKHBpYyA9PSBOVUxMIHx8IGdyYXlfZGF0YSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGljLT5jb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjA7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWMpKSByZXR1cm4gMDsKKyAgd2lkdGggPSBwaWMtPndpZHRoOworICB1dl93aWR0aCA9ICh3aWR0aCArIDEpID4+IDE7CisgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgbWVtY3B5KHBpYy0+eSArIHkgKiBwaWMtPnlfc3RyaWRlLCBncmF5X2RhdGEsIHdpZHRoKTsKKyAgICBncmF5X2RhdGEgKz0gd2lkdGg7ICAgIC8vIDwtIHdlIGNvdWxkIHVzZSBzb21lICdkYXRhX3N0cmlkZScgaGVyZSBpZiBuZWVkZWQKKyAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICBtZW1zZXQocGljLT51ICsgKHkgPj4gMSkgKiBwaWMtPnV2X3N0cmlkZSwgMTI4LCB1dl93aWR0aCk7CisgICAgICBtZW1zZXQocGljLT52ICsgKHkgPj4gMSkgKiBwaWMtPnV2X3N0cmlkZSwgMTI4LCB1dl93aWR0aCk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUEltcG9ydFJHQjU2NShjb25zdCB1aW50OF90KiByZ2I1NjUsIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHgsIHk7CisgIHVpbnQzMl90KiBkc3Q7CisgIGlmIChwaWMgPT0gTlVMTCB8fCByZ2I1NjUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBpYy0+Y29sb3JzcGFjZSA9IFdFQlBfWVVWNDIwOworICBwaWMtPnVzZV9hcmdiID0gMTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpYykpIHJldHVybiAwOworICBkc3QgPSBwaWMtPmFyZ2I7CisgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiNTY1WzIgKiB4ICsgMV07CisgICAgICBjb25zdCB1aW50MzJfdCBnYiA9IHJnYjU2NVsyICogeCArIDBdOworI2Vsc2UKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiNTY1WzIgKiB4ICsgMF07CisgICAgICBjb25zdCB1aW50MzJfdCBnYiA9IHJnYjU2NVsyICogeCArIDFdOworI2VuZGlmCisgICAgICB1aW50MzJfdCByID0gcmcgJiAweGY4OworICAgICAgdWludDMyX3QgZyA9ICgocmcgPDwgNSkgfCAoZ2IgPj4gMykpICYgMHhmYzsKKyAgICAgIHVpbnQzMl90IGIgPSAoZ2IgPDwgNSk7CisgICAgICAvLyBkaXRoZXJpbmcKKyAgICAgIHIgPSByIHwgKHIgPj4gNSk7CisgICAgICBnID0gZyB8IChnID4+IDYpOworICAgICAgYiA9IGIgfCAoYiA+PiA1KTsKKyAgICAgIGRzdFt4XSA9ICgweGZmdSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CisgICAgfQorICAgIHJnYjU2NSArPSAyICogd2lkdGg7CisgICAgZHN0ICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQSW1wb3J0UkdCNDQ0NChjb25zdCB1aW50OF90KiByZ2I0NDQ0LCBXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB4LCB5OworICB1aW50MzJfdCogZHN0OworICBpZiAocGljID09IE5VTEwgfHwgcmdiNDQ0NCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGljLT5jb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjA7CisgIHBpYy0+dXNlX2FyZ2IgPSAxOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljKSkgcmV0dXJuIDA7CisgIGRzdCA9IHBpYy0+YXJnYjsKKyAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgICAgY29uc3QgdWludDMyX3QgcmcgPSByZ2I0NDQ0WzIgKiB4ICsgMV07CisgICAgICBjb25zdCB1aW50MzJfdCBiYSA9IHJnYjQ0NDRbMiAqIHggKyAwXTsKKyNlbHNlCisgICAgICBjb25zdCB1aW50MzJfdCByZyA9IHJnYjQ0NDRbMiAqIHggKyAwXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGJhID0gcmdiNDQ0NFsyICogeCArIDFdOworI2VuZGlmCisgICAgICB1aW50MzJfdCByID0gcmcgJiAweGYwOworICAgICAgdWludDMyX3QgZyA9IChyZyA8PCA0KTsKKyAgICAgIHVpbnQzMl90IGIgPSAoYmEgJiAweGYwKTsKKyAgICAgIHVpbnQzMl90IGEgPSAoYmEgPDwgNCk7CisgICAgICAvLyBkaXRoZXJpbmcKKyAgICAgIHIgPSByIHwgKHIgPj4gNCk7CisgICAgICBnID0gZyB8IChnID4+IDQpOworICAgICAgYiA9IGIgfCAoYiA+PiA0KTsKKyAgICAgIGEgPSBhIHwgKGEgPj4gNCk7CisgICAgICBkc3RbeF0gPSAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CisgICAgfQorICAgIHJnYjQ0NDQgKz0gMiAqIHdpZHRoOworICAgIGRzdCArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUEltcG9ydENvbG9yTWFwcGVkQVJHQihjb25zdCB1aW50OF90KiBpbmRleGVkLCBpbnQgaW5kZXhlZF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwYWxldHRlW10sIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB4LCB5OworICB1aW50MzJfdCogZHN0OworICAvLyAyNTYgYXMgdGhlIGlucHV0IGJ1ZmZlciBpcyB1aW50OF90LgorICBhc3NlcnQoTUFYX1BBTEVUVEVfU0laRSA8PSAyNTYpOworICBpZiAocGljID09IE5VTEwgfHwgaW5kZXhlZCA9PSBOVUxMIHx8IGluZGV4ZWRfc3RyaWRlIDwgcGljLT53aWR0aCB8fAorICAgICAgcGFsZXR0ZSA9PSBOVUxMIHx8IHBhbGV0dGVfc2l6ZSA+IE1BWF9QQUxFVFRFX1NJWkUgfHwgcGFsZXR0ZV9zaXplIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwaWMtPnVzZV9hcmdiID0gMTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpYykpIHJldHVybiAwOworICBkc3QgPSBwaWMtPmFyZ2I7CisgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSB3aXRoaW4gdGhlIHBhbGV0dGUuCisgICAgICBpZiAoaW5kZXhlZFt4XSA+PSBwYWxldHRlX3NpemUpIHsKKyAgICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpYyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZHN0W3hdID0gcGFsZXR0ZVtpbmRleGVkW3hdXTsKKyAgICB9CisgICAgaW5kZXhlZCArPSBpbmRleGVkX3N0cmlkZTsKKyAgICBkc3QgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ0MzdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKyNpZm5kZWYgV0VCUF9FWFRSQVNfRVhUUkFTX0hfCisjZGVmaW5lIFdFQlBfRVhUUkFTX0VYVFJBU19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisjZGVmaW5lIFdFQlBfRVhUUkFTX0FCSV9WRVJTSU9OIDB4MDAwMSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4dHJhcyBsaWJyYXJ5LCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcKKy8vIDhiaXRzIGZvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0RXh0cmFzVmVyc2lvbih2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFkLWhvYyBjb2xvcnNwYWNlIGltcG9ydGVycy4KKworLy8gSW1wb3J0IGx1bWEgc2FtcGxlIChncmF5IHNjYWxlIGltYWdlKSBpbnRvICdwaWN0dXJlJy4gVGhlICdwaWN0dXJlJworLy8gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCitXRUJQX0VYVEVSTiBpbnQgV2ViUEltcG9ydEdyYXkoY29uc3QgdWludDhfdCogZ3JheSwgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBJbXBvcnQgcmdiIHNhbXBsZSBpbiBSR0I1NjUgcGFja2VkIGZvcm1hdCBpbnRvICdwaWN0dXJlJy4gVGhlICdwaWN0dXJlJworLy8gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCitXRUJQX0VYVEVSTiBpbnQgV2ViUEltcG9ydFJHQjU2NShjb25zdCB1aW50OF90KiByZ2I1NjUsIFdlYlBQaWN0dXJlKiBwaWMpOworCisvLyBJbXBvcnQgcmdiIHNhbXBsZSBpbiBSR0I0NDQ0IHBhY2tlZCBmb3JtYXQgaW50byAncGljdHVyZScuIFRoZSAncGljdHVyZScKKy8vIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorV0VCUF9FWFRFUk4gaW50IFdlYlBJbXBvcnRSR0I0NDQ0KGNvbnN0IHVpbnQ4X3QqIHJnYjQ0NDQsIFdlYlBQaWN0dXJlKiBwaWMpOworCisvLyBJbXBvcnQgYSBjb2xvciBtYXBwZWQgaW1hZ2UuIFRoZSBudW1iZXIgb2YgY29sb3JzIGlzIGxlc3Mgb3IgZXF1YWwgdG8KKy8vIE1BWF9QQUxFVFRFX1NJWkUuICdwaWMnIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkLiBJdHMgY29udGVudCwgaWYgYW55LAorLy8gd2lsbCBiZSBkaXNjYXJkZWQuIFJldHVybnMgJ2ZhbHNlJyBpbiBjYXNlIG9mIGVycm9yLCBvciBpZiBpbmRleGVkW10gY29udGFpbnMKKy8vIGludmFsaWQgaW5kaWNlcy4KK1dFQlBfRVhURVJOIGludAorV2ViUEltcG9ydENvbG9yTWFwcGVkQVJHQihjb25zdCB1aW50OF90KiBpbmRleGVkLCBpbnQgaW5kZXhlZF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IHBhbGV0dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIHBpYyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBhcnNlIGEgYml0c3RyZWFtLCBzZWFyY2ggZm9yIFZQOCAobG9zc3kpIGhlYWRlciBhbmQgcmVwb3J0IGEKKy8vIHJvdWdoIGVzdGltYXRpb24gb2YgdGhlIHF1YWxpdHkgZmFjdG9yIHVzZWQgZm9yIGNvbXByZXNzaW5nIHRoZSBiaXRzdHJlYW0uCisvLyBJZiB0aGUgYml0c3RyZWFtIGlzIGluIGxvc3NsZXNzIGZvcm1hdCwgdGhlIHNwZWNpYWwgdmFsdWUgJzEwMScgaXMgcmV0dXJuZWQuCisvLyBPdGhlcndpc2UgKGxvc3N5IGJpdHN0cmVhbSksIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWzAuLjEwMF0uCisvLyBBbnkgZXJyb3IgKGludmFsaWQgYml0c3RyZWFtLCBhbmltYXRlZCBXZWJQLCBpbmNvbXBsZXRlIGhlYWRlciwgZXRjLikKKy8vIHdpbGwgcmV0dXJuIGEgdmFsdWUgb2YgLTEuCitXRUJQX0VYVEVSTiBpbnQgVlA4RXN0aW1hdGVRdWFsaXR5KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfRVhUUkFTX0VYVFJBU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2dldF9kaXN0by5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2dldF9kaXN0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDYxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZ2V0X2Rpc3RvLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTaW1wbGUgdG9vbCB0byBsb2FkIHR3byB3ZWJwL3BuZy9qcGcvdGlmZiBmaWxlcyBhbmQgY29tcHV0ZSBQU05SL1NTSU0uCisvLyBUaGlzIGlzIG1vc3RseSBhIHdyYXBwZXIgYXJvdW5kIFdlYlBQaWN0dXJlRGlzdG9ydGlvbigpLgorLy8KKy8qCisgZ2NjIC1vIGdldF9kaXN0byBnZXRfZGlzdG8uYyAtTzMgLUkuLi8gLUwuLi9leGFtcGxlcyAtTC4uL2ltYWdlaW8gXAorICAgIC1sZXhhbXBsZV91dGlsIC1saW1hZ2Vpb191dGlsIC1saW1hZ2VkZWMgLWx3ZWJwIC1ML29wdC9sb2NhbC9saWIgXAorICAgIC1scG5nIC1seiAtbGpwZWcgLWx0aWZmIC1sbSAtbHB0aHJlYWQKKyovCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgImltYWdlaW8vaW1hZ2VfZGVjLmgiCisjaW5jbHVkZSAiaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworc3RhdGljIHNpemVfdCBSZWFkUGljdHVyZShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICBXZWJQSW1hZ2VSZWFkZXIgcmVhZGVyID0gTlVMTDsKKyAgaW50IG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgaWYgKCFvaykgZ290byBFbmQ7CisKKyAgcGljLT51c2VfYXJnYiA9IDE7ICAvLyBmb3JjZSBBUkdCCisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgLy8gVHJ5IHRvIGRlY29kZSB0aGUgZmlsZSB1c2luZyBXSUMgZmFsbGluZyBiYWNrIHRvIHRoZSBvdGhlciByZWFkZXJzIGZvcgorICAvLyBlLmcuLCBXZWJQLgorICBvayA9IFJlYWRQaWN0dXJlV2l0aFdJQyhmaWxlbmFtZSwgcGljLCBrZWVwX2FscGhhLCBOVUxMKTsKKyAgaWYgKG9rKSBnb3RvIEVuZDsKKyNlbmRpZgorICByZWFkZXIgPSBXZWJQR3Vlc3NJbWFnZVJlYWRlcihkYXRhLCBkYXRhX3NpemUpOworICBvayA9IHJlYWRlcihkYXRhLCBkYXRhX3NpemUsIHBpYywga2VlcF9hbHBoYSwgTlVMTCk7CisKKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDb3VsZCBub3QgcHJvY2VzcyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgIH0KKyAgZnJlZSgodm9pZCopZGF0YSk7CisgIHJldHVybiBvayA/IGRhdGFfc2l6ZSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVQbGFuZSh1aW50OF90KiBwbGFuZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0cmlkZSwgaW50IHlfc3RyaWRlLCBpbnQgbWF4KSB7CisgIGNvbnN0IHVpbnQzMl90IGZhY3RvciA9IChtYXggPiAwKSA/ICgyNTV1IDw8IDE2KSAvIG1heCA6IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICB1aW50OF90KiBjb25zdCBwdHIgPSBwbGFuZSArIHkgKiB5X3N0cmlkZTsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGggKiB4X3N0cmlkZTsgeCArPSB4X3N0cmlkZSkgeworICAgICAgY29uc3QgdWludDMyX3QgZGlmZiA9IChwdHJbeF0gKiBmYWN0b3IgKyAoMSA8PCAxNSkpID4+IDE2OworICAgICAgcHRyW3hdID0gZGlmZjsKKyAgICB9CisgIH0KK30KKworLy8gUmV0dXJuIHRoZSBtYXggYWJzb2x1dGUgZGlmZmVyZW5jZS4KK3N0YXRpYyBpbnQgRGlmZlNjYWxlQ2hhbm5lbCh1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdHJpZGUsIGludCB3LCBpbnQgaCwgaW50IGRvX3NjYWxpbmcpIHsKKyAgaW50IHgsIHk7CisgIGludCBtYXggPSAwOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgdWludDhfdCogY29uc3QgcHRyMSA9IHNyYzEgKyB5ICogc3RyaWRlMTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBwdHIyID0gc3JjMiArIHkgKiBzdHJpZGUyOworICAgIGZvciAoeCA9IDA7IHggPCB3ICogeF9zdHJpZGU7IHggKz0geF9zdHJpZGUpIHsKKyAgICAgIGNvbnN0IGludCBkaWZmID0gYWJzKHB0cjFbeF0gLSBwdHIyW3hdKTsKKyAgICAgIGlmIChkaWZmID4gbWF4KSBtYXggPSBkaWZmOworICAgICAgcHRyMVt4XSA9IGRpZmY7CisgICAgfQorICB9CisKKyAgaWYgKGRvX3NjYWxpbmcpIFJlc2NhbGVQbGFuZShzcmMxLCB3LCBoLCB4X3N0cmlkZSwgc3RyaWRlMSwgbWF4KTsKKyAgcmV0dXJuIG1heDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTSU0gY2FsY3VsYXRpb24uIFdlIHJlLWltcGxlbWVudCB0aGVzZSBmdW5jdGlvbnMgaGVyZSwgb3V0IG9mIGRzcC8sIHRvIGF2b2lkCisvLyBicmVha2luZyB0aGUgbGlicmFyeSdzIGhpZGRlbiB2aXNpYmlsaXR5LiBUaGlzIGNvZGUgZHVwbGljYXRpb24gYXZvaWRzIHRoZQorLy8gYmlnZ2VyIGFubm95YW5jZSBvZiBoYXZpbmcgdG8gb3BlbiB1cCBpbnRlcm5hbCBkZXRhaWxzIG9mIGxpYmRzcC4uLgorCisjZGVmaW5lIFNTSU1fS0VSTkVMIDMgICAvLyB0b3RhbCBzaXplIG9mIHRoZSBrZXJuZWw6IDIgKiBTU0lNX0tFUk5FTCArIDEKKworLy8gc3RydWN0IGZvciBhY2N1bXVsYXRpbmcgc3RhdGlzdGljYWwgbW9tZW50cwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCB3OyAgICAgICAgICAgICAgLy8gc3VtKHdfaSkgOiBzdW0gb2Ygd2VpZ2h0cworICB1aW50MzJfdCB4bSwgeW07ICAgICAgICAgLy8gc3VtKHdfaSAqIHhfaSksIHN1bSh3X2kgKiB5X2kpCisgIHVpbnQzMl90IHh4bSwgeHltLCB5eW07ICAvLyBzdW0od19pICogeF9pICogeF9pKSwgZXRjLgorfSBEaXN0b1N0YXRzOworCisvLyBoYXQtc2hhcGVkIGZpbHRlci4gU3VtIG9mIGNvZWZmaWNpZW50cyBpcyBlcXVhbCB0byAxNi4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrV2VpZ2h0WzIgKiBTU0lNX0tFUk5FTCArIDFdID0geyAxLCAyLCAzLCA0LCAzLCAyLCAxIH07CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgU1NJTUNhbGN1bGF0aW9uKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7CisgIGNvbnN0IHVpbnQzMl90IE4gPSBzdGF0cy0+dzsKKyAgY29uc3QgdWludDMyX3QgdzIgPSAgTiAqIE47CisgIGNvbnN0IHVpbnQzMl90IEMxID0gMjAgKiB3MjsKKyAgY29uc3QgdWludDMyX3QgQzIgPSA2MCAqIHcyOworICBjb25zdCB1aW50MzJfdCBDMyA9IDggKiA4ICogdzI7ICAgLy8gJ2RhcmsnIGxpbWl0IH49IDYKKyAgY29uc3QgdWludDY0X3QgeG14bSA9ICh1aW50NjRfdClzdGF0cy0+eG0gKiBzdGF0cy0+eG07CisgIGNvbnN0IHVpbnQ2NF90IHlteW0gPSAodWludDY0X3Qpc3RhdHMtPnltICogc3RhdHMtPnltOworICBpZiAoeG14bSArIHlteW0gPj0gQzMpIHsKKyAgICBjb25zdCBpbnQ2NF90IHhteW0gPSAoaW50NjRfdClzdGF0cy0+eG0gKiBzdGF0cy0+eW07CisgICAgY29uc3QgaW50NjRfdCBzeHkgPSAoaW50NjRfdClzdGF0cy0+eHltICogTiAtIHhteW07ICAgIC8vIGNhbiBiZSBuZWdhdGl2ZQorICAgIGNvbnN0IHVpbnQ2NF90IHN4eCA9ICh1aW50NjRfdClzdGF0cy0+eHhtICogTiAtIHhteG07CisgICAgY29uc3QgdWludDY0X3Qgc3l5ID0gKHVpbnQ2NF90KXN0YXRzLT55eW0gKiBOIC0geW15bTsKKyAgICAvLyB3ZSBkZXNjYWxlIGJ5IDggdG8gcHJldmVudCBvdmVyZmxvdyBkdXJpbmcgdGhlIGZudW0vZmRlbiBtdWx0aXBseS4KKyAgICBjb25zdCB1aW50NjRfdCBudW1fUyA9ICgyICogKHVpbnQ2NF90KShzeHkgPCAwID8gMCA6IHN4eSkgKyBDMikgPj4gODsKKyAgICBjb25zdCB1aW50NjRfdCBkZW5fUyA9IChzeHggKyBzeXkgKyBDMikgPj4gODsKKyAgICBjb25zdCB1aW50NjRfdCBmbnVtID0gKDIgKiB4bXltICsgQzEpICogbnVtX1M7CisgICAgY29uc3QgdWludDY0X3QgZmRlbiA9ICh4bXhtICsgeW15bSArIEMxKSAqIGRlbl9TOworICAgIGNvbnN0IGRvdWJsZSByID0gKGRvdWJsZSlmbnVtIC8gZmRlbjsKKyAgICBhc3NlcnQociA+PSAwLiAmJiByIDw9IDEuMCk7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIDEuOyAgIC8vIGFyZWEgaXMgdG9vIGRhcmsgdG8gY29udHJpYnV0ZSBtZWFuaW5nZnVsbHkKK30KKworc3RhdGljIGRvdWJsZSBTU0lNR2V0Q2xpcHBlZChjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4bywgaW50IHlvLCBpbnQgVywgaW50IEgpIHsKKyAgRGlzdG9TdGF0cyBzdGF0cyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICBjb25zdCBpbnQgeW1pbiA9ICh5byAtIFNTSU1fS0VSTkVMIDwgMCkgPyAwIDogeW8gLSBTU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHltYXggPSAoeW8gKyBTU0lNX0tFUk5FTCA+IEggLSAxKSA/IEggLSAxIDogeW8gKyBTU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHhtaW4gPSAoeG8gLSBTU0lNX0tFUk5FTCA8IDApID8gMCA6IHhvIC0gU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWF4ID0gKHhvICsgU1NJTV9LRVJORUwgPiBXIC0gMSkgPyBXIC0gMSA6IHhvICsgU1NJTV9LRVJORUw7CisgIGludCB4LCB5OworICBzcmMxICs9IHltaW4gKiBzdHJpZGUxOworICBzcmMyICs9IHltaW4gKiBzdHJpZGUyOworICBmb3IgKHkgPSB5bWluOyB5IDw9IHltYXg7ICsreSwgc3JjMSArPSBzdHJpZGUxLCBzcmMyICs9IHN0cmlkZTIpIHsKKyAgICBmb3IgKHggPSB4bWluOyB4IDw9IHhtYXg7ICsreCkgeworICAgICAgY29uc3QgdWludDMyX3QgdyA9IGtXZWlnaHRbU1NJTV9LRVJORUwgKyB4IC0geG9dCisgICAgICAgICAgICAgICAgICAgICAgICoga1dlaWdodFtTU0lNX0tFUk5FTCArIHkgLSB5b107CisgICAgICBjb25zdCB1aW50MzJfdCBzMSA9IHNyYzFbeF07CisgICAgICBjb25zdCB1aW50MzJfdCBzMiA9IHNyYzJbeF07CisgICAgICBzdGF0cy53ICAgKz0gdzsKKyAgICAgIHN0YXRzLnhtICArPSB3ICogczE7CisgICAgICBzdGF0cy55bSAgKz0gdyAqIHMyOworICAgICAgc3RhdHMueHhtICs9IHcgKiBzMSAqIHMxOworICAgICAgc3RhdHMueHltICs9IHcgKiBzMSAqIHMyOworICAgICAgc3RhdHMueXltICs9IHcgKiBzMiAqIHMyOworICAgIH0KKyAgfQorICByZXR1cm4gU1NJTUNhbGN1bGF0aW9uKCZzdGF0cyk7Cit9CisKKy8vIENvbXB1dGUgU1NJTS1zY29yZSBtYXAuIFJldHVybiAtMSBpbiBjYXNlIG9mIGVycm9yLCBtYXggZGlmZiBvdGhlcndpc2UuCitzdGF0aWMgaW50IFNTSU1TY2FsZUNoYW5uZWwodWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc3RyaWRlLCBpbnQgdywgaW50IGgsIGludCBkb19zY2FsaW5nKSB7CisgIGludCB4LCB5OworICBpbnQgbWF4ID0gMDsKKyAgdWludDhfdCogY29uc3QgcGxhbmUxID0gKHVpbnQ4X3QqKW1hbGxvYygyICogdyAqIGggKiBzaXplb2YoKnBsYW5lMSkpOworICB1aW50OF90KiBjb25zdCBwbGFuZTIgPSBwbGFuZTEgKyB3ICogaDsKKyAgaWYgKHBsYW5lMSA9PSBOVUxMKSByZXR1cm4gLTE7CisKKyAgLy8gZXh0cmFjdCBwbGFuZQorICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgcGxhbmUxW3ggKyB5ICogd10gPSBzcmMxW3ggKiB4X3N0cmlkZSArIHkgKiBzdHJpZGUxXTsKKyAgICAgIHBsYW5lMlt4ICsgeSAqIHddID0gc3JjMlt4ICogeF9zdHJpZGUgKyB5ICogc3RyaWRlMl07CisgICAgfQorICB9CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBjb25zdCBkb3VibGUgc3NpbSA9IFNTSU1HZXRDbGlwcGVkKHBsYW5lMSwgdywgcGxhbmUyLCB3LCB4LCB5LCB3LCBoKTsKKyAgICAgIGludCBkaWZmID0gKGludCkoMjU1ICogKDEuIC0gc3NpbSkpOworICAgICAgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgIGRpZmYgPSAwOworICAgICAgfSBlbHNlIGlmIChkaWZmID4gbWF4KSB7CisgICAgICAgIG1heCA9IGRpZmY7CisgICAgICB9CisgICAgICBzcmMxW3ggKiB4X3N0cmlkZSArIHkgKiBzdHJpZGUxXSA9IChkaWZmID4gMjU1KSA/IDI1NXUgOiAodWludDhfdClkaWZmOworICAgIH0KKyAgfQorICBmcmVlKHBsYW5lMSk7CisKKyAgaWYgKGRvX3NjYWxpbmcpIFJlc2NhbGVQbGFuZShzcmMxLCB3LCBoLCB4X3N0cmlkZSwgc3RyaWRlMSwgbWF4KTsKKyAgcmV0dXJuIG1heDsKK30KKworLy8gQ29udmVydCBhbiBhcmdiIHBpY3R1cmUgdG8gbHVtaW5hbmNlLgorc3RhdGljIHZvaWQgQ29udmVydFRvR3JheShXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGludCB4LCB5OworICBhc3NlcnQocGljICE9IE5VTEwpOworICBhc3NlcnQocGljLT51c2VfYXJnYik7CisgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgdWludDMyX3QqIGNvbnN0IHJvdyA9ICZwaWMtPmFyZ2JbeSAqIHBpYy0+YXJnYl9zdHJpZGVdOworICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSByb3dbeF07CisgICAgICBjb25zdCB1aW50MzJfdCByID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGcgPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICAgY29uc3QgdWludDMyX3QgYiA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisgICAgICAvLyBXZSB1c2UgQlQuNzA5IGZvciBjb252ZXJ0aW5nIHRvIGx1bWluYW5jZS4KKyAgICAgIGNvbnN0IHVpbnQzMl90IFkgPSAodWludDMyX3QpKDAuMjEyNiAqIHIgKyAwLjcxNTIgKiBnICsgMC4wNzIyICogYiArIC41KTsKKyAgICAgIHJvd1t4XSA9IChhcmdiICYgMHhmZjAwMDAwMHUpIHwgKFkgKiAweDAxMDEwMXUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIlVzYWdlOiBnZXRfZGlzdG8gWy1zc2ltXVstcHNucl1bLWFscGhhXSBjb21wcmVzc2VkLndlYnAgb3JpZy53ZWJwXG4iCisgICAgICAgICAgIiAgLXNzaW0gLi4uLi4gcHJpbnQgU1NJTSBkaXN0b3J0aW9uXG4iCisgICAgICAgICAgIiAgLXBzbnIgLi4uLi4gcHJpbnQgUFNOUiBkaXN0b3J0aW9uIChkZWZhdWx0KVxuIgorICAgICAgICAgICIgIC1hbHBoYSAuLi4uIHByZXNlcnZlIGFscGhhIHBsYW5lXG4iCisgICAgICAgICAgIiAgLWggLi4uLi4uLi4gdGhpcyBtZXNzYWdlXG4iCisgICAgICAgICAgIiAgLW8gPGZpbGU+IC4gc2F2ZSB0aGUgZGlmZiBtYXAgYXMgYSBXZWJQIGxvc3NsZXNzIGZpbGVcbiIKKyAgICAgICAgICAiICAtc2NhbGUgLi4uLiBzY2FsZSB0aGUgZGlmZmVyZW5jZSBtYXAgdG8gZml0IFswLi4yNTVdIHJhbmdlXG4iCisgICAgICAgICAgIiAgLWdyYXkgLi4uLi4gdXNlIGdyYXlzY2FsZSBmb3IgZGlmZmVyZW5jZSBtYXAgKC1zY2FsZSlcbiIKKyAgICAgICAgICAiIEFsc28gaGFuZGxlcyBQTkcsIEpQRyBhbmQgVElGRiBmaWxlcywgaW4gYWRkaXRpb24gdG8gV2ViUC5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIFdlYlBQaWN0dXJlIHBpYzEsIHBpYzI7CisgIHNpemVfdCBzaXplMSA9IDAsIHNpemUyID0gMDsKKyAgaW50IHJldCA9IDE7CisgIGZsb2F0IGRpc3RvWzVdOworICBpbnQgdHlwZSA9IDA7CisgIGludCBjOworICBpbnQgaGVscCA9IDA7CisgIGludCBrZWVwX2FscGhhID0gMDsKKyAgaW50IHNjYWxlID0gMDsKKyAgaW50IHVzZV9ncmF5ID0gMDsKKyAgY29uc3QgY2hhciogbmFtZTEgPSBOVUxMOworICBjb25zdCBjaGFyKiBuYW1lMiA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIG91dHB1dCA9IE5VTEw7CisKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnBpYzEpIHx8ICFXZWJQUGljdHVyZUluaXQoJnBpYzIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBpbml0IHBpY3R1cmVzXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNzaW0iKSkgeworICAgICAgdHlwZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHNuciIpKSB7CisgICAgICB0eXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYSIpKSB7CisgICAgICBrZWVwX2FscGhhID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zY2FsZSIpKSB7CisgICAgICBzY2FsZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZ3JheSIpKSB7CisgICAgICB1c2VfZ3JheSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpKSB7CisgICAgICBoZWxwID0gMTsKKyAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbyIpKSB7CisgICAgICBpZiAoKytjID09IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtaXNzaW5nIGZpbGUgbmFtZSBhZnRlciAlcyBvcHRpb24uXG4iLCBhcmd2W2MgLSAxXSk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgICAgb3V0cHV0ID0gYXJndltjXTsKKyAgICB9IGVsc2UgaWYgKG5hbWUxID09IE5VTEwpIHsKKyAgICAgIG5hbWUxID0gYXJndltjXTsKKyAgICB9IGVsc2UgeworICAgICAgbmFtZTIgPSBhcmd2W2NdOworICAgIH0KKyAgfQorICBpZiAoaGVscCB8fCBuYW1lMSA9PSBOVUxMIHx8IG5hbWUyID09IE5VTEwpIHsKKyAgICBpZiAoIWhlbHApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG1pc3NpbmcgYXJndW1lbnRzLlxuIik7CisgICAgfQorICAgIEhlbHAoKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBzaXplMSA9IFJlYWRQaWN0dXJlKG5hbWUxLCAmcGljMSwgMSk7CisgIHNpemUyID0gUmVhZFBpY3R1cmUobmFtZTIsICZwaWMyLCAxKTsKKyAgaWYgKHNpemUxID09IDAgfHwgc2l6ZTIgPT0gMCkgZ290byBFbmQ7CisKKyAgaWYgKCFrZWVwX2FscGhhKSB7CisgICAgV2ViUEJsZW5kQWxwaGEoJnBpYzEsIDB4MDAwMDAwMDApOworICAgIFdlYlBCbGVuZEFscGhhKCZwaWMyLCAweDAwMDAwMDAwKTsKKyAgfQorCisgIGlmICghV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCZwaWMxLCAmcGljMiwgdHlwZSwgZGlzdG8pKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBjb21wdXRpbmcgdGhlIGRpc3RvcnRpb24uXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBwcmludGYoIiV1ICUuMmYgICAgJS4yZiAlLjJmICUuMmYgJS4yZiBbICUuMmYgYnBwIF1cbiIsCisgICAgICAgICAodW5zaWduZWQgaW50KXNpemUxLAorICAgICAgICAgZGlzdG9bNF0sIGRpc3RvWzBdLCBkaXN0b1sxXSwgZGlzdG9bMl0sIGRpc3RvWzNdLAorICAgICAgICAgOC5mICogc2l6ZTEgLyBwaWMxLndpZHRoIC8gcGljMS5oZWlnaHQpOworCisgIGlmIChvdXRwdXQgIT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICAgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICAgIGlmIChwaWMxLnVzZV9hcmdiICE9IHBpYzIudXNlX2FyZ2IpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGljdHVyZXMgYXJlIG5vdCBpbiB0aGUgc2FtZSBhcmdiIGZvcm1hdC4gIgorICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBzYXZlIHRoZSBkaWZmZXJlbmNlIG1hcC5cbiIpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIGlmIChwaWMxLnVzZV9hcmdiKSB7CisgICAgICBpbnQgbjsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibWF4IGRpZmZlcmVuY2VzIHBlciBjaGFubmVsOiAiKTsKKyAgICAgIGZvciAobiA9IDA7IG4gPCAzOyArK24pIHsgICAgLy8gc2tpcCB0aGUgYWxwaGEgY2hhbm5lbAorICAgICAgICBjb25zdCBpbnQgcmFuZ2UgPSAodHlwZSA9PSAxKSA/CisgICAgICAgICAgU1NJTVNjYWxlQ2hhbm5lbCgodWludDhfdCopcGljMS5hcmdiICsgbiwgcGljMS5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGljMi5hcmdiICsgbiwgcGljMi5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCBwaWMxLndpZHRoLCBwaWMxLmhlaWdodCwgc2NhbGUpIDoKKyAgICAgICAgICBEaWZmU2NhbGVDaGFubmVsKCh1aW50OF90KilwaWMxLmFyZ2IgKyBuLCBwaWMxLmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwaWMyLmFyZ2IgKyBuLCBwaWMyLmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHBpYzEud2lkdGgsIHBpYzEuaGVpZ2h0LCBzY2FsZSk7CisgICAgICAgIGlmIChyYW5nZSA8IDApIGZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBjb21wdXRpbmcgZGlmZiBtYXBcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlslZF0iLCByYW5nZSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICBpZiAodXNlX2dyYXkpIENvbnZlcnRUb0dyYXkoJnBpYzEpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbiBvbmx5IGNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgbWFwIGluIEFSR0IgZm9ybWF0LlxuIik7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICAgIGRhdGFfc2l6ZSA9IFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoKGNvbnN0IHVpbnQ4X3QqKXBpYzEuYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYzEud2lkdGgsIHBpYzEuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljMS5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSk7CisgICAgaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBsb3NzbGVzcyBlbmNvZGluZy5cbiIpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIHJldCA9IEltZ0lvVXRpbFdyaXRlRmlsZShvdXRwdXQsIGRhdGEsIGRhdGFfc2l6ZSkgPyAwIDogMTsKKyAgICBXZWJQRnJlZShkYXRhKTsKKyAgICBpZiAocmV0KSBnb3RvIEVuZDsKKyNlbHNlCisgICAgKHZvaWQpZGF0YTsKKyAgICAodm9pZClkYXRhX3NpemU7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2F2ZSB0aGUgZGlmZmVyZW5jZSBtYXAuIFBsZWFzZSByZWNvbXBpbGUgIgorICAgICAgICAgICAgICAgICAgICAid2l0aG91dCB0aGUgV0VCUF9SRURVQ0VfQ1NQIGZsYWcuXG4iKTsKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisgIH0KKyAgcmV0ID0gMDsKKworIEVuZDoKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWMxKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWMyKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9xdWFsaXR5X2VzdGltYXRlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvcXVhbGl0eV9lc3RpbWF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTk4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvcXVhbGl0eV9lc3RpbWF0ZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFZQOEVzdGltYXRlUXVhbGl0eSgpOiByb3VnaCBlbmNvZGluZyBxdWFsaXR5IGVzdGltYXRlCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgImV4dHJhcy9leHRyYXMuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIElOVkFMSURfQklUX1BPUyAoMXVsbCA8PCA2MykKKworLy8gSW4gbW9zdCBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0byB1c2UgYSBmdWxsIGFyaXRobWV0aWMgZGVjb2Rlciwgc2luY2UKKy8vIGFsbCB0aGUgaGVhZGVyJ3MgYml0cyBhcmUgd3JpdHRlbiB1c2luZyBhIHVuaWZvcm0gcHJvYmFiaWxpdHkgb2YgMTI4LgorLy8gV2UgY2FuIGp1c3QgcGFyc2UgdGhlIGhlYWRlciBhcyBpZiBpdCB3YXMgYml0cyAod29ya3MgaW4gOTkuOTk5JSBjYXNlcykuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0Qml0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWF4X3NpemUsIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgIHVpbnQzMl90IHZhbCA9IDA7CisgIGlmICgqYml0X3BvcyArIG5iIDw9IDggKiBtYXhfc2l6ZSkgeworICAgIHdoaWxlIChuYi0tID4gMCkgeworICAgICAgY29uc3QgdWludDY0X3QgcCA9ICgqYml0X3BvcykrKzsKKyAgICAgIGNvbnN0IGludCBiaXQgPSAhIShkYXRhW3AgPj4gM10gJiAoMTI4ID4+ICgocCAmIDcpKSkpOworICAgICAgdmFsID0gKHZhbCA8PCAxKSB8IGJpdDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKmJpdF9wb3MgPSBJTlZBTElEX0JJVF9QT1M7CisgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBHRVRfQklUKG4pIEdldEJpdChkYXRhLCAobiksIHNpemUsICZiaXRfcG9zKQorI2RlZmluZSBDT05ESVRJT05BTF9TS0lQKG4pIChHRVRfQklUKDEpID8gR0VUX0JJVCgobikpIDogMCkKKworaW50IFZQOEVzdGltYXRlUXVhbGl0eShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3QgcG9zID0gMDsKKyAgdWludDY0X3QgYml0X3BvczsKKyAgdWludDY0X3Qgc2lnID0gMHgwMDsKKyAgaW50IG9rID0gMDsKKyAgaW50IFEgPSAtMTsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGZlYXR1cmVzOworCisgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAtMTsKKworICBpZiAoV2ViUEdldEZlYXR1cmVzKGRhdGEsIHNpemUsICZmZWF0dXJlcykgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiAtMTsgICAvLyBpbnZhbGlkIGZpbGUKKyAgfQorICBpZiAoZmVhdHVyZXMuZm9ybWF0ID09IDIpIHJldHVybiAxMDE7ICAvLyBsb3NzbGVzcworICBpZiAoZmVhdHVyZXMuZm9ybWF0ID09IDAgfHwgZmVhdHVyZXMuaGFzX2FuaW1hdGlvbikgcmV0dXJuIC0xOyAgIC8vIG1peGVkCisKKyAgd2hpbGUgKHBvcyA8IHNpemUpIHsKKyAgICBzaWcgPSAoc2lnID4+IDgpIHwgKCh1aW50NjRfdClkYXRhW3BvcysrXSA8PCA0MCk7CisgICAgaWYgKChzaWcgPj4gMjQpID09IDB4MmEwMTlkdWxsKSB7CisgICAgICBvayA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFvaykgcmV0dXJuIC0xOworICBpZiAocG9zICsgNCA+IHNpemUpIHJldHVybiAtMTsKKworICAvLyBTa2lwIG1haW4gSGVhZGVyCisgIC8vIHdpZHRoICA9IChkYXRhW3BvcyArIDBdIHwgKGRhdGFbcG9zICsgMV0gPDwgOCkpICYgMHgzZmZmOworICAvLyBoZWlnaHQgPSAoZGF0YVtwb3MgKyAyXSB8IChkYXRhW3BvcyArIDNdIDw8IDgpKSAmIDB4M2ZmZjsKKyAgcG9zICs9IDQ7CisgIGJpdF9wb3MgPSBwb3MgKiA4OworCisgIEdFVF9CSVQoMik7ICAvLyBjb2xvcnNwYWNlICsgY2xhbXAgdHlwZQorCisgIC8vIFNlZ21lbnQgaGVhZGVyCisgIGlmIChHRVRfQklUKDEpKSB7ICAgICAgIC8vIHVzZV9zZWdtZW50XworICAgIGludCBzOworICAgIGNvbnN0IGludCB1cGRhdGVfbWFwID0gR0VUX0JJVCgxKTsKKyAgICBpZiAoR0VUX0JJVCgxKSkgeyAgICAgLy8gdXBkYXRlIGRhdGEKKyAgICAgIGNvbnN0IGludCBhYnNvbHV0ZV9kZWx0YSA9IEdFVF9CSVQoMSk7CisgICAgICBpbnQgcVs0XSAgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgIGZvciAocyA9IDA7IHMgPCA0OyArK3MpIHsKKyAgICAgICAgaWYgKEdFVF9CSVQoMSkpIHsKKyAgICAgICAgICBxW3NdID0gR0VUX0JJVCg3KTsKKyAgICAgICAgICBpZiAoR0VUX0JJVCgxKSkgcVtzXSA9IC1xW3NdOyAgIC8vIHNpZ24KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGFic29sdXRlX2RlbHRhKSBRID0gcVswXTsgIC8vIGp1c3QgdXNlIHRoZSBmaXJzdCBzZWdtZW50J3MgcXVhbnRpemVyCisgICAgICBmb3IgKHMgPSAwOyBzIDwgNDsgKytzKSBDT05ESVRJT05BTF9TS0lQKDcpOyAgIC8vICBmaWx0ZXIgc3RyZW5ndGgKKyAgICB9CisgICAgaWYgKHVwZGF0ZV9tYXApIHsKKyAgICAgIGZvciAocyA9IDA7IHMgPCAzOyArK3MpIENPTkRJVElPTkFMX1NLSVAoOCk7CisgICAgfQorICB9CisgIC8vIEZpbHRlciBoZWFkZXIKKyAgR0VUX0JJVCgxICsgNiArIDMpOyAgICAgLy8gc2ltcGxlICsgbGV2ZWwgKyBzaGFycG5lc3MKKyAgaWYgKEdFVF9CSVQoMSkpIHsgICAgICAgLy8gdXNlX2xmX2RlbHRhCisgICAgaWYgKEdFVF9CSVQoMSkpIHsgICAgIC8vIHVwZGF0ZSBsZl9kZWx0YT8KKyAgICAgIGludCBuOworICAgICAgZm9yIChuID0gMDsgbiA8IDQgKyA0OyArK24pIENPTkRJVElPTkFMX1NLSVAoNik7CisgICAgfQorICB9CisgIC8vIG51bSBwYXJ0aXRpb25zCisgIEdFVF9CSVQoMik7CisKKyAgLy8gUGFyc2VRdWFudAorICB7CisgICAgY29uc3QgaW50IGJhc2VfcSA9IEdFVF9CSVQoNyk7CisgICAgLyogZHF5MV9kYyA9ICovIENPTkRJVElPTkFMX1NLSVAoNSk7CisgICAgLyogZHF5Ml9kYyA9ICovIENPTkRJVElPTkFMX1NLSVAoNSk7CisgICAgLyogZHF5Ml9hYyA9ICovIENPTkRJVElPTkFMX1NLSVAoNSk7CisgICAgLyogZHF1dl9kYyA9ICovIENPTkRJVElPTkFMX1NLSVAoNSk7CisgICAgLyogZHF1dl9hYyA9ICovIENPTkRJVElPTkFMX1NLSVAoNSk7CisKKyAgICBpZiAoUSA8IDApIFEgPSBiYXNlX3E7CisgIH0KKyAgaWYgKGJpdF9wb3MgPT0gSU5WQUxJRF9CSVRfUE9TKSByZXR1cm4gLTE7CisKKyAgLy8gYmFzZSBtYXBwaW5nCisgIFEgPSAoMTI3IC0gUSkgKiAxMDAgLyAxMjc7CisgIC8vIGNvcnJlY3Rpb24gZm9yIHBvd2VyLWxhdyBiZWhhdmlvciBpbiBsb3cgcmFuZ2UKKyAgaWYgKFEgPCA4MCkgeworICAgIFEgPSAoaW50KShwb3coUSAvIDgwLiwgMS4gLyAwLjM4KSAqIDgwKTsKKyAgfQorICByZXR1cm4gUTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy92d2VicF9zZGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy92d2VicF9zZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE3MWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3Z3ZWJwX3NkbC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTaW1wbGUgU0RMLWJhc2VkIFdlYlAgZmlsZSB2aWV3ZXIuCisvLyBEb2VzIG5vdCBzdXBwb3J0IGFuaW1hdGlvbiwganVzdCBzdGF0aWMgaW1hZ2VzLgorLy8KKy8vIFByZXNzICdxJyB0byBleGl0LgorLy8KKy8vIEF1dGhvcjogSmFtZXMgWmVybiAoanplcm5AZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfU0RMKQorCisjaW5jbHVkZSAid2VicF90b19zZGwuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgImltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9KVVNUX1NETF9IKQorI2luY2x1ZGUgPFNETC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxTREwvU0RMLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgUHJvY2Vzc0V2ZW50cyh2b2lkKSB7CisgIGludCBkb25lID0gMDsKKyAgU0RMX0V2ZW50IGV2ZW50OworICB3aGlsZSAoIWRvbmUgJiYgU0RMX1dhaXRFdmVudCgmZXZlbnQpKSB7CisgICAgc3dpdGNoIChldmVudC50eXBlKSB7CisgICAgICBjYXNlIFNETF9LRVlVUDoKKyAgICAgICAgc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgeworICAgICAgICAgIGNhc2UgU0RMS19xOiBkb25lID0gMTsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBpbnQgYzsKKyAgaW50IG9rID0gMDsKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGNvbnN0IGNoYXIqIGZpbGUgPSBOVUxMOworICAgIGNvbnN0IHVpbnQ4X3QqIHdlYnAgPSBOVUxMOworICAgIHNpemVfdCB3ZWJwX3NpemUgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpKSB7CisgICAgICBwcmludGYoIlVzYWdlOiAlcyBbLWhdIGltYWdlLndlYnAgW21vcmVfZmlsZXMud2VicC4uLl1cbiIsIGFyZ3ZbMF0pOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpbGUgPSBhcmd2W2NdOworICAgIH0KKyAgICBpZiAoZmlsZSA9PSBOVUxMKSBjb250aW51ZTsKKyAgICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGZpbGUsICZ3ZWJwLCAmd2VicF9zaXplKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIGZpbGU6ICVzXG4iLCBmaWxlKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmICh3ZWJwX3NpemUgIT0gKHNpemVfdCkoaW50KXdlYnBfc2l6ZSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlIHRvbyBsYXJnZS5cbiIpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgb2sgPSBXZWJwVG9TREwoKGNvbnN0IGNoYXIqKXdlYnAsIChpbnQpd2VicF9zaXplKTsKKyAgICBmcmVlKCh2b2lkKil3ZWJwKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlY29kaW5nIGZpbGUgJXNcbiIsIGZpbGUpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgUHJvY2Vzc0V2ZW50cygpOworICB9CisgIG9rID0gMTsKKworIEVycm9yOgorICBTRExfUXVpdCgpOworICByZXR1cm4gb2sgPyAwIDogMTsKK30KKworI2Vsc2UgIC8vICFXRUJQX0hBVkVfU0RMCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgZnByaW50ZihzdGRlcnIsICJTREwgc3VwcG9ydCBub3QgZW5hYmxlZCBpbiAlcy5cbiIsIGFyZ3ZbMF0pOworICAodm9pZClhcmdjOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF9xdWFsaXR5LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF9xdWFsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YmEyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3F1YWxpdHkuYwpAQCAtMCwwICsxLDUwIEBACisvLyBTaW1wbGUgdG9vbCB0byByb3VnaGx5IGV2YWx1YXRlIHRoZSBxdWFsaXR5IGVuY29kaW5nIG9mIGEgd2VicCBiaXRzdHJlYW0KKy8vCisvLyBSZXN1bHQgaXMgYSAqcm91Z2gqIGVzdGltYXRpb24gb2YgdGhlIHF1YWxpdHkuIFlvdSBzaG91bGQganVzdCBjb25zaWRlcgorLy8gdGhlIGJ1Y2tldCBpdCdzIGluIChxID4gODA/ID4gNTA/ID4gMjA/KSBhbmQgbm90IHRha2UgaXQgZm9yIGZhY2UgdmFsdWUuCisvKgorIGdjYyAtbyB3ZWJwX3F1YWxpdHkgd2VicF9xdWFsaXR5LmMgLU8zIC1JLi4vIC1MLiAtTC4uL2ltYWdlaW8gXAorICAgIC1saW1hZ2Vpb191dGlsIC1sd2VicGV4dHJhcyAtbHdlYnAgLWxtIC1scHRocmVhZAorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJleHRyYXMvZXh0cmFzLmgiCisjaW5jbHVkZSAiaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgYzsKKyAgaW50IHF1aWV0ID0gMDsKKyAgaW50IG9rID0gMTsKKyAgZm9yIChjID0gMTsgb2sgJiYgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItcXVpZXQiKSkgeworICAgICAgcXVpZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaCIpKSB7CisgICAgICBwcmludGYoIndlYnBfcXVhbGl0eSBbLWhdWy1xdWlldF0gd2VicF9maWxlcy4uLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUgPSBhcmd2W2NdOworICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgICAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgICAgIGludCBxOworICAgICAgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICAgICAgaWYgKCFvaykgYnJlYWs7CisgICAgICBxID0gVlA4RXN0aW1hdGVRdWFsaXR5KGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICBpZiAoIXF1aWV0KSBwcmludGYoIlslc10gIiwgZmlsZW5hbWUpOworICAgICAgaWYgKHEgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGEgV2ViUCBmaWxlLCBvciBub3QgYSBsb3NzeSBXZWJQIGZpbGUuXG4iKTsKKyAgICAgICAgb2sgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgIHByaW50ZigiRXN0aW1hdGVkIHF1YWxpdHkgZmFjdG9yOiAlZFxuIiwgcSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgcSk7ICAgLy8ganVzdCBwcmludCB0aGUgbnVtYmVyCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZyZWUoKHZvaWQqKWRhdGEpOworICAgIH0KKyAgfQorICByZXR1cm4gb2sgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3NDcxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFNpbXBsZSBXZWJQLXRvLVNETCB3cmFwcGVyLiBVc2VmdWwgZm9yIGVtc2NyaXB0ZW4uCisvLworLy8gQXV0aG9yOiBKYW1lcyBaZXJuIChqemVybkBnb29nbGUuY29tKQorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9TREwpCisKKyNpbmNsdWRlICJ3ZWJwX3RvX3NkbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0pVU1RfU0RMX0gpCisjaW5jbHVkZSA8U0RMLmg+CisjZWxzZQorI2luY2x1ZGUgPFNETC9TREwuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRfb2sgPSAwOworaW50IFdlYnBUb1NETChjb25zdCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKSB7CisgIGludCBvayA9IDA7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgaW5wdXQgPSAmY29uZmlnLmlucHV0OworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSAmY29uZmlnLm91dHB1dDsKKyAgU0RMX1N1cmZhY2UqIHNjcmVlbiA9IE5VTEw7CisgIFNETF9TdXJmYWNlKiBzdXJmYWNlID0gTlVMTDsKKworICBpZiAoIVdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIWluaXRfb2spIHsKKyAgICBTRExfSW5pdChTRExfSU5JVF9WSURFTyk7CisgICAgaW5pdF9vayA9IDE7CisgIH0KKworICBzdGF0dXMgPSBXZWJQR2V0RmVhdHVyZXMoKHVpbnQ4X3QqKWRhdGEsIChzaXplX3QpZGF0YV9zaXplLCAmY29uZmlnLmlucHV0KTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSBnb3RvIEVycm9yOworCisgIHNjcmVlbiA9IFNETF9TZXRWaWRlb01vZGUoaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0LCAzMiwgU0RMX1NXU1VSRkFDRSk7CisgIGlmIChzY3JlZW4gPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHNldCB2aWRlbyBtb2RlICgzMmJwcCAlZHglZCkhXG4iLAorICAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgc3VyZmFjZSA9IFNETF9DcmVhdGVSR0JTdXJmYWNlKFNETF9TV1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+d2lkdGgsIGlucHV0LT5oZWlnaHQsIDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmZnUsICAgLy8gUiBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZjAwdSwgICAvLyBHIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZjAwMDB1LCAgIC8vIEIgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDAwMHUpOyAgLy8gQSBtYXNrCisKKyAgaWYgKHN1cmZhY2UgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSAlZHglZCBSR0JBIHN1cmZhY2UhXG4iLAorICAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGlmIChTRExfTVVTVExPQ0soc3VyZmFjZSkpIFNETF9Mb2NrU3VyZmFjZShzdXJmYWNlKTsKKworI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4KKyAgb3V0cHV0LT5jb2xvcnNwYWNlID0gTU9ERV9CR1JBOworI2Vsc2UKKyAgb3V0cHV0LT5jb2xvcnNwYWNlID0gTU9ERV9SR0JBOworI2VuZGlmCisgIG91dHB1dC0+d2lkdGggID0gc3VyZmFjZS0+dzsKKyAgb3V0cHV0LT5oZWlnaHQgPSBzdXJmYWNlLT5oOworICBvdXRwdXQtPnUuUkdCQS5yZ2JhICAgPSBzdXJmYWNlLT5waXhlbHM7CisgIG91dHB1dC0+dS5SR0JBLnN0cmlkZSA9IHN1cmZhY2UtPnBpdGNoOworICBvdXRwdXQtPnUuUkdCQS5zaXplICAgPSBzdXJmYWNlLT5waXRjaCAqIHN1cmZhY2UtPmg7CisgIG91dHB1dC0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKworICBzdGF0dXMgPSBXZWJQRGVjb2RlKChjb25zdCB1aW50OF90KilkYXRhLCAoc2l6ZV90KWRhdGFfc2l6ZSwgJmNvbmZpZyk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgaW1hZ2UgKCVkKVxuIiwgc3RhdHVzKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKFNETF9NVVNUTE9DSyhzdXJmYWNlKSkgU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7CisgIGlmIChTRExfQmxpdFN1cmZhY2Uoc3VyZmFjZSwgTlVMTCwgc2NyZWVuLCBOVUxMKSB8fAorICAgICAgU0RMX0ZsaXAoc2NyZWVuKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBvayA9IDE7CisKKyBFcnJvcjoKKyAgU0RMX0ZyZWVTdXJmYWNlKHN1cmZhY2UpOworICBTRExfRnJlZVN1cmZhY2Uoc2NyZWVuKTsKKyAgV2ViUEZyZWVEZWNCdWZmZXIob3V0cHV0KTsKKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgIC8vIFdFQlBfSEFWRV9TREwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZWE5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgU2ltcGxlIFdlYlAtdG8tU0RMIHdyYXBwZXIuIFVzZWZ1bCBmb3IgZW1zY3JpcHRlbi4KKy8vCisvLyBBdXRob3I6IEphbWVzIFplcm4gKGp6ZXJuQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9FWFRSQVNfV0VCUF9UT19TRExfSF8KKyNkZWZpbmUgV0VCUF9FWFRSQVNfV0VCUF9UT19TRExfSF8KKworLy8gRXhwb3J0cyB0aGUgbWV0aG9kIFdlYnBUb1NETChjb25zdCBjaGFyKiBkYXRhLCBpbnQgZGF0YV9zaXplKSB3aGljaCBkZWNvZGVzCisvLyBhIFdlYlAgYml0c3RyZWFtIGludG8gYW4gUkdCQSBTREwgc3VyZmFjZS4KKy8vIFJldHVybiBmYWxzZSBvbiBmYWlsdXJlLgorZXh0ZXJuIGludCBXZWJwVG9TREwoY29uc3QgY2hhciogZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSk7CisKKyNlbmRpZiAgLy8gV0VCUF9FWFRSQVNfV0VCUF9UT19TRExfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS5wcm9wZXJ0aWVzIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMzlmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMgUHJvamVjdC13aWRlIEdyYWRsZSBzZXR0aW5ncy4KKworIyBJREUgKGUuZy4gQW5kcm9pZCBTdHVkaW8pIHVzZXJzOgorIyBHcmFkbGUgc2V0dGluZ3MgY29uZmlndXJlZCB0aHJvdWdoIHRoZSBJREUgKndpbGwgb3ZlcnJpZGUqCisjIGFueSBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhpcyBmaWxlLgorCisjIEZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGJ1aWxkIGVudmlyb25tZW50IHZpc2l0CisjIGh0dHA6Ly93d3cuZ3JhZGxlLm9yZy9kb2NzL2N1cnJlbnQvdXNlcmd1aWRlL2J1aWxkX2Vudmlyb25tZW50Lmh0bWwKKworIyBWZXJzaW9ucyBmb3IgZ3JhZGxlCitCVUlMRF9UT09MU19WRVJTSU9OPTIzLjAuMworQ09NUElMRV9TREtfVkVSU0lPTj0yMworQU5EUk9JRF9HUkFETEVfUExVR0lOX1ZFUlNJT049MS41LjAKK0dSQURMRV9ET1dOTE9BRF9UQVNLX1ZFUlNJT049Mi4xLjAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc4MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTYxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorI1RodSBNYXkgMTIgMTc6MDY6MjUgQ0VTVCAyMDE2CitkaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cworemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKK3ppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS0yLjEzLWJpbi56aXAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3MzA5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3CkBAIC0wLDAgKzEsMTY0IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICggKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoICkgeworICAgIGVjaG8KKyAgICBlY2hvICIkKiIKKyAgICBlY2hvCisgICAgZXhpdCAxCit9CisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydCAobXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJykuCitjeWd3aW49ZmFsc2UKK21zeXM9ZmFsc2UKK2Rhcndpbj1mYWxzZQorbm9uc3RvcD1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KKyAgQ1lHV0lOKiApCisgICAgY3lnd2luPXRydWUKKyAgICA7OworICBEYXJ3aW4qICkKKyAgICBkYXJ3aW49dHJ1ZQorICAgIDs7CisgIE1JTkdXKiApCisgICAgbXN5cz10cnVlCisgICAgOzsKKyAgTk9OU1RPUCogKQorICAgIG5vbnN0b3A9dHJ1ZQorICAgIDs7Citlc2FjCisKK0NMQVNTUEFUSD0kQVBQX0hPTUUvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisKKyMgRGV0ZXJtaW5lIHRoZSBKYXZhIGNvbW1hbmQgdG8gdXNlIHRvIHN0YXJ0IHRoZSBKVk0uCitpZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCisgICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKKyAgICBlbHNlCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiCisgICAgZmkKKyAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgorICAgICAgICBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAkSkFWQV9IT01FCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCisgICAgZmkKK2Vsc2UKKyAgICBKQVZBQ01EPSJqYXZhIgorICAgIHdoaWNoIGphdmEgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCitmaQorCisjIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLgoraWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4KKyAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmAKKyAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCisgICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCisgICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiCisgICAgICAgIGZpCisgICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECisgICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4KKyAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiCisgICAgZmkKK2ZpCisKKyMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sKK2lmICRkYXJ3aW47IHRoZW4KKyAgICBHUkFETEVfT1BUUz0iJEdSQURMRV9PUFRTIFwiLVhkb2NrOm5hbWU9JEFQUF9OQU1FXCIgXCItWGRvY2s6aWNvbj0kQVBQX0hPTUUvbWVkaWEvZ3JhZGxlLmljbnNcIiIKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKK2lmICRjeWd3aW4gOyB0aGVuCisgICAgQVBQX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRBUFBfSE9NRSJgCisgICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQ0xBU1NQQVRIImAKKyAgICBKQVZBQ01EPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFDTUQiYAorCisgICAgIyBXZSBidWlsZCB0aGUgcGF0dGVybiBmb3IgYXJndW1lbnRzIHRvIGJlIGNvbnZlcnRlZCB2aWEgY3lncGF0aAorICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKKyAgICBTRVA9IiIKKyAgICBmb3IgZGlyIGluICRST09URElSU1JBVyA7IGRvCisgICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKKyAgICAgICAgU0VQPSJ8IgorICAgIGRvbmUKKyAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKKyAgICAjIEFkZCBhIHVzZXItZGVmaW5lZCBwYXR0ZXJuIHRvIHRoZSBjeWdwYXRoIGFyZ3VtZW50cworICAgIGlmIFsgIiRHUkFETEVfQ1lHUEFUVEVSTiIgIT0gIiIgXSA7IHRoZW4KKyAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCisgICAgZmkKKyAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKKyAgICBpPTAKKyAgICBmb3IgYXJnIGluICIkQCIgOyBkbworICAgICAgICBDSEVDSz1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIiRPVVJDWUdQQVRURVJOIiAtYAorICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KKworICAgICAgICBpZiBbICRDSEVDSyAtbmUgMCBdICYmIFsgJENIRUNLMiAtZXEgMCBdIDsgdGhlbiAgICAgICAgICAgICAgICAgICAgIyMjIEFkZGVkIGEgY29uZGl0aW9uCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9IlwiJGFyZ1wiIgorICAgICAgICBmaQorICAgICAgICBpPSQoKGkrMSkpCisgICAgZG9uZQorICAgIGNhc2UgJGkgaW4KKyAgICAgICAgKDApIHNldCAtLSA7OworICAgICAgICAoMSkgc2V0IC0tICIkYXJnczAiIDs7CisgICAgICAgICgyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsKKyAgICAgICAgKDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OworICAgICAgICAoNCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiIDs7CisgICAgICAgICg1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsKKyAgICAgICAgKDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OworICAgICAgICAoNykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiIDs7CisgICAgICAgICg4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsKKyAgICAgICAgKDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OworICAgIGVzYWMKK2ZpCisKKyMgU3BsaXQgdXAgdGhlIEpWTV9PUFRTIEFuZCBHUkFETEVfT1BUUyB2YWx1ZXMgaW50byBhbiBhcnJheSwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2Z1bmN0aW9uIHNwbGl0SnZtT3B0cygpIHsKKyAgICBKVk1fT1BUUz0oIiRAIikKK30KK2V2YWwgc3BsaXRKdm1PcHRzICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTCitKVk1fT1BUU1skeyNKVk1fT1BUU1sqXX1dPSItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRSIKKworZXhlYyAiJEpBVkFDTUQiICIke0pWTV9PUFRTW0BdfSIgLWNsYXNzcGF0aCAiJENMQVNTUEFUSCIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICIkQCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcuYmF0IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkNTk3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsOTAgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK0ByZW0NCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MNCitAcmVtDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQorDQorc2V0IERJUk5BTUU9JX5kcDANCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQorc2V0IEFQUF9CQVNFX05BTUU9JX5uMA0KK3NldCBBUFBfSE9NRT0lRElSTkFNRSUNCisNCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KK3NldCBERUZBVUxUX0pWTV9PUFRTPQ0KKw0KK0ByZW0gRmluZCBqYXZhLmV4ZQ0KK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUNCisNCitzZXQgSkFWQV9FWEU9amF2YS5leGUNCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQ0KK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6ZmluZEphdmFGcm9tSmF2YUhvbWUNCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lDQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQ0KKw0KK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6aW5pdA0KK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCisNCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncw0KK2lmICIlQGV2YWxbMisyXSIgPT0gIjQiIGdvdG8gNE5UX2FyZ3MNCisNCis6d2luOXhNRV9hcmdzDQorQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4NCitzZXQgQ01EX0xJTkVfQVJHUz0NCitzZXQgX1NLSVA9Mg0KKw0KKzp3aW45eE1FX2FyZ3Nfc2x1cnANCitpZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQ0KKw0KK3NldCBDTURfTElORV9BUkdTPSUqDQorZ290byBleGVjdXRlDQorDQorOjROVF9hcmdzDQorQHJlbSBHZXQgYXJndW1lbnRzIGZyb20gdGhlIDROVCBTaGVsbCBmcm9tIEpQIFNvZnR3YXJlDQorc2V0IENNRF9MSU5FX0FSR1M9JSQNCisNCis6ZXhlY3V0ZQ0KK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KKw0KK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXINCisNCitAcmVtIEV4ZWN1dGUgR3JhZGxlDQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQorDQorOmVuZA0KK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kDQorDQorOmZhaWwNCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YNCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSENCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KK2V4aXQgL2IgMQ0KKw0KKzptYWluRW5kDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwNCisNCis6b21lZ2ENCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL0FuZHJvaWQubWsgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3OWY3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vQW5kcm9pZC5tawpAQCAtMCwwICsxLDU0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYmltYWdlaW9fdXRpbAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBpbWFnZWlvX3V0aWwuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworCitMT0NBTF9NT0RVTEUgOj0gaW1hZ2Vpb191dGlsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGliaW1hZ2VkZWMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgaW1hZ2VfZGVjLmMgXAorICAgIGpwZWdkZWMuYyBcCisgICAgbWV0YWRhdGEuYyBcCisgICAgcG5nZGVjLmMgXAorICAgIHBubWRlYy5jIFwKKyAgICB0aWZmZGVjLmMgXAorICAgIHdlYnBkZWMuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBpbWFnZWlvX3V0aWwKKworTE9DQUxfTU9EVUxFIDo9IGltYWdlZGVjCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGliaW1hZ2VlbmMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgaW1hZ2VfZW5jLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gaW1hZ2Vpb191dGlsCisKK0xPQ0FMX01PRFVMRSA6PSBpbWFnZWVuYworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU2ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMyIEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9zcmMgLUkkKHRvcF9zcmNkaXIpL3NyYworbm9pbnN0X0xUTElCUkFSSUVTID0KK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJpbWFnZWlvX3V0aWwubGEKK2lmIFdBTlRfREVNVVgKKyAgbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYmltYWdlZGVjLmxhCitlbmRpZgorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYmltYWdlZW5jLmxhCisKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL3NyYy93ZWJwL2RlY29kZS5oCitub2luc3RfSEVBREVSUyArPSAuLi9zcmMvd2VicC90eXBlcy5oCisKK2xpYmltYWdlaW9fdXRpbF9sYV9TT1VSQ0VTID0KK2xpYmltYWdlaW9fdXRpbF9sYV9TT1VSQ0VTICs9IGltYWdlaW9fdXRpbC5jIGltYWdlaW9fdXRpbC5oCisKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgID0KK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gaW1hZ2VfZGVjLmMgaW1hZ2VfZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0ganBlZ2RlYy5jIGpwZWdkZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSBtZXRhZGF0YS5jIG1ldGFkYXRhLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gcG5nZGVjLmMgcG5nZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gcG5tZGVjLmMgcG5tZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gdGlmZmRlYy5jIHRpZmZkZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSB3ZWJwZGVjLmMgd2VicGRlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IHdpY2RlYy5jIHdpY2RlYy5oCitsaWJpbWFnZWRlY19sYV9DUFBGTEFHUyA9ICQoSlBFR19JTkNMVURFUykgJChQTkdfSU5DTFVERVMpICQoVElGRl9JTkNMVURFUykKK2xpYmltYWdlZGVjX2xhX0NQUEZMQUdTICs9ICQoQU1fQ1BQRkxBR1MpCitsaWJpbWFnZWRlY19sYV9MSUJBREQgPSAuLi9zcmMvZGVtdXgvbGlid2VicGRlbXV4LmxhCisKK2xpYmltYWdlZW5jX2xhX1NPVVJDRVMgID0KK2xpYmltYWdlZW5jX2xhX1NPVVJDRVMgKz0gaW1hZ2VfZW5jLmMgaW1hZ2VfZW5jLmgKK2xpYmltYWdlZW5jX2xhX0NQUEZMQUdTID0gJChKUEVHX0lOQ0xVREVTKSAkKFBOR19JTkNMVURFUykgJChUSUZGX0lOQ0xVREVTKQorbGliaW1hZ2VlbmNfbGFfQ1BQRkxBR1MgKz0gJChBTV9DUFBGTEFHUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBHZW5lcmljIGltYWdlLXR5cGUgZ3Vlc3NpbmcuCisKKyNpbmNsdWRlICIuL2ltYWdlX2RlYy5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QkUzMihjb25zdCB1aW50OF90IGJ1ZltdKSB7CisgIHJldHVybiAoKHVpbnQzMl90KWJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107Cit9CisKK1dlYlBJbnB1dEZpbGVGb3JtYXQgV2ViUEd1ZXNzSW1hZ2VUeXBlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplKSB7CisgIFdlYlBJbnB1dEZpbGVGb3JtYXQgZm9ybWF0ID0gV0VCUF9VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIGlmIChkYXRhICE9IE5VTEwgJiYgZGF0YV9zaXplID49IDEyKSB7CisgICAgY29uc3QgdWludDMyX3QgbWFnaWMxID0gR2V0QkUzMihkYXRhICsgMCk7CisgICAgY29uc3QgdWludDMyX3QgbWFnaWMyID0gR2V0QkUzMihkYXRhICsgOCk7CisgICAgaWYgKG1hZ2ljMSA9PSAweDg5NTA0RTQ3VSkgeworICAgICAgZm9ybWF0ID0gV0VCUF9QTkdfRk9STUFUOworICAgIH0gZWxzZSBpZiAobWFnaWMxID49IDB4RkZEOEZGMDBVICYmIG1hZ2ljMSA8PSAweEZGRDhGRkZGVSkgeworICAgICAgZm9ybWF0ID0gV0VCUF9KUEVHX0ZPUk1BVDsKKyAgICB9IGVsc2UgaWYgKG1hZ2ljMSA9PSAweDQ5NDkyQTAwIHx8IG1hZ2ljMSA9PSAweDRENEQwMDJBKSB7CisgICAgICBmb3JtYXQgPSBXRUJQX1RJRkZfRk9STUFUOworICAgIH0gZWxzZSBpZiAobWFnaWMxID09IDB4NTI0OTQ2NDYgJiYgbWFnaWMyID09IDB4NTc0NTQyNTApIHsKKyAgICAgIGZvcm1hdCA9IFdFQlBfV0VCUF9GT1JNQVQ7CisgICAgfSBlbHNlIGlmICgoKG1hZ2ljMSA+PiAyNCkgJiAweGZmKSA9PSAnUCcpIHsKKyAgICAgIGNvbnN0IGludCB0eXBlID0gKG1hZ2ljMSA+PiAxNikgJiAweGZmOworICAgICAgLy8gd2Ugb25seSBzdXBwb3J0ICdQNSAtPiBQNycgZm9yIG5vdy4KKyAgICAgIGlmICh0eXBlID49ICc1JyAmJiB0eXBlIDw9ICc3JykgZm9ybWF0ID0gV0VCUF9QTk1fRk9STUFUOworICAgIH0KKyAgfQorICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0aWMgaW50IEZhaWxSZWFkZXIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClkYXRhOworICAodm9pZClkYXRhX3NpemU7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIHJldHVybiAwOworfQorCitXZWJQSW1hZ2VSZWFkZXIgV2ViUEdldEltYWdlUmVhZGVyKFdlYlBJbnB1dEZpbGVGb3JtYXQgZm9ybWF0KSB7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBXRUJQX1BOR19GT1JNQVQ6IHJldHVybiBSZWFkUE5HOworICAgIGNhc2UgV0VCUF9KUEVHX0ZPUk1BVDogcmV0dXJuIFJlYWRKUEVHOworICAgIGNhc2UgV0VCUF9USUZGX0ZPUk1BVDogcmV0dXJuIFJlYWRUSUZGOworICAgIGNhc2UgV0VCUF9XRUJQX0ZPUk1BVDogcmV0dXJuIFJlYWRXZWJQOworICAgIGNhc2UgV0VCUF9QTk1fRk9STUFUOiByZXR1cm4gUmVhZFBOTTsKKyAgICBkZWZhdWx0OiByZXR1cm4gRmFpbFJlYWRlcjsKKyAgfQorfQorCitXZWJQSW1hZ2VSZWFkZXIgV2ViUEd1ZXNzSW1hZ2VSZWFkZXIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplKSB7CisgIHJldHVybiBXZWJQR2V0SW1hZ2VSZWFkZXIoV2ViUEd1ZXNzSW1hZ2VUeXBlKGRhdGEsIGRhdGFfc2l6ZSkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MTFlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBBbGwtaW4tb25lIGxpYnJhcnkgdG8gZGVjb2RlIFBORy9KUEVHL1dlYlAvVElGRi9XSUMgaW5wdXQgaW1hZ2VzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX0lNQUdFX0RFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fSU1BR0VfREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorI2luY2x1ZGUgIi4vanBlZ2RlYy5oIgorI2luY2x1ZGUgIi4vcG5nZGVjLmgiCisjaW5jbHVkZSAiLi9wbm1kZWMuaCIKKyNpbmNsdWRlICIuL3RpZmZkZWMuaCIKKyNpbmNsdWRlICIuL3dlYnBkZWMuaCIKKyNpbmNsdWRlICIuL3dpY2RlYy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgIFdFQlBfUE5HX0ZPUk1BVCA9IDAsCisgIFdFQlBfSlBFR19GT1JNQVQsCisgIFdFQlBfVElGRl9GT1JNQVQsCisgIFdFQlBfV0VCUF9GT1JNQVQsCisgIFdFQlBfUE5NX0ZPUk1BVCwKKyAgV0VCUF9VTlNVUFBPUlRFRF9GT1JNQVQKK30gV2ViUElucHV0RmlsZUZvcm1hdDsKKworLy8gVHJ5IHRvIGluZmVyIHRoZSBpbWFnZSBmb3JtYXQuICdkYXRhX3NpemUnIHNob3VsZCBiZSBsYXJnZXIgdGhhbiAxMi4KKy8vIFJldHVybnMgV0VCUF9VTlNVUFBPUlRFRF9GT1JNQVQgaWYgZm9ybWF0IGNhbid0IGJlIGd1ZXNzIHNhZmVseS4KK1dlYlBJbnB1dEZpbGVGb3JtYXQgV2ViUEd1ZXNzSW1hZ2VUeXBlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplKTsKKworLy8gU2lnbmF0dXJlIGZvciBjb21tb24gaW1hZ2UtcmVhZGluZyBmdW5jdGlvbnMgKFJlYWRQTkcsIFJlYWRKUEVHLCAuLi4pCit0eXBlZGVmIGludCAoKldlYlBJbWFnZVJlYWRlcikoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKy8vIFJldHVybiB0aGUgcmVhZGVyIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBmaWxlIGZvcm1hdC4KK1dlYlBJbWFnZVJlYWRlciBXZWJQR2V0SW1hZ2VSZWFkZXIoV2ViUElucHV0RmlsZUZvcm1hdCBmb3JtYXQpOworCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gV2ViUEd1ZXNzSW1hZ2VUeXBlKCksIGJ1dCByZXR1cm5zIGEKKy8vIHN1aXRhYmxlIHJlYWRlciBmdW5jdGlvbi4gVGhlIHJldHVybmVkIHJlYWRlciBpcyBuZXZlciBOVUxMLCBidXQKKy8vIHVua25vd24gZm9ybWF0cyB3aWxsIHJldHVybiBhbiBhbHdheXMtZmFpbGluZyB2YWxpZCByZWFkZXIuCitXZWJQSW1hZ2VSZWFkZXIgV2ViUEd1ZXNzSW1hZ2VSZWFkZXIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19JTUFHRV9ERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTM0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5jCkBAIC0wLDAgKzEsNTk5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2F2ZSBpbWFnZQorCisjaW5jbHVkZSAiLi9pbWFnZV9lbmMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgV0VCUF9IQVZFX1BORworI2luY2x1ZGUgPHBuZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPiAgIC8vIG5vdGU6IHRoaXMgbXVzdCBiZSBpbmNsdWRlZCAqYWZ0ZXIqIHBuZy5oCisjZW5kaWYKKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorI2lmZGVmIF9fTUlOR1czMl9fCisjZGVmaW5lIElOSVRHVUlEICAvLyBXaXRob3V0IHRoaXMgR1VJRHMgYXJlIGRlY2xhcmVkIGV4dGVybiBhbmQgZmFpbCB0byBsaW5rCisjZW5kaWYKKyNkZWZpbmUgQ0lOVEVSRkFDRQorI2RlZmluZSBDT0JKTUFDUk9TCisjZGVmaW5lIF9XSU4zMl9JRSAweDUwMCAgLy8gV29ya2Fyb3VuZCBidWcgaW4gc2hsd2FwaS5oIHdoZW4gY29tcGlsaW5nIEMrKworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgd2l0aCBDT0JKTUFDUk9TLgorI2luY2x1ZGUgPG9sZTIuaD4gIC8vIENyZWF0ZVN0cmVhbU9uSEdsb2JhbCgpCisjaW5jbHVkZSA8c2hsd2FwaS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jb2RlYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUE5HCisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKworI2RlZmluZSBJRlMoZm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaHIgPSAoZm4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoRkFJTEVEKGhyKSkgZnByaW50ZihzdGRlcnIsICNmbiAiIGZhaWxlZCAlMDhseFxuIiwgaHIpOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTUFLRV9SRUZHVUlEKHgpICh4KQorI2Vsc2UKKyNkZWZpbmUgTUFLRV9SRUZHVUlEKHgpICYoeCkKKyNlbmRpZgorCitzdGF0aWMgSFJFU1VMVCBDcmVhdGVPdXRwdXRTdHJlYW0oY29uc3QgY2hhciogb3V0X2ZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdG9fbWVtLCBJU3RyZWFtKiogc3RyZWFtKSB7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBpZiAod3JpdGVfdG9fbWVtKSB7CisgICAgLy8gT3V0cHV0IHRvIGEgbWVtb3J5IGJ1ZmZlci4gVGhpcyBpcyBmcmVlZCB3aGVuICdzdHJlYW0nIGlzIHJlbGVhc2VkLgorICAgIElGUyhDcmVhdGVTdHJlYW1PbkhHbG9iYWwoTlVMTCwgVFJVRSwgc3RyZWFtKSk7CisgIH0gZWxzZSB7CisgICAgSUZTKFNIQ3JlYXRlU3RyZWFtT25GaWxlQShvdXRfZmlsZV9uYW1lLCBTVEdNX1dSSVRFIHwgU1RHTV9DUkVBVEUsIHN0cmVhbSkpOworICB9CisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlICVzICglMDhseClcbiIsCisgICAgICAgICAgICBvdXRfZmlsZV9uYW1lLCBocik7CisgIH0KKyAgcmV0dXJuIGhyOworfQorCitzdGF0aWMgSFJFU1VMVCBXcml0ZVVzaW5nV0lDKGNvbnN0IGNoYXIqIG91dF9maWxlX25hbWUsIGludCB1c2Vfc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZHVUlEIGNvbnRhaW5lcl9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBoYXNfYWxwaGEpIHsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIElXSUNJbWFnaW5nRmFjdG9yeSogZmFjdG9yeSA9IE5VTEw7CisgIElXSUNCaXRtYXBGcmFtZUVuY29kZSogZnJhbWUgPSBOVUxMOworICBJV0lDQml0bWFwRW5jb2RlciogZW5jb2RlciA9IE5VTEw7CisgIElTdHJlYW0qIHN0cmVhbSA9IE5VTEw7CisgIFdJQ1BpeGVsRm9ybWF0R1VJRCBwaXhlbF9mb3JtYXQgPSBoYXNfYWxwaGEgPyBHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBCR1JBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHVUlEX1dJQ1BpeGVsRm9ybWF0MjRicHBCR1I7CisKKyAgaWYgKG91dF9maWxlX25hbWUgPT0gTlVMTCB8fCByZ2IgPT0gTlVMTCkgcmV0dXJuIEVfSU5WQUxJREFSRzsKKworICBJRlMoQ29Jbml0aWFsaXplKE5VTEwpKTsKKyAgSUZTKENvQ3JlYXRlSW5zdGFuY2UoTUFLRV9SRUZHVUlEKENMU0lEX1dJQ0ltYWdpbmdGYWN0b3J5KSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChJSURfSVdJQ0ltYWdpbmdGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopJmZhY3RvcnkpKTsKKyAgaWYgKGhyID09IFJFR0RCX0VfQ0xBU1NOT1RSRUcpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJDb3VsZG4ndCBhY2Nlc3MgV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoYXJlIHlvdSBydW5uaW5nICIKKyAgICAgICAgICAgICJXaW5kb3dzIFhQIFNQMyBvciBuZXdlcj8pLiBQTkcgc3VwcG9ydCBub3QgYXZhaWxhYmxlLiAiCisgICAgICAgICAgICAiVXNlIC1wcG0gb3IgLXBnbSBmb3IgYXZhaWxhYmxlIFBQTSBhbmQgUEdNIGZvcm1hdHMuXG4iKTsKKyAgfQorICBJRlMoQ3JlYXRlT3V0cHV0U3RyZWFtKG91dF9maWxlX25hbWUsIHVzZV9zdGRvdXQsICZzdHJlYW0pKTsKKyAgSUZTKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVFbmNvZGVyKGZhY3RvcnksIGNvbnRhaW5lcl9ndWlkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kZXIpKTsKKyAgSUZTKElXSUNCaXRtYXBFbmNvZGVyX0luaXRpYWxpemUoZW5jb2Rlciwgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUNCaXRtYXBFbmNvZGVyTm9DYWNoZSkpOworICBJRlMoSVdJQ0JpdG1hcEVuY29kZXJfQ3JlYXRlTmV3RnJhbWUoZW5jb2RlciwgJmZyYW1lLCBOVUxMKSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVFbmNvZGVfSW5pdGlhbGl6ZShmcmFtZSwgTlVMTCkpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRW5jb2RlX1NldFNpemUoZnJhbWUsIHdpZHRoLCBoZWlnaHQpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZUVuY29kZV9TZXRQaXhlbEZvcm1hdChmcmFtZSwgJnBpeGVsX2Zvcm1hdCkpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRW5jb2RlX1dyaXRlUGl4ZWxzKGZyYW1lLCBoZWlnaHQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKiBzdHJpZGUsIHJnYikpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRW5jb2RlX0NvbW1pdChmcmFtZSkpOworICBJRlMoSVdJQ0JpdG1hcEVuY29kZXJfQ29tbWl0KGVuY29kZXIpKTsKKworICBpZiAoU1VDQ0VFREVEKGhyKSAmJiB1c2Vfc3Rkb3V0KSB7CisgICAgSEdMT0JBTCBpbWFnZTsKKyAgICBJRlMoR2V0SEdsb2JhbEZyb21TdHJlYW0oc3RyZWFtLCAmaW1hZ2UpKTsKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgICAgSEFORExFIHN0ZF9vdXRwdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICAgICAgRFdPUkQgbW9kZTsKKyAgICAgIGNvbnN0IEJPT0wgdXBkYXRlX21vZGUgPSBHZXRDb25zb2xlTW9kZShzdGRfb3V0cHV0LCAmbW9kZSk7CisgICAgICBjb25zdCB2b2lkKiBjb25zdCBpbWFnZV9tZW0gPSBHbG9iYWxMb2NrKGltYWdlKTsKKyAgICAgIERXT1JEIGJ5dGVzX3dyaXR0ZW4gPSAwOworCisgICAgICAvLyBDbGVhciBvdXRwdXQgcHJvY2Vzc2luZyBpZiBuZWNlc3NhcnksIHRoZW4gb3V0cHV0IHRoZSBpbWFnZS4KKyAgICAgIGlmICh1cGRhdGVfbW9kZSkgU2V0Q29uc29sZU1vZGUoc3RkX291dHB1dCwgMCk7CisgICAgICBpZiAoIVdyaXRlRmlsZShzdGRfb3V0cHV0LCBpbWFnZV9tZW0sIChEV09SRClHbG9iYWxTaXplKGltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLCBOVUxMKSB8fAorICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gIT0gR2xvYmFsU2l6ZShpbWFnZSkpIHsKKyAgICAgICAgaHIgPSBFX0ZBSUw7CisgICAgICB9CisgICAgICBpZiAodXBkYXRlX21vZGUpIFNldENvbnNvbGVNb2RlKHN0ZF9vdXRwdXQsIG1vZGUpOworICAgICAgR2xvYmFsVW5sb2NrKGltYWdlKTsKKyAgICB9CisgIH0KKworICBpZiAoZnJhbWUgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShmcmFtZSk7CisgIGlmIChlbmNvZGVyICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZW5jb2Rlcik7CisgIGlmIChmYWN0b3J5ICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZmFjdG9yeSk7CisgIGlmIChzdHJlYW0gIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShzdHJlYW0pOworICByZXR1cm4gaHI7Cit9CisKK2ludCBXZWJQV3JpdGVQTkcoY29uc3QgY2hhciogb3V0X2ZpbGVfbmFtZSwgaW50IHVzZV9zdGRvdXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICB1aW50OF90KiBjb25zdCByZ2IgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSk7CisKKyAgcmV0dXJuIFNVQ0NFRURFRChXcml0ZVVzaW5nV0lDKG91dF9maWxlX25hbWUsIHVzZV9zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9Db250YWluZXJGb3JtYXRQbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiLCBzdHJpZGUsIHdpZHRoLCBoZWlnaHQsIGhhc19hbHBoYSkpOworfQorCisjZWxpZiBkZWZpbmVkKFdFQlBfSEFWRV9QTkcpICAgIC8vICFIQVZFX1dJTkNPREVDX0gKK3N0YXRpYyB2b2lkIFBOR0FQSSBQTkdFcnJvckZ1bmN0aW9uKHBuZ19zdHJ1Y3RwIHBuZywgcG5nX2NvbnN0X2NoYXJwIGR1bW15KSB7CisgICh2b2lkKWR1bW15OyAgLy8gcmVtb3ZlIHZhcmlhYmxlLXVudXNlZCB3YXJuaW5nCisgIGxvbmdqbXAocG5nX2ptcGJ1ZihwbmcpLCAxKTsKK30KKworaW50IFdlYlBXcml0ZVBORyhGSUxFKiBvdXRfZmlsZSwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIHZvbGF0aWxlIHBuZ19zdHJ1Y3RwIHBuZzsKKyAgdm9sYXRpbGUgcG5nX2luZm9wIGluZm87CisKKyAgaWYgKG91dF9maWxlID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHJldHVybiAwOworCisgIHBuZyA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgUE5HRXJyb3JGdW5jdGlvbiwgTlVMTCk7CisgIGlmIChwbmcgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGluZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZyk7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKHBuZ19zdHJ1Y3RwcCkmcG5nLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nKSkpIHsKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKHBuZ19zdHJ1Y3RwcCkmcG5nLCAocG5nX2luZm9wcCkmaW5mbyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcG5nX2luaXRfaW8ocG5nLCBvdXRfZmlsZSk7CisgIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgcG5nX2J5dGVwIHJvdyA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSk7CisgICAgdWludDMyX3QgeTsKKworICAgIHBuZ19zZXRfSUhEUihwbmcsIGluZm8sIHdpZHRoLCBoZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgIGhhc19hbHBoYSA/IFBOR19DT0xPUl9UWVBFX1JHQkEgOiBQTkdfQ09MT1JfVFlQRV9SR0IsCisgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQpOworICAgIHBuZ193cml0ZV9pbmZvKHBuZywgaW5mbyk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBwbmdfd3JpdGVfcm93cyhwbmcsICZyb3csIDEpOworICAgICAgcm93ICs9IHN0cmlkZTsKKyAgICB9CisgIH0KKyAgcG5nX3dyaXRlX2VuZChwbmcsIGluZm8pOworICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKHBuZ19zdHJ1Y3RwcCkmcG5nLCAocG5nX2luZm9wcCkmaW5mbyk7CisgIHJldHVybiAxOworfQorI2Vsc2UgICAgLy8gIUhBVkVfV0lOQ09ERUNfSCAmJiAhV0VCUF9IQVZFX1BORworaW50IFdlYlBXcml0ZVBORyhGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgZnByaW50ZihzdGRlcnIsICJQTkcgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJwbmcgIgorICAgICAgICAgICJkZXZlbG9wbWVudCBwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gcnVuIHdpdGggLXBwbSBmbGFnIHRvIGRlY29kZSBpbiBQUE0gZm9ybWF0LlxuIik7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQUE0gLyBQQU0KKworc3RhdGljIGludCBXcml0ZVBQTVBBTShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QqIHJvdyA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgICBjb25zdCBzaXplX3QgYnl0ZXNfcGVyX3B4ID0gYWxwaGEgPyA0IDogMzsKKyAgICB1aW50MzJfdCB5OworCisgICAgaWYgKHJvdyA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGlmIChhbHBoYSkgeworICAgICAgZnByaW50Zihmb3V0LCAiUDdcbldJRFRIICV1XG5IRUlHSFQgJXVcbkRFUFRIIDRcbk1BWFZBTCAyNTVcbiIKKyAgICAgICAgICAgICAgICAgICAgIlRVUExUWVBFIFJHQl9BTFBIQVxuRU5ESERSXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50Zihmb3V0LCAiUDZcbiV1ICV1XG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGlmIChmd3JpdGUocm93LCB3aWR0aCwgYnl0ZXNfcGVyX3B4LCBmb3V0KSAhPSBieXRlc19wZXJfcHgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByb3cgKz0gc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBXcml0ZVBQTShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgcmV0dXJuIFdyaXRlUFBNUEFNKGZvdXQsIGJ1ZmZlciwgMCk7Cit9CisKK2ludCBXZWJQV3JpdGVQQU0oRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIHJldHVybiBXcml0ZVBQTVBBTShmb3V0LCBidWZmZXIsIDEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmF3IFBHTQorCisvLyBTYXZlIDE2YiBtb2RlIChSR0JBNDQ0NCwgUkdCNTY1LCAuLi4pIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KK2ludCBXZWJQV3JpdGUxNmJBc1BHTShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgY29uc3QgdWludDhfdCogcmdiYSA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgIGNvbnN0IHVpbnQzMl90IGJ5dGVzX3Blcl9weCA9IDI7CisgIHVpbnQzMl90IHk7CisKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCByZ2JhID09IE5VTEwpIHJldHVybiAwOworCisgIGZwcmludGYoZm91dCwgIlA1XG4ldSAldVxuMjU1XG4iLCB3aWR0aCAqIGJ5dGVzX3Blcl9weCwgaGVpZ2h0KTsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShyZ2JhLCB3aWR0aCwgYnl0ZXNfcGVyX3B4LCBmb3V0KSAhPSBieXRlc19wZXJfcHgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJNUAorCitzdGF0aWMgdm9pZCBQdXRMRTE2KHVpbnQ4X3QqIGNvbnN0IGRzdCwgdWludDMyX3QgdmFsdWUpIHsKKyAgZHN0WzBdID0gKHZhbHVlID4+IDApICYgMHhmZjsKKyAgZHN0WzFdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgUHV0TEUzMih1aW50OF90KiBjb25zdCBkc3QsIHVpbnQzMl90IHZhbHVlKSB7CisgIFB1dExFMTYoZHN0ICsgMCwgKHZhbHVlID4+ICAwKSAmIDB4ZmZmZik7CisgIFB1dExFMTYoZHN0ICsgMiwgKHZhbHVlID4+IDE2KSAmIDB4ZmZmZik7Cit9CisKKyNkZWZpbmUgQk1QX0hFQURFUl9TSVpFIDU0CitpbnQgV2ViUFdyaXRlQk1QKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSk7CisgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgIGNvbnN0IHVpbnQ4X3QqIHJnYmEgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICBjb25zdCB1aW50MzJfdCBieXRlc19wZXJfcHggPSBoYXNfYWxwaGEgPyA0IDogMzsKKyAgdWludDMyX3QgeTsKKyAgY29uc3QgdWludDMyX3QgbGluZV9zaXplID0gYnl0ZXNfcGVyX3B4ICogd2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IGJtcF9zdHJpZGUgPSAobGluZV9zaXplICsgMykgJiB+MzsgICAvLyBwYWQgdG8gNAorICBjb25zdCB1aW50MzJfdCB0b3RhbF9zaXplID0gYm1wX3N0cmlkZSAqIGhlaWdodCArIEJNUF9IRUFERVJfU0laRTsKKyAgdWludDhfdCBibXBfaGVhZGVyW0JNUF9IRUFERVJfU0laRV0gPSB7IDAgfTsKKworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IHJnYmEgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gYml0bWFwIGZpbGUgaGVhZGVyCisgIFB1dExFMTYoYm1wX2hlYWRlciArIDAsIDB4NGQ0Mik7ICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZSAnQk0nCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDIsIHRvdGFsX3NpemUpOyAgICAgICAgICAgIC8vIHNpemUgaW5jbHVkaW5nIGhlYWRlcgorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyA2LCAwKTsgICAgICAgICAgICAgICAgICAgICAvLyByZXNlcnZlZAorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAxMCwgQk1QX0hFQURFUl9TSVpFKTsgICAgICAvLyBvZmZzZXQgdG8gcGl4ZWwgYXJyYXkKKyAgLy8gYml0bWFwIGluZm8gaGVhZGVyCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDE0LCA0MCk7ICAgICAgICAgICAgICAgICAgIC8vIERJQiBoZWFkZXIgc2l6ZQorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAxOCwgd2lkdGgpOyAgICAgICAgICAgICAgICAvLyBkaW1lbnNpb25zCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDIyLCAtKGludCloZWlnaHQpOyAgICAgICAgIC8vIHZlcnRpY2FsIGZsaXAhCisgIFB1dExFMTYoYm1wX2hlYWRlciArIDI2LCAxKTsgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwbGFuZXMKKyAgUHV0TEUxNihibXBfaGVhZGVyICsgMjgsIGJ5dGVzX3Blcl9weCAqIDgpOyAgICAgLy8gYml0cyBwZXIgcGl4ZWwKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMzAsIDApOyAgICAgICAgICAgICAgICAgICAgLy8gbm8gY29tcHJlc3Npb24gKEJJX1JHQikKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMzQsIDApOyAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2Ugc2l6ZSAoZHVtbXkpCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDM4LCAyNDAwKTsgICAgICAgICAgICAgICAgIC8vIHggcGl4ZWxzL21ldGVyCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDQyLCAyNDAwKTsgICAgICAgICAgICAgICAgIC8vIHkgcGl4ZWxzL21ldGVyCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDQ2LCAwKTsgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwYWxldHRlIGNvbG9ycworICBQdXRMRTMyKGJtcF9oZWFkZXIgKyA1MCwgMCk7ICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnRhbnQgY29sb3IgY291bnQKKworICAvLyBUT0RPKHNrYWwpOiBjb2xvciBwcm9maWxlCisKKyAgLy8gd3JpdGUgaGVhZGVyCisgIGlmIChmd3JpdGUoYm1wX2hlYWRlciwgc2l6ZW9mKGJtcF9oZWFkZXIpLCAxLCBmb3V0KSAhPSAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyB3cml0ZSBwaXhlbCBhcnJheQorICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHJnYmEsIGxpbmVfc2l6ZSwgMSwgZm91dCkgIT0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIHdyaXRlIHBhZGRpbmcgemVyb2VzCisgICAgaWYgKGJtcF9zdHJpZGUgIT0gbGluZV9zaXplKSB7CisgICAgICBjb25zdCB1aW50OF90IHplcm9lc1szXSA9IHsgMCB9OworICAgICAgaWYgKGZ3cml0ZSh6ZXJvZXMsIGJtcF9zdHJpZGUgLSBsaW5lX3NpemUsIDEsIGZvdXQpICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorI3VuZGVmIEJNUF9IRUFERVJfU0laRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVElGRgorCisjZGVmaW5lIE5VTV9JRkRfRU5UUklFUyAxNQorI2RlZmluZSBFWFRSQV9EQVRBX1NJWkUgMTYKKy8vIDEwYiBmb3Igc2lnbmF0dXJlL2hlYWRlciArIG4gKiAxMmIgZW50cmllcyArIDRiIGZvciBJRkQgdGVybWluYXRvcjoKKyNkZWZpbmUgRVhUUkFfREFUQV9PRkZTRVQgKDEwICsgMTIgKiBOVU1fSUZEX0VOVFJJRVMgKyA0KQorI2RlZmluZSBUSUZGX0hFQURFUl9TSVpFIChFWFRSQV9EQVRBX09GRlNFVCArIEVYVFJBX0RBVEFfU0laRSkKKworaW50IFdlYlBXcml0ZVRJRkYoRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKTsKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgY29uc3QgdWludDhfdCogcmdiYSA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfcGVyX3B4ID0gaGFzX2FscGhhID8gNCA6IDM7CisgIGNvbnN0IHVpbnQ4X3QgYXNzb2NfYWxwaGEgPQorICAgICAgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKSA/IDEgOiAyOworICAvLyBGb3Igbm9uLWFscGhhIGNhc2UsIHdlIG9taXQgdGFnIDB4MTUyIChFeHRyYVNhbXBsZXMpLgorICBjb25zdCB1aW50OF90IG51bV9pZmRfZW50cmllcyA9IGhhc19hbHBoYSA/IE5VTV9JRkRfRU5UUklFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9JRkRfRU5UUklFUyAtIDE7CisgIHVpbnQ4X3QgdGlmZl9oZWFkZXJbVElGRl9IRUFERVJfU0laRV0gPSB7CisgICAgMHg0OSwgMHg0OSwgMHgyYSwgMHgwMCwgICAvLyBsaXR0bGUgZW5kaWFuIHNpZ25hdHVyZQorICAgIDgsIDAsIDAsIDAsICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHRoZSB1bmlxdWUgSUZEIHRoYXQgZm9sbG93cworICAgIC8vIElGRCAob2Zmc2V0ID0gOCkuIEVudHJpZXMgbXVzdCBiZSB3cml0dGVuIGluIGluY3JlYXNpbmcgdGFnIG9yZGVyLgorICAgIG51bV9pZmRfZW50cmllcywgMCwgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIElGRCAoMTIgYnl0ZXMgZWFjaCkuCisgICAgMHgwMCwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLy8gIDEwOiBXaWR0aCAgKFRCRCkKKyAgICAweDAxLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvLyAgMjI6IEhlaWdodCAoVEJEKQorICAgIDB4MDIsIDB4MDEsIDMsIDAsIGJ5dGVzX3Blcl9weCwgMCwgMCwgMCwgICAgIC8vICAzNDogQml0c1BlclNhbXBsZTogODg4OAorICAgICAgICBFWFRSQV9EQVRBX09GRlNFVCArIDAsIDAsIDAsIDAsCisgICAgMHgwMywgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgICAgLy8gIDQ2OiBDb21wcmVzc2lvbjogbm9uZQorICAgIDB4MDYsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDIsIDAsIDAsIDAsICAgIC8vICA1ODogUGhvdG9tZXRyaWM6IFJHQgorICAgIDB4MTEsIDB4MDEsIDQsIDAsIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8vICA3MDogU3RyaXBzIG9mZnNldDoKKyAgICAgICAgVElGRl9IRUFERVJfU0laRSwgMCwgMCwgMCwgICAgICAgICAgICAgICAvLyAgICAgIGRhdGEgZm9sbG93cyBoZWFkZXIKKyAgICAweDEyLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAgICAvLyAgODI6IE9yaWVudGF0aW9uOiB0b3BsZWZ0CisgICAgMHgxNSwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLy8gIDk0OiBTYW1wbGVzUGVyUGl4ZWxzCisgICAgICAgIGJ5dGVzX3Blcl9weCwgMCwgMCwgMCwKKyAgICAweDE2LCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvLyAxMDY6IFJvd3MgcGVyIHN0cmlwIChUQkQpCisgICAgMHgxNywgMHgwMSwgNCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLy8gMTE4OiBTdHJpcEJ5dGVDb3VudCAoVEJEKQorICAgIDB4MWEsIDB4MDEsIDUsIDAsIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8vIDEzMDogWC1yZXNvbHV0aW9uCisgICAgICAgIEVYVFJBX0RBVEFfT0ZGU0VUICsgOCwgMCwgMCwgMCwKKyAgICAweDFiLCAweDAxLCA1LCAwLCAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvLyAxNDI6IFktcmVzb2x1dGlvbgorICAgICAgICBFWFRSQV9EQVRBX09GRlNFVCArIDgsIDAsIDAsIDAsCisgICAgMHgxYywgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgICAgLy8gMTU0OiBQbGFuYXJDb25maWd1cmF0aW9uCisgICAgMHgyOCwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgICAgLy8gMTY2OiBSZXNvbHV0aW9uVW5pdCAoaW5jaCkKKyAgICAweDUyLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLAorICAgICAgICBhc3NvY19hbHBoYSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgIC8vIDE3ODogRXh0cmFTYW1wbGVzOiByZ2JBL1JHQkEKKyAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOTA6IElGRCB0ZXJtaW5hdG9yCisgICAgLy8gRVhUUkFfREFUQV9PRkZTRVQ6CisgICAgOCwgMCwgOCwgMCwgOCwgMCwgOCwgMCwgICAgICAvLyBCaXRzUGVyU2FtcGxlCisgICAgNzIsIDAsIDAsIDAsIDEsIDAsIDAsIDAgICAgICAvLyA3MiBwaXhlbHMvaW5jaCwgZm9yIFgvWS1yZXNvbHV0aW9uCisgIH07CisgIHVpbnQzMl90IHk7CisKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCByZ2JhID09IE5VTEwpIHJldHVybiAwOworCisgIC8vIEZpbGwgcGxhY2Vob2xkZXJzIGluIElGRDoKKyAgUHV0TEUzMih0aWZmX2hlYWRlciArIDEwICsgOCwgd2lkdGgpOworICBQdXRMRTMyKHRpZmZfaGVhZGVyICsgMjIgKyA4LCBoZWlnaHQpOworICBQdXRMRTMyKHRpZmZfaGVhZGVyICsgMTA2ICsgOCwgaGVpZ2h0KTsKKyAgUHV0TEUzMih0aWZmX2hlYWRlciArIDExOCArIDgsIHdpZHRoICogYnl0ZXNfcGVyX3B4ICogaGVpZ2h0KTsKKyAgaWYgKCFoYXNfYWxwaGEpIFB1dExFMzIodGlmZl9oZWFkZXIgKyAxNzgsIDApOyAgLy8gSUZEIHRlcm1pbmF0b3IKKworICAvLyB3cml0ZSBoZWFkZXIKKyAgaWYgKGZ3cml0ZSh0aWZmX2hlYWRlciwgc2l6ZW9mKHRpZmZfaGVhZGVyKSwgMSwgZm91dCkgIT0gMSkgeworICAgIHJldHVybiAwOworICB9CisgIC8vIHdyaXRlIHBpeGVsIHZhbHVlcworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHJnYmEsIGJ5dGVzX3Blcl9weCwgd2lkdGgsIGZvdXQpICE9IHdpZHRoKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KKworICByZXR1cm4gMTsKK30KKworI3VuZGVmIFRJRkZfSEVBREVSX1NJWkUKKyN1bmRlZiBFWFRSQV9EQVRBX09GRlNFVAorI3VuZGVmIEVYVFJBX0RBVEFfU0laRQorI3VuZGVmIE5VTV9JRkRfRU5UUklFUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmF3IEFscGhhCisKK2ludCBXZWJQV3JpdGVBbHBoYVBsYW5lKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QqIGEgPSBidWZmZXItPnUuWVVWQS5hOworICAgIGNvbnN0IGludCBhX3N0cmlkZSA9IGJ1ZmZlci0+dS5ZVVZBLmFfc3RyaWRlOworICAgIHVpbnQzMl90IHk7CisKKyAgICBpZiAoYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGZwcmludGYoZm91dCwgIlA1XG4ldSAldVxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGlmIChmd3JpdGUoYSwgd2lkdGgsIDEsIGZvdXQpICE9IDEpIHJldHVybiAwOworICAgICAgYSArPSBhX3N0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBHTSB3aXRoIElNQzQgbGF5b3V0CisKK2ludCBXZWJQV3JpdGVQR00oRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBidWZmZXItPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgeXV2ID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0geXV2LT55OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0geXV2LT51OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0geXV2LT52OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hID0geXV2LT5hOworICAgIGNvbnN0IGludCB1dl93aWR0aCA9ICh3aWR0aCArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGhlaWdodCArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgYV9oZWlnaHQgPSAoc3JjX2EgIT0gTlVMTCkgPyBoZWlnaHQgOiAwOworICAgIGludCBvayA9IDE7CisgICAgaW50IHk7CisKKyAgICBpZiAoc3JjX3kgPT0gTlVMTCB8fCBzcmNfdSA9PSBOVUxMIHx8IHNyY192ID09IE5VTEwpIHJldHVybiAwOworCisgICAgZnByaW50Zihmb3V0LCAiUDVcbiVkICVkXG4yNTVcbiIsCisgICAgICAgICAgICAod2lkdGggKyAxKSAmIH4xLCBoZWlnaHQgKyB1dl9oZWlnaHQgKyBhX2hlaWdodCk7CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY195LCB3aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBpZiAod2lkdGggJiAxKSBmcHV0YygwLCBmb3V0KTsgICAgLy8gcGFkZGluZyBieXRlCisgICAgICBzcmNfeSArPSB5dXYtPnlfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgdXZfaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3UsIHV2X3dpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3YsIHV2X3dpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIHNyY191ICs9IHl1di0+dV9zdHJpZGU7CisgICAgICBzcmNfdiArPSB5dXYtPnZfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgYV9oZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfYSwgd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgaWYgKHdpZHRoICYgMSkgZnB1dGMoMCwgZm91dCk7ICAgIC8vIHBhZGRpbmcgYnl0ZQorICAgICAgc3JjX2EgKz0geXV2LT5hX3N0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSYXcgWVVWKEEpIHBsYW5lcworCitpbnQgV2ViUFdyaXRlWVVWKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IHl1diA9ICZidWZmZXItPnUuWVVWQTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHl1di0+eTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHl1di0+dTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHl1di0+djsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYSA9IHl1di0+YTsKKyAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAod2lkdGggKyAxKSAvIDI7CisgICAgY29uc3QgaW50IHV2X2hlaWdodCA9IChoZWlnaHQgKyAxKSAvIDI7CisgICAgY29uc3QgaW50IGFfaGVpZ2h0ID0gKHNyY19hICE9IE5VTEwpID8gaGVpZ2h0IDogMDsKKyAgICBpbnQgb2sgPSAxOworICAgIGludCB5OworCisgICAgaWYgKHNyY195ID09IE5VTEwgfHwgc3JjX3UgPT0gTlVMTCB8fCBzcmNfdiA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfeSwgd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgc3JjX3kgKz0geXV2LT55X3N0cmlkZTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IHV2X2hlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY191LCB1dl93aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBzcmNfdSArPSB5dXYtPnVfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgdXZfaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3YsIHV2X3dpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIHNyY192ICs9IHl1di0+dl9zdHJpZGU7CisgICAgfQorICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCBhX2hlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY19hLCB3aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBzcmNfYSArPSB5dXYtPmFfc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdlbmVyaWMgdG9wLWxldmVsIGNhbGwKKworaW50IFdlYlBTYXZlSW1hZ2UoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3Qgb3V0X2ZpbGVfbmFtZSkgeworICBGSUxFKiBmb3V0ID0gTlVMTDsKKyAgaW50IG5lZWRzX29wZW5fZmlsZSA9IDE7CisgIGNvbnN0IGludCB1c2Vfc3Rkb3V0ID0gKG91dF9maWxlX25hbWUgIT0gTlVMTCkgJiYgIXN0cmNtcChvdXRfZmlsZV9uYW1lLCAiLSIpOworICBpbnQgb2sgPSAxOworCisgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBvdXRfZmlsZV9uYW1lID09IE5VTEwpIHJldHVybiAwOworCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgIG5lZWRzX29wZW5fZmlsZSA9IChmb3JtYXQgIT0gUE5HKTsKKyNlbmRpZgorCisgIGlmIChuZWVkc19vcGVuX2ZpbGUpIHsKKyAgICBmb3V0ID0gdXNlX3N0ZG91dCA/IEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoc3Rkb3V0KQorICAgICAgICAgICAgICAgICAgICAgIDogZm9wZW4ob3V0X2ZpbGVfbmFtZSwgIndiIik7CisgICAgaWYgKGZvdXQgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlICVzXG4iLCBvdXRfZmlsZV9uYW1lKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChmb3JtYXQgPT0gUE5HIHx8CisgICAgICBmb3JtYXQgPT0gUkdCQSB8fCBmb3JtYXQgPT0gQkdSQSB8fCBmb3JtYXQgPT0gQVJHQiB8fAorICAgICAgZm9ybWF0ID09IHJnYkEgfHwgZm9ybWF0ID09IGJnckEgfHwgZm9ybWF0ID09IEFyZ2IpIHsKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgICBvayAmPSBXZWJQV3JpdGVQTkcob3V0X2ZpbGVfbmFtZSwgdXNlX3N0ZG91dCwgYnVmZmVyKTsKKyNlbHNlCisgICAgb2sgJj0gV2ViUFdyaXRlUE5HKGZvdXQsIGJ1ZmZlcik7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gUEFNKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlUEFNKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFBQTSB8fCBmb3JtYXQgPT0gUkdCIHx8IGZvcm1hdCA9PSBCR1IpIHsKKyAgICBvayAmPSBXZWJQV3JpdGVQUE0oZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gUkdCQV80NDQ0IHx8IGZvcm1hdCA9PSBSR0JfNTY1IHx8IGZvcm1hdCA9PSByZ2JBXzQ0NDQpIHsKKyAgICBvayAmPSBXZWJQV3JpdGUxNmJBc1BHTShmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBCTVApIHsKKyAgICBvayAmPSBXZWJQV3JpdGVCTVAoZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gVElGRikgeworICAgIG9rICY9IFdlYlBXcml0ZVRJRkYoZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gUkFXX1lVVikgeworICAgIG9rICY9IFdlYlBXcml0ZVlVVihmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBQR00gfHwgZm9ybWF0ID09IFlVViB8fCBmb3JtYXQgPT0gWVVWQSkgeworICAgIG9rICY9IFdlYlBXcml0ZVBHTShmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBTFBIQV9QTEFORV9PTkxZKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlQWxwaGFQbGFuZShmb3V0LCBidWZmZXIpOworICB9CisgIGlmIChmb3V0ICE9IE5VTEwgJiYgZm91dCAhPSBzdGRvdXQpIHsKKyAgICBmY2xvc2UoZm91dCk7CisgIH0KKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhYmRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmgKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBBbGwtaW4tb25lIGxpYnJhcnkgdG8gc2F2ZSBQTkcvSlBFRy9XZWJQL1RJRkYvV0lDIGltYWdlcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19JTUFHRV9FTkNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX0lNQUdFX0VOQ19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBPdXRwdXQgdHlwZXMKK3R5cGVkZWYgZW51bSB7CisgIFBORyA9IDAsCisgIFBBTSwKKyAgUFBNLAorICBQR00sCisgIEJNUCwKKyAgVElGRiwKKyAgUkFXX1lVViwKKyAgQUxQSEFfUExBTkVfT05MWSwgIC8vIHRoaXMgaXMgZm9yIGV4cGVyaW1lbnRpbmcgb25seQorICAvLyBmb3JjZWQgY29sb3JzcGFjZSBvdXRwdXQgKGZvciB0ZXN0aW5nLCBtb3N0bHkpCisgIFJHQiwgUkdCQSwgQkdSLCBCR1JBLCBBUkdCLAorICBSR0JBXzQ0NDQsIFJHQl81NjUsCisgIHJnYkEsIGJnckEsIEFyZ2IsIHJnYkFfNDQ0NCwKKyAgWVVWLCBZVVZBCit9IFdlYlBPdXRwdXRGaWxlRm9ybWF0OworCisvLyBHZW5lcmFsIGFsbC1wdXJwb3NlIGNhbGwuCisvLyBNb3N0IGZvcm1hdHMgZXhwZWN0IGEgJ2J1ZmZlcicgY29udGFpbmluZyBSR0JBLWxpa2Ugc2FtcGxlcywgZXhjZXB0CisvLyBSQVdfWVVWLCBZVVYgYW5kIFlVVkEgZm9ybWF0cy4KKy8vIElmICdvdXRfZmlsZV9uYW1lJyBpcyAiLSIsIGRhdGEgaXMgc2F2ZWQgdG8gc3Rkb3V0LgorLy8gUmV0dXJucyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgdHJ1ZSBvdGhlcndpc2UuCitpbnQgV2ViUFNhdmVJbWFnZShjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIsCisgICAgICAgICAgICAgICAgICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQsIGNvbnN0IGNoYXIqIGNvbnN0IG91dF9maWxlX25hbWUpOworCisvLyBTYXZlIHRvIFBORy4KKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKK2ludCBXZWJQV3JpdGVQTkcoY29uc3QgY2hhciogb3V0X2ZpbGVfbmFtZSwgaW50IHVzZV9zdGRvdXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworI2Vsc2UKK2ludCBXZWJQV3JpdGVQTkcoRklMRSogb3V0X2ZpbGUsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisjZW5kaWYKKworLy8gU2F2ZSB0byBQUE0gZm9ybWF0IChSR0IsIG5vIGFscGhhKQoraW50IFdlYlBXcml0ZVBQTShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSB0byBQQU0gZm9ybWF0ICg9IFBQTSArIGFscGhhKQoraW50IFdlYlBXcml0ZVBBTShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSAxNmIgbW9kZSAoUkdCQTQ0NDQsIFJHQjU2NSwgLi4uKSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgoraW50IFdlYlBXcml0ZTE2YkFzUEdNKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIGFzIEJNUAoraW50IFdlYlBXcml0ZUJNUChGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSBhcyBUSUZGCitpbnQgV2ViUFdyaXRlVElGRihGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSB0aGUgQUxQSEEgcGxhbmUgKG9ubHkpIGFzIGEgUEdNCitpbnQgV2ViUFdyaXRlQWxwaGFQbGFuZShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSBhcyBZVVYgc2FtcGxlcyBhcyBQR00gZm9ybWF0ICh1c2luZyBJTUM0IGxheW91dCkuCisvLyBTZWU6IGh0dHA6Ly93d3cuZm91cmNjLm9yZy95dXYucGhwI0lNQzQuCisvLyAodmVyeSBjb252ZW5pZW50IGZvcm1hdCBmb3Igdmlld2luZyB0aGUgc2FtcGxlcywgZXNwLiBmb3Igb2RkIGRpbWVuc2lvbnMpLgoraW50IFdlYlBXcml0ZVBHTShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSBZVVYoQSkgcGxhbmVzIHNlcXVlbnRpYWxseSAocmF3IGR1bXApCitpbnQgV2ViUFdyaXRlWVVWKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIDE2YiBtb2RlIChSR0JBNDQ0NCwgUkdCNTY1LCAuLi4pIGFzIFBHTSBmb3JtYXQsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCitpbnQgV2ViUFdyaXRlMTZiQXNQR00oRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fSU1BR0VfRU5DX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRhZGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuYwpAQCAtMCwwICsxLDE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBpbWFnZSBkZWNvZGVycy4KKy8vCisKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8ZmNudGwuaD4gICAvLyBmb3IgX09fQklOQVJZCisjaW5jbHVkZSA8aW8uaD4gICAgICAvLyBmb3IgX3NldG1vZGUoKQorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWxlIEkvTworCitGSUxFKiBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKEZJTEUqIGZpbGUpIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgaWYgKF9zZXRtb2RlKF9maWxlbm8oZmlsZSksIF9PX0JJTkFSWSkgPT0gLTEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZW9wZW4gZmlsZSBpbiBPX0JJTkFSWSBtb2RlLlxuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICByZXR1cm4gZmlsZTsKK30KKworaW50IEltZ0lvVXRpbFJlYWRGcm9tU3RkaW4oY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0Jsb2NrU2l6ZSA9IDE2Mzg0OyAgLy8gZGVmYXVsdCBpbml0aWFsIHNpemUKKyAgc2l6ZV90IG1heF9zaXplID0gMDsKKyAgc2l6ZV90IHNpemUgPSAwOworICB1aW50OF90KiBpbnB1dCA9IE5VTEw7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gTlVMTCkgcmV0dXJuIDA7CisgICpkYXRhID0gTlVMTDsKKyAgKmRhdGFfc2l6ZSA9IDA7CisKKyAgaWYgKCFJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKHN0ZGluKSkgcmV0dXJuIDA7CisKKyAgd2hpbGUgKCFmZW9mKHN0ZGluKSkgeworICAgIC8vIFdlIGRvdWJsZSB0aGUgYnVmZmVyIHNpemUgZWFjaCB0aW1lIGFuZCByZWFkIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgY29uc3Qgc2l6ZV90IGV4dHJhX3NpemUgPSAobWF4X3NpemUgPT0gMCkgPyBrQmxvY2tTaXplIDogbWF4X3NpemU7CisgICAgLy8gd2UgYWxsb2NhdGUgb25lIGV4dHJhIGJ5dGUgZm9yIHRoZSBcMCB0ZXJtaW5hdG9yCisgICAgdm9pZCogY29uc3QgbmV3X2RhdGEgPSByZWFsbG9jKGlucHV0LCBtYXhfc2l6ZSArIGV4dHJhX3NpemUgKyAxKTsKKyAgICBpZiAobmV3X2RhdGEgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICBpbnB1dCA9ICh1aW50OF90KiluZXdfZGF0YTsKKyAgICBtYXhfc2l6ZSArPSBleHRyYV9zaXplOworICAgIHNpemUgKz0gZnJlYWQoaW5wdXQgKyBzaXplLCAxLCBleHRyYV9zaXplLCBzdGRpbik7CisgICAgaWYgKHNpemUgPCBtYXhfc2l6ZSkgYnJlYWs7CisgIH0KKyAgaWYgKGZlcnJvcihzdGRpbikpIGdvdG8gRXJyb3I7CisgIGlmIChpbnB1dCAhPSBOVUxMKSBpbnB1dFtzaXplXSA9ICdcMCc7ICAvLyBjb252ZW5pZW50IDAtdGVybWluYXRvcgorICAqZGF0YSA9IGlucHV0OworICAqZGF0YV9zaXplID0gc2l6ZTsKKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgZnJlZShpbnB1dCk7CisgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgZnJvbSBzdGRpblxuIik7CisgIHJldHVybiAwOworfQorCitpbnQgSW1nSW9VdGlsUmVhZEZpbGUoY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSkgeworICBpbnQgb2s7CisgIHVpbnQ4X3QqIGZpbGVfZGF0YTsKKyAgc2l6ZV90IGZpbGVfc2l6ZTsKKyAgRklMRSogaW47CisgIGNvbnN0IGludCBmcm9tX3N0ZGluID0gKGZpbGVfbmFtZSA9PSBOVUxMKSB8fCAhc3RyY21wKGZpbGVfbmFtZSwgIi0iKTsKKworICBpZiAoZnJvbV9zdGRpbikgcmV0dXJuIEltZ0lvVXRpbFJlYWRGcm9tU3RkaW4oZGF0YSwgZGF0YV9zaXplKTsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgKmRhdGEgPSBOVUxMOworICAqZGF0YV9zaXplID0gMDsKKworICBpbiA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7CisgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICclcydcbiIsIGZpbGVfbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZnNlZWsoaW4sIDAsIFNFRUtfRU5EKTsKKyAgZmlsZV9zaXplID0gZnRlbGwoaW4pOworICBmc2VlayhpbiwgMCwgU0VFS19TRVQpOworICAvLyB3ZSBhbGxvY2F0ZSBvbmUgZXh0cmEgYnl0ZSBmb3IgdGhlIFwwIHRlcm1pbmF0b3IKKyAgZmlsZV9kYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhmaWxlX3NpemUgKyAxKTsKKyAgaWYgKGZpbGVfZGF0YSA9PSBOVUxMKSB7CisgICAgZmNsb3NlKGluKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgd2hlbiByZWFkaW5nIGZpbGUgJXNcbiIsCisgICAgICAgICAgICBmaWxlX25hbWUpOworICAgIHJldHVybiAwOworICB9CisgIG9rID0gKGZyZWFkKGZpbGVfZGF0YSwgZmlsZV9zaXplLCAxLCBpbikgPT0gMSk7CisgIGZjbG9zZShpbik7CisKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgJWQgYnl0ZXMgb2YgZGF0YSBmcm9tIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAoaW50KWZpbGVfc2l6ZSwgZmlsZV9uYW1lKTsKKyAgICBmcmVlKGZpbGVfZGF0YSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZmlsZV9kYXRhW2ZpbGVfc2l6ZV0gPSAnXDAnOyAgLy8gY29udmVuaWVudCAwLXRlcm1pbmF0b3IKKyAgKmRhdGEgPSBmaWxlX2RhdGE7CisgICpkYXRhX3NpemUgPSBmaWxlX3NpemU7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgSW1nSW9VdGlsV3JpdGVGaWxlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBpbnQgb2s7CisgIEZJTEUqIG91dDsKKyAgY29uc3QgaW50IHRvX3N0ZG91dCA9IChmaWxlX25hbWUgPT0gTlVMTCkgfHwgIXN0cmNtcChmaWxlX25hbWUsICItIik7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIG91dCA9IHRvX3N0ZG91dCA/IEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoc3Rkb3V0KSA6IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7CisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCBvcGVuIG91dHB1dCBmaWxlICclcydcbiIsIGZpbGVfbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb2sgPSAoZndyaXRlKGRhdGEsIGRhdGFfc2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgaWYgKG91dCAhPSBzdGRvdXQpIGZjbG9zZShvdXQpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgSW1nSW9VdGlsQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgd2hpbGUgKGhlaWdodC0tID4gMCkgeworICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggKiBzaXplb2YoKmRzdCkpOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9IG5tZW1iICogc2l6ZTsKKyAgaW50IG9rID0gKHRvdGFsX3NpemUgPT0gKHNpemVfdCl0b3RhbF9zaXplKTsKKyNpZiBkZWZpbmVkKFdFQlBfTUFYX0lNQUdFX1NJWkUpCisgIG9rID0gb2sgJiYgKHRvdGFsX3NpemUgPD0gKHVpbnQ2NF90KVdFQlBfTUFYX0lNQUdFX1NJWkUpOworI2VuZGlmCisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGIxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1hZ2UgZGVjb2RlcnMuCisvLworCisjaWZuZGVmIFdFQlBfSU1BR0VJT19JTUFHRUlPX1VUSUxfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX0lNQUdFSU9fVVRJTF9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbGUgSS9PCisKKy8vIFJlb3BlbiBmaWxlIGluIGJpbmFyeSAoT19CSU5BUlkpIG1vZGUuCisvLyBSZXR1cm5zICdmaWxlJyBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KK0ZJTEUqIEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoRklMRSogZmlsZSk7CisKKy8vIEFsbG9jYXRlcyBzdG9yYWdlIGZvciBlbnRpcmUgZmlsZSAnZmlsZV9uYW1lJyBhbmQgcmV0dXJucyBjb250ZW50cyBhbmQgc2l6ZQorLy8gaW4gJ2RhdGEnIGFuZCAnZGF0YV9zaXplJy4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLiAnKmRhdGEnIHNob3VsZAorLy8gYmUgZGVsZXRlZCB1c2luZyBmcmVlKCkuCisvLyBOb3RlOiBmb3IgY29udmVuaWVuY2UsIHRoZSBkYXRhIHdpbGwgYmUgbnVsbC10ZXJtaW5hdGVkIHdpdGggYW4gZXh0cmEgYnl0ZQorLy8gKG5vdCBhY2NvdW50ZWQgZm9yIGluICpkYXRhX3NpemUpLCBpbiBjYXNlIHRoZSBmaWxlIGlzIHRleHQgYW5kIGludGVuZGVkCisvLyB0byBiZSB1c2VkIGFzIGEgQy1zdHJpbmcuCisvLyBJZiAnZmlsZV9uYW1lJyBpcyBOVUxMIG9yIGVxdWFsIHRvICItIiwgaW5wdXQgaXMgcmVhZCBmcm9tIHN0ZGluIGJ5IGNhbGxpbmcKKy8vIHRoZSBmdW5jdGlvbiBJbWdJb1V0aWxSZWFkRnJvbVN0ZGluKCkuCitpbnQgSW1nSW9VdGlsUmVhZEZpbGUoY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSk7CisKKy8vIFNhbWUgYXMgSW1nSW9VdGlsUmVhZEZpbGUoKSwgYnV0IHJlYWRzIHVudGlsIEVPRiBmcm9tIHN0ZGluIGluc3RlYWQuCitpbnQgSW1nSW9VdGlsUmVhZEZyb21TdGRpbihjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUpOworCisvLyBXcml0ZSBhIGRhdGEgc2VnbWVudCBpbnRvIGEgZmlsZSBuYW1lZCAnZmlsZV9uYW1lJy4gUmV0dXJucyB0cnVlIGlmIG9rLgorLy8gSWYgJ2ZpbGVfbmFtZScgaXMgTlVMTCBvciBlcXVhbCB0byAiLSIsIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0ZG91dC4KK2ludCBJbWdJb1V0aWxXcml0ZUZpbGUoY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29weSB3aWR0aCB4IGhlaWdodCBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyB0aGUgc3RyaWRlcy4KK3ZvaWQgSW1nSW9VdGlsQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBvZiBubWVtYiAqIHNpemUuCitpbnQgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3codWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19JTUFHRUlPX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5jCkBAIC0wLDAgKzEsMzU5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSlBFRyBkZWNvZGUuCisKKyNpbmNsdWRlICIuL2pwZWdkZWMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgV0VCUF9IQVZFX0pQRUcKKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8amVycm9yLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0YWRhdGEgcHJvY2Vzc2luZworCisjaWZuZGVmIEpQRUdfQVBQMQorIyBkZWZpbmUgSlBFR19BUFAxIChKUEVHX0FQUDAgKyAxKQorI2VuZGlmCisjaWZuZGVmIEpQRUdfQVBQMgorIyBkZWZpbmUgSlBFR19BUFAyIChKUEVHX0FQUDAgKyAyKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IGRhdGFfbGVuZ3RoOworICBpbnQgc2VxOyAgLy8gdGhpcyBzZWdtZW50J3Mgc2VxdWVuY2UgbnVtYmVyIFsxLCAyNTVdIGZvciB1c2UgaW4gcmVhc3NlbWJseS4KK30gSUNDUFNlZ21lbnQ7CisKK3N0YXRpYyB2b2lkIFNhdmVNZXRhZGF0YU1hcmtlcnMoal9kZWNvbXByZXNzX3B0ciBkaW5mbykgeworICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X21hcmtlcl9sZW5ndGggPSAweGZmZmY7CisgIGpwZWdfc2F2ZV9tYXJrZXJzKGRpbmZvLCBKUEVHX0FQUDEsIG1heF9tYXJrZXJfbGVuZ3RoKTsgIC8vIEV4aWYvWE1QCisgIGpwZWdfc2F2ZV9tYXJrZXJzKGRpbmZvLCBKUEVHX0FQUDIsIG1heF9tYXJrZXJfbGVuZ3RoKTsgIC8vIElDQyBwcm9maWxlCit9CisKK3N0YXRpYyBpbnQgQ29tcGFyZUlDQ1BTZWdtZW50cyhjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKSB7CisgIGNvbnN0IElDQ1BTZWdtZW50KiBzMSA9IChjb25zdCBJQ0NQU2VnbWVudCopYTsKKyAgY29uc3QgSUNDUFNlZ21lbnQqIHMyID0gKGNvbnN0IElDQ1BTZWdtZW50KiliOworICByZXR1cm4gczEtPnNlcSAtIHMyLT5zZXE7Cit9CisKKy8vIEV4dHJhY3QgSUNDIHByb2ZpbGUgc2VnbWVudHMgZnJvbSB0aGUgbWFya2VyIGxpc3QgaW4gJ2RpbmZvJywgcmVhc3NlbWJsaW5nCisvLyBhbmQgc3RvcmluZyB0aGVtIGluICdpY2NwJy4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBmb3IgbWVtb3J5IGVycm9ycyBhbmQgY29ycnVwdCBwcm9maWxlcy4KK3N0YXRpYyBpbnQgU3RvcmVJQ0NQKGpfZGVjb21wcmVzc19wdHIgZGluZm8sIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgaWNjcCkgeworICAvLyBJQ0MuMToyMDEwLTEyICg0LjMuMC4wKSBBbm5leCBCLjQgRW1iZWRkaW5nIElDQyBQcm9maWxlcyBpbiBKUEVHIGZpbGVzCisgIHN0YXRpYyBjb25zdCBjaGFyIGtJQ0NQU2lnbmF0dXJlW10gPSAiSUNDX1BST0ZJTEUiOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJQ0NQU2lnbmF0dXJlTGVuZ3RoID0gMTI7ICAvLyBzaWduYXR1cmUgaW5jbHVkZXMgJ1wwJworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJQ0NQU2tpcExlbmd0aCA9IDE0OyAgLy8gc2lnbmF0dXJlICsgc2VxICYgY291bnQKKyAgaW50IGV4cGVjdGVkX2NvdW50ID0gMDsKKyAgaW50IGFjdHVhbF9jb3VudCA9IDA7CisgIGludCBzZXFfbWF4ID0gMDsKKyAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworICBJQ0NQU2VnbWVudCBpY2NwX3NlZ21lbnRzWzI1NV07CisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXI7CisKKyAgbWVtc2V0KGljY3Bfc2VnbWVudHMsIDAsIHNpemVvZihpY2NwX3NlZ21lbnRzKSk7CisgIGZvciAobWFya2VyID0gZGluZm8tPm1hcmtlcl9saXN0OyBtYXJrZXIgIT0gTlVMTDsgbWFya2VyID0gbWFya2VyLT5uZXh0KSB7CisgICAgaWYgKG1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMiAmJgorICAgICAgICBtYXJrZXItPmRhdGFfbGVuZ3RoID4ga0lDQ1BTa2lwTGVuZ3RoICYmCisgICAgICAgICFtZW1jbXAobWFya2VyLT5kYXRhLCBrSUNDUFNpZ25hdHVyZSwga0lDQ1BTaWduYXR1cmVMZW5ndGgpKSB7CisgICAgICAvLyBJQ0NfUFJPRklMRVwwPHNlcT48Y291bnQ+OyAnc2VxJyBzdGFydHMgYXQgMS4KKyAgICAgIGNvbnN0IGludCBzZXEgPSBtYXJrZXItPmRhdGFba0lDQ1BTaWduYXR1cmVMZW5ndGhdOworICAgICAgY29uc3QgaW50IGNvdW50ID0gbWFya2VyLT5kYXRhW2tJQ0NQU2lnbmF0dXJlTGVuZ3RoICsgMV07CisgICAgICBjb25zdCBzaXplX3Qgc2VnbWVudF9zaXplID0gbWFya2VyLT5kYXRhX2xlbmd0aCAtIGtJQ0NQU2tpcExlbmd0aDsKKyAgICAgIElDQ1BTZWdtZW50KiBzZWdtZW50OworCisgICAgICBpZiAoc2VnbWVudF9zaXplID09IDAgfHwgY291bnQgPT0gMCB8fCBzZXEgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltJQ0NQXSBzaXplICglZCkgLyBjb3VudCAoJWQpIC8gc2VxdWVuY2UgbnVtYmVyICglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSAwIVxuIiwKKyAgICAgICAgICAgICAgICAoaW50KXNlZ21lbnRfc2l6ZSwgc2VxLCBjb3VudCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBpZiAoZXhwZWN0ZWRfY291bnQgPT0gMCkgeworICAgICAgICBleHBlY3RlZF9jb3VudCA9IGNvdW50OworICAgICAgfSBlbHNlIGlmIChleHBlY3RlZF9jb3VudCAhPSBjb3VudCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltJQ0NQXSBJbmNvbnNpc3RlbnQgc2VnbWVudCBjb3VudCAoJWQgLyAlZCkhXG4iLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvdW50LCBjb3VudCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBzZWdtZW50ID0gaWNjcF9zZWdtZW50cyArIHNlcSAtIDE7CisgICAgICBpZiAoc2VnbWVudC0+ZGF0YV9sZW5ndGggIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltJQ0NQXSBEdXBsaWNhdGUgc2VnbWVudCBudW1iZXIgKCVkKSFcbiIgLCBzZXEpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc2VnbWVudC0+ZGF0YSA9IG1hcmtlci0+ZGF0YSArIGtJQ0NQU2tpcExlbmd0aDsKKyAgICAgIHNlZ21lbnQtPmRhdGFfbGVuZ3RoID0gc2VnbWVudF9zaXplOworICAgICAgc2VnbWVudC0+c2VxID0gc2VxOworICAgICAgdG90YWxfc2l6ZSArPSBzZWdtZW50X3NpemU7CisgICAgICBpZiAoc2VxID4gc2VxX21heCkgc2VxX21heCA9IHNlcTsKKyAgICAgICsrYWN0dWFsX2NvdW50OworICAgIH0KKyAgfQorCisgIGlmIChhY3R1YWxfY291bnQgPT0gMCkgcmV0dXJuIDE7CisgIGlmIChzZXFfbWF4ICE9IGFjdHVhbF9jb3VudCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiW0lDQ1BdIERpc2NvbnRpbnVvdXMgc2VnbWVudHMsIGV4cGVjdGVkOiAlZCBhY3R1YWw6ICVkIVxuIiwKKyAgICAgICAgICAgIGFjdHVhbF9jb3VudCwgc2VxX21heCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGV4cGVjdGVkX2NvdW50ICE9IGFjdHVhbF9jb3VudCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiW0lDQ1BdIFNlZ21lbnQgY291bnQ6ICVkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkOiAlZCFcbiIsCisgICAgICAgICAgICBhY3R1YWxfY291bnQsIGV4cGVjdGVkX2NvdW50KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFRoZSBzZWdtZW50cyBtYXkgYXBwZWFyIG91dCBvZiBvcmRlciBpbiB0aGUgZmlsZSwgc29ydCB0aGVtIGJhc2VkIG9uCisgIC8vIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgYXNzZW1ibGluZyB0aGUgcGF5bG9hZC4KKyAgcXNvcnQoaWNjcF9zZWdtZW50cywgYWN0dWFsX2NvdW50LCBzaXplb2YoKmljY3Bfc2VnbWVudHMpLAorICAgICAgICBDb21wYXJlSUNDUFNlZ21lbnRzKTsKKworICBpY2NwLT5ieXRlcyA9ICh1aW50OF90KiltYWxsb2ModG90YWxfc2l6ZSk7CisgIGlmIChpY2NwLT5ieXRlcyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWNjcC0+c2l6ZSA9IHRvdGFsX3NpemU7CisKKyAgeworICAgIGludCBpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzZXFfbWF4OyArK2kpIHsKKyAgICAgIG1lbWNweShpY2NwLT5ieXRlcyArIG9mZnNldCwKKyAgICAgICAgICAgICBpY2NwX3NlZ21lbnRzW2ldLmRhdGEsIGljY3Bfc2VnbWVudHNbaV0uZGF0YV9sZW5ndGgpOworICAgICAgb2Zmc2V0ICs9IGljY3Bfc2VnbWVudHNbaV0uZGF0YV9sZW5ndGg7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2UgZm9yIG1lbW9yeSBlcnJvcnMgYW5kIGNvcnJ1cHQgcHJvZmlsZXMuCisvLyBUaGUgY2FsbGVyIG11c3QgdXNlIE1ldGFkYXRhRnJlZSgpIG9uICdtZXRhZGF0YScgaW4gYWxsIGNhc2VzLgorc3RhdGljIGludCBFeHRyYWN0TWV0YWRhdGFGcm9tSlBFRyhqX2RlY29tcHJlc3NfcHRyIGRpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgaW50IG1hcmtlcjsKKyAgICBjb25zdCBjaGFyKiBzaWduYXR1cmU7CisgICAgc2l6ZV90IHNpZ25hdHVyZV9sZW5ndGg7CisgICAgc2l6ZV90IHN0b3JhZ2Vfb2Zmc2V0OworICB9IGtKUEVHTWV0YWRhdGFNYXBbXSA9IHsKKyAgICAvLyBFeGlmIDIuMiBTZWN0aW9uIDQuNy4yIEludGVyb3BlcmFiaWxpdHkgU3RydWN0dXJlIG9mIEFQUDEgLi4uCisgICAgeyBKUEVHX0FQUDEsICJFeGlmXDAiLCAgICAgICAgICAgICAgICAgICAgICAgIDYsIE1FVEFEQVRBX09GRlNFVChleGlmKSB9LAorICAgIC8vIFhNUCBTcGVjaWZpY2F0aW9uIFBhcnQgMyBTZWN0aW9uIDMgRW1iZWRkaW5nIFhNUCBNZXRhZGF0YSAuLi4gI0pQRUcKKyAgICAvLyBUT0RPKGp6ZXJuKSBBZGQgc3VwcG9ydCBmb3IgJ0V4dGVuZGVkWE1QJworICAgIHsgSlBFR19BUFAxLCAiaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIsIDI5LCBNRVRBREFUQV9PRkZTRVQoeG1wKSB9LAorICAgIHsgMCwgTlVMTCwgMCwgMCB9LAorICB9OworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyOworICAvLyBUcmVhdCBJQ0MgcHJvZmlsZXMgc2VwYXJhdGVseSBhcyB0aGV5IG1heSBiZSBzZWdtZW50ZWQgYW5kIG91dCBvZiBvcmRlci4KKyAgaWYgKCFTdG9yZUlDQ1AoZGluZm8sICZtZXRhZGF0YS0+aWNjcCkpIHJldHVybiAwOworCisgIGZvciAobWFya2VyID0gZGluZm8tPm1hcmtlcl9saXN0OyBtYXJrZXIgIT0gTlVMTDsgbWFya2VyID0gbWFya2VyLT5uZXh0KSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsga0pQRUdNZXRhZGF0YU1hcFtpXS5tYXJrZXIgIT0gMDsgKytpKSB7CisgICAgICBpZiAobWFya2VyLT5tYXJrZXIgPT0ga0pQRUdNZXRhZGF0YU1hcFtpXS5tYXJrZXIgJiYKKyAgICAgICAgICBtYXJrZXItPmRhdGFfbGVuZ3RoID4ga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmVfbGVuZ3RoICYmCisgICAgICAgICAgIW1lbWNtcChtYXJrZXItPmRhdGEsIGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmVfbGVuZ3RoKSkgeworICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQgPQorICAgICAgICAgICAgKE1ldGFkYXRhUGF5bG9hZCopKCh1aW50OF90KiltZXRhZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0pQRUdNZXRhZGF0YU1hcFtpXS5zdG9yYWdlX29mZnNldCk7CisKKyAgICAgICAgaWYgKHBheWxvYWQtPmJ5dGVzID09IE5VTEwpIHsKKyAgICAgICAgICBjb25zdCBjaGFyKiBtYXJrZXJfZGF0YSA9IChjb25zdCBjaGFyKiltYXJrZXItPmRhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmVfbGVuZ3RoOworICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXJrZXJfZGF0YV9sZW5ndGggPQorICAgICAgICAgICAgICBtYXJrZXItPmRhdGFfbGVuZ3RoIC0ga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmVfbGVuZ3RoOworICAgICAgICAgIGlmICghTWV0YWRhdGFDb3B5KG1hcmtlcl9kYXRhLCBtYXJrZXJfZGF0YV9sZW5ndGgsIHBheWxvYWQpKSByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklnbm9yaW5nIGFkZGl0aW9uYWwgJyVzJyBtYXJrZXJcbiIsCisgICAgICAgICAgICAgICAgICBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBKUEVHX0FQUDEKKyN1bmRlZiBKUEVHX0FQUDIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEpQRUcgZGVjb2RpbmcKKworc3RydWN0IG15X2Vycm9yX21nciB7CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBwdWI7CisgIGptcF9idWYgc2V0am1wX2J1ZmZlcjsKK307CisKK3N0YXRpYyB2b2lkIG15X2Vycm9yX2V4aXQoal9jb21tb25fcHRyIGRpbmZvKSB7CisgIHN0cnVjdCBteV9lcnJvcl9tZ3IqIG15ZXJyID0gKHN0cnVjdCBteV9lcnJvcl9tZ3IqKWRpbmZvLT5lcnI7CisgIGRpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKGRpbmZvKTsKKyAgbG9uZ2ptcChteWVyci0+c2V0am1wX2J1ZmZlciwgMSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfc291cmNlX21nciBwdWI7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBkYXRhX3NpemU7Cit9IEpQRUdSZWFkQ29udGV4dDsKKworc3RhdGljIHZvaWQgQ29udGV4dEluaXQoal9kZWNvbXByZXNzX3B0ciBjaW5mbykgeworICBKUEVHUmVhZENvbnRleHQqIGNvbnN0IGN0eCA9IChKUEVHUmVhZENvbnRleHQqKWNpbmZvLT5zcmM7CisgIGN0eC0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IGN0eC0+ZGF0YTsKKyAgY3R4LT5wdWIuYnl0ZXNfaW5fYnVmZmVyID0gY3R4LT5kYXRhX3NpemU7Cit9CisKK3N0YXRpYyBib29sZWFuIENvbnRleHRGaWxsKGpfZGVjb21wcmVzc19wdHIgY2luZm8pIHsKKyAgLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlLgorICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfUkVBRCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQgQ29udGV4dFNraXAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBqdW1wX3NpemUpIHsKKyAgSlBFR1JlYWRDb250ZXh0KiBjb25zdCBjdHggPSAoSlBFR1JlYWRDb250ZXh0KiljaW5mby0+c3JjOworICBzaXplX3QganVtcCA9IChzaXplX3QpanVtcF9zaXplOworICBpZiAoanVtcCA+IGN0eC0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeyAgLy8gRG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlci4KKyAgICBqdW1wID0gY3R4LT5wdWIuYnl0ZXNfaW5fYnVmZmVyOworICB9CisgIGN0eC0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSBqdW1wOworICBjdHgtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0ganVtcDsKK30KKworc3RhdGljIHZvaWQgQ29udGV4dFRlcm0oal9kZWNvbXByZXNzX3B0ciBjaW5mbykgeworICAodm9pZCljaW5mbzsKK30KKworc3RhdGljIHZvaWQgQ29udGV4dFNldHVwKHZvbGF0aWxlIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjb25zdCBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHUmVhZENvbnRleHQqIGNvbnN0IGN0eCkgeworICBjaW5mby0+c3JjID0gKHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IqKWN0eDsKKyAgY3R4LT5wdWIuaW5pdF9zb3VyY2UgPSBDb250ZXh0SW5pdDsKKyAgY3R4LT5wdWIuZmlsbF9pbnB1dF9idWZmZXIgPSBDb250ZXh0RmlsbDsKKyAgY3R4LT5wdWIuc2tpcF9pbnB1dF9kYXRhID0gQ29udGV4dFNraXA7CisgIGN0eC0+cHViLnJlc3luY190b19yZXN0YXJ0ID0ganBlZ19yZXN5bmNfdG9fcmVzdGFydDsKKyAgY3R4LT5wdWIudGVybV9zb3VyY2UgPSBDb250ZXh0VGVybTsKKyAgY3R4LT5wdWIuYnl0ZXNfaW5fYnVmZmVyID0gMDsKKyAgY3R4LT5wdWIubmV4dF9pbnB1dF9ieXRlID0gTlVMTDsKK30KKworaW50IFJlYWRKUEVHKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIHZvbGF0aWxlIGludCBvayA9IDA7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICBpbnQ2NF90IHN0cmlkZTsKKyAgdm9sYXRpbGUgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgZGluZm87CisgIHN0cnVjdCBteV9lcnJvcl9tZ3IgamVycjsKKyAgdWludDhfdCogdm9sYXRpbGUgcmdiID0gTlVMTDsKKyAgSlNBTVBST1cgYnVmZmVyWzFdOworICBKUEVHUmVhZENvbnRleHQgY3R4OworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IDAgfHwgcGljID09IE5VTEwpIHJldHVybiAwOworCisgICh2b2lkKWtlZXBfYWxwaGE7CisgIG1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisgIGN0eC5kYXRhID0gZGF0YTsKKyAgY3R4LmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKworICBtZW1zZXQoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvLCAwLCBzaXplb2YoZGluZm8pKTsgICAvLyBmb3Igc2V0am1wIHNhbml0eQorICBkaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVyci5wdWIpOworICBqZXJyLnB1Yi5lcnJvcl9leGl0ID0gbXlfZXJyb3JfZXhpdDsKKworICBpZiAoc2V0am1wKGplcnIuc2V0am1wX2J1ZmZlcikpIHsKKyBFcnJvcjoKKyAgICBNZXRhZGF0YUZyZWUobWV0YWRhdGEpOworICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisgICAgZ290byBFbmQ7CisgIH0KKworICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisgIENvbnRleHRTZXR1cCgmZGluZm8sICZjdHgpOworICBpZiAobWV0YWRhdGEgIT0gTlVMTCkgU2F2ZU1ldGFkYXRhTWFya2Vycygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworICBqcGVnX3JlYWRfaGVhZGVyKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbywgVFJVRSk7CisKKyAgZGluZm8ub3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgZGluZm8uZG9fZmFuY3lfdXBzYW1wbGluZyA9IFRSVUU7CisKKyAganBlZ19zdGFydF9kZWNvbXByZXNzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisKKyAgaWYgKGRpbmZvLm91dHB1dF9jb21wb25lbnRzICE9IDMpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgd2lkdGggPSBkaW5mby5vdXRwdXRfd2lkdGg7CisgIGhlaWdodCA9IGRpbmZvLm91dHB1dF9oZWlnaHQ7CisgIHN0cmlkZSA9IChpbnQ2NF90KWRpbmZvLm91dHB1dF93aWR0aCAqIGRpbmZvLm91dHB1dF9jb21wb25lbnRzICogc2l6ZW9mKCpyZ2IpOworCisgIGlmIChzdHJpZGUgIT0gKGludClzdHJpZGUgfHwKKyAgICAgICFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhzdHJpZGUsIGhlaWdodCkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgcmdiID0gKHVpbnQ4X3QqKW1hbGxvYygoc2l6ZV90KXN0cmlkZSAqIGhlaWdodCk7CisgIGlmIChyZ2IgPT0gTlVMTCkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgYnVmZmVyWzBdID0gKEpTQU1QTEUqKXJnYjsKKworICB3aGlsZSAoZGluZm8ub3V0cHV0X3NjYW5saW5lIDwgZGluZm8ub3V0cHV0X2hlaWdodCkgeworICAgIGlmIChqcGVnX3JlYWRfc2NhbmxpbmVzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbywgYnVmZmVyLCAxKSAhPSAxKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBidWZmZXJbMF0gKz0gc3RyaWRlOworICB9CisKKyAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICBvayA9IEV4dHJhY3RNZXRhZGF0YUZyb21KUEVHKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbywgbWV0YWRhdGEpOworICAgIGlmICghb2spIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZXh0cmFjdGluZyBKUEVHIG1ldGFkYXRhIVxuIik7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKyAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKworICAvLyBXZWJQIGNvbnZlcnNpb24uCisgIHBpYy0+d2lkdGggPSB3aWR0aDsKKyAgcGljLT5oZWlnaHQgPSBoZWlnaHQ7CisgIG9rID0gV2ViUFBpY3R1cmVJbXBvcnRSR0IocGljLCByZ2IsIChpbnQpc3RyaWRlKTsKKyAgaWYgKCFvaykgZ290byBFcnJvcjsKKworIEVuZDoKKyAgZnJlZShyZ2IpOworICByZXR1cm4gb2s7Cit9CisjZWxzZSAgLy8gIVdFQlBfSEFWRV9KUEVHCitpbnQgUmVhZEpQRUcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClkYXRhOworICAodm9pZClkYXRhX3NpemU7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIGZwcmludGYoc3RkZXJyLCAiSlBFRyBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYmpwZWcgIgorICAgICAgICAgICJkZXZlbG9wbWVudCBwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gV0VCUF9IQVZFX0pQRUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmYzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBKUEVHIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fSlBFR0RFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fSlBFR0RFQ19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gUmVhZHMgYSBKUEVHIGZyb20gJ2RhdGEnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gVGhlIG91dHB1dCBpcyBSR0Igb3IgWVVWIGRlcGVuZGluZyBvbiBwaWMtPnVzZV9hcmdiIHZhbHVlLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisvLyAna2VlcF9hbHBoYScgaGFzIG5vIGVmZmVjdCwgYnV0IGlzIGtlcHQgZm9yIGNvaGVyZW5jZSB3aXRoIG90aGVyIHNpZ25hdHVyZXMKKy8vIGZvciBpbWFnZSByZWFkZXJzLgoraW50IFJlYWRKUEVHKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX0pQRUdERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZmMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTWV0YWRhdGEgdHlwZXMgYW5kIGZ1bmN0aW9ucy4KKy8vCisKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKwordm9pZCBNZXRhZGF0YUluaXQoTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSByZXR1cm47CisgIG1lbXNldChtZXRhZGF0YSwgMCwgc2l6ZW9mKCptZXRhZGF0YSkpOworfQorCit2b2lkIE1ldGFkYXRhUGF5bG9hZERlbGV0ZShNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpIHsKKyAgaWYgKHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuOworICBmcmVlKHBheWxvYWQtPmJ5dGVzKTsKKyAgcGF5bG9hZC0+Ynl0ZXMgPSBOVUxMOworICBwYXlsb2FkLT5zaXplID0gMDsKK30KKwordm9pZCBNZXRhZGF0YUZyZWUoTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSByZXR1cm47CisgIE1ldGFkYXRhUGF5bG9hZERlbGV0ZSgmbWV0YWRhdGEtPmV4aWYpOworICBNZXRhZGF0YVBheWxvYWREZWxldGUoJm1ldGFkYXRhLT5pY2NwKTsKKyAgTWV0YWRhdGFQYXlsb2FkRGVsZXRlKCZtZXRhZGF0YS0+eG1wKTsKK30KKworaW50IE1ldGFkYXRhQ29weShjb25zdCBjaGFyKiBtZXRhZGF0YSwgc2l6ZV90IG1ldGFkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKSB7CisgIGlmIChtZXRhZGF0YSA9PSBOVUxMIHx8IG1ldGFkYXRhX2xlbiA9PSAwIHx8IHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBheWxvYWQtPmJ5dGVzID0gKHVpbnQ4X3QqKW1hbGxvYyhtZXRhZGF0YV9sZW4pOworICBpZiAocGF5bG9hZC0+Ynl0ZXMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBheWxvYWQtPnNpemUgPSBtZXRhZGF0YV9sZW47CisgIG1lbWNweShwYXlsb2FkLT5ieXRlcywgbWV0YWRhdGEsIG1ldGFkYXRhX2xlbik7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWJlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBNZXRhZGF0YSB0eXBlcyBhbmQgZnVuY3Rpb25zLgorLy8KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fTUVUQURBVEFfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX01FVEFEQVRBX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgTWV0YWRhdGFQYXlsb2FkIHsKKyAgdWludDhfdCogYnl0ZXM7CisgIHNpemVfdCBzaXplOworfSBNZXRhZGF0YVBheWxvYWQ7CisKK3R5cGVkZWYgc3RydWN0IE1ldGFkYXRhIHsKKyAgTWV0YWRhdGFQYXlsb2FkIGV4aWY7CisgIE1ldGFkYXRhUGF5bG9hZCBpY2NwOworICBNZXRhZGF0YVBheWxvYWQgeG1wOworfSBNZXRhZGF0YTsKKworI2RlZmluZSBNRVRBREFUQV9PRkZTRVQoeCkgb2Zmc2V0b2YoTWV0YWRhdGEsIHgpCisKK3ZvaWQgTWV0YWRhdGFJbml0KE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7Cit2b2lkIE1ldGFkYXRhUGF5bG9hZERlbGV0ZShNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpOwordm9pZCBNZXRhZGF0YUZyZWUoTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworLy8gU3RvcmVzICdtZXRhZGF0YScgdG8gJ3BheWxvYWQtPmJ5dGVzJywgcmV0dXJucyBmYWxzZSBvbiBhbGxvY2F0aW9uIGVycm9yLgoraW50IE1ldGFkYXRhQ29weShjb25zdCBjaGFyKiBtZXRhZGF0YSwgc2l6ZV90IG1ldGFkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19NRVRBREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMjM1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmMKQEAgLTAsMCArMSwzNDAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQTkcgZGVjb2RlLgorCisjaW5jbHVkZSAiLi9wbmdkZWMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgV0VCUF9IQVZFX1BORworI2luY2x1ZGUgPHBuZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPiAgIC8vIG5vdGU6IHRoaXMgbXVzdCBiZSBpbmNsdWRlZCAqYWZ0ZXIqIHBuZy5oCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCitzdGF0aWMgdm9pZCBQTkdBUEkgZXJyb3JfZnVuY3Rpb24ocG5nX3N0cnVjdHAgcG5nLCBwbmdfY29uc3RfY2hhcnAgZXJyb3IpIHsKKyAgaWYgKGVycm9yICE9IE5VTEwpIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlc1xuIiwgZXJyb3IpOworICBsb25nam1wKHBuZ19qbXBidWYocG5nKSwgMSk7Cit9CisKKy8vIENvbnZlcnRzIHRoZSBOVUxMIHRlcm1pbmF0ZWQgJ2hleHN0cmluZycgd2hpY2ggY29udGFpbnMgMi1ieXRlIGNoYXJhY3RlcgorLy8gcmVwcmVzZW50YXRpb25zIG9mIGhleCB2YWx1ZXMgdG8gcmF3IGRhdGEuCisvLyAnaGV4c3RyaW5nJyBtYXkgY29udGFpbiB2YWx1ZXMgY29uc2lzdGluZyBvZiBbQS1GXVthLWZdWzAtOV0gaW4gcGFpcnMsCisvLyBlLmcuLCA3YWYyLi4uLCBzZXBhcmF0ZWQgYnkgYW55IG51bWJlciBvZiBuZXdsaW5lcy4KKy8vICdleHBlY3RlZF9sZW5ndGgnIGlzIHRoZSBhbnRpY2lwYXRlZCBwcm9jZXNzZWQgc2l6ZS4KKy8vIE9uIHN1Y2Nlc3MgdGhlIHJhdyBidWZmZXIgaXMgcmV0dXJuZWQgd2l0aCBpdHMgbGVuZ3RoIGVxdWl2YWxlbnQgdG8KKy8vICdleHBlY3RlZF9sZW5ndGgnLiBOVUxMIGlzIHJldHVybmVkIGlmIHRoZSBwcm9jZXNzZWQgbGVuZ3RoIGlzIGxlc3MgdGhhbgorLy8gJ2V4cGVjdGVkX2xlbmd0aCcgb3IgYW55IGNoYXJhY3RlciBhc2lkZSBmcm9tIHRob3NlIGFib3ZlIGlzIGVuY291bnRlcmVkLgorLy8gVGhlIHJldHVybmVkIGJ1ZmZlciBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCitzdGF0aWMgdWludDhfdCogSGV4U3RyaW5nVG9CeXRlcyhjb25zdCBjaGFyKiBoZXhzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRfbGVuZ3RoKSB7CisgIGNvbnN0IGNoYXIqIHNyYyA9IGhleHN0cmluZzsKKyAgc2l6ZV90IGFjdHVhbF9sZW5ndGggPSAwOworICB1aW50OF90KiBjb25zdCByYXdfZGF0YSA9ICh1aW50OF90KiltYWxsb2MoZXhwZWN0ZWRfbGVuZ3RoKTsKKyAgdWludDhfdCogZHN0OworCisgIGlmIChyYXdfZGF0YSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBmb3IgKGRzdCA9IHJhd19kYXRhOyBhY3R1YWxfbGVuZ3RoIDwgZXhwZWN0ZWRfbGVuZ3RoICYmICpzcmMgIT0gJ1wwJzsgKytzcmMpIHsKKyAgICBjaGFyKiBlbmQ7CisgICAgY2hhciB2YWxbM107CisgICAgaWYgKCpzcmMgPT0gJ1xuJykgY29udGludWU7CisgICAgdmFsWzBdID0gKnNyYysrOworICAgIHZhbFsxXSA9ICpzcmM7CisgICAgdmFsWzJdID0gJ1wwJzsKKyAgICAqZHN0KysgPSAodWludDhfdClzdHJ0b2wodmFsLCAmZW5kLCAxNik7CisgICAgaWYgKGVuZCAhPSB2YWwgKyAyKSBicmVhazsKKyAgICArK2FjdHVhbF9sZW5ndGg7CisgIH0KKworICBpZiAoYWN0dWFsX2xlbmd0aCAhPSBleHBlY3RlZF9sZW5ndGgpIHsKKyAgICBmcmVlKHJhd19kYXRhKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmF3X2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgUHJvY2Vzc1Jhd1Byb2ZpbGUoY29uc3QgY2hhciogcHJvZmlsZSwgc2l6ZV90IHByb2ZpbGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpIHsKKyAgY29uc3QgY2hhciogc3JjID0gcHJvZmlsZTsKKyAgY2hhciogZW5kOworICBpbnQgZXhwZWN0ZWRfbGVuZ3RoOworCisgIGlmIChwcm9maWxlID09IE5VTEwgfHwgcHJvZmlsZV9sZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgLy8gSW1hZ2VNYWdpY2sgZm9ybWF0cyAncmF3IHByb2ZpbGVzJyBhcworICAvLyAnXG48bmFtZT5cbjxsZW5ndGg+KCU4bHUpXG48aGV4IHBheWxvYWQ+XG4nLgorICBpZiAoKnNyYyAhPSAnXG4nKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgcmF3IHByb2ZpbGUsIGV4cGVjdGVkICdcXG4nIGdvdCAnXFx4JS4yWCdcbiIsCisgICAgICAgICAgICAqc3JjKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICArK3NyYzsKKyAgLy8gc2tpcCB0aGUgcHJvZmlsZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBsZW5ndGguCisgIHdoaWxlICgqc3JjICE9ICdcMCcgJiYgKnNyYysrICE9ICdcbicpIHt9CisgIGV4cGVjdGVkX2xlbmd0aCA9IChpbnQpc3RydG9sKHNyYywgJmVuZCwgMTApOworICBpZiAoKmVuZCAhPSAnXG4nKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgcmF3IHByb2ZpbGUsIGV4cGVjdGVkICdcXG4nIGdvdCAnXFx4JS4yWCdcbiIsCisgICAgICAgICAgICAqZW5kKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICArK2VuZDsKKworICAvLyAnZW5kJyBub3cgcG9pbnRzIHRvIHRoZSBwcm9maWxlIHBheWxvYWQuCisgIHBheWxvYWQtPmJ5dGVzID0gSGV4U3RyaW5nVG9CeXRlcyhlbmQsIGV4cGVjdGVkX2xlbmd0aCk7CisgIGlmIChwYXlsb2FkLT5ieXRlcyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGF5bG9hZC0+c2l6ZSA9IGV4cGVjdGVkX2xlbmd0aDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyKiBuYW1lOworICBpbnQgKCpwcm9jZXNzKShjb25zdCBjaGFyKiBwcm9maWxlLCBzaXplX3QgcHJvZmlsZV9sZW4sCisgICAgICAgICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCk7CisgIHNpemVfdCBzdG9yYWdlX29mZnNldDsKK30ga1BOR01ldGFkYXRhTWFwW10gPSB7CisgIC8vIGh0dHA6Ly93d3cuc25vLnBoeS5xdWVlbnN1LmNhL35waGlsL2V4aWZ0b29sL1RhZ05hbWVzL1BORy5odG1sI1RleHR1YWxEYXRhCisgIC8vIFNlZSBhbHNvOiBFeGlmVG9vbCBvbiBDUEFOLgorICB7ICJSYXcgcHJvZmlsZSB0eXBlIGV4aWYiLCBQcm9jZXNzUmF3UHJvZmlsZSwgTUVUQURBVEFfT0ZGU0VUKGV4aWYpIH0sCisgIHsgIlJhdyBwcm9maWxlIHR5cGUgeG1wIiwgIFByb2Nlc3NSYXdQcm9maWxlLCBNRVRBREFUQV9PRkZTRVQoeG1wKSB9LAorICAvLyBFeGlmdG9vbCBwdXRzIGV4aWYgZGF0YSBpbiBBUFAxIGNodW5rLCB0b28uCisgIHsgIlJhdyBwcm9maWxlIHR5cGUgQVBQMSIsIFByb2Nlc3NSYXdQcm9maWxlLCBNRVRBREFUQV9PRkZTRVQoZXhpZikgfSwKKyAgLy8gWE1QIFNwZWNpZmljYXRpb24gUGFydCAzLCBTZWN0aW9uIDMgI1BORworICB7ICJYTUw6Y29tLmFkb2JlLnhtcCIsICAgICBNZXRhZGF0YUNvcHksICAgICAgTUVUQURBVEFfT0ZGU0VUKHhtcCkgfSwKKyAgeyBOVUxMLCBOVUxMLCAwIH0sCit9OworCisvLyBMb29rcyBmb3IgbWV0YWRhdGEgYXQgYm90aCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIFBORyBmaWxlLCBnaXZpbmcKKy8vIHByZWZlcmVuY2UgdG8gdGhlIGhlYWQuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gVGhlIGNhbGxlciBtdXN0IHVzZSBNZXRhZGF0YUZyZWUoKSBvbiAnbWV0YWRhdGEnIGluCisvLyBhbGwgY2FzZXMuCitzdGF0aWMgaW50IEV4dHJhY3RNZXRhZGF0YUZyb21QTkcocG5nX3N0cnVjdHAgcG5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbmZvcCBjb25zdCBoZWFkX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGNvbnN0IGVuZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpbnQgcDsKKworICBmb3IgKHAgPSAwOyBwIDwgMjsgKytwKSAgeworICAgIHBuZ19pbmZvcCBjb25zdCBpbmZvID0gKHAgPT0gMCkgPyBoZWFkX2luZm8gOiBlbmRfaW5mbzsKKyAgICBwbmdfdGV4dHAgdGV4dCA9IE5VTEw7CisgICAgY29uc3QgcG5nX3VpbnRfMzIgbnVtID0gcG5nX2dldF90ZXh0KHBuZywgaW5mbywgJnRleHQsIE5VTEwpOworICAgIHBuZ191aW50XzMyIGk7CisgICAgLy8gTG9vayBmb3IgRVhJRiAvIFhNUCBtZXRhZGF0YS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2ksICsrdGV4dCkgeworICAgICAgaW50IGo7CisgICAgICBmb3IgKGogPSAwOyBrUE5HTWV0YWRhdGFNYXBbal0ubmFtZSAhPSBOVUxMOyArK2opIHsKKyAgICAgICAgaWYgKCFzdHJjbXAodGV4dC0+a2V5LCBrUE5HTWV0YWRhdGFNYXBbal0ubmFtZSkpIHsKKyAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQgPQorICAgICAgICAgICAgICAoTWV0YWRhdGFQYXlsb2FkKikoKHVpbnQ4X3QqKW1ldGFkYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQTkdNZXRhZGF0YU1hcFtqXS5zdG9yYWdlX29mZnNldCk7CisgICAgICAgICAgcG5nX3NpemVfdCB0ZXh0X2xlbmd0aDsKKyAgICAgICAgICBzd2l0Y2ggKHRleHQtPmNvbXByZXNzaW9uKSB7CisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICAgICAgICAgICBjYXNlIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkU6CisgICAgICAgICAgICBjYXNlIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQ6CisgICAgICAgICAgICAgIHRleHRfbGVuZ3RoID0gdGV4dC0+aXR4dF9sZW5ndGg7CisgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU6CisgICAgICAgICAgICBjYXNlIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0ZXh0X2xlbmd0aCA9IHRleHQtPnRleHRfbGVuZ3RoOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHBheWxvYWQtPmJ5dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgYWRkaXRpb25hbCAnJXMnXG4iLCB0ZXh0LT5rZXkpOworICAgICAgICAgIH0gZWxzZSBpZiAoIWtQTkdNZXRhZGF0YU1hcFtqXS5wcm9jZXNzKHRleHQtPnRleHQsIHRleHRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwcm9jZXNzOiAnJXMnXG4iLCB0ZXh0LT5rZXkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIExvb2sgZm9yIGFuIElDQyBwcm9maWxlLgorICAgIHsKKyAgICAgIHBuZ19jaGFycCBuYW1lOworICAgICAgaW50IGNvbXBfdHlwZTsKKyNpZiAoKFBOR19MSUJQTkdfVkVSX01BSk9SIDw8IDgpIHwgUE5HX0xJQlBOR19WRVJfTUlOT1IgPDwgMCkgPCBcCisgICAgKCgxIDw8IDgpIHwgKDUgPDwgMCkpCisgICAgICBwbmdfY2hhcnAgcHJvZmlsZTsKKyNlbHNlICAvLyA+PSBsaWJwbmcgMS41LjAKKyAgICAgIHBuZ19ieXRlcCBwcm9maWxlOworI2VuZGlmCisgICAgICBwbmdfdWludF8zMiBsZW47CisKKyAgICAgIGlmIChwbmdfZ2V0X2lDQ1AocG5nLCBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJmNvbXBfdHlwZSwgJnByb2ZpbGUsICZsZW4pID09IFBOR19JTkZPX2lDQ1ApIHsKKyAgICAgICAgaWYgKCFNZXRhZGF0YUNvcHkoKGNvbnN0IGNoYXIqKXByb2ZpbGUsIGxlbiwgJm1ldGFkYXRhLT5pY2NwKSkgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBkYXRhX3NpemU7CisgIHBuZ19zaXplX3Qgb2Zmc2V0OworfSBQTkdSZWFkQ29udGV4dDsKKworc3RhdGljIHZvaWQgUmVhZEZ1bmMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSB7CisgIFBOR1JlYWRDb250ZXh0KiBjb25zdCBjdHggPSAoUE5HUmVhZENvbnRleHQqKXBuZ19nZXRfaW9fcHRyKHBuZ19wdHIpOworICBpZiAoY3R4LT5kYXRhX3NpemUgLSBjdHgtPm9mZnNldCA8IGxlbmd0aCkgeworICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUmVhZEZ1bmM6IGludmFsaWQgcmVhZCBsZW5ndGggKG92ZXJmbG93KSEiKTsKKyAgfQorICBtZW1jcHkoZGF0YSwgY3R4LT5kYXRhICsgY3R4LT5vZmZzZXQsIGxlbmd0aCk7CisgIGN0eC0+b2Zmc2V0ICs9IGxlbmd0aDsKK30KKworaW50IFJlYWRQTkcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgdm9sYXRpbGUgcG5nX3N0cnVjdHAgcG5nID0gTlVMTDsKKyAgdm9sYXRpbGUgcG5nX2luZm9wIGluZm8gPSBOVUxMOworICB2b2xhdGlsZSBwbmdfaW5mb3AgZW5kX2luZm8gPSBOVUxMOworICBQTkdSZWFkQ29udGV4dCBjb250ZXh0ID0geyBOVUxMLCAwLCAwIH07CisgIGludCBjb2xvcl90eXBlLCBiaXRfZGVwdGgsIGludGVybGFjZWQ7CisgIGludCBoYXNfYWxwaGE7CisgIGludCBudW1fcGFzc2VzOworICBpbnQgcDsKKyAgdm9sYXRpbGUgaW50IG9rID0gMDsKKyAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodCwgeTsKKyAgaW50NjRfdCBzdHJpZGU7CisgIHVpbnQ4X3QqIHZvbGF0aWxlIHJnYiA9IE5VTEw7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCB8fCBwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgY29udGV4dC5kYXRhID0gZGF0YTsKKyAgY29udGV4dC5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisKKyAgcG5nID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIDAsIDAsIDApOworICBpZiAocG5nID09IE5VTEwpIGdvdG8gRW5kOworCisgIHBuZ19zZXRfZXJyb3JfZm4ocG5nLCAwLCBlcnJvcl9mdW5jdGlvbiwgTlVMTCk7CisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmcpKSkgeworIEVycm9yOgorICAgIE1ldGFkYXRhRnJlZShtZXRhZGF0YSk7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmcpOworICBpZiAoaW5mbyA9PSBOVUxMKSBnb3RvIEVycm9yOworICBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nKTsKKyAgaWYgKGVuZF9pbmZvID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgcG5nX3NldF9yZWFkX2ZuKHBuZywgJmNvbnRleHQsIFJlYWRGdW5jKTsKKyAgcG5nX3JlYWRfaW5mbyhwbmcsIGluZm8pOworICBpZiAoIXBuZ19nZXRfSUhEUihwbmcsIGluZm8sCisgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VkLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkgZ290byBFcnJvcjsKKworICBwbmdfc2V0X3N0cmlwXzE2KHBuZyk7CisgIHBuZ19zZXRfcGFja2luZyhwbmcpOworICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSB7CisgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmcpOworICB9CisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKKyAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkgeworICAgIGlmIChiaXRfZGVwdGggPCA4KSB7CisgICAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nKTsKKyAgICB9CisgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmcpOworICB9CisgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZywgaW5mbywgUE5HX0lORk9fdFJOUykpIHsKKyAgICBwbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nKTsKKyAgICBoYXNfYWxwaGEgPSAxOworICB9IGVsc2UgeworICAgIGhhc19hbHBoYSA9ICEhKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSk7CisgIH0KKworICAvLyBBcHBseSBnYW1tYSBjb3JyZWN0aW9uIGlmIG5lZWRlZC4KKyAgeworICAgIGRvdWJsZSBpbWFnZV9nYW1tYSA9IDEgLyAyLjIsIHNjcmVlbl9nYW1tYSA9IDIuMjsKKyAgICBpbnQgc3JnYl9pbnRlbnQ7CisgICAgaWYgKHBuZ19nZXRfc1JHQihwbmcsIGluZm8sICZzcmdiX2ludGVudCkgfHwKKyAgICAgICAgcG5nX2dldF9nQU1BKHBuZywgaW5mbywgJmltYWdlX2dhbW1hKSkgeworICAgICAgcG5nX3NldF9nYW1tYShwbmcsIHNjcmVlbl9nYW1tYSwgaW1hZ2VfZ2FtbWEpOworICAgIH0KKyAgfQorCisgIGlmICgha2VlcF9hbHBoYSkgeworICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nKTsKKyAgICBoYXNfYWxwaGEgPSAwOworICB9CisKKyAgbnVtX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZyk7CisgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZywgaW5mbyk7CisKKyAgc3RyaWRlID0gKGludDY0X3QpKGhhc19hbHBoYSA/IDQgOiAzKSAqIHdpZHRoICogc2l6ZW9mKCpyZ2IpOworICBpZiAoc3RyaWRlICE9IChpbnQpc3RyaWRlIHx8CisgICAgICAhSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coc3RyaWRlLCBoZWlnaHQpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHJnYiA9ICh1aW50OF90KiltYWxsb2MoKHNpemVfdClzdHJpZGUgKiBoZWlnaHQpOworICBpZiAocmdiID09IE5VTEwpIGdvdG8gRXJyb3I7CisgIGZvciAocCA9IDA7IHAgPCBudW1fcGFzc2VzOyArK3ApIHsKKyAgICBwbmdfYnl0ZXAgcm93ID0gcmdiOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgcG5nX3JlYWRfcm93cyhwbmcsICZyb3csIE5VTEwsIDEpOworICAgICAgcm93ICs9IHN0cmlkZTsKKyAgICB9CisgIH0KKyAgcG5nX3JlYWRfZW5kKHBuZywgZW5kX2luZm8pOworCisgIGlmIChtZXRhZGF0YSAhPSBOVUxMICYmCisgICAgICAhRXh0cmFjdE1ldGFkYXRhRnJvbVBORyhwbmcsIGluZm8sIGVuZF9pbmZvLCBtZXRhZGF0YSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGV4dHJhY3RpbmcgUE5HIG1ldGFkYXRhIVxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHBpYy0+d2lkdGggPSAoaW50KXdpZHRoOworICBwaWMtPmhlaWdodCA9IChpbnQpaGVpZ2h0OworICBvayA9IGhhc19hbHBoYSA/IFdlYlBQaWN0dXJlSW1wb3J0UkdCQShwaWMsIHJnYiwgKGludClzdHJpZGUpCisgICAgICAgICAgICAgICAgIDogV2ViUFBpY3R1cmVJbXBvcnRSR0IocGljLCByZ2IsIChpbnQpc3RyaWRlKTsKKworICBpZiAoIW9rKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgRW5kOgorICBpZiAocG5nICE9IE5VTEwpIHsKKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgocG5nX3N0cnVjdHBwKSZwbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBuZ19pbmZvcHApJmluZm8sIChwbmdfaW5mb3BwKSZlbmRfaW5mbyk7CisgIH0KKyAgZnJlZShyZ2IpOworICByZXR1cm4gb2s7Cit9CisjZWxzZSAgLy8gIVdFQlBfSEFWRV9QTkcKK2ludCBSZWFkUE5HKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljOworICAodm9pZClrZWVwX2FscGhhOworICAodm9pZCltZXRhZGF0YTsKKyAgZnByaW50ZihzdGRlcnIsICJQTkcgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJwbmcgIgorICAgICAgICAgICJkZXZlbG9wbWVudCBwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gV0VCUF9IQVZFX1BORworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhNjEyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFBORyBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX1BOR0RFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fUE5HREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLyBSZWFkcyBhIFBORyBmcm9tICdkYXRhJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIE91dHB1dCBpcyBSR0JBIG9yIFlVVkEsIGRlcGVuZGluZyBvbiBwaWMtPnVzZV9hcmdiIHZhbHVlLgorLy8gSWYgJ2tlZXBfYWxwaGEnIGlzIHRydWUgYW5kIHRoZSBQTkcgaGFzIGFuIGFscGhhIGNoYW5uZWwsIHRoZSBvdXRwdXQgaXMgUkdCQQorLy8gb3IgWVVWQS4gT3RoZXJ3aXNlLCBhbHBoYSBjaGFubmVsIGlzIGRyb3BwZWQgYW5kIG91dHB1dCBpcyBSR0Igb3IgWVVWLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgUmVhZFBORyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fUE5HREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjVhNGEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuYwpAQCAtMCwwICsxLDI1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIChsaW1pdGVkKSBQTk0gZGVjb2RlcgorCisjaW5jbHVkZSAiLi9wbm1kZWMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgV0lEVEhfRkxBRyAgICAgID0gMSA8PCAwLAorICBIRUlHSFRfRkxBRyAgICAgPSAxIDw8IDEsCisgIERFUFRIX0ZMQUcgICAgICA9IDEgPDwgMiwKKyAgTUFYVkFMX0ZMQUcgICAgID0gMSA8PCAzLAorICBUVVBMRV9GTEFHICAgICAgPSAxIDw8IDQsCisgIEFMTF9ORUVERURfRkxBR1MgPSAweDFmCit9IFBOTUZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBkYXRhX3NpemU7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICBpbnQgYnl0ZXNfcGVyX3B4OyAgIC8vIDEsIDMsIDQKKyAgaW50IGRlcHRoOworICBpbnQgbWF4X3ZhbHVlOworICBpbnQgdHlwZTsgICAgICAgICAgIC8vIDUsIDYgb3IgNworICBpbnQgc2Vlbl9mbGFnczsKK30gUE5NSW5mbzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBOTSBkZWNvZGluZworCisjZGVmaW5lIE1BWF9MSU5FX1NJWkUgMTAyNAorc3RhdGljIGNvbnN0IHNpemVfdCBrTWluUE5NSGVhZGVyU2l6ZSA9IDM7CisKK3N0YXRpYyBzaXplX3QgUmVhZExpbmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IG9mZiwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBvdXRbTUFYX0xJTkVfU0laRSArIDFdLCBzaXplX3QqIGNvbnN0IG91dF9zaXplKSB7CisgIHNpemVfdCBpID0gMDsKKyAgKm91dF9zaXplID0gMDsKKyByZWRvOgorICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xJTkVfU0laRSAmJiBvZmYgPCBkYXRhX3NpemU7ICsraSkgeworICAgIG91dFtpXSA9IGRhdGFbb2ZmKytdOworICAgIGlmIChvdXRbaV0gPT0gJ1xuJykgYnJlYWs7CisgIH0KKyAgaWYgKG9mZiA8IGRhdGFfc2l6ZSkgeworICAgIGlmIChpID09IDApIGdvdG8gcmVkbzsgICAgICAgICAvLyBlbXB0eSBsaW5lCisgICAgaWYgKG91dFswXSA9PSAnIycpIGdvdG8gcmVkbzsgIC8vIHNraXAgY29tbWVudAorICB9CisgIG91dFtpXSA9IDA7ICAgLy8gc2FmZXR5IHNlbnRpbmVsCisgICpvdXRfc2l6ZSA9IGk7CisgIHJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzaXplX3QgRmxhZ0Vycm9yKGNvbnN0IGNoYXIgZmxhZ1tdKSB7CisgIGZwcmludGYoc3RkZXJyLCAiUEFNIGhlYWRlciBlcnJvcjogZmxhZ3MgJyVzJyBhbHJlYWR5IHNlZW4uXG4iLCBmbGFnKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGluc3BpcmVkIGZyb20gaHR0cDovL25ldHBibS5zb3VyY2Vmb3JnZS5uZXQvZG9jL3BhbS5odG1sCitzdGF0aWMgc2l6ZV90IFJlYWRQQU1GaWVsZHMoUE5NSW5mbyogY29uc3QgaW5mbywgc2l6ZV90IG9mZikgeworICBjaGFyIG91dFtNQVhfTElORV9TSVpFICsgMV07CisgIHNpemVfdCBvdXRfc2l6ZTsKKyAgaW50IHRtcDsKKyAgYXNzZXJ0KGluZm8gIT0gTlVMTCk7CisgIHdoaWxlICgxKSB7CisgICAgb2ZmID0gUmVhZExpbmUoaW5mby0+ZGF0YSwgb2ZmLCBpbmZvLT5kYXRhX3NpemUsIG91dCwgJm91dF9zaXplKTsKKyAgICBpZiAob2ZmID09IDApIHJldHVybiAwOworICAgIGlmIChzc2NhbmYob3V0LCAiV0lEVEggJWQiLCAmdG1wKSA9PSAxKSB7CisgICAgICBpZiAoaW5mby0+c2Vlbl9mbGFncyAmIFdJRFRIX0ZMQUcpIHJldHVybiBGbGFnRXJyb3IoIldJRFRIIik7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IFdJRFRIX0ZMQUc7CisgICAgICBpbmZvLT53aWR0aCA9IHRtcDsKKyAgICB9IGVsc2UgaWYgKHNzY2FuZihvdXQsICJIRUlHSFQgJWQiLCAmdG1wKSA9PSAxKSB7CisgICAgICBpZiAoaW5mby0+c2Vlbl9mbGFncyAmIEhFSUdIVF9GTEFHKSByZXR1cm4gRmxhZ0Vycm9yKCJIRUlHSFQiKTsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gSEVJR0hUX0ZMQUc7CisgICAgICBpbmZvLT5oZWlnaHQgPSB0bXA7CisgICAgfSBlbHNlIGlmIChzc2NhbmYob3V0LCAiREVQVEggJWQiLCAmdG1wKSA9PSAxKSB7CisgICAgICBpZiAoaW5mby0+c2Vlbl9mbGFncyAmIERFUFRIX0ZMQUcpIHJldHVybiBGbGFnRXJyb3IoIkRFUFRIIik7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IERFUFRIX0ZMQUc7CisgICAgICBpbmZvLT5kZXB0aCA9IHRtcDsKKyAgICB9IGVsc2UgaWYgKHNzY2FuZihvdXQsICJNQVhWQUwgJWQiLCAmdG1wKSA9PSAxKSB7CisgICAgICBpZiAoaW5mby0+c2Vlbl9mbGFncyAmIE1BWFZBTF9GTEFHKSByZXR1cm4gRmxhZ0Vycm9yKCJNQVhWQUwiKTsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gTUFYVkFMX0ZMQUc7CisgICAgICBpbmZvLT5tYXhfdmFsdWUgPSB0bXA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG91dCwgIlRVUExUWVBFIFJHQl9BTFBIQSIpKSB7CisgICAgICBpbmZvLT5ieXRlc19wZXJfcHggPSA0OworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBUVVBMRV9GTEFHOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvdXQsICJUVVBMVFlQRSBSR0IiKSkgeworICAgICAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gMzsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gVFVQTEVfRkxBRzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3V0LCAiVFVQTFRZUEUgR1JBWVNDQUxFIikpIHsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9weCA9IDE7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IFRVUExFX0ZMQUc7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG91dCwgIkVOREhEUiIpKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIga0VsbGlwc2lzW10gPSAiIC4uLiI7CisgICAgICBpbnQgaTsKKyAgICAgIGlmIChvdXRfc2l6ZSA+IDIwKSBzcHJpbnRmKG91dCArIDIwIC0gc3RybGVuKGtFbGxpcHNpcyksIGtFbGxpcHNpcyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClzdHJsZW4ob3V0KTsgKytpKSB7CisgICAgICAgIGlmICghaXNwcmludChvdXRbaV0pKSBvdXRbaV0gPSAnICc7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBBTSBoZWFkZXIgZXJyb3I6IHVucmVjb2duaXplZCBlbnRyeSBbJXNdXG4iLCBvdXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmICghKGluZm8tPnNlZW5fZmxhZ3MgJiBUVVBMRV9GTEFHKSkgeworICAgIGlmIChpbmZvLT5kZXB0aCA+IDAgJiYgaW5mby0+ZGVwdGggPD0gNCAmJiBpbmZvLT5kZXB0aCAhPSAyKSB7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IFRVUExFX0ZMQUc7CisgICAgICBpbmZvLT5ieXRlc19wZXJfcHggPSBpbmZvLT5kZXB0aCAqIChpbmZvLT5tYXhfdmFsdWUgPiAyNTUgPyAyIDogMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUEFNOiBpbnZhbGlkIGJpdGRlcHRoICglZCkuXG4iLCBpbmZvLT5kZXB0aCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKGluZm8tPnNlZW5fZmxhZ3MgIT0gQUxMX05FRURFRF9GTEFHUykgeworICAgIGZwcmludGYoc3RkZXJyLCAiUEFNOiBpbmNvbXBsZXRlIGhlYWRlci5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzaXplX3QgUmVhZEhlYWRlcihQTk1JbmZvKiBjb25zdCBpbmZvKSB7CisgIHNpemVfdCBvZmYgPSAwOworICBjaGFyIG91dFtNQVhfTElORV9TSVpFICsgMV07CisgIHNpemVfdCBvdXRfc2l6ZTsKKyAgaWYgKGluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChpbmZvLT5kYXRhID09IE5VTEwgfHwgaW5mby0+ZGF0YV9zaXplIDwga01pblBOTUhlYWRlclNpemUpIHJldHVybiAwOworCisgIGluZm8tPndpZHRoID0gaW5mby0+aGVpZ2h0ID0gMDsKKyAgaW5mby0+dHlwZSA9IC0xOworICBpbmZvLT5zZWVuX2ZsYWdzID0gMDsKKyAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gMDsKKyAgaW5mby0+ZGVwdGggPSAwOworICBpbmZvLT5tYXhfdmFsdWUgPSAwOworCisgIG9mZiA9IFJlYWRMaW5lKGluZm8tPmRhdGEsIG9mZiwgaW5mby0+ZGF0YV9zaXplLCBvdXQsICZvdXRfc2l6ZSk7CisgIGlmIChvZmYgPT0gMCB8fCBzc2NhbmYob3V0LCAiUCVkIiwgJmluZm8tPnR5cGUpICE9IDEpIHJldHVybiAwOworICBpZiAoaW5mby0+dHlwZSA9PSA3KSB7CisgICAgb2ZmID0gUmVhZFBBTUZpZWxkcyhpbmZvLCBvZmYpOworICB9IGVsc2UgeworICAgIG9mZiA9IFJlYWRMaW5lKGluZm8tPmRhdGEsIG9mZiwgaW5mby0+ZGF0YV9zaXplLCBvdXQsICZvdXRfc2l6ZSk7CisgICAgaWYgKG9mZiA9PSAwIHx8IHNzY2FuZihvdXQsICIlZCAlZCIsICZpbmZvLT53aWR0aCwgJmluZm8tPmhlaWdodCkgIT0gMikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9mZiA9IFJlYWRMaW5lKGluZm8tPmRhdGEsIG9mZiwgaW5mby0+ZGF0YV9zaXplLCBvdXQsICZvdXRfc2l6ZSk7CisgICAgaWYgKG9mZiA9PSAwIHx8IHNzY2FuZihvdXQsICIlZCIsICZpbmZvLT5tYXhfdmFsdWUpICE9IDEpIHJldHVybiAwOworCisgICAgLy8gZmluaXNoIGluaXRpYWxpemluZyBtaXNzaW5nIGZpZWxkcworICAgIGluZm8tPmRlcHRoID0gKGluZm8tPnR5cGUgPT0gNSkgPyAxIDogMzsKKyAgICBpbmZvLT5ieXRlc19wZXJfcHggPSBpbmZvLT5kZXB0aCAqIChpbmZvLT5tYXhfdmFsdWUgPiAyNTUgPyAyIDogMSk7CisgIH0KKyAgLy8gcGVyZm9ybSBzb21lIGJhc2ljIG51bWVyaWNhbCB2YWxpZGF0aW9uCisgIGlmIChpbmZvLT53aWR0aCA8PSAwIHx8IGluZm8tPmhlaWdodCA8PSAwIHx8CisgICAgICBpbmZvLT50eXBlIDw9IDAgfHwgaW5mby0+dHlwZSA+PSA5IHx8CisgICAgICBpbmZvLT5kZXB0aCA8PSAwIHx8IGluZm8tPmRlcHRoID09IDIgfHwgaW5mby0+ZGVwdGggPiA0IHx8CisgICAgICBpbmZvLT5ieXRlc19wZXJfcHggPCBpbmZvLT5kZXB0aCB8fAorICAgICAgaW5mby0+bWF4X3ZhbHVlIDw9IDAgfHwgaW5mby0+bWF4X3ZhbHVlID49IDY1NTM2KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG9mZjsKK30KKworaW50IFJlYWRQTk0oY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpbnQgb2sgPSAwOworICBpbnQgaSwgajsKKyAgdWludDY0X3Qgc3RyaWRlLCBwaXhlbF9ieXRlczsKKyAgdWludDhfdCogcmdiID0gTlVMTCwgKnRtcF9yZ2I7CisgIHNpemVfdCBvZmZzZXQ7CisgIFBOTUluZm8gaW5mbzsKKworICBpbmZvLmRhdGEgPSBkYXRhOworICBpbmZvLmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgb2Zmc2V0ID0gUmVhZEhlYWRlcigmaW5mbyk7CisgIGlmIChvZmZzZXQgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcGFyc2luZyBQTk0gaGVhZGVyLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoaW5mby50eXBlIDwgNSB8fCBpbmZvLnR5cGUgPiA3KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBQJWQgUE5NIGZvcm1hdC5cbiIsIGluZm8udHlwZSk7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBTb21lIGJhc2ljIHZhbGlkYXRpb25zLgorICBpZiAocGljID09IE5VTEwpIGdvdG8gRW5kOworICBpZiAoaW5mby53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBpbmZvLmhlaWdodCA+IFdFQlBfTUFYX0RJTUVOU0lPTikgeworICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCAlZHglZCBkaW1lbnNpb24gZm9yIFBOTVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby53aWR0aCwgaW5mby5oZWlnaHQpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgcGl4ZWxfYnl0ZXMgPSAodWludDY0X3QpaW5mby53aWR0aCAqIGluZm8uaGVpZ2h0ICogaW5mby5ieXRlc19wZXJfcHg7CisgIGlmIChkYXRhX3NpemUgPCBvZmZzZXQgKyBwaXhlbF9ieXRlcykgeworICAgIGZwcmludGYoc3RkZXJyLCAiVHJ1bmNhdGVkIFBOTSBmaWxlIChQJWQpLlxuIiwgaW5mby50eXBlKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBzdHJpZGUgPQorICAgICAgKHVpbnQ2NF90KShpbmZvLmJ5dGVzX3Blcl9weCA8IDMgPyAzIDogaW5mby5ieXRlc19wZXJfcHgpICogaW5mby53aWR0aDsKKyAgaWYgKHN0cmlkZSAhPSAoc2l6ZV90KXN0cmlkZSB8fAorICAgICAgIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHN0cmlkZSwgaW5mby5oZWlnaHQpKSB7CisgICAgZ290byBFbmQ7CisgIH0KKworICByZ2IgPSAodWludDhfdCopbWFsbG9jKChzaXplX3Qpc3RyaWRlICogaW5mby5oZWlnaHQpOworICBpZiAocmdiID09IE5VTEwpIGdvdG8gRW5kOworCisgIC8vIENvbnZlcnQgaW5wdXQKKyAgdG1wX3JnYiA9IHJnYjsKKyAgZm9yIChqID0gMDsgaiA8IGluZm8uaGVpZ2h0OyArK2opIHsKKyAgICBhc3NlcnQob2Zmc2V0ICsgaW5mby5ieXRlc19wZXJfcHggKiBpbmZvLndpZHRoIDw9IGRhdGFfc2l6ZSk7CisgICAgaWYgKGluZm8uZGVwdGggPT0gMSkgeworICAgICAgLy8gY29udmVydCBncmF5c2NhbGUgLT4gUkdCCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby53aWR0aDsgKytpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdiA9IGRhdGFbb2Zmc2V0ICsgaV07CisgICAgICAgIHRtcF9yZ2JbMyAqIGkgKyAwXSA9IHRtcF9yZ2JbMyAqIGkgKyAxXSA9IHRtcF9yZ2JbMyAqIGkgKyAyXSA9IHY7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpbmZvLmRlcHRoID09IDMpIHsgICAvLyBSR0IKKyAgICAgIG1lbWNweSh0bXBfcmdiLCBkYXRhICsgb2Zmc2V0LCAzICogaW5mby53aWR0aCAqIHNpemVvZigqZGF0YSkpOworICAgIH0gZWxzZSBpZiAoaW5mby5kZXB0aCA9PSA0KSB7ICAgLy8gUkdCQQorICAgICAgbWVtY3B5KHRtcF9yZ2IsIGRhdGEgKyBvZmZzZXQsIDQgKiBpbmZvLndpZHRoICogc2l6ZW9mKCpkYXRhKSk7CisgICAgfQorICAgIG9mZnNldCArPSBpbmZvLmJ5dGVzX3Blcl9weCAqIGluZm8ud2lkdGg7CisgICAgdG1wX3JnYiArPSBzdHJpZGU7CisgIH0KKworICAvLyBXZWJQIGNvbnZlcnNpb24uCisgIHBpYy0+d2lkdGggPSBpbmZvLndpZHRoOworICBwaWMtPmhlaWdodCA9IGluZm8uaGVpZ2h0OworICBvayA9IChpbmZvLmRlcHRoID09IDQpID8gV2ViUFBpY3R1cmVJbXBvcnRSR0JBKHBpYywgcmdiLCAoaW50KXN0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFdlYlBQaWN0dXJlSW1wb3J0UkdCKHBpYywgcmdiLCAoaW50KXN0cmlkZSk7CisgIGlmICghb2spIGdvdG8gRW5kOworCisgIG9rID0gMTsKKyBFbmQ6CisgIGZyZWUoKHZvaWQqKXJnYik7CisKKyAgKHZvaWQpbWV0YWRhdGE7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDU4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBwYXJ0aWFsIFBOTSBmb3JtYXQgZGVjb2RlciAocHBtL3BnbSkKKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fUE5NREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19QTk1ERUNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIFJlYWRzIGEgUE5NIGZpbGUgZnJvbSAnZGF0YScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBUaGUgb3V0cHV0IGlzIFJHQiBvciBZVVYgZGVwZW5kaW5nIG9uIHBpYy0+dXNlX2FyZ2IgdmFsdWUuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKy8vICdtZXRhZGF0YScgaGFzIG5vIGVmZmVjdCwgYnV0IGlzIGtlcHQgZm9yIGNvaGVyZW5jZSB3aXRoIG90aGVyIHNpZ25hdHVyZXMKKy8vIGZvciBpbWFnZSByZWFkZXJzLgoraW50IFJlYWRQTk0oY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX1BOTURFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmViNjgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmMKQEAgLTAsMCArMSwyNjggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUSUZGIGRlY29kZS4KKworI2luY2x1ZGUgIi4vdGlmZmRlYy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBXRUJQX0hBVkVfVElGRgorI2luY2x1ZGUgPHRpZmZpby5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIHR0YWdfdCB0YWc7CisgIHNpemVfdCBzdG9yYWdlX29mZnNldDsKK30ga1RJRkZNZXRhZGF0YU1hcFtdID0geworICB7IFRJRkZUQUdfSUNDUFJPRklMRSwgTUVUQURBVEFfT0ZGU0VUKGljY3ApIH0sCisgIHsgVElGRlRBR19YTUxQQUNLRVQsICBNRVRBREFUQV9PRkZTRVQoeG1wKSB9LAorICB7IDAsIDAgfSwKK307CisKKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBUaGUgY2FsbGVyIG11c3QgdXNlIE1ldGFkYXRhRnJlZSgpIG9uICdtZXRhZGF0YScgaW4KKy8vIGFsbCBjYXNlcy4KK3N0YXRpYyBpbnQgRXh0cmFjdE1ldGFkYXRhRnJvbVRJRkYoVElGRiogY29uc3QgdGlmLCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaW50IGk7CisgIHRvZmZfdCBleGlmX2lmZF9vZmZzZXQ7CisKKyAgZm9yIChpID0gMDsga1RJRkZNZXRhZGF0YU1hcFtpXS50YWcgIT0gMDsgKytpKSB7CisgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkID0KKyAgICAgICAgKE1ldGFkYXRhUGF5bG9hZCopKCh1aW50OF90KiltZXRhZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrVElGRk1ldGFkYXRhTWFwW2ldLnN0b3JhZ2Vfb2Zmc2V0KTsKKyAgICB2b2lkKiB0YWdfZGF0YTsKKyAgICB1aW50MzIgdGFnX2RhdGFfbGVuOworCisgICAgaWYgKFRJRkZHZXRGaWVsZCh0aWYsIGtUSUZGTWV0YWRhdGFNYXBbaV0udGFnLCAmdGFnX2RhdGFfbGVuLCAmdGFnX2RhdGEpICYmCisgICAgICAgICFNZXRhZGF0YUNvcHkoKGNvbnN0IGNoYXIqKXRhZ19kYXRhLCB0YWdfZGF0YV9sZW4sIHBheWxvYWQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBUT0RPKGp6ZXJuKTogVG8gZXh0cmFjdCB0aGUgcmF3IEVYSUYgZGlyZWN0b3J5IHNvbWUgcGFyc2luZyBvZiBpdCB3b3VsZCBiZQorICAvLyBuZWNlc3NhcnkgdG8gZGV0ZXJtaW5lIHRoZSBvdmVyYWxsIHNpemUuIEluIGFkZGl0aW9uLCB2YWx1ZSBvZmZzZXRzIGluCisgIC8vIGluZGl2aWR1YWwgZGlyZWN0b3J5IGVudHJpZXMgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBhcywgZGVwZW5kaW5nIG9uIHRoZQorICAvLyB0eXBlLCB0aGV5IGFyZSBmaWxlIGJhc2VkLgorICAvLyBFeGlmIDIuMiBTZWN0aW9uIDQuNi4yIFRhZyBTdHJ1Y3R1cmUKKyAgLy8gVElGRiBSZXZpc2lvbiA2LjAgUGFydCAxIFNlY3Rpb24gMiBUSUZGIFN0cnVjdHVyZSAjSW1hZ2UgRmlsZSBEaXJlY3RvcnkKKyAgaWYgKFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfRVhJRklGRCwgJmV4aWZfaWZkX29mZnNldCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IEVYSUYgZXh0cmFjdGlvbiBmcm9tIFRJRkYgaXMgdW5zdXBwb3J0ZWQuXG4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gQWQtaG9jIHN0cnVjdHVyZSB0byBzdXBwbHkgcmVhZC1mcm9tLW1lbW9yeSBmdW5jdGlvbmFsaXRpZXMuCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHRvZmZfdCBzaXplOworICB0b2ZmX3QgcG9zOworfSBNeURhdGE7CisKK3N0YXRpYyBpbnQgTXlDbG9zZSh0aGFuZGxlX3Qgb3BhcXVlKSB7CisgICh2b2lkKW9wYXF1ZTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB0b2ZmX3QgTXlTaXplKHRoYW5kbGVfdCBvcGFxdWUpIHsKKyAgY29uc3QgTXlEYXRhKiBjb25zdCBteV9kYXRhID0gKE15RGF0YSopb3BhcXVlOworICByZXR1cm4gbXlfZGF0YS0+c2l6ZTsKK30KKworc3RhdGljIHRvZmZfdCBNeVNlZWsodGhhbmRsZV90IG9wYXF1ZSwgdG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICBNeURhdGEqIGNvbnN0IG15X2RhdGEgPSAoTXlEYXRhKilvcGFxdWU7CisgIG9mZnNldCArPSAod2hlbmNlID09IFNFRUtfQ1VSKSA/IG15X2RhdGEtPnBvcworICAgICAgICAgIDogKHdoZW5jZSA9PSBTRUVLX1NFVCkgPyAwCisgICAgICAgICAgOiBteV9kYXRhLT5zaXplOworICBpZiAob2Zmc2V0ID4gbXlfZGF0YS0+c2l6ZSkgcmV0dXJuICh0b2ZmX3QpLTE7CisgIG15X2RhdGEtPnBvcyA9IG9mZnNldDsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBNeU1hcEZpbGUodGhhbmRsZV90IG9wYXF1ZSwgdm9pZCoqIGJhc2UsIHRvZmZfdCogc2l6ZSkgeworICAodm9pZClvcGFxdWU7CisgICh2b2lkKWJhc2U7CisgICh2b2lkKXNpemU7CisgIHJldHVybiAwOworfQorc3RhdGljIHZvaWQgTXlVbm1hcEZpbGUodGhhbmRsZV90IG9wYXF1ZSwgdm9pZCogYmFzZSwgdG9mZl90IHNpemUpIHsKKyAgKHZvaWQpb3BhcXVlOworICAodm9pZCliYXNlOworICAodm9pZClzaXplOworfQorCitzdGF0aWMgdHNpemVfdCBNeVJlYWQodGhhbmRsZV90IG9wYXF1ZSwgdm9pZCogZHN0LCB0c2l6ZV90IHNpemUpIHsKKyAgTXlEYXRhKiBjb25zdCBteV9kYXRhID0gKE15RGF0YSopb3BhcXVlOworICBpZiAobXlfZGF0YS0+cG9zICsgc2l6ZSA+IG15X2RhdGEtPnNpemUpIHsKKyAgICBzaXplID0gKHRzaXplX3QpKG15X2RhdGEtPnNpemUgLSBteV9kYXRhLT5wb3MpOworICB9CisgIGlmIChzaXplID4gMCkgeworICAgIG1lbWNweShkc3QsIG15X2RhdGEtPmRhdGEgKyBteV9kYXRhLT5wb3MsIHNpemUpOworICAgIG15X2RhdGEtPnBvcyArPSBzaXplOworICB9CisgIHJldHVybiBzaXplOworfQorCisvLyBVbm11bHRpcGx5IEFyZ2IgZGF0YS4gVGFrZW4gZnJvbSBkc3AvYWxwaGFfcHJvY2Vzc2luZworLy8gKHdlIGRvbid0IHdhbnQgdG8gZm9yY2UgYSBkZXBlbmRlbmN5IHRvIGEgbGliZHNwZGVjIGxpYnJhcnkpLgorI2RlZmluZSBNRklYIDI0ICAgIC8vIDI0Yml0IGZpeGVkLXBvaW50IGFyaXRobWV0aWMKKyNkZWZpbmUgSEFMRiAoKDF1IDw8IE1GSVgpID4+IDEpCisjZGVmaW5lIEtJTlZfMjU1ICgoMXUgPDwgTUZJWCkgLyAyNTV1KQorCitzdGF0aWMgdWludDMyX3QgVW5tdWx0KHVpbnQ4X3QgeCwgdWludDMyX3QgbXVsdCkgeworICBjb25zdCB1aW50MzJfdCB2ID0gKHggKiBtdWx0ICsgSEFMRikgPj4gTUZJWDsKKyAgcmV0dXJuICh2ID4gMjU1dSkgPyAyNTV1IDogdjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldFNjYWxlKHVpbnQzMl90IGEpIHsKKyAgcmV0dXJuICgyNTV1IDw8IE1GSVgpIC8gYTsKK30KKworc3RhdGljIHZvaWQgTXVsdEFSR0JSb3codWludDhfdCogcHRyLCBpbnQgd2lkdGgpIHsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4LCBwdHIgKz0gNCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFscGhhID0gcHRyWzNdOworICAgIGlmIChhbHBoYSA8IDI1NSkgeworICAgICAgaWYgKGFscGhhID09IDApIHsgICAvLyBhbHBoYSA9PSAwCisgICAgICAgIHB0clswXSA9IHB0clsxXSA9IHB0clsyXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IEdldFNjYWxlKGFscGhhKTsKKyAgICAgICAgcHRyWzBdID0gVW5tdWx0KHB0clswXSwgc2NhbGUpOworICAgICAgICBwdHJbMV0gPSBVbm11bHQocHRyWzFdLCBzY2FsZSk7CisgICAgICAgIHB0clsyXSA9IFVubXVsdChwdHJbMl0sIHNjYWxlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworaW50IFJlYWRUSUZGKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIE15RGF0YSBteV9kYXRhID0geyBkYXRhLCAodG9mZl90KWRhdGFfc2l6ZSwgMCB9OworICBUSUZGKiB0aWY7CisgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgIHVpbnQxNl90IHNhbXBsZXNfcGVyX3B4ID0gMDsKKyAgdWludDE2X3QgZXh0cmFfc2FtcGxlcyA9IDA7CisgIHVpbnQxNl90KiBleHRyYV9zYW1wbGVzX3B0ciA9IE5VTEw7CisgIHVpbnQzMl90KiByYXN0ZXI7CisgIGludDY0X3QgYWxsb2Nfc2l6ZTsKKyAgaW50IG9rID0gMDsKKyAgdGRpcl90IGRpcmNvdW50OworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IDAgfHwgZGF0YV9zaXplID4gSU5UX01BWCB8fCBwaWMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgdGlmID0gVElGRkNsaWVudE9wZW4oIk1lbW9yeSIsICJyIiwgJm15X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE15UmVhZCwgTXlSZWFkLCBNeVNlZWssIE15Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgIE15U2l6ZSwgTXlNYXBGaWxlLCBNeVVubWFwRmlsZSk7CisgIGlmICh0aWYgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCBwYXJzZSBUSUZGIGZpbGVcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgZGlyY291bnQgPSBUSUZGTnVtYmVyT2ZEaXJlY3Rvcmllcyh0aWYpOworICBpZiAoZGlyY291bnQgPiAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBtdWx0aS1kaXJlY3RvcnkgVElGRiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgIk9ubHkgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZCwgJWQgd2lsbCBiZSBpZ25vcmVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGlyY291bnQgLSAxKTsKKyAgfQorICBpZiAoIVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmc2FtcGxlc19wZXJfcHgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHJldHJpZXZlIFRJRkYgc2FtcGxlcy1wZXItcGl4ZWwgaW5mby5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisgIGlmIChzYW1wbGVzX3Blcl9weCA8IDMgfHwgc2FtcGxlc19wZXJfcHggPiA0KSBnb3RvIEVuZDsgIC8vIG5vdCBzdXBwb3J0ZWQKKworICBpZiAoIShUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0lNQUdFV0lEVEgsICZ3aWR0aCkgJiYKKyAgICAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRUxFTkdUSCwgJmhlaWdodCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHJldHJpZXZlIFRJRkYgaW1hZ2UgZGltZW5zaW9ucy5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisgIGlmICghSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcmFzdGVyKSkpIHsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBpZiAoc2FtcGxlc19wZXJfcHggPiAzICYmICFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0VYVFJBU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYV9zYW1wbGVzLCAmZXh0cmFfc2FtcGxlc19wdHIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHJldHJpZXZlIFRJRkYgRXh0cmFTYW1wbGVzIGluZm8uXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIF9UaWZmbWFsbG9jIHVzZXMgYSBzaWduZWQgdHlwZSBmb3Igc2l6ZS4KKyAgYWxsb2Nfc2l6ZSA9IChpbnQ2NF90KSgodWludDY0X3Qpd2lkdGggKiBoZWlnaHQgKiBzaXplb2YoKnJhc3RlcikpOworICBpZiAoYWxsb2Nfc2l6ZSA8IDAgfHwgYWxsb2Nfc2l6ZSAhPSAodHNpemVfdClhbGxvY19zaXplKSBnb3RvIEVuZDsKKworICByYXN0ZXIgPSAodWludDMyKilfVElGRm1hbGxvYygodHNpemVfdClhbGxvY19zaXplKTsKKyAgaWYgKHJhc3RlciAhPSBOVUxMKSB7CisgICAgaWYgKFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQodGlmLCB3aWR0aCwgaGVpZ2h0LCByYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JJRU5UQVRJT05fVE9QTEVGVCwgMSkpIHsKKyAgICAgIGNvbnN0IGludCBzdHJpZGUgPSB3aWR0aCAqIHNpemVvZigqcmFzdGVyKTsKKyAgICAgIHBpYy0+d2lkdGggPSB3aWR0aDsKKyAgICAgIHBpYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgLy8gVElGRiBkYXRhIGlzIEFCR1IKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICAgIFRJRkZTd2FiQXJyYXlPZkxvbmcocmFzdGVyLCB3aWR0aCAqIGhlaWdodCk7CisjZW5kaWYKKyAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgd2UgbXVzdCB1bi1tdWx0aXBseSBmcm9tIHJnYkEgdG8gUkdCQQorICAgICAgaWYgKGV4dHJhX3NhbXBsZXMgPT0gMSAmJiBleHRyYV9zYW1wbGVzX3B0ciAhPSBOVUxMICYmCisgICAgICAgICAgZXh0cmFfc2FtcGxlc19wdHJbMF0gPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSkgeworICAgICAgICB1aW50MzJfdCB5OworICAgICAgICB1aW50OF90KiB0bXAgPSAodWludDhfdCopcmFzdGVyOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICBNdWx0QVJHQlJvdyh0bXAsIHdpZHRoKTsKKyAgICAgICAgICB0bXAgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICB9CisgICAgICBvayA9IGtlZXBfYWxwaGEKKyAgICAgICAgID8gV2ViUFBpY3R1cmVJbXBvcnRSR0JBKHBpYywgKGNvbnN0IHVpbnQ4X3QqKXJhc3Rlciwgc3RyaWRlKQorICAgICAgICAgOiBXZWJQUGljdHVyZUltcG9ydFJHQlgocGljLCAoY29uc3QgdWludDhfdCopcmFzdGVyLCBzdHJpZGUpOworICAgIH0KKyAgICBfVElGRmZyZWUocmFzdGVyKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGFsbG9jYXRpbmcgVElGRiBSR0JBIG1lbW9yeSFcbiIpOworICB9CisKKyAgaWYgKG9rKSB7CisgICAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgIG9rID0gRXh0cmFjdE1ldGFkYXRhRnJvbVRJRkYodGlmLCBtZXRhZGF0YSk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZXh0cmFjdGluZyBUSUZGIG1ldGFkYXRhIVxuIik7CisgICAgICAgIE1ldGFkYXRhRnJlZShtZXRhZGF0YSk7CisgICAgICAgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICAgICAgfQorICAgIH0KKyAgfQorIEVuZDoKKyAgVElGRkNsb3NlKHRpZik7CisgIHJldHVybiBvazsKK30KKyNlbHNlICAvLyAhV0VCUF9IQVZFX1RJRkYKK2ludCBSZWFkVElGRihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljOworICAodm9pZClrZWVwX2FscGhhOworICAodm9pZCltZXRhZGF0YTsKKyAgZnByaW50ZihzdGRlcnIsICJUSUZGIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGlidGlmZiAiCisgICAgICAgICAgImRldmVsb3BtZW50IHBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIHJldHVybiAwOworfQorI2VuZGlmICAvLyBXRUJQX0hBVkVfVElGRgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhiZWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRJRkYgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19USUZGREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19USUZGREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLyBSZWFkcyBhIFRJRkYgZnJvbSAnZGF0YScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBPdXRwdXQgaXMgUkdCQSBvciBZVVZBLCBkZXBlbmRpbmcgb24gcGljLT51c2VfYXJnYiB2YWx1ZS4KKy8vIElmICdrZWVwX2FscGhhJyBpcyB0cnVlIGFuZCB0aGUgVElGRiBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgdGhlIG91dHB1dCBpcyBSR0JBCisvLyBvciBZVVZBLiBPdGhlcndpc2UsIGFscGhhIGNoYW5uZWwgaXMgZHJvcHBlZCBhbmQgb3V0cHV0IGlzIFJHQiBvciBZVVYuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBSZWFkVElGRihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19USUZGREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDA2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuYwpAQCAtMCwwICsxLDI0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlAgZGVjb2RlLgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4vd2VicGRlYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9kZW11eC5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQIGRlY29kaW5nCisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrU3RhdHVzTWVzc2FnZXNbVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgKyAxXSA9IHsKKyAgIk9LIiwgIk9VVF9PRl9NRU1PUlkiLCAiSU5WQUxJRF9QQVJBTSIsICJCSVRTVFJFQU1fRVJST1IiLAorICAiVU5TVVBQT1JURURfRkVBVFVSRSIsICJTVVNQRU5ERUQiLCAiVVNFUl9BQk9SVCIsICJOT1RfRU5PVUdIX0RBVEEiCit9OworCitzdGF0aWMgdm9pZCBQcmludEFuaW1hdGlvbldhcm5pbmcoY29uc3QgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpZiAoY29uZmlnLT5pbnB1dC5oYXNfYW5pbWF0aW9uKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiRXJyb3IhIERlY29kaW5nIG9mIGFuIGFuaW1hdGVkIFdlYlAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkLlxuIgorICAgICAgICAgICAgIiAgICAgICBVc2Ugd2VicG11eCB0byBleHRyYWN0IHRoZSBpbmRpdmlkdWFsIGZyYW1lcyBvclxuIgorICAgICAgICAgICAgIiAgICAgICB2d2VicCB0byB2aWV3IHRoaXMgaW1hZ2UuXG4iKTsKKyAgfQorfQorCit2b2lkIFByaW50V2ViUEVycm9yKGNvbnN0IGNoYXIqIGNvbnN0IGluX2ZpbGUsIGludCBzdGF0dXMpIHsKKyAgZnByaW50ZihzdGRlcnIsICJEZWNvZGluZyBvZiAlcyBmYWlsZWQuXG4iLCBpbl9maWxlKTsKKyAgZnByaW50ZihzdGRlcnIsICJTdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgaWYgKHN0YXR1cyA+PSBWUDhfU1RBVFVTX09LICYmIHN0YXR1cyA8PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiKCVzKSIsIGtTdGF0dXNNZXNzYWdlc1tzdGF0dXNdKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK2ludCBMb2FkV2ViUChjb25zdCBjaGFyKiBjb25zdCBpbl9maWxlLAorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGJpdHN0cmVhbSkgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGxvY2FsX2ZlYXR1cmVzOworICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGluX2ZpbGUsIGRhdGEsIGRhdGFfc2l6ZSkpIHJldHVybiAwOworCisgIGlmIChiaXRzdHJlYW0gPT0gTlVMTCkgeworICAgIGJpdHN0cmVhbSA9ICZsb2NhbF9mZWF0dXJlczsKKyAgfQorCisgIHN0YXR1cyA9IFdlYlBHZXRGZWF0dXJlcygqZGF0YSwgKmRhdGFfc2l6ZSwgYml0c3RyZWFtKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgZnJlZSgodm9pZCopKmRhdGEpOworICAgICpkYXRhID0gTlVMTDsKKyAgICAqZGF0YV9zaXplID0gMDsKKyAgICBQcmludFdlYlBFcnJvcihpbl9maWxlLCBzdGF0dXMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUDhTdGF0dXNDb2RlIERlY29kZVdlYlAoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgUHJpbnRBbmltYXRpb25XYXJuaW5nKGNvbmZpZyk7CisgIHJldHVybiBXZWJQRGVjb2RlKGRhdGEsIGRhdGFfc2l6ZSwgY29uZmlnKTsKK30KKworVlA4U3RhdHVzQ29kZSBEZWNvZGVXZWJQSW5jcmVtZW50YWwoCisgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gVlA4X1NUQVRVU19PSzsKKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworCisgIFByaW50QW5pbWF0aW9uV2FybmluZyhjb25maWcpOworCisgIC8vIERlY29kaW5nIGNhbGwuCisgIHsKKyAgICBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMgPSBXZWJQSURlY29kZShkYXRhLCBkYXRhX3NpemUsIGNvbmZpZyk7CisgICAgaWYgKGlkZWMgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgZHVyaW5nIFdlYlBJTmV3RGVjb2RlcigpLlxuIik7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0dXMgPSBXZWJQSVVwZGF0ZShpZGVjLCBkYXRhLCBkYXRhX3NpemUpOworICAgICAgV2ViUElEZWxldGUoaWRlYyk7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YQorCitzdGF0aWMgaW50IEV4dHJhY3RNZXRhZGF0YShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIFdlYlBEYXRhIHdlYnBfZGF0YSA9IHsgZGF0YSwgZGF0YV9zaXplIH07CisgIFdlYlBEZW11eGVyKiBjb25zdCBkZW11eCA9IFdlYlBEZW11eCgmd2VicF9kYXRhKTsKKyAgV2ViUENodW5rSXRlcmF0b3IgY2h1bmtfaXRlcjsKKyAgdWludDMyX3QgZmxhZ3M7CisKKyAgaWYgKGRlbXV4ID09IE5VTEwpIHJldHVybiAwOworICBhc3NlcnQobWV0YWRhdGEgIT0gTlVMTCk7CisKKyAgZmxhZ3MgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUyk7CisKKyAgaWYgKChmbGFncyAmIElDQ1BfRkxBRykgJiYgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJJQ0NQIiwgMSwgJmNodW5rX2l0ZXIpKSB7CisgICAgTWV0YWRhdGFDb3B5KChjb25zdCBjaGFyKiljaHVua19pdGVyLmNodW5rLmJ5dGVzLCBjaHVua19pdGVyLmNodW5rLnNpemUsCisgICAgICAgICAgICAgICAgICZtZXRhZGF0YS0+aWNjcCk7CisgICAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICB9CisgIGlmICgoZmxhZ3MgJiBFWElGX0ZMQUcpICYmIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiRVhJRiIsIDEsICZjaHVua19pdGVyKSkgeworICAgIE1ldGFkYXRhQ29weSgoY29uc3QgY2hhciopY2h1bmtfaXRlci5jaHVuay5ieXRlcywgY2h1bmtfaXRlci5jaHVuay5zaXplLAorICAgICAgICAgICAgICAgICAmbWV0YWRhdGEtPmV4aWYpOworICAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgfQorICBpZiAoKGZsYWdzICYgWE1QX0ZMQUcpICYmIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiWE1QICIsIDEsICZjaHVua19pdGVyKSkgeworICAgIE1ldGFkYXRhQ29weSgoY29uc3QgY2hhciopY2h1bmtfaXRlci5jaHVuay5ieXRlcywgY2h1bmtfaXRlci5jaHVuay5zaXplLAorICAgICAgICAgICAgICAgICAmbWV0YWRhdGEtPnhtcCk7CisgICAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICB9CisgIFdlYlBEZW11eERlbGV0ZShkZW11eCk7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmVhZFdlYlAoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBWUDhfU1RBVFVTX09LOworICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIgPSAmY29uZmlnLm91dHB1dDsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBiaXRzdHJlYW0gPSAmY29uZmlnLmlucHV0OworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IDAgfHwgcGljID09IE5VTEwpIHJldHVybiAwOworCisgIGlmICghV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHN0YXR1cyA9IFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsIGJpdHN0cmVhbSk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIFByaW50V2ViUEVycm9yKCJpbnB1dCBkYXRhIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRvIHsKKyAgICBjb25zdCBpbnQgaGFzX2FscGhhID0ga2VlcF9hbHBoYSAmJiBiaXRzdHJlYW0tPmhhc19hbHBoYTsKKyAgICB1aW50NjRfdCBzdHJpZGU7CisgICAgcGljLT53aWR0aCA9IGJpdHN0cmVhbS0+d2lkdGg7CisgICAgcGljLT5oZWlnaHQgPSBiaXRzdHJlYW0tPmhlaWdodDsKKyAgICBpZiAocGljLT51c2VfYXJnYikgeworICAgICAgc3RyaWRlID0gKHVpbnQ2NF90KWJpdHN0cmVhbS0+d2lkdGggKiA0OworICAgIH0gZWxzZSB7CisgICAgICBzdHJpZGUgPSAodWludDY0X3QpYml0c3RyZWFtLT53aWR0aCAqIChoYXNfYWxwaGEgPyA1IDogMykgLyAyOworICAgICAgcGljLT5jb2xvcnNwYWNlID0gaGFzX2FscGhhID8gV0VCUF9ZVVY0MjBBIDogV0VCUF9ZVVY0MjA7CisgICAgfQorCisgICAgaWYgKCFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhzdHJpZGUsIGJpdHN0cmVhbS0+aGVpZ2h0KSkgeworICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgb2sgPSBXZWJQUGljdHVyZUFsbG9jKHBpYyk7CisgICAgaWYgKCFvaykgeworICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwaWMtPnVzZV9hcmdiKSB7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9BUkdCOworI2Vsc2UKKyAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7CisjZW5kaWYKKyAgICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5yZ2JhID0gKHVpbnQ4X3QqKXBpYy0+YXJnYjsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5zdHJpZGUgPSBwaWMtPmFyZ2Jfc3RyaWRlICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5zaXplID0gb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnN0cmlkZSAqIHBpYy0+aGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gaGFzX2FscGhhID8gTU9ERV9ZVVZBIDogTU9ERV9ZVVY7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueSA9IHBpYy0+eTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51ID0gcGljLT51OworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnYgPSBwaWMtPnY7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYSA9IGhhc19hbHBoYSA/IHBpYy0+YSA6IE5VTEw7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueV9zdHJpZGUgPSBwaWMtPnlfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnVfc3RyaWRlID0gcGljLT51dl9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudl9zdHJpZGUgPSBwaWMtPnV2X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3N0cmlkZSA9IGhhc19hbHBoYSA/IHBpYy0+YV9zdHJpZGUgOiAwOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnlfc2l6ZSA9IHBpYy0+aGVpZ2h0ICogcGljLT55X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51X3NpemUgPSAocGljLT5oZWlnaHQgKyAxKSAvIDIgKiBwaWMtPnV2X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52X3NpemUgPSAocGljLT5oZWlnaHQgKyAxKSAvIDIgKiBwaWMtPnV2X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3NpemUgPSBwaWMtPmhlaWdodCAqIHBpYy0+YV9zdHJpZGU7CisgICAgfQorICAgIG91dHB1dF9idWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisKKyAgICBzdGF0dXMgPSBEZWNvZGVXZWJQKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZyk7CisgICAgb2sgPSAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spOworICAgIGlmIChvayAmJiAha2VlcF9hbHBoYSAmJiBwaWMtPnVzZV9hcmdiKSB7CisgICAgICAvLyBOZWVkIHRvIHdpcGUgb3V0IHRoZSBhbHBoYSB2YWx1ZSwgYXMgcmVxdWVzdGVkLgorICAgICAgaW50IHgsIHk7CisgICAgICB1aW50MzJfdCogYXJnYiA9IHBpYy0+YXJnYjsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIGFyZ2JbeF0gfD0gMHhmZjAwMDAwMHU7CisgICAgICAgIGFyZ2IgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKDApOyAgIC8vIDwtIHNvIHdlIGNhbiAnYnJlYWsnIG91dCBvZiB0aGUgbG9vcAorCisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIFByaW50V2ViUEVycm9yKCJpbnB1dCBkYXRhIiwgc3RhdHVzKTsKKyAgICBvayA9IDA7CisgIH0KKworICBXZWJQRnJlZURlY0J1ZmZlcihvdXRwdXRfYnVmZmVyKTsKKworICBpZiAob2sgJiYgbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIG9rID0gRXh0cmFjdE1ldGFkYXRhKGRhdGEsIGRhdGFfc2l6ZSwgbWV0YWRhdGEpOworICAgIGlmICghb2spIHsKKyAgICAgIFByaW50V2ViUEVycm9yKCJtZXRhZGF0YSIsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SKTsKKyAgICB9CisgIH0KKyAgaWYgKCFvaykgV2ViUFBpY3R1cmVGcmVlKHBpYyk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyOWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fV0VCUERFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fV0VCUERFQ19IXworCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQIGRlY29kaW5nCisKKy8vIFByaW50cyBhbiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlIHJlZ2FyZGluZyBkZWNvZGUgZmFpbHVyZSBvZiAnaW5fZmlsZScuCisvLyAnc3RhdHVzJyBpcyB0cmVhdGVkIGFzIGEgVlA4U3RhdHVzQ29kZSBhbmQgaWYgdmFsaWQgd2lsbCBiZSBwcmludGVkIGFzIGEKKy8vIHRleHQgc3RyaW5nLgordm9pZCBQcmludFdlYlBFcnJvcihjb25zdCBjaGFyKiBjb25zdCBpbl9maWxlLCBpbnQgc3RhdHVzKTsKKworLy8gUmVhZHMgYSBXZWJQIGZyb20gJ2luX2ZpbGUnLCByZXR1cm5pbmcgdGhlIGNvbnRlbnRzIGFuZCBzaXplIGluICdkYXRhJyBhbmQKKy8vICdkYXRhX3NpemUnLiBJZiBub3QgTlVMTCwgJ2JpdHN0cmVhbScgaXMgcG9wdWxhdGVkIHVzaW5nIFdlYlBHZXRGZWF0dXJlcygpLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgTG9hZFdlYlAoY29uc3QgY2hhciogY29uc3QgaW5fZmlsZSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUsCisgICAgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBiaXRzdHJlYW0pOworCisvLyBEZWNvZGVzIHRoZSBXZWJQIGNvbnRhaW5lZCBpbiAnZGF0YScuCisvLyAnY29uZmlnJyBpcyBhIHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IFdlYlBJbml0RGVjb2RlckNvbmZpZygpLgorLy8gJ2NvbmZpZy0+b3V0cHV0JyBzaG91bGQgaGF2ZSB0aGUgZGVzaXJlZCBjb2xvcnNwYWNlIHNlbGVjdGVkLgorLy8gUmV0dXJucyB0aGUgZGVjb2RlciBzdGF0dXMuIE9uIHN1Y2Nlc3MgJ2NvbmZpZy0+b3V0cHV0JyB3aWxsIGNvbnRhaW4gdGhlCisvLyBkZWNvZGVkIHBpY3R1cmUuCitWUDhTdGF0dXNDb2RlIERlY29kZVdlYlAoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnKTsKKworLy8gU2FtZSBhcyBEZWNvZGVXZWJQKCksIGJ1dCB1c2luZyB0aGUgaW5jcmVtZW50YWwgZGVjb2Rlci4KK1ZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUEluY3JlbWVudGFsKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERlY29kZXMgYSBXZWJQIGNvbnRhaW5lZCBpbiAnZGF0YScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBPdXRwdXQgaXMgUkdCQSBvciBZVVZBLCBkZXBlbmRpbmcgb24gcGljLT51c2VfYXJnYiB2YWx1ZS4KKy8vIElmICdrZWVwX2FscGhhJyBpcyB0cnVlIGFuZCB0aGUgV2ViUCBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgdGhlIG91dHB1dCBpcyBSR0JBCisvLyBvciBZVVZBLiBPdGhlcndpc2UsIGFscGhhIGNoYW5uZWwgaXMgZHJvcHBlZCBhbmQgb3V0cHV0IGlzIFJHQiBvciBZVVYuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBSZWFkV2ViUChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19XRUJQREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU3MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuYwpAQCAtMCwwICsxLDM5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKFdJQykgZGVjb2RlLgorCisjaW5jbHVkZSAiLi93aWNkZWMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisjaWZkZWYgX19NSU5HVzMyX18KKyNkZWZpbmUgSU5JVEdVSUQgIC8vIFdpdGhvdXQgdGhpcyBHVUlEcyBhcmUgZGVjbGFyZWQgZXh0ZXJuIGFuZCBmYWlsIHRvIGxpbmsKKyNlbmRpZgorI2RlZmluZSBDSU5URVJGQUNFCisjZGVmaW5lIENPQkpNQUNST1MKKyNkZWZpbmUgX1dJTjMyX0lFIDB4NTAwICAvLyBXb3JrYXJvdW5kIGJ1ZyBpbiBzaGx3YXBpLmggd2hlbiBjb21waWxpbmcgQysrCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSB3aXRoIENPQkpNQUNST1MuCisjaW5jbHVkZSA8b2xlMi5oPiAgLy8gQ3JlYXRlU3RyZWFtT25IR2xvYmFsKCkKKyNpbmNsdWRlIDxzaGx3YXBpLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNvZGVjLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCisjZGVmaW5lIElGUyhmbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChTVUNDRUVERUQoaHIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBociA9IChmbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChGQUlMRUQoaHIpKSBmcHJpbnRmKHN0ZGVyciwgI2ZuICIgZmFpbGVkICUwOGx4XG4iLCBocik7ICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vIG1vZGlmaWVkIHZlcnNpb24gb2YgREVGSU5FX0dVSUQgZnJvbSBndWlkZGVmLmguCisjZGVmaW5lIFdFQlBfREVGSU5FX0dVSUQobmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpIFwKKyAgc3RhdGljIGNvbnN0IEdVSUQgbmFtZSA9IFwKKyAgICAgIHsgbCwgdzEsIHcyLCB7IGIxLCBiMiwgIGIzLCAgYjQsICBiNSwgIGI2LCAgYjcsICBiOCB9IH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIE1BS0VfUkVGR1VJRCh4KSAoeCkKKyNlbHNlCisjZGVmaW5lIE1BS0VfUkVGR1VJRCh4KSAmKHgpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgV0lDRm9ybWF0SW1wb3J0ZXIgeworICBjb25zdCBHVUlEKiBwaXhlbF9mb3JtYXQ7CisgIGludCBieXRlc19wZXJfcGl4ZWw7CisgIGludCAoKmltcG9ydCkoV2ViUFBpY3R1cmUqIGNvbnN0LCBjb25zdCB1aW50OF90KiBjb25zdCwgaW50KTsKK30gV0lDRm9ybWF0SW1wb3J0ZXI7CisKKy8vIEZyb20gTWljcm9zb2Z0IFNESyA3LjBhIC0tIHdpbmNvZGVjLmgKKy8vIENyZWF0ZSBsb2NhbCBjb3BpZXMgZm9yIGNvbXBhdGliaWxpdHkgd2hlbiBidWlsZGluZyBhZ2FpbnN0IGVhcmxpZXIKKy8vIHZlcnNpb25zIG9mIHRoZSBTREsuCitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQyNGJwcEJHUl8sCisgICAgICAgICAgICAgICAgIDB4NmZkZGMzMjQsIDB4NGUwMywgMHg0YmZlLAorICAgICAgICAgICAgICAgICAweGIxLCAweDg1LCAweDNkLCAweDc3LCAweDc2LCAweDhkLCAweGM5LCAweDBjKTsKK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDI0YnBwUkdCXywKKyAgICAgICAgICAgICAgICAgMHg2ZmRkYzMyNCwgMHg0ZTAzLCAweDRiZmUsCisgICAgICAgICAgICAgICAgIDB4YjEsIDB4ODUsIDB4M2QsIDB4NzcsIDB4NzYsIDB4OGQsIDB4YzksIDB4MGQpOworV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBCR1JBXywKKyAgICAgICAgICAgICAgICAgMHg2ZmRkYzMyNCwgMHg0ZTAzLCAweDRiZmUsCisgICAgICAgICAgICAgICAgIDB4YjEsIDB4ODUsIDB4M2QsIDB4NzcsIDB4NzYsIDB4OGQsIDB4YzksIDB4MGYpOworV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBSR0JBXywKKyAgICAgICAgICAgICAgICAgMHhmNWM3YWQyZCwgMHg2YThkLCAweDQzZGQsCisgICAgICAgICAgICAgICAgIDB4YTcsIDB4YTgsIDB4YTIsIDB4OTksIDB4MzUsIDB4MjYsIDB4MWEsIDB4ZTkpOworV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0NjRicHBCR1JBXywKKyAgICAgICAgICAgICAgICAgMHgxNTYyZmY3YywgMHhkMzUyLCAweDQ2ZjksCisgICAgICAgICAgICAgICAgIDB4OTcsIDB4OWUsIDB4NDIsIDB4OTcsIDB4NmIsIDB4NzksIDB4MjIsIDB4NDYpOworV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0NjRicHBSR0JBXywKKyAgICAgICAgICAgICAgICAgMHg2ZmRkYzMyNCwgMHg0ZTAzLCAweDRiZmUsCisgICAgICAgICAgICAgICAgIDB4YjEsIDB4ODUsIDB4M2QsIDB4NzcsIDB4NzYsIDB4OGQsIDB4YzksIDB4MTYpOworCitzdGF0aWMgSFJFU1VMVCBPcGVuSW5wdXRTdHJlYW0oY29uc3QgY2hhciogZmlsZW5hbWUsIElTdHJlYW0qKiBzdHJlYW0pIHsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIGlmICghc3RyY21wKGZpbGVuYW1lLCAiLSIpKSB7CisgICAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgICAgY29uc3QgaW50IG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgICBpZiAob2spIHsKKyAgICAgIEhHTE9CQUwgaW1hZ2UgPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBkYXRhX3NpemUpOworICAgICAgaWYgKGltYWdlICE9IE5VTEwpIHsKKyAgICAgICAgdm9pZCogY29uc3QgaW1hZ2VfbWVtID0gR2xvYmFsTG9jayhpbWFnZSk7CisgICAgICAgIGlmIChpbWFnZV9tZW0gIT0gTlVMTCkgeworICAgICAgICAgIG1lbWNweShpbWFnZV9tZW0sIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgR2xvYmFsVW5sb2NrKGltYWdlKTsKKyAgICAgICAgICBJRlMoQ3JlYXRlU3RyZWFtT25IR2xvYmFsKGltYWdlLCBUUlVFLCBzdHJlYW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBociA9IEVfRkFJTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaHIgPSBFX09VVE9GTUVNT1JZOworICAgICAgfQorICAgICAgZnJlZSgodm9pZCopZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGhyID0gRV9GQUlMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBJRlMoU0hDcmVhdGVTdHJlYW1PbkZpbGVBKGZpbGVuYW1lLCBTVEdNX1JFQUQsIHN0cmVhbSkpOworICB9CisKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgaW5wdXQgZmlsZSAlcyAoJTA4bHgpXG4iLCBmaWxlbmFtZSwgaHIpOworICB9CisgIHJldHVybiBocjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGFkYXRhIHByb2Nlc3NpbmcKKworLy8gU3RvcmVzIHRoZSBmaXJzdCBub24temVybyBzaXplZCBjb2xvciBwcm9maWxlIGZyb20gJ2ZyYW1lJyB0byAnaWNjcCcuCisvLyBSZXR1cm5zIGFuIEhSRVNVTFQgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBmYWlsdXJlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisvLyBmb3IgZnJlZWluZyAnaWNjcC0+Ynl0ZXMnIGluIGVpdGhlciBjYXNlLgorc3RhdGljIEhSRVNVTFQgRXh0cmFjdElDQ1AoSVdJQ0ltYWdpbmdGYWN0b3J5KiBjb25zdCBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdJQ0JpdG1hcEZyYW1lRGVjb2RlKiBjb25zdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgaWNjcCkgeworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgVUlOVCBpLCBjb3VudDsKKyAgSVdJQ0NvbG9yQ29udGV4dCoqIGNvbG9yX2NvbnRleHRzOworCisgIElGUyhJV0lDQml0bWFwRnJhbWVEZWNvZGVfR2V0Q29sb3JDb250ZXh0cyhmcmFtZSwgMCwgTlVMTCwgJmNvdW50KSk7CisgIGlmIChGQUlMRUQoaHIpIHx8IGNvdW50ID09IDApIHJldHVybiBocjsKKworICBjb2xvcl9jb250ZXh0cyA9IChJV0lDQ29sb3JDb250ZXh0KiopY2FsbG9jKGNvdW50LCBzaXplb2YoKmNvbG9yX2NvbnRleHRzKSk7CisgIGlmIChjb2xvcl9jb250ZXh0cyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgZm9yIChpID0gMDsgU1VDQ0VFREVEKGhyKSAmJiBpIDwgY291bnQ7ICsraSkgeworICAgIElGUyhJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlQ29sb3JDb250ZXh0KGZhY3RvcnksICZjb2xvcl9jb250ZXh0c1tpXSkpOworICB9CisKKyAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICBVSU5UIG51bV9jb2xvcl9jb250ZXh0czsKKyAgICBJRlMoSVdJQ0JpdG1hcEZyYW1lRGVjb2RlX0dldENvbG9yQ29udGV4dHMoZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb2xvcl9jb250ZXh0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bV9jb2xvcl9jb250ZXh0cykpOworICAgIGFzc2VydChGQUlMRUQoaHIpIHx8IG51bV9jb2xvcl9jb250ZXh0cyA8PSBjb3VudCk7CisgICAgZm9yIChpID0gMDsgU1VDQ0VFREVEKGhyKSAmJiBpIDwgbnVtX2NvbG9yX2NvbnRleHRzOyArK2kpIHsKKyAgICAgIFdJQ0NvbG9yQ29udGV4dFR5cGUgdHlwZTsKKyAgICAgIElGUyhJV0lDQ29sb3JDb250ZXh0X0dldFR5cGUoY29sb3JfY29udGV4dHNbaV0sICZ0eXBlKSk7CisgICAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiB0eXBlID09IFdJQ0NvbG9yQ29udGV4dFByb2ZpbGUpIHsKKyAgICAgICAgVUlOVCBzaXplOworICAgICAgICBJRlMoSVdJQ0NvbG9yQ29udGV4dF9HZXRQcm9maWxlQnl0ZXMoY29sb3JfY29udGV4dHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmc2l6ZSkpOworICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBzaXplID4gMCkgeworICAgICAgICAgIGljY3AtPmJ5dGVzID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgICBpZiAoaWNjcC0+Ynl0ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgaHIgPSBFX09VVE9GTUVNT1JZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGljY3AtPnNpemUgPSBzaXplOworICAgICAgICAgIElGUyhJV0lDQ29sb3JDb250ZXh0X0dldFByb2ZpbGVCeXRlcyhjb2xvcl9jb250ZXh0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQpaWNjcC0+c2l6ZSwgaWNjcC0+Ynl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSk7CisgICAgICAgICAgaWYgKFNVQ0NFRURFRChocikgJiYgc2l6ZSAhPSBpY2NwLT5zaXplKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmchIElDQyBwcm9maWxlIHNpemUgKCV1KSAhPSBleHBlY3RlZCAoJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICBzaXplLCAodWludDMyX3QpaWNjcC0+c2l6ZSk7CisgICAgICAgICAgICBpY2NwLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBpZiAoY29sb3JfY29udGV4dHNbaV0gIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShjb2xvcl9jb250ZXh0c1tpXSk7CisgIH0KKyAgZnJlZShjb2xvcl9jb250ZXh0cyk7CisgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgRXh0cmFjdE1ldGFkYXRhKElXSUNJbWFnaW5nRmFjdG9yeSogY29uc3QgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV0lDQml0bWFwRnJhbWVEZWNvZGUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAvLyBUT0RPKGp6ZXJuKTogYWRkIFhNUC9FWElGIGV4dHJhY3Rpb24uCisgIGNvbnN0IEhSRVNVTFQgaHIgPSBFeHRyYWN0SUNDUChmYWN0b3J5LCBmcmFtZSwgJm1ldGFkYXRhLT5pY2NwKTsKKyAgaWYgKEZBSUxFRChocikpIE1ldGFkYXRhRnJlZShtZXRhZGF0YSk7CisgIHJldHVybiBocjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBIYXNQYWxldHRlKEdVSUQgcGl4ZWxfZm9ybWF0KSB7CisgIHJldHVybiAoSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCkpIHx8CisgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQyYnBwSW5kZXhlZCkpIHx8CisgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ0YnBwSW5kZXhlZCkpIHx8CisgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkpKTsKK30KKworc3RhdGljIGludCBIYXNBbHBoYShJV0lDSW1hZ2luZ0ZhY3RvcnkqIGNvbnN0IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIElXSUNCaXRtYXBEZWNvZGVyKiBjb25zdCBkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICBJV0lDQml0bWFwRnJhbWVEZWNvZGUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICBHVUlEIHBpeGVsX2Zvcm1hdCkgeworICBpbnQgaGFzX2FscGhhOworICBpZiAoSGFzUGFsZXR0ZShwaXhlbF9mb3JtYXQpKSB7CisgICAgSVdJQ1BhbGV0dGUqIGZyYW1lX3BhbGV0dGUgPSBOVUxMOworICAgIElXSUNQYWxldHRlKiBnbG9iYWxfcGFsZXR0ZSA9IE5VTEw7CisgICAgQk9PTCBmcmFtZV9wYWxldHRlX2hhc19hbHBoYSA9IEZBTFNFOworICAgIEJPT0wgZ2xvYmFsX3BhbGV0dGVfaGFzX2FscGhhID0gRkFMU0U7CisKKyAgICAvLyBBIHBhbGV0dGUgbWF5IGV4aXN0IGF0IHRoZSBmcmFtZSBvciBjb250YWluZXIgbGV2ZWwsCisgICAgLy8gY2hlY2sgSVdJQ1BhbGV0dGU6Okhhc0FscGhhKCkgZm9yIGJvdGggaWYgcHJlc2VudC4KKyAgICBpZiAoU1VDQ0VFREVEKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVQYWxldHRlKGZhY3RvcnksICZmcmFtZV9wYWxldHRlKSkgJiYKKyAgICAgICAgU1VDQ0VFREVEKElXSUNCaXRtYXBGcmFtZURlY29kZV9Db3B5UGFsZXR0ZShmcmFtZSwgZnJhbWVfcGFsZXR0ZSkpKSB7CisgICAgICBJV0lDUGFsZXR0ZV9IYXNBbHBoYShmcmFtZV9wYWxldHRlLCAmZnJhbWVfcGFsZXR0ZV9oYXNfYWxwaGEpOworICAgIH0KKyAgICBpZiAoU1VDQ0VFREVEKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVQYWxldHRlKGZhY3RvcnksICZnbG9iYWxfcGFsZXR0ZSkpICYmCisgICAgICAgIFNVQ0NFRURFRChJV0lDQml0bWFwRGVjb2Rlcl9Db3B5UGFsZXR0ZShkZWNvZGVyLCBnbG9iYWxfcGFsZXR0ZSkpKSB7CisgICAgICBJV0lDUGFsZXR0ZV9IYXNBbHBoYShnbG9iYWxfcGFsZXR0ZSwgJmdsb2JhbF9wYWxldHRlX2hhc19hbHBoYSk7CisgICAgfQorICAgIGhhc19hbHBoYSA9IGZyYW1lX3BhbGV0dGVfaGFzX2FscGhhIHx8IGdsb2JhbF9wYWxldHRlX2hhc19hbHBoYTsKKworICAgIGlmIChmcmFtZV9wYWxldHRlICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZnJhbWVfcGFsZXR0ZSk7CisgICAgaWYgKGdsb2JhbF9wYWxldHRlICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZ2xvYmFsX3BhbGV0dGUpOworICB9IGVsc2UgeworICAgIGhhc19hbHBoYSA9IElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBSR0JBXykpIHx8CisgICAgICAgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcEJHUkFfKSkgfHwKKyAgICAgICAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDY0YnBwUkdCQV8pKSB8fAorICAgICAgICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0NjRicHBCR1JBXykpOworICB9CisgIHJldHVybiBoYXNfYWxwaGE7Cit9CisKK2ludCBSZWFkUGljdHVyZVdpdGhXSUMoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgLy8gRnJvbSBNaWNyb3NvZnQgU0RLIDYuMGEgLS0ga3MuaAorICAvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IHRvIGF2b2lkIGxpbmsgZXJyb3JzIHVuZGVyIG1pbmd3LgorICBXRUJQX0RFRklORV9HVUlEKEdVSURfTlVMTF8sIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICBzdGF0aWMgY29uc3QgV0lDRm9ybWF0SW1wb3J0ZXIga0FscGhhRm9ybWF0SW1wb3J0ZXJzW10gPSB7CisgICAgeyAmR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwQkdSQV8sIDQsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSB9LAorICAgIHsgJkdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcFJHQkFfLCA0LCBXZWJQUGljdHVyZUltcG9ydFJHQkEgfSwKKyAgICB7IE5VTEwsIDAsIE5VTEwgfSwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IFdJQ0Zvcm1hdEltcG9ydGVyIGtOb25BbHBoYUZvcm1hdEltcG9ydGVyc1tdID0geworICAgIHsgJkdVSURfV0lDUGl4ZWxGb3JtYXQyNGJwcEJHUl8sIDMsIFdlYlBQaWN0dXJlSW1wb3J0QkdSIH0sCisgICAgeyAmR1VJRF9XSUNQaXhlbEZvcm1hdDI0YnBwUkdCXywgMywgV2ViUFBpY3R1cmVJbXBvcnRSR0IgfSwKKyAgICB7IE5VTEwsIDAsIE5VTEwgfSwKKyAgfTsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIElXSUNCaXRtYXBGcmFtZURlY29kZSogZnJhbWUgPSBOVUxMOworICBJV0lDRm9ybWF0Q29udmVydGVyKiBjb252ZXJ0ZXIgPSBOVUxMOworICBJV0lDSW1hZ2luZ0ZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMOworICBJV0lDQml0bWFwRGVjb2RlciogZGVjb2RlciA9IE5VTEw7CisgIElTdHJlYW0qIHN0cmVhbSA9IE5VTEw7CisgIFVJTlQgZnJhbWVfY291bnQgPSAwOworICBVSU5UIHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKyAgQllURSogcmdiID0gTlVMTDsKKyAgV0lDUGl4ZWxGb3JtYXRHVUlEIHNyY19waXhlbF9mb3JtYXQgPSBHVUlEX1dJQ1BpeGVsRm9ybWF0VW5kZWZpbmVkOworICBjb25zdCBXSUNGb3JtYXRJbXBvcnRlciogaW1wb3J0ZXIgPSBOVUxMOworICBHVUlEIHNyY19jb250YWluZXJfZm9ybWF0ID0gR1VJRF9OVUxMXzsKKyAgc3RhdGljIGNvbnN0IEdVSUQqIGtBbHBoYUNvbnRhaW5lcnNbXSA9IHsKKyAgICAmR1VJRF9Db250YWluZXJGb3JtYXRCbXAsCisgICAgJkdVSURfQ29udGFpbmVyRm9ybWF0UG5nLAorICAgICZHVUlEX0NvbnRhaW5lckZvcm1hdFRpZmYsCisgICAgTlVMTAorICB9OworICBpbnQgaGFzX2FscGhhID0gMDsKKyAgaW50NjRfdCBzdHJpZGU7CisKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgcGljID09IE5VTEwpIHJldHVybiAwOworCisgIElGUyhDb0luaXRpYWxpemUoTlVMTCkpOworICBJRlMoQ29DcmVhdGVJbnN0YW5jZShNQUtFX1JFRkdVSUQoQ0xTSURfV0lDSW1hZ2luZ0ZhY3RvcnkpLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKElJRF9JV0lDSW1hZ2luZ0ZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKikmZmFjdG9yeSkpOworICBpZiAoaHIgPT0gUkVHREJfRV9DTEFTU05PVFJFRykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkNvdWxkbid0IGFjY2VzcyBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChhcmUgeW91IHJ1bm5pbmcgIgorICAgICAgICAgICAgIldpbmRvd3MgWFAgU1AzIG9yIG5ld2VyPykuIE1vc3QgZm9ybWF0cyBub3QgYXZhaWxhYmxlLiAiCisgICAgICAgICAgICAiVXNlIC1zIGZvciB0aGUgYXZhaWxhYmxlIFlVViBpbnB1dC5cbiIpOworICB9CisgIC8vIFByZXBhcmUgZm9yIGltYWdlIGRlY29kaW5nLgorICBJRlMoT3BlbklucHV0U3RyZWFtKGZpbGVuYW1lLCAmc3RyZWFtKSk7CisgIElGUyhJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlRGVjb2RlckZyb21TdHJlYW0oCisgICAgICAgICAgZmFjdG9yeSwgc3RyZWFtLCBOVUxMLAorICAgICAgICAgIFdJQ0RlY29kZU1ldGFkYXRhQ2FjaGVPbkRlbWFuZCwgJmRlY29kZXIpKTsKKyAgSUZTKElXSUNCaXRtYXBEZWNvZGVyX0dldEZyYW1lQ291bnQoZGVjb2RlciwgJmZyYW1lX2NvdW50KSk7CisgIGlmIChTVUNDRUVERUQoaHIpICYmIGZyYW1lX2NvdW50ID09IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGZyYW1lIGZvdW5kIGluIGlucHV0IGZpbGUuXG4iKTsKKyAgICBociA9IEVfRkFJTDsKKyAgfQorICBJRlMoSVdJQ0JpdG1hcERlY29kZXJfR2V0RnJhbWUoZGVjb2RlciwgMCwgJmZyYW1lKSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVEZWNvZGVfR2V0UGl4ZWxGb3JtYXQoZnJhbWUsICZzcmNfcGl4ZWxfZm9ybWF0KSk7CisgIElGUyhJV0lDQml0bWFwRGVjb2Rlcl9HZXRDb250YWluZXJGb3JtYXQoZGVjb2RlciwgJnNyY19jb250YWluZXJfZm9ybWF0KSk7CisKKyAgaWYgKFNVQ0NFRURFRChocikgJiYga2VlcF9hbHBoYSkgeworICAgIGNvbnN0IEdVSUQqKiBndWlkOworICAgIGZvciAoZ3VpZCA9IGtBbHBoYUNvbnRhaW5lcnM7ICpndWlkICE9IE5VTEw7ICsrZ3VpZCkgeworICAgICAgaWYgKElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChzcmNfY29udGFpbmVyX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKCoqZ3VpZCkpKSB7CisgICAgICAgIGhhc19hbHBoYSA9IEhhc0FscGhhKGZhY3RvcnksIGRlY29kZXIsIGZyYW1lLCBzcmNfcGl4ZWxfZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUHJlcGFyZSBmb3IgcGl4ZWwgZm9ybWF0IGNvbnZlcnNpb24gKGlmIG5lY2Vzc2FyeSkuCisgIElGUyhJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlRm9ybWF0Q29udmVydGVyKGZhY3RvcnksICZjb252ZXJ0ZXIpKTsKKworICBmb3IgKGltcG9ydGVyID0gaGFzX2FscGhhID8ga0FscGhhRm9ybWF0SW1wb3J0ZXJzIDoga05vbkFscGhhRm9ybWF0SW1wb3J0ZXJzOworICAgICAgIGhyID09IFNfT0sgJiYgaW1wb3J0ZXItPmltcG9ydCAhPSBOVUxMOyArK2ltcG9ydGVyKSB7CisgICAgQk9PTCBjYW5fY29udmVydDsKKyAgICBjb25zdCBIUkVTVUxUIGNjaHIgPSBJV0lDRm9ybWF0Q29udmVydGVyX0NhbkNvbnZlcnQoCisgICAgICAgIGNvbnZlcnRlciwKKyAgICAgICAgTUFLRV9SRUZHVUlEKHNyY19waXhlbF9mb3JtYXQpLAorICAgICAgICBNQUtFX1JFRkdVSUQoKmltcG9ydGVyLT5waXhlbF9mb3JtYXQpLAorICAgICAgICAmY2FuX2NvbnZlcnQpOworICAgIGlmIChTVUNDRUVERUQoY2NocikgJiYgY2FuX2NvbnZlcnQpIGJyZWFrOworICB9CisgIGlmIChpbXBvcnRlci0+aW1wb3J0ID09IE5VTEwpIGhyID0gRV9GQUlMOworCisgIElGUyhJV0lDRm9ybWF0Q29udmVydGVyX0luaXRpYWxpemUoY29udmVydGVyLCAoSVdJQ0JpdG1hcFNvdXJjZSopZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXItPnBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUNCaXRtYXBEaXRoZXJUeXBlTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLjAsIFdJQ0JpdG1hcFBhbGV0dGVUeXBlQ3VzdG9tKSk7CisKKyAgLy8gRGVjb2RlLgorICBJRlMoSVdJQ0Zvcm1hdENvbnZlcnRlcl9HZXRTaXplKGNvbnZlcnRlciwgJndpZHRoLCAmaGVpZ2h0KSk7CisgIHN0cmlkZSA9IChpbnQ2NF90KWltcG9ydGVyLT5ieXRlc19wZXJfcGl4ZWwgKiB3aWR0aCAqIHNpemVvZigqcmdiKTsKKyAgaWYgKHN0cmlkZSAhPSAoaW50KXN0cmlkZSB8fAorICAgICAgIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHN0cmlkZSwgaGVpZ2h0KSkgeworICAgIGhyID0gRV9GQUlMOworICB9CisKKyAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICByZ2IgPSAoQllURSopbWFsbG9jKChzaXplX3Qpc3RyaWRlICogaGVpZ2h0KTsKKyAgICBpZiAocmdiID09IE5VTEwpCisgICAgICBociA9IEVfT1VUT0ZNRU1PUlk7CisgIH0KKyAgSUZTKElXSUNGb3JtYXRDb252ZXJ0ZXJfQ29weVBpeGVscyhjb252ZXJ0ZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQpc3RyaWRlLCAoVUlOVClzdHJpZGUgKiBoZWlnaHQsIHJnYikpOworCisgIC8vIFdlYlAgY29udmVyc2lvbi4KKyAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICBpbnQgb2s7CisgICAgcGljLT53aWR0aCA9IHdpZHRoOworICAgIHBpYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHBpYy0+dXNlX2FyZ2IgPSAxOyAgICAvLyBGb3IgV0lDLCB3ZSBhbHdheXMgZm9yY2UgdG8gYXJnYgorICAgIG9rID0gaW1wb3J0ZXItPmltcG9ydChwaWMsIHJnYiwgKGludClzdHJpZGUpOworICAgIGlmICghb2spIGhyID0gRV9GQUlMOworICB9CisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgIGhyID0gRXh0cmFjdE1ldGFkYXRhKGZhY3RvcnksIGZyYW1lLCBtZXRhZGF0YSk7CisgICAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGV4dHJhY3RpbmcgaW1hZ2UgbWV0YWRhdGEgdXNpbmcgV0lDIVxuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2xlYW51cC4KKyAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGNvbnZlcnRlcik7CisgIGlmIChmcmFtZSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGZyYW1lKTsKKyAgaWYgKGRlY29kZXIgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShkZWNvZGVyKTsKKyAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShmYWN0b3J5KTsKKyAgaWYgKHN0cmVhbSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKHN0cmVhbSk7CisgIGZyZWUocmdiKTsKKyAgcmV0dXJuIFNVQ0NFRURFRChocik7Cit9CisjZWxzZSAgLy8gIUhBVkVfV0lOQ09ERUNfSAoraW50IFJlYWRQaWN0dXJlV2l0aFdJQyhjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWZpbGVuYW1lOworICAodm9pZClwaWM7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgICh2b2lkKW1ldGFkYXRhOworICBmcHJpbnRmKHN0ZGVyciwgIldpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKFdJQykgc3VwcG9ydCBub3QgY29tcGlsZWQuICIKKyAgICAgICAgICAgICAgICAgICJWaXN1YWwgU3R1ZGlvIGFuZCBtaW5ndy13NjQgYnVpbGRzIHN1cHBvcnQgV0lDLiBNYWtlIHN1cmUgIgorICAgICAgICAgICAgICAgICAgIndpbmNvZGVjLmggZGV0ZWN0aW9uIGlzIHdvcmtpbmcgY29ycmVjdGx5IGlmIHVzaW5nIGF1dG9jb25mICIKKyAgICAgICAgICAgICAgICAgICJhbmQgSEFWRV9XSU5DT0RFQ19IIGlzIGRlZmluZWQgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIHJldHVybiAwOworfQorI2VuZGlmICAvLyBIQVZFX1dJTkNPREVDX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWVjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChXSUMpIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fV0lDREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19XSUNERUNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIFJlYWRzIGFuIGltYWdlIGZyb20gJ2ZpbGVuYW1lJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIElmICdrZWVwX2FscGhhJyBpcyB0cnVlIGFuZCB0aGUgaW1hZ2UgaGFzIGFuIGFscGhhIGNoYW5uZWwsIHRoZSBvdXRwdXQgaXMKKy8vIFJHQkEgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgUkdCLiBwaWMtPnVzZV9hcmdiIGlzIGFsd2F5cyBmb3JjZWQgdG8gdHJ1ZS4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IFJlYWRQaWN0dXJlV2l0aFdJQyhjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19XSUNERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2lvc2J1aWxkLnNoIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW9zYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTcxZWZjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2lvc2J1aWxkLnNoCkBAIC0wLDAgKzEsMTI5IEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgJ1dlYlAuZnJhbWV3b3JrJyBhbmQgJ1dlYlBEZWNvZGVyLmZyYW1ld29yaycuIEFuIGlPUworIyBhcHAgY2FuIGRlY29kZSBXZWJQIGltYWdlcyBieSBpbmNsdWRpbmcgJ1dlYlBEZWNvZGVyLmZyYW1ld29yaycgYW5kIGJvdGgKKyMgZW5jb2RlIGFuZCBkZWNvZGUgV2ViUCBpbWFnZXMgYnkgaW5jbHVkaW5nICdXZWJQLmZyYW1ld29yaycuCisjCisjIFJ1biAuL2lvc2J1aWxkLnNoIHRvIGdlbmVyYXRlIHRoZSBmcmFtZXdvcmtzIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorIyAodGhlIHByZXZpb3VzIGJ1aWxkIHdpbGwgYmUgZXJhc2VkIGlmIGl0IGV4aXN0cykuCisjCisjIFRoaXMgc2NyaXB0IGlzIGluc3BpcmVkIGJ5IHRoZSBidWlsZCBzY3JpcHQgd3JpdHRlbiBieSBDYXJzb24gTWNEb25hbGQuCisjIChodHRwOi8vd3d3LmlvbmNhbm5vbi5uZXQvcHJvZ3JhbW1pbmcvMTQ4My91c2luZy13ZWJwLXRvLXJlZHVjZS1uYXRpdmUtaW9zLWFwcC1zaXplLykuCisKK3NldCAtZQorCisjIEV4dHJhY3QgdGhlIGxhdGVzdCBTREsgdmVyc2lvbiBmcm9tIHRoZSBmaW5hbCBmaWVsZCBvZiB0aGUgZm9ybTogaXBob25lb3NYLlkKK3JlYWRvbmx5IFNESz0kKHhjb2RlYnVpbGQgLXNob3dzZGtzIFwKKyAgfCBncmVwIGlwaG9uZW9zIHwgc29ydCB8IHRhaWwgLW4gMSB8IGF3ayAne3ByaW50IHN1YnN0cigkTkYsIDkpfScKKykKKyMgRXh0cmFjdCBYY29kZSB2ZXJzaW9uLgorcmVhZG9ubHkgWENPREU9JCh4Y29kZWJ1aWxkIC12ZXJzaW9uIHwgZ3JlcCBYY29kZSB8IGN1dCAtZCAiICIgLWYyKQoraWYgW1sgLXogIiR7WENPREV9IiBdXTsgdGhlbgorICBlY2hvICJYY29kZSBub3QgYXZhaWxhYmxlIgorICBleGl0IDEKK2ZpCisKK3JlYWRvbmx5IE9MRFBBVEg9JHtQQVRIfQorCisjIEFkZCBpUGhvbmVPUy1WNiB0byB0aGUgbGlzdCBvZiBwbGF0Zm9ybXMgYmVsb3cgaWYgeW91IG5lZWQgYXJtdjYgc3VwcG9ydC4KKyMgTm90ZSB0aGF0IGlQaG9uZU9TLVY2IHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSB3aXRoIHRoZSBpT1M2IFNESy4KK1BMQVRGT1JNUz0iaVBob25lU2ltdWxhdG9yIGlQaG9uZVNpbXVsYXRvcjY0IgorUExBVEZPUk1TKz0iIGlQaG9uZU9TLVY3IGlQaG9uZU9TLVY3cyBpUGhvbmVPUy1WNy1hcm02NCIKK3JlYWRvbmx5IFBMQVRGT1JNUworcmVhZG9ubHkgU1JDRElSPSQoZGlybmFtZSAkMCkKK3JlYWRvbmx5IFRPUERJUj0kKHB3ZCkKK3JlYWRvbmx5IEJVSUxERElSPSIke1RPUERJUn0vaW9zYnVpbGQiCityZWFkb25seSBUQVJHRVRESVI9IiR7VE9QRElSfS9XZWJQLmZyYW1ld29yayIKK3JlYWRvbmx5IERFQ1RBUkdFVERJUj0iJHtUT1BESVJ9L1dlYlBEZWNvZGVyLmZyYW1ld29yayIKK3JlYWRvbmx5IERFVkVMT1BFUj0kKHhjb2RlLXNlbGVjdCAtLXByaW50LXBhdGgpCityZWFkb25seSBQTEFURk9STVNST09UPSIke0RFVkVMT1BFUn0vUGxhdGZvcm1zIgorcmVhZG9ubHkgTElQTz0kKHhjcnVuIC1zZGsgaXBob25lb3Mke1NES30gLWZpbmQgbGlwbykKK0xJQkxJU1Q9JycKK0RFQ0xJQkxJU1Q9JycKKworaWYgW1sgLXogIiR7U0RLfSIgXV07IHRoZW4KKyAgZWNobyAiaU9TIFNESyBub3QgYXZhaWxhYmxlIgorICBleGl0IDEKK2VsaWYgW1sgJHtTREslJS4qfSAtZ3QgOCBdXTsgdGhlbgorICBFWFRSQV9DRkxBR1M9Ii1mZW1iZWQtYml0Y29kZSIKK2VsaWYgW1sgJHtTREt9IDwgNi4wIF1dOyB0aGVuCisgIGVjaG8gIllvdSBuZWVkIGlPUyBTREsgdmVyc2lvbiA2LjAgb3IgYWJvdmUiCisgIGV4aXQgMQorZWxzZQorICBlY2hvICJpT1MgU0RLIFZlcnNpb24gJHtTREt9IgorZmkKKworcm0gLXJmICR7QlVJTERESVJ9ICR7VEFSR0VURElSfSAke0RFQ1RBUkdFVERJUn0KK21rZGlyIC1wICR7QlVJTERESVJ9ICR7VEFSR0VURElSfS9IZWFkZXJzLyAke0RFQ1RBUkdFVERJUn0vSGVhZGVycy8KKworaWYgW1sgISAtZSAke1NSQ0RJUn0vY29uZmlndXJlIF1dOyB0aGVuCisgIGlmICEgKGNkICR7U1JDRElSfSAmJiBzaCBhdXRvZ2VuLnNoKTsgdGhlbgorICAgIGNhdCA8PEVPVAorRXJyb3IgY3JlYXRpbmcgY29uZmlndXJlIHNjcmlwdCEKK1RoaXMgc2NyaXB0IHJlcXVpcmVzIHRoZSBhdXRvY29uZi9hdXRvbWFrZSBhbmQgbGlidG9vbCB0byBidWlsZC4gTWFjUG9ydHMgY2FuCitiZSB1c2VkIHRvIG9idGFpbiB0aGVzZToKK2h0dHA6Ly93d3cubWFjcG9ydHMub3JnL2luc3RhbGwucGhwCitFT1QKKyAgICBleGl0IDEKKyAgZmkKK2ZpCisKK2ZvciBQTEFURk9STSBpbiAke1BMQVRGT1JNU307IGRvCisgIEFSQ0gyPSIiCisgIGlmIFtbICIke1BMQVRGT1JNfSIgPT0gImlQaG9uZU9TLVY3LWFybTY0IiBdXTsgdGhlbgorICAgIFBMQVRGT1JNPSJpUGhvbmVPUyIKKyAgICBBUkNIPSJhYXJjaDY0IgorICAgIEFSQ0gyPSJhcm02NCIKKyAgZWxpZiBbWyAiJHtQTEFURk9STX0iID09ICJpUGhvbmVPUy1WN3MiIF1dOyB0aGVuCisgICAgUExBVEZPUk09ImlQaG9uZU9TIgorICAgIEFSQ0g9ImFybXY3cyIKKyAgZWxpZiBbWyAiJHtQTEFURk9STX0iID09ICJpUGhvbmVPUy1WNyIgXV07IHRoZW4KKyAgICBQTEFURk9STT0iaVBob25lT1MiCisgICAgQVJDSD0iYXJtdjciCisgIGVsaWYgW1sgIiR7UExBVEZPUk19IiA9PSAiaVBob25lT1MtVjYiIF1dOyB0aGVuCisgICAgUExBVEZPUk09ImlQaG9uZU9TIgorICAgIEFSQ0g9ImFybXY2IgorICBlbGlmIFtbICIke1BMQVRGT1JNfSIgPT0gImlQaG9uZVNpbXVsYXRvcjY0IiBdXTsgdGhlbgorICAgIFBMQVRGT1JNPSJpUGhvbmVTaW11bGF0b3IiCisgICAgQVJDSD0ieDg2XzY0IgorICBlbHNlCisgICAgQVJDSD0iaTM4NiIKKyAgZmkKKworICBST09URElSPSIke0JVSUxERElSfS8ke1BMQVRGT1JNfS0ke1NES30tJHtBUkNIfSIKKyAgbWtkaXIgLXAgIiR7Uk9PVERJUn0iCisKKyAgREVWUk9PVD0iJHtERVZFTE9QRVJ9L1Rvb2xjaGFpbnMvWGNvZGVEZWZhdWx0LnhjdG9vbGNoYWluIgorICBTREtST09UPSIke1BMQVRGT1JNU1JPT1R9LyIKKyAgU0RLUk9PVCs9IiR7UExBVEZPUk19LnBsYXRmb3JtL0RldmVsb3Blci9TREtzLyR7UExBVEZPUk19JHtTREt9LnNkay8iCisgIENGTEFHUz0iLWFyY2ggJHtBUkNIMjotJHtBUkNIfX0gLXBpcGUgLWlzeXNyb290ICR7U0RLUk9PVH0gLU8zIC1ETkRFQlVHIgorICBDRkxBR1MrPSIgLW1pcGhvbmVvcy12ZXJzaW9uLW1pbj02LjAgJHtFWFRSQV9DRkxBR1N9IgorCisgIHNldCAteAorICBleHBvcnQgUEFUSD0iJHtERVZST09UfS91c3IvYmluOiR7T0xEUEFUSH0iCisgICR7U1JDRElSfS9jb25maWd1cmUgLS1ob3N0PSR7QVJDSH0tYXBwbGUtZGFyd2luIC0tcHJlZml4PSR7Uk9PVERJUn0gXAorICAgIC0tYnVpbGQ9JCgke1NSQ0RJUn0vY29uZmlnLmd1ZXNzKSBcCisgICAgLS1kaXNhYmxlLXNoYXJlZCAtLWVuYWJsZS1zdGF0aWMgXAorICAgIC0tZW5hYmxlLWxpYndlYnBkZWNvZGVyIC0tZW5hYmxlLXN3YXAtMTZiaXQtY3NwIFwKKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSIKKyAgc2V0ICt4CisKKyAgIyBydW4gbWFrZSBvbmx5IGluIHRoZSBzcmMvIGRpcmVjdG9yeSB0byBjcmVhdGUgbGlid2VicC5hL2xpYndlYnBkZWNvZGVyLmEKKyAgY2Qgc3JjLworICBtYWtlIFY9MAorICBtYWtlIGluc3RhbGwKKworICBMSUJMSVNUKz0iICR7Uk9PVERJUn0vbGliL2xpYndlYnAuYSIKKyAgREVDTElCTElTVCs9IiAke1JPT1RESVJ9L2xpYi9saWJ3ZWJwZGVjb2Rlci5hIgorCisgIG1ha2UgY2xlYW4KKyAgY2QgLi4KKworICBleHBvcnQgUEFUSD0ke09MRFBBVEh9Citkb25lCisKK2NwIC1hICR7U1JDRElSfS9zcmMvd2VicC97ZGVjb2RlLGVuY29kZSx0eXBlc30uaCAke1RBUkdFVERJUn0vSGVhZGVycy8KKyR7TElQT30gLWNyZWF0ZSAke0xJQkxJU1R9IC1vdXRwdXQgJHtUQVJHRVRESVJ9L1dlYlAKKworY3AgLWEgJHtTUkNESVJ9L3NyYy93ZWJwL3tkZWNvZGUsdHlwZXN9LmggJHtERUNUQVJHRVRESVJ9L0hlYWRlcnMvCiske0xJUE99IC1jcmVhdGUgJHtERUNMSUJMSVNUfSAtb3V0cHV0ICR7REVDVEFSR0VURElSfS9XZWJQRGVjb2RlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXAgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cAppbmRleCA2ODA2ZjA3Li4yNmI4ZDZkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cApAQCAtMSwzMCArMSwxNyBAQAogIyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQogeworICAnaW5jbHVkZXMnOiBbCisgICAgJ2xpYndlYnAuZ3lwaScKKyAgXSwKICAgJ3RhcmdldHMnOiBbCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZGVjJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdkZXBlbmRlbmNpZXMnIDogWwotICAgICAgICAnbGlid2VicF9kc3AnLAotICAgICAgICAnbGlid2VicF9kc3BfbmVvbicsCi0gICAgICAgICdsaWJ3ZWJwX3V0aWxzJywKLSAgICAgIF0sCiAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCiAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJ2RlYy9hbHBoYS5jJywKLSAgICAgICAgJ2RlYy9idWZmZXIuYycsCi0gICAgICAgICdkZWMvZnJhbWUuYycsCi0gICAgICAgICdkZWMvaWRlYy5jJywKLSAgICAgICAgJ2RlYy9pby5jJywKLSAgICAgICAgJ2RlYy9sYXllci5jJywKLSAgICAgICAgJ2RlYy9xdWFudC5jJywKLSAgICAgICAgJ2RlYy90cmVlLmMnLAotICAgICAgICAnZGVjL3ZwOC5jJywKLSAgICAgICAgJ2RlYy92cDhsLmMnLAotICAgICAgICAnZGVjL3dlYnAuYycsCisgICAgICAgICc8QChsaWJ3ZWJwX2RlY19zb3VyY2VzKScsCiAgICAgICBdLAogICAgIH0sCiAgICAgewpAQCAtMzIsMTEzICsxOSwxMjQgQEAKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnZGVtdXgvZGVtdXguYycsCisgICAgICAgICc8QChsaWJ3ZWJwX2RlbXV4X3NvdXJjZXMpJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3AnLAorICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlYycsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX2NvbW1vbl9zb3VyY2VzKScsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19tc2EnLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjX25lb24nLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjX3NzZTInLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjX3NzZTQxJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19taXBzMzInLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjX21pcHNfZHNwX3IyJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX21zYScsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX21zYV9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19uZW9uJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfbmVvbl9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19zc2UyJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfc3NlMl9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19zc2U0MScsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX3NzZTQxX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX21pcHMzMicsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX21pcHMzMl9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19taXBzX2RzcF9yMicsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX21pcHNfZHNwX3IyX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF91dGlsc19kZWMnLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdkc3AvY3B1LmMnLAotICAgICAgICAnZHNwL2RlYy5jJywKLSAgICAgICAgJ2RzcC9kZWNfc3NlMi5jJywKLSAgICAgICAgJ2RzcC9lbmMuYycsCi0gICAgICAgICdkc3AvZW5jX3NzZTIuYycsCi0gICAgICAgICdkc3AvbG9zc2xlc3MuYycsCi0gICAgICAgICdkc3AvdXBzYW1wbGluZy5jJywKLSAgICAgICAgJ2RzcC91cHNhbXBsaW5nX3NzZTIuYycsCi0gICAgICAgICdkc3AveXV2LmMnLAotICAgICAgXSwKLSAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJ09TID09ICJhbmRyb2lkIicsIHsKLSAgICAgICAgICAnaW5jbHVkZXMnOiBbICcuLi8uLi9idWlsZC9hbmRyb2lkL2NwdWZlYXR1cmVzLmd5cGknIF0sCi0gICAgICAgIH1dLAorICAgICAgICAnPEAobGlid2VicF91dGlsc19kZWNfc291cmNlcyknLAogICAgICAgXSwKICAgICB9LAotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9uZW9uJywKLSAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJygodGFyZ2V0X2FyY2ggPT0gImFybSIgYW5kIGFybV92ZXJzaW9uID49IDcpIG9yICh0YXJnZXRfYXJjaCA9PSAiYXJtNjQiKSknLCB7Ci0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICdkc3AvZGVjX25lb24uYycsCi0gICAgICAgICAgICAnZHNwL2VuY19uZW9uLmMnLAotICAgICAgICAgICAgJ2RzcC91cHNhbXBsaW5nX25lb24uYycsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAjIGJlaGF2aW9yIHNpbWlsYXIgdG8gKi5jLm5lb24gaW4gYW4gQW5kcm9pZC5tawotICAgICAgICAgICdjZmxhZ3MhJzogWyAnLW1mcHU9dmZwdjMtZDE2JyBdLAotICAgICAgICAgICdjZmxhZ3MnOiBbICctbWZwdT1uZW9uJyBdLAotICAgICAgICB9LHsgICMgInRhcmdldF9hcmNoICE9ICJhcm0iIG9yIGFybV92ZXJzaW9uIDwgNyIKLSAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgfV0sCi0gICAgICAgIFsnKHRhcmdldF9hcmNoID09ICJhcm0iIGFuZCBhcm1fdmVyc2lvbiA+PSA4KSBvciAodGFyZ2V0X2FyY2ggPT0gImFybTY0IiknLCB7Ci0gICAgICAgICAgIyBORU9OIGlzIGltcGxpY2l0IG9uIEFSTXY4LCBhbmQgYm90aCBjbGFuZyBhbmQgZ2NjIGRvbid0IGxpa2UgdGhlCi0gICAgICAgICAgIyByZWR1bmRhbnQgZmxhZy4KLSAgICAgICAgICAnY2ZsYWdzISc6IFsgJy1tZnB1PW5lb24nIF0sCi0gICAgICAgIH1dLAotICAgICAgXSwKLSAgICB9LAorCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZW5jJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCi0gICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJ2VuYy9hbHBoYS5jJywKLSAgICAgICAgJ2VuYy9hbmFseXNpcy5jJywKLSAgICAgICAgJ2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMnLAotICAgICAgICAnZW5jL2NvbmZpZy5jJywKLSAgICAgICAgJ2VuYy9jb3N0LmMnLAotICAgICAgICAnZW5jL2ZpbHRlci5jJywKLSAgICAgICAgJ2VuYy9mcmFtZS5jJywKLSAgICAgICAgJ2VuYy9oaXN0b2dyYW0uYycsCi0gICAgICAgICdlbmMvaXRlcmF0b3IuYycsCi0gICAgICAgICdlbmMvbGF5ZXIuYycsCi0gICAgICAgICdlbmMvcGljdHVyZS5jJywKLSAgICAgICAgJ2VuYy9xdWFudC5jJywKLSAgICAgICAgJ2VuYy9zeW50YXguYycsCi0gICAgICAgICdlbmMvdG9rZW4uYycsCi0gICAgICAgICdlbmMvdHJlZS5jJywKLSAgICAgICAgJ2VuYy92cDhsLmMnLAotICAgICAgICAnZW5jL3dlYnBlbmMuYycsCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2VuY19zb3VyY2VzKScsCiAgICAgICBdLAogICAgIH0sCiAgICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfdXRpbHMnLAorICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2VuYycsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZW5jX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX3V0aWxzX2VuYycsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCiAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJ3V0aWxzL2JpdF9yZWFkZXIuYycsCi0gICAgICAgICd1dGlscy9iaXRfd3JpdGVyLmMnLAotICAgICAgICAndXRpbHMvY29sb3JfY2FjaGUuYycsCi0gICAgICAgICd1dGlscy9maWx0ZXJzLmMnLAotICAgICAgICAndXRpbHMvaHVmZm1hbi5jJywKLSAgICAgICAgIyd1dGlscy9odWZmbWFuX2VuY29kZS5jJywKLSAgICAgICAgJ3V0aWxzL3F1YW50X2xldmVscy5jJywKLSAgICAgICAgJ3V0aWxzL3F1YW50X2xldmVsc19kZWMuYycsCi0gICAgICAgICd1dGlscy9yZXNjYWxlci5jJywKLSAgICAgICAgJ3V0aWxzL3RocmVhZC5jJywKLSAgICAgICAgJ3V0aWxzL3V0aWxzLmMnLAorICAgICAgICAnPEAobGlid2VicF91dGlsc19lbmNfc291cmNlcyknLAogICAgICAgXSwKICAgICB9LAorCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnAnLAogICAgICAgJ3R5cGUnOiAnbm9uZScsCiAgICAgICAnZGVwZW5kZW5jaWVzJyA6IFsKICAgICAgICAgJ2xpYndlYnBfZGVjJywKICAgICAgICAgJ2xpYndlYnBfZGVtdXgnLAotICAgICAgICAjJ2xpYndlYnBfZHNwJywKLSAgICAgICAgIydsaWJ3ZWJwX2RzcF9uZW9uJywKLSAgICAgICAgIydsaWJ3ZWJwX2VuYycsICAjIE5vdCBuZWVkZWQgYnkgQ29iYWx0Ci0gICAgICAgICdsaWJ3ZWJwX3V0aWxzJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlYycsCisgICAgICAgICdsaWJ3ZWJwX3V0aWxzX2RlYycsCisgICAgICAgICdsaWJ3ZWJwX2VuYycsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9lbmMnLAorICAgICAgICAnbGlid2VicF91dGlsc19lbmMnLAogICAgICAgXSwKICAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogewogICAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCiAgICAgICB9LAotICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnT1MhPSJ3aW4iJywgeydwcm9kdWN0X25hbWUnOiAnd2VicCd9XSwKLSAgICAgIF0sCiAgICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwaSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGExYmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXBpCkBAIC0wLDAgKzEsMTY4IEBACit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ2xpYndlYnBfZGVjX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RlYy9hbHBoYV9kZWMuYycsCisgICAgICAnc3JjL2RlYy9idWZmZXJfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvZnJhbWVfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvaWRlY19kZWMuYycsCisgICAgICAnc3JjL2RlYy9pb19kZWMuYycsCisgICAgICAnc3JjL2RlYy9xdWFudF9kZWMuYycsCisgICAgICAnc3JjL2RlYy90cmVlX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL3ZwOF9kZWMuYycsCisgICAgICAnc3JjL2RlYy92cDhsX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL3dlYnBfZGVjLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZGVtdXhfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZGVtdXgvYW5pbV9kZWNvZGUuYycsCisgICAgICAnc3JjL2RlbXV4L2RlbXV4LmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19jb21tb25fc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYycsCisgICAgICAnc3JjL2RzcC9jcHUuYycsCisgICAgICAnc3JjL2RzcC9kZWMuYycsCisgICAgICAnc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMuYycsCisgICAgICAnc3JjL2RzcC9maWx0ZXJzLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3MuYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlci5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmcuYycsCisgICAgICAnc3JjL2RzcC95dXYuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX3NzZTQxX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMnLAorICAgICAgJ3NyYy9kc3AvZGVjX3NzZTQxLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5jJywKKyAgICAgICdzcmMvZHNwL3l1dl9zc2U0MS5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfc3NlMl9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvZGVjX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9maWx0ZXJzX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXJfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL3l1dl9zc2UyLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19uZW9uX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24uYycsCisgICAgICAnc3JjL2RzcC9kZWNfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL2ZpbHRlcnNfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX25lb24uYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlcl9uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZ19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AveXV2X25lb24uYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX21pcHNfZHNwX3IyX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvZGVjX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AveXV2X21pcHNfZHNwX3IyLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19taXBzMzJfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2RlY19taXBzMzIuYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIuYycsCisgICAgICAnc3JjL2RzcC95dXZfbWlwczMyLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19tc2Ffc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2RlY19tc2EuYycsCisgICAgICAnc3JjL2RzcC9maWx0ZXJzX21zYS5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX21zYS5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyX21zYS5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2VuY19zb3VyY2VzJyA6IFsKKyAgICAgICdzcmMvZHNwL2Nvc3QuYycsCisgICAgICAnc3JjL2RzcC9jb3N0X21pcHMzMi5jJywKKyAgICAgICdzcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9jb3N0X3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9lbmMuYycsCisgICAgICAnc3JjL2RzcC9lbmNfYXZ4Mi5jJywKKyAgICAgICdzcmMvZHNwL2VuY19taXBzMzIuYycsCisgICAgICAnc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9lbmNfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX25lb24uYycsCisgICAgICAnc3JjL2RzcC9lbmNfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2VuY19zc2U0MS5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuYy5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24uYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jJywKKyAgICAgICdzcmMvZHNwL3NzaW0uYycsCisgICAgICAnc3JjL2RzcC9zc2ltX3NzZTIuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9lbmNfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZW5jL2FscGhhX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2FuYWx5c2lzX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMuYycsCisgICAgICAnc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2NvbmZpZ19lbmMuYycsCisgICAgICAnc3JjL2VuYy9jb3N0X2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2ZpbHRlcl9lbmMuYycsCisgICAgICAnc3JjL2VuYy9mcmFtZV9lbmMuYycsCisgICAgICAnc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvaXRlcmF0b3JfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvbmVhcl9sb3NzbGVzc19lbmMuYycsCisgICAgICAnc3JjL2VuYy9waWN0dXJlX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3BpY3R1cmVfY3NwX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYycsCisgICAgICAnc3JjL2VuYy9waWN0dXJlX3Jlc2NhbGVfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYycsCisgICAgICAnc3JjL2VuYy9wcmVkaWN0b3JfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcXVhbnRfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvc3ludGF4X2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3Rva2VuX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3RyZWVfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvdnA4bF9lbmMuYycsCisgICAgICAnc3JjL2VuYy93ZWJwX2VuYy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2Zvcm1hdF9kZWNfc291cmNlcyc6IFsKKyAgICAgICdpbWFnZWlvL2ltYWdlX2RlYy5jJywKKyAgICAgICdpbWFnZWlvL2pwZWdkZWMuYycsCisgICAgICAnaW1hZ2Vpby9tZXRhZGF0YS5jJywKKyAgICAgICdpbWFnZWlvL3BuZ2RlYy5jJywKKyAgICAgICdpbWFnZWlvL3BubWRlYy5jJywKKyAgICAgICdpbWFnZWlvL3RpZmZkZWMuYycsCisgICAgICAnaW1hZ2Vpby93ZWJwZGVjLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZm9ybWF0X2VuY19zb3VyY2VzJzogWworICAgICAgJ2ltYWdlaW8vaW1hZ2VfZW5jLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfdXRpbF9zb3VyY2VzJzogWworICAgICAgJ2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2ltYWdlX3V0aWxfc291cmNlcyc6IFsKKyAgICAgICdpbWFnZWlvL2ltYWdlaW9fdXRpbC5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX211eF9zb3VyY2VzJzogWworICAgICAgJ3NyYy9tdXgvYW5pbV9lbmNvZGUuYycsCisgICAgICAnc3JjL211eC9tdXhlZGl0LmMnLAorICAgICAgJ3NyYy9tdXgvbXV4aW50ZXJuYWwuYycsCisgICAgICAnc3JjL211eC9tdXhyZWFkLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfdXRpbHNfZGVjX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9odWZmbWFuX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9yYW5kb21fdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy90aHJlYWRfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3V0aWxzLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfdXRpbHNfZW5jX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9leHRyYV9zb3VyY2VzJzogWworICAgICAgJ2V4dHJhcy9leHRyYXMuYycsCisgICAgICAnZXh0cmFzL3F1YWxpdHlfZXN0aW1hdGUuYycsCisgICAgXSwKKyAgfSwKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL200L2F4X3B0aHJlYWQubTQgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tNC9heF9wdGhyZWFkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODNhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tNC9heF9wdGhyZWFkLm00CkBAIC0wLDAgKzEsMzMyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHRocmVhZC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BUSFJFQUQoW0FDVElPTi1JRi1GT1VORFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIGZpZ3VyZXMgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMuIEl0CisjICAgc2V0cyB0aGUgUFRIUkVBRF9MSUJTIG91dHB1dCB2YXJpYWJsZSB0byB0aGUgdGhyZWFkcyBsaWJyYXJ5IGFuZCBsaW5rZXIKKyMgICBmbGFncywgYW5kIHRoZSBQVEhSRUFEX0NGTEFHUyBvdXRwdXQgdmFyaWFibGUgdG8gYW55IHNwZWNpYWwgQyBjb21waWxlcgorIyAgIGZsYWdzIHRoYXQgYXJlIG5lZWRlZC4gKFRoZSB1c2VyIGNhbiBhbHNvIGZvcmNlIGNlcnRhaW4gY29tcGlsZXIKKyMgICBmbGFncy9saWJzIHRvIGJlIHRlc3RlZCBieSBzZXR0aW5nIHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcy4pCisjCisjICAgQWxzbyBzZXRzIFBUSFJFQURfQ0MgdG8gYW55IHNwZWNpYWwgQyBjb21waWxlciB0aGF0IGlzIG5lZWRlZCBmb3IKKyMgICBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcyAoZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIENDIG90aGVyd2lzZSkuIChUaGlzCisjICAgaXMgbmVjZXNzYXJ5IG9uIEFJWCB0byB1c2UgdGhlIHNwZWNpYWwgY2NfciBjb21waWxlciBhbGlhcy4pCisjCisjICAgTk9URTogWW91IGFyZSBhc3N1bWVkIHRvIG5vdCBvbmx5IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggdGhlc2UgZmxhZ3MsCisjICAgYnV0IGFsc28gbGluayBpdCB3aXRoIHRoZW0gYXMgd2VsbC4gZS5nLiB5b3Ugc2hvdWxkIGxpbmsgd2l0aAorIyAgICRQVEhSRUFEX0NDICRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRMREZMQUdTIC4uLiAkUFRIUkVBRF9MSUJTICRMSUJTCisjCisjICAgSWYgeW91IGFyZSBvbmx5IGJ1aWxkaW5nIHRocmVhZHMgcHJvZ3JhbXMsIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlc2UKKyMgICB2YXJpYWJsZXMgaW4geW91ciBkZWZhdWx0IExJQlMsIENGTEFHUywgYW5kIENDOgorIworIyAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyMgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisjICAgICBDQz0iJFBUSFJFQURfQ0MiCisjCisjICAgSW4gYWRkaXRpb24sIGlmIHRoZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0aHJlYWQtYXR0cmlidXRlIGNvbnN0YW50CisjICAgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSwgZGVmaW5lcyBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB0byB0aGF0IG5hbWUKKyMgICAoZS5nLiBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEIG9uIEFJWCkuCisjCisjICAgQWxzbyBIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUIGlzIGRlZmluZWQgaWYgcHRocmVhZCBpcyBmb3VuZCBhbmQgdGhlCisjICAgUFRIUkVBRF9QUklPX0lOSEVSSVQgc3ltYm9sIGlzIGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aAorIyAgIFBUSFJFQURfQ0ZMQUdTLgorIworIyAgIEFDVElPTi1JRi1GT1VORCBpcyBhIGxpc3Qgb2Ygc2hlbGwgY29tbWFuZHMgdG8gcnVuIGlmIGEgdGhyZWFkcyBsaWJyYXJ5CisjICAgaXMgZm91bmQsIGFuZCBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB0byBydW4gaXQgaWYgaXQKKyMgICBpcyBub3QgZm91bmQuIElmIEFDVElPTi1JRi1GT1VORCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBhY3Rpb24KKyMgICB3aWxsIGRlZmluZSBIQVZFX1BUSFJFQUQuCisjCisjICAgUGxlYXNlIGxldCB0aGUgYXV0aG9ycyBrbm93IGlmIHRoaXMgbWFjcm8gZmFpbHMgb24gYW55IHBsYXRmb3JtLCBvciBpZgorIyAgIHlvdSBoYXZlIGFueSBvdGhlciBzdWdnZXN0aW9ucyBvciBjb21tZW50cy4gVGhpcyBtYWNybyB3YXMgYmFzZWQgb24gd29yaworIyAgIGJ5IFNHSiBvbiBhdXRvY29uZiBzY3JpcHRzIGZvciBGRlRXIChodHRwOi8vd3d3LmZmdHcub3JnLykgKHdpdGggaGVscAorIyAgIGZyb20gTS4gRnJpZ28pLCBhcyB3ZWxsIGFzIGFjX3B0aHJlYWQgYW5kIGhiX3B0aHJlYWQgbWFjcm9zIHBvc3RlZCBieQorIyAgIEFsZWphbmRybyBGb3Jlcm8gQ3VlcnZvIHRvIHRoZSBhdXRvY29uZiBtYWNybyByZXBvc2l0b3J5LiBXZSBhcmUgYWxzbworIyAgIGdyYXRlZnVsIGZvciB0aGUgaGVscGZ1bCBmZWVkYmFjayBvZiBudW1lcm91cyB1c2Vycy4KKyMKKyMgICBVcGRhdGVkIGZvciBBdXRvY29uZiAyLjY4IGJ5IERhbmllbCBSaWNoYXJkIEcuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxMSBEYW5pZWwgUmljaGFyZCBHLiA8c2t1bmtAaVNLVU5LLk9SRz4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgMjEKKworQVVfQUxJQVMoW0FDWF9QVEhSRUFEXSwgW0FYX1BUSFJFQURdKQorQUNfREVGVU4oW0FYX1BUSFJFQURdLCBbCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCitBQ19MQU5HX1BVU0goW0NdKQorYXhfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1NdKQorICAgICAgICBBQ19UUllfTElOS19GVU5DKFtwdGhyZWFkX2pvaW5dLCBbYXhfcHRocmVhZF9vaz15ZXNdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskYXhfcHRocmVhZF9va10pCisgICAgICAgIGlmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCitheF9wdGhyZWFkX2ZsYWdzPSJwdGhyZWFkcyBub25lIC1LdGhyZWFkIC1rdGhyZWFkIGx0aHJlYWQgLXB0aHJlYWQgLXB0aHJlYWRzIC1tdGhyZWFkcyBwdGhyZWFkIC0tdGhyZWFkLXNhZmUgLW10IHB0aHJlYWQtY29uZmlnIgorCisjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorCisjIHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorIyBub25lOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyMgbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisjIC1wdGhyZWFkOiBMaW51eC9nY2MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL2djYyAodXNlcmxhbmQgdGhyZWFkcykKKyMgLXB0aHJlYWRzOiBTb2xhcmlzL2djYworIyAtbXRocmVhZHM6IE1pbmd3MzIvZ2NjLCBMeW54L2djYworIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworIyAgICAgIGFsc28gZGVmaW5lcyAtRF9SRUVOVFJBTlQpCisjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICR7aG9zdF9vc30gaW4KKyAgICAgICAgc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBheF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgcHRocmVhZCAtbXQgLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7CisKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgYXhfcHRocmVhZF9mbGFncz0iLXB0aHJlYWQgJGF4X3B0aHJlYWRfZmxhZ3MiCisgICAgICAgIDs7Citlc2FjCisKKyMgQ2xhbmcgZG9lc24ndCBjb25zaWRlciB1bnJlY29nbml6ZWQgb3B0aW9ucyBhbiBlcnJvciB1bmxlc3Mgd2Ugc3BlY2lmeQorIyAtV2Vycm9yLiBXZSB0aHJvdyBpbiBzb21lIGV4dHJhIENsYW5nLXNwZWNpZmljIG9wdGlvbnMgdG8gZW5zdXJlIHRoYXQKKyMgdGhpcyBkb2Vzbid0IGhhcHBlbiBmb3IgR0NDLCB3aGljaCBhbHNvIGFjY2VwdHMgLVdlcnJvci4KKworQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlciBuZWVkcyAtV2Vycm9yIHRvIHJlamVjdCB1bmtub3duIGZsYWdzXSkKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorYXhfcHRocmVhZF9leHRyYV9mbGFncz0iLVdlcnJvciIKK0NGTEFHUz0iJENGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyAtV3Vua25vd24td2FybmluZy1vcHRpb24gLVdzaXplb2YtYXJyYXktYXJndW1lbnQiCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtpbnQgZm9vKHZvaWQpO10sW2ZvbygpXSldLAorICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgICAgICAgICAgIFtheF9wdGhyZWFkX2V4dHJhX2ZsYWdzPQorICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSldKQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKK2lmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRheF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzXSkKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICBwdGhyZWFkLWNvbmZpZykKKyAgICAgICAgICAgICAgICBBQ19DSEVDS19QUk9HKFtheF9wdGhyZWFkX2NvbmZpZ10sIFtwdGhyZWFkLWNvbmZpZ10sIFt5ZXNdLCBbbm9dKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgeCIkYXhfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSJgcHRocmVhZC1jb25maWcgLS1jZmxhZ3NgIgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkYXhfcHRocmVhZF9leHRyYV9mbGFncyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxwdGhyZWFkLmg+CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCByb3V0aW5lKHZvaWQgKmEpIHsgYSA9IDA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpzdGFydF9yb3V0aW5lKHZvaWQgKmEpIHsgcmV0dXJuIGE7IH1dLAorICAgICAgICAgICAgICAgICAgICAgICBbcHRocmVhZF90IHRoOyBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRoLCAwLCBzdGFydF9yb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NsZWFudXBfcHVzaChyb3V0aW5lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY2xlYW51cF9wb3AoMCkgLyogOyAqL10pXSwKKyAgICAgICAgICAgICAgICBbYXhfcHRocmVhZF9vaz15ZXNdLAorICAgICAgICAgICAgICAgIFtdKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRheF9wdGhyZWFkX29rXSkKKyAgICAgICAgaWYgdGVzdCAieCRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZV0pCisgICAgICAgIGF0dHJfbmFtZT11bmtub3duCisgICAgICAgIGZvciBhdHRyIGluIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQ7IGRvCisgICAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IGF0dHIgPSAkYXR0cjsgcmV0dXJuIGF0dHIgLyogOyAqL10pXSwKKyAgICAgICAgICAgICAgICBbYXR0cl9uYW1lPSRhdHRyOyBicmVha10sCisgICAgICAgICAgICAgICAgW10pCisgICAgICAgIGRvbmUKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJGF0dHJfbmFtZV0pCisgICAgICAgIGlmIHRlc3QgIiRhdHRyX25hbWUiICE9IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW1BUSFJFQURfQ1JFQVRFX0pPSU5BQkxFXSwgWyRhdHRyX25hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbiB5b3VyIHN5c3RlbS5dKQorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHNdKQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgJHtob3N0X29zfSBpbgorICAgICAgICAgICAgYWl4KiB8IGZyZWVic2QqIHwgZGFyd2luKikgZmxhZz0iLURfVEhSRUFEX1NBRkUiOzsKKyAgICAgICAgICAgIG9zZiogfCBocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgICAgICBzb2xhcmlzKikKKyAgICAgICAgICAgIGlmIHRlc3QgIiRHQ0MiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBmbGFnPSItRF9SRUVOVFJBTlQiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBUT0RPOiBXaGF0IGFib3V0IENsYW5nIG9uIFNvbGFyaXM/CisgICAgICAgICAgICAgICAgZmxhZz0iLW10IC1EX1JFRU5UUkFOVCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRmbGFnXSkKKyAgICAgICAgaWYgdGVzdCAieCRmbGFnIiAhPSB4bm87IHRoZW4KKyAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBQVEhSRUFEX1BSSU9fSU5IRVJJVF0sCisgICAgICAgICAgICBbYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVRdLCBbCisgICAgICAgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxwdGhyZWFkLmg+XV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2ludCBpID0gUFRIUkVBRF9QUklPX0lOSEVSSVQ7XV0pXSwKKyAgICAgICAgICAgICAgICAgICAgW2F4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUPXllc10sCisgICAgICAgICAgICAgICAgICAgIFtheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVD1ub10pCisgICAgICAgICAgICBdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVCIgPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX0RFRklORShbSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVF0sIFsxXSwgW0hhdmUgUFRIUkVBRF9QUklPX0lOSEVSSVQuXSldKQorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgICMgTW9yZSBBSVggbG9zc2FnZTogY29tcGlsZSB3aXRoICpfciB2YXJpYW50CisgICAgICAgIGlmIHRlc3QgIngkR0NDIiAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgYWl4KikKKyAgICAgICAgICAgICAgICBBU19DQVNFKFsieC8kQ0MiXSwKKyAgICAgICAgICAgICAgICAgIFt4Ki9jODl8eCovYzg5XzEyOHx4Ki9jOTl8eCovYzk5XzEyOHx4Ki9jY3x4Ki9jYzEyOHx4Ki94bGN8eCoveGxjX3Y2fHgqL3hsYzEyOHx4Ki94bGMxMjhfdjZdLAorICAgICAgICAgICAgICAgICAgWyNoYW5kbGUgYWJzb2x1dGUgcGF0aCBkaWZmZXJlbnRseSBmcm9tIFBBVEggYmFzZWQgcHJvZ3JhbSBsb29rdXAKKyAgICAgICAgICAgICAgICAgICBBU19DQVNFKFsieCRDQyJdLAorICAgICAgICAgICAgICAgICAgICAgW3gvKl0sCisgICAgICAgICAgICAgICAgICAgICBbQVNfSUYoW0FTX0VYRUNVVEFCTEVfUChbJHtDQ31fcl0pXSxbUFRIUkVBRF9DQz0iJHtDQ31fciJdKV0sCisgICAgICAgICAgICAgICAgICAgICBbQUNfQ0hFQ0tfUFJPR1MoW1BUSFJFQURfQ0NdLFske0NDfV9yXSxbJENDXSldKV0pCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKK2ZpCisKK3Rlc3QgLW4gIiRQVEhSRUFEX0NDIiB8fCBQVEhSRUFEX0NDPSIkQ0MiCisKK0FDX1NVQlNUKFtQVEhSRUFEX0xJQlNdKQorQUNfU1VCU1QoW1BUSFJFQURfQ0ZMQUdTXSkKK0FDX1NVQlNUKFtQVEhSRUFEX0NDXSkKKworIyBGaW5hbGx5LCBleGVjdXRlIEFDVElPTi1JRi1GT1VORC9BQ1RJT04tSUYtTk9ULUZPVU5EOgoraWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLFtBQ19ERUZJTkUoW0hBVkVfUFRIUkVBRF0sWzFdLFtEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy5dKV0sWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBheF9wdGhyZWFkX29rPW5vCisgICAgICAgICQyCitmaQorQUNfTEFOR19QT1AKK10pZG5sIEFYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21ha2VmaWxlLnVuaXggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYWtlZmlsZS51bml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDAzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYWtlZmlsZS51bml4CkBAIC0wLDAgKzEsNTAyIEBACisjIFRoaXMgbWFrZWZpbGUgaXMgYSBzaW1wbGVyIGFsdGVybmF0aXZlIHRvIHRoZSBhdXRvY29uZi1iYXNlZCBidWlsZAorIyBzeXN0ZW0sIGZvciBzaW1wbGUgbG9jYWwgYnVpbGRpbmcgb2YgdGhlIGxpYnJhcmllcyBhbmQgdG9vbHMuCisjIEl0IHdpbGwgbm90IGluc3RhbGwgdGhlIGxpYnJhcmllcyBzeXN0ZW0td2lkZSwgYnV0IGp1c3QgY3JlYXRlIHRoZSAnY3dlYnAnCisjIGFuZCAnZHdlYnAnIHRvb2xzIGluIHRoZSBleGFtcGxlcy8gZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZSBzdGF0aWMKKyMgbGlicmFyaWVzICdzcmMvbGlid2VicC5hJywgJ3NyYy9saWJ3ZWJwZGVjb2Rlci5hJywgJ3NyYy9tdXgvbGlid2VicG11eC5hJywKKyMgJ3NyYy9kZW11eC9saWJ3ZWJwZGVtdXguYScgYW5kICdleHRyYXMvbGlid2VicGV4dHJhcy5hJy4KKyMKKyMgVG8gYnVpbGQgdGhlIGxpYnJhcnkgYW5kIGV4YW1wbGVzLCB1c2U6CisjICAgIG1ha2UgLWYgbWFrZWZpbGUudW5peAorIyBmcm9tIHRoaXMgdG9wIGRpcmVjdG9yeS4KKworIyMjIyBDdXN0b21pemFibGUgcGFydCAjIyMjCisKKyMgVGhlc2UgZmxhZ3MgYXNzdW1lIHlvdSBoYXZlIGxpYnBuZywgbGlianBlZywgbGlidGlmZiBhbmQgbGliZ2lmIGluc3RhbGxlZC4gSWYKKyMgbm90LCBlaXRoZXIgZm9sbG93IHRoZSBpbnN0YWxsIGluc3RydWN0aW9ucyBiZWxvdyBvciBqdXN0IGNvbW1lbnQgb3V0IHRoZSBuZXh0CisjIGZvdXIgbGluZXMuCitFWFRSQV9GTEFHUz0gLURXRUJQX0hBVkVfUE5HIC1EV0VCUF9IQVZFX0pQRUcgLURXRUJQX0hBVkVfVElGRgorRFdFQlBfTElCUz0gLWxwbmcgLWx6CitDV0VCUF9MSUJTPSAkKERXRUJQX0xJQlMpIC1sanBlZyAtbHRpZmYKK0dJRl9MSUJTID0gLWxnaWYKKworaWZlcSAoJChzdHJpcCAkKHNoZWxsIHVuYW1lKSksIERhcndpbikKKyAgIyBXb3JrIGFyb3VuZCBhIHByb2JsZW0gbGlua2luZyB0YWJsZXMgbWFya2VkIGFzIGNvbW1vbiBzeW1ib2xzLAorICAjIGNmLiwgc3JjL2VuYy95dXYuW2hjXQorICAjIEZhaWx1cmUgb2JzZXJ2ZWQgd2l0aDogZ2NjIDQuMi4xIGFuZCA0LjAuMS4KKyAgRVhUUkFfRkxBR1MgKz0gLWZuby1jb21tb24KKyAgRVhUUkFfRkxBR1MgKz0gLURIQVZFX0dMVVRfR0xVVF9ICisgIEVYVFJBX0ZMQUdTICs9IC1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMKKyAgRVhUUkFfRkxBR1MgKz0gLUkvb3B0L2xvY2FsL2luY2x1ZGUKKyAgRVhUUkFfTElCUyAgKz0gLUwvb3B0L2xvY2FsL2xpYgorICBHTF9MSUJTID0gLWZyYW1ld29yayBHTFVUIC1mcmFtZXdvcmsgT3BlbkdMCitlbHNlCisgIEVYVFJBX0ZMQUdTICs9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCisgIEVYVFJBX0xJQlMgICs9IC1ML3Vzci9sb2NhbC9saWIKKyAgR0xfTElCUyA9IC1sZ2x1dCAtbEdMCitlbmRpZgorCisjIFNETCBmbGFnczogdXNlIHNkbC1jb25maWcgaWYgaXQgZXhpc3RzCitTRExfQ09ORklHID0gJChzaGVsbCBzZGwtY29uZmlnIC0tdmVyc2lvbiAyPiAvZGV2L251bGwpCitpZm5lcSAoJChTRExfQ09ORklHKSwpCisgIFNETF9MSUJTID0gJChzaGVsbCBzZGwtY29uZmlnIC0tbGlicykKKyAgU0RMX0ZMQUdTID0gJChzaGVsbCBzZGwtY29uZmlnIC0tY2ZsYWdzKQorZWxzZQorICAjIHVzZSBiZXN0LWd1ZXNzCisgIFNETF9MSUJTID0gLWxTREwKKyAgU0RMX0ZMQUdTID0KK2VuZGlmCisKKyMgVG8gaW5zdGFsbCBsaWJyYXJpZXMgb24gTWFjIE9TIFg6CisjIDEuIEluc3RhbGwgTWFjUG9ydHMgKGh0dHA6Ly93d3cubWFjcG9ydHMub3JnL2luc3RhbGwucGhwKQorIyAyLiBSdW4gInN1ZG8gcG9ydCBpbnN0YWxsIGpwZWciCisjIDMuIFJ1biAic3VkbyBwb3J0IGluc3RhbGwgbGlicG5nIgorIyA0LiBSdW4gInN1ZG8gcG9ydCBpbnN0YWxsIHRpZmYiCisjIDUuIFJ1biAic3VkbyBwb3J0IGluc3RhbGwgZ2lmbGliIgorCisjIFRvIGluc3RhbGwgbGlicmFyaWVzIG9uIExpbnV4OgorIyAxLiBSdW4gInN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmpwZWc2Mi1kZXYiCisjIDIuIFJ1biAic3VkbyBhcHQtZ2V0IGluc3RhbGwgbGlicG5nMTItZGV2IgorIyAzLiBSdW4gInN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYnRpZmY0LWRldiIKKyMgNC4gUnVuICJzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJnaWYtZGV2IgorCisjIFVuY29tbWVudCBmb3IgYnVpbGQgZm9yIDMyYml0IHBsYXRmb3JtCisjIEFsdGVybmF0aXZlbHksIHlvdSBjYW4ganVzdCB1c2UgdGhlIGNvbW1hbmQKKyMgJ21ha2UgLWYgbWFrZWZpbGUudW5peCBFWFRSQV9GTEFHUz0tbTMyJyB0byB0aGF0IGVmZmVjdC4KKyMgRVhUUkFfRkxBR1MgKz0gLW0zMgorCisjIEV4dHJhIGZsYWdzIHRvIGVuYWJsZSBieXRlIHN3YXAgZm9yIDE2IGJpdCBjb2xvcnNwYWNlcy4KKyMgRVhUUkFfRkxBR1MgKz0gLURXRUJQX1NXQVBfMTZCSVRfQ1NQPTEKKworIyBFeHRyYSBmbGFncyB0byBlbmFibGUgbXVsdGktdGhyZWFkaW5nCitFWFRSQV9GTEFHUyArPSAtRFdFQlBfVVNFX1RIUkVBRAorRVhUUkFfTElCUyArPSAtbHB0aHJlYWQKKworIyBDb250cm9sIHN5bWJvbCB2aXNpYmlsaXR5LiBDb21tZW50IG91dCBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KK0VYVFJBX0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KKworIyBFeHRyYSBmbGFncyB0byBlbXVsYXRlIEM4OSBzdHJpY3RuZXNzIHdpdGggdGhlIGZ1bGwgQU5TSQorRVhUUkFfRkxBR1MgKz0gLVdleHRyYSAtV29sZC1zdHlsZS1kZWZpbml0aW9uCitFWFRSQV9GTEFHUyArPSAtV21pc3NpbmctcHJvdG90eXBlcworRVhUUkFfRkxBR1MgKz0gLVdtaXNzaW5nLWRlY2xhcmF0aW9ucworRVhUUkFfRkxBR1MgKz0gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQKK0VYVFJBX0ZMQUdTICs9IC1Xc2hhZG93CitFWFRSQV9GTEFHUyArPSAtV2Zvcm1hdC1zZWN1cml0eSAtV2Zvcm1hdC1ub25saXRlcmFsCisjIEVYVFJBX0ZMQUdTICs9IC1XdmxhCisKKyMgU1NFNC4xLXNwZWNpZmljIGZsYWdzOgoraWZlcSAoJChIQVZFX1NTRTQxKSwgMSkKK0VYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX1NTRTQxCitzcmMvZHNwLyVfc3NlNDEubzogRVhUUkFfRkxBR1MgKz0gLW1zc2U0LjEKK2VuZGlmCisKKyMgQVZYMi1zcGVjaWZpYyBmbGFnczoKK2lmZXEgKCQoSEFWRV9BVlgyKSwgMSkKK0VYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX0FWWDIKK3NyYy9kc3AvJV9hdngyLm86IEVYVFJBX0ZMQUdTICs9IC1tYXZ4MgorZW5kaWYKKworIyBORU9OLXNwZWNpZmljIGZsYWdzOgorIyBFWFRSQV9GTEFHUyArPSAtbWFyY2g9YXJtdjctYSAtbWZsb2F0LWFiaT1oYXJkIC1tZnB1PW5lb24gLW10dW5lPWNvcnRleC1hOAorIyAtPiBzZWVtcyB0byBtYWtlIHRoZSBvdmVyYWxsIGxpYiBzbG93ZXI6IC1mbm8tc3BsaXQtd2lkZS10eXBlcworCisjIE1JUFMgKE1TQSkgMzItYml0IGJ1aWxkIHNwZWNpZmljIGZsYWdzIGZvciBtaXBzMzJyNSAocDU2MDApOgorIyBFWFRSQV9GTEFHUyArPSAtbWlwczMycjUgLW1hYmk9MzIgLW10dW5lPXA1NjAwIC1tbXNhIC1tZnA2NAorIyBFWFRSQV9GTEFHUyArPSAtbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMKKworIyBNSVBTIChNU0EpIDY0LWJpdCBidWlsZCBzcGVjaWZpYyBmbGFncyBmb3IgbWlwczY0cjYgKGk2NDAwKToKKyMgRVhUUkFfRkxBR1MgKz0gLW1pcHM2NHI2IC1tYWJpPTY0IC1tdHVuZT1pNjQwMCAtbW1zYSAtbWZwNjQKKyMgRVhUUkFfRkxBR1MgKz0gLW1zY2hlZC13ZWlnaHQgLW1sb2FkLXN0b3JlLXBhaXJzCisKKyMjIyMgTm90aGluZyBzaG91bGQgbm9ybWFsbHkgYmUgY2hhbmdlZCBiZWxvdyB0aGlzIGxpbmUgIyMjIworCitBUiA9IGFyCitBUkZMQUdTID0gcgorQ1BQRkxBR1MgPSAtSS4gLUlzcmMvIC1XYWxsCitpZmVxICgkKERFQlVHKSwgMSkKKyAgQ0ZMQUdTID0gLWcKK2Vsc2UKKyAgQ0ZMQUdTID0gLU8zIC1ETkRFQlVHCitlbmRpZgorQ0ZMQUdTICs9ICQoRVhUUkFfRkxBR1MpCitDQyA9IGdjYworSU5TVEFMTCA9IGluc3RhbGwKK0dST0ZGID0gL3Vzci9iaW4vZ3JvZmYKK0NPTCA9IC91c3IvYmluL2NvbAorTERGTEFHUyA9ICQoRVhUUkFfTElCUykgJChFWFRSQV9GTEFHUykgLWxtCisKK0FOSU1fVVRJTF9PQkpTID0gXAorICAgIGV4YW1wbGVzL2FuaW1fdXRpbC5vIFwKKworREVDX09CSlMgPSBcCisgICAgc3JjL2RlYy9hbHBoYV9kZWMubyBcCisgICAgc3JjL2RlYy9idWZmZXJfZGVjLm8gXAorICAgIHNyYy9kZWMvZnJhbWVfZGVjLm8gXAorICAgIHNyYy9kZWMvaWRlY19kZWMubyBcCisgICAgc3JjL2RlYy9pb19kZWMubyBcCisgICAgc3JjL2RlYy9xdWFudF9kZWMubyBcCisgICAgc3JjL2RlYy90cmVlX2RlYy5vIFwKKyAgICBzcmMvZGVjL3ZwOF9kZWMubyBcCisgICAgc3JjL2RlYy92cDhsX2RlYy5vIFwKKyAgICBzcmMvZGVjL3dlYnBfZGVjLm8gXAorCitERU1VWF9PQkpTID0gXAorICAgIHNyYy9kZW11eC9hbmltX2RlY29kZS5vIFwKKyAgICBzcmMvZGVtdXgvZGVtdXgubyBcCisKK0RTUF9ERUNfT0JKUyA9IFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcubyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLm8gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLm8gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5vIFwKKyAgICBzcmMvZHNwL2NwdS5vIFwKKyAgICBzcmMvZHNwL2RlYy5vIFwKKyAgICBzcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5vIFwKKyAgICBzcmMvZHNwL2RlY19taXBzMzIubyBcCisgICAgc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9kZWNfbXNhLm8gXAorICAgIHNyYy9kc3AvZGVjX25lb24ubyBcCisgICAgc3JjL2RzcC9kZWNfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2RlY19zc2U0MS5vIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnMubyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvZmlsdGVyc19tc2EubyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX25lb24ubyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX3NzZTIubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzcy5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbXNhLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX3NzZTIubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlci5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbXNhLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbmVvbi5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX3NzZTIubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19uZW9uLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19zc2UyLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5vIFwKKyAgICBzcmMvZHNwL3l1di5vIFwKKyAgICBzcmMvZHNwL3l1dl9taXBzMzIubyBcCisgICAgc3JjL2RzcC95dXZfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC95dXZfbmVvbi5vIFwKKyAgICBzcmMvZHNwL3l1dl9zc2UyLm8gXAorICAgIHNyYy9kc3AveXV2X3NzZTQxLm8gXAorCitEU1BfRU5DX09CSlMgPSBcCisgICAgc3JjL2RzcC9jb3N0Lm8gXAorICAgIHNyYy9kc3AvY29zdF9taXBzMzIubyBcCisgICAgc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvY29zdF9zc2UyLm8gXAorICAgIHNyYy9kc3AvZW5jLm8gXAorICAgIHNyYy9kc3AvZW5jX2F2eDIubyBcCisgICAgc3JjL2RzcC9lbmNfbWlwczMyLm8gXAorICAgIHNyYy9kc3AvZW5jX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvZW5jX21zYS5vIFwKKyAgICBzcmMvZHNwL2VuY19uZW9uLm8gXAorICAgIHNyYy9kc3AvZW5jX3NzZTIubyBcCisgICAgc3JjL2RzcC9lbmNfc3NlNDEubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmMubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEubyBcCisgICAgc3JjL2RzcC9zc2ltLm8gXAorICAgIHNyYy9kc3Avc3NpbV9zc2UyLm8gXAorCitFTkNfT0JKUyA9IFwKKyAgICBzcmMvZW5jL2FscGhhX2VuYy5vIFwKKyAgICBzcmMvZW5jL2FuYWx5c2lzX2VuYy5vIFwKKyAgICBzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMubyBcCisgICAgc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5vIFwKKyAgICBzcmMvZW5jL2NvbmZpZ19lbmMubyBcCisgICAgc3JjL2VuYy9jb3N0X2VuYy5vIFwKKyAgICBzcmMvZW5jL2ZpbHRlcl9lbmMubyBcCisgICAgc3JjL2VuYy9mcmFtZV9lbmMubyBcCisgICAgc3JjL2VuYy9oaXN0b2dyYW1fZW5jLm8gXAorICAgIHNyYy9lbmMvaXRlcmF0b3JfZW5jLm8gXAorICAgIHNyYy9lbmMvbmVhcl9sb3NzbGVzc19lbmMubyBcCisgICAgc3JjL2VuYy9waWN0dXJlX2VuYy5vIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfY3NwX2VuYy5vIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMubyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3Jlc2NhbGVfZW5jLm8gXAorICAgIHNyYy9lbmMvcGljdHVyZV90b29sc19lbmMubyBcCisgICAgc3JjL2VuYy9wcmVkaWN0b3JfZW5jLm8gXAorICAgIHNyYy9lbmMvcXVhbnRfZW5jLm8gXAorICAgIHNyYy9lbmMvc3ludGF4X2VuYy5vIFwKKyAgICBzcmMvZW5jL3Rva2VuX2VuYy5vIFwKKyAgICBzcmMvZW5jL3RyZWVfZW5jLm8gXAorICAgIHNyYy9lbmMvdnA4bF9lbmMubyBcCisgICAgc3JjL2VuYy93ZWJwX2VuYy5vIFwKKworRVhfRk9STUFUX0RFQ19PQkpTID0gXAorICAgIGltYWdlaW8vaW1hZ2VfZGVjLm8gXAorICAgIGltYWdlaW8vanBlZ2RlYy5vIFwKKyAgICBpbWFnZWlvL21ldGFkYXRhLm8gXAorICAgIGltYWdlaW8vcG5nZGVjLm8gXAorICAgIGltYWdlaW8vcG5tZGVjLm8gXAorICAgIGltYWdlaW8vdGlmZmRlYy5vIFwKKyAgICBpbWFnZWlvL3dlYnBkZWMubyBcCisKK0VYX0ZPUk1BVF9FTkNfT0JKUyA9IFwKKyAgICBpbWFnZWlvL2ltYWdlX2VuYy5vIFwKKworRVhfVVRJTF9PQkpTID0gXAorICAgIGV4YW1wbGVzL2V4YW1wbGVfdXRpbC5vIFwKKworR0lGREVDX09CSlMgPSBcCisgICAgZXhhbXBsZXMvZ2lmZGVjLm8gXAorCitJTUFHRV9VVElMX09CSlMgPSBcCisgICAgaW1hZ2Vpby9pbWFnZWlvX3V0aWwubyBcCisKK01VWF9PQkpTID0gXAorICAgIHNyYy9tdXgvYW5pbV9lbmNvZGUubyBcCisgICAgc3JjL211eC9tdXhlZGl0Lm8gXAorICAgIHNyYy9tdXgvbXV4aW50ZXJuYWwubyBcCisgICAgc3JjL211eC9tdXhyZWFkLm8gXAorCitVVElMU19ERUNfT0JKUyA9IFwKKyAgICBzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3JhbmRvbV91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3RocmVhZF91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvdXRpbHMubyBcCisKK1VUSUxTX0VOQ19PQkpTID0gXAorICAgIHNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLm8gXAorCitFWFRSQV9PQkpTID0gXAorICAgIGV4dHJhcy9leHRyYXMubyBcCisgICAgZXh0cmFzL3F1YWxpdHlfZXN0aW1hdGUubyBcCisKK0xJQldFQlBERUNPREVSX09CSlMgPSAkKERFQ19PQkpTKSAkKERTUF9ERUNfT0JKUykgJChVVElMU19ERUNfT0JKUykKK0xJQldFQlBfT0JKUyA9ICQoTElCV0VCUERFQ09ERVJfT0JKUykgJChFTkNfT0JKUykgJChEU1BfRU5DX09CSlMpIFwKKyAgICAgICAgICAgICAgICQoVVRJTFNfRU5DX09CSlMpCitMSUJXRUJQTVVYX09CSlMgPSAkKE1VWF9PQkpTKQorTElCV0VCUERFTVVYX09CSlMgPSAkKERFTVVYX09CSlMpCitMSUJXRUJQRVhUUkFfT0JKUyA9ICQoRVhUUkFfT0JKUykKKworSERSU19JTlNUQUxMRUQgPSBcCisgICAgc3JjL3dlYnAvZGVjb2RlLmggXAorICAgIHNyYy93ZWJwL2RlbXV4LmggXAorICAgIHNyYy93ZWJwL2VuY29kZS5oIFwKKyAgICBzcmMvd2VicC9tdXguaCBcCisgICAgc3JjL3dlYnAvbXV4X3R5cGVzLmggXAorICAgIHNyYy93ZWJwL3R5cGVzLmggXAorCitIRFJTID0gXAorICAgIHNyYy9kZWMvYWxwaGFpX2RlYy5oIFwKKyAgICBzcmMvZGVjL2NvbW1vbl9kZWMuaCBcCisgICAgc3JjL2RlYy92cDhfZGVjLmggXAorICAgIHNyYy9kZWMvdnA4aV9kZWMuaCBcCisgICAgc3JjL2RlYy92cDhsaV9kZWMuaCBcCisgICAgc3JjL2RlYy93ZWJwaV9kZWMuaCBcCisgICAgc3JjL2RzcC9jb21tb25fc3NlMi5oIFwKKyAgICBzcmMvZHNwL2RzcC5oIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzLmggXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmggXAorICAgIHNyYy9kc3AvbWlwc19tYWNyby5oIFwKKyAgICBzcmMvZHNwL21zYV9tYWNyby5oIFwKKyAgICBzcmMvZHNwL25lb24uaCBcCisgICAgc3JjL2RzcC95dXYuaCBcCisgICAgc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIFwKKyAgICBzcmMvZW5jL2Nvc3RfZW5jLmggXAorICAgIHNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIFwKKyAgICBzcmMvZW5jL3ZwOGlfZW5jLmggXAorICAgIHNyYy9lbmMvdnA4bGlfZW5jLmggXAorICAgIHNyYy9tdXgvYW5pbWkuaCBcCisgICAgc3JjL211eC9tdXhpLmggXAorICAgIHNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3JhbmRvbV91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3RocmVhZF91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvdXRpbHMuaCBcCisgICAgc3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIFwKKyAgICAkKEhEUlNfSU5TVEFMTEVEKSBcCisKK09VVF9MSUJTID0gZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEKK09VVF9MSUJTICs9IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK09VVF9MSUJTICs9IGltYWdlaW8vbGliaW1hZ2VkZWMuYQorT1VUX0xJQlMgKz0gaW1hZ2Vpby9saWJpbWFnZWVuYy5hCitPVVRfTElCUyArPSBzcmMvbGlid2VicGRlY29kZXIuYQorT1VUX0xJQlMgKz0gc3JjL2xpYndlYnAuYQorRVhUUkFfTElCID0gZXh0cmFzL2xpYndlYnBleHRyYXMuYQorT1VUX0VYQU1QTEVTID0gZXhhbXBsZXMvY3dlYnAgZXhhbXBsZXMvZHdlYnAKK0VYVFJBX0VYQU1QTEVTID0gZXhhbXBsZXMvZ2lmMndlYnAgZXhhbXBsZXMvdndlYnAgZXhhbXBsZXMvd2VicG11eCBcCisgICAgICAgICAgICAgICAgIGV4YW1wbGVzL2FuaW1fZGlmZiBleGFtcGxlcy9hbmltX2R1bXAgXAorICAgICAgICAgICAgICAgICBleGFtcGxlcy9pbWcyd2VicCBleGFtcGxlcy93ZWJwaW5mbworT1RIRVJfRVhBTVBMRVMgPSBleHRyYXMvZ2V0X2Rpc3RvIGV4dHJhcy93ZWJwX3F1YWxpdHkgZXh0cmFzL3Z3ZWJwX3NkbAorCitPVVRQVVQgPSAkKE9VVF9MSUJTKSAkKE9VVF9FWEFNUExFUykKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxjbGVhbikKKyAgT1VUUFVUICs9ICQoRVhUUkFfRVhBTVBMRVMpICQoT1RIRVJfRVhBTVBMRVMpCisgIE9VVFBVVCArPSBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEgc3JjL211eC9saWJ3ZWJwbXV4LmEgJChFWFRSQV9MSUIpCisgIE9VVFBVVCArPSBleGFtcGxlcy9saWJnaWZkZWMuYSBleGFtcGxlcy9saWJhbmltX3V0aWwuYQorZW5kaWYKKworZXg6ICQoT1VUX0VYQU1QTEVTKQorYWxsOiBleCAkKEVYVFJBX0VYQU1QTEVTKSAkKE9USEVSX0VYQU1QTEVTKQorZXh0cmFzOiAkKEVYVFJBX0xJQikKKworJChFWF9GT1JNQVRfREVDX09CSlMpOiAlLm86ICUuaAorCisjIHNwZWNpYWwgZGVwZW5kZW5jaWVzOgorIyAgIHRyZWVfZGVjLmMvdnA4X2RlYy5jL2JpdF9yZWFkZXJfdXRpbHMuYyA8LT4KKyMgICAgIGJpdF9yZWFkZXJfaW5sX3V0aWxzLmgsIGVuZGlhbl9pbmxfdXRpbHMuaAorIyAgIGJpdF93cml0ZXJfdXRpbHMuYyA8LT4gZW5kaWFuX2lubF91dGlscy5oCitzcmMvZGVjL3RyZWVfZGVjLm86IHNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oCitzcmMvZGVjL3RyZWVfZGVjLm86IHNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKK3NyYy9kZWMvdnA4X2RlYy5vOiBzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCBzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCitzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5vOiBzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaAorc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMubzogc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaAorc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMubzogc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaAorCislLm86ICUuYyAkKEhEUlMpCisJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK2V4YW1wbGVzL2xpYmFuaW1fdXRpbC5hOiAkKEFOSU1fVVRJTF9PQkpTKQorZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmE6ICQoRVhfVVRJTF9PQkpTKQorZXhhbXBsZXMvbGliZ2lmZGVjLmE6ICQoR0lGREVDX09CSlMpCitleHRyYXMvbGlid2VicGV4dHJhcy5hOiAkKExJQldFQlBFWFRSQV9PQkpTKQoraW1hZ2Vpby9saWJpbWFnZWRlYy5hOiAkKEVYX0ZPUk1BVF9ERUNfT0JKUykKK2ltYWdlaW8vbGliaW1hZ2VlbmMuYTogJChFWF9GT1JNQVRfRU5DX09CSlMpCitpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hOiAkKElNQUdFX1VUSUxfT0JKUykKK3NyYy9saWJ3ZWJwZGVjb2Rlci5hOiAkKExJQldFQlBERUNPREVSX09CSlMpCitzcmMvbGlid2VicC5hOiAkKExJQldFQlBfT0JKUykKK3NyYy9tdXgvbGlid2VicG11eC5hOiAkKExJQldFQlBNVVhfT0JKUykKK3NyYy9kZW11eC9saWJ3ZWJwZGVtdXguYTogJChMSUJXRUJQREVNVVhfT0JKUykKKworJS5hOgorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworZXhhbXBsZXMvYW5pbV9kaWZmOiBleGFtcGxlcy9hbmltX2RpZmYubyAkKEFOSU1fVVRJTF9PQkpTKSAkKEdJRkRFQ19PQkpTKQorZXhhbXBsZXMvYW5pbV9kdW1wOiBleGFtcGxlcy9hbmltX2R1bXAubyAkKEFOSU1fVVRJTF9PQkpTKQorZXhhbXBsZXMvY3dlYnA6IGV4YW1wbGVzL2N3ZWJwLm8KK2V4YW1wbGVzL2R3ZWJwOiBleGFtcGxlcy9kd2VicC5vCitleGFtcGxlcy9naWYyd2VicDogZXhhbXBsZXMvZ2lmMndlYnAubyAkKEdJRkRFQ19PQkpTKQorZXhhbXBsZXMvdndlYnA6IGV4YW1wbGVzL3Z3ZWJwLm8KK2V4YW1wbGVzL3dlYnBtdXg6IGV4YW1wbGVzL3dlYnBtdXgubworZXhhbXBsZXMvaW1nMndlYnA6IGV4YW1wbGVzL2ltZzJ3ZWJwLm8KK2V4YW1wbGVzL3dlYnBpbmZvOiBleGFtcGxlcy93ZWJwaW5mby5vCisKK2V4YW1wbGVzL2FuaW1fZGlmZjogZXhhbXBsZXMvbGliYW5pbV91dGlsLmEgZXhhbXBsZXMvbGliZ2lmZGVjLmEKK2V4YW1wbGVzL2FuaW1fZGlmZjogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hIGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hCitleGFtcGxlcy9hbmltX2RpZmY6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEgc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvYW5pbV9kaWZmOiBFWFRSQV9MSUJTICs9ICQoR0lGX0xJQlMpCitleGFtcGxlcy9hbmltX2RpZmY6IEVYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX0dJRgorZXhhbXBsZXMvYW5pbV9kdW1wOiBleGFtcGxlcy9saWJhbmltX3V0aWwuYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBpbWFnZWlvL2xpYmltYWdlZW5jLmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBFWFRSQV9MSUJTICs9ICQoR0lGX0xJQlMpICQoRFdFQlBfTElCUykKK2V4YW1wbGVzL2N3ZWJwOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYQorZXhhbXBsZXMvY3dlYnA6IGltYWdlaW8vbGliaW1hZ2VkZWMuYQorZXhhbXBsZXMvY3dlYnA6IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXhhbXBsZXMvY3dlYnA6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL2N3ZWJwOiBzcmMvbGlid2VicC5hCitleGFtcGxlcy9jd2VicDogRVhUUkFfTElCUyArPSAkKENXRUJQX0xJQlMpCitleGFtcGxlcy9kd2VicDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEKK2V4YW1wbGVzL2R3ZWJwOiBpbWFnZWlvL2xpYmltYWdlZGVjLmEKK2V4YW1wbGVzL2R3ZWJwOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4YW1wbGVzL2R3ZWJwOiBpbWFnZWlvL2xpYmltYWdlZW5jLmEKK2V4YW1wbGVzL2R3ZWJwOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy9kd2VicDogc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvZHdlYnA6IEVYVFJBX0xJQlMgKz0gJChEV0VCUF9MSUJTKQorZXhhbXBsZXMvZ2lmMndlYnA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hIGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL2dpZjJ3ZWJwOiBleGFtcGxlcy9saWJnaWZkZWMuYSBzcmMvbXV4L2xpYndlYnBtdXguYSBzcmMvbGlid2VicC5hCitleGFtcGxlcy9naWYyd2VicDogRVhUUkFfTElCUyArPSAkKEdJRl9MSUJTKQorZXhhbXBsZXMvZ2lmMndlYnA6IEVYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX0dJRgorZXhhbXBsZXMvdndlYnA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hIHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXhhbXBsZXMvdndlYnA6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEgc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvdndlYnA6IEVYVFJBX0xJQlMgKz0gJChHTF9MSUJTKQorZXhhbXBsZXMvdndlYnA6IEVYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX0dMCitleGFtcGxlcy93ZWJwbXV4OiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYSBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy93ZWJwbXV4OiBzcmMvbXV4L2xpYndlYnBtdXguYSBzcmMvbGlid2VicGRlY29kZXIuYQorZXhhbXBsZXMvaW1nMndlYnA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hIGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL2ltZzJ3ZWJwOiBpbWFnZWlvL2xpYmltYWdlZGVjLmEKK2V4YW1wbGVzL2ltZzJ3ZWJwOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4YW1wbGVzL2ltZzJ3ZWJwOiBzcmMvbXV4L2xpYndlYnBtdXguYSBzcmMvbGlid2VicC5hCitleGFtcGxlcy9pbWcyd2VicDogRVhUUkFfTElCUyArPSAkKENXRUJQX0xJQlMpCitleGFtcGxlcy93ZWJwaW5mbzogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEgaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvd2VicGluZm86IHNyYy9saWJ3ZWJwZGVjb2Rlci5hCisKK2V4dHJhcy9nZXRfZGlzdG86IGV4dHJhcy9nZXRfZGlzdG8ubworZXh0cmFzL2dldF9kaXN0bzogaW1hZ2Vpby9saWJpbWFnZWRlYy5hCitleHRyYXMvZ2V0X2Rpc3RvOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4dHJhcy9nZXRfZGlzdG86IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4dHJhcy9nZXRfZGlzdG86IHNyYy9saWJ3ZWJwLmEKK2V4dHJhcy9nZXRfZGlzdG86IEVYVFJBX0xJQlMgKz0gJChDV0VCUF9MSUJTKQorCitleHRyYXMvd2VicF9xdWFsaXR5OiBleHRyYXMvd2VicF9xdWFsaXR5Lm8KK2V4dHJhcy93ZWJwX3F1YWxpdHk6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4dHJhcy93ZWJwX3F1YWxpdHk6ICQoRVhUUkFfTElCKSBzcmMvbGlid2VicC5hCisKK2V4dHJhcy92d2VicF9zZGw6IGV4dHJhcy92d2VicF9zZGwubworZXh0cmFzL3Z3ZWJwX3NkbDogZXh0cmFzL3dlYnBfdG9fc2RsLm8KK2V4dHJhcy92d2VicF9zZGw6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4dHJhcy92d2VicF9zZGw6IHNyYy9saWJ3ZWJwLmEKK2V4dHJhcy92d2VicF9zZGw6IEVYVFJBX0ZMQUdTICs9IC1EV0VCUF9IQVZFX1NETCAkKFNETF9GTEFHUykKK2V4dHJhcy92d2VicF9zZGw6IEVYVFJBX0xJQlMgKz0gJChTRExfTElCUykKKworJChPVVRfRVhBTVBMRVMpICQoRVhUUkFfRVhBTVBMRVMpICQoT1RIRVJfRVhBTVBMRVMpOgorCSQoQ0MpIC1vICRAICReICQoTERGTEFHUykKKworZGlzdDogREVTVERJUiA6PSBkaXN0CitkaXN0OiBPVVRfRVhBTVBMRVMgKz0gJChFWFRSQV9FWEFNUExFUykKK2Rpc3Q6IGFsbAorCSQoSU5TVEFMTCkgLW03NTUgLWQgJChERVNURElSKS9pbmNsdWRlL3dlYnAgXAorCSAgICAgICAgICAgJChERVNURElSKS9iaW4gJChERVNURElSKS9kb2MgJChERVNURElSKS9saWIKKwkkKElOU1RBTEwpIC1tNzU1IC1zICQoT1VUX0VYQU1QTEVTKSAkKERFU1RESVIpL2JpbgorCSQoSU5TVEFMTCkgLW02NDQgJChIRFJTX0lOU1RBTExFRCkgJChERVNURElSKS9pbmNsdWRlL3dlYnAKKwkkKElOU1RBTEwpIC1tNjQ0IHNyYy9saWJ3ZWJwLmEgJChERVNURElSKS9saWIKKwkkKElOU1RBTEwpIC1tNjQ0IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYSAkKERFU1RESVIpL2xpYgorCSQoSU5TVEFMTCkgLW02NDQgc3JjL211eC9saWJ3ZWJwbXV4LmEgJChERVNURElSKS9saWIKKwl1bWFzayAwMjI7IFwKKwlmb3IgbSBpbiBtYW4vW2Nkdl13ZWJwLjEgbWFuL2dpZjJ3ZWJwLjEgbWFuL3dlYnBtdXguMSBcCisgICAgICAgICAgICAgICAgIG1hbi9pbWcyd2VicC4xIG1hbi93ZWJwaW5mby4xOyBkbyBcCisJICBiYXNlbmFtPSQkKGJhc2VuYW1lICQkbSAuMSk7IFwKKwkgICQoR1JPRkYpIC10IC1lIC1tYW4gLVQgYXNjaWkgJCRtIFwKKwkgICAgfCAkKENPTCkgLWJ4ID4kKERFU1RESVIpL2RvYy8kJHtiYXNlbmFtfS50eHQ7IFwKKwkgICQoR1JPRkYpIC10IC1lIC1tYW4gLVQgaHRtbCAkJG0gXAorCSAgICB8ICQoQ09MKSAtYnggPiQoREVTVERJUikvZG9jLyQke2Jhc2VuYW19Lmh0bWw7IFwKKwlkb25lCisKK2NsZWFuOgorCSQoUk0pICQoT1VUUFVUKSAqfiBcCisgICAgICAgICAgICAgIGV4YW1wbGVzLyoubyBleGFtcGxlcy8qfiBcCisgICAgICAgICAgICAgIGV4dHJhcy8qLm8gZXh0cmFzLyp+IFwKKyAgICAgICAgICAgICAgaW1hZ2Vpby8qLm8gaW1hZ2Vpby8qfiBcCisgICAgICAgICAgICAgIHNyYy9kZWMvKi5vIHNyYy9kZWMvKn4gXAorICAgICAgICAgICAgICBzcmMvZGVtdXgvKi5vIHNyYy9kZW11eC8qfiBcCisgICAgICAgICAgICAgIHNyYy9kc3AvKi5vIHNyYy9kc3AvKn4gXAorICAgICAgICAgICAgICBzcmMvZW5jLyoubyBzcmMvZW5jLyp+IFwKKyAgICAgICAgICAgICAgc3JjL211eC8qLm8gc3JjL211eC8qfiBcCisgICAgICAgICAgICAgIHNyYy91dGlscy8qLm8gc3JjL3V0aWxzLyp+IFwKKyAgICAgICAgICAgICAgc3JjL3dlYnAvKn4gbWFuLyp+IGRvYy8qfiBzd2lnLyp+IFwKKworLlBIT05ZOiBhbGwgY2xlYW4gZGlzdCBleAorLlNVRkZJWEVTOgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWY3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNCBAQAorbWFuX01BTlMgPSBjd2VicC4xIGR3ZWJwLjEKK2lmIFdBTlRfTVVYCisgIG1hbl9NQU5TICs9IHdlYnBtdXguMQorZW5kaWYKK2lmIEJVSUxEX0dJRjJXRUJQCisgIG1hbl9NQU5TICs9IGdpZjJ3ZWJwLjEKK2VuZGlmCitpZiBCVUlMRF9WV0VCUAorICBtYW5fTUFOUyArPSB2d2VicC4xCitlbmRpZgoraWYgQlVJTERfV0VCUElORk8KKyAgbWFuX01BTlMgKz0gd2VicGluZm8uMQorZW5kaWYKK0VYVFJBX0RJU1QgPSAkKG1hbl9NQU5TKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2N3ZWJwLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vY3dlYnAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQzMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2N3ZWJwLjEKQEAgLTAsMCArMSwzMTYgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIENXRUJQIDEgIkphbnVhcnkgMjAsIDIwMTciCisuU0ggTkFNRQorY3dlYnAgXC0gY29tcHJlc3MgYW4gaW1hZ2UgZmlsZSB0byBhIFdlYlAgZmlsZQorLlNIIFNZTk9QU0lTCisuQiBjd2VicAorLlJJIFsgb3B0aW9ucyBdICIgaW5wdXRfZmlsZSBcLW8gb3V0cHV0X2ZpbGUud2VicAorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgY3dlYnAKK2NvbW1hbmQuCisuUFAKK1xmQmN3ZWJwXGZQIGNvbXByZXNzZXMgYW4gaW1hZ2UgdXNpbmcgdGhlIFdlYlAgZm9ybWF0LgorSW5wdXQgZm9ybWF0IGNhbiBiZSBlaXRoZXIgUE5HLCBKUEVHLCBUSUZGLCBXZWJQIG9yIHJhdyBZJ0NiQ3Igc2FtcGxlcy4KKy5TSCBPUFRJT05TCitUaGUgYmFzaWMgb3B0aW9ucyBhcmU6CisuVFAKKy5CSSBcLW8gIiBzdHJpbmcKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBXZWJQIGZpbGUuIElmIG9taXR0ZWQsIFxmQmN3ZWJwXGZQIHdpbGwKK3BlcmZvcm0gY29tcHJlc3Npb24gYnV0IG9ubHkgcmVwb3J0IHN0YXRpc3RpY3MuCitVc2luZyAiXC0iIGFzIG91dHB1dCBuYW1lIHdpbGwgZGlyZWN0IG91dHB1dCB0byAnc3Rkb3V0Jy4KKy5UUAorLkJJIFwtXC0gIiBzdHJpbmcKK0V4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHRoZSBpbnB1dAorZmlsZSBzdGFydHMgd2l0aCBhICdcLScgZm9yIGluc3RhbmNlLiBUaGlzIG9wdGlvbiBtdXN0IGFwcGVhciBcZkJsYXN0XGZQLgorQW55IG90aGVyIG9wdGlvbnMgYWZ0ZXJ3YXJkIHdpbGwgYmUgaWdub3JlZC4KKy5UUAorLkIgXC1oLCBcLWhlbHAKK0Egc2hvcnQgdXNhZ2Ugc3VtbWFyeS4KKy5UUAorLkIgXC1ILCBcLWxvbmdoZWxwCitBIHN1bW1hcnkgb2YgYWxsIHRoZSBwb3NzaWJsZSBvcHRpb25zLgorLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciAoYXMgbWFqb3IubWlub3IucmV2aXNpb24pIGFuZCBleGl0LgorLlRQCisuQiBcLWxvc3NsZXNzCitFbmNvZGUgdGhlIGltYWdlIHdpdGhvdXQgYW55IGxvc3MuIEZvciBpbWFnZXMgd2l0aCBmdWxseSB0cmFuc3BhcmVudCBhcmVhLAordGhlIGludmlzaWJsZSBwaXhlbCB2YWx1ZXMgKFIvRy9CIG9yIFkvVS9WKSB3aWxsIGJlIHByZXNlcnZlZCBvbmx5IGlmIHRoZQorXC1leGFjdCBvcHRpb24gaXMgdXNlZC4KKy5UUAorLkJJIFwtbmVhcl9sb3NzbGVzcyAiIGludAorVXNlIG5lYXJcLWxvc3NsZXNzIGltYWdlIHByZXByb2Nlc3NpbmcuIFRoaXMgb3B0aW9uIGFkanVzdHMgcGl4ZWwgdmFsdWVzCit0byBoZWxwIGNvbXByZXNzaWJpbGl0eSwgYnV0IGhhcyBtaW5pbWFsIGltcGFjdCBvbiB0aGUgdmlzdWFsIHF1YWxpdHkuCitJdCB0cmlnZ2VycyBsb3NzbGVzcyBjb21wcmVzc2lvbiBtb2RlIGF1dG9tYXRpY2FsbHkuCitSYW5nZSBpcyAwIChtYXhpbXVtIHByZXByb2Nlc3NpbmcpIHRvIDEwMCAobm8gcHJlcHJvY2Vzc2luZywgdGhlIGRlZmF1bHQpLgorLlRQCisuQkkgXC1xICIgZmxvYXQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGZhY3RvciBmb3IgUkdCIGNoYW5uZWxzIGJldHdlZW4gMCBhbmQgMTAwLiBUaGUgZGVmYXVsdAoraXMgNzUuCisuYnIKK0luIGNhc2Ugb2YgbG9zc3kgY29tcHJlc3Npb24gKGRlZmF1bHQpLCBhIHNtYWxsIGZhY3RvciBwcm9kdWNlcyBhIHNtYWxsZXIgZmlsZQord2l0aCBsb3dlciBxdWFsaXR5LiBCZXN0IHF1YWxpdHkgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgYSB2YWx1ZSBvZiAxMDAuCisuYnIKK0luIGNhc2Ugb2YgbG9zc2xlc3MgY29tcHJlc3Npb24gKHNwZWNpZmllZCBieSB0aGUgXGZCXC1sb3NzbGVzc1xmUCBvcHRpb24pLCBhCitzbWFsbCBmYWN0b3IgZW5hYmxlcyBmYXN0ZXIgY29tcHJlc3Npb24gc3BlZWQsIGJ1dCBwcm9kdWNlcyBhIGxhcmdlciBmaWxlLgorTWF4aW11bSBjb21wcmVzc2lvbiBpcyBhY2hpZXZlZCBieSB1c2luZyBhIHZhbHVlIG9mIDEwMC4KKy5UUAorLkJJIFwteiAiIGludAorU3dpdGNoIG9uIFxmQmxvc3NsZXNzXGZQIGNvbXByZXNzaW9uIG1vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxldmVsIGJldHdlZW4gMAorYW5kIDksIHdpdGggbGV2ZWwgMCBiZWluZyB0aGUgZmFzdGVzdCwgOSBiZWluZyB0aGUgc2xvd2VzdC4gRmFzdCBtb2RlCitwcm9kdWNlcyBsYXJnZXIgZmlsZSBzaXplIHRoYW4gc2xvd2VyIG9uZXMuIEEgZ29vZCBkZWZhdWx0IGlzIFxmQlwteiA2XGZQLgorVGhpcyBvcHRpb24gaXMgYWN0dWFsbHkgYSBzaG9ydGN1dCBmb3Igc29tZSBwcmVkZWZpbmVkIHNldHRpbmdzIGZvciBxdWFsaXR5CithbmQgbWV0aG9kLiBJZiBvcHRpb25zIFxmQlwtcVxmUCAgb3IgXGZCXC1tXGZQIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCwgdGhleSB3aWxsCitpbnZhbGlkYXRlIHRoZSBlZmZlY3Qgb2YgdGhpcyBvcHRpb24uCisuVFAKKy5CSSBcLWFscGhhX3EgIiBpbnQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGZhY3RvciBmb3IgYWxwaGEgY29tcHJlc3Npb24gYmV0d2VlbiAwIGFuZCAxMDAuCitMb3NzbGVzcyBjb21wcmVzc2lvbiBvZiBhbHBoYSBpcyBhY2hpZXZlZCB1c2luZyBhIHZhbHVlIG9mIDEwMCwgd2hpbGUgdGhlIGxvd2VyCit2YWx1ZXMgcmVzdWx0IGluIGEgbG9zc3kgY29tcHJlc3Npb24uIFRoZSBkZWZhdWx0IGlzIDEwMC4KKy5UUAorLkJJIFwtcHJlc2V0ICIgc3RyaW5nCitTcGVjaWZ5IGEgc2V0IG9mIHByZVwtZGVmaW5lZCBwYXJhbWV0ZXJzIHRvIHN1aXQgYSBwYXJ0aWN1bGFyIHR5cGUgb2YKK3NvdXJjZSBtYXRlcmlhbC4gUG9zc2libGUgdmFsdWVzIGFyZTogIFxmQmRlZmF1bHRcZlAsIFxmQnBob3RvXGZQLAorXGZCcGljdHVyZVxmUCwgXGZCZHJhd2luZ1xmUCwgXGZCaWNvblxmUCwgXGZCdGV4dFxmUC4gU2luY2UKK1xmQlwtcHJlc2V0XGZQIG92ZXJ3cml0ZXMgdGhlIG90aGVyIHBhcmFtZXRlcnMnIHZhbHVlcyAoZXhjZXB0IHRoZQorXGZCXC1xXGZQIG9uZSksIHRoaXMgb3B0aW9uIHNob3VsZCBwcmVmZXJhYmx5IGFwcGVhciBmaXJzdCBpbiB0aGUKK29yZGVyIG9mIHRoZSBhcmd1bWVudHMuCisuVFAKKy5CSSBcLW0gIiBpbnQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byB1c2UuIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZQordHJhZGUgb2ZmIGJldHdlZW4gZW5jb2Rpbmcgc3BlZWQgYW5kIHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhbmQgcXVhbGl0eS4KK1Bvc3NpYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gNi4gRGVmYXVsdCB2YWx1ZSBpcyA0LgorV2hlbiBoaWdoZXIgdmFsdWVzIGFyZSB1c2VkLCB0aGUgZW5jb2RlciB3aWxsIHNwZW5kIG1vcmUgdGltZSBpbnNwZWN0aW5nCithZGRpdGlvbmFsIGVuY29kaW5nIHBvc3NpYmlsaXRpZXMgYW5kIGRlY2lkZSBvbiB0aGUgcXVhbGl0eSBnYWluLgorTG93ZXIgdmFsdWUgY2FuIHJlc3VsdCBpbiBmYXN0ZXIgcHJvY2Vzc2luZyB0aW1lIGF0IHRoZSBleHBlbnNlIG9mCitsYXJnZXIgZmlsZSBzaXplIGFuZCBsb3dlciBjb21wcmVzc2lvbiBxdWFsaXR5LgorLlRQCisuQkkgXC1yZXNpemUgIiB3aWR0aCBoZWlnaHQKK1Jlc2l6ZSB0aGUgc291cmNlIHRvIGEgcmVjdGFuZ2xlIHdpdGggc2l6ZSBcZkJ3aWR0aFxmUCB4IFxmQmhlaWdodFxmUC4KK0lmIGVpdGhlciAoYnV0IG5vdCBib3RoKSBvZiB0aGUgXGZCd2lkdGhcZlAgb3IgXGZCaGVpZ2h0XGZQIHBhcmFtZXRlcnMgaXMgMCwKK3RoZSB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgcHJlc2VydmluZyB0aGUgYXNwZWN0XC1yYXRpby4KKy5UUAorLkJJIFwtY3JvcCAiIHhfcG9zaXRpb24geV9wb3NpdGlvbiB3aWR0aCBoZWlnaHQKK0Nyb3AgdGhlIHNvdXJjZSB0byBhIHJlY3RhbmdsZSB3aXRoIHRvcFwtbGVmdCBjb3JuZXIgYXQgY29vcmRpbmF0ZXMKKyhcZkJ4X3Bvc2l0aW9uXGZQLCBcZkJ5X3Bvc2l0aW9uXGZQKSBhbmQgc2l6ZSBcZkJ3aWR0aFxmUCB4IFxmQmhlaWdodFxmUC4KK1RoaXMgY3JvcHBpbmcgYXJlYSBtdXN0IGJlIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNvdXJjZSByZWN0YW5nbGUuCisuVFAKKy5CIFwtbXQKK1VzZSBtdWx0aVwtdGhyZWFkaW5nIGZvciBlbmNvZGluZywgaWYgcG9zc2libGUuCisuVFAKKy5CIFwtbG93X21lbW9yeQorUmVkdWNlIG1lbW9yeSB1c2FnZSBvZiBsb3NzeSBlbmNvZGluZyBieSBzYXZpbmcgZm91ciB0aW1lcyB0aGUgY29tcHJlc3NlZAorc2l6ZSAodHlwaWNhbGx5KS4gVGhpcyB3aWxsIG1ha2UgdGhlIGVuY29kaW5nIHNsb3dlciBhbmQgdGhlIG91dHB1dCBzbGlnaHRseQorZGlmZmVyZW50IGluIHNpemUgYW5kIGRpc3RvcnRpb24uIFRoaXMgZmxhZyBpcyBvbmx5IGVmZmVjdGl2ZSBmb3IgbWV0aG9kcworMyBhbmQgdXAsIGFuZCBpcyBvZmYgYnkgZGVmYXVsdC4gTm90ZSB0aGF0IGxlYXZpbmcgdGhpcyBmbGFnIG9mZiB3aWxsIGhhdmUKK3NvbWUgc2lkZSBlZmZlY3RzIG9uIHRoZSBiaXRzdHJlYW06IGl0IGZvcmNlcyBjZXJ0YWluIGJpdHN0cmVhbSBmZWF0dXJlcworbGlrZSBudW1iZXIgb2YgcGFydGl0aW9ucyAoZm9yY2VkIHRvIDEpLiBOb3RlIHRoYXQgYSBtb3JlIGRldGFpbGVkIHJlcG9ydAorb2YgYml0c3RyZWFtIHNpemUgaXMgcHJpbnRlZCBieSBcZkJjd2VicFxmUCB3aGVuIHVzaW5nIHRoaXMgb3B0aW9uLgorCisuU1MgTE9TU1kgT1BUSU9OUworVGhlc2Ugb3B0aW9ucyBhcmUgb25seSBlZmZlY3RpdmUgd2hlbiBkb2luZyBsb3NzeSBlbmNvZGluZyAodGhlIGRlZmF1bHQsIHdpdGgKK29yIHdpdGhvdXQgYWxwaGEpLgorCisuVFAKKy5CSSBcLXNpemUgIiBpbnQKK1NwZWNpZnkgYSB0YXJnZXQgc2l6ZSAoaW4gYnl0ZXMpIHRvIHRyeSBhbmQgcmVhY2ggZm9yIHRoZSBjb21wcmVzc2VkIG91dHB1dC4KK1RoZSBjb21wcmVzc29yIHdpbGwgbWFrZSBzZXZlcmFsIHBhc3NlcyBvZiBwYXJ0aWFsIGVuY29kaW5nIGluIG9yZGVyIHRvIGdldCBhcworY2xvc2UgYXMgcG9zc2libGUgdG8gdGhpcyB0YXJnZXQuIElmIGJvdGggXGZCXC1zaXplXGZQIGFuZCBcZkJcLXBzbnJcZlAKK2FyZSB1c2VkLCBcZkJcLXNpemVcZlAgdmFsdWUgd2lsbCBwcmV2YWlsLgorLlRQCisuQkkgXC1wc25yICIgZmxvYXQKK1NwZWNpZnkgYSB0YXJnZXQgUFNOUiAoaW4gZEIpIHRvIHRyeSBhbmQgcmVhY2ggZm9yIHRoZSBjb21wcmVzc2VkIG91dHB1dC4KK1RoZSBjb21wcmVzc29yIHdpbGwgbWFrZSBzZXZlcmFsIHBhc3NlcyBvZiBwYXJ0aWFsIGVuY29kaW5nIGluIG9yZGVyIHRvIGdldCBhcworY2xvc2UgYXMgcG9zc2libGUgdG8gdGhpcyB0YXJnZXQuIElmIGJvdGggXGZCXC1zaXplXGZQIGFuZCBcZkJcLXBzbnJcZlAKK2FyZSB1c2VkLCBcZkJcLXNpemVcZlAgdmFsdWUgd2lsbCBwcmV2YWlsLgorLlRQCisuQkkgXC1wYXNzICIgaW50CitTZXQgYSBtYXhpbXVtIG51bWJlciBvZiBwYXNzZXMgdG8gdXNlIGR1cmluZyB0aGUgZGljaG90b215IHVzZWQgYnkKK29wdGlvbnMgXGZCXC1zaXplXGZQIG9yIFxmQlwtcHNuclxmUC4gTWF4aW11bSB2YWx1ZSBpcyAxMCwgZGVmYXVsdCBpcyAxLgorSWYgb3B0aW9ucyBcZkJcLXNpemVcZlAgb3IgXGZCXC1wc25yXGZQIHdlcmUgdXNlZCwgYnV0IFxmQlwtcGFzc1xmUCB3YXNuJ3QKK3NwZWNpZmllZCwgYSBkZWZhdWx0IHZhbHVlIG9mICc2JyBwYXNzZXMgd2lsbCBiZSB1c2VkLgorLlRQCisuQiBcLWFmCitUdXJucyBhdXRvXC1maWx0ZXIgb24uIFRoaXMgYWxnb3JpdGhtIHdpbGwgc3BlbmQgYWRkaXRpb25hbCB0aW1lIG9wdGltaXppbmcKK3RoZSBmaWx0ZXJpbmcgc3RyZW5ndGggdG8gcmVhY2ggYSB3ZWxsXC1iYWxhbmNlZCBxdWFsaXR5LgorLlRQCisuQiBcLWpwZWdfbGlrZQorQ2hhbmdlIHRoZSBpbnRlcm5hbCBwYXJhbWV0ZXIgbWFwcGluZyB0byBiZXR0ZXIgbWF0Y2ggdGhlIGV4cGVjdGVkIHNpemUKK29mIEpQRUcgY29tcHJlc3Npb24uIFRoaXMgZmxhZyB3aWxsIGdlbmVyYWxseSBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIG9mCitzaW1pbGFyIHNpemUgdG8gaXRzIEpQRUcgZXF1aXZhbGVudCAoZm9yIHRoZSBzYW1lIFxmQlwtcVxmUCBzZXR0aW5nKSwgYnV0Cit3aXRoIGxlc3MgdmlzdWFsIGRpc3RvcnRpb24uCisKKy5UUAorQWR2YW5jZWQgb3B0aW9uczoKKworLlRQCisuQkkgXC1mICIgaW50CitTcGVjaWZ5IHRoZSBzdHJlbmd0aCBvZiB0aGUgZGVibG9ja2luZyBmaWx0ZXIsIGJldHdlZW4gMCAobm8gZmlsdGVyaW5nKQorYW5kIDEwMCAobWF4aW11bSBmaWx0ZXJpbmcpLiBBIHZhbHVlIG9mIDAgd2lsbCB0dXJuIG9mZiBhbnkgZmlsdGVyaW5nLgorSGlnaGVyIHZhbHVlIHdpbGwgaW5jcmVhc2UgdGhlIHN0cmVuZ3RoIG9mIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcyBhcHBsaWVkCithZnRlciBkZWNvZGluZyB0aGUgcGljdHVyZS4gVGhlIGhpZ2hlciB0aGUgdmFsdWUgdGhlIHNtb290aGVyIHRoZSBwaWN0dXJlIHdpbGwKK2FwcGVhci4gVHlwaWNhbCB2YWx1ZXMgYXJlIHVzdWFsbHkgaW4gdGhlIHJhbmdlIG9mIDIwIHRvIDUwLgorLlRQCisuQkkgXC1zaGFycG5lc3MgIiBpbnQKK1NwZWNpZnkgdGhlIHNoYXJwbmVzcyBvZiB0aGUgZmlsdGVyaW5nIChpZiB1c2VkKS4KK1JhbmdlIGlzIDAgKHNoYXJwZXN0KSB0byA3IChsZWFzdCBzaGFycCkuIERlZmF1bHQgaXMgMC4KKy5UUAorLkIgXC1zdHJvbmcKK1VzZSBzdHJvbmcgZmlsdGVyaW5nIChpZiBmaWx0ZXJpbmcgaXMgYmVpbmcgdXNlZCB0aGFua3MgdG8gdGhlCitcZkJcLWZcZlAgb3B0aW9uKS4gU3Ryb25nIGZpbHRlcmluZyBpcyBvbiBieSBkZWZhdWx0LgorLlRQCisuQiBcLW5vc3Ryb25nCitEaXNhYmxlIHN0cm9uZyBmaWx0ZXJpbmcgKGlmIGZpbHRlcmluZyBpcyBiZWluZyB1c2VkIHRoYW5rcyB0byB0aGUKK1xmQlwtZlxmUCBvcHRpb24pIGFuZCB1c2Ugc2ltcGxlIGZpbHRlcmluZyBpbnN0ZWFkLgorLlRQCisuQiBcLXNoYXJwX3l1dgorVXNlIG1vcmUgYWNjdXJhdGUgYW5kIHNoYXJwZXIgUkdCLT5ZVVYgY29udmVyc2lvbiBpZiBuZWVkZWQuIE5vdGUgdGhhdCB0aGlzCitwcm9jZXNzIGlzIHNsb3dlciB0aGFuIHRoZSBkZWZhdWx0ICdmYXN0JyBSR0ItPllVViBjb252ZXJzaW9uLgorLlRQCisuQkkgXC1zbnMgIiBpbnQKK1NwZWNpZnkgdGhlIGFtcGxpdHVkZSBvZiB0aGUgc3BhdGlhbCBub2lzZSBzaGFwaW5nLiBTcGF0aWFsIG5vaXNlIHNoYXBpbmcKKyhvciBcZkJzbnNcZlAgZm9yIHNob3J0KSByZWZlcnMgdG8gYSBnZW5lcmFsIGNvbGxlY3Rpb24gb2YgYnVpbHRcLWluIGFsZ29yaXRobXMKK3VzZWQgdG8gZGVjaWRlIHdoaWNoIGFyZWEgb2YgdGhlIHBpY3R1cmUgc2hvdWxkIHVzZSByZWxhdGl2ZWx5IGxlc3MgYml0cywKK2FuZCB3aGVyZSBlbHNlIHRvIGJldHRlciB0cmFuc2ZlciB0aGVzZSBiaXRzLiBUaGUgcG9zc2libGUgcmFuZ2UgZ29lcyBmcm9tCiswIChhbGdvcml0aG0gaXMgb2ZmKSB0byAxMDAgKHRoZSBtYXhpbWFsIGVmZmVjdCkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwLgorLlRQCisuQkkgXC1zZWdtZW50cyAiIGludAorQ2hhbmdlIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyB0byB1c2UgZHVyaW5nIHRoZSBzZWdtZW50YXRpb24gb2YgdGhlCitzbnMgYWxnb3JpdGhtLiBTZWdtZW50cyBzaG91bGQgYmUgaW4gcmFuZ2UgMSB0byA0LiBEZWZhdWx0IHZhbHVlIGlzIDQuCitUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGZvciBtZXRob2RzIDMgYW5kIHVwLCB1bmxlc3MgXGZCXC1sb3dfbWVtb3J5XGZQCitpcyB1c2VkLgorLlRQCisuQkkgXC1wYXJ0aXRpb25fbGltaXQgIiBpbnQKK0RlZ3JhZGUgcXVhbGl0eSBieSBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBieSBzb21lIG1hY3JvYmxvY2tzLgorUmFuZ2UgaXMgMCAobm8gZGVncmFkYXRpb24sIHRoZSBkZWZhdWx0KSB0byAxMDAgKGZ1bGwgZGVncmFkYXRpb24pLgorVXNlZnVsIHZhbHVlcyBhcmUgdXN1YWxseSBhcm91bmQgMzBcLTcwIGZvciBtb2RlcmF0ZWx5IGxhcmdlIGltYWdlcy4KK0luIHRoZSBWUDggZm9ybWF0LCB0aGUgc29cLWNhbGxlZCBjb250cm9sIHBhcnRpdGlvbiBoYXMgYSBsaW1pdCBvZiA1MTJrIGFuZAoraXMgdXNlZCB0byBzdG9yZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiB3aGV0aGVyIHRoZSBtYWNyb2Jsb2NrIGlzIHNraXBwZWQsCit3aGljaCBzZWdtZW50IGl0IGJlbG9uZ3MgdG8sIHdoZXRoZXIgaXQgaXMgY29kZWQgYXMgaW50cmEgNHg0IG9yIGludHJhIDE2eDE2Cittb2RlLCBhbmQgZmluYWxseSB0aGUgcHJlZGljdGlvbiBtb2RlcyB0byB1c2UgZm9yIGVhY2ggb2YgdGhlIHN1YlwtYmxvY2tzLgorRm9yIGEgdmVyeSBsYXJnZSBpbWFnZSwgNTEyayBvbmx5IGxlYXZlcyByb29tIHRvIGZldyBiaXRzIHBlciAxNngxNiBtYWNyb2Jsb2NrLgorVGhlIGFic29sdXRlIG1pbmltdW0gaXMgNCBiaXRzIHBlciBtYWNyb2Jsb2NrLiBTa2lwLCBzZWdtZW50LCBhbmQgbW9kZQoraW5mb3JtYXRpb24gY2FuIHVzZSB1cCBhbG1vc3QgYWxsIHRoZXNlIDQgYml0cyAoYWx0aG91Z2ggdGhlIGNhc2UgaXMgdW5saWtlbHkpLAord2hpY2ggaXMgcHJvYmxlbWF0aWMgZm9yIHZlcnkgbGFyZ2UgaW1hZ2VzLiBUaGUgcGFydGl0aW9uX2xpbWl0IGZhY3RvciBjb250cm9scworaG93IGZyZXF1ZW50bHkgdGhlIG1vc3QgYml0XC1jb3N0bHkgbW9kZSAoaW50cmEgNHg0KSB3aWxsIGJlIHVzZWQuIFRoaXMgaXMKK3VzZWZ1bCBpbiBjYXNlIHRoZSA1MTJrIGxpbWl0IGlzIHJlYWNoZWQgYW5kIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBpcyBkaXNwbGF5ZWQ6CitcZklFcnJvciBjb2RlOiA2IChQQVJUSVRJT04wX09WRVJGTE9XOiBQYXJ0aXRpb24gIzAgaXMgdG9vIGJpZyB0byBmaXQgNTEyaylcZlAuCitJZiB1c2luZyBcZkJcLXBhcnRpdGlvbl9saW1pdFxmUCBpcyBub3QgZW5vdWdoIHRvIG1lZXQgdGhlIDUxMmsgY29uc3RyYWludCwgb25lCitzaG91bGQgdXNlIGxlc3Mgc2VnbWVudHMgaW4gb3JkZXIgdG8gc2F2ZSBtb3JlIGhlYWRlciBiaXRzIHBlciBtYWNyb2Jsb2NrLgorU2VlIHRoZSBcZkJcLXNlZ21lbnRzXGZQIG9wdGlvbi4KKworLlNTIExPR0dJTkcgT1BUSU9OUworVGhlc2Ugb3B0aW9ucyBjb250cm9sIHRoZSBsZXZlbCBvZiBvdXRwdXQ6CisuVFAKKy5CIFwtdgorUHJpbnQgZXh0cmEgaW5mb3JtYXRpb24gKGVuY29kaW5nIHRpbWUgaW4gcGFydGljdWxhcikuCisuVFAKKy5CIFwtcHJpbnRfcHNucgorQ29tcHV0ZSBhbmQgcmVwb3J0IGF2ZXJhZ2UgUFNOUiAoUGVha1wtU2lnbmFsXC1Ub1wtTm9pc2UgcmF0aW8pLgorLlRQCisuQiBcLXByaW50X3NzaW0KK0NvbXB1dGUgYW5kIHJlcG9ydCBhdmVyYWdlIFNTSU0gKHN0cnVjdHVyYWwgc2ltaWxhcml0eQorbWV0cmljLCBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TU0lNIGZvciBhZGRpdGlvbmFsIGRldGFpbHMpLgorLlRQCisuQiBcLXByaW50X2xzaW0KK0NvbXB1dGUgYW5kIHJlcG9ydCBsb2NhbCBzaW1pbGFyaXR5IG1ldHJpYyAoc3VtIG9mIGxvd2VzdCBlcnJvciBhbW9uZ3N0IHRoZQorY29sbG9jYXRlZCBwaXhlbCBuZWlnaGJvcnMpLgorLlRQCisuQiBcLXByb2dyZXNzCitSZXBvcnQgZW5jb2RpbmcgcHJvZ3Jlc3MgaW4gcGVyY2VudC4KKy5UUAorLkIgXC1xdWlldAorRG8gbm90IHByaW50IGFueXRoaW5nLgorLlRQCisuQiBcLXNob3J0CitPbmx5IHByaW50IGJyaWVmIGluZm9ybWF0aW9uIChvdXRwdXQgZmlsZSBzaXplIGFuZCBQU05SKSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKy5UUAorLkJJIFwtbWFwICIgaW50CitPdXRwdXQgYWRkaXRpb25hbCBBU0NJSVwtbWFwIG9mIGVuY29kaW5nIGluZm9ybWF0aW9uLiBQb3NzaWJsZSBtYXAgdmFsdWVzCityYW5nZSBmcm9tIDEgdG8gNi4gVGhpcyBpcyBvbmx5IG1lYW50IHRvIGhlbHAgZGVidWdnaW5nLgorCisuU1MgQURESVRJT05BTCBPUFRJT05TCitNb3JlIGFkdmFuY2VkIG9wdGlvbnMgYXJlOgorLlRQCisuQkkgXC1zICIgd2lkdGggaGVpZ2h0CitTcGVjaWZ5IHRoYXQgdGhlIGlucHV0IGZpbGUgYWN0dWFsbHkgY29uc2lzdHMgb2YgcmF3IFknQ2JDciBzYW1wbGVzIGZvbGxvd2luZwordGhlIElUVVwtUiBCVC42MDEgcmVjb21tZW5kYXRpb24sIGluIDQ6MjowIGxpbmVhciBmb3JtYXQuCitUaGUgbHVtYSBwbGFuZSBoYXMgc2l6ZSBcZkJ3aWR0aFxmUCB4IFxmQmhlaWdodFxmUC4KKy5UUAorLkJJIFwtcHJlICIgaW50CitTcGVjaWZ5IHNvbWUgcHJlcHJvY2Vzc2luZyBzdGVwcy4gVXNpbmcgYSB2YWx1ZSBvZiAnMicgd2lsbCB0cmlnZ2VyCitxdWFsaXR5XC1kZXBlbmRlbnQgcHNldWRvXC1yYW5kb20gZGl0aGVyaW5nIGR1cmluZyBSR0JBXC0+WVVWQSBjb252ZXJzaW9uCisobG9zc3kgY29tcHJlc3Npb24gb25seSkuCisuVFAKKy5CSSBcLWFscGhhX2ZpbHRlciAiIHN0cmluZworU3BlY2lmeSB0aGUgcHJlZGljdGl2ZSBmaWx0ZXJpbmcgbWV0aG9kIGZvciB0aGUgYWxwaGEgcGxhbmUuIE9uZSBvZiAnbm9uZScsCitcJidmYXN0JyBvciAnYmVzdCcsIGluIGluY3JlYXNpbmcgY29tcGxleGl0eSBhbmQgc2xvd25lc3Mgb3JkZXIuIERlZmF1bHQgaXMKK1wmJ2Zhc3QnLiBJbnRlcm5hbGx5LCBhbHBoYSBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGZvdXIgcG9zc2libGUKK3ByZWRpY3Rpb25zIChub25lLCBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgZ3JhZGllbnQpLiBUaGUgJ2Jlc3QnIG1vZGUgd2lsbCB0cnkKK2VhY2ggbW9kZSBpbiB0dXJuIGFuZCBwaWNrIHRoZSBvbmUgd2hpY2ggZ2l2ZXMgdGhlIHNtYWxsZXIgc2l6ZS4gVGhlICdmYXN0JworbW9kZSB3aWxsIGp1c3QgdHJ5IHRvIGZvcm0gYW4gYSBwcmlvcmkgZ3Vlc3Mgd2l0aG91dCB0ZXN0aW5nIGFsbCBtb2Rlcy4KKy5UUAorLkJJIFwtYWxwaGFfbWV0aG9kICIgaW50CitTcGVjaWZ5IHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgYWxwaGEgY29tcHJlc3Npb246IDAgb3IgMS4gQWxnb3JpdGhtIDAgZGVub3Rlcworbm8gY29tcHJlc3Npb24sIDEgdXNlcyBXZWJQIGxvc3NsZXNzIGZvcm1hdCBmb3IgY29tcHJlc3Npb24uIFRoZSBkZWZhdWx0IGlzIDEuCisuVFAKKy5CIFwtZXhhY3QKK1ByZXNlcnZlIFJHQiB2YWx1ZXMgaW4gdHJhbnNwYXJlbnQgYXJlYS4gVGhlIGRlZmF1bHQgaXMgb2ZmLCB0byBoZWxwCitjb21wcmVzc2liaWxpdHkuCisuVFAKKy5CSSBcLWJsZW5kX2FscGhhICIgaW50CitUaGlzIG9wdGlvbiBibGVuZHMgdGhlIGFscGhhIGNoYW5uZWwgKGlmIHByZXNlbnQpIHdpdGggdGhlIHNvdXJjZSB1c2luZyB0aGUKK2JhY2tncm91bmQgY29sb3Igc3BlY2lmaWVkIGluIGhleGFkZWNpbWFsIGFzIDB4cnJnZ2JiLiBUaGUgYWxwaGEgY2hhbm5lbCBpcworYWZ0ZXJ3YXJkIHJlc2V0IHRvIHRoZSBvcGFxdWUgdmFsdWUgMjU1LgorLlRQCisuQiBcLW5vYWxwaGEKK1VzaW5nIHRoaXMgb3B0aW9uIHdpbGwgZGlzY2FyZCB0aGUgYWxwaGEgY2hhbm5lbC4KKy5UUAorLkJJIFwtaGludCAiIHN0cmluZworU3BlY2lmeSB0aGUgaGludCBhYm91dCBpbnB1dCBpbWFnZSB0eXBlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorXGZCcGhvdG9cZlAsIFxmQnBpY3R1cmVcZlAgb3IgXGZCZ3JhcGhcZlAuCisuVFAKKy5CSSBcLW1ldGFkYXRhICIgc3RyaW5nCitBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvIGNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZgorcHJlc2VudC4KK1ZhbGlkIHZhbHVlczogXGZCYWxsXGZQLCBcZkJub25lXGZQLCBcZkJleGlmXGZQLCBcZkJpY2NcZlAsIFxmQnhtcFxmUC4KK1RoZSBkZWZhdWx0IGlzIFxmQm5vbmVcZlAuCisKK05vdGU6IGVhY2ggaW5wdXQgZm9ybWF0IG1heSBub3Qgc3VwcG9ydCBhbGwgY29tYmluYXRpb25zLgorLlRQCisuQiBcLW5vYXNtCitEaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zLgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nXC1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKK2N3ZWJwIFwtcSA1MCAtbG9zc2xlc3MgcGljdHVyZS5wbmcgXC1vIHBpY3R1cmVfbG9zc2xlc3Mud2VicAorLmJyCitjd2VicCBcLXEgNzAgcGljdHVyZV93aXRoX2FscGhhLnBuZyBcLW8gcGljdHVyZV93aXRoX2FscGhhLndlYnAKKy5icgorY3dlYnAgXC1zbnMgNzAgXC1mIDUwIFwtc2l6ZSA2MDAwMCBwaWN0dXJlLnBuZyBcLW8gcGljdHVyZS53ZWJwCisuYnIKK2N3ZWJwIFwtbyBwaWN0dXJlLndlYnAgXC1cLSBcLVwtXC1waWN0dXJlLnBuZworCisuU0ggQVVUSE9SUworXGZCY3dlYnBcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgUGFzY2FsIE1hc3NpbWlubyA8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIGR3ZWJwICgxKSwKKy5CUiBnaWYyd2VicCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2R3ZWJwLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZHdlYnAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI2MGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2R3ZWJwLjEKQEAgLTAsMCArMSwxNDkgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIERXRUJQIDEgIkp1bmUgMjMsIDIwMTYiCisuU0ggTkFNRQorZHdlYnAgXC0gZGVjb21wcmVzcyBhIFdlYlAgZmlsZSB0byBhbiBpbWFnZSBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGR3ZWJwCisuUkkgWyBvcHRpb25zIF0gIiBpbnB1dF9maWxlLndlYnAKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIGR3ZWJwCitjb21tYW5kLgorLlBQCitcZkJkd2VicFxmUCBkZWNvbXByZXNzZXMgV2ViUCBmaWxlcyBpbnRvIFBORywgUEFNLCBQUE0gb3IgUEdNIGltYWdlcy4KKy5TSCBPUFRJT05TCitUaGUgYmFzaWMgb3B0aW9ucyBhcmU6CisuVFAKKy5CIFwtaAorUHJpbnQgdXNhZ2Ugc3VtbWFyeS4KKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgKGFzIG1ham9yLm1pbm9yLnJldmlzaW9uKSBhbmQgZXhpdC4KKy5UUAorLkJJIFwtbyAiIHN0cmluZworU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgKGFzIFBORyBmb3JtYXQgYnkgZGVmYXVsdCkuCitVc2luZyAiLSIgYXMgb3V0cHV0IG5hbWUgd2lsbCBkaXJlY3Qgb3V0cHV0IHRvICdzdGRvdXQnLgorLlRQCisuQkkgXC1cLSAiIHN0cmluZworRXhwbGljaXRseSBzcGVjaWZ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgdGhlIGlucHV0CitmaWxlIHN0YXJ0cyB3aXRoIGFuICdcLScgZm9yIGluc3RhbmNlLiBUaGlzIG9wdGlvbiBtdXN0IGFwcGVhciBcZkJsYXN0XGZQLgorQW55IG90aGVyIG9wdGlvbnMgYWZ0ZXJ3YXJkIHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlIGlucHV0IGZpbGUgaXMgIlwtIiwKK3RoZSBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIFxmSXN0ZGluXGZQIGluc3RlYWQgb2YgYSBmaWxlLgorLlRQCisuQiBcLWJtcAorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIHVuY29tcHJlc3NlZCBCTVAuCisuVFAKKy5CIFwtdGlmZgorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIHVuY29tcHJlc3NlZCBUSUZGLgorLlRQCisuQiBcLXBhbQorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIFBBTSAocmV0YWlucyBhbHBoYSkuCisuVFAKKy5CIFwtcHBtCitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gUFBNIChkaXNjYXJkcyBhbHBoYSkuCisuVFAKKy5CIFwtcGdtCitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gUEdNLiBUaGUgb3V0cHV0IGNvbnNpc3RzIG9mIGx1bWEvY2hyb21hCitzYW1wbGVzIGluc3RlYWQgb2YgUkdCLCB1c2luZyB0aGUgSU1DNCBsYXlvdXQuIFRoaXMgb3B0aW9uIGlzIG1haW5seQorZm9yIHZlcmlmaWNhdGlvbiBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLgorLlRQCisuQiBcLXl1dgorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIHJhdyBZVVYuIFRoZSBvdXRwdXQgY29uc2lzdHMgb2YKK2x1bWEvY2hyb21hLVUvY2hyb21hLVYgc2FtcGxlcyBpbnN0ZWFkIG9mIFJHQiwgc2F2ZWQgc2VxdWVudGlhbGx5IGFzCitpbmRpdmlkdWFsIHBsYW5lcy4gVGhpcyBvcHRpb24gaXMgbWFpbmx5IGZvciB2ZXJpZmljYXRpb24gYW5kIGRlYnVnZ2luZworcHVycG9zZXMuCisuVFAKKy5CIFwtbm9mYW5jeQorRG9uJ3QgdXNlIHRoZSBmYW5jeSB1cHNjYWxlciBmb3IgWVVWNDIwLiBUaGlzIG1heSBsZWFkIHRvIGphZ2d5CitlZGdlcyAoZXNwZWNpYWxseSB0aGUgcmVkIG9uZXMpLCBidXQgc2hvdWxkIGJlIGZhc3Rlci4KKy5UUAorLkIgXC1ub2ZpbHRlcgorRG9uJ3QgdXNlIHRoZSBpbi1sb29wIGZpbHRlcmluZyBwcm9jZXNzIGV2ZW4gaWYgaXQgaXMgcmVxdWlyZWQgYnkKK3RoZSBiaXRzdHJlYW0uIFRoaXMgbWF5IHByb2R1Y2UgdmlzaWJsZSBibG9ja3Mgb24gdGhlIG5vbi1jb21wbGlhbnQgb3V0cHV0LAorYnV0IGl0IHdpbGwgbWFrZSB0aGUgZGVjb2RpbmcgZmFzdGVyLgorLlRQCisuQkkgXC1kaXRoZXIgIiBzdHJlbmd0aAorU3BlY2lmeSBhIGRpdGhlcmluZyBcZkJzdHJlbmd0aFxmUCBiZXR3ZWVuIDAgYW5kIDEwMC4gRGl0aGVyaW5nIGlzIGEKK3Bvc3QtcHJvY2Vzc2luZyBlZmZlY3QgYXBwbGllZCB0byBjaHJvbWEgY29tcG9uZW50cyBpbiBsb3NzeSBjb21wcmVzc2lvbi4KK0l0IGhlbHBzIGJ5IHNtb290aGluZyBncmFkaWVudHMgYW5kIGF2b2lkaW5nIGJhbmRpbmcgYXJ0aWZhY3RzLgorLlRQCisuQkkgXC1hbHBoYV9kaXRoZXIKK0lmIHRoZSBjb21wcmVzc2VkIGZpbGUgY29udGFpbnMgYSB0cmFuc3BhcmVuY3kgcGxhbmUgdGhhdCB3YXMgcXVhbnRpemVkCitkdXJpbmcgY29tcHJlc3Npb24sIHRoaXMgZmxhZyB3aWxsIGFsbG93IGRpdGhlcmluZyB0aGUgcmVjb25zdHJ1Y3RlZCBwbGFuZQoraW4gb3JkZXIgdG8gZ2VuZXJhdGUgc21vb3RoZXIgdHJhbnNwYXJlbmN5IGdyYWRpZW50cy4KKy5UUAorLkIgXC1ub2RpdGhlcgorRGlzYWJsZSBhbGwgZGl0aGVyaW5nIChkZWZhdWx0KS4KKy5UUAorLkIgXC1tdAorVXNlIG11bHRpLXRocmVhZGluZyBmb3IgZGVjb2RpbmcsIGlmIHBvc3NpYmxlLgorLlRQCisuQkkgXC1jcm9wICIgeF9wb3NpdGlvbiB5X3Bvc2l0aW9uIHdpZHRoIGhlaWdodAorQ3JvcCB0aGUgZGVjb2RlZCBwaWN0dXJlIHRvIGEgcmVjdGFuZ2xlIHdpdGggdG9wLWxlZnQgY29ybmVyIGF0IGNvb3JkaW5hdGVzCisoXGZCeF9wb3NpdGlvblxmUCwgXGZCeV9wb3NpdGlvblxmUCkgYW5kIHNpemUgXGZCd2lkdGhcZlAgeCBcZkJoZWlnaHRcZlAuCitUaGlzIGNyb3BwaW5nIGFyZWEgbXVzdCBiZSBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSBzb3VyY2UgcmVjdGFuZ2xlLgorVGhlIHRvcC1sZWZ0IGNvcm5lciB3aWxsIGJlIHNuYXBwZWQgdG8gZXZlbiBjb29yZGluYXRlcyBpZiBuZWVkZWQuCitUaGlzIG9wdGlvbiBpcyBtZWFudCB0byByZWR1Y2UgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIGNyb3BwaW5nIGxhcmdlIGltYWdlcy4KK05vdGU6IHRoZSBjcm9wcGluZyBpcyBhcHBsaWVkIFxmSWJlZm9yZVxmUCBhbnkgc2NhbGluZy4KKy5UUAorLkIgXC1mbGlwCitGbGlwIGRlY29kZWQgaW1hZ2UgdmVydGljYWxseSAoY2FuIGJlIHVzZWZ1bCBmb3IgT3BlbkdMIHRleHR1cmVzIGZvciBpbnN0YW5jZSkuCisuVFAKK1xmQlwtcmVzaXplXGZSLCBcZkJcLXNjYWxlXGZJIHdpZHRoIGhlaWdodFxmUgorUmVzY2FsZSB0aGUgZGVjb2RlZCBwaWN0dXJlIHRvIGRpbWVuc2lvbiBcZkJ3aWR0aFxmUCB4IFxmQmhlaWdodFxmUC4gVGhpcworb3B0aW9uIGlzIG1vc3RseSBpbnRlbmRlZCB0byByZWR1Y2luZyB0aGUgbWVtb3J5IG5lZWRlZCB0byBkZWNvZGUgbGFyZ2UgaW1hZ2VzLAord2hlbiBvbmx5IGEgc21hbGwgdmVyc2lvbiBpcyBuZWVkZWQgKHRodW1ibmFpbCwgcHJldmlldywgZXRjLikuIE5vdGU6IHNjYWxpbmcKK2lzIGFwcGxpZWQgXGZJYWZ0ZXJcZlAgY3JvcHBpbmcuCitJZiBlaXRoZXIgKGJ1dCBub3QgYm90aCkgb2YgdGhlIFxmQndpZHRoXGZQIG9yIFxmQmhlaWdodFxmUCBwYXJhbWV0ZXJzIGlzIDAsCit0aGUgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIHByZXNlcnZpbmcgdGhlIGFzcGVjdC1yYXRpby4KKy5UUAorLkIgXC1xdWlldAorRG8gbm90IHByaW50IGFueXRoaW5nLgorLlRQCisuQiBcLXYKK1ByaW50IGV4dHJhIGluZm9ybWF0aW9uIChkZWNvZGluZyB0aW1lIGluIHBhcnRpY3VsYXIpLgorLlRQCisuQiBcLW5vYXNtCitEaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zLgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUworZHdlYnAgcGljdHVyZS53ZWJwIFwtbyBvdXRwdXQucG5nCisuYnIKK2R3ZWJwIHBpY3R1cmUud2VicCBcLXBwbSBcLW8gb3V0cHV0LnBwbQorLmJyCitkd2VicCBcLW8gb3V0cHV0LnBwbSBcLVwtIFwtXC1cLXBpY3R1cmUud2VicAorLmJyCitjYXQgcGljdHVyZS53ZWJwIHwgZHdlYnAgXC1vIFwtIFwtXC0gXC0gPiBvdXRwdXQucHBtCisKKy5TSCBBVVRIT1JTCitcZkJkd2VicFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBQYXNjYWwgTWFzc2ltaW5vIDxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4sCitmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgY3dlYnAgKDEpLAorLkJSIGdpZjJ3ZWJwICgxKSwKKy5CUiB3ZWJwbXV4ICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCisuU1MgT3V0cHV0IGZpbGUgZm9ybWF0IGRldGFpbHMKK1BBTTogaHR0cDovL25ldHBibS5zb3VyY2Vmb3JnZS5uZXQvZG9jL3BhbS5odG1sCisuYnIKK1BHTTogaHR0cDovL25ldHBibS5zb3VyY2Vmb3JnZS5uZXQvZG9jL3BnbS5odG1sCisuYnIKK1BQTTogaHR0cDovL25ldHBibS5zb3VyY2Vmb3JnZS5uZXQvZG9jL3BwbS5odG1sCisuYnIKK1BORzogaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvcG5nLXNpdGVtYXAuaHRtbCNpbmZvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZ2lmMndlYnAuMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9naWYyd2VicC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGYyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZ2lmMndlYnAuMQpAQCAtMCwwICsxLDE2NCBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggR0lGMldFQlAgMSAiSmFudWFyeSAyNSwgMjAxOCIKKy5TSCBOQU1FCitnaWYyd2VicCBcLSBDb252ZXJ0IGEgR0lGIGltYWdlIHRvIFdlYlAKKy5TSCBTWU5PUFNJUworLkIgZ2lmMndlYnAKKy5SSSBbIG9wdGlvbnMgXSAiIGlucHV0X2ZpbGUuZ2lmIFwtbyBvdXRwdXRfZmlsZS53ZWJwCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiBnaWYyd2VicAorY29tbWFuZC4KKy5QUAorXGZCZ2lmMndlYnBcZlAgY29udmVydHMgYSBHSUYgaW1hZ2UgdG8gYSBXZWJQIGltYWdlLgorLlNIIE9QVElPTlMKK1RoZSBiYXNpYyBvcHRpb25zIGFyZToKKy5UUAorLkJJIFwtbyAiIHN0cmluZworU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IFdlYlAgZmlsZS4gSWYgb21pdHRlZCwgXGZCZ2lmMndlYnBcZlAgd2lsbAorcGVyZm9ybSBjb252ZXJzaW9uIGJ1dCBvbmx5IHJlcG9ydCBzdGF0aXN0aWNzLgorVXNpbmcgIlwtIiBhcyBvdXRwdXQgbmFtZSB3aWxsIGRpcmVjdCBvdXRwdXQgdG8gJ3N0ZG91dCcuCisuVFAKKy5CSSBcLVwtICIgc3RyaW5nCitFeHBsaWNpdGx5IHNwZWNpZnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBpZiB0aGUgaW5wdXQKK2ZpbGUgc3RhcnRzIHdpdGggYW4gJ1wtJyBmb3IgaW5zdGFuY2UuIFRoaXMgb3B0aW9uIG11c3QgYXBwZWFyIFxmQmxhc3RcZlAuCitBbnkgb3RoZXIgb3B0aW9ucyBhZnRlcndhcmQgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGUgaW5wdXQgZmlsZSBpcyAiXC0iLAordGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gXGZJc3RkaW5cZlAgaW5zdGVhZCBvZiBhIGZpbGUuCisuVFAKKy5CIFwtaCwgXC1oZWxwCitVc2FnZSBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgKGFzIG1ham9yLm1pbm9yLnJldmlzaW9uKSBhbmQgZXhpdC4KKy5UUAorLkIgXC1sb3NzeQorRW5jb2RlIHRoZSBpbWFnZSB1c2luZyBsb3NzeSBjb21wcmVzc2lvbi4KKy5UUAorLkIgXC1taXhlZAorTWl4ZWQgY29tcHJlc3Npb24gbW9kZTogb3B0aW1pemUgY29tcHJlc3Npb24gb2YgdGhlIGltYWdlIGJ5IHBpY2tpbmcgZWl0aGVyCitsb3NzeSBvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBmb3IgZWFjaCBmcmFtZSBoZXVyaXN0aWNhbGx5LgorLlRQCisuQkkgXC1xICIgZmxvYXQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGZhY3RvciBmb3IgUkdCIGNoYW5uZWxzIGJldHdlZW4gMCBhbmQgMTAwLiBUaGUgZGVmYXVsdAoraXMgNzUuCisuYnIKK0luIGNhc2Ugb2YgbG9zc2xlc3MgY29tcHJlc3Npb24gKGRlZmF1bHQpLCBhIHNtYWxsIGZhY3RvciBlbmFibGVzIGZhc3RlcgorY29tcHJlc3Npb24gc3BlZWQsIGJ1dCBwcm9kdWNlcyBhIGxhcmdlciBmaWxlLiBNYXhpbXVtIGNvbXByZXNzaW9uIGlzIGFjaGlldmVkCitieSB1c2luZyBhIHZhbHVlIG9mIDEwMC4KKy5icgorSW4gY2FzZSBvZiBsb3NzeSBjb21wcmVzc2lvbiAoc3BlY2lmaWVkIGJ5IHRoZSBcLWxvc3N5IG9wdGlvbiksIGEgc21hbGwgZmFjdG9yCitwcm9kdWNlcyBhIHNtYWxsZXIgZmlsZSB3aXRoIGxvd2VyIHF1YWxpdHkuIEJlc3QgcXVhbGl0eSBpcyBhY2hpZXZlZCBieSB1c2luZyBhCit2YWx1ZSBvZiAxMDAuCisuVFAKKy5CSSBcLW0gIiBpbnQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byB1c2UuIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZQordHJhZGUgb2ZmIGJldHdlZW4gZW5jb2Rpbmcgc3BlZWQgYW5kIHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhbmQgcXVhbGl0eS4KK1Bvc3NpYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gNi4gRGVmYXVsdCB2YWx1ZSBpcyA0LgorV2hlbiBoaWdoZXIgdmFsdWVzIGFyZSB1c2VkLCB0aGUgZW5jb2RlciB3aWxsIHNwZW5kIG1vcmUgdGltZSBpbnNwZWN0aW5nCithZGRpdGlvbmFsIGVuY29kaW5nIHBvc3NpYmlsaXRpZXMgYW5kIGRlY2lkZSBvbiB0aGUgcXVhbGl0eSBnYWluLgorTG93ZXIgdmFsdWUgY2FuIHJlc3VsdCBpcyBmYXN0ZXIgcHJvY2Vzc2luZyB0aW1lIGF0IHRoZSBleHBlbnNlIG9mCitsYXJnZXIgZmlsZSBzaXplIGFuZCBsb3dlciBjb21wcmVzc2lvbiBxdWFsaXR5LgorLlRQCisuQkkgXC1taW5fc2l6ZQorRW5jb2RlIGltYWdlIHRvIGFjaGlldmUgc21hbGxlc3Qgc2l6ZS4gVGhpcyBkaXNhYmxlcyBrZXkgZnJhbWUgaW5zZXJ0aW9uIGFuZAorcGlja3MgdGhlIGRpc3Bvc2UgbWV0aG9kIHJlc3VsdGluZyBpbiBzbWFsbGVzdCBvdXRwdXQgZm9yIGVhY2ggZnJhbWUuIEl0IHVzZXMKK2xvc3NsZXNzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgY29tYmluZWQgd2l0aCBcLXEsIFwtbSwgXC1sb3NzeSBvcgorXC1taXhlZCBvcHRpb25zLgorLlRQCisuQkkgXC1rbWluICIgaW50CisuVFAKKy5CSSBcLWttYXggIiBpbnQKK1NwZWNpZnkgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBrZXkgZnJhbWVzCisoaW5kZXBlbmRlbnRseSBkZWNvZGFibGUgZnJhbWVzKSBpbiB0aGUgb3V0cHV0IGFuaW1hdGlvbi4gVGhlIHRvb2wgd2lsbCBpbnNlcnQKK3NvbWUga2V5IGZyYW1lcyBpbnRvIHRoZSBvdXRwdXQgYW5pbWF0aW9uIGFzIG5lZWRlZCBzbyB0aGF0IHRoaXMgY3JpdGVyaWEgaXMKK3NhdGlzZmllZC4KKy5icgorQSAna21heCcgdmFsdWUgb2YgMCB3aWxsIHR1cm4gb2ZmIGluc2VydGlvbiBvZiBrZXkgZnJhbWVzLiBBICdrbWF4JyB2YWx1ZSBvZiAxCit3aWxsIHJlc3VsdCBpbiBhbGwgZnJhbWVzIGJlaW5nIGtleSBmcmFtZXMuICdrbWluJyB2YWx1ZSBpcyBub3QgdGFrZW4gaW50bworYWNjb3VudCBpbiBib3RoIHRoZXNlIHNwZWNpYWwgY2FzZXMuCitUeXBpY2FsIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIDMgdG8gMzAuIERlZmF1bHQgdmFsdWVzIGFyZSBrbWluID0gOSwKK2ttYXggPSAxNyBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gYW5kIGttaW4gPSAzLCBrbWF4ID0gNSBmb3IgbG9zc3kgY29tcHJlc3Npb24uCisuYnIKK1RoZXNlIHR3byBvcHRpb25zIGFyZSByZWxldmFudCBvbmx5IGZvciBhbmltYXRlZCBpbWFnZXMgd2l0aCBsYXJnZSBudW1iZXIgb2YKK2ZyYW1lcyAoPjUwKS4KKy5icgorV2hlbiBsb3dlciB2YWx1ZXMgYXJlIHVzZWQsIG1vcmUgZnJhbWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGtleSBmcmFtZXMuIFRoaXMKK21heSBsZWFkIHRvIHNtYWxsZXIgbnVtYmVyIG9mIGZyYW1lcyByZXF1aXJlZCB0byBkZWNvZGUgYSBmcmFtZSBvbiBhdmVyYWdlLAordGhlcmVieSBpbXByb3ZpbmcgdGhlIGRlY29kaW5nIHBlcmZvcm1hbmNlLiBCdXQgdGhpcyBtYXkgbGVhZCB0byBzbGlnaHRseSBiaWdnZXIKK2ZpbGUgc2l6ZXMuCitIaWdoZXIgdmFsdWVzIG1heSBsZWFkIHRvIHdvcnNlIGRlY29kaW5nIHBlcmZvcm1hbmNlLCBidXQgc21hbGxlciBmaWxlIHNpemVzLgorLmJyCitTb21lIHJlc3RyaWN0aW9uczoKKy5icgorKGkpIGttaW4gPCBrbWF4LAorLmJyCisoaWkpIGttaW4gPj0ga21heCAvIDIgKyAxIGFuZAorLmJyCisoaWlpKSBrbWF4IC0ga21pbiA8PSAzMC4KKy5icgorSWYgYW55IG9mIHRoZXNlIHJlc3RyaWN0aW9ucyBhcmUgbm90IG1ldCwgdGhleSB3aWxsIGJlIGVuZm9yY2VkIGF1dG9tYXRpY2FsbHkuCisuVFAKKy5CSSBcLW1ldGFkYXRhICIgc3RyaW5nCitBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvIGNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZgorcHJlc2VudC4KK1ZhbGlkIHZhbHVlczogXGZCYWxsXGZQLCBcZkJub25lXGZQLCBcZkJpY2NcZlAsIFxmQnhtcFxmUC4KK1RoZSBkZWZhdWx0IGlzIFxmQnhtcFxmUC4KKy5UUAorLkJJIFwtZiAiIGludAorRm9yIGxvc3N5IGVuY29kaW5nIG9ubHkgKHNwZWNpZmllZCBieSB0aGUgXC1sb3NzeSBvcHRpb24pLiBTcGVjaWZ5IHRoZSBzdHJlbmd0aAorb2YgdGhlIGRlYmxvY2tpbmcgZmlsdGVyLCBiZXR3ZWVuIDAgKG5vIGZpbHRlcmluZykgYW5kIDEwMCAobWF4aW11bSBmaWx0ZXJpbmcpLgorQSB2YWx1ZSBvZiAwIHdpbGwgdHVybiBvZmYgYW55IGZpbHRlcmluZy4gSGlnaGVyIHZhbHVlIHdpbGwgaW5jcmVhc2UgdGhlCitzdHJlbmd0aCBvZiB0aGUgZmlsdGVyaW5nIHByb2Nlc3MgYXBwbGllZCBhZnRlciBkZWNvZGluZyB0aGUgcGljdHVyZS4gVGhlIGhpZ2hlcgordGhlIHZhbHVlIHRoZSBzbW9vdGhlciB0aGUgcGljdHVyZSB3aWxsIGFwcGVhci4gVHlwaWNhbCB2YWx1ZXMgYXJlIHVzdWFsbHkgaW4KK3RoZSByYW5nZSBvZiAyMCB0byA1MC4KKy5UUAorLkIgXC1tdAorVXNlIG11bHRpLXRocmVhZGluZyBmb3IgZW5jb2RpbmcsIGlmIHBvc3NpYmxlLgorLlRQCisuQiBcLWxvb3BfY29tcGF0aWJpbGl0eQorSWYgZW5hYmxlZCwgaGFuZGxlIHRoZSBsb29wIGluZm9ybWF0aW9uIGluIGEgY29tcGF0aWJsZSBmYXNoaW9uIGZvciBDaHJvbWUKK3ZlcnNpb24gcHJpb3IgdG8gTTYyIChpbmNsdXNpdmUpIGFuZCBGaXJlZm94LgorLlRQCisuQiBcLXYKK1ByaW50IGV4dHJhIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLXF1aWV0CitEbyBub3QgcHJpbnQgYW55dGhpbmcuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmctcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCitnaWYyd2VicCBwaWN0dXJlLmdpZiBcLW8gcGljdHVyZS53ZWJwCisuYnIKK2dpZjJ3ZWJwIFwtcSA3MCBwaWN0dXJlLmdpZiBcLW8gcGljdHVyZS53ZWJwCisuYnIKK2dpZjJ3ZWJwIFwtbG9zc3kgXC1tIDMgcGljdHVyZS5naWYgXC1vIHBpY3R1cmVfbG9zc3kud2VicAorLmJyCitnaWYyd2VicCBcLWxvc3N5IFwtZiA1MCBwaWN0dXJlLmdpZiBcLW8gcGljdHVyZS53ZWJwCisuYnIKK2dpZjJ3ZWJwIFwtcSA3MCBcLW8gcGljdHVyZS53ZWJwIFwtXC0gXC1cLVwtcGljdHVyZS5naWYKKy5icgorY2F0IHBpY3R1cmUuZ2lmIHwgZ2lmMndlYnAgXC1vIFwtIFwtXC0gXC0gPiBvdXRwdXQud2VicAorCisuU0ggQVVUSE9SUworXGZCZ2lmMndlYnBcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgVXJ2YW5nIEpvc2hpIDx1cnZhbmdAZ29vZ2xlLmNvbT4sIGZvciB0aGUKK0RlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgY3dlYnAgKDEpLAorLkJSIGR3ZWJwICgxKSwKKy5CUiB3ZWJwbXV4ICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vaW1nMndlYnAuMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9pbWcyd2VicC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWQ5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vaW1nMndlYnAuMQpAQCAtMCwwICsxLDEwNSBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggSU1HMldFQlAgMSAiQXByaWwgMywgMjAxOCIKKy5TSCBOQU1FCitpbWcyd2VicCBcLSBjcmVhdGUgYW5pbWF0ZWQgV2ViUCBmaWxlIGZyb20gYSBzZXF1ZW5jZSBvZiBpbnB1dCBpbWFnZXMuCisuU0ggU1lOT1BTSVMKKy5CIGltZzJ3ZWJwCitbZmlsZV9sZXZlbF9vcHRpb25zXSBbZmlsZXNdIFtwZXJfZnJhbWVfb3B0aW9ucy4uLl0KKy5icgorLkIgaW1nMndlYnAgYXJndW1lbnRfZmlsZV9uYW1lCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiBpbWcyd2VicAorY29tbWFuZC4KKy5QUAorXGZCaW1nMndlYnBcZlAgY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIGltYWdlcyB1c2luZyB0aGUgYW5pbWF0ZWQgV2ViUCBmb3JtYXQuCitJbnB1dCBpbWFnZXMgY2FuIGVpdGhlciBiZSBQTkcsIEpQRUcsIFRJRkYgb3IgV2ViUC4KK0lmIGEgc2luZ2xlIGZpbGUgbmFtZSAobm90IHN0YXJ0aW5nIHdpdGggdGhlIGNoYXJhY3RlciAnXC0nKSBpcyBzdXBwbGllZCBhcwordGhlIGFyZ3VtZW50LCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFyZSBhY3R1YWxseSB0b2tlbml6ZWQgZnJvbSB0aGlzIGZpbGUuCitUaGlzIGFsbG93cyBmb3IgZWFzeSBzY3JpcHRpbmcgb3IgdXNpbmcgbGFyZ2UgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKy5TSCBGSUxFLUxFVkVMIE9QVElPTlMKK1RoZSBmaWxlLWxldmVsIG9wdGlvbnMgYXJlIGFwcGxpZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tcHJlc3Npb24gcHJvY2VzcywKK2JlZm9yZSB0aGUgaW5wdXQgZnJhbWVzIGFyZSByZWFkLgorLlRQCisuQkkgXC1vICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgV2ViUCBmaWxlLgorLlRQCisuQkkgXC1taW5fc2l6ZQorRW5jb2RlIGltYWdlcyB0byBhY2hpZXZlIHNtYWxsZXN0IHNpemUuIFRoaXMgZGlzYWJsZXMga2V5IGZyYW1lIGluc2VydGlvbiBhbmQKK3BpY2tzIHRoZSBwYXJhbWV0ZXJzIHJlc3VsdGluZyBpbiBzbWFsbGVzdCBvdXRwdXQgZm9yIGVhY2ggZnJhbWUuIEl0IHVzZXMKK2xvc3NsZXNzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgY29tYmluZWQgd2l0aCBcLXEsIFwtbSwgXC1sb3NzeSBvcgorXC1taXhlZCBvcHRpb25zLgorLlRQCisuQkkgXC1rbWluICIgaW50CisuVFAKKy5CSSBcLWttYXggIiBpbnQKK1NwZWNpZnkgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBrZXkgZnJhbWVzCisoaW5kZXBlbmRlbnRseSBkZWNvZGFibGUgZnJhbWVzKSBpbiB0aGUgb3V0cHV0IGFuaW1hdGlvbi4gVGhlIHRvb2wgd2lsbCBpbnNlcnQKK3NvbWUga2V5IGZyYW1lcyBpbnRvIHRoZSBvdXRwdXQgYW5pbWF0aW9uIGFzIG5lZWRlZCBzbyB0aGF0IHRoaXMgY3JpdGVyaWEgaXMKK3NhdGlzZmllZC4KKy5icgorLkIgXC1taXhlZAorTWl4ZWQgY29tcHJlc3Npb24gbW9kZTogb3B0aW1pemUgY29tcHJlc3Npb24gb2YgdGhlIGltYWdlIGJ5IHBpY2tpbmcgZWl0aGVyCitsb3NzeSBvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBmb3IgZWFjaCBmcmFtZSBoZXVyaXN0aWNhbGx5LiBUaGlzIGdsb2JhbAorb3B0aW9uIGRpc2FibGVzIHRoZSBsb2NhbCBvcHRpb24gXGZCLWxvc3N5XGZQIGFuZCBcZkItbG9zc2xlc3NcZlAgLgorLlRQCisuQkkgXC1sb29wICIgaW50CitTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCBsb29wLiBVc2luZyAnMCcKK21lYW5zICdsb29wIGluZGVmaW5pdGVseScuCisuVFAKKy5CSSBcLXYKK0JlIG1vcmUgdmVyYm9zZS4KKy5UUAorLkIgXC1oLCBcLWhlbHAKK0Egc2hvcnQgdXNhZ2Ugc3VtbWFyeS4KKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSByZWxldmFudCBsaWJyYXJpZXMgdXNlZC4KKworLlNIIFBFUi1GUkFNRSBPUFRJT05TCitUaGUgcGVyLWZyYW1lIG9wdGlvbnMgYXJlIGFwcGxpZWQgZm9yIHRoZSBpbWFnZXMgZm9sbG93aW5nIGFzIGFyZ3VtZW50cyBpbiB0aGUKK2NvbW1hbmQgbGluZS4gVGhleSBjYW4gYmUgbW9kaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBwcmVjZWRpbmcgZWFjaCBwYXJ0aWN1bGFyCitpbnB1dCBpbWFnZS4KKy5UUAorLkJJIFwtZCAiIGludAorU3BlY2lmeSB0aGUgaW1hZ2UgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorLlRQCisuQiBcLWxvc3NsZXNzLCBcLWxvc3N5CitDb21wcmVzcyB0aGUgbmV4dCBpbWFnZShzKSB1c2luZyBsb3NzbGVzcyBvciBsb3NzeSBjb21wcmVzc2lvbiBtb2RlLiBUaGUKK2RlZmF1bHQgbW9kZSBpcyBsb3NzbGVzcy4KKy5UUAorLkJJIFwtcSAiIGZsb2F0CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBmYWN0b3IgYmV0d2VlbiAwIGFuZCAxMDAuIFRoZSBkZWZhdWx0IGlzIDc1LgorLlRQCisuQkkgXC1tICIgaW50CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gdXNlLiBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUKK3RyYWRlIG9mZiBiZXR3ZWVuIGVuY29kaW5nIHNwZWVkIGFuZCB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgYW5kIHF1YWxpdHkuCitQb3NzaWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDYuIERlZmF1bHQgdmFsdWUgaXMgNC4KKworLlNIIEVYQU1QTEUKK2ltZzJ3ZWJwIC1sb29wIDIgaW4wLnBuZyAtbG9zc3kgaW4xLmpwZyAtZCA4MCBpbjIudGlmZiAtbyBvdXQud2VicAorLmJyCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmdcLXBhdGNoZXMvCisKKy5TSCBBVVRIT1JTCitcZkJpbWcyd2VicFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBQYXNjYWwgTWFzc2ltaW5vIDxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4sCitmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgd2VicG11eCAoMSksCisuQlIgZ2lmMndlYnAgKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi92d2VicC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3Z3ZWJwLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi92d2VicC4xCkBAIC0wLDAgKzEsOTQgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIFZXRUJQIDEgIk5vdmVtYmVyIDI1LCAyMDE2IgorLlNIIE5BTUUKK3Z3ZWJwIFwtIGRlY29tcHJlc3MgYSBXZWJQIGZpbGUgYW5kIGRpc3BsYXkgaXQgaW4gYSB3aW5kb3cKKy5TSCBTWU5PUFNJUworLkIgdndlYnAKKy5SSSBbIG9wdGlvbnMgXSAiIGlucHV0X2ZpbGUud2VicAorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgdndlYnAKK2NvbW1hbmQuCisuUFAKK1xmQnZ3ZWJwXGZQIGRlY29tcHJlc3NlcyBhIFdlYlAgZmlsZSBhbmQgZGlzcGxheXMgaXQgaW4gYSB3aW5kb3cgdXNpbmcgT3BlbkdMLgorLlNIIE9QVElPTlMKKy5UUAorLkIgXC1oCitQcmludCB1c2FnZSBzdW1tYXJ5LgorLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgorLlRQCisuQiBcLW5vaWNjCitEb24ndCB1c2UgdGhlIElDQyBwcm9maWxlIGlmIHByZXNlbnQuCisuVFAKKy5CIFwtbm9mYW5jeQorRG9uJ3QgdXNlIHRoZSBmYW5jeSBZVVY0MjAgdXBzY2FsZXIuCisuVFAKKy5CIFwtbm9maWx0ZXIKK0Rpc2FibGUgaW4tbG9vcCBmaWx0ZXJpbmcuCisuVFAKKy5CSSBcLWRpdGhlciAiIHN0cmVuZ3RoCitTcGVjaWZ5IGEgZGl0aGVyaW5nIFxmQnN0cmVuZ3RoXGZQIGJldHdlZW4gMCBhbmQgMTAwLiBEaXRoZXJpbmcgaXMgYQorcG9zdC1wcm9jZXNzaW5nIGVmZmVjdCBhcHBsaWVkIHRvIGNocm9tYSBjb21wb25lbnRzIGluIGxvc3N5IGNvbXByZXNzaW9uLgorSXQgaGVscHMgYnkgc21vb3RoaW5nIGdyYWRpZW50cyBhbmQgYXZvaWRpbmcgYmFuZGluZyBhcnRpZmFjdHMuIERlZmF1bHQ6IDUwLgorLlRQCisuQkkgXC1ub2FscGhhZGl0aGVyCitCeSBkZWZhdWx0LCBxdWFudGl6ZWQgdHJhbnNwYXJlbmN5IHBsYW5lcyBhcmUgZGl0aGVyZWQgZHVyaW5nIGRlY29tcHJlc3Npb24sCit0byBzbW9vdGggdGhlIGdyYWRpZW50cy4gVGhpcyBmbGFnIHdpbGwgcHJldmVudCB0aGlzIGRpdGhlcmluZy4KKy5UUAorLkIgXC1tdAorVXNlIG11bHRpLXRocmVhZGluZyBmb3IgZGVjb2RpbmcsIGlmIHBvc3NpYmxlLgorLlRQCisuQiBcLWluZm8KK0Rpc3BsYXkgaW1hZ2UgaW5mb3JtYXRpb24gb24gdG9wIG9mIHRoZSBkZWNvZGVkIGltYWdlLgorLlRQCisuQkkgXC1cLSAiIHN0cmluZworRXhwbGljaXRseSBzcGVjaWZ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgdGhlIGlucHV0CitmaWxlIHN0YXJ0cyB3aXRoIGFuICdcLScgZm9yIGluc3RhbmNlLiBUaGlzIG9wdGlvbiBtdXN0IGFwcGVhciBcZkJsYXN0XGZQLgorQW55IG90aGVyIG9wdGlvbnMgYWZ0ZXJ3YXJkIHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlIGlucHV0IGZpbGUgaXMgIlwtIiwKK3RoZSBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIFxmSXN0ZGluXGZQIGluc3RlYWQgb2YgYSBmaWxlLgorLlRQCisKKy5TSCBLRVlCT0FSRCBTSE9SVENVVFMKKy5UUAorLkIgJ2MnCitUb2dnbGUgdXNlIG9mIGNvbG9yIHByb2ZpbGUuCisuVFAKKy5CICdpJworT3ZlcmxheSBmaWxlIGluZm9ybWF0aW9uLgorLlRQCisuQiAnZCcKK0Rpc2FibGUgYmxlbmRpbmcgYW5kIGRpc3Bvc2FsIHByb2Nlc3MsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisuVFAKKy5CICdxJyAvICdRJyAvIEVTQworUXVpdC4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZy1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKK3Z3ZWJwIHBpY3R1cmUud2VicAorLmJyCit2d2VicCBwaWN0dXJlLndlYnAgLW10IC1kaXRoZXIgMAorLmJyCit2d2VicCBcLVwtIFwtXC1cLXBpY3R1cmUud2VicAorCisuU0ggQVVUSE9SUworXGZCdndlYnBcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIGR3ZWJwICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicGluZm8uMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwaW5mby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMmJhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicGluZm8uMQpAQCAtMCwwICsxLDgwIEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBXRUJQSU5GTyAxICJOb3ZlbWJlciAyNCwgMjAxNyIKKy5TSCBOQU1FCit3ZWJwaW5mbyBcLSBwcmludCBvdXQgdGhlIGNodW5rIGxldmVsIHN0cnVjdHVyZSBvZiBXZWJQIGZpbGVzCithbG9uZyB3aXRoIGJhc2ljIGludGVncml0eSBjaGVja3MuCisuU0ggU1lOT1BTSVMKKy5CIHdlYnBpbmZvCisuSSBPUFRJT05TCisuSSBJTlBVVAorLmJyCisuQiB3ZWJwaW5mbyBbXC1ofFwtaGVscHxcLUh8XC1sb25naGVscF0KKy5icgorCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgd2VicGluZm8KK2NvbW1hbmQuCisuUFAKK1xmQndlYnBpbmZvXGZQIGNhbiBiZSB1c2VkIHRvIHByaW50IG91dCB0aGUgY2h1bmsgbGV2ZWwgc3RydWN0dXJlIGFuZCBiaXRzdHJlYW0KK2hlYWRlciBpbmZvcm1hdGlvbiBvZiBXZWJQIGZpbGVzLiBJdCBjYW4gYWxzbyBjaGVjayBpZiB0aGUgZmlsZXMgYXJlIG9mIHZhbGlkCitXZWJQIGZvcm1hdC4KKworLlNIIE9QVElPTlMKKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgKGFzIG1ham9yLm1pbm9yLnJldmlzaW9uKSBhbmQgZXhpdC4KKy5UUAorLkIgXC1xdWlldAorRG8gbm90IHNob3cgY2h1bmsgcGFyc2luZyBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC1kaWFnCitTaG93IHBhcnNpbmcgZXJyb3IgZGlhZ25vc2lzLgorLlRQCisuQiBcLXN1bW1hcnkKK1Nob3cgY2h1bmsgc3RhdHMgc3VtbWFyeS4KKy5UUAorLkJJIFwtYml0c3RyZWFtX2luZm8KK1BhcnNlIGJpdHN0cmVhbSBoZWFkZXIuCisuVFAKKy5CIFwtaCwgXC1oZWxwCitBIHNob3J0IHVzYWdlIHN1bW1hcnkuCisuVFAKKy5CIFwtSCwgXC1sb25naGVscAorRGV0YWlsZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zLgorCisuU0ggSU5QVVQKK0lucHV0IGZpbGVzIGluIFdlYlAgZm9ybWF0LiBJbnB1dCBmaWxlcyBtdXN0IGNvbWUgbGFzdCwgZm9sbG93aW5nCitvcHRpb25zIChpZiBhbnkpLiBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgaW5wdXQgZmlsZXMuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmdcLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUworLmJyCit3ZWJwaW5mbyBcLWgKKy5icgord2VicGluZm8gXC1kaWFnIFwtc3VtbWFyeSBpbnB1dF9maWxlLndlYnAKKy5icgord2VicGluZm8gXC1iaXRzdHJlYW1faW5mbyBpbnB1dF9maWxlXzEud2VicCBpbnB1dF9maWxlXzIud2VicAorLmJyCit3ZWJwaW5mbyAqLndlYnAKKworLlNIIEFVVEhPUlMKK1xmQndlYnBpbmZvXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IEh1aSBTdSA8aHVpc3VAZ29vZ2xlLmNvbT4sCitmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgd2VicG11eCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBtdXguMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwbXV4LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MWE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwbXV4LjEKQEAgLTAsMCArMSwyNjAgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIFdFQlBNVVggMSAiRGVjZW1iZXIgMSwgMjAxNyIKKy5TSCBOQU1FCit3ZWJwbXV4IFwtIGNyZWF0ZSBhbmltYXRlZCBXZWJQIGZpbGVzIGZyb20gbm9uXC1hbmltYXRlZCBXZWJQIGltYWdlcywgZXh0cmFjdAorZnJhbWVzIGZyb20gYW5pbWF0ZWQgV2ViUCBpbWFnZXMsIGFuZCBtYW5hZ2UgWE1QL0VYSUYgbWV0YWRhdGEgYW5kIElDQyBwcm9maWxlLgorLlNIIFNZTk9QU0lTCisuQiB3ZWJwbXV4IFwtZ2V0CisuSSBHRVRfT1BUSU9OUworLkkgSU5QVVQKKy5CIFwtbworLkkgT1VUUFVUCisuYnIKKy5CIHdlYnBtdXggXC1zZXQKKy5JIFNFVF9PUFRJT05TCisuSSBJTlBVVAorLkIgXC1vCisuSSBPVVRQVVQKKy5icgorLkIgd2VicG11eCBcLXN0cmlwCisuSSBTVFJJUF9PUFRJT05TCisuSSBJTlBVVAorLkIgXC1vCisuSSBPVVRQVVQKKy5icgorLkIgd2VicG11eCBcLWZyYW1lCisuSSBGUkFNRV9PUFRJT05TCisuQiBbIFwtZnJhbWUgLi4uIF0gWyBcLWxvb3AKKy5JIExPT1BfQ09VTlQKKy5CIF0KKy5icgorLlJTIDgKKy5CIFsgXC1iZ2NvbG9yCisuSSBCQUNLR1JPVU5EX0NPTE9SCisuQiBdIFwtbworLkkgT1VUUFVUCisuUkUKKy5icgorLkIgd2VicG11eCBcLWR1cmF0aW9uCisuSSBEVVJBVElPTiBPUFRJT05TCisuQiBbIFwtZHVyYXRpb24gLi4uIF0KKy5JIElOUFVUCisuQiBcLW8KKy5JIE9VVFBVVAorLmJyCisuQiB3ZWJwbXV4IFwtaW5mbworLkkgSU5QVVQKKy5icgorLkIgd2VicG11eCBbXC1ofFwtaGVscF0KKy5icgorLkIgd2VicG11eCBcLXZlcnNpb24KKy5icgorLkIgd2VicG11eCBhcmd1bWVudF9maWxlX25hbWUKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiB3ZWJwbXV4Citjb21tYW5kLgorLlBQCitcZkJ3ZWJwbXV4XGZQIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZS9leHRyYWN0IGZyb20gYW5pbWF0ZWQgV2ViUCBmaWxlcywgYXMgd2VsbCBhcwordG8gYWRkL2V4dHJhY3Qvc3RyaXAgWE1QL0VYSUYgbWV0YWRhdGEgYW5kIElDQyBwcm9maWxlLgorSWYgYSBzaW5nbGUgZmlsZSBuYW1lIChub3Qgc3RhcnRpbmcgd2l0aCB0aGUgY2hhcmFjdGVyICdcLScpIGlzIHN1cHBsaWVkIGFzCit0aGUgYXJndW1lbnQsIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgYXJlIGFjdHVhbGx5IHRva2VuaXplZCBmcm9tIHRoaXMgZmlsZS4KK1RoaXMgYWxsb3dzIGZvciBlYXN5IHNjcmlwdGluZyBvciB1c2luZyBsYXJnZSBudW1iZXIgb2YgYXJndW1lbnRzLgorLlNIIE9QVElPTlMKKy5TUyBHRVRfT1BUSU9OUyAoXC1nZXQpOgorLlRQCisuQiBpY2MKK0dldCBJQ0MgcHJvZmlsZS4KKy5UUAorLkIgZXhpZgorR2V0IEVYSUYgbWV0YWRhdGEuCisuVFAKKy5CIHhtcAorR2V0IFhNUCBtZXRhZGF0YS4KKy5UUAorLkJJIGZyYW1lICIgbgorR2V0IG50aCBmcmFtZSBmcm9tIGFuIGFuaW1hdGVkIGltYWdlLiAobiA9IDAgaGFzIGEgc3BlY2lhbCBtZWFuaW5nOiBsYXN0IGZyYW1lKS4KKworLlNTIFNFVF9PUFRJT05TIChcLXNldCkKKy5UUAorLkJJIGljYyAiIGZpbGUuaWNjCitTZXQgSUNDIHByb2ZpbGUuCisuUAorV2hlcmU6ICdmaWxlLmljYycgY29udGFpbnMgdGhlIElDQyBwcm9maWxlIHRvIGJlIHNldC4KKy5UUAorLkJJIGV4aWYgIiBmaWxlLmV4aWYKK1NldCBFWElGIG1ldGFkYXRhLgorLlAKK1doZXJlOiAnZmlsZS5leGlmJyBjb250YWlucyB0aGUgRVhJRiBtZXRhZGF0YSB0byBiZSBzZXQuCisuVFAKKy5CSSB4bXAgIiBmaWxlLnhtcAorU2V0IFhNUCBtZXRhZGF0YS4KKy5QCitXaGVyZTogJ2ZpbGUueG1wJyBjb250YWlucyB0aGUgWE1QIG1ldGFkYXRhIHRvIGJlIHNldC4KKworLlNTIFNUUklQX09QVElPTlMgKFwtc3RyaXApCisuVFAKKy5CIGljYworU3RyaXAgSUNDIHByb2ZpbGUuCisuVFAKKy5CIGV4aWYKK1N0cmlwIEVYSUYgbWV0YWRhdGEuCisuVFAKKy5CIHhtcAorU3RyaXAgWE1QIG1ldGFkYXRhLgorCisuU1MgRFVSQVRJT05fT1BUSU9OUyAoXC1kdXJhdGlvbikKK0FtZW5kIHRoZSBkdXJhdGlvbiBvZiBhIHNwZWNpZmljIGludGVydmFsIG9mIGZyYW1lcy4gVGhpcyBvcHRpb24gaXMgb25seQorZWZmZWN0aXZlIG9uIGFuaW1hdGVkIFdlYlAgYW5kIGhhcyBubyBlZmZlY3Qgb24gYSBzaW5nbGUtZnJhbWUgZmlsZS4KKy5UUAorLkkgZHVyYXRpb25bLHN0YXJ0WyxlbmRdXQorV2hlcmU6CisuYnIKKy5CIGR1cmF0aW9uCitpcyB0aGUgZHVyYXRpb24gZm9yIHRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKG1hbmRhdG9yeSkuCitNdXN0IGJlIG5vbi1uZWdhdGl2ZS4KKy5icgorLkIgc3RhcnQKK2lzIHRoZSBzdGFydGluZyBmcmFtZSBpbmRleCBvZiB0aGUgaW50ZXJ2YWwgKG9wdGlvbmFsKS4KKy5icgorLkIgZW5kCitpcyB0aGUgZW5kaW5nIGZyYW1lIGluZGV4IChpbmNsdXNpdmUpIG9mIHRoZSBpbnRlcnZhbCAob3B0aW9uYWwpLgorLlRQCitUaGUgdGhyZWUgdHlwaWNhbCB1c2FnZXMgb2YgdGhpcyBvcHRpb24gYXJlOgorLmJyCisuQiAtZHVyYXRpb24gZAorICAgICBzZXQgdGhlIGR1cmF0aW9uIHRvICdkJyBmb3IgdGhlIHdob2xlIGFuaW1hdGlvbi4KKy5icgorLkIgLWR1cmF0aW9uIGQsZgorICAgICBzZXQgdGhlIGR1cmF0aW9uIG9mIGZyYW1lICdmJyB0byAnZCcuCisuYnIKKy5CIC1kdXJhdGlvbiBkLHN0YXJ0LGVuZAorICAgICBzZXQgdGhlIGR1cmF0aW9uIHRvICdkJyBmb3IgdGhlIHdob2xlIFtzdGFydCxlbmRdIGludGVydmFsLgorLlRQCisuUAorTm90ZSB0aGF0IHRoZSBmcmFtZXMgb3V0c2lkZSBvZiB0aGUgW3N0YXJ0LCBlbmRdIGludGVydmFsIHdpbGwgcmVtYWluIHVudG91Y2hlZC4KK1RoZSAnZW5kJyB2YWx1ZSAnMCcgaGFzIHRoZSBzcGVjaWFsIG1lYW5pbmcgJ2xhc3QgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbicuCisuVFAKKy5JIFJlbWluZGVyOgorZnJhbWUgaW5kZXhpbmcgc3RhcnRzIGF0ICcxJy4KKy5icgorCisuU1MgRlJBTUVfT1BUSU9OUyAoXC1mcmFtZSkKK0NyZWF0ZSBhbiBhbmltYXRlZCBXZWJQIGZpbGUgZnJvbSBtdWx0aXBsZSAobm9uXC1hbmltYXRlZCkgV2ViUCBpbWFnZXMuCisuVFAKKy5JIGZpbGVfaSArZGlbK3hpK3lpWyttaVtiaV1dXQorV2hlcmU6ICdmaWxlX2knIGlzIHRoZSBpJ3RoIGZyYW1lIChXZWJQIGZvcm1hdCksICd4aScsJ3lpJyBzcGVjaWZ5IHRoZSBpbWFnZQorb2Zmc2V0IGZvciB0aGlzIGZyYW1lLCAnZGknIGlzIHRoZSBwYXVzZSBkdXJhdGlvbiBiZWZvcmUgbmV4dCBmcmFtZSwgJ21pJyBpcwordGhlIGRpc3Bvc2UgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgwIGZvciBOT05FIG9yIDEgZm9yIEJBQ0tHUk9VTkQpIGFuZCAnYmknIGlzCit0aGUgYmxlbmRpbmcgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgrYiBmb3IgQkxFTkQgb3IgXC1iIGZvciBOT19CTEVORCkuCitBcmd1bWVudCAnYmknIGNhbiBiZSBvbWl0dGVkIGFuZCB3aWxsIGRlZmF1bHQgdG8gK2IgKEJMRU5EKS4KK0Fsc28sICdtaScgY2FuIGJlIG9taXR0ZWQgaWYgJ2JpJyBpcyBvbWl0dGVkIGFuZCB3aWxsIGRlZmF1bHQgdG8gMCAoTk9ORSkuCitGaW5hbGx5LCBpZiAnbWknIGFuZCAnYmknIGFyZSBvbWl0dGVkIHRoZW4gJ3hpJyBhbmQgJ3lpJyBjYW4gYmUgb21pdHRlZCBhbmQgd2lsbAorZGVmYXVsdCB0byArMCswLgorLlRQCisuQkkgXC1sb29wICIgbgorTG9vcCB0aGUgZnJhbWVzIG4gbnVtYmVyIG9mIHRpbWVzLiAwIGluZGljYXRlcyB0aGUgZnJhbWVzIHNob3VsZCBsb29wIGZvcmV2ZXIuCitWYWxpZCByYW5nZSBpcyAwIHRvIDY1NTM1IFtEZWZhdWx0OiAwIChpbmZpbml0ZSldLgorLlRQCisuQkkgXC1iZ2NvbG9yICIgQSxSLEcsQgorQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLgorLmJyCit3aGVyZTogJ0EnLCAnUicsICdHJyBhbmQgJ0InIGFyZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAyNTUgc3BlY2lmeWluZyB0aGUKK0FscGhhLCBSZWQsIEdyZWVuIGFuZCBCbHVlIGNvbXBvbmVudCB2YWx1ZXMgcmVzcGVjdGl2ZWx5CitbRGVmYXVsdDogMjU1LDI1NSwyNTUsMjU1XS4KKworLlNTIElOUFVUCisuVFAKK0lucHV0IGZpbGUgaW4gV2ViUCBmb3JtYXQuCisKKy5TUyBPVVRQVVQgKFwtbykKKy5UUAorT3V0cHV0IGZpbGUgaW4gV2ViUCBmb3JtYXQuCisKKy5TUyBOb3RlOgorLlRQCitUaGUgbmF0dXJlIG9mIEVYSUYsIFhNUCBhbmQgSUNDIGRhdGEgaXMgbm90IGNoZWNrZWQgYW5kIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmdcLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUworLlAKK0FkZCBJQ0MgcHJvZmlsZToKKy5icgord2VicG11eCBcLXNldCBpY2MgaW1hZ2VfcHJvZmlsZS5pY2MgaW4ud2VicCBcLW8gaWNjX2NvbnRhaW5lci53ZWJwCisuUAorRXh0cmFjdCBJQ0MgcHJvZmlsZToKKy5icgord2VicG11eCBcLWdldCBpY2MgaWNjX2NvbnRhaW5lci53ZWJwIFwtbyBpbWFnZV9wcm9maWxlLmljYworLlAKK1N0cmlwIElDQyBwcm9maWxlOgorLmJyCit3ZWJwbXV4IFwtc3RyaXAgaWNjIGljY19jb250YWluZXIud2VicCBcLW8gd2l0aG91dF9pY2Mud2VicAorLlAKK0FkZCBYTVAgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1zZXQgeG1wIGltYWdlX21ldGFkYXRhLnhtcCBpbi53ZWJwIFwtbyB4bXBfY29udGFpbmVyLndlYnAKKy5QCitFeHRyYWN0IFhNUCBtZXRhZGF0YToKKy5icgord2VicG11eCBcLWdldCB4bXAgeG1wX2NvbnRhaW5lci53ZWJwIFwtbyBpbWFnZV9tZXRhZGF0YS54bXAKKy5QCitTdHJpcCBYTVAgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1zdHJpcCB4bXAgeG1wX2NvbnRhaW5lci53ZWJwIFwtbyB3aXRob3V0X3htcC53ZWJwCisuUAorQWRkIEVYSUYgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1zZXQgZXhpZiBpbWFnZV9tZXRhZGF0YS5leGlmIGluLndlYnAgXC1vIGV4aWZfY29udGFpbmVyLndlYnAKKy5QCitFeHRyYWN0IEVYSUYgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1nZXQgZXhpZiBleGlmX2NvbnRhaW5lci53ZWJwIFwtbyBpbWFnZV9tZXRhZGF0YS5leGlmCisuUAorU3RyaXAgRVhJRiBtZXRhZGF0YToKKy5icgord2VicG11eCBcLXN0cmlwIGV4aWYgZXhpZl9jb250YWluZXIud2VicCBcLW8gd2l0aG91dF9leGlmLndlYnAKKy5QCitDcmVhdGUgYW4gYW5pbWF0ZWQgV2ViUCBmaWxlIGZyb20gMyAobm9uXC1hbmltYXRlZCkgV2ViUCBpbWFnZXM6CisuYnIKK3dlYnBtdXggXC1mcmFtZSAxLndlYnAgKzEwMCBcLWZyYW1lIDIud2VicCArMTAwKzUwKzUwCisuYnIKKy5SUyA4CitcLWZyYW1lIDMud2VicCArMTAwKzUwKzUwKzErYiBcLWxvb3AgMTAgXC1iZ2NvbG9yIDI1NSwyNTUsMjU1LDI1NQorLmJyCitcLW8gYW5pbV9jb250YWluZXIud2VicAorLlJFCisuUAorR2V0IHRoZSAybmQgZnJhbWUgZnJvbSBhbiBhbmltYXRlZCBXZWJQIGZpbGU6CisuYnIKK3dlYnBtdXggXC1nZXQgZnJhbWUgMiBhbmltX2NvbnRhaW5lci53ZWJwIFwtbyBmcmFtZV8yLndlYnAKKy5QCitVc2luZyBcLWdldC9cLXNldC9cLXN0cmlwIHdpdGggaW5wdXQgZmlsZSBuYW1lIHN0YXJ0aW5nIHdpdGggJ1wtJzoKKy5icgord2VicG11eCBcLXNldCBpY2MgaW1hZ2VfcHJvZmlsZS5pY2MgXC1vIGljY19jb250YWluZXIud2VicCBcLVwtIFwtXC1cLWluLndlYnAKKy5icgord2VicG11eCBcLWdldCBpY2MgXC1vIGltYWdlX3Byb2ZpbGUuaWNjIFwtXC0gXC1cLVwtaWNjX2NvbnRhaW5lci53ZWJwCisuYnIKK3dlYnBtdXggXC1zdHJpcCBpY2MgXC1vIHdpdGhvdXRfaWNjLndlYnAgXC1cLSBcLVwtXC1pY2NfY29udGFpbmVyLndlYnAKKworLlNIIEFVVEhPUlMKK1xmQndlYnBtdXhcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgVmlrYXMgQXJvcmEgPHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIGN3ZWJwICgxKSwKKy5CUiBkd2VicCAoMSksCisuQlIgZ2lmMndlYnAgKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNmYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTUgQEAKKyMgVGhlIG11eCBhbmQgZGVtdXggbGlicmFyaWVzIGRlcGVuZCBvbiBsaWJ3ZWJwLCB0aHVzIHRoZSAnLicgdG8gZm9yY2UKKyMgdGhlIGJ1aWxkIG9yZGVyIHNvIGl0J3MgYXZhaWxhYmxlIHRvIHRoZW0uCitTVUJESVJTID0gZGVjIGVuYyBkc3AgdXRpbHMgLgoraWYgV0FOVF9NVVgKKyAgU1VCRElSUyArPSBtdXgKK2VuZGlmCitpZiBXQU5UX0RFTVVYCisgIFNVQkRJUlMgKz0gZGVtdXgKK2VuZGlmCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYndlYnAubGEKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbGliX0xUTElCUkFSSUVTICs9IGxpYndlYnBkZWNvZGVyLmxhCitlbmRpZgorCitjb21tb25fSEVBREVSUyA9Citjb21tb25fSEVBREVSUyArPSB3ZWJwL2RlY29kZS5oCitjb21tb25fSEVBREVSUyArPSB3ZWJwL3R5cGVzLmgKK2NvbW1vbmRpciA9ICQoaW5jbHVkZWRpcikvd2VicAorCitsaWJ3ZWJwX2xhX1NPVVJDRVMgPQorbGlid2VicGluY2x1ZGVfSEVBREVSUyA9CitsaWJ3ZWJwaW5jbHVkZV9IRUFERVJTICs9IHdlYnAvZW5jb2RlLmgKKworbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicF9sYV9MSUJBREQgPQorbGlid2VicF9sYV9MSUJBREQgKz0gZGVjL2xpYndlYnBkZWNvZGUubGEKK2xpYndlYnBfbGFfTElCQUREICs9IGRzcC9saWJ3ZWJwZHNwLmxhCitsaWJ3ZWJwX2xhX0xJQkFERCArPSBlbmMvbGlid2VicGVuY29kZS5sYQorbGlid2VicF9sYV9MSUJBREQgKz0gdXRpbHMvbGlid2VicHV0aWxzLmxhCisKKyMgVXNlICctbm8tdW5kZWZpbmVkJyB0byBkZWNsYXJlIHRoYXQgbGlid2VicCBkb2VzIG5vdCBkZXBlbmQgb24gYW55IGxpYnJhcmllcworIyBvdGhlciB0aGFuIHRoZSBvbmVzIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpLmUuLCBhZnRlciBsaW5raW5nLCBpdCB3aWxsCisjIG5vdCBoYXZlIHVucmVzb2x2ZWQgc3ltYm9scy4gU29tZSBwbGF0Zm9ybXMgKFdpbmRvd3MgYW1vbmcgdGhlbSkgcmVxdWlyZSBhbGwKKyMgc3ltYm9scyBpbiBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIHJlc29sdmVkIGF0IGxpYnJhcnkgY3JlYXRpb24uCitsaWJ3ZWJwX2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC12ZXJzaW9uLWluZm8gNzoyOjAKK2xpYndlYnBpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCitwa2djb25maWdfREFUQSA9IGxpYndlYnAucGMKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbGlid2VicGRlY29kZXJfbGFfU09VUkNFUyA9CisKKyAgbGlid2VicGRlY29kZXJfbGFfTElCQUREID0KKyAgbGlid2VicGRlY29kZXJfbGFfTElCQUREICs9IGRlYy9saWJ3ZWJwZGVjb2RlLmxhCisgIGxpYndlYnBkZWNvZGVyX2xhX0xJQkFERCArPSBkc3AvbGlid2VicGRzcGRlY29kZS5sYQorICBsaWJ3ZWJwZGVjb2Rlcl9sYV9MSUJBREQgKz0gdXRpbHMvbGlid2VicHV0aWxzZGVjb2RlLmxhCisKKyAgbGlid2VicGRlY29kZXJfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLXZlcnNpb24taW5mbyAzOjI6MAorICBwa2djb25maWdfREFUQSArPSBsaWJ3ZWJwZGVjb2Rlci5wYworZW5kaWYKKworJHtwa2djb25maWdfREFUQX06ICR7dG9wX2J1aWxkZGlyfS9jb25maWcuc3RhdHVzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM2Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYndlYnBkZWNvZGUubGEKKworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTID0KK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBhbHBoYV9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGFscGhhaV9kZWMuaAorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGJ1ZmZlcl9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGNvbW1vbl9kZWMuaAorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHZwOF9kZWMuaAorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGZyYW1lX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gaWRlY19kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGlvX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gcXVhbnRfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB0cmVlX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdnA4X2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdnA4aV9kZWMuaAorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHZwOGxfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB2cDhsaV9kZWMuaAorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHdlYnBfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB3ZWJwaV9kZWMuaAorCitsaWJ3ZWJwZGVjb2RlaW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBkZWNvZGVpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9kZWNvZGUuaAorbGlid2VicGRlY29kZWluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL3R5cGVzLmgKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCisKK2xpYndlYnBkZWNvZGVfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQorbGlid2VicGRlY29kZWluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNmM4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhX2RlYy5jCkBAIC0wLDAgKzEsMjM4IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEtcGxhbmUgZGVjb21wcmVzc2lvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL2RlYy9hbHBoYWlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFMUEhEZWNvZGVyIG9iamVjdC4KKworLy8gQWxsb2NhdGVzIGEgbmV3IGFscGhhIGRlY29kZXIgaW5zdGFuY2UuCitzdGF0aWMgQUxQSERlY29kZXIqIEFMUEhOZXcodm9pZCkgeworICBBTFBIRGVjb2RlciogY29uc3QgZGVjID0gKEFMUEhEZWNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmRlYykpOworICByZXR1cm4gZGVjOworfQorCisvLyBDbGVhcnMgYW5kIGRlYWxsb2NhdGVzIGFuIGFscGhhIGRlY29kZXIgaW5zdGFuY2UuCitzdGF0aWMgdm9pZCBBTFBIRGVsZXRlKEFMUEhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgVlA4TERlbGV0ZShkZWMtPnZwOGxfZGVjXyk7CisgICAgZGVjLT52cDhsX2RlY18gPSBOVUxMOworICAgIFdlYlBTYWZlRnJlZShkZWMpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGluZy4KKworLy8gSW5pdGlhbGl6ZSBhbHBoYSBkZWNvZGluZyBieSBwYXJzaW5nIHRoZSBhbHBoYSBoZWFkZXIgYW5kIGRlY29kaW5nIHRoZSBpbWFnZQorLy8gaGVhZGVyIGZvciBhbHBoYSBkYXRhIHN0b3JlZCB1c2luZyBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciBpbiBhbHBoYSBoZWFkZXIgKGRhdGEgdG9vIHNob3J0LCBpbnZhbGlkCisvLyBjb21wcmVzc2lvbiBtZXRob2Qgb3IgZmlsdGVyLCBlcnJvciBpbiBsb3NzbGVzcyBoZWFkZXIgZGF0YSBldGMpLgorc3RhdGljIGludCBBTFBISW5pdChBTFBIRGVjb2RlciogY29uc3QgZGVjLCBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBWUDhJbyogY29uc3Qgc3JjX2lvLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQpIHsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGFfZGF0YSA9IGRhdGEgKyBBTFBIQV9IRUFERVJfTEVOOworICBjb25zdCBzaXplX3QgYWxwaGFfZGF0YV9zaXplID0gZGF0YV9zaXplIC0gQUxQSEFfSEVBREVSX0xFTjsKKyAgaW50IHJzcnY7CisgIFZQOElvKiBjb25zdCBpbyA9ICZkZWMtPmlvXzsKKworICBhc3NlcnQoZGF0YSAhPSBOVUxMICYmIG91dHB1dCAhPSBOVUxMICYmIHNyY19pbyAhPSBOVUxMKTsKKworICBWUDhGaWx0ZXJzSW5pdCgpOworICBkZWMtPm91dHB1dF8gPSBvdXRwdXQ7CisgIGRlYy0+d2lkdGhfID0gc3JjX2lvLT53aWR0aDsKKyAgZGVjLT5oZWlnaHRfID0gc3JjX2lvLT5oZWlnaHQ7CisgIGFzc2VydChkZWMtPndpZHRoXyA+IDAgJiYgZGVjLT5oZWlnaHRfID4gMCk7CisKKyAgaWYgKGRhdGFfc2l6ZSA8PSBBTFBIQV9IRUFERVJfTEVOKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkZWMtPm1ldGhvZF8gPSAoZGF0YVswXSA+PiAwKSAmIDB4MDM7CisgIGRlYy0+ZmlsdGVyXyA9IChXRUJQX0ZJTFRFUl9UWVBFKSgoZGF0YVswXSA+PiAyKSAmIDB4MDMpOworICBkZWMtPnByZV9wcm9jZXNzaW5nXyA9IChkYXRhWzBdID4+IDQpICYgMHgwMzsKKyAgcnNydiA9IChkYXRhWzBdID4+IDYpICYgMHgwMzsKKyAgaWYgKGRlYy0+bWV0aG9kXyA8IEFMUEhBX05PX0NPTVBSRVNTSU9OIHx8CisgICAgICBkZWMtPm1ldGhvZF8gPiBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTiB8fAorICAgICAgZGVjLT5maWx0ZXJfID49IFdFQlBfRklMVEVSX0xBU1QgfHwKKyAgICAgIGRlYy0+cHJlX3Byb2Nlc3NpbmdfID4gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUyB8fAorICAgICAgcnNydiAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDb3B5IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycyBmcm9tIHNyY19pbyB0byBpbworICBWUDhJbml0SW8oaW8pOworICBXZWJQSW5pdEN1c3RvbUlvKE5VTEwsIGlvKTsKKyAgaW8tPm9wYXF1ZSA9IGRlYzsKKyAgaW8tPndpZHRoID0gc3JjX2lvLT53aWR0aDsKKyAgaW8tPmhlaWdodCA9IHNyY19pby0+aGVpZ2h0OworCisgIGlvLT51c2VfY3JvcHBpbmcgPSBzcmNfaW8tPnVzZV9jcm9wcGluZzsKKyAgaW8tPmNyb3BfbGVmdCA9IHNyY19pby0+Y3JvcF9sZWZ0OworICBpby0+Y3JvcF9yaWdodCA9IHNyY19pby0+Y3JvcF9yaWdodDsKKyAgaW8tPmNyb3BfdG9wID0gc3JjX2lvLT5jcm9wX3RvcDsKKyAgaW8tPmNyb3BfYm90dG9tID0gc3JjX2lvLT5jcm9wX2JvdHRvbTsKKyAgLy8gTm8gbmVlZCB0byBjb3B5IHRoZSBzY2FsaW5nIHBhcmFtZXRlcnMuCisKKyAgaWYgKGRlYy0+bWV0aG9kXyA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIGNvbnN0IHNpemVfdCBhbHBoYV9kZWNvZGVkX3NpemUgPSBkZWMtPndpZHRoXyAqIGRlYy0+aGVpZ2h0XzsKKyAgICBvayA9IChhbHBoYV9kYXRhX3NpemUgPj0gYWxwaGFfZGVjb2RlZF9zaXplKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoZGVjLT5tZXRob2RfID09IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKTsKKyAgICBvayA9IFZQOExEZWNvZGVBbHBoYUhlYWRlcihkZWMsIGFscGhhX2RhdGEsIGFscGhhX2RhdGFfc2l6ZSk7CisgIH0KKworICByZXR1cm4gb2s7Cit9CisKKy8vIERlY29kZXMsIHVuZmlsdGVycyBhbmQgZGVxdWFudGl6ZXMgKmF0IGxlYXN0KiAnbnVtX3Jvd3MnIHJvd3Mgb2YgYWxwaGEKKy8vIHN0YXJ0aW5nIGZyb20gcm93IG51bWJlciAncm93Jy4gSXQgYXNzdW1lcyB0aGF0IHJvd3MgdXAgdG8gKHJvdyAtIDEpIGhhdmUKKy8vIGFscmVhZHkgYmVlbiBkZWNvZGVkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGJpdHN0cmVhbSBlcnJvci4KK3N0YXRpYyBpbnQgQUxQSERlY29kZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3csIGludCBudW1fcm93cykgeworICBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMgPSBkZWMtPmFscGhfZGVjXzsKKyAgY29uc3QgaW50IHdpZHRoID0gYWxwaF9kZWMtPndpZHRoXzsKKyAgY29uc3QgaW50IGhlaWdodCA9IGFscGhfZGVjLT5pb18uY3JvcF9ib3R0b207CisgIGlmIChhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIGludCB5OworICAgIGNvbnN0IHVpbnQ4X3QqIHByZXZfbGluZSA9IGRlYy0+YWxwaGFfcHJldl9saW5lXzsKKyAgICBjb25zdCB1aW50OF90KiBkZWx0YXMgPSBkZWMtPmFscGhhX2RhdGFfICsgQUxQSEFfSEVBREVSX0xFTiArIHJvdyAqIHdpZHRoOworICAgIHVpbnQ4X3QqIGRzdCA9IGRlYy0+YWxwaGFfcGxhbmVfICsgcm93ICogd2lkdGg7CisgICAgYXNzZXJ0KGRlbHRhcyA8PSAmZGVjLT5hbHBoYV9kYXRhX1tkZWMtPmFscGhhX2RhdGFfc2l6ZV9dKTsKKyAgICBpZiAoYWxwaF9kZWMtPmZpbHRlcl8gIT0gV0VCUF9GSUxURVJfTk9ORSkgeworICAgICAgYXNzZXJ0KFdlYlBVbmZpbHRlcnNbYWxwaF9kZWMtPmZpbHRlcl9dICE9IE5VTEwpOworICAgICAgZm9yICh5ID0gMDsgeSA8IG51bV9yb3dzOyArK3kpIHsKKyAgICAgICAgV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10ocHJldl9saW5lLCBkZWx0YXMsIGRzdCwgd2lkdGgpOworICAgICAgICBwcmV2X2xpbmUgPSBkc3Q7CisgICAgICAgIGRzdCArPSB3aWR0aDsKKyAgICAgICAgZGVsdGFzICs9IHdpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgbnVtX3Jvd3M7ICsreSkgeworICAgICAgICBtZW1jcHkoZHN0LCBkZWx0YXMsIHdpZHRoICogc2l6ZW9mKCpkc3QpKTsKKyAgICAgICAgcHJldl9saW5lID0gZHN0OworICAgICAgICBkc3QgKz0gd2lkdGg7CisgICAgICAgIGRlbHRhcyArPSB3aWR0aDsKKyAgICAgIH0KKyAgICB9CisgICAgZGVjLT5hbHBoYV9wcmV2X2xpbmVfID0gcHJldl9saW5lOworICB9IGVsc2UgeyAgLy8gYWxwaF9kZWMtPm1ldGhvZF8gPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04KKyAgICBhc3NlcnQoYWxwaF9kZWMtPnZwOGxfZGVjXyAhPSBOVUxMKTsKKyAgICBpZiAoIVZQOExEZWNvZGVBbHBoYUltYWdlU3RyZWFtKGFscGhfZGVjLCByb3cgKyBudW1fcm93cykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChyb3cgKyBudW1fcm93cyA+PSBoZWlnaHQpIHsKKyAgICBkZWMtPmlzX2FscGhhX2RlY29kZWRfID0gMTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBBbGxvY2F0ZUFscGhhUGxhbmUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBjb25zdCBWUDhJbyogY29uc3QgaW8pIHsKKyAgY29uc3QgaW50IHN0cmlkZSA9IGlvLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IGlvLT5jcm9wX2JvdHRvbTsKKyAgY29uc3QgdWludDY0X3QgYWxwaGFfc2l6ZSA9ICh1aW50NjRfdClzdHJpZGUgKiBoZWlnaHQ7CisgIGFzc2VydChkZWMtPmFscGhhX3BsYW5lX21lbV8gPT0gTlVMTCk7CisgIGRlYy0+YWxwaGFfcGxhbmVfbWVtXyA9CisgICAgICAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoYWxwaGFfc2l6ZSwgc2l6ZW9mKCpkZWMtPmFscGhhX3BsYW5lXykpOworICBpZiAoZGVjLT5hbHBoYV9wbGFuZV9tZW1fID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkZWMtPmFscGhhX3BsYW5lXyA9IGRlYy0+YWxwaGFfcGxhbmVfbWVtXzsKKyAgZGVjLT5hbHBoYV9wcmV2X2xpbmVfID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUERlYWxsb2NhdGVBbHBoYU1lbW9yeShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgYXNzZXJ0KGRlYyAhPSBOVUxMKTsKKyAgV2ViUFNhZmVGcmVlKGRlYy0+YWxwaGFfcGxhbmVfbWVtXyk7CisgIGRlYy0+YWxwaGFfcGxhbmVfbWVtXyA9IE5VTEw7CisgIGRlYy0+YWxwaGFfcGxhbmVfID0gTlVMTDsKKyAgQUxQSERlbGV0ZShkZWMtPmFscGhfZGVjXyk7CisgIGRlYy0+YWxwaF9kZWNfID0gTlVMTDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnQuCisKK2NvbnN0IHVpbnQ4X3QqIFZQOERlY29tcHJlc3NBbHBoYVJvd3MoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhJbyogY29uc3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cykgeworICBjb25zdCBpbnQgd2lkdGggPSBpby0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBpby0+Y3JvcF9ib3R0b207CisKKyAgYXNzZXJ0KGRlYyAhPSBOVUxMICYmIGlvICE9IE5VTEwpOworCisgIGlmIChyb3cgPCAwIHx8IG51bV9yb3dzIDw9IDAgfHwgcm93ICsgbnVtX3Jvd3MgPiBoZWlnaHQpIHsKKyAgICByZXR1cm4gTlVMTDsgICAgLy8gc2FuaXR5IGNoZWNrLgorICB9CisKKyAgaWYgKCFkZWMtPmlzX2FscGhhX2RlY29kZWRfKSB7CisgICAgaWYgKGRlYy0+YWxwaF9kZWNfID09IE5VTEwpIHsgICAgLy8gSW5pdGlhbGl6ZSBkZWNvZGVyLgorICAgICAgZGVjLT5hbHBoX2RlY18gPSBBTFBITmV3KCk7CisgICAgICBpZiAoZGVjLT5hbHBoX2RlY18gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBpZiAoIUFsbG9jYXRlQWxwaGFQbGFuZShkZWMsIGlvKSkgZ290byBFcnJvcjsKKyAgICAgIGlmICghQUxQSEluaXQoZGVjLT5hbHBoX2RlY18sIGRlYy0+YWxwaGFfZGF0YV8sIGRlYy0+YWxwaGFfZGF0YV9zaXplXywKKyAgICAgICAgICAgICAgICAgICAgaW8sIGRlYy0+YWxwaGFfcGxhbmVfKSkgeworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgLy8gaWYgd2UgYWxsb3dlZCB1c2Ugb2YgYWxwaGEgZGl0aGVyaW5nLCBjaGVjayB3aGV0aGVyIGl0J3MgbmVlZGVkIGF0IGFsbAorICAgICAgaWYgKGRlYy0+YWxwaF9kZWNfLT5wcmVfcHJvY2Vzc2luZ18gIT0gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUykgeworICAgICAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSAwOyAgIC8vIGRpc2FibGUgZGl0aGVyaW5nCisgICAgICB9IGVsc2UgeworICAgICAgICBudW1fcm93cyA9IGhlaWdodCAtIHJvdzsgICAgIC8vIGRlY29kZSBldmVyeXRoaW5nIGluIG9uZSBwYXNzCisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KGRlYy0+YWxwaF9kZWNfICE9IE5VTEwpOworICAgIGFzc2VydChyb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOworICAgIGlmICghQUxQSERlY29kZShkZWMsIHJvdywgbnVtX3Jvd3MpKSBnb3RvIEVycm9yOworCisgICAgaWYgKGRlYy0+aXNfYWxwaGFfZGVjb2RlZF8pIHsgICAvLyBmaW5pc2hlZD8KKyAgICAgIEFMUEhEZWxldGUoZGVjLT5hbHBoX2RlY18pOworICAgICAgZGVjLT5hbHBoX2RlY18gPSBOVUxMOworICAgICAgaWYgKGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA+IDApIHsKKyAgICAgICAgdWludDhfdCogY29uc3QgYWxwaGEgPSBkZWMtPmFscGhhX3BsYW5lXyArIGlvLT5jcm9wX3RvcCAqIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW8tPmNyb3BfbGVmdDsKKyAgICAgICAgaWYgKCFXZWJQRGVxdWFudGl6ZUxldmVscyhhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPmNyb3BfYm90dG9tIC0gaW8tPmNyb3BfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBkZWMtPmFscGhhX2RpdGhlcmluZ18pKSB7CisgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVjb2RlZCByb3cuCisgIHJldHVybiBkZWMtPmFscGhhX3BsYW5lXyArIHJvdyAqIHdpZHRoOworCisgRXJyb3I6CisgIFdlYlBEZWFsbG9jYXRlQWxwaGFNZW1vcnkoZGVjKTsKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhaV9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFpX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmEyODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhaV9kZWMuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEgZGVjb2RlcjogaW50ZXJuYWwgaGVhZGVyLgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0RFQ19BTFBIQUlfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX0FMUEhBSV9ERUNfSF8KKworI2luY2x1ZGUgInNyYy9kZWMvd2VicGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgVlA4TERlY29kZXI7ICAvLyBEZWZpbmVkIGluIGRlYy92cDhsaS5oLgorCit0eXBlZGVmIHN0cnVjdCBBTFBIRGVjb2RlciBBTFBIRGVjb2RlcjsKK3N0cnVjdCBBTFBIRGVjb2RlciB7CisgIGludCB3aWR0aF87CisgIGludCBoZWlnaHRfOworICBpbnQgbWV0aG9kXzsKKyAgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXJfOworICBpbnQgcHJlX3Byb2Nlc3NpbmdfOworICBzdHJ1Y3QgVlA4TERlY29kZXIqIHZwOGxfZGVjXzsKKyAgVlA4SW8gaW9fOworICBpbnQgdXNlXzhiX2RlY29kZV87ICAvLyBBbHRob3VnaCBhbHBoYSBjaGFubmVsIHJlcXVpcmVzIG9ubHkgMSBieXRlIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbCwgc29tZXRpbWVzIFZQOExEZWNvZGVyIG1heSBuZWVkIHRvIGFsbG9jYXRlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgYnl0ZXMgcGVyIHBpeGVsIGludGVybmFsbHkgZHVyaW5nIGRlY29kZS4KKyAgdWludDhfdCogb3V0cHV0XzsKKyAgY29uc3QgdWludDhfdCogcHJldl9saW5lXzsgICAvLyBsYXN0IG91dHB1dCByb3cgKG9yIE5VTEwpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBEZWFsbG9jYXRlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIGRlYy0+YWxwaGFfcGxhbmVfIGRlY29kaW5nCit2b2lkIFdlYlBEZWFsbG9jYXRlQWxwaGFNZW1vcnkoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfREVDX0FMUEhBSV9ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYnVmZmVyX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9idWZmZXJfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllM2QwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYnVmZmVyX2RlYy5jCkBAIC0wLDAgKzEsMzE3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRXZlcnl0aGluZyBhYm91dCBXZWJQRGVjQnVmZmVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvd2VicGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQRGVjQnVmZmVyCisKKy8vIE51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgZm9yIHRoZSBkaWZmZXJlbnQgY29sb3Itc3BhY2VzLgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01vZGVCcHBbTU9ERV9MQVNUXSA9IHsKKyAgMywgNCwgMywgNCwgNCwgMiwgMiwKKyAgNCwgNCwgNCwgMiwgICAgLy8gcHJlLW11bHRpcGxpZWQgbW9kZXMKKyAgMSwgMSB9OworCisvLyBDaGVjayB0aGF0IHdlYnBfY3NwX21vZGUgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgV0VCUF9DU1BfTU9ERS4KKy8vIENvbnZlcnQgdG8gYW4gaW50ZWdlciB0byBoYW5kbGUgYm90aCB0aGUgdW5zaWduZWQvc2lnbmVkIGVudW0gY2FzZXMKKy8vIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGNhc3RpbmcgdG8gcmVtb3ZlIHR5cGUgbGltaXQgd2FybmluZ3MuCitzdGF0aWMgaW50IElzVmFsaWRDb2xvcnNwYWNlKGludCB3ZWJwX2NzcF9tb2RlKSB7CisgIHJldHVybiAod2VicF9jc3BfbW9kZSA+PSBNT0RFX1JHQiAmJiB3ZWJwX2NzcF9tb2RlIDwgTU9ERV9MQVNUKTsKK30KKworLy8gc3RyaWN0bHkgc3BlYWtpbmcsIHRoZSB2ZXJ5IGxhc3QgKG9yIGZpcnN0LCBpZiBmbGlwcGVkKSByb3cKKy8vIGRvZXNuJ3QgcmVxdWlyZSBwYWRkaW5nLgorI2RlZmluZSBNSU5fQlVGRkVSX1NJWkUoV0lEVEgsIEhFSUdIVCwgU1RSSURFKSAgICAgICBcCisgICAgKCh1aW50NjRfdCkoU1RSSURFKSAqICgoSEVJR0hUKSAtIDEpICsgKFdJRFRIKSkKKworc3RhdGljIFZQOFN0YXR1c0NvZGUgQ2hlY2tEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGludCBvayA9IDE7CisgIGNvbnN0IFdFQlBfQ1NQX01PREUgbW9kZSA9IGJ1ZmZlci0+Y29sb3JzcGFjZTsKKyAgY29uc3QgaW50IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICBpZiAoIUlzVmFsaWRDb2xvcnNwYWNlKG1vZGUpKSB7CisgICAgb2sgPSAwOworICB9IGVsc2UgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7ICAgLy8gWVVWIGNoZWNrcworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LllVVkE7CisgICAgY29uc3QgaW50IHV2X3dpZHRoICA9ICh3aWR0aCAgKyAxKSAvIDI7CisgICAgY29uc3QgaW50IHV2X2hlaWdodCA9IChoZWlnaHQgKyAxKSAvIDI7CisgICAgY29uc3QgaW50IHlfc3RyaWRlID0gYWJzKGJ1Zi0+eV9zdHJpZGUpOworICAgIGNvbnN0IGludCB1X3N0cmlkZSA9IGFicyhidWYtPnVfc3RyaWRlKTsKKyAgICBjb25zdCBpbnQgdl9zdHJpZGUgPSBhYnMoYnVmLT52X3N0cmlkZSk7CisgICAgY29uc3QgaW50IGFfc3RyaWRlID0gYWJzKGJ1Zi0+YV9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHlfc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh3aWR0aCwgaGVpZ2h0LCB5X3N0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3QgdV9zaXplID0gTUlOX0JVRkZFUl9TSVpFKHV2X3dpZHRoLCB1dl9oZWlnaHQsIHVfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCB2X3NpemUgPSBNSU5fQlVGRkVSX1NJWkUodXZfd2lkdGgsIHV2X2hlaWdodCwgdl9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IGFfc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh3aWR0aCwgaGVpZ2h0LCBhX3N0cmlkZSk7CisgICAgb2sgJj0gKHlfc2l6ZSA8PSBidWYtPnlfc2l6ZSk7CisgICAgb2sgJj0gKHVfc2l6ZSA8PSBidWYtPnVfc2l6ZSk7CisgICAgb2sgJj0gKHZfc2l6ZSA8PSBidWYtPnZfc2l6ZSk7CisgICAgb2sgJj0gKHlfc3RyaWRlID49IHdpZHRoKTsKKyAgICBvayAmPSAodV9zdHJpZGUgPj0gdXZfd2lkdGgpOworICAgIG9rICY9ICh2X3N0cmlkZSA+PSB1dl93aWR0aCk7CisgICAgb2sgJj0gKGJ1Zi0+eSAhPSBOVUxMKTsKKyAgICBvayAmPSAoYnVmLT51ICE9IE5VTEwpOworICAgIG9rICY9IChidWYtPnYgIT0gTlVMTCk7CisgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7CisgICAgICBvayAmPSAoYV9zdHJpZGUgPj0gd2lkdGgpOworICAgICAgb2sgJj0gKGFfc2l6ZSA8PSBidWYtPmFfc2l6ZSk7CisgICAgICBvayAmPSAoYnVmLT5hICE9IE5VTEwpOworICAgIH0KKyAgfSBlbHNlIHsgICAgLy8gUkdCIGNoZWNrcworICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGFicyhidWYtPnN0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3Qgc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworICAgIG9rICY9IChzaXplIDw9IGJ1Zi0+c2l6ZSk7CisgICAgb2sgJj0gKHN0cmlkZSA+PSB3aWR0aCAqIGtNb2RlQnBwW21vZGVdKTsKKyAgICBvayAmPSAoYnVmLT5yZ2JhICE9IE5VTEwpOworICB9CisgIHJldHVybiBvayA/IFZQOF9TVEFUVVNfT0sgOiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Cit9CisjdW5kZWYgTUlOX0JVRkZFUl9TSVpFCisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIEFsbG9jYXRlQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBjb25zdCBpbnQgdyA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IGludCBoID0gYnVmZmVyLT5oZWlnaHQ7CisgIGNvbnN0IFdFQlBfQ1NQX01PREUgbW9kZSA9IGJ1ZmZlci0+Y29sb3JzcGFjZTsKKworICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCAhSXNWYWxpZENvbG9yc3BhY2UobW9kZSkpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisKKyAgaWYgKGJ1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5IDw9IDAgJiYgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9PSBOVUxMKSB7CisgICAgdWludDhfdCogb3V0cHV0OworICAgIGludCB1dl9zdHJpZGUgPSAwLCBhX3N0cmlkZSA9IDA7CisgICAgdWludDY0X3QgdXZfc2l6ZSA9IDAsIGFfc2l6ZSA9IDAsIHRvdGFsX3NpemU7CisgICAgLy8gV2UgbmVlZCBtZW1vcnkgYW5kIGl0IGhhc24ndCBiZWVuIGFsbG9jYXRlZCB5ZXQuCisgICAgLy8gPT4gaW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyLCBub3cgdGhhdCBkaW1lbnNpb25zIGFyZSBrbm93bi4KKyAgICBpbnQgc3RyaWRlOworICAgIHVpbnQ2NF90IHNpemU7CisKKyAgICBpZiAoKHVpbnQ2NF90KXcgKiBrTW9kZUJwcFttb2RlXSA+PSAoMXVsbCA8PCAzMikpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgfQorICAgIHN0cmlkZSA9IHcgKiBrTW9kZUJwcFttb2RlXTsKKyAgICBzaXplID0gKHVpbnQ2NF90KXN0cmlkZSAqIGg7CisgICAgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7CisgICAgICB1dl9zdHJpZGUgPSAodyArIDEpIC8gMjsKKyAgICAgIHV2X3NpemUgPSAodWludDY0X3QpdXZfc3RyaWRlICogKChoICsgMSkgLyAyKTsKKyAgICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgeworICAgICAgICBhX3N0cmlkZSA9IHc7CisgICAgICAgIGFfc2l6ZSA9ICh1aW50NjRfdClhX3N0cmlkZSAqIGg7CisgICAgICB9CisgICAgfQorICAgIHRvdGFsX3NpemUgPSBzaXplICsgMiAqIHV2X3NpemUgKyBhX3NpemU7CisKKyAgICAvLyBTZWN1cml0eS9zYW5pdHkgY2hlY2tzCisgICAgb3V0cHV0ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqb3V0cHV0KSk7CisgICAgaWYgKG91dHB1dCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIH0KKyAgICBidWZmZXItPnByaXZhdGVfbWVtb3J5ID0gb3V0cHV0OworCisgICAgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7ICAgLy8gWVVWQSBpbml0aWFsaXphdGlvbgorICAgICAgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKKyAgICAgIGJ1Zi0+eSA9IG91dHB1dDsKKyAgICAgIGJ1Zi0+eV9zdHJpZGUgPSBzdHJpZGU7CisgICAgICBidWYtPnlfc2l6ZSA9IChzaXplX3Qpc2l6ZTsKKyAgICAgIGJ1Zi0+dSA9IG91dHB1dCArIHNpemU7CisgICAgICBidWYtPnVfc3RyaWRlID0gdXZfc3RyaWRlOworICAgICAgYnVmLT51X3NpemUgPSAoc2l6ZV90KXV2X3NpemU7CisgICAgICBidWYtPnYgPSBvdXRwdXQgKyBzaXplICsgdXZfc2l6ZTsKKyAgICAgIGJ1Zi0+dl9zdHJpZGUgPSB1dl9zdHJpZGU7CisgICAgICBidWYtPnZfc2l6ZSA9IChzaXplX3QpdXZfc2l6ZTsKKyAgICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgeworICAgICAgICBidWYtPmEgPSBvdXRwdXQgKyBzaXplICsgMiAqIHV2X3NpemU7CisgICAgICB9CisgICAgICBidWYtPmFfc2l6ZSA9IChzaXplX3QpYV9zaXplOworICAgICAgYnVmLT5hX3N0cmlkZSA9IGFfc3RyaWRlOworICAgIH0gZWxzZSB7ICAvLyBSR0JBIGluaXRpYWxpemF0aW9uCisgICAgICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOworICAgICAgYnVmLT5yZ2JhID0gb3V0cHV0OworICAgICAgYnVmLT5zdHJpZGUgPSBzdHJpZGU7CisgICAgICBidWYtPnNpemUgPSAoc2l6ZV90KXNpemU7CisgICAgfQorICB9CisgIHJldHVybiBDaGVja0RlY0J1ZmZlcihidWZmZXIpOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBGbGlwQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIGlmIChXZWJQSXNSR0JNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSkpIHsKKyAgICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOworICAgIGJ1Zi0+cmdiYSArPSAoYnVmZmVyLT5oZWlnaHQgLSAxKSAqIGJ1Zi0+c3RyaWRlOworICAgIGJ1Zi0+c3RyaWRlID0gLWJ1Zi0+c3RyaWRlOworICB9IGVsc2UgeworICAgIFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LllVVkE7CisgICAgY29uc3QgaW50IEggPSBidWZmZXItPmhlaWdodDsKKyAgICBidWYtPnkgKz0gKEggLSAxKSAqIGJ1Zi0+eV9zdHJpZGU7CisgICAgYnVmLT55X3N0cmlkZSA9IC1idWYtPnlfc3RyaWRlOworICAgIGJ1Zi0+dSArPSAoKEggLSAxKSA+PiAxKSAqIGJ1Zi0+dV9zdHJpZGU7CisgICAgYnVmLT51X3N0cmlkZSA9IC1idWYtPnVfc3RyaWRlOworICAgIGJ1Zi0+diArPSAoKEggLSAxKSA+PiAxKSAqIGJ1Zi0+dl9zdHJpZGU7CisgICAgYnVmLT52X3N0cmlkZSA9IC1idWYtPnZfc3RyaWRlOworICAgIGlmIChidWYtPmEgIT0gTlVMTCkgeworICAgICAgYnVmLT5hICs9IChIIC0gMSkgKiBidWYtPmFfc3RyaWRlOworICAgICAgYnVmLT5hX3N0cmlkZSA9IC1idWYtPmFfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworVlA4U3RhdHVzQ29kZSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBpZiAoYnVmZmVyID09IE5VTEwgfHwgd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgeyAgICAvLyBGaXJzdCwgYXBwbHkgb3B0aW9ucyBpZiB0aGVyZSBpcyBhbnkuCisgICAgaWYgKG9wdGlvbnMtPnVzZV9jcm9wcGluZykgeworICAgICAgY29uc3QgaW50IGN3ID0gb3B0aW9ucy0+Y3JvcF93aWR0aDsKKyAgICAgIGNvbnN0IGludCBjaCA9IG9wdGlvbnMtPmNyb3BfaGVpZ2h0OworICAgICAgY29uc3QgaW50IHggPSBvcHRpb25zLT5jcm9wX2xlZnQgJiB+MTsKKyAgICAgIGNvbnN0IGludCB5ID0gb3B0aW9ucy0+Y3JvcF90b3AgJiB+MTsKKyAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCBjdyA8PSAwIHx8IGNoIDw9IDAgfHwKKyAgICAgICAgICB4ICsgY3cgPiB3aWR0aCB8fCB5ICsgY2ggPiBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsgICAvLyBvdXQgb2YgZnJhbWUgYm91bmRhcnkuCisgICAgICB9CisgICAgICB3aWR0aCA9IGN3OworICAgICAgaGVpZ2h0ID0gY2g7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMtPnVzZV9zY2FsaW5nKSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgICAgIGludCBzY2FsZWRfd2lkdGggPSBvcHRpb25zLT5zY2FsZWRfd2lkdGg7CisgICAgICBpbnQgc2NhbGVkX2hlaWdodCA9IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQ7CisgICAgICBpZiAoIVdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnMoCisgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsICZzY2FsZWRfd2lkdGgsICZzY2FsZWRfaGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgICAgfQorICAgICAgd2lkdGggPSBzY2FsZWRfd2lkdGg7CisgICAgICBoZWlnaHQgPSBzY2FsZWRfaGVpZ2h0OworI2Vsc2UKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07ICAgLy8gcmVzY2FsaW5nIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorICAgIH0KKyAgfQorICBidWZmZXItPndpZHRoID0gd2lkdGg7CisgIGJ1ZmZlci0+aGVpZ2h0ID0gaGVpZ2h0OworCisgIC8vIFRoZW4sIGFsbG9jYXRlIGJ1ZmZlciBmb3IgcmVhbC4KKyAgc3RhdHVzID0gQWxsb2NhdGVCdWZmZXIoYnVmZmVyKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworCisgIC8vIFVzZSB0aGUgc3RyaWRlIHRyaWNrIGlmIHZlcnRpY2FsIGZsaXAgaXMgbmVlZGVkLgorICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmZsaXApIHsKKyAgICBzdGF0dXMgPSBXZWJQRmxpcEJ1ZmZlcihidWZmZXIpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdHJ1Y3RvcnMgLyBkZXN0cnVjdG9ycworCitpbnQgV2ViUEluaXREZWNCdWZmZXJJbnRlcm5hbChXZWJQRGVjQnVmZmVyKiBidWZmZXIsIGludCB2ZXJzaW9uKSB7CisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOyAgLy8gdmVyc2lvbiBtaXNtYXRjaAorICB9CisgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZigqYnVmZmVyKSk7CisgIHJldHVybiAxOworfQorCit2b2lkIFdlYlBGcmVlRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlcikgeworICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKyAgICBpZiAoYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkgPD0gMCkgeworICAgICAgV2ViUFNhZmVGcmVlKGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkpOworICAgIH0KKyAgICBidWZmZXItPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKKyAgfQorfQorCit2b2lkIFdlYlBDb3B5RGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KSB7CisgIGlmIChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCkgeworICAgICpkc3QgPSAqc3JjOworICAgIGlmIChzcmMtPnByaXZhdGVfbWVtb3J5ICE9IE5VTEwpIHsKKyAgICAgIGRzdC0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsgICAvLyBkc3QgYnVmZmVyIGRvZXNuJ3Qgb3duIHRoZSBtZW1vcnkuCisgICAgICBkc3QtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworLy8gQ29weSBhbmQgdHJhbnNmZXIgb3duZXJzaGlwIGZyb20gc3JjIHRvIGRzdCAoYmV3YXJlIG9mIHBhcmFtZXRlciBvcmRlciEpCit2b2lkIFdlYlBHcmFiRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KSB7CisgIGlmIChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCkgeworICAgICpkc3QgPSAqc3JjOworICAgIGlmIChzcmMtPnByaXZhdGVfbWVtb3J5ICE9IE5VTEwpIHsKKyAgICAgIHNyYy0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsgICAvLyBzcmMgcmVsaW5xdWlzaGVzIG93bmVyc2hpcAorICAgICAgc3JjLT5wcml2YXRlX21lbW9yeSA9IE5VTEw7CisgICAgfQorICB9Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUENvcHlEZWNCdWZmZXJQaXhlbHMoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0X2J1ZikgeworICBhc3NlcnQoc3JjX2J1ZiAhPSBOVUxMICYmIGRzdF9idWYgIT0gTlVMTCk7CisgIGFzc2VydChzcmNfYnVmLT5jb2xvcnNwYWNlID09IGRzdF9idWYtPmNvbG9yc3BhY2UpOworCisgIGRzdF9idWYtPndpZHRoID0gc3JjX2J1Zi0+d2lkdGg7CisgIGRzdF9idWYtPmhlaWdodCA9IHNyY19idWYtPmhlaWdodDsKKyAgaWYgKENoZWNrRGVjQnVmZmVyKGRzdF9idWYpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIGlmIChXZWJQSXNSR0JNb2RlKHNyY19idWYtPmNvbG9yc3BhY2UpKSB7CisgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IHNyYyA9ICZzcmNfYnVmLT51LlJHQkE7CisgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGRzdCA9ICZkc3RfYnVmLT51LlJHQkE7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnJnYmEsIHNyYy0+c3RyaWRlLCBkc3QtPnJnYmEsIGRzdC0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+d2lkdGggKiBrTW9kZUJwcFtzcmNfYnVmLT5jb2xvcnNwYWNlXSwKKyAgICAgICAgICAgICAgICAgIHNyY19idWYtPmhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IHNyYyA9ICZzcmNfYnVmLT51LllVVkE7CisgICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGRzdCA9ICZkc3RfYnVmLT51LllVVkE7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnksIHNyYy0+eV9zdHJpZGUsIGRzdC0+eSwgZHN0LT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHNyY19idWYtPndpZHRoLCBzcmNfYnVmLT5oZWlnaHQpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT51LCBzcmMtPnVfc3RyaWRlLCBkc3QtPnUsIGRzdC0+dV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAoc3JjX2J1Zi0+d2lkdGggKyAxKSAvIDIsIChzcmNfYnVmLT5oZWlnaHQgKyAxKSAvIDIpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT52LCBzcmMtPnZfc3RyaWRlLCBkc3QtPnYsIGRzdC0+dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAoc3JjX2J1Zi0+d2lkdGggKyAxKSAvIDIsIChzcmNfYnVmLT5oZWlnaHQgKyAxKSAvIDIpOworICAgIGlmIChXZWJQSXNBbHBoYU1vZGUoc3JjX2J1Zi0+Y29sb3JzcGFjZSkpIHsKKyAgICAgIFdlYlBDb3B5UGxhbmUoc3JjLT5hLCBzcmMtPmFfc3RyaWRlLCBkc3QtPmEsIGRzdC0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHNyY19idWYtPndpZHRoLCBzcmNfYnVmLT5oZWlnaHQpOworICAgIH0KKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworaW50IFdlYlBBdm9pZFNsb3dNZW1vcnkoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgeworICBhc3NlcnQob3V0cHV0ICE9IE5VTEwpOworICByZXR1cm4gKG91dHB1dC0+aXNfZXh0ZXJuYWxfbWVtb3J5ID49IDIpICYmCisgICAgICAgICBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShvdXRwdXQtPmNvbG9yc3BhY2UpICYmCisgICAgICAgICAoZmVhdHVyZXMgIT0gTlVMTCAmJiBmZWF0dXJlcy0+aGFzX2FscGhhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvY29tbW9uX2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9jb21tb25fZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5NWYxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvY29tbW9uX2RlYy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBEZWZpbml0aW9ucyBhbmQgbWFjcm9zIGNvbW1vbiB0byBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfREVDX0NPTU1PTl9ERUNfSF8KKyNkZWZpbmUgV0VCUF9ERUNfQ09NTU9OX0RFQ19IXworCisvLyBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCitlbnVtIHsgQl9EQ19QUkVEID0gMCwgICAvLyA0eDQgbW9kZXMKKyAgICAgICBCX1RNX1BSRUQgPSAxLAorICAgICAgIEJfVkVfUFJFRCA9IDIsCisgICAgICAgQl9IRV9QUkVEID0gMywKKyAgICAgICBCX1JEX1BSRUQgPSA0LAorICAgICAgIEJfVlJfUFJFRCA9IDUsCisgICAgICAgQl9MRF9QUkVEID0gNiwKKyAgICAgICBCX1ZMX1BSRUQgPSA3LAorICAgICAgIEJfSERfUFJFRCA9IDgsCisgICAgICAgQl9IVV9QUkVEID0gOSwKKyAgICAgICBOVU1fQk1PREVTID0gQl9IVV9QUkVEICsgMSAtIEJfRENfUFJFRCwgIC8vID0gMTAKKworICAgICAgIC8vIEx1bWExNiBvciBVViBtb2RlcworICAgICAgIERDX1BSRUQgPSBCX0RDX1BSRUQsIFZfUFJFRCA9IEJfVkVfUFJFRCwKKyAgICAgICBIX1BSRUQgPSBCX0hFX1BSRUQsIFRNX1BSRUQgPSBCX1RNX1BSRUQsCisgICAgICAgQl9QUkVEID0gTlVNX0JNT0RFUywgICAvLyByZWZpbmVkIEk0eDQgbW9kZQorICAgICAgIE5VTV9QUkVEX01PREVTID0gNCwKKworICAgICAgIC8vIHNwZWNpYWwgbW9kZXMKKyAgICAgICBCX0RDX1BSRURfTk9UT1AgPSA0LAorICAgICAgIEJfRENfUFJFRF9OT0xFRlQgPSA1LAorICAgICAgIEJfRENfUFJFRF9OT1RPUExFRlQgPSA2LAorICAgICAgIE5VTV9CX0RDX01PREVTID0gNyB9OworCitlbnVtIHsgTUJfRkVBVFVSRV9UUkVFX1BST0JTID0gMywKKyAgICAgICBOVU1fTUJfU0VHTUVOVFMgPSA0LAorICAgICAgIE5VTV9SRUZfTEZfREVMVEFTID0gNCwKKyAgICAgICBOVU1fTU9ERV9MRl9ERUxUQVMgPSA0LCAgICAvLyBJNHg0LCBaRVJPLCAqLCBTUExJVAorICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCisgICAgICAgLy8gUHJvYmFiaWxpdGllcworICAgICAgIE5VTV9UWVBFUyA9IDQsICAgLy8gMDogaTE2LUFDLCAgMTogaTE2LURDLCAgMjpjaHJvbWEtQUMsICAzOmk0LUFDCisgICAgICAgTlVNX0JBTkRTID0gOCwKKyAgICAgICBOVU1fQ1RYID0gMywKKyAgICAgICBOVU1fUFJPQkFTID0gMTEKKyAgICAgfTsKKworI2VuZGlmICAgIC8vIFdFQlBfREVDX0NPTU1PTl9ERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvZnJhbWVfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2ZyYW1lX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWYzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2ZyYW1lX2RlYy5jCkBAIC0wLDAgKzEsODE2IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnJhbWUtcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb24uIE1lbW9yeSBhbGxvY2F0aW9uLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9uLgorCitzdGF0aWMgY29uc3QgdWludDE2X3Qga1NjYW5bMTZdID0geworICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKKyAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCisgIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAorICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUworfTsKKworc3RhdGljIGludCBDaGVja01vZGUoaW50IG1iX3gsIGludCBtYl95LCBpbnQgbW9kZSkgeworICBpZiAobW9kZSA9PSBCX0RDX1BSRUQpIHsKKyAgICBpZiAobWJfeCA9PSAwKSB7CisgICAgICByZXR1cm4gKG1iX3kgPT0gMCkgPyBCX0RDX1BSRURfTk9UT1BMRUZUIDogQl9EQ19QUkVEX05PTEVGVDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIChtYl95ID09IDApID8gQl9EQ19QUkVEX05PVE9QIDogQl9EQ19QUkVEOworICAgIH0KKyAgfQorICByZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHZvaWQgQ29weTMyYih1aW50OF90KiBjb25zdCBkc3QsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYykgeworICBtZW1jcHkoZHN0LCBzcmMsIDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1RyYW5zZm9ybSh1aW50MzJfdCBiaXRzLCBjb25zdCBpbnQxNl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgc3dpdGNoIChiaXRzID4+IDMwKSB7CisgICAgY2FzZSAzOgorICAgICAgVlA4VHJhbnNmb3JtKHNyYywgZHN0LCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIFZQOFRyYW5zZm9ybUFDMyhzcmMsIGRzdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBWUDhUcmFuc2Zvcm1EQyhzcmMsIGRzdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQgRG9VVlRyYW5zZm9ybSh1aW50MzJfdCBiaXRzLCBjb25zdCBpbnQxNl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBpZiAoYml0cyAmIDB4ZmYpIHsgICAgLy8gYW55IG5vbi16ZXJvIGNvZWZmIGF0IGFsbD8KKyAgICBpZiAoYml0cyAmIDB4YWEpIHsgIC8vIGFueSBub24temVybyBBQyBjb2VmZmljaWVudD8KKyAgICAgIFZQOFRyYW5zZm9ybVVWKHNyYywgZHN0KTsgICAvLyBub3RlIHdlIGRvbid0IHVzZSB0aGUgQUMzIHZhcmlhbnQgZm9yIFUvVgorICAgIH0gZWxzZSB7CisgICAgICBWUDhUcmFuc2Zvcm1EQ1VWKHNyYywgZHN0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVjb25zdHJ1Y3RSb3coY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY3R4KSB7CisgIGludCBqOworICBpbnQgbWJfeDsKKyAgY29uc3QgaW50IG1iX3kgPSBjdHgtPm1iX3lfOworICBjb25zdCBpbnQgY2FjaGVfaWQgPSBjdHgtPmlkXzsKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBkZWMtPnl1dl9iXyArIFlfT0ZGOworICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+eXV2X2JfICsgVV9PRkY7CisgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gZGVjLT55dXZfYl8gKyBWX09GRjsKKworICAvLyBJbml0aWFsaXplIGxlZnQtbW9zdCBibG9jay4KKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICB5X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7CisgIH0KKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIHVfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKKyAgICB2X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7CisgIH0KKworICAvLyBJbml0IHRvcC1sZWZ0IHNhbXBsZSBvbiBsZWZ0IGNvbHVtbiB0b28uCisgIGlmIChtYl95ID4gMCkgeworICAgIHlfZHN0Wy0xIC0gQlBTXSA9IHVfZHN0Wy0xIC0gQlBTXSA9IHZfZHN0Wy0xIC0gQlBTXSA9IDEyOTsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbml0IG9uY2UgYXQgYmxvY2sgKDAsMCkuCisgICAgLy8gQWZ0ZXJ3YXJkLCBpdCByZW1haW5zIHZhbGlkIGZvciB0aGUgd2hvbGUgdG9wbW9zdCByb3cuCisgICAgbWVtc2V0KHlfZHN0IC0gQlBTIC0gMSwgMTI3LCAxNiArIDQgKyAxKTsKKyAgICBtZW1zZXQodV9kc3QgLSBCUFMgLSAxLCAxMjcsIDggKyAxKTsKKyAgICBtZW1zZXQodl9kc3QgLSBCUFMgLSAxLCAxMjcsIDggKyAxKTsKKyAgfQorCisgIC8vIFJlY29uc3RydWN0IG9uZSByb3cuCisgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBkZWMtPm1iX3dfOyArK21iX3gpIHsKKyAgICBjb25zdCBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gY3R4LT5tYl9kYXRhXyArIG1iX3g7CisKKyAgICAvLyBSb3RhdGUgaW4gdGhlIGxlZnQgc2FtcGxlcyBmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9jay4gV2UgbW92ZSBmb3VyCisgICAgLy8gcGl4ZWxzIGF0IGEgdGltZSBmb3IgYWxpZ25tZW50IHJlYXNvbiwgYW5kIGJlY2F1c2Ugb2YgaW4tbG9vcCBmaWx0ZXIuCisgICAgaWYgKG1iX3ggPiAwKSB7CisgICAgICBmb3IgKGogPSAtMTsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgQ29weTMyYigmeV9kc3RbaiAqIEJQUyAtIDRdLCAmeV9kc3RbaiAqIEJQUyArIDEyXSk7CisgICAgICB9CisgICAgICBmb3IgKGogPSAtMTsgaiA8IDg7ICsraikgeworICAgICAgICBDb3B5MzJiKCZ1X2RzdFtqICogQlBTIC0gNF0sICZ1X2RzdFtqICogQlBTICsgNF0pOworICAgICAgICBDb3B5MzJiKCZ2X2RzdFtqICogQlBTIC0gNF0sICZ2X2RzdFtqICogQlBTICsgNF0pOworICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAvLyBicmluZyB0b3Agc2FtcGxlcyBpbnRvIHRoZSBjYWNoZQorICAgICAgVlA4VG9wU2FtcGxlcyogY29uc3QgdG9wX3l1diA9IGRlYy0+eXV2X3RfICsgbWJfeDsKKyAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcyA9IGJsb2NrLT5jb2VmZnNfOworICAgICAgdWludDMyX3QgYml0cyA9IGJsb2NrLT5ub25femVyb195XzsKKyAgICAgIGludCBuOworCisgICAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgICAgbWVtY3B5KHlfZHN0IC0gQlBTLCB0b3BfeXV2WzBdLnksIDE2KTsKKyAgICAgICAgbWVtY3B5KHVfZHN0IC0gQlBTLCB0b3BfeXV2WzBdLnUsIDgpOworICAgICAgICBtZW1jcHkodl9kc3QgLSBCUFMsIHRvcF95dXZbMF0udiwgOCk7CisgICAgICB9CisKKyAgICAgIC8vIHByZWRpY3QgYW5kIGFkZCByZXNpZHVhbHMKKyAgICAgIGlmIChibG9jay0+aXNfaTR4NF8pIHsgICAvLyA0eDQKKyAgICAgICAgdWludDMyX3QqIGNvbnN0IHRvcF9yaWdodCA9ICh1aW50MzJfdCopKHlfZHN0IC0gQlBTICsgMTYpOworCisgICAgICAgIGlmIChtYl95ID4gMCkgeworICAgICAgICAgIGlmIChtYl94ID49IGRlYy0+bWJfd18gLSAxKSB7ICAgIC8vIG9uIHJpZ2h0bW9zdCBib3JkZXIKKyAgICAgICAgICAgIG1lbXNldCh0b3BfcmlnaHQsIHRvcF95dXZbMF0ueVsxNV0sIHNpemVvZigqdG9wX3JpZ2h0KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSh0b3BfcmlnaHQsIHRvcF95dXZbMV0ueSwgc2l6ZW9mKCp0b3BfcmlnaHQpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVwbGljYXRlIHRoZSB0b3AtcmlnaHQgcGl4ZWxzIGJlbG93CisgICAgICAgIHRvcF9yaWdodFtCUFNdID0gdG9wX3JpZ2h0WzIgKiBCUFNdID0gdG9wX3JpZ2h0WzMgKiBCUFNdID0gdG9wX3JpZ2h0WzBdOworCisgICAgICAgIC8vIHByZWRpY3QgYW5kIGFkZCByZXNpZHVhbHMgZm9yIGFsbCA0eDQgYmxvY2tzIGluIHR1cm4uCisgICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuLCBiaXRzIDw8PSAyKSB7CisgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0ID0geV9kc3QgKyBrU2NhbltuXTsKKyAgICAgICAgICBWUDhQcmVkTHVtYTRbYmxvY2stPmltb2Rlc19bbl1dKGRzdCk7CisgICAgICAgICAgRG9UcmFuc2Zvcm0oYml0cywgY29lZmZzICsgbiAqIDE2LCBkc3QpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAgICAvLyAxNngxNgorICAgICAgICBjb25zdCBpbnQgcHJlZF9mdW5jID0gQ2hlY2tNb2RlKG1iX3gsIG1iX3ksIGJsb2NrLT5pbW9kZXNfWzBdKTsKKyAgICAgICAgVlA4UHJlZEx1bWExNltwcmVkX2Z1bmNdKHlfZHN0KTsKKyAgICAgICAgaWYgKGJpdHMgIT0gMCkgeworICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuLCBiaXRzIDw8PSAyKSB7CisgICAgICAgICAgICBEb1RyYW5zZm9ybShiaXRzLCBjb2VmZnMgKyBuICogMTYsIHlfZHN0ICsga1NjYW5bbl0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgeworICAgICAgICAvLyBDaHJvbWEKKyAgICAgICAgY29uc3QgdWludDMyX3QgYml0c191diA9IGJsb2NrLT5ub25femVyb191dl87CisgICAgICAgIGNvbnN0IGludCBwcmVkX2Z1bmMgPSBDaGVja01vZGUobWJfeCwgbWJfeSwgYmxvY2stPnV2bW9kZV8pOworICAgICAgICBWUDhQcmVkQ2hyb21hOFtwcmVkX2Z1bmNdKHVfZHN0KTsKKyAgICAgICAgVlA4UHJlZENocm9tYThbcHJlZF9mdW5jXSh2X2RzdCk7CisgICAgICAgIERvVVZUcmFuc2Zvcm0oYml0c191diA+PiAwLCBjb2VmZnMgKyAxNiAqIDE2LCB1X2RzdCk7CisgICAgICAgIERvVVZUcmFuc2Zvcm0oYml0c191diA+PiA4LCBjb2VmZnMgKyAyMCAqIDE2LCB2X2RzdCk7CisgICAgICB9CisKKyAgICAgIC8vIHN0YXNoIGF3YXkgdG9wIHNhbXBsZXMgZm9yIG5leHQgYmxvY2sKKyAgICAgIGlmIChtYl95IDwgZGVjLT5tYl9oXyAtIDEpIHsKKyAgICAgICAgbWVtY3B5KHRvcF95dXZbMF0ueSwgeV9kc3QgKyAxNSAqIEJQUywgMTYpOworICAgICAgICBtZW1jcHkodG9wX3l1dlswXS51LCB1X2RzdCArICA3ICogQlBTLCAgOCk7CisgICAgICAgIG1lbWNweSh0b3BfeXV2WzBdLnYsIHZfZHN0ICsgIDcgKiBCUFMsICA4KTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gVHJhbnNmZXIgcmVjb25zdHJ1Y3RlZCBzYW1wbGVzIGZyb20geXV2X2JfIGNhY2hlIHRvIGZpbmFsIGRlc3RpbmF0aW9uLgorICAgIHsKKyAgICAgIGNvbnN0IGludCB5X29mZnNldCA9IGNhY2hlX2lkICogMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgICAgIGNvbnN0IGludCB1dl9vZmZzZXQgPSBjYWNoZV9pZCAqIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgICAgICB1aW50OF90KiBjb25zdCB5X291dCA9IGRlYy0+Y2FjaGVfeV8gKyBtYl94ICogMTYgKyB5X29mZnNldDsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHVfb3V0ID0gZGVjLT5jYWNoZV91XyArIG1iX3ggKiA4ICsgdXZfb2Zmc2V0OworICAgICAgdWludDhfdCogY29uc3Qgdl9vdXQgPSBkZWMtPmNhY2hlX3ZfICsgbWJfeCAqIDggKyB1dl9vZmZzZXQ7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICBtZW1jcHkoeV9vdXQgKyBqICogZGVjLT5jYWNoZV95X3N0cmlkZV8sIHlfZHN0ICsgaiAqIEJQUywgMTYpOworICAgICAgfQorICAgICAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgICAgICBtZW1jcHkodV9vdXQgKyBqICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1X2RzdCArIGogKiBCUFMsIDgpOworICAgICAgICBtZW1jcHkodl9vdXQgKyBqICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB2X2RzdCArIGogKiBCUFMsIDgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmlsdGVyaW5nCisKKy8vIGtGaWx0ZXJFeHRyYVJvd3NbXSA9IEhvdyBtYW55IGV4dHJhIGxpbmVzIGFyZSBuZWVkZWQgb24gdGhlIE1CIGJvdW5kYXJ5CisvLyBmb3IgY2FjaGluZywgZ2l2ZW4gYSBmaWx0ZXJpbmcgbGV2ZWwuCisvLyBTaW1wbGUgZmlsdGVyOiAgdXAgdG8gMiBsdW1hIHNhbXBsZXMgYXJlIHJlYWQgYW5kIDEgaXMgd3JpdHRlbi4KKy8vIENvbXBsZXggZmlsdGVyOiB1cCB0byA0IGx1bWEgc2FtcGxlcyBhcmUgcmVhZCBhbmQgMyBhcmUgd3JpdHRlbi4gU2FtZSBmb3IKKy8vICAgICAgICAgICAgICAgICBVL1YsIHNvIGl0J3MgOCBzYW1wbGVzIHRvdGFsIChiZWNhdXNlIG9mIHRoZSAyeCB1cHNhbXBsaW5nKS4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtGaWx0ZXJFeHRyYVJvd3NbM10gPSB7IDAsIDIsIDggfTsKKworc3RhdGljIHZvaWQgRG9GaWx0ZXIoY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjLCBpbnQgbWJfeCwgaW50IG1iX3kpIHsKKyAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgIGNvbnN0IGludCBjYWNoZV9pZCA9IGN0eC0+aWRfOworICBjb25zdCBpbnQgeV9icHMgPSBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgY29uc3QgVlA4RkluZm8qIGNvbnN0IGZfaW5mbyA9IGN0eC0+Zl9pbmZvXyArIG1iX3g7CisgIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gZGVjLT5jYWNoZV95XyArIGNhY2hlX2lkICogMTYgKiB5X2JwcyArIG1iX3ggKiAxNjsKKyAgY29uc3QgaW50IGlsZXZlbCA9IGZfaW5mby0+Zl9pbGV2ZWxfOworICBjb25zdCBpbnQgbGltaXQgPSBmX2luZm8tPmZfbGltaXRfOworICBpZiAobGltaXQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBhc3NlcnQobGltaXQgPj0gMyk7CisgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA9PSAxKSB7ICAgLy8gc2ltcGxlCisgICAgaWYgKG1iX3ggPiAwKSB7CisgICAgICBWUDhTaW1wbGVIRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4U2ltcGxlSEZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0KTsKKyAgICB9CisgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICBWUDhTaW1wbGVWRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4U2ltcGxlVkZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0KTsKKyAgICB9CisgIH0gZWxzZSB7ICAgIC8vIGNvbXBsZXgKKyAgICBjb25zdCBpbnQgdXZfYnBzID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICAgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gZGVjLT5jYWNoZV91XyArIGNhY2hlX2lkICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OworICAgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gZGVjLT5jYWNoZV92XyArIGNhY2hlX2lkICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OworICAgIGNvbnN0IGludCBoZXZfdGhyZXNoID0gZl9pbmZvLT5oZXZfdGhyZXNoXzsKKyAgICBpZiAobWJfeCA+IDApIHsKKyAgICAgIFZQOEhGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICAgIFZQOEhGaWx0ZXI4KHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgfQorICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7CisgICAgICBWUDhIRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhIRmlsdGVyOGkodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgIFZQOFZGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICAgIFZQOFZGaWx0ZXI4KHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgfQorICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7CisgICAgICBWUDhWRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgfQorfQorCisvLyBGaWx0ZXIgdGhlIGRlY29kZWQgbWFjcm9ibG9jayByb3cgKGlmIG5lZWRlZCkKK3N0YXRpYyB2b2lkIEZpbHRlclJvdyhjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaW50IG1iX3g7CisgIGNvbnN0IGludCBtYl95ID0gZGVjLT50aHJlYWRfY3R4Xy5tYl95XzsKKyAgYXNzZXJ0KGRlYy0+dGhyZWFkX2N0eF8uZmlsdGVyX3Jvd18pOworICBmb3IgKG1iX3ggPSBkZWMtPnRsX21iX3hfOyBtYl94IDwgZGVjLT5icl9tYl94XzsgKyttYl94KSB7CisgICAgRG9GaWx0ZXIoZGVjLCBtYl94LCBtYl95KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlY29tcHV0ZSB0aGUgZmlsdGVyaW5nIHN0cmVuZ3RoIGZvciBlYWNoIHNlZ21lbnQgYW5kIGVhY2ggaTR4NC9pMTZ4MTYgbW9kZS4KKworc3RhdGljIHZvaWQgUHJlY29tcHV0ZUZpbHRlclN0cmVuZ3RocyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgeworICAgIGludCBzOworICAgIGNvbnN0IFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+ZmlsdGVyX2hkcl87CisgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICBpbnQgaTR4NDsKKyAgICAgIC8vIEZpcnN0LCBjb21wdXRlIHRoZSBpbml0aWFsIGxldmVsCisgICAgICBpbnQgYmFzZV9sZXZlbDsKKyAgICAgIGlmIChkZWMtPnNlZ21lbnRfaGRyXy51c2Vfc2VnbWVudF8pIHsKKyAgICAgICAgYmFzZV9sZXZlbCA9IGRlYy0+c2VnbWVudF9oZHJfLmZpbHRlcl9zdHJlbmd0aF9bc107CisgICAgICAgIGlmICghZGVjLT5zZWdtZW50X2hkcl8uYWJzb2x1dGVfZGVsdGFfKSB7CisgICAgICAgICAgYmFzZV9sZXZlbCArPSBoZHItPmxldmVsXzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmFzZV9sZXZlbCA9IGhkci0+bGV2ZWxfOworICAgICAgfQorICAgICAgZm9yIChpNHg0ID0gMDsgaTR4NCA8PSAxOyArK2k0eDQpIHsKKyAgICAgICAgVlA4RkluZm8qIGNvbnN0IGluZm8gPSAmZGVjLT5mc3RyZW5ndGhzX1tzXVtpNHg0XTsKKyAgICAgICAgaW50IGxldmVsID0gYmFzZV9sZXZlbDsKKyAgICAgICAgaWYgKGhkci0+dXNlX2xmX2RlbHRhXykgeworICAgICAgICAgIGxldmVsICs9IGhkci0+cmVmX2xmX2RlbHRhX1swXTsKKyAgICAgICAgICBpZiAoaTR4NCkgeworICAgICAgICAgICAgbGV2ZWwgKz0gaGRyLT5tb2RlX2xmX2RlbHRhX1swXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGV2ZWwgPSAobGV2ZWwgPCAwKSA/IDAgOiAobGV2ZWwgPiA2MykgPyA2MyA6IGxldmVsOworICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgaW50IGlsZXZlbCA9IGxldmVsOworICAgICAgICAgIGlmIChoZHItPnNoYXJwbmVzc18gPiAwKSB7CisgICAgICAgICAgICBpZiAoaGRyLT5zaGFycG5lc3NfID4gNCkgeworICAgICAgICAgICAgICBpbGV2ZWwgPj49IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpbGV2ZWwgPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaWxldmVsID4gOSAtIGhkci0+c2hhcnBuZXNzXykgeworICAgICAgICAgICAgICBpbGV2ZWwgPSA5IC0gaGRyLT5zaGFycG5lc3NfOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaWxldmVsIDwgMSkgaWxldmVsID0gMTsKKyAgICAgICAgICBpbmZvLT5mX2lsZXZlbF8gPSBpbGV2ZWw7CisgICAgICAgICAgaW5mby0+Zl9saW1pdF8gPSAyICogbGV2ZWwgKyBpbGV2ZWw7CisgICAgICAgICAgaW5mby0+aGV2X3RocmVzaF8gPSAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmZvLT5mX2xpbWl0XyA9IDA7ICAvLyBubyBmaWx0ZXJpbmcKKyAgICAgICAgfQorICAgICAgICBpbmZvLT5mX2lubmVyXyA9IGk0eDQ7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaXRoZXJpbmcKKworLy8gbWluaW1hbCBhbXAgdGhhdCB3aWxsIHByb3ZpZGUgYSBub24temVybyBkaXRoZXJpbmcgZWZmZWN0CisjZGVmaW5lIE1JTl9ESVRIRVJfQU1QIDQKKworI2RlZmluZSBESVRIRVJfQU1QX1RBQl9TSVpFIDEyCitzdGF0aWMgY29uc3QgdWludDhfdCBrUXVhbnRUb0RpdGhlckFtcFtESVRIRVJfQU1QX1RBQl9TSVpFXSA9IHsKKyAgLy8gcm91Z2hseSwgaXQncyBkcW0tPnV2X21hdF9bMV0KKyAgOCwgNywgNiwgNCwgNCwgMiwgMiwgMiwgMSwgMSwgMSwgMQorfTsKKwordm9pZCBWUDhJbml0RGl0aGVyaW5nKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgYXNzZXJ0KGRlYyAhPSBOVUxMKTsKKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBkID0gb3B0aW9ucy0+ZGl0aGVyaW5nX3N0cmVuZ3RoOworICAgIGNvbnN0IGludCBtYXhfYW1wID0gKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKSAtIDE7CisgICAgY29uc3QgaW50IGYgPSAoZCA8IDApID8gMCA6IChkID4gMTAwKSA/IG1heF9hbXAgOiAoZCAqIG1heF9hbXAgLyAxMDApOworICAgIGlmIChmID4gMCkgeworICAgICAgaW50IHM7CisgICAgICBpbnQgYWxsX2FtcCA9IDA7CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgVlA4UXVhbnRNYXRyaXgqIGNvbnN0IGRxbSA9ICZkZWMtPmRxbV9bc107CisgICAgICAgIGlmIChkcW0tPnV2X3F1YW50XyA8IERJVEhFUl9BTVBfVEFCX1NJWkUpIHsKKyAgICAgICAgICAvLyBUT0RPKHNrYWwpOiBzaG91bGQgd2Ugc3BlY2lhbGx5IGRpdGhlciBtb3JlIGZvciB1dl9xdWFudF8gPCAwPworICAgICAgICAgIGNvbnN0IGludCBpZHggPSAoZHFtLT51dl9xdWFudF8gPCAwKSA/IDAgOiBkcW0tPnV2X3F1YW50XzsKKyAgICAgICAgICBkcW0tPmRpdGhlcl8gPSAoZiAqIGtRdWFudFRvRGl0aGVyQW1wW2lkeF0pID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgYWxsX2FtcCB8PSBkcW0tPmRpdGhlcl87CisgICAgICB9CisgICAgICBpZiAoYWxsX2FtcCAhPSAwKSB7CisgICAgICAgIFZQOEluaXRSYW5kb20oJmRlYy0+ZGl0aGVyaW5nX3JnXywgMS4wZik7CisgICAgICAgIGRlYy0+ZGl0aGVyXyA9IDE7CisgICAgICB9CisgICAgfQorICAgIC8vIHBvdGVudGlhbGx5IGFsbG93IGFscGhhIGRpdGhlcmluZworICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IG9wdGlvbnMtPmFscGhhX2RpdGhlcmluZ19zdHJlbmd0aDsKKyAgICBpZiAoZGVjLT5hbHBoYV9kaXRoZXJpbmdfID4gMTAwKSB7CisgICAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSAxMDA7CisgICAgfSBlbHNlIGlmIChkZWMtPmFscGhhX2RpdGhlcmluZ18gPCAwKSB7CisgICAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSAwOworICAgIH0KKyAgfQorfQorCisvLyBDb252ZXJ0IHRvIHJhbmdlOiBbLTIsMl0gZm9yIGRpdGhlcj01MCwgWy00LDRdIGZvciBkaXRoZXI9MTAwCitzdGF0aWMgdm9pZCBEaXRoZXI4eDgoVlA4UmFuZG9tKiBjb25zdCByZywgdWludDhfdCogZHN0LCBpbnQgYnBzLCBpbnQgYW1wKSB7CisgIHVpbnQ4X3QgZGl0aGVyWzY0XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4ICogODsgKytpKSB7CisgICAgZGl0aGVyW2ldID0gVlA4UmFuZG9tQml0czIocmcsIFZQOF9ESVRIRVJfQU1QX0JJVFMgKyAxLCBhbXApOworICB9CisgIFZQOERpdGhlckNvbWJpbmU4eDgoZGl0aGVyLCBkc3QsIGJwcyk7Cit9CisKK3N0YXRpYyB2b2lkIERpdGhlclJvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaW50IG1iX3g7CisgIGFzc2VydChkZWMtPmRpdGhlcl8pOworICBmb3IgKG1iX3ggPSBkZWMtPnRsX21iX3hfOyBtYl94IDwgZGVjLT5icl9tYl94XzsgKyttYl94KSB7CisgICAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgICAgY29uc3QgVlA4TUJEYXRhKiBjb25zdCBkYXRhID0gY3R4LT5tYl9kYXRhXyArIG1iX3g7CisgICAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgICAgY29uc3QgaW50IHV2X2JwcyA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICBpZiAoZGF0YS0+ZGl0aGVyXyA+PSBNSU5fRElUSEVSX0FNUCkgeworICAgICAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPmNhY2hlX3VfICsgY2FjaGVfaWQgKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7CisgICAgICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+Y2FjaGVfdl8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICAgIERpdGhlcjh4OCgmZGVjLT5kaXRoZXJpbmdfcmdfLCB1X2RzdCwgdXZfYnBzLCBkYXRhLT5kaXRoZXJfKTsKKyAgICAgIERpdGhlcjh4OCgmZGVjLT5kaXRoZXJpbmdfcmdfLCB2X2RzdCwgdXZfYnBzLCBkYXRhLT5kaXRoZXJfKTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgcm93IG9mIG1hY3JvYmxvY2tzIGlzIGZpbmlzaGVkIGRlY29kaW5nLgorLy8gSXQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisvLyAgKiBJbiBjYXNlIG9mIGluLWxvb3AgZmlsdGVyaW5nLCB3ZSBtdXN0IGhvbGQgb2ZmIHNlbmRpbmcgc29tZSBvZiB0aGUgYm90dG9tCisvLyAgICBwaXhlbHMgYXMgdGhleSBhcmUgeWV0IHVuZmlsdGVyZWQuIFRoZXkgd2lsbCBiZSB3aGVuIHRoZSBuZXh0IG1hY3JvYmxvY2sKKy8vICAgIHJvdyBpcyBkZWNvZGVkLiBNZWFud2hpbGUsIHdlIG11c3QgcHJlc2VydmUgdGhlbSBieSByb3RhdGluZyB0aGVtIGluIHRoZQorLy8gICAgY2FjaGUgYXJlYS4gVGhpcyBkb2Vzbid0IGhvbGQgZm9yIHRoZSB2ZXJ5IGJvdHRvbSByb3cgb2YgdGhlIHVuY3JvcHBlZAorLy8gICAgcGljdHVyZSBvZiBjb3Vyc2UuCisvLyAgKiB3ZSBtdXN0IGNsaXAgdGhlIHJlbWFpbmluZyBwaXhlbHMgYWdhaW5zdCB0aGUgY3JvcHBpbmcgYXJlYS4gVGhlIFZQOElvCisvLyAgICBzdHJ1Y3QgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZmllbGRzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgcHV0KCk6CisKKyNkZWZpbmUgTUFDUk9CTE9DS19WUE9TKG1iX3kpICAoKG1iX3kpICogMTYpICAgIC8vIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGEgTUIKKworLy8gRmluYWxpemUgYW5kIHRyYW5zbWl0IGEgY29tcGxldGUgcm93LiBSZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiB1c2VyLWFib3J0Lgorc3RhdGljIGludCBGaW5pc2hSb3codm9pZCogYXJnMSwgdm9pZCogYXJnMikgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopYXJnMTsKKyAgVlA4SW8qIGNvbnN0IGlvID0gKFZQOElvKilhcmcyOworICBpbnQgb2sgPSAxOworICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKKyAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgIGNvbnN0IGludCBleHRyYV95X3Jvd3MgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKKyAgY29uc3QgaW50IHlzaXplID0gZXh0cmFfeV9yb3dzICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGNvbnN0IGludCB1dnNpemUgPSAoZXh0cmFfeV9yb3dzIC8gMikgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgIGNvbnN0IGludCB5X29mZnNldCA9IGNhY2hlX2lkICogMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgY29uc3QgaW50IHV2X29mZnNldCA9IGNhY2hlX2lkICogOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgdWludDhfdCogY29uc3QgeWRzdCA9IGRlYy0+Y2FjaGVfeV8gLSB5c2l6ZSArIHlfb2Zmc2V0OworICB1aW50OF90KiBjb25zdCB1ZHN0ID0gZGVjLT5jYWNoZV91XyAtIHV2c2l6ZSArIHV2X29mZnNldDsKKyAgdWludDhfdCogY29uc3QgdmRzdCA9IGRlYy0+Y2FjaGVfdl8gLSB1dnNpemUgKyB1dl9vZmZzZXQ7CisgIGNvbnN0IGludCBtYl95ID0gY3R4LT5tYl95XzsKKyAgY29uc3QgaW50IGlzX2ZpcnN0X3JvdyA9IChtYl95ID09IDApOworICBjb25zdCBpbnQgaXNfbGFzdF9yb3cgPSAobWJfeSA+PSBkZWMtPmJyX21iX3lfIC0gMSk7CisKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA9PSAyKSB7CisgICAgUmVjb25zdHJ1Y3RSb3coZGVjLCBjdHgpOworICB9CisKKyAgaWYgKGN0eC0+ZmlsdGVyX3Jvd18pIHsKKyAgICBGaWx0ZXJSb3coZGVjKTsKKyAgfQorCisgIGlmIChkZWMtPmRpdGhlcl8pIHsKKyAgICBEaXRoZXJSb3coZGVjKTsKKyAgfQorCisgIGlmIChpby0+cHV0ICE9IE5VTEwpIHsKKyAgICBpbnQgeV9zdGFydCA9IE1BQ1JPQkxPQ0tfVlBPUyhtYl95KTsKKyAgICBpbnQgeV9lbmQgPSBNQUNST0JMT0NLX1ZQT1MobWJfeSArIDEpOworICAgIGlmICghaXNfZmlyc3Rfcm93KSB7CisgICAgICB5X3N0YXJ0IC09IGV4dHJhX3lfcm93czsKKyAgICAgIGlvLT55ID0geWRzdDsKKyAgICAgIGlvLT51ID0gdWRzdDsKKyAgICAgIGlvLT52ID0gdmRzdDsKKyAgICB9IGVsc2UgeworICAgICAgaW8tPnkgPSBkZWMtPmNhY2hlX3lfICsgeV9vZmZzZXQ7CisgICAgICBpby0+dSA9IGRlYy0+Y2FjaGVfdV8gKyB1dl9vZmZzZXQ7CisgICAgICBpby0+diA9IGRlYy0+Y2FjaGVfdl8gKyB1dl9vZmZzZXQ7CisgICAgfQorCisgICAgaWYgKCFpc19sYXN0X3JvdykgeworICAgICAgeV9lbmQgLT0gZXh0cmFfeV9yb3dzOworICAgIH0KKyAgICBpZiAoeV9lbmQgPiBpby0+Y3JvcF9ib3R0b20pIHsKKyAgICAgIHlfZW5kID0gaW8tPmNyb3BfYm90dG9tOyAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgb24gbGFzdCByb3cuCisgICAgfQorICAgIC8vIElmIGRlYy0+YWxwaGFfZGF0YV8gaXMgbm90IE5VTEwsIHdlIGhhdmUgc29tZSBhbHBoYSBwbGFuZSBwcmVzZW50LgorICAgIGlvLT5hID0gTlVMTDsKKyAgICBpZiAoZGVjLT5hbHBoYV9kYXRhXyAhPSBOVUxMICYmIHlfc3RhcnQgPCB5X2VuZCkgeworICAgICAgaW8tPmEgPSBWUDhEZWNvbXByZXNzQWxwaGFSb3dzKGRlYywgaW8sIHlfc3RhcnQsIHlfZW5kIC0geV9zdGFydCk7CisgICAgICBpZiAoaW8tPmEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVjb2RlIGFscGhhIGRhdGEuIik7CisgICAgICB9CisgICAgfQorICAgIGlmICh5X3N0YXJ0IDwgaW8tPmNyb3BfdG9wKSB7CisgICAgICBjb25zdCBpbnQgZGVsdGFfeSA9IGlvLT5jcm9wX3RvcCAtIHlfc3RhcnQ7CisgICAgICB5X3N0YXJ0ID0gaW8tPmNyb3BfdG9wOworICAgICAgYXNzZXJ0KCEoZGVsdGFfeSAmIDEpKTsKKyAgICAgIGlvLT55ICs9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfICogZGVsdGFfeTsKKyAgICAgIGlvLT51ICs9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyAqIChkZWx0YV95ID4+IDEpOworICAgICAgaW8tPnYgKz0gZGVjLT5jYWNoZV91dl9zdHJpZGVfICogKGRlbHRhX3kgPj4gMSk7CisgICAgICBpZiAoaW8tPmEgIT0gTlVMTCkgeworICAgICAgICBpby0+YSArPSBpby0+d2lkdGggKiBkZWx0YV95OworICAgICAgfQorICAgIH0KKyAgICBpZiAoeV9zdGFydCA8IHlfZW5kKSB7CisgICAgICBpby0+eSArPSBpby0+Y3JvcF9sZWZ0OworICAgICAgaW8tPnUgKz0gaW8tPmNyb3BfbGVmdCA+PiAxOworICAgICAgaW8tPnYgKz0gaW8tPmNyb3BfbGVmdCA+PiAxOworICAgICAgaWYgKGlvLT5hICE9IE5VTEwpIHsKKyAgICAgICAgaW8tPmEgKz0gaW8tPmNyb3BfbGVmdDsKKyAgICAgIH0KKyAgICAgIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKKyAgICAgIGlvLT5tYl93ID0gaW8tPmNyb3BfcmlnaHQgLSBpby0+Y3JvcF9sZWZ0OworICAgICAgaW8tPm1iX2ggPSB5X2VuZCAtIHlfc3RhcnQ7CisgICAgICBvayA9IGlvLT5wdXQoaW8pOworICAgIH0KKyAgfQorICAvLyByb3RhdGUgdG9wIHNhbXBsZXMgaWYgbmVlZGVkCisgIGlmIChjYWNoZV9pZCArIDEgPT0gZGVjLT5udW1fY2FjaGVzXykgeworICAgIGlmICghaXNfbGFzdF9yb3cpIHsKKyAgICAgIG1lbWNweShkZWMtPmNhY2hlX3lfIC0geXNpemUsIHlkc3QgKyAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfLCB5c2l6ZSk7CisgICAgICBtZW1jcHkoZGVjLT5jYWNoZV91XyAtIHV2c2l6ZSwgdWRzdCArIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHV2c2l6ZSk7CisgICAgICBtZW1jcHkoZGVjLT5jYWNoZV92XyAtIHV2c2l6ZSwgdmRzdCArIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHV2c2l6ZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG9rOworfQorCisjdW5kZWYgTUFDUk9CTE9DS19WUE9TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhQcm9jZXNzUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGludCBvayA9IDE7CisgIFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOworICBjb25zdCBpbnQgZmlsdGVyX3JvdyA9CisgICAgICAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSAmJgorICAgICAgKGRlYy0+bWJfeV8gPj0gZGVjLT50bF9tYl95XykgJiYgKGRlYy0+bWJfeV8gPD0gZGVjLT5icl9tYl95Xyk7CisgIGlmIChkZWMtPm10X21ldGhvZF8gPT0gMCkgeworICAgIC8vIGN0eC0+aWRfIGFuZCBjdHgtPmZfaW5mb18gYXJlIGFscmVhZHkgc2V0CisgICAgY3R4LT5tYl95XyA9IGRlYy0+bWJfeV87CisgICAgY3R4LT5maWx0ZXJfcm93XyA9IGZpbHRlcl9yb3c7CisgICAgUmVjb25zdHJ1Y3RSb3coZGVjLCBjdHgpOworICAgIG9rID0gRmluaXNoUm93KGRlYywgaW8pOworICB9IGVsc2UgeworICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZkZWMtPndvcmtlcl87CisgICAgLy8gRmluaXNoIHByZXZpb3VzIGpvYiAqYmVmb3JlKiB1cGRhdGluZyBjb250ZXh0CisgICAgb2sgJj0gV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5TeW5jKHdvcmtlcik7CisgICAgYXNzZXJ0KHdvcmtlci0+c3RhdHVzXyA9PSBPSyk7CisgICAgaWYgKG9rKSB7ICAgLy8gc3Bhd24gYSBuZXcgZGVibG9ja2luZy9vdXRwdXQgam9iCisgICAgICBjdHgtPmlvXyA9ICppbzsKKyAgICAgIGN0eC0+aWRfID0gZGVjLT5jYWNoZV9pZF87CisgICAgICBjdHgtPm1iX3lfID0gZGVjLT5tYl95XzsKKyAgICAgIGN0eC0+ZmlsdGVyX3Jvd18gPSBmaWx0ZXJfcm93OworICAgICAgaWYgKGRlYy0+bXRfbWV0aG9kXyA9PSAyKSB7ICAvLyBzd2FwIG1hY3JvYmxvY2sgZGF0YQorICAgICAgICBWUDhNQkRhdGEqIGNvbnN0IHRtcCA9IGN0eC0+bWJfZGF0YV87CisgICAgICAgIGN0eC0+bWJfZGF0YV8gPSBkZWMtPm1iX2RhdGFfOworICAgICAgICBkZWMtPm1iX2RhdGFfID0gdG1wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcGVyZm9ybSByZWNvbnN0cnVjdGlvbiBkaXJlY3RseSBpbiBtYWluIHRocmVhZAorICAgICAgICBSZWNvbnN0cnVjdFJvdyhkZWMsIGN0eCk7CisgICAgICB9CisgICAgICBpZiAoZmlsdGVyX3JvdykgeyAgICAgICAgICAgIC8vIHN3YXAgZmlsdGVyIGluZm8KKyAgICAgICAgVlA4RkluZm8qIGNvbnN0IHRtcCA9IGN0eC0+Zl9pbmZvXzsKKyAgICAgICAgY3R4LT5mX2luZm9fID0gZGVjLT5mX2luZm9fOworICAgICAgICBkZWMtPmZfaW5mb18gPSB0bXA7CisgICAgICB9CisgICAgICAvLyAocmVjb25zdHJ1Y3QpK2ZpbHRlciBpbiBwYXJhbGxlbAorICAgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5MYXVuY2god29ya2VyKTsKKyAgICAgIGlmICgrK2RlYy0+Y2FjaGVfaWRfID09IGRlYy0+bnVtX2NhY2hlc18pIHsKKyAgICAgICAgZGVjLT5jYWNoZV9pZF8gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVyIG9uY2UgdXNlcidzIHNldHVwKCkgaXMgY2FsbGVkLgorCitWUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgLy8gQ2FsbCBzZXR1cCgpIGZpcnN0LiBUaGlzIG1heSB0cmlnZ2VyIGFkZGl0aW9uYWwgZGVjb2RpbmcgZmVhdHVyZXMgb24gJ2lvJy4KKyAgLy8gTm90ZTogQWZ0ZXJ3YXJkLCB3ZSBtdXN0IGNhbGwgdGVhcmRvd24oKSBubyBtYXR0ZXIgd2hhdC4KKyAgaWYgKGlvLT5zZXR1cCAhPSBOVUxMICYmICFpby0+c2V0dXAoaW8pKSB7CisgICAgVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VTRVJfQUJPUlQsICJGcmFtZSBzZXR1cCBmYWlsZWQiKTsKKyAgICByZXR1cm4gZGVjLT5zdGF0dXNfOworICB9CisKKyAgLy8gRGlzYWJsZSBmaWx0ZXJpbmcgcGVyIHVzZXIgcmVxdWVzdAorICBpZiAoaW8tPmJ5cGFzc19maWx0ZXJpbmcpIHsKKyAgICBkZWMtPmZpbHRlcl90eXBlXyA9IDA7CisgIH0KKworICAvLyBEZWZpbmUgdGhlIGFyZWEgd2hlcmUgd2UgY2FuIHNraXAgaW4tbG9vcCBmaWx0ZXJpbmcsIGluIGNhc2Ugb2YgY3JvcHBpbmcuCisgIC8vCisgIC8vICdTaW1wbGUnIGZpbHRlciByZWFkcyB0d28gbHVtYSBzYW1wbGVzIG91dHNpZGUgb2YgdGhlIG1hY3JvYmxvY2sKKyAgLy8gYW5kIGZpbHRlcnMgb25lLiBJdCBkb2Vzbid0IGZpbHRlciB0aGUgY2hyb21hIHNhbXBsZXMuIEhlbmNlLCB3ZSBjYW4KKyAgLy8gYXZvaWQgZG9pbmcgdGhlIGluLWxvb3AgZmlsdGVyaW5nIGJlZm9yZSBjcm9wX3RvcC9jcm9wX2xlZnQgcG9zaXRpb24uCisgIC8vIEZvciB0aGUgJ0NvbXBsZXgnIGZpbHRlciwgMyBzYW1wbGVzIGFyZSByZWFkIGFuZCB1cCB0byAzIGFyZSBmaWx0ZXJlZC4KKyAgLy8gTWVhbnM6IHRoZXJlJ3MgYSBkZXBlbmRlbmN5IGNoYWluIHRoYXQgZ29lcyBhbGwgdGhlIHdheSB1cCB0byB0aGUKKyAgLy8gdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwaWN0dXJlIChNQiAjMCkuIFdlIG11c3QgZmlsdGVyIGFsbCB0aGUgcHJldmlvdXMKKyAgLy8gbWFjcm9ibG9ja3MuCisgIHsKKyAgICBjb25zdCBpbnQgZXh0cmFfcGl4ZWxzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107CisgICAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID09IDIpIHsKKyAgICAgIC8vIEZvciBjb21wbGV4IGZpbHRlciwgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZGVwZW5kZW5jeSBjaGFpbi4KKyAgICAgIGRlYy0+dGxfbWJfeF8gPSAwOworICAgICAgZGVjLT50bF9tYl95XyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEZvciBzaW1wbGUgZmlsdGVyLCB3ZSBjYW4gZmlsdGVyIG9ubHkgdGhlIGNyb3BwZWQgcmVnaW9uLgorICAgICAgLy8gV2UgaW5jbHVkZSAnZXh0cmFfcGl4ZWxzJyBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgYm91bmRhcnksIHNpbmNlCisgICAgICAvLyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGZpbHRlcmluZyBvZiB0aGUgcHJldmlvdXMgbWFjcm9ibG9jayBjYW4KKyAgICAgIC8vIG1vZGlmeSBzb21lIGFidXR0aW5nIHBpeGVscy4KKyAgICAgIGRlYy0+dGxfbWJfeF8gPSAoaW8tPmNyb3BfbGVmdCAtIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICAgIGRlYy0+dGxfbWJfeV8gPSAoaW8tPmNyb3BfdG9wIC0gZXh0cmFfcGl4ZWxzKSA+PiA0OworICAgICAgaWYgKGRlYy0+dGxfbWJfeF8gPCAwKSBkZWMtPnRsX21iX3hfID0gMDsKKyAgICAgIGlmIChkZWMtPnRsX21iX3lfIDwgMCkgZGVjLT50bF9tYl95XyA9IDA7CisgICAgfQorICAgIC8vIFdlIG5lZWQgc29tZSAnZXh0cmEnIHBpeGVscyBvbiB0aGUgcmlnaHQvYm90dG9tLgorICAgIGRlYy0+YnJfbWJfeV8gPSAoaW8tPmNyb3BfYm90dG9tICsgMTUgKyBleHRyYV9waXhlbHMpID4+IDQ7CisgICAgZGVjLT5icl9tYl94XyA9IChpby0+Y3JvcF9yaWdodCArIDE1ICsgZXh0cmFfcGl4ZWxzKSA+PiA0OworICAgIGlmIChkZWMtPmJyX21iX3hfID4gZGVjLT5tYl93XykgeworICAgICAgZGVjLT5icl9tYl94XyA9IGRlYy0+bWJfd187CisgICAgfQorICAgIGlmIChkZWMtPmJyX21iX3lfID4gZGVjLT5tYl9oXykgeworICAgICAgZGVjLT5icl9tYl95XyA9IGRlYy0+bWJfaF87CisgICAgfQorICB9CisgIFByZWNvbXB1dGVGaWx0ZXJTdHJlbmd0aHMoZGVjKTsKKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKK2ludCBWUDhFeGl0Q3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMTsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA+IDApIHsKKyAgICBvayA9IFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+U3luYygmZGVjLT53b3JrZXJfKTsKKyAgfQorCisgIGlmIChpby0+dGVhcmRvd24gIT0gTlVMTCkgeworICAgIGlvLT50ZWFyZG93bihpbyk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yIG11bHRpLXRocmVhZGVkIGRlY29kaW5nIHdlIG5lZWQgdG8gdXNlIDMgcm93cyBvZiAxNiBwaXhlbHMgYXMgZGVsYXkgbGluZS4KKy8vCisvLyBSZWFzb24gaXM6IHRoZSBkZWJsb2NraW5nIGZpbHRlciBjYW5ub3QgZGVibG9jayB0aGUgYm90dG9tIGhvcml6b250YWwgZWRnZXMKKy8vIGltbWVkaWF0ZWx5LCBhbmQgbmVlZHMgdG8gd2FpdCBmb3IgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jayB0bworLy8gYmUgZGVjb2RlZC4gSGVuY2UsIGRlYmxvY2tpbmcgaXMgbGFnZ2luZyBiZWhpbmQgYnkgNCBvciA4IHBpeGVscyAoZGVwZW5kaW5nCisvLyBvbiBzdHJlbmd0aCkuCisvLyBXaXRoIHR3byB0aHJlYWRzLCB0aGUgdmVydGljYWwgcG9zaXRpb25zIG9mIHRoZSByb3dzIGJlaW5nIGRlY29kZWQgYXJlOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWzQ4Li42M11bNjQuLjc5XVsuLi4KKy8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3XVsyOC4uNDNdWzQ0Li41OV1bLi4uCisvLyBJZiB3ZSB1c2UgdHdvIHRocmVhZHMgYW5kIHR3byBjYWNoZXMgb2YgMTYgcGl4ZWxzLCB0aGUgc2VxdWVuY2Ugd291bGQgYmU6CisvLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNSEhXVsxNi4uMzFdWyAwLi4xNV1bLi4uCisvLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yNyEhXVstNC4uMTFdWzEyLi4yN11bLi4uCisvLyBUaGUgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHJvdyBbMTIuLjE1ISFdIHRoYXQgYm90aCB0aGUgZGVjb2RpbmcgYW5kCisvLyBkZWJsb2NraW5nIHRocmVhZHMgYXJlIHdyaXRpbmcgc2ltdWx0YW5lb3VzbHkuCisvLyBXaXRoIDMgY2FjaGUgbGluZXMsIG9uZSBnZXQgYSBzYWZlIHdyaXRlIHBhdHRlcm46CisvLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bMC4uCisvLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yN11bMjguLjQzXVstNC4uMTFdWzEyLi4yN11bMjguLi4KKy8vIE5vdGUgdGhhdCBtdWx0aS10aHJlYWRlZCBvdXRwdXQgX3dpdGhvdXRfIGRlYmxvY2tpbmcgY2FuIG1ha2UgdXNlIG9mIHR3bworLy8gY2FjaGUgbGluZXMgb2YgMTYgcGl4ZWxzIG9ubHksIHNpbmNlIHRoZXJlJ3Mgbm8gbGFnZ2luZyBiZWhpbmQuIFRoZSBkZWNvZGluZworLy8gYW5kIG91dHB1dCBwcm9jZXNzIGhhdmUgbm9uLWNvbmN1cnJlbnQgd3JpdGluZzoKKy8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1XVsxNi4uMzFdWy4uLgorLy8gaW8tPnB1dDogICAgICAgICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNV1bLi4uCisKKyNkZWZpbmUgTVRfQ0FDSEVfTElORVMgMworI2RlZmluZSBTVF9DQUNIRV9MSU5FUyAxICAgLy8gMSBjYWNoZSByb3cgb25seSBmb3Igc2luZ2xlLXRocmVhZGVkIGNhc2UKKworLy8gSW5pdGlhbGl6ZSBtdWx0aS9zaW5nbGUtdGhyZWFkIHdvcmtlcgorc3RhdGljIGludCBJbml0VGhyZWFkQ29udGV4dChWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgZGVjLT5jYWNoZV9pZF8gPSAwOworICBpZiAoZGVjLT5tdF9tZXRob2RfID4gMCkgeworICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZkZWMtPndvcmtlcl87CisgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlJlc2V0KHdvcmtlcikpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkIGluaXRpYWxpemF0aW9uIGZhaWxlZC4iKTsKKyAgICB9CisgICAgd29ya2VyLT5kYXRhMSA9IGRlYzsKKyAgICB3b3JrZXItPmRhdGEyID0gKHZvaWQqKSZkZWMtPnRocmVhZF9jdHhfLmlvXzsKKyAgICB3b3JrZXItPmhvb2sgPSBGaW5pc2hSb3c7CisgICAgZGVjLT5udW1fY2FjaGVzXyA9CisgICAgICAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSA/IE1UX0NBQ0hFX0xJTkVTIDogTVRfQ0FDSEVfTElORVMgLSAxOworICB9IGVsc2UgeworICAgIGRlYy0+bnVtX2NhY2hlc18gPSBTVF9DQUNIRV9MSU5FUzsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFZQOEdldFRocmVhZE1ldGhvZChjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBpZiAob3B0aW9ucyA9PSBOVUxMIHx8IG9wdGlvbnMtPnVzZV90aHJlYWRzID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAodm9pZCloZWFkZXJzOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICBhc3NlcnQoaGVhZGVycyA9PSBOVUxMIHx8ICFoZWFkZXJzLT5pc19sb3NzbGVzcyk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9USFJFQUQpCisgIGlmICh3aWR0aCA8IE1JTl9XSURUSF9GT1JfVEhSRUFEUykgcmV0dXJuIDA7CisgIC8vIFRPRE8oc2thbCk6IHR1bmUgdGhlIGhldXJpc3RpYyBmdXJ0aGVyCisjaWYgMAorICBpZiAoaGVpZ2h0IDwgMiAqIHdpZHRoKSByZXR1cm4gMjsKKyNlbmRpZgorICByZXR1cm4gMjsKKyNlbHNlICAgLy8gIVdFQlBfVVNFX1RIUkVBRAorICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisjdW5kZWYgTVRfQ0FDSEVfTElORVMKKyN1bmRlZiBTVF9DQUNIRV9MSU5FUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtb3J5IHNldHVwCisKK3N0YXRpYyBpbnQgQWxsb2NhdGVNZW1vcnkoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGNvbnN0IGludCBudW1fY2FjaGVzID0gZGVjLT5udW1fY2FjaGVzXzsKKyAgY29uc3QgaW50IG1iX3cgPSBkZWMtPm1iX3dfOworICAvLyBOb3RlOiB3ZSB1c2UgJ3NpemVfdCcgd2hlbiB0aGVyZSdzIG5vIG92ZXJmbG93IHJpc2ssIHVpbnQ2NF90IG90aGVyd2lzZS4KKyAgY29uc3Qgc2l6ZV90IGludHJhX3ByZWRfbW9kZV9zaXplID0gNCAqIG1iX3cgKiBzaXplb2YodWludDhfdCk7CisgIGNvbnN0IHNpemVfdCB0b3Bfc2l6ZSA9IHNpemVvZihWUDhUb3BTYW1wbGVzKSAqIG1iX3c7CisgIGNvbnN0IHNpemVfdCBtYl9pbmZvX3NpemUgPSAobWJfdyArIDEpICogc2l6ZW9mKFZQOE1CKTsKKyAgY29uc3Qgc2l6ZV90IGZfaW5mb19zaXplID0KKyAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApID8KKyAgICAgICAgICBtYl93ICogKGRlYy0+bXRfbWV0aG9kXyA+IDAgPyAyIDogMSkgKiBzaXplb2YoVlA4RkluZm8pCisgICAgICAgIDogMDsKKyAgY29uc3Qgc2l6ZV90IHl1dl9zaXplID0gWVVWX1NJWkUgKiBzaXplb2YoKmRlYy0+eXV2X2JfKTsKKyAgY29uc3Qgc2l6ZV90IG1iX2RhdGFfc2l6ZSA9CisgICAgICAoZGVjLT5tdF9tZXRob2RfID09IDIgPyAyIDogMSkgKiBtYl93ICogc2l6ZW9mKCpkZWMtPm1iX2RhdGFfKTsKKyAgY29uc3Qgc2l6ZV90IGNhY2hlX2hlaWdodCA9ICgxNiAqIG51bV9jYWNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dKSAqIDMgLyAyOworICBjb25zdCBzaXplX3QgY2FjaGVfc2l6ZSA9IHRvcF9zaXplICogY2FjaGVfaGVpZ2h0OworICAvLyBhbHBoYV9zaXplIGlzIHRoZSBvbmx5IG9uZSB0aGF0IHNjYWxlcyBhcyB3aWR0aCB4IGhlaWdodC4KKyAgY29uc3QgdWludDY0X3QgYWxwaGFfc2l6ZSA9IChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwpID8KKyAgICAgICh1aW50NjRfdClkZWMtPnBpY19oZHJfLndpZHRoXyAqIGRlYy0+cGljX2hkcl8uaGVpZ2h0XyA6IDBVTEw7CisgIGNvbnN0IHVpbnQ2NF90IG5lZWRlZCA9ICh1aW50NjRfdClpbnRyYV9wcmVkX21vZGVfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgKyB0b3Bfc2l6ZSArIG1iX2luZm9fc2l6ZSArIGZfaW5mb19zaXplCisgICAgICAgICAgICAgICAgICAgICAgICArIHl1dl9zaXplICsgbWJfZGF0YV9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlX3NpemUgKyBhbHBoYV9zaXplICsgV0VCUF9BTElHTl9DU1Q7CisgIHVpbnQ4X3QqIG1lbTsKKworICBpZiAobmVlZGVkICE9IChzaXplX3QpbmVlZGVkKSByZXR1cm4gMDsgIC8vIGNoZWNrIGZvciBvdmVyZmxvdworICBpZiAobmVlZGVkID4gZGVjLT5tZW1fc2l6ZV8pIHsKKyAgICBXZWJQU2FmZUZyZWUoZGVjLT5tZW1fKTsKKyAgICBkZWMtPm1lbV9zaXplXyA9IDA7CisgICAgZGVjLT5tZW1fID0gV2ViUFNhZmVNYWxsb2MobmVlZGVkLCBzaXplb2YodWludDhfdCkpOworICAgIGlmIChkZWMtPm1lbV8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICJubyBtZW1vcnkgZHVyaW5nIGZyYW1lIGluaXRpYWxpemF0aW9uLiIpOworICAgIH0KKyAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZU1hbGxvYygpIGFib3ZlLgorICAgIGRlYy0+bWVtX3NpemVfID0gKHNpemVfdCluZWVkZWQ7CisgIH0KKworICBtZW0gPSAodWludDhfdCopZGVjLT5tZW1fOworICBkZWMtPmludHJhX3RfID0gbWVtOworICBtZW0gKz0gaW50cmFfcHJlZF9tb2RlX3NpemU7CisKKyAgZGVjLT55dXZfdF8gPSAoVlA4VG9wU2FtcGxlcyopbWVtOworICBtZW0gKz0gdG9wX3NpemU7CisKKyAgZGVjLT5tYl9pbmZvXyA9ICgoVlA4TUIqKW1lbSkgKyAxOworICBtZW0gKz0gbWJfaW5mb19zaXplOworCisgIGRlYy0+Zl9pbmZvXyA9IGZfaW5mb19zaXplID8gKFZQOEZJbmZvKiltZW0gOiBOVUxMOworICBtZW0gKz0gZl9pbmZvX3NpemU7CisgIGRlYy0+dGhyZWFkX2N0eF8uaWRfID0gMDsKKyAgZGVjLT50aHJlYWRfY3R4Xy5mX2luZm9fID0gZGVjLT5mX2luZm9fOworICBpZiAoZGVjLT5tdF9tZXRob2RfID4gMCkgeworICAgIC8vIHNlY29uZGFyeSBjYWNoZSBsaW5lLiBUaGUgZGVibG9ja2luZyBwcm9jZXNzIG5lZWQgdG8gbWFrZSB1c2Ugb2YgdGhlCisgICAgLy8gZmlsdGVyaW5nIHN0cmVuZ3RoIGZyb20gcHJldmlvdXMgbWFjcm9ibG9jayByb3csIHdoaWxlIHRoZSBuZXcgb25lcworICAgIC8vIGFyZSBiZWluZyBkZWNvZGVkIGluIHBhcmFsbGVsLiBXZSdsbCBqdXN0IHN3YXAgdGhlIHBvaW50ZXJzLgorICAgIGRlYy0+dGhyZWFkX2N0eF8uZl9pbmZvXyArPSBtYl93OworICB9CisKKyAgbWVtID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04obWVtKTsKKyAgYXNzZXJ0KCh5dXZfc2l6ZSAmIFdFQlBfQUxJR05fQ1NUKSA9PSAwKTsKKyAgZGVjLT55dXZfYl8gPSBtZW07CisgIG1lbSArPSB5dXZfc2l6ZTsKKworICBkZWMtPm1iX2RhdGFfID0gKFZQOE1CRGF0YSopbWVtOworICBkZWMtPnRocmVhZF9jdHhfLm1iX2RhdGFfID0gKFZQOE1CRGF0YSopbWVtOworICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDIpIHsKKyAgICBkZWMtPnRocmVhZF9jdHhfLm1iX2RhdGFfICs9IG1iX3c7CisgIH0KKyAgbWVtICs9IG1iX2RhdGFfc2l6ZTsKKworICBkZWMtPmNhY2hlX3lfc3RyaWRlXyA9IDE2ICogbWJfdzsKKyAgZGVjLT5jYWNoZV91dl9zdHJpZGVfID0gOCAqIG1iX3c7CisgIHsKKyAgICBjb25zdCBpbnQgZXh0cmFfcm93cyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOworICAgIGNvbnN0IGludCBleHRyYV95ID0gZXh0cmFfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICAgIGNvbnN0IGludCBleHRyYV91diA9IChleHRyYV9yb3dzIC8gMikgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgICAgZGVjLT5jYWNoZV95XyA9IG1lbSArIGV4dHJhX3k7CisgICAgZGVjLT5jYWNoZV91XyA9IGRlYy0+Y2FjaGVfeV8KKyAgICAgICAgICAgICAgICAgICsgMTYgKiBudW1fY2FjaGVzICogZGVjLT5jYWNoZV95X3N0cmlkZV8gKyBleHRyYV91djsKKyAgICBkZWMtPmNhY2hlX3ZfID0gZGVjLT5jYWNoZV91XworICAgICAgICAgICAgICAgICAgKyA4ICogbnVtX2NhY2hlcyAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyArIGV4dHJhX3V2OworICAgIGRlYy0+Y2FjaGVfaWRfID0gMDsKKyAgfQorICBtZW0gKz0gY2FjaGVfc2l6ZTsKKworICAvLyBhbHBoYSBwbGFuZQorICBkZWMtPmFscGhhX3BsYW5lXyA9IGFscGhhX3NpemUgPyBtZW0gOiBOVUxMOworICBtZW0gKz0gYWxwaGFfc2l6ZTsKKyAgYXNzZXJ0KG1lbSA8PSAodWludDhfdCopZGVjLT5tZW1fICsgZGVjLT5tZW1fc2l6ZV8pOworCisgIC8vIG5vdGU6IGxlZnQvdG9wLWluZm8gaXMgaW5pdGlhbGl6ZWQgb25jZSBmb3IgYWxsLgorICBtZW1zZXQoZGVjLT5tYl9pbmZvXyAtIDEsIDAsIG1iX2luZm9fc2l6ZSk7CisgIFZQOEluaXRTY2FubGluZShkZWMpOyAgIC8vIGluaXRpYWxpemUgbGVmdCB0b28uCisKKyAgLy8gaW5pdGlhbGl6ZSB0b3AKKyAgbWVtc2V0KGRlYy0+aW50cmFfdF8sIEJfRENfUFJFRCwgaW50cmFfcHJlZF9tb2RlX3NpemUpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBJbml0SW8oVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKKyAgLy8gcHJlcGFyZSAnaW8nCisgIGlvLT5tYl95ID0gMDsKKyAgaW8tPnkgPSBkZWMtPmNhY2hlX3lfOworICBpby0+dSA9IGRlYy0+Y2FjaGVfdV87CisgIGlvLT52ID0gZGVjLT5jYWNoZV92XzsKKyAgaW8tPnlfc3RyaWRlID0gZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGlvLT51dl9zdHJpZGUgPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgIGlvLT5hID0gTlVMTDsKK30KKworaW50IFZQOEluaXRGcmFtZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpZiAoIUluaXRUaHJlYWRDb250ZXh0KGRlYykpIHJldHVybiAwOyAgLy8gY2FsbCBmaXJzdC4gU2V0cyBkZWMtPm51bV9jYWNoZXNfLgorICBpZiAoIUFsbG9jYXRlTWVtb3J5KGRlYykpIHJldHVybiAwOworICBJbml0SW8oZGVjLCBpbyk7CisgIFZQOERzcEluaXQoKTsgIC8vIEluaXQgY3JpdGljYWwgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGxvb2stdXAgdGFibGVzLgorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9pZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lkZWNfZGVjLmMKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lkZWMuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9pZGVjX2RlYy5jCmluZGV4IGQ3MmFjNjAuLjViMDliMDMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9pZGVjLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9pZGVjX2RlYy5jCkBAIC0xMiwyMSArMTIsMTkgQEAKIC8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL2FscGhhaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKIAogLy8gSW4gYXBwZW5kIG1vZGUsIGJ1ZmZlciBhbGxvY2F0aW9ucyBpbmNyZWFzZSBhcyBtdWx0aXBsZXMgb2YgdGhpcyB2YWx1ZS4KIC8vIE5lZWRzIHRvIGJlIGEgcG93ZXIgb2YgMi4KQEAgLTM2LDExICszNCwxMyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIERhdGEgc3RydWN0dXJlcyBmb3IgbWVtb3J5IGFuZCBzdGF0ZXMKIAotLy8gRGVjb2Rpbmcgc3RhdGVzLiBTdGF0ZSBub3JtYWxseSBmbG93cyBsaWtlIEhFQURFUi0+UEFSVFMwLT5EQVRBLT5ET05FLgorLy8gRGVjb2Rpbmcgc3RhdGVzLiBTdGF0ZSBub3JtYWxseSBmbG93cyBhczoKKy8vIFdFQlBfSEVBREVSLT5WUDhfSEVBREVSLT5WUDhfUEFSVFMwLT5WUDhfREFUQS0+RE9ORSBmb3IgYSBsb3NzeSBpbWFnZSwgYW5kCisvLyBXRUJQX0hFQURFUi0+VlA4TF9IRUFERVItPlZQOExfREFUQS0+RE9ORSBmb3IgYSBsb3NzbGVzcyBpbWFnZS4KIC8vIElmIHRoZXJlIGlzIGFueSBlcnJvciB0aGUgZGVjb2RlciBnb2VzIGludG8gc3RhdGUgRVJST1IuCiB0eXBlZGVmIGVudW0gewotICBTVEFURV9QUkVfVlA4LCAgLy8gQWxsIGRhdGEgYmVmb3JlIHRoYXQgb2YgdGhlIGZpcnN0IFZQOCBjaHVuay4KLSAgU1RBVEVfVlA4X0ZSQU1FX0hFQURFUiwgIC8vIEZvciBWUDggRnJhbWUgaGVhZGVyICh3aXRoaW4gVlA4IGNodW5rKS4KKyAgU1RBVEVfV0VCUF9IRUFERVIsICAvLyBBbGwgdGhlIGRhdGEgYmVmb3JlIHRoYXQgb2YgdGhlIFZQOC9WUDhMIGNodW5rLgorICBTVEFURV9WUDhfSEVBREVSLCAgIC8vIFRoZSBWUDggRnJhbWUgaGVhZGVyICh3aXRoaW4gdGhlIFZQOCBjaHVuaykuCiAgIFNUQVRFX1ZQOF9QQVJUUzAsCiAgIFNUQVRFX1ZQOF9EQVRBLAogICBTVEFURV9WUDhMX0hFQURFUiwKQEAgLTc2LDMwICs3NiwyNCBAQAogICBWUDhJbyBpb187CiAKICAgTWVtQnVmZmVyIG1lbV87ICAgICAgICAgIC8vIGlucHV0IG1lbW9yeSBidWZmZXIuCi0gIFdlYlBEZWNCdWZmZXIgb3V0cHV0XzsgICAvLyBvdXRwdXQgYnVmZmVyICh3aGVuIG5vIGV4dGVybmFsIG9uZSBpcyBzdXBwbGllZCkKKyAgV2ViUERlY0J1ZmZlciBvdXRwdXRfOyAgIC8vIG91dHB1dCBidWZmZXIgKHdoZW4gbm8gZXh0ZXJuYWwgb25lIGlzIHN1cHBsaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgaWYgdGhlIGV4dGVybmFsIG9uZSBoYXMgc2xvdy1tZW1vcnkpCisgIFdlYlBEZWNCdWZmZXIqIGZpbmFsX291dHB1dF87ICAvLyBTbG93LW1lbW9yeSBvdXRwdXQgdG8gY29weSB0byBldmVudHVhbGx5LgogICBzaXplX3QgY2h1bmtfc2l6ZV87ICAgICAgLy8gQ29tcHJlc3NlZCBWUDgvVlA4TCBzaXplIGV4dHJhY3RlZCBmcm9tIEhlYWRlci4KKworICBpbnQgbGFzdF9tYl95XzsgICAgICAgICAgLy8gbGFzdCByb3cgcmVhY2hlZCBmb3IgaW50cmEtbW9kZSBkZWNvZGluZwogfTsKIAogLy8gTUIgY29udGV4dCB0byByZXN0b3JlIGluIGNhc2UgVlA4RGVjb2RlTUIoKSBmYWlscwogdHlwZWRlZiBzdHJ1Y3QgewogICBWUDhNQiBsZWZ0XzsKICAgVlA4TUIgaW5mb187Ci0gIHVpbnQ4X3QgaW50cmFfdF9bNF07Ci0gIHVpbnQ4X3QgaW50cmFfbF9bNF07Ci0gIFZQOEJpdFJlYWRlciBicl87CiAgIFZQOEJpdFJlYWRlciB0b2tlbl9icl87CiB9IE1CQ29udGV4dDsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE1lbUJ1ZmZlcjogaW5jb21pbmcgZGF0YSBoYW5kbGluZwogCi1zdGF0aWMgdm9pZCBSZW1hcEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBwdHJkaWZmX3Qgb2Zmc2V0KSB7Ci0gIGlmIChici0+YnVmXyAhPSBOVUxMKSB7Ci0gICAgYnItPmJ1Zl8gKz0gb2Zmc2V0OwotICAgIGJyLT5idWZfZW5kXyArPSBvZmZzZXQ7Ci0gIH0KLX0KLQogc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBNZW1EYXRhU2l6ZShjb25zdCBNZW1CdWZmZXIqIG1lbSkgewogICByZXR1cm4gKG1lbS0+ZW5kXyAtIG1lbS0+c3RhcnRfKTsKIH0KQEAgLTEwNyw3ICsxMDEsNyBAQAogLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgY29tcHJlc3NlZCBhbHBoYSBkYXRhLCBhcyBpdCBtYXkgbm90IGhhdmUKIC8vIGJlZW4gZGVjb2RlZCB5ZXQuCiBzdGF0aWMgaW50IE5lZWRDb21wcmVzc2VkQWxwaGEoY29uc3QgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7Ci0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfUFJFX1ZQOCkgeworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1dFQlBfSEVBREVSKSB7CiAgICAgLy8gV2UgaGF2ZW4ndCBwYXJzZWQgdGhlIGhlYWRlcnMgeWV0LCBzbyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIGltYWdlIGlzCiAgICAgLy8gbG9zc3kgb3IgbG9zc2xlc3MuIFRoaXMgYWxzbyBtZWFucyB0aGF0IHdlIGhhdmVuJ3QgcGFyc2VkIHRoZSBBTFBIIGNodW5rLgogICAgIHJldHVybiAwOwpAQCAtMTE2LDcgKzExMCw3IEBACiAgICAgcmV0dXJuIDA7ICAvLyBBTFBIIGNodW5rIGlzIG5vdCBwcmVzZW50IGZvciBsb3NzbGVzcyBpbWFnZXMuCiAgIH0gZWxzZSB7CiAgICAgY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187Ci0gICAgU0JfRENIRUNLKGRlYyAhPSBOVUxMKTsgIC8vIE11c3QgYmUgdHJ1ZSBhcyBpZGVjLT5zdGF0ZV8gIT0gU1RBVEVfUFJFX1ZQOC4KKyAgICBhc3NlcnQoZGVjICE9IE5VTEwpOyAgLy8gTXVzdCBiZSB0cnVlIGFzIGlkZWMtPnN0YXRlXyAhPSBTVEFURV9XRUJQX0hFQURFUi4KICAgICByZXR1cm4gKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCkgJiYgIWRlYy0+aXNfYWxwaGFfZGVjb2RlZF87CiAgIH0KIH0KQEAgLTEzMiwyMSArMTI2LDM5IEBACiAgIGlmIChpZGVjLT5kZWNfICE9IE5VTEwpIHsKICAgICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgewogICAgICAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187Ci0gICAgICBjb25zdCBpbnQgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfIC0gMTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGxhc3RfcGFydCA9IGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV87CiAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKLSAgICAgICAgaW50IHA7CisgICAgICAgIHVpbnQzMl90IHA7CiAgICAgICAgIGZvciAocCA9IDA7IHAgPD0gbGFzdF9wYXJ0OyArK3ApIHsKLSAgICAgICAgICBSZW1hcEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIG9mZnNldCk7CisgICAgICAgICAgVlA4UmVtYXBCaXRSZWFkZXIoZGVjLT5wYXJ0c18gKyBwLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJlbWFwIHBhcnRpdGlvbiAjMCBkYXRhIHBvaW50ZXIgdG8gbmV3IG9mZnNldCwgYnV0IG9ubHkgaW4gTUFQCiAgICAgICAgIC8vIG1vZGUgKGluIEFQUEVORCBtb2RlLCBwYXJ0aXRpb24gIzAgaXMgY29waWVkIGludG8gYSBmaXhlZCBtZW1vcnkpLgogICAgICAgICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9NQVApIHsKLSAgICAgICAgICBSZW1hcEJpdFJlYWRlcigmZGVjLT5icl8sIG9mZnNldCk7CisgICAgICAgICAgVlA4UmVtYXBCaXRSZWFkZXIoJmRlYy0+YnJfLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBTQl9EQ0hFQ0sobGFzdF9wYXJ0ID49IDApOwotICAgICAgZGVjLT5wYXJ0c19bbGFzdF9wYXJ0XS5idWZfZW5kXyA9IG1lbS0+YnVmXyArIG1lbS0+ZW5kXzsKLSAgICAgIGlmIChOZWVkQ29tcHJlc3NlZEFscGhhKGlkZWMpKSBkZWMtPmFscGhhX2RhdGFfICs9IG9mZnNldDsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgbGFzdF9zdGFydCA9IGRlYy0+cGFydHNfW2xhc3RfcGFydF0uYnVmXzsKKyAgICAgICAgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKCZkZWMtPnBhcnRzX1tsYXN0X3BhcnRdLCBsYXN0X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtLT5idWZfICsgbWVtLT5lbmRfIC0gbGFzdF9zdGFydCk7CisgICAgICB9CisgICAgICBpZiAoTmVlZENvbXByZXNzZWRBbHBoYShpZGVjKSkgeworICAgICAgICBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMgPSBkZWMtPmFscGhfZGVjXzsKKyAgICAgICAgZGVjLT5hbHBoYV9kYXRhXyArPSBvZmZzZXQ7CisgICAgICAgIGlmIChhbHBoX2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKGFscGhfZGVjLT5tZXRob2RfID09IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKSB7CisgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgYWxwaF92cDhsX2RlYyA9IGFscGhfZGVjLT52cDhsX2RlY187CisgICAgICAgICAgICBhc3NlcnQoYWxwaF92cDhsX2RlYyAhPSBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydChkZWMtPmFscGhhX2RhdGFfc2l6ZV8gPj0gQUxQSEFfSEVBREVSX0xFTik7CisgICAgICAgICAgICBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKCZhbHBoX3ZwOGxfZGVjLT5icl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy0+YWxwaGFfZGF0YV8gKyBBTFBIQV9IRUFERVJfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWMtPmFscGhhX2RhdGFfc2l6ZV8gLSBBTFBIQV9IRUFERVJfTEVOKTsKKyAgICAgICAgICB9IGVsc2UgeyAgLy8gYWxwaF9kZWMtPm1ldGhvZF8gPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04KKyAgICAgICAgICAgIC8vIE5vdGhpbmcgc3BlY2lhbCB0byBkbyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAgICAgfSBlbHNlIHsgICAgLy8gUmVzaXplIGxvc3NsZXNzIGJpdHJlYWRlcgogICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopaWRlYy0+ZGVjXzsKICAgICAgIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoJmRlYy0+YnJfLCBuZXdfYmFzZSwgTWVtRGF0YVNpemUobWVtKSk7CkBAIC0xNjQsNyArMTc2LDcgQEAKICAgY29uc3QgdWludDhfdCogY29uc3Qgb2xkX3N0YXJ0ID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87CiAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9iYXNlID0KICAgICAgIG5lZWRfY29tcHJlc3NlZF9hbHBoYSA/IGRlYy0+YWxwaGFfZGF0YV8gOiBvbGRfc3RhcnQ7Ci0gIFNCX0RDSEVDSyhtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCk7CisgIGFzc2VydChtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCk7CiAgIGlmIChkYXRhX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgewogICAgIC8vIHNlY3VyaXR5IHNhZmVndWFyZDogdHJ5aW5nIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB3aGF0IHRoZSBmb3JtYXQKICAgICAvLyBhbGxvd3MgZm9yIGEgY2h1bmsgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBzbW9rZSBzbWVsbC4KQEAgLTE3OSwxNyArMTkxLDE3IEBACiAgICAgdWludDhfdCogY29uc3QgbmV3X2J1ZiA9CiAgICAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhleHRyYV9zaXplLCBzaXplb2YoKm5ld19idWYpKTsKICAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBTYk1lbW9yeUNvcHkobmV3X2J1Ziwgb2xkX2Jhc2UsIGN1cnJlbnRfc2l6ZSk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKG1lbS0+YnVmXyk7CisgICAgbWVtY3B5KG5ld19idWYsIG9sZF9iYXNlLCBjdXJyZW50X3NpemUpOworICAgIFdlYlBTYWZlRnJlZShtZW0tPmJ1Zl8pOwogICAgIG1lbS0+YnVmXyA9IG5ld19idWY7CiAgICAgbWVtLT5idWZfc2l6ZV8gPSAoc2l6ZV90KWV4dHJhX3NpemU7CiAgICAgbWVtLT5zdGFydF8gPSBuZXdfbWVtX3N0YXJ0OwogICAgIG1lbS0+ZW5kXyA9IGN1cnJlbnRfc2l6ZTsKICAgfQogCi0gIFNiTWVtb3J5Q29weShtZW0tPmJ1Zl8gKyBtZW0tPmVuZF8sIGRhdGEsIGRhdGFfc2l6ZSk7CisgIG1lbWNweShtZW0tPmJ1Zl8gKyBtZW0tPmVuZF8sIGRhdGEsIGRhdGFfc2l6ZSk7CiAgIG1lbS0+ZW5kXyArPSBkYXRhX3NpemU7Ci0gIFNCX0RDSEVDSyhtZW0tPmVuZF8gPD0gbWVtLT5idWZfc2l6ZV8pOworICBhc3NlcnQobWVtLT5lbmRfIDw9IG1lbS0+YnVmX3NpemVfKTsKIAogICBEb1JlbWFwKGlkZWMsIG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfIC0gb2xkX3N0YXJ0KTsKICAgcmV0dXJuIDE7CkBAIC0yMDAsNyArMjEyLDcgQEAKICAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKICAgY29uc3QgdWludDhfdCogY29uc3Qgb2xkX2J1ZiA9IG1lbS0+YnVmXzsKICAgY29uc3QgdWludDhfdCogY29uc3Qgb2xkX3N0YXJ0ID0gb2xkX2J1ZiArIG1lbS0+c3RhcnRfOwotICBTQl9EQ0hFQ0sobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9NQVApOworICBhc3NlcnQobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9NQVApOwogCiAgIGlmIChkYXRhX3NpemUgPCBtZW0tPmJ1Zl9zaXplXykgcmV0dXJuIDA7ICAvLyBjYW4ndCByZW1hcCB0byBhIHNob3J0ZXIgYnVmZmVyIQogCkBAIC0yMjAsMTAgKzIzMiwxMCBAQAogfQogCiBzdGF0aWMgdm9pZCBDbGVhck1lbUJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgewotICBTQl9EQ0hFQ0sobWVtKTsKKyAgYXNzZXJ0KG1lbSk7CiAgIGlmIChtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShtZW0tPmJ1Zl8pOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSgodm9pZCopbWVtLT5wYXJ0MF9idWZfKTsKKyAgICBXZWJQU2FmZUZyZWUobWVtLT5idWZfKTsKKyAgICBXZWJQU2FmZUZyZWUoKHZvaWQqKW1lbS0+cGFydDBfYnVmXyk7CiAgIH0KIH0KIApAQCAtMjMzLDM5ICsyNDUsNDQgQEAKICAgfSBlbHNlIGlmIChtZW0tPm1vZGVfICE9IGV4cGVjdGVkKSB7CiAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gd2UgbWl4ZWQgdGhlIG1vZGVzID0+IGVycm9yCiAgIH0KLSAgU0JfRENIRUNLKG1lbS0+bW9kZV8gPT0gZXhwZWN0ZWQpOyAgIC8vIG1vZGUgaXMgb2sKKyAgYXNzZXJ0KG1lbS0+bW9kZV8gPT0gZXhwZWN0ZWQpOyAgIC8vIG1vZGUgaXMgb2sKICAgcmV0dXJuIDE7CiB9CiAKKy8vIFRvIGJlIGNhbGxlZCBsYXN0Lgorc3RhdGljIFZQOFN0YXR1c0NvZGUgRmluaXNoRGVjb2RpbmcoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucyA9IGlkZWMtPnBhcmFtc18ub3B0aW9uczsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gaWRlYy0+cGFyYW1zXy5vdXRwdXQ7CisKKyAgaWRlYy0+c3RhdGVfID0gU1RBVEVfRE9ORTsKKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5mbGlwKSB7CisgICAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBXZWJQRmxpcEJ1ZmZlcihvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgfQorICBpZiAoaWRlYy0+ZmluYWxfb3V0cHV0XyAhPSBOVUxMKSB7CisgICAgV2ViUENvcHlEZWNCdWZmZXJQaXhlbHMob3V0cHV0LCBpZGVjLT5maW5hbF9vdXRwdXRfKTsgIC8vIGRvIHRoZSBzbG93LWNvcHkKKyAgICBXZWJQRnJlZURlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7CisgICAgKm91dHB1dCA9ICppZGVjLT5maW5hbF9vdXRwdXRfOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBOVUxMOworICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWFjcm9ibG9jay1kZWNvZGluZyBjb250ZXh0cwogCiBzdGF0aWMgdm9pZCBTYXZlQ29udGV4dChjb25zdCBWUDhEZWNvZGVyKiBkZWMsIGNvbnN0IFZQOEJpdFJlYWRlciogdG9rZW5fYnIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNQkNvbnRleHQqIGNvbnN0IGNvbnRleHQpIHsKLSAgY29uc3QgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgY29uc3QgVlA4TUIqIGNvbnN0IGxlZnQgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgY29uc3QgVlA4TUIqIGNvbnN0IGluZm8gPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKLQotICBjb250ZXh0LT5sZWZ0XyA9ICpsZWZ0OwotICBjb250ZXh0LT5pbmZvXyA9ICppbmZvOwotICBjb250ZXh0LT5icl8gPSAqYnI7CisgIGNvbnRleHQtPmxlZnRfID0gZGVjLT5tYl9pbmZvX1stMV07CisgIGNvbnRleHQtPmluZm9fID0gZGVjLT5tYl9pbmZvX1tkZWMtPm1iX3hfXTsKICAgY29udGV4dC0+dG9rZW5fYnJfID0gKnRva2VuX2JyOwotICBTYk1lbW9yeUNvcHkoY29udGV4dC0+aW50cmFfdF8sIGRlYy0+aW50cmFfdF8gKyA0ICogZGVjLT5tYl94XywgNCk7Ci0gIFNiTWVtb3J5Q29weShjb250ZXh0LT5pbnRyYV9sXywgZGVjLT5pbnRyYV9sXywgNCk7CiB9CiAKIHN0YXRpYyB2b2lkIFJlc3RvcmVDb250ZXh0KGNvbnN0IE1CQ29udGV4dCogY29udGV4dCwgVlA4RGVjb2RlciogY29uc3QgZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgewotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOwotICBWUDhNQiogY29uc3QgaW5mbyA9IGRlYy0+bWJfaW5mb18gKyBkZWMtPm1iX3hfOwotCi0gICpsZWZ0ID0gY29udGV4dC0+bGVmdF87Ci0gICppbmZvID0gY29udGV4dC0+aW5mb187Ci0gICpiciA9IGNvbnRleHQtPmJyXzsKKyAgZGVjLT5tYl9pbmZvX1stMV0gPSBjb250ZXh0LT5sZWZ0XzsKKyAgZGVjLT5tYl9pbmZvX1tkZWMtPm1iX3hfXSA9IGNvbnRleHQtPmluZm9fOwogICAqdG9rZW5fYnIgPSBjb250ZXh0LT50b2tlbl9icl87Ci0gIFNiTWVtb3J5Q29weShkZWMtPmludHJhX3RfICsgNCAqIGRlYy0+bWJfeF8sIGNvbnRleHQtPmludHJhX3RfLCA0KTsKLSAgU2JNZW1vcnlDb3B5KGRlYy0+aW50cmFfbF8sIGNvbnRleHQtPmludHJhX2xfLCA0KTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI3Myw3ICsyOTAsNyBAQAogc3RhdGljIFZQOFN0YXR1c0NvZGUgSURlY0Vycm9yKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywgVlA4U3RhdHVzQ29kZSBlcnJvcikgewogICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9EQVRBKSB7CiAgICAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKLSAgICBpZiAoaW8tPnRlYXJkb3duKSB7CisgICAgaWYgKGlvLT50ZWFyZG93biAhPSBOVUxMKSB7CiAgICAgICBpby0+dGVhcmRvd24oaW8pOwogICAgIH0KICAgfQpAQCAtMjg2LDcgKzMwMyw3IEBACiAgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87CiAgIGlkZWMtPnN0YXRlXyA9IG5ld19zdGF0ZTsKICAgbWVtLT5zdGFydF8gKz0gY29uc3VtZWRfYnl0ZXM7Ci0gIFNCX0RDSEVDSyhtZW0tPnN0YXJ0XyA8PSBtZW0tPmVuZF8pOworICBhc3NlcnQobWVtLT5zdGFydF8gPD0gbWVtLT5lbmRfKTsKICAgaWRlYy0+aW9fLmRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKICAgaWRlYy0+aW9fLmRhdGFfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSk7CiB9CkBAIC0zMDEsNiArMzE4LDcgQEAKIAogICBoZWFkZXJzLmRhdGEgPSBkYXRhOwogICBoZWFkZXJzLmRhdGFfc2l6ZSA9IGN1cnJfc2l6ZTsKKyAgaGVhZGVycy5oYXZlX2FsbF9kYXRhID0gMDsKICAgc3RhdHVzID0gV2ViUFBhcnNlSGVhZGVycygmaGVhZGVycyk7CiAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAvLyBXZSBoYXZlbid0IGZvdW5kIGEgVlA4IGNodW5rIHlldC4KQEAgLTMxNiwxNSArMzM0LDkgQEAKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CiAgICAgfQogICAgIGlkZWMtPmRlY18gPSBkZWM7Ci0jaWZkZWYgV0VCUF9VU0VfVEhSRUFECi0gICAgZGVjLT51c2VfdGhyZWFkc18gPSAoaWRlYy0+cGFyYW1zXy5vcHRpb25zICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoaWRlYy0+cGFyYW1zXy5vcHRpb25zLT51c2VfdGhyZWFkcyA+IDApOwotI2Vsc2UKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IDA7Ci0jZW5kaWYKICAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOwogICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOwotICAgIENoYW5nZVN0YXRlKGlkZWMsIFNUQVRFX1ZQOF9GUkFNRV9IRUFERVIsIGhlYWRlcnMub2Zmc2V0KTsKKyAgICBDaGFuZ2VTdGF0ZShpZGVjLCBTVEFURV9WUDhfSEVBREVSLCBoZWFkZXJzLm9mZnNldCk7CiAgIH0gZWxzZSB7CiAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOExOZXcoKTsKICAgICBpZiAoZGVjID09IE5VTEwpIHsKQEAgLTMzOSwxMyArMzUxLDE0IEBACiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVWUDhGcmFtZUhlYWRlcihXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKICAgY29uc3QgdWludDhfdCogZGF0YSA9IGlkZWMtPm1lbV8uYnVmXyArIGlkZWMtPm1lbV8uc3RhcnRfOwogICBjb25zdCBzaXplX3QgY3Vycl9zaXplID0gTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pOworICBpbnQgd2lkdGgsIGhlaWdodDsKICAgdWludDMyX3QgYml0czsKIAogICBpZiAoY3Vycl9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7CiAgICAgLy8gTm90IGVub3VnaCBkYXRhIGJ5dGVzIHRvIGV4dHJhY3QgVlA4IEZyYW1lIEhlYWRlci4KICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CiAgIH0KLSAgaWYgKCFWUDhHZXRJbmZvKGRhdGEsIGN1cnJfc2l6ZSwgaWRlYy0+Y2h1bmtfc2l6ZV8sIE5VTEwsIE5VTEwpKSB7CisgIGlmICghVlA4R2V0SW5mbyhkYXRhLCBjdXJyX3NpemUsIGlkZWMtPmNodW5rX3NpemVfLCAmd2lkdGgsICZoZWlnaHQpKSB7CiAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CiAgIH0KIApAQCAtMzY0LDIzICszNzcsMjIgQEAKICAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKICAgY29uc3Qgc2l6ZV90IHBhcnRfc2l6ZSA9IGJyLT5idWZfZW5kXyAtIGJyLT5idWZfOwogICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOwotICBTQl9EQ0hFQ0soIWlkZWMtPmlzX2xvc3NsZXNzXyk7Ci0gIFNCX0RDSEVDSyhtZW0tPnBhcnQwX2J1Zl8gPT0gTlVMTCk7CisgIGFzc2VydCghaWRlYy0+aXNfbG9zc2xlc3NfKTsKKyAgYXNzZXJ0KG1lbS0+cGFydDBfYnVmXyA9PSBOVUxMKTsKICAgLy8gdGhlIGZvbGxvd2luZyBpcyBhIGZvcm1hdCBsaW1pdGF0aW9uLCBubyBuZWVkIGZvciBydW50aW1lIGNoZWNrOgotICBTQl9EQ0hFQ0socGFydF9zaXplIDw9IG1lbS0+cGFydDBfc2l6ZV8pOworICBhc3NlcnQocGFydF9zaXplIDw9IG1lbS0+cGFydDBfc2l6ZV8pOwogICBpZiAocGFydF9zaXplID09IDApIHsgICAvLyBjYW4ndCBoYXZlIHplcm8tc2l6ZSBwYXJ0aXRpb24gIzAKICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CiAgIH0KICAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfQVBQRU5EKSB7CiAgICAgLy8gV2UgY29weSBhbmQgZ3JhYiBvd25lcnNoaXAgb2YgdGhlIHBhcnRpdGlvbiAjMCBkYXRhLgotICAgIHVpbnQ4X3QqIGNvbnN0IHBhcnQwX2J1ZiA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKHBhcnRfc2l6ZSk7CisgICAgdWludDhfdCogY29uc3QgcGFydDBfYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHBhcnRfc2l6ZSk7CiAgICAgaWYgKHBhcnQwX2J1ZiA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwogICAgIH0KLSAgICBTYk1lbW9yeUNvcHkocGFydDBfYnVmLCBici0+YnVmXywgcGFydF9zaXplKTsKKyAgICBtZW1jcHkocGFydDBfYnVmLCBici0+YnVmXywgcGFydF9zaXplKTsKICAgICBtZW0tPnBhcnQwX2J1Zl8gPSBwYXJ0MF9idWY7Ci0gICAgYnItPmJ1Zl8gPSBwYXJ0MF9idWY7Ci0gICAgYnItPmJ1Zl9lbmRfID0gcGFydDBfYnVmICsgcGFydF9zaXplOworICAgIFZQOEJpdFJlYWRlclNldEJ1ZmZlcihiciwgcGFydDBfYnVmLCBwYXJ0X3NpemUpOwogICB9IGVsc2UgewogICAgIC8vIEVsc2U6IGp1c3Qga2VlcCBwb2ludGVycyB0byB0aGUgcGFydGl0aW9uICMwJ3MgZGF0YSBpbiBkZWNfLT5icl8uCiAgIH0KQEAgLTQxNSw2ICs0MjcsMTAgQEAKICAgaWYgKGRlYy0+c3RhdHVzXyAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBkZWMtPnN0YXR1c18pOwogICB9CisgIC8vIFRoaXMgY2hhbmdlIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBWUDhJbml0RnJhbWUoKQorICBkZWMtPm10X21ldGhvZF8gPSBWUDhHZXRUaHJlYWRNZXRob2QocGFyYW1zLT5vcHRpb25zLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPndpZHRoLCBpby0+aGVpZ2h0KTsKKyAgVlA4SW5pdERpdGhlcmluZyhwYXJhbXMtPm9wdGlvbnMsIGRlYyk7CiAKICAgZGVjLT5zdGF0dXNfID0gQ29weVBhcnRzMERhdGEoaWRlYyk7CiAgIGlmIChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSykgewpAQCAtNDQxLDUwICs0NTcsNTQgQEAKICAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187CiAgIFZQOElvKiBjb25zdCBpbyA9ICZpZGVjLT5pb187CiAKLSAgU0JfRENIRUNLKGRlYy0+cmVhZHlfKTsKLQorICBhc3NlcnQoZGVjLT5yZWFkeV8pOwogICBmb3IgKDsgZGVjLT5tYl95XyA8IGRlYy0+bWJfaF87ICsrZGVjLT5tYl95XykgewotICAgIFZQOEJpdFJlYWRlciogdG9rZW5fYnIgPSAmZGVjLT5wYXJ0c19bZGVjLT5tYl95XyAmIChkZWMtPm51bV9wYXJ0c18gLSAxKV07Ci0gICAgaWYgKGRlYy0+bWJfeF8gPT0gMCkgewotICAgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7CisgICAgaWYgKGlkZWMtPmxhc3RfbWJfeV8gIT0gZGVjLT5tYl95XykgeworICAgICAgaWYgKCFWUDhQYXJzZUludHJhTW9kZVJvdygmZGVjLT5icl8sIGRlYykpIHsKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsbHksIGVycm9yIHNob3VsZG4ndCBvY2N1ciBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIHdob2xlCisgICAgICAgIC8vIHBhcnRpdGlvbjAgYXZhaWxhYmxlIGhlcmUgaW4gRGVjb2RlUmVtYWluaW5nKCkuIFJlYWNoaW5nIEVPRiB3aGlsZQorICAgICAgICAvLyByZWFkaW5nIGludHJhIG1vZGVzIHJlYWxseSBtZWFucyBhIEJJVFNUUkVBTV9FUlJPUi4KKyAgICAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CisgICAgICB9CisgICAgICBpZGVjLT5sYXN0X21iX3lfID0gZGVjLT5tYl95XzsKICAgICB9Ci0gICAgZm9yICg7IGRlYy0+bWJfeF8gPCBkZWMtPm1iX3dfOyAgZGVjLT5tYl94XysrKSB7CisgICAgZm9yICg7IGRlYy0+bWJfeF8gPCBkZWMtPm1iX3dfOyArK2RlYy0+bWJfeF8pIHsKKyAgICAgIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIgPQorICAgICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgZGVjLT5udW1fcGFydHNfbWludXNfb25lX107CiAgICAgICBNQkNvbnRleHQgY29udGV4dDsKICAgICAgIFNhdmVDb250ZXh0KGRlYywgdG9rZW5fYnIsICZjb250ZXh0KTsKLQogICAgICAgaWYgKCFWUDhEZWNvZGVNQihkZWMsIHRva2VuX2JyKSkgewotICAgICAgICBSZXN0b3JlQ29udGV4dCgmY29udGV4dCwgZGVjLCB0b2tlbl9icik7CiAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBmYWlsIHdoZW4gTUFYX01CIGRhdGEgd2FzIGF2YWlsYWJsZQotICAgICAgICBpZiAoZGVjLT5udW1fcGFydHNfID09IDEgJiYgTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pID4gTUFYX01CX1NJWkUpIHsKKyAgICAgICAgaWYgKGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPT0gMCAmJgorICAgICAgICAgICAgTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pID4gTUFYX01CX1NJWkUpIHsKICAgICAgICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SKTsKICAgICAgICAgfQorICAgICAgICBSZXN0b3JlQ29udGV4dCgmY29udGV4dCwgZGVjLCB0b2tlbl9icik7CiAgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKICAgICAgIH0KLSAgICAgIC8vIFJlY29uc3RydWN0IGFuZCBlbWl0IHNhbXBsZXMuCi0gICAgICBWUDhSZWNvbnN0cnVjdEJsb2NrKGRlYyk7Ci0KICAgICAgIC8vIFJlbGVhc2UgYnVmZmVyIG9ubHkgaWYgdGhlcmUgaXMgb25seSBvbmUgcGFydGl0aW9uCi0gICAgICBpZiAoZGVjLT5udW1fcGFydHNfID09IDEpIHsKKyAgICAgIGlmIChkZWMtPm51bV9wYXJ0c19taW51c19vbmVfID09IDApIHsKICAgICAgICAgaWRlYy0+bWVtXy5zdGFydF8gPSB0b2tlbl9ici0+YnVmXyAtIGlkZWMtPm1lbV8uYnVmXzsKLSAgICAgICAgU0JfRENIRUNLKGlkZWMtPm1lbV8uc3RhcnRfIDw9IGlkZWMtPm1lbV8uZW5kXyk7CisgICAgICAgIGFzc2VydChpZGVjLT5tZW1fLnN0YXJ0XyA8PSBpZGVjLT5tZW1fLmVuZF8pOwogICAgICAgfQogICAgIH0KKyAgICBWUDhJbml0U2NhbmxpbmUoZGVjKTsgICAvLyBQcmVwYXJlIGZvciBuZXh0IHNjYW5saW5lCisKKyAgICAvLyBSZWNvbnN0cnVjdCwgZmlsdGVyIGFuZCBlbWl0IHRoZSByb3cuCiAgICAgaWYgKCFWUDhQcm9jZXNzUm93KGRlYywgaW8pKSB7CiAgICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCk7CiAgICAgfQotICAgIGRlYy0+bWJfeF8gPSAwOwogICB9CiAgIC8vIFN5bmNocm9uaXplIHRoZSB0aHJlYWQgYW5kIGNoZWNrIGZvciBlcnJvcnMuCiAgIGlmICghVlA4RXhpdENyaXRpY2FsKGRlYywgaW8pKSB7CiAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX1VTRVJfQUJPUlQpOwogICB9CiAgIGRlYy0+cmVhZHlfID0gMDsKLSAgaWRlYy0+c3RhdGVfID0gU1RBVEVfRE9ORTsKLQotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKKyAgcmV0dXJuIEZpbmlzaERlY29kaW5nKGlkZWMpOwogfQogCi1zdGF0aWMgaW50IEVycm9yU3RhdHVzTG9zc2xlc3MoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLCBWUDhTdGF0dXNDb2RlIHN0YXR1cykgeworc3RhdGljIFZQOFN0YXR1c0NvZGUgRXJyb3JTdGF0dXNMb3NzbGVzcyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzKSB7CiAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQgfHwgc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7CiAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOwogICB9CkBAIC00OTcsMTMgKzUxNywxOSBAQAogICBjb25zdCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMgPSAmaWRlYy0+cGFyYW1zXzsKICAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gcGFyYW1zLT5vdXRwdXQ7CiAgIHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXyk7Ci0gIFNCX0RDSEVDSyhpZGVjLT5pc19sb3NzbGVzc18pOworICBhc3NlcnQoaWRlYy0+aXNfbG9zc2xlc3NfKTsKIAogICAvLyBXYWl0IHVudGlsIHRoZXJlJ3MgZW5vdWdoIGRhdGEgZm9yIGRlY29kaW5nIGhlYWRlci4KICAgaWYgKGN1cnJfc2l6ZSA8IChpZGVjLT5jaHVua19zaXplXyA+PiAzKSkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICByZXR1cm4gRXJyb3JTdGF0dXNMb3NzbGVzcyhpZGVjLCBkZWMtPnN0YXR1c18pOwogICB9CisKICAgaWYgKCFWUDhMRGVjb2RlSGVhZGVyKGRlYywgaW8pKSB7CisgICAgaWYgKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiAmJgorICAgICAgICBjdXJyX3NpemUgPCBpZGVjLT5jaHVua19zaXplXykgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CisgICAgfQogICAgIHJldHVybiBFcnJvclN0YXR1c0xvc3NsZXNzKGlkZWMsIGRlYy0+c3RhdHVzXyk7CiAgIH0KICAgLy8gQWxsb2NhdGUvdmVyaWZ5IG91dHB1dCBidWZmZXIgbm93LgpAQCAtNTIwLDM1ICs1NDYsMzEgQEAKIHN0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVZQOExEYXRhKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewogICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOwogICBjb25zdCBzaXplX3QgY3Vycl9zaXplID0gTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pOwotICBTQl9EQ0hFQ0soaWRlYy0+aXNfbG9zc2xlc3NfKTsKKyAgYXNzZXJ0KGlkZWMtPmlzX2xvc3NsZXNzXyk7CiAKLSAgLy8gQXQgcHJlc2VudCBMb3NzbGVzcyBkZWNvZGVyIGNhbid0IGRlY29kZSBpbWFnZSBpbmNyZW1lbnRhbGx5LiBTbyB3YWl0IHRpbGwKLSAgLy8gYWxsIHRoZSBpbWFnZSBkYXRhIGlzIGFnZ3JlZ2F0ZWQgYmVmb3JlIGltYWdlIGNhbiBiZSBkZWNvZGVkLgotICBpZiAoY3Vycl9zaXplIDwgaWRlYy0+Y2h1bmtfc2l6ZV8pIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gIH0KKyAgLy8gU3dpdGNoIHRvIGluY3JlbWVudGFsIGRlY29kaW5nIGlmIHdlIGRvbid0IGhhdmUgYWxsIHRoZSBieXRlcyBhdmFpbGFibGUuCisgIGRlYy0+aW5jcmVtZW50YWxfID0gKGN1cnJfc2l6ZSA8IGlkZWMtPmNodW5rX3NpemVfKTsKIAogICBpZiAoIVZQOExEZWNvZGVJbWFnZShkZWMpKSB7CiAgICAgcmV0dXJuIEVycm9yU3RhdHVzTG9zc2xlc3MoaWRlYywgZGVjLT5zdGF0dXNfKTsKICAgfQotCi0gIGlkZWMtPnN0YXRlXyA9IFNUQVRFX0RPTkU7Ci0KLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7CisgIGFzc2VydChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19PSyB8fCBkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpOworICByZXR1cm4gKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgPyBkZWMtPnN0YXR1c18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmluaXNoRGVjb2RpbmcoaWRlYyk7CiB9CiAKICAgLy8gTWFpbiBkZWNvZGluZyBsb29wCiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjb2RlKFdlYlBJRGVjb2RlciogaWRlYykgewogICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOwogCi0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfUFJFX1ZQOCkgeworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1dFQlBfSEVBREVSKSB7CiAgICAgc3RhdHVzID0gRGVjb2RlV2ViUEhlYWRlcnMoaWRlYyk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKGlkZWMtPmRlY18gPT0gTlVMTCkgewogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgICAvLyBjYW4ndCBjb250aW51ZSBpZiB3ZSBoYXZlIG5vIGRlY29kZXIuCiAgICAgfQogICB9Ci0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0ZSQU1FX0hFQURFUikgeworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9IRUFERVIpIHsKICAgICBzdGF0dXMgPSBEZWNvZGVWUDhGcmFtZUhlYWRlcihpZGVjKTsKICAgfQogICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9QQVJUUzApIHsKQEAgLTU2Nyw0MCArNTg5LDY1IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdWJsaWMgZnVuY3Rpb25zCisvLyBJbnRlcm5hbCBjb25zdHJ1Y3RvcgogCi1XZWJQSURlY29kZXIqIFdlYlBJTmV3RGVjb2RlcihXZWJQRGVjQnVmZmVyKiBvdXRwdXRfYnVmZmVyKSB7Ci0gIFdlYlBJRGVjb2RlciogaWRlYyA9IChXZWJQSURlY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqaWRlYykpOworc3RhdGljIFdlYlBJRGVjb2RlciogTmV3RGVjb2RlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGZlYXR1cmVzKSB7CisgIFdlYlBJRGVjb2RlciogaWRlYyA9IChXZWJQSURlY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqaWRlYykpOwogICBpZiAoaWRlYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9QUkVfVlA4OworICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9XRUJQX0hFQURFUjsKICAgaWRlYy0+Y2h1bmtfc2l6ZV8gPSAwOwogCisgIGlkZWMtPmxhc3RfbWJfeV8gPSAtMTsKKwogICBJbml0TWVtQnVmZmVyKCZpZGVjLT5tZW1fKTsKICAgV2ViUEluaXREZWNCdWZmZXIoJmlkZWMtPm91dHB1dF8pOwogICBWUDhJbml0SW8oJmlkZWMtPmlvXyk7CiAKICAgV2ViUFJlc2V0RGVjUGFyYW1zKCZpZGVjLT5wYXJhbXNfKTsKLSAgaWRlYy0+cGFyYW1zXy5vdXRwdXQgPSBvdXRwdXRfYnVmZmVyID8gb3V0cHV0X2J1ZmZlciA6ICZpZGVjLT5vdXRwdXRfOworICBpZiAob3V0cHV0X2J1ZmZlciA9PSBOVUxMIHx8IFdlYlBBdm9pZFNsb3dNZW1vcnkob3V0cHV0X2J1ZmZlciwgZmVhdHVyZXMpKSB7CisgICAgaWRlYy0+cGFyYW1zXy5vdXRwdXQgPSAmaWRlYy0+b3V0cHV0XzsKKyAgICBpZGVjLT5maW5hbF9vdXRwdXRfID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBpZiAob3V0cHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICBpZGVjLT5wYXJhbXNfLm91dHB1dC0+Y29sb3JzcGFjZSA9IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlkZWMtPnBhcmFtc18ub3V0cHV0ID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBpZGVjLT5maW5hbF9vdXRwdXRfID0gTlVMTDsKKyAgfQogICBXZWJQSW5pdEN1c3RvbUlvKCZpZGVjLT5wYXJhbXNfLCAmaWRlYy0+aW9fKTsgIC8vIFBsdWcgdGhlIEkvTyBmdW5jdGlvbnMuCiAKICAgcmV0dXJuIGlkZWM7CiB9CiAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdWJsaWMgZnVuY3Rpb25zCisKK1dlYlBJRGVjb2RlciogV2ViUElOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIG91dHB1dF9idWZmZXIpIHsKKyAgcmV0dXJuIE5ld0RlY29kZXIob3V0cHV0X2J1ZmZlciwgTlVMTCk7Cit9CisKIFdlYlBJRGVjb2RlciogV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZykgewogICBXZWJQSURlY29kZXIqIGlkZWM7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyB0bXBfZmVhdHVyZXM7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMgPQorICAgICAgKGNvbmZpZyA9PSBOVUxMKSA/ICZ0bXBfZmVhdHVyZXMgOiAmY29uZmlnLT5pbnB1dDsKKyAgbWVtc2V0KCZ0bXBfZmVhdHVyZXMsIDAsIHNpemVvZih0bXBfZmVhdHVyZXMpKTsKIAogICAvLyBQYXJzZSB0aGUgYml0c3RyZWFtJ3MgZmVhdHVyZXMsIGlmIHJlcXVlc3RlZDoKLSAgaWYgKGRhdGEgIT0gTlVMTCAmJiBkYXRhX3NpemUgPiAwICYmIGNvbmZpZyAhPSBOVUxMKSB7Ci0gICAgaWYgKFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsICZjb25maWctPmlucHV0KSAhPSBWUDhfU1RBVFVTX09LKSB7CisgIGlmIChkYXRhICE9IE5VTEwgJiYgZGF0YV9zaXplID4gMCkgeworICAgIGlmIChXZWJQR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCBmZWF0dXJlcykgIT0gVlA4X1NUQVRVU19PSykgewogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICB9CisKICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyCi0gIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoY29uZmlnID8gJmNvbmZpZy0+b3V0cHV0IDogTlVMTCk7CisgIGlkZWMgPSAoY29uZmlnICE9IE5VTEwpID8gTmV3RGVjb2RlcigmY29uZmlnLT5vdXRwdXQsIGZlYXR1cmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5ld0RlY29kZXIoTlVMTCwgZmVhdHVyZXMpOwogICBpZiAoaWRlYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KQEAgLTYxNSwyNiArNjYyLDMwIEBACiAgIGlmIChpZGVjID09IE5VTEwpIHJldHVybjsKICAgaWYgKGlkZWMtPmRlY18gIT0gTlVMTCkgewogICAgIGlmICghaWRlYy0+aXNfbG9zc2xlc3NfKSB7Ci0gICAgICBWUDhEZWxldGUoaWRlYy0+ZGVjXyk7CisgICAgICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9EQVRBKSB7CisgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSB0aHJlYWQsIGNsZWFuLXVwIGFuZCBjaGVjayBmb3IgZXJyb3JzLgorICAgICAgICBWUDhFeGl0Q3JpdGljYWwoKFZQOERlY29kZXIqKWlkZWMtPmRlY18sICZpZGVjLT5pb18pOworICAgICAgfQorICAgICAgVlA4RGVsZXRlKChWUDhEZWNvZGVyKilpZGVjLT5kZWNfKTsKICAgICB9IGVsc2UgewotICAgICAgVlA4TERlbGV0ZShpZGVjLT5kZWNfKTsKKyAgICAgIFZQOExEZWxldGUoKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfKTsKICAgICB9CiAgIH0KICAgQ2xlYXJNZW1CdWZmZXIoJmlkZWMtPm1lbV8pOwogICBXZWJQRnJlZURlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShpZGVjKTsKKyAgV2ViUFNhZmVGcmVlKGlkZWMpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gV3JhcHBlciB0b3dhcmQgV2ViUElOZXdEZWNvZGVyCiAKLVdlYlBJRGVjb2RlciogV2ViUElOZXdSR0IoV0VCUF9DU1BfTU9ERSBtb2RlLCB1aW50OF90KiBvdXRwdXRfYnVmZmVyLAorV2ViUElEZWNvZGVyKiBXZWJQSU5ld1JHQihXRUJQX0NTUF9NT0RFIGNzcCwgdWludDhfdCogb3V0cHV0X2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpIHsKLSAgY29uc3QgaW50IGlzX2V4dGVybmFsX21lbW9yeSA9IChvdXRwdXRfYnVmZmVyICE9IE5VTEwpOworICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKG91dHB1dF9idWZmZXIgIT0gTlVMTCkgPyAxIDogMDsKICAgV2ViUElEZWNvZGVyKiBpZGVjOwogCi0gIGlmIChtb2RlID49IE1PREVfWVVWKSByZXR1cm4gTlVMTDsKLSAgaWYgKCFpc19leHRlcm5hbF9tZW1vcnkpIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCisgIGlmIChjc3AgPj0gTU9ERV9ZVVYpIHJldHVybiBOVUxMOworICBpZiAoaXNfZXh0ZXJuYWxfbWVtb3J5ID09IDApIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCiAgICAgb3V0cHV0X2J1ZmZlcl9zaXplID0gMDsKICAgICBvdXRwdXRfc3RyaWRlID0gMDsKICAgfSBlbHNlIHsgIC8vIEEgYnVmZmVyIHdhcyBwYXNzZWQuIFZhbGlkYXRlIHRoZSBvdGhlciBwYXJhbXMuCkBAIC02NDQsNyArNjk1LDcgQEAKICAgfQogICBpZGVjID0gV2ViUElOZXdEZWNvZGVyKE5VTEwpOwogICBpZiAoaWRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgaWRlYy0+b3V0cHV0Xy5jb2xvcnNwYWNlID0gbW9kZTsKKyAgaWRlYy0+b3V0cHV0Xy5jb2xvcnNwYWNlID0gY3NwOwogICBpZGVjLT5vdXRwdXRfLmlzX2V4dGVybmFsX21lbW9yeSA9IGlzX2V4dGVybmFsX21lbW9yeTsKICAgaWRlYy0+b3V0cHV0Xy51LlJHQkEucmdiYSA9IG91dHB1dF9idWZmZXI7CiAgIGlkZWMtPm91dHB1dF8udS5SR0JBLnN0cmlkZSA9IG91dHB1dF9zdHJpZGU7CkBAIC02NTYsMTEgKzcwNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdiwgc2l6ZV90IHZfc2l6ZSwgaW50IHZfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYSwgc2l6ZV90IGFfc2l6ZSwgaW50IGFfc3RyaWRlKSB7Ci0gIGNvbnN0IGludCBpc19leHRlcm5hbF9tZW1vcnkgPSAobHVtYSAhPSBOVUxMKTsKKyAgY29uc3QgaW50IGlzX2V4dGVybmFsX21lbW9yeSA9IChsdW1hICE9IE5VTEwpID8gMSA6IDA7CiAgIFdlYlBJRGVjb2RlciogaWRlYzsKICAgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlOwogCi0gIGlmICghaXNfZXh0ZXJuYWxfbWVtb3J5KSB7ICAgIC8vIE92ZXJ3cml0ZSBwYXJhbWV0ZXJzIHRvIHNhbmUgdmFsdWVzLgorICBpZiAoaXNfZXh0ZXJuYWxfbWVtb3J5ID09IDApIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCiAgICAgbHVtYV9zaXplID0gdV9zaXplID0gdl9zaXplID0gYV9zaXplID0gMDsKICAgICBsdW1hX3N0cmlkZSA9IHVfc3RyaWRlID0gdl9zdHJpZGUgPSBhX3N0cmlkZSA9IDA7CiAgICAgdSA9IHYgPSBhID0gTlVMTDsKQEAgLTcwNyw3ICs3NTgsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIFZQOFN0YXR1c0NvZGUgSURlY0NoZWNrU3RhdHVzKGNvbnN0IFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewotICBTQl9EQ0hFQ0soaWRlYyk7CisgIGFzc2VydChpZGVjKTsKICAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9FUlJPUikgewogICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgfQpAQCAtNzY4LDYgKzgxOSw5IEBACiAgIGlmIChpZGVjLT5zdGF0ZV8gPD0gU1RBVEVfVlA4X1BBUlRTMCkgewogICAgIHJldHVybiBOVUxMOwogICB9CisgIGlmIChpZGVjLT5maW5hbF9vdXRwdXRfICE9IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsgICAvLyBub3QgeWV0IHNsb3ctY29waWVkCisgIH0KICAgcmV0dXJuIGlkZWMtPnBhcmFtc18ub3V0cHV0OwogfQogCkBAIC03NzcsOCArODMxLDcgQEAKICAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjID0gR2V0T3V0cHV0QnVmZmVyKGlkZWMpOwogICBpZiAobGVmdCAhPSBOVUxMKSAqbGVmdCA9IDA7CiAgIGlmICh0b3AgIT0gTlVMTCkgKnRvcCA9IDA7Ci0gIC8vIFRPRE8oc2thbCk6IGxhdGVyIGluY2x1ZGUgaGFuZGxpbmcgb2Ygcm90YXRpb25zLgotICBpZiAoc3JjKSB7CisgIGlmIChzcmMgIT0gTlVMTCkgewogICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBzcmMtPndpZHRoOwogICAgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IGlkZWMtPnBhcmFtc18ubGFzdF95OwogICB9IGVsc2UgewpAQCAtODMyLDcgKzg4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIFZQOElvU2V0dXBIb29rIHNldHVwLAogICAgICAgICAgICAgICAgICAgICBWUDhJb1RlYXJkb3duSG9vayB0ZWFyZG93biwKICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKSB7Ci0gIGlmIChpZGVjID09IE5VTEwgfHwgaWRlYy0+c3RhdGVfID4gU1RBVEVfUFJFX1ZQOCkgeworICBpZiAoaWRlYyA9PSBOVUxMIHx8IGlkZWMtPnN0YXRlXyA+IFNUQVRFX1dFQlBfSEVBREVSKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtODQzLDcgKzg5NiwzIEBACiAKICAgcmV0dXJuIDE7CiB9Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lvLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lvX2RlYy5jCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9pby5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lvX2RlYy5jCmluZGV4IDYwYTY4NjUuLmRhOWU1NWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9pby5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaW9fZGVjLmMKQEAgLTEyLDIxICsxMiwxOCBAQAogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAjZWxzZQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2VuZGlmCi0KLSNpbmNsdWRlICIuLi9kZWMvdnA4aS5oIgotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi9kc3AvZHNwLmgiCi0jaW5jbHVkZSAiLi4vZHNwL3l1di5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBNYWluIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucwpAQCAtNDMsNjggKzQwLDI4IEBACiAgIGNvbnN0IGludCB1dl9oID0gKG1iX2ggKyAxKSAvIDI7CiAgIGludCBqOwogICBmb3IgKGogPSAwOyBqIDwgbWJfaDsgKytqKSB7Ci0gICAgU2JNZW1vcnlDb3B5KHlfZHN0ICsgaiAqIGJ1Zi0+eV9zdHJpZGUsIGlvLT55ICsgaiAqIGlvLT55X3N0cmlkZSwgbWJfdyk7CisgICAgbWVtY3B5KHlfZHN0ICsgaiAqIGJ1Zi0+eV9zdHJpZGUsIGlvLT55ICsgaiAqIGlvLT55X3N0cmlkZSwgbWJfdyk7CiAgIH0KICAgZm9yIChqID0gMDsgaiA8IHV2X2g7ICsraikgewotICAgIFNiTWVtb3J5Q29weSh1X2RzdCArIGogKiBidWYtPnVfc3RyaWRlLCBpby0+dSArIGogKiBpby0+dXZfc3RyaWRlLCB1dl93KTsKLSAgICBTYk1lbW9yeUNvcHkodl9kc3QgKyBqICogYnVmLT52X3N0cmlkZSwgaW8tPnYgKyBqICogaW8tPnV2X3N0cmlkZSwgdXZfdyk7CisgICAgbWVtY3B5KHVfZHN0ICsgaiAqIGJ1Zi0+dV9zdHJpZGUsIGlvLT51ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOworICAgIG1lbWNweSh2X2RzdCArIGogKiBidWYtPnZfc3RyaWRlLCBpby0+diArIGogKiBpby0+dXZfc3RyaWRlLCB1dl93KTsKICAgfQogICByZXR1cm4gaW8tPm1iX2g7CiB9CiAKIC8vIFBvaW50LXNhbXBsaW5nIFUvViBzYW1wbGVyLgogc3RhdGljIGludCBFbWl0U2FtcGxlZFJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKLSAgV2ViUERlY0J1ZmZlciogb3V0cHV0ID0gcC0+b3V0cHV0OwotICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOwotICB1aW50OF90KiBkc3QgPSBidWYtPnJnYmEgKyBpby0+bWJfeSAqIGJ1Zi0+c3RyaWRlOwotICBjb25zdCB1aW50OF90KiB5X3NyYyA9IGlvLT55OwotICBjb25zdCB1aW50OF90KiB1X3NyYyA9IGlvLT51OwotICBjb25zdCB1aW50OF90KiB2X3NyYyA9IGlvLT52OwotICBjb25zdCBXZWJQU2FtcGxlTGluZVBhaXJGdW5jIHNhbXBsZSA9IFdlYlBTYW1wbGVyc1tvdXRwdXQtPmNvbG9yc3BhY2VdOwotICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwotICBjb25zdCBpbnQgbGFzdCA9IGlvLT5tYl9oIC0gMTsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCBsYXN0OyBqICs9IDIpIHsKLSAgICBzYW1wbGUoeV9zcmMsIHlfc3JjICsgaW8tPnlfc3RyaWRlLCB1X3NyYywgdl9zcmMsCi0gICAgICAgICAgIGRzdCwgZHN0ICsgYnVmLT5zdHJpZGUsIG1iX3cpOwotICAgIHlfc3JjICs9IDIgKiBpby0+eV9zdHJpZGU7Ci0gICAgdV9zcmMgKz0gaW8tPnV2X3N0cmlkZTsKLSAgICB2X3NyYyArPSBpby0+dXZfc3RyaWRlOwotICAgIGRzdCArPSAyICogYnVmLT5zdHJpZGU7Ci0gIH0KLSAgaWYgKGogPT0gbGFzdCkgeyAgLy8gSnVzdCBkbyB0aGUgbGFzdCBsaW5lIHR3aWNlCi0gICAgc2FtcGxlKHlfc3JjLCB5X3NyYywgdV9zcmMsIHZfc3JjLCBkc3QsIGRzdCwgbWJfdyk7Ci0gIH0KKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gcC0+b3V0cHV0OworICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOworICB1aW50OF90KiBjb25zdCBkc3QgPSBidWYtPnJnYmEgKyBpby0+bWJfeSAqIGJ1Zi0+c3RyaWRlOworICBXZWJQU2FtcGxlclByb2Nlc3NQbGFuZShpby0+eSwgaW8tPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+dSwgaW8tPnYsIGlvLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgYnVmLT5zdHJpZGUsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFNhbXBsZXJzW291dHB1dC0+Y29sb3JzcGFjZV0pOwogICByZXR1cm4gaW8tPm1iX2g7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBZVVY0NDQgLT4gUkdCIGNvbnZlcnNpb24KLQotI2lmIDAgICAvLyBUT0RPKHNrYWwpOiB0aGlzIGlzIGZvciBmdXR1cmUgcmVzY2FsaW5nLgotc3RhdGljIGludCBFbWl0UkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQgPSBwLT5vdXRwdXQ7Ci0gIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHlfc3JjID0gaW8tPnk7Ci0gIGNvbnN0IHVpbnQ4X3QqIHVfc3JjID0gaW8tPnU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHZfc3JjID0gaW8tPnY7Ci0gIGNvbnN0IFdlYlBZVVY0NDRDb252ZXJ0ZXIgY29udmVydCA9IFdlYlBZVVY0NDRDb252ZXJ0ZXJzW291dHB1dC0+Y29sb3JzcGFjZV07Ci0gIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gIGNvbnN0IGludCBsYXN0ID0gaW8tPm1iX2g7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgbGFzdDsgKytqKSB7Ci0gICAgY29udmVydCh5X3NyYywgdV9zcmMsIHZfc3JjLCBkc3QsIG1iX3cpOwotICAgIHlfc3JjICs9IGlvLT55X3N0cmlkZTsKLSAgICB1X3NyYyArPSBpby0+dXZfc3RyaWRlOwotICAgIHZfc3JjICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgZHN0ICs9IGJ1Zi0+c3RyaWRlOwotICB9Ci0gIHJldHVybiBpby0+bWJfaDsKLX0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRmFuY3kgdXBzYW1wbGluZwogCiAjaWZkZWYgRkFOQ1lfVVBTQU1QTElORwpAQCAtMTI1LDcgKzgyLDcgQEAKIAogICBpZiAoeSA9PSAwKSB7CiAgICAgLy8gRmlyc3QgbGluZSBpcyBzcGVjaWFsIGNhc2VkLiBXZSBtaXJyb3IgdGhlIHUvdiBzYW1wbGVzIGF0IGJvdW5kYXJ5LgotICAgIHVwc2FtcGxlKE5VTEwsIGN1cl95LCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgTlVMTCwgZHN0LCBtYl93KTsKKyAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIGRzdCwgTlVMTCwgbWJfdyk7CiAgIH0gZWxzZSB7CiAgICAgLy8gV2UgY2FuIGZpbmlzaCB0aGUgbGVmdC1vdmVyIGxpbmUgZnJvbSBwcmV2aW91cyBjYWxsLgogICAgIHVwc2FtcGxlKHAtPnRtcF95LCBjdXJfeSwgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCkBAIC0xNDgsOSArMTA1LDkgQEAKICAgY3VyX3kgKz0gaW8tPnlfc3RyaWRlOwogICBpZiAoaW8tPmNyb3BfdG9wICsgeV9lbmQgPCBpby0+Y3JvcF9ib3R0b20pIHsKICAgICAvLyBTYXZlIHRoZSB1bmZpbmlzaGVkIHNhbXBsZXMgZm9yIG5leHQgY2FsbCAoYXMgd2UncmUgbm90IGRvbmUgeWV0KS4KLSAgICBTYk1lbW9yeUNvcHkocC0+dG1wX3ksIGN1cl95LCBtYl93ICogc2l6ZW9mKCpwLT50bXBfeSkpOwotICAgIFNiTWVtb3J5Q29weShwLT50bXBfdSwgY3VyX3UsIHV2X3cgKiBzaXplb2YoKnAtPnRtcF91KSk7Ci0gICAgU2JNZW1vcnlDb3B5KHAtPnRtcF92LCBjdXJfdiwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3YpKTsKKyAgICBtZW1jcHkocC0+dG1wX3ksIGN1cl95LCBtYl93ICogc2l6ZW9mKCpwLT50bXBfeSkpOworICAgIG1lbWNweShwLT50bXBfdSwgY3VyX3UsIHV2X3cgKiBzaXplb2YoKnAtPnRtcF91KSk7CisgICAgbWVtY3B5KHAtPnRtcF92LCBjdXJfdiwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3YpKTsKICAgICAvLyBUaGUgZmFuY3kgdXBzYW1wbGVyIGxlYXZlcyBhIHJvdyB1bmZpbmlzaGVkIGJlaGluZAogICAgIC8vIChleGNlcHQgZm9yIHRoZSB2ZXJ5IGxhc3Qgcm93KQogICAgIG51bV9saW5lc19vdXQtLTsKQEAgLTE2OCwyNiArMTI1LDMzIEBACiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBpbnQgRW1pdEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworc3RhdGljIHZvaWQgRmlsbEFscGhhUGxhbmUodWludDhfdCogZHN0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCBoOyArK2opIHsKKyAgICBtZW1zZXQoZHN0LCAweGZmLCB3ICogc2l6ZW9mKCpkc3QpKTsKKyAgICBkc3QgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRW1pdEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CiAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhID0gaW8tPmE7CiAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LllVVkE7CiAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CiAgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CiAgIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+YSArIGlvLT5tYl95ICogYnVmLT5hX3N0cmlkZTsKICAgaW50IGo7Ci0KKyAgKHZvaWQpZXhwZWN0ZWRfbnVtX2xpbmVzX291dDsKKyAgYXNzZXJ0KGV4cGVjdGVkX251bV9saW5lc19vdXQgPT0gbWJfaCk7CiAgIGlmIChhbHBoYSAhPSBOVUxMKSB7CiAgICAgZm9yIChqID0gMDsgaiA8IG1iX2g7ICsraikgewotICAgICAgU2JNZW1vcnlDb3B5KGRzdCwgYWxwaGEsIG1iX3cgKiBzaXplb2YoKmRzdCkpOworICAgICAgbWVtY3B5KGRzdCwgYWxwaGEsIG1iX3cgKiBzaXplb2YoKmRzdCkpOwogICAgICAgYWxwaGEgKz0gaW8tPndpZHRoOwogICAgICAgZHN0ICs9IGJ1Zi0+YV9zdHJpZGU7CiAgICAgfQogICB9IGVsc2UgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CiAgICAgLy8gdGhlIHVzZXIgcmVxdWVzdGVkIGFscGhhLCBidXQgdGhlcmUgaXMgbm9uZSwgc2V0IGl0IHRvIG9wYXF1ZS4KLSAgICBmb3IgKGogPSAwOyBqIDwgbWJfaDsgKytqKSB7Ci0gICAgICBTYk1lbW9yeVNldChkc3QsIDB4ZmYsIG1iX3cgKiBzaXplb2YoKmRzdCkpOwotICAgICAgZHN0ICs9IGJ1Zi0+YV9zdHJpZGU7Ci0gICAgfQorICAgIEZpbGxBbHBoYVBsYW5lKGRzdCwgbWJfdywgbWJfaCwgYnVmLT5hX3N0cmlkZSk7CiAgIH0KICAgcmV0dXJuIDA7CiB9CkBAIC0yMTgsNyArMTgyLDggQEAKICAgcmV0dXJuIHN0YXJ0X3k7CiB9CiAKLXN0YXRpYyBpbnQgRW1pdEFscGhhUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworc3RhdGljIGludCBFbWl0QWxwaGFSR0IoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKICAgY29uc3QgdWludDhfdCogYWxwaGEgPSBpby0+YTsKICAgaWYgKGFscGhhICE9IE5VTEwpIHsKICAgICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwpAQCAtMjI5LDIxICsxOTQsMTMgQEAKICAgICBpbnQgbnVtX3Jvd3M7CiAgICAgY29uc3QgaW50IHN0YXJ0X3kgPSBHZXRBbHBoYVNvdXJjZVJvdyhpbywgJmFscGhhLCAmbnVtX3Jvd3MpOwogICAgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHN0YXJ0X3kgKiBidWYtPnN0cmlkZTsKLSAgICB1aW50OF90KiBkc3QgPSBiYXNlX3JnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7Ci0gICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmY7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3Jvd3M7ICsraikgewotICAgICAgZm9yIChpID0gMDsgaSA8IG1iX3c7ICsraSkgewotICAgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOwotICAgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7Ci0gICAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7Ci0gICAgICB9Ci0gICAgICBhbHBoYSArPSBpby0+d2lkdGg7Ci0gICAgICBkc3QgKz0gYnVmLT5zdHJpZGU7Ci0gICAgfQotICAgIC8vIGFscGhhX21hc2sgaXMgPCAweGZmIGlmIHRoZXJlJ3Mgbm9uLXRyaXZpYWwgYWxwaGEgdG8gcHJlbXVsdGlwbHkgd2l0aC4KLSAgICBpZiAoYWxwaGFfbWFzayAhPSAweGZmICYmIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSB7CisgICAgdWludDhfdCogY29uc3QgZHN0ID0gYmFzZV9yZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQRGlzcGF0Y2hBbHBoYShhbHBoYSwgaW8tPndpZHRoLCBtYl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcm93cywgZHN0LCBidWYtPnN0cmlkZSk7CisgICAgKHZvaWQpZXhwZWN0ZWRfbnVtX2xpbmVzX291dDsKKyAgICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBudW1fcm93cyk7CisgICAgLy8gaGFzX2FscGhhIGlzIHRydWUgaWYgdGhlcmUncyBub24tdHJpdmlhbCBhbHBoYSB0byBwcmVtdWx0aXBseSB3aXRoLgorICAgIGlmIChoYXNfYWxwaGEgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKICAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkoYmFzZV9yZ2JhLCBhbHBoYV9maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfdywgbnVtX3Jvd3MsIGJ1Zi0+c3RyaWRlKTsKICAgICB9CkBAIC0yNTEsNyArMjA4LDggQEAKICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgRW1pdEFscGhhUkdCQTQ0NDQoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CitzdGF0aWMgaW50IEVtaXRBbHBoYVJHQkE0NDQ0KGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKICAgY29uc3QgdWludDhfdCogYWxwaGEgPSBpby0+YTsKICAgaWYgKGFscGhhICE9IE5VTEwpIHsKICAgICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwpAQCAtMjYwLDEwICsyMTgsMTMgQEAKICAgICBpbnQgbnVtX3Jvd3M7CiAgICAgY29uc3QgaW50IHN0YXJ0X3kgPSBHZXRBbHBoYVNvdXJjZVJvdyhpbywgJmFscGhhLCAmbnVtX3Jvd3MpOwogICAgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHN0YXJ0X3kgKiBidWYtPnN0cmlkZTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIHVpbnQ4X3QqIGFscGhhX2RzdCA9IGJhc2VfcmdiYTsKKyNlbHNlCiAgICAgdWludDhfdCogYWxwaGFfZHN0ID0gYmFzZV9yZ2JhICsgMTsKKyNlbmRpZgogICAgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweDBmOwogICAgIGludCBpLCBqOwotCiAgICAgZm9yIChqID0gMDsgaiA8IG51bV9yb3dzOyArK2opIHsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl93OyArK2kpIHsKICAgICAgICAgLy8gRmlsbCBpbiB0aGUgYWxwaGEgdmFsdWUgKGNvbnZlcnRlZCB0byA0IGJpdHMpLgpAQCAtMjc0LDYgKzIzNSw4IEBACiAgICAgICBhbHBoYSArPSBpby0+d2lkdGg7CiAgICAgICBhbHBoYV9kc3QgKz0gYnVmLT5zdHJpZGU7CiAgICAgfQorICAgICh2b2lkKWV4cGVjdGVkX251bV9saW5lc19vdXQ7CisgICAgYXNzZXJ0KGV4cGVjdGVkX251bV9saW5lc19vdXQgPT0gbnVtX3Jvd3MpOwogICAgIGlmIChhbHBoYV9tYXNrICE9IDB4MGYgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKICAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KGJhc2VfcmdiYSwgbWJfdywgbnVtX3Jvd3MsIGJ1Zi0+c3RyaWRlKTsKICAgICB9CkBAIC0yODQsNiArMjQ3LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBZVVYgcmVzY2FsaW5nIChubyBmaW5hbCBSR0IgY29udmVyc2lvbiBuZWVkZWQpCiAKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQogc3RhdGljIGludCBSZXNjYWxlKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgaW50IG5ld19saW5lcywgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKICAgaW50IG51bV9saW5lc19vdXQgPSAwOwpAQCAtMjk5LDE1ICsyNjMsMzkgQEAKIHN0YXRpYyBpbnQgRW1pdFJlc2NhbGVkWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewogICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOwogICBjb25zdCBpbnQgdXZfbWJfaCA9IChtYl9oICsgMSkgPj4gMTsKLSAgY29uc3QgaW50IG51bV9saW5lc19vdXQgPSBSZXNjYWxlKGlvLT55LCBpby0+eV9zdHJpZGUsIG1iX2gsICZwLT5zY2FsZXJfeSk7Ci0gIFJlc2NhbGUoaW8tPnUsIGlvLT51dl9zdHJpZGUsIHV2X21iX2gsICZwLT5zY2FsZXJfdSk7Ci0gIFJlc2NhbGUoaW8tPnYsIGlvLT51dl9zdHJpZGUsIHV2X21iX2gsICZwLT5zY2FsZXJfdik7CisgIFdlYlBSZXNjYWxlciogY29uc3Qgc2NhbGVyID0gcC0+c2NhbGVyX3k7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgaWYgKFdlYlBJc0FscGhhTW9kZShwLT5vdXRwdXQtPmNvbG9yc3BhY2UpICYmIGlvLT5hICE9IE5VTEwpIHsKKyAgICAvLyBCZWZvcmUgcmVzY2FsaW5nLCB3ZSBwcmVtdWx0aXBseSB0aGUgbHVtYSBkaXJlY3RseSBpbnRvIHRoZSBpby0+eQorICAgIC8vIGludGVybmFsIGJ1ZmZlci4gVGhpcyBpcyBPSyBzaW5jZSB0aGVzZSBzYW1wbGVzIGFyZSBub3QgdXNlZCBmb3IKKyAgICAvLyBpbnRyYS1wcmVkaWN0aW9uICh0aGUgdG9wIHNhbXBsZXMgYXJlIHNhdmVkIGluIGNhY2hlX3lfL3VfL3ZfKS4KKyAgICAvLyBCdXQgd2UgbmVlZCB0byBjYXN0IHRoZSBjb25zdCBhd2F5LCB0aG91Z2guCisgICAgV2ViUE11bHRSb3dzKCh1aW50OF90Kilpby0+eSwgaW8tPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICBpby0+YSwgaW8tPndpZHRoLCBpby0+bWJfdywgbWJfaCwgMCk7CisgIH0KKyAgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPnksIGlvLT55X3N0cmlkZSwgbWJfaCwgc2NhbGVyKTsKKyAgUmVzY2FsZShpby0+dSwgaW8tPnV2X3N0cmlkZSwgdXZfbWJfaCwgcC0+c2NhbGVyX3UpOworICBSZXNjYWxlKGlvLT52LCBpby0+dXZfc3RyaWRlLCB1dl9tYl9oLCBwLT5zY2FsZXJfdik7CiAgIHJldHVybiBudW1fbGluZXNfb3V0OwogfQogCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVlVVihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CisgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LllVVkE7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdF9hID0gYnVmLT5hICsgcC0+bGFzdF95ICogYnVmLT5hX3N0cmlkZTsKICAgaWYgKGlvLT5hICE9IE5VTEwpIHsKLSAgICBSZXNjYWxlKGlvLT5hLCBpby0+d2lkdGgsIGlvLT5tYl9oLCAmcC0+c2NhbGVyX2EpOworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdF95ID0gYnVmLT55ICsgcC0+bGFzdF95ICogYnVmLT55X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPmEsIGlvLT53aWR0aCwgaW8tPm1iX2gsIHAtPnNjYWxlcl9hKTsKKyAgICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBudW1fbGluZXNfb3V0KTsKKyAgICBpZiAobnVtX2xpbmVzX291dCA+IDApIHsgICAvLyB1bm11bHRpcGx5IHRoZSBZCisgICAgICBXZWJQTXVsdFJvd3MoZHN0X3ksIGJ1Zi0+eV9zdHJpZGUsIGRzdF9hLCBidWYtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHAtPnNjYWxlcl9hLT5kc3Rfd2lkdGgsIG51bV9saW5lc19vdXQsIDEpOworICAgIH0KKyAgfSBlbHNlIGlmIChidWYtPmEgIT0gTlVMTCkgeworICAgIC8vIHRoZSB1c2VyIHJlcXVlc3RlZCBhbHBoYSwgYnV0IHRoZXJlIGlzIG5vbmUsIHNldCBpdCB0byBvcGFxdWUuCisgICAgYXNzZXJ0KHAtPmxhc3RfeSArIGV4cGVjdGVkX251bV9saW5lc19vdXQgPD0gaW8tPnNjYWxlZF9oZWlnaHQpOworICAgIEZpbGxBbHBoYVBsYW5lKGRzdF9hLCBpby0+c2NhbGVkX3dpZHRoLCBleHBlY3RlZF9udW1fbGluZXNfb3V0LAorICAgICAgICAgICAgICAgICAgIGJ1Zi0+YV9zdHJpZGUpOwogICB9CiAgIHJldHVybiAwOwogfQpAQCAtMzIzLDQwICszMTEsNDYgQEAKICAgY29uc3QgaW50IHV2X2luX2hlaWdodCA9IChpby0+bWJfaCArIDEpID4+IDE7CiAgIGNvbnN0IHNpemVfdCB3b3JrX3NpemUgPSAyICogb3V0X3dpZHRoOyAgIC8vIHNjcmF0Y2ggbWVtb3J5IGZvciBsdW1hIHJlc2NhbGVyCiAgIGNvbnN0IHNpemVfdCB1dl93b3JrX3NpemUgPSAyICogdXZfb3V0X3dpZHRoOyAgLy8gYW5kIGZvciBlYWNoIHUvdiBvbmVzCi0gIHNpemVfdCB0bXBfc2l6ZTsKLSAgaW50MzJfdCogd29yazsKKyAgc2l6ZV90IHRtcF9zaXplLCByZXNjYWxlcl9zaXplOworICByZXNjYWxlcl90KiB3b3JrOworICBXZWJQUmVzY2FsZXIqIHNjYWxlcnM7CisgIGNvbnN0IGludCBudW1fcmVzY2FsZXJzID0gaGFzX2FscGhhID8gNCA6IDM7CiAKLSAgdG1wX3NpemUgPSB3b3JrX3NpemUgKyAyICogdXZfd29ya19zaXplOworICB0bXBfc2l6ZSA9ICh3b3JrX3NpemUgKyAyICogdXZfd29ya19zaXplKSAqIHNpemVvZigqd29yayk7CiAgIGlmIChoYXNfYWxwaGEpIHsKLSAgICB0bXBfc2l6ZSArPSB3b3JrX3NpemU7CisgICAgdG1wX3NpemUgKz0gd29ya19zaXplICogc2l6ZW9mKCp3b3JrKTsKICAgfQotICBwLT5tZW1vcnkgPSBTYk1lbW9yeUNhbGxvYygxLCB0bXBfc2l6ZSAqIHNpemVvZigqd29yaykpOworICByZXNjYWxlcl9zaXplID0gbnVtX3Jlc2NhbGVycyAqIHNpemVvZigqcC0+c2NhbGVyX3kpICsgV0VCUF9BTElHTl9DU1Q7CisKKyAgcC0+bWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG1wX3NpemUgKyByZXNjYWxlcl9zaXplKTsKICAgaWYgKHAtPm1lbW9yeSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7ICAgLy8gbWVtb3J5IGVycm9yCiAgIH0KLSAgd29yayA9IChpbnQzMl90KilwLT5tZW1vcnk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl95LCBpby0+bWJfdywgaW8tPm1iX2gsCisgIHdvcmsgPSAocmVzY2FsZXJfdCopcC0+bWVtb3J5OworCisgIHNjYWxlcnMgPSAoV2ViUFJlc2NhbGVyKilXRUJQX0FMSUdOKChjb25zdCB1aW50OF90Kil3b3JrICsgdG1wX3NpemUpOworICBwLT5zY2FsZXJfeSA9ICZzY2FsZXJzWzBdOworICBwLT5zY2FsZXJfdSA9ICZzY2FsZXJzWzFdOworICBwLT5zY2FsZXJfdiA9ICZzY2FsZXJzWzJdOworICBwLT5zY2FsZXJfYSA9IGhhc19hbHBoYSA/ICZzY2FsZXJzWzNdIDogTlVMTDsKKworICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl95LCBpby0+bWJfdywgaW8tPm1iX2gsCiAgICAgICAgICAgICAgICAgICAgYnVmLT55LCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGJ1Zi0+eV9zdHJpZGUsIDEsCi0gICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIG91dF93aWR0aCwgaW8tPm1iX2gsIG91dF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgd29yayk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGJ1Zi0+dSwgdXZfb3V0X3dpZHRoLCB1dl9vdXRfaGVpZ2h0LCBidWYtPnVfc3RyaWRlLCAxLAotICAgICAgICAgICAgICAgICAgIHV2X2luX3dpZHRoLCB1dl9vdXRfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgdXZfaW5faGVpZ2h0LCB1dl9vdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHdvcmsgKyB3b3JrX3NpemUpOwotICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfdiwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKKyAgV2ViUFJlc2NhbGVySW5pdChwLT5zY2FsZXJfdiwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICBidWYtPnYsIHV2X291dF93aWR0aCwgdXZfb3V0X2hlaWdodCwgYnVmLT52X3N0cmlkZSwgMSwKLSAgICAgICAgICAgICAgICAgICB1dl9pbl93aWR0aCwgdXZfb3V0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgIHV2X2luX2hlaWdodCwgdXZfb3V0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICB3b3JrICsgd29ya19zaXplICsgdXZfd29ya19zaXplKTsKICAgcC0+ZW1pdCA9IEVtaXRSZXNjYWxlZFlVVjsKIAogICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl9hLCBpby0+bWJfdywgaW8tPm1iX2gsCiAgICAgICAgICAgICAgICAgICAgICBidWYtPmEsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgYnVmLT5hX3N0cmlkZSwgMSwKLSAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBvdXRfd2lkdGgsIGlvLT5tYl9oLCBvdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSArIDIgKiB1dl93b3JrX3NpemUpOwogICAgIHAtPmVtaXRfYWxwaGEgPSBFbWl0UmVzY2FsZWRBbHBoYVlVVjsKKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOwogICB9CiAgIHJldHVybiAxOwogfQpAQCAtMzY4LDE5ICszNjIsMTkgQEAKICAgY29uc3QgV2ViUFlVVjQ0NENvbnZlcnRlciBjb252ZXJ0ID0KICAgICAgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW3AtPm91dHB1dC0+Y29sb3JzcGFjZV07CiAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIChwLT5sYXN0X3kgKyB5X3BvcykgKiBidWYtPnN0cmlkZTsKKyAgdWludDhfdCogZHN0ID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKICAgaW50IG51bV9saW5lc19vdXQgPSAwOwogICAvLyBGb3IgUkdCIHJlc2NhbGluZywgYmVjYXVzZSBvZiB0aGUgWVVWNDIwLCBjdXJyZW50IHNjYW4gcG9zaXRpb24KICAgLy8gVS9WIGNhbiBiZSArMS8tMSBsaW5lIGZyb20gdGhlIFkgb25lLiAgSGVuY2UgdGhlIGRvdWJsZSB0ZXN0LgotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dCgmcC0+c2NhbGVyX3kpICYmCi0gICAgICAgICBXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfdSkpIHsKLSAgICBTQl9EQ0hFQ0socC0+bGFzdF95ICsgeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOwotICAgIFNCX0RDSEVDSyhwLT5zY2FsZXJfdS55X2FjY3VtID09IHAtPnNjYWxlcl92LnlfYWNjdW0pOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3kpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3UpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3YpOwotICAgIGNvbnZlcnQocC0+c2NhbGVyX3kuZHN0LCBwLT5zY2FsZXJfdS5kc3QsIHAtPnNjYWxlcl92LmRzdCwKLSAgICAgICAgICAgIGRzdCwgcC0+c2NhbGVyX3kuZHN0X3dpZHRoKTsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocC0+c2NhbGVyX3kpICYmCisgICAgICAgICBXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHAtPnNjYWxlcl91KSkgeworICAgIGFzc2VydCh5X3BvcyArIG51bV9saW5lc19vdXQgPCBwLT5vdXRwdXQtPmhlaWdodCk7CisgICAgYXNzZXJ0KHAtPnNjYWxlcl91LT55X2FjY3VtID09IHAtPnNjYWxlcl92LT55X2FjY3VtKTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX3kpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhwLT5zY2FsZXJfdSk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHAtPnNjYWxlcl92KTsKKyAgICBjb252ZXJ0KHAtPnNjYWxlcl95LT5kc3QsIHAtPnNjYWxlcl91LT5kc3QsIHAtPnNjYWxlcl92LT5kc3QsCisgICAgICAgICAgICBkc3QsIHAtPnNjYWxlcl95LT5kc3Rfd2lkdGgpOwogICAgIGRzdCArPSBidWYtPnN0cmlkZTsKICAgICArK251bV9saW5lc19vdXQ7CiAgIH0KQEAgLTM5NCw3MSArMzg4LDc1IEBACiAgIGludCBudW1fbGluZXNfb3V0ID0gMDsKICAgd2hpbGUgKGogPCBtYl9oKSB7CiAgICAgY29uc3QgaW50IHlfbGluZXNfaW4gPQotICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl95LCBtYl9oIC0gaiwKKyAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KHAtPnNjYWxlcl95LCBtYl9oIC0gaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT55ICsgaiAqIGlvLT55X3N0cmlkZSwgaW8tPnlfc3RyaWRlKTsKLSAgICBjb25zdCBpbnQgdV9saW5lc19pbiA9Ci0gICAgICAgIFdlYlBSZXNjYWxlckltcG9ydCgmcC0+c2NhbGVyX3UsIHV2X21iX2ggLSB1dl9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnUgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7Ci0gICAgY29uc3QgaW50IHZfbGluZXNfaW4gPQotICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl92LCB1dl9tYl9oIC0gdXZfaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT52ICsgdXZfaiAqIGlvLT51dl9zdHJpZGUsIGlvLT51dl9zdHJpZGUpOwotICAgICh2b2lkKXZfbGluZXNfaW47ICAgLy8gcmVtb3ZlIGEgZ2NjIHdhcm5pbmcKLSAgICBTQl9EQ0hFQ0sodV9saW5lc19pbiA9PSB2X2xpbmVzX2luKTsKICAgICBqICs9IHlfbGluZXNfaW47Ci0gICAgdXZfaiArPSB1X2xpbmVzX2luOwotICAgIG51bV9saW5lc19vdXQgKz0gRXhwb3J0UkdCKHAsIG51bV9saW5lc19vdXQpOworICAgIGlmIChXZWJQUmVzY2FsZU5lZWRlZExpbmVzKHAtPnNjYWxlcl91LCB1dl9tYl9oIC0gdXZfaikpIHsKKyAgICAgIGNvbnN0IGludCB1X2xpbmVzX2luID0KKyAgICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQocC0+c2NhbGVyX3UsIHV2X21iX2ggLSB1dl9qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+dSArIHV2X2ogKiBpby0+dXZfc3RyaWRlLCBpby0+dXZfc3RyaWRlKTsKKyAgICAgIGNvbnN0IGludCB2X2xpbmVzX2luID0KKyAgICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQocC0+c2NhbGVyX3YsIHV2X21iX2ggLSB1dl9qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+diArIHV2X2ogKiBpby0+dXZfc3RyaWRlLCBpby0+dXZfc3RyaWRlKTsKKyAgICAgICh2b2lkKXZfbGluZXNfaW47ICAgLy8gcmVtb3ZlIGEgZ2NjIHdhcm5pbmcKKyAgICAgIGFzc2VydCh1X2xpbmVzX2luID09IHZfbGluZXNfaW4pOworICAgICAgdXZfaiArPSB1X2xpbmVzX2luOworICAgIH0KKyAgICBudW1fbGluZXNfb3V0ICs9IEV4cG9ydFJHQihwLCBwLT5sYXN0X3kgKyBudW1fbGluZXNfb3V0KTsKICAgfQogICByZXR1cm4gbnVtX2xpbmVzX291dDsKIH0KIAotc3RhdGljIGludCBFeHBvcnRBbHBoYShXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MpIHsKK3N0YXRpYyBpbnQgRXhwb3J0QWxwaGEoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLCBpbnQgbWF4X2xpbmVzX291dCkgewogICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOwotICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyAocC0+bGFzdF95ICsgeV9wb3MpICogYnVmLT5zdHJpZGU7CisgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHlfcG9zICogYnVmLT5zdHJpZGU7CiAgIGNvbnN0IFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSA9IHAtPm91dHB1dC0+Y29sb3JzcGFjZTsKICAgY29uc3QgaW50IGFscGhhX2ZpcnN0ID0KICAgICAgIChjb2xvcnNwYWNlID09IE1PREVfQVJHQiB8fCBjb2xvcnNwYWNlID09IE1PREVfQXJnYik7CiAgIHVpbnQ4X3QqIGRzdCA9IGJhc2VfcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKICAgaW50IG51bV9saW5lc19vdXQgPSAwOwogICBjb25zdCBpbnQgaXNfcHJlbXVsdF9hbHBoYSA9IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpOwotICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZjsKLSAgY29uc3QgaW50IHdpZHRoID0gcC0+c2NhbGVyX2EuZHN0X3dpZHRoOworICB1aW50MzJfdCBub25fb3BhcXVlID0gMDsKKyAgY29uc3QgaW50IHdpZHRoID0gcC0+c2NhbGVyX2EtPmRzdF93aWR0aDsKIAotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dCgmcC0+c2NhbGVyX2EpKSB7Ci0gICAgaW50IGk7Ci0gICAgU0JfRENIRUNLKHAtPmxhc3RfeSArIHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3coJnAtPnNjYWxlcl9hKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBwLT5zY2FsZXJfYS5kc3RbaV07Ci0gICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7Ci0gICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOwotICAgIH0KKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocC0+c2NhbGVyX2EpICYmCisgICAgICAgICBudW1fbGluZXNfb3V0IDwgbWF4X2xpbmVzX291dCkgeworICAgIGFzc2VydCh5X3BvcyArIG51bV9saW5lc19vdXQgPCBwLT5vdXRwdXQtPmhlaWdodCk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHAtPnNjYWxlcl9hKTsKKyAgICBub25fb3BhcXVlIHw9IFdlYlBEaXNwYXRjaEFscGhhKHAtPnNjYWxlcl9hLT5kc3QsIDAsIHdpZHRoLCAxLCBkc3QsIDApOwogICAgIGRzdCArPSBidWYtPnN0cmlkZTsKICAgICArK251bV9saW5lc19vdXQ7CiAgIH0KLSAgaWYgKGlzX3ByZW11bHRfYWxwaGEgJiYgYWxwaGFfbWFzayAhPSAweGZmKSB7CisgIGlmIChpc19wcmVtdWx0X2FscGhhICYmIG5vbl9vcGFxdWUpIHsKICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KGJhc2VfcmdiYSwgYWxwaGFfZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbnVtX2xpbmVzX291dCwgYnVmLT5zdHJpZGUpOwogICB9CiAgIHJldHVybiBudW1fbGluZXNfb3V0OwogfQogCi1zdGF0aWMgaW50IEV4cG9ydEFscGhhUkdCQTQ0NDQoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zKSB7CitzdGF0aWMgaW50IEV4cG9ydEFscGhhUkdCQTQ0NDQoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGluZXNfb3V0KSB7CiAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIChwLT5sYXN0X3kgKyB5X3BvcykgKiBidWYtPnN0cmlkZTsKKyAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmE7CisjZWxzZQogICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCiAgIGludCBudW1fbGluZXNfb3V0ID0gMDsKICAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOwotICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS5kc3Rfd2lkdGg7CisgIGNvbnN0IGludCB3aWR0aCA9IHAtPnNjYWxlcl9hLT5kc3Rfd2lkdGg7CiAgIGNvbnN0IGludCBpc19wcmVtdWx0X2FscGhhID0gV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSk7CiAgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweDBmOwogCi0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfYSkpIHsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocC0+c2NhbGVyX2EpICYmCisgICAgICAgICBudW1fbGluZXNfb3V0IDwgbWF4X2xpbmVzX291dCkgewogICAgIGludCBpOwotICAgIFNCX0RDSEVDSyhwLT5sYXN0X3kgKyB5X3BvcyArIG51bV9saW5lc19vdXQgPCBwLT5vdXRwdXQtPmhlaWdodCk7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KCZwLT5zY2FsZXJfYSk7CisgICAgYXNzZXJ0KHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX2EpOwogICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CiAgICAgICAvLyBGaWxsIGluIHRoZSBhbHBoYSB2YWx1ZSAoY29udmVydGVkIHRvIDQgYml0cykuCi0gICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLmRzdFtpXSA+PiA0OworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBwLT5zY2FsZXJfYS0+ZHN0W2ldID4+IDQ7CiAgICAgICBhbHBoYV9kc3RbMiAqIGldID0gKGFscGhhX2RzdFsyICogaV0gJiAweGYwKSB8IGFscGhhX3ZhbHVlOwogICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKICAgICB9CkBAIC00NzEsMTUgKzQ2OSwxNyBAQAogICByZXR1cm4gbnVtX2xpbmVzX291dDsKIH0KIAotc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKK3N0YXRpYyBpbnQgRW1pdFJlc2NhbGVkQWxwaGFSR0IoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX291dF9saW5lcykgewogICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgIFdlYlBSZXNjYWxlciogY29uc3Qgc2NhbGVyID0gJnAtPnNjYWxlcl9hOwotICAgIGludCBqID0gMDsKLSAgICBpbnQgcG9zID0gMDsKLSAgICB3aGlsZSAoaiA8IGlvLT5tYl9oKSB7Ci0gICAgICBqICs9IFdlYlBSZXNjYWxlckltcG9ydChzY2FsZXIsIGlvLT5tYl9oIC0gaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5hICsgaiAqIGlvLT53aWR0aCwgaW8tPndpZHRoKTsKLSAgICAgIHBvcyArPSBwLT5lbWl0X2FscGhhX3JvdyhwLCBwb3MpOworICAgIFdlYlBSZXNjYWxlciogY29uc3Qgc2NhbGVyID0gcC0+c2NhbGVyX2E7CisgICAgaW50IGxpbmVzX2xlZnQgPSBleHBlY3RlZF9udW1fb3V0X2xpbmVzOworICAgIGNvbnN0IGludCB5X2VuZCA9IHAtPmxhc3RfeSArIGxpbmVzX2xlZnQ7CisgICAgd2hpbGUgKGxpbmVzX2xlZnQgPiAwKSB7CisgICAgICBjb25zdCBpbnQgcm93X29mZnNldCA9IHNjYWxlci0+c3JjX3kgLSBpby0+bWJfeTsKKyAgICAgIFdlYlBSZXNjYWxlckltcG9ydChzY2FsZXIsIGlvLT5tYl9oICsgaW8tPm1iX3kgLSBzY2FsZXItPnNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5hICsgcm93X29mZnNldCAqIGlvLT53aWR0aCwgaW8tPndpZHRoKTsKKyAgICAgIGxpbmVzX2xlZnQgLT0gcC0+ZW1pdF9hbHBoYV9yb3cocCwgeV9lbmQgLSBsaW5lc19sZWZ0LCBsaW5lc19sZWZ0KTsKICAgICB9CiAgIH0KICAgcmV0dXJuIDA7CkBAIC00OTIsOSArNDkyLDExIEBACiAgIGNvbnN0IGludCB1dl9pbl93aWR0aCAgPSAoaW8tPm1iX3cgKyAxKSA+PiAxOwogICBjb25zdCBpbnQgdXZfaW5faGVpZ2h0ID0gKGlvLT5tYl9oICsgMSkgPj4gMTsKICAgY29uc3Qgc2l6ZV90IHdvcmtfc2l6ZSA9IDIgKiBvdXRfd2lkdGg7ICAgLy8gc2NyYXRjaCBtZW1vcnkgZm9yIG9uZSByZXNjYWxlcgotICBpbnQzMl90KiB3b3JrOyAgLy8gcmVzY2FsZXJzIHdvcmsgYXJlYQorICByZXNjYWxlcl90KiB3b3JrOyAgLy8gcmVzY2FsZXJzIHdvcmsgYXJlYQogICB1aW50OF90KiB0bXA7ICAgLy8gdG1wIHN0b3JhZ2UgZm9yIHNjYWxlZCBZVVY0NDQgc2FtcGxlcyBiZWZvcmUgUkdCIGNvbnZlcnNpb24KLSAgc2l6ZV90IHRtcF9zaXplMSwgdG1wX3NpemUyOworICBzaXplX3QgdG1wX3NpemUxLCB0bXBfc2l6ZTIsIHRvdGFsX3NpemUsIHJlc2NhbGVyX3NpemU7CisgIFdlYlBSZXNjYWxlciogc2NhbGVyczsKKyAgY29uc3QgaW50IG51bV9yZXNjYWxlcnMgPSBoYXNfYWxwaGEgPyA0IDogMzsKIAogICB0bXBfc2l6ZTEgPSAzICogd29ya19zaXplOwogICB0bXBfc2l6ZTIgPSAzICogb3V0X3dpZHRoOwpAQCAtNTAyLDMwICs1MDQsMzcgQEAKICAgICB0bXBfc2l6ZTEgKz0gd29ya19zaXplOwogICAgIHRtcF9zaXplMiArPSBvdXRfd2lkdGg7CiAgIH0KLSAgcC0+bWVtb3J5ID0gU2JNZW1vcnlDYWxsb2MoMSwgdG1wX3NpemUxICogc2l6ZW9mKCp3b3JrKSArIHRtcF9zaXplMiAqIHNpemVvZigqdG1wKSk7CisgIHRvdGFsX3NpemUgPSB0bXBfc2l6ZTEgKiBzaXplb2YoKndvcmspICsgdG1wX3NpemUyICogc2l6ZW9mKCp0bXApOworICByZXNjYWxlcl9zaXplID0gbnVtX3Jlc2NhbGVycyAqIHNpemVvZigqcC0+c2NhbGVyX3kpICsgV0VCUF9BTElHTl9DU1Q7CisKKyAgcC0+bWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG90YWxfc2l6ZSArIHJlc2NhbGVyX3NpemUpOwogICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IKICAgfQotICB3b3JrID0gKGludDMyX3QqKXAtPm1lbW9yeTsKKyAgd29yayA9IChyZXNjYWxlcl90KilwLT5tZW1vcnk7CiAgIHRtcCA9ICh1aW50OF90Kikod29yayArIHRtcF9zaXplMSk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl95LCBpby0+bWJfdywgaW8tPm1iX2gsCisKKyAgc2NhbGVycyA9IChXZWJQUmVzY2FsZXIqKVdFQlBfQUxJR04oKGNvbnN0IHVpbnQ4X3QqKXdvcmsgKyB0b3RhbF9zaXplKTsKKyAgcC0+c2NhbGVyX3kgPSAmc2NhbGVyc1swXTsKKyAgcC0+c2NhbGVyX3UgPSAmc2NhbGVyc1sxXTsKKyAgcC0+c2NhbGVyX3YgPSAmc2NhbGVyc1syXTsKKyAgcC0+c2NhbGVyX2EgPSBoYXNfYWxwaGEgPyAmc2NhbGVyc1szXSA6IE5VTEw7CisKKyAgV2ViUFJlc2NhbGVySW5pdChwLT5zY2FsZXJfeSwgaW8tPm1iX3csIGlvLT5tYl9oLAogICAgICAgICAgICAgICAgICAgIHRtcCArIDAgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgb3V0X3dpZHRoLCBpby0+bWJfaCwgb3V0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICB3b3JrICsgMCAqIHdvcmtfc2l6ZSk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHRtcCArIDEgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgMiAqIG91dF93aWR0aCwgaW8tPm1iX2gsIDIgKiBvdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHdvcmsgKyAxICogd29ya19zaXplKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3YsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3YsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdG1wICsgMiAqIG91dF93aWR0aCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCAxLAotICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCAyICogb3V0X3dpZHRoLCBpby0+bWJfaCwgMiAqIG91dF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgd29yayArIDIgKiB3b3JrX3NpemUpOwogICBwLT5lbWl0ID0gRW1pdFJlc2NhbGVkUkdCOworICBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnMoKTsKIAogICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl9hLCBpby0+bWJfdywgaW8tPm1iX2gsCiAgICAgICAgICAgICAgICAgICAgICB0bXAgKyAzICogb3V0X3dpZHRoLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgb3V0X3dpZHRoLCBpby0+bWJfaCwgb3V0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgIHdvcmsgKyAzICogd29ya19zaXplKTsKICAgICBwLT5lbWl0X2FscGhhID0gRW1pdFJlc2NhbGVkQWxwaGFSR0I7CiAgICAgaWYgKHAtPm91dHB1dC0+Y29sb3JzcGFjZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fApAQCAtNTM0LDEwICs1NDMsMTMgQEAKICAgICB9IGVsc2UgewogICAgICAgcC0+ZW1pdF9hbHBoYV9yb3cgPSBFeHBvcnRBbHBoYTsKICAgICB9CisgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKICAgfQogICByZXR1cm4gMTsKIH0KIAorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9TSVpFCisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBEZWZhdWx0IGN1c3RvbSBmdW5jdGlvbnMKIApAQCAtNTU0LDE5ICs1NjYsMjYgQEAKICAgaWYgKCFXZWJQSW9Jbml0RnJvbU9wdGlvbnMocC0+b3B0aW9ucywgaW8sIGlzX2FscGhhID8gTU9ERV9ZVVYgOiBNT0RFX1lVVkEpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KLQorICBpZiAoaXNfYWxwaGEgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKKyAgICBXZWJQSW5pdFVwc2FtcGxlcnMoKTsKKyAgfQogICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKICAgICBjb25zdCBpbnQgb2sgPSBpc19yZ2IgPyBJbml0UkdCUmVzY2FsZXIoaW8sIHApIDogSW5pdFlVVlJlc2NhbGVyKGlvLCBwKTsKICAgICBpZiAoIW9rKSB7CiAgICAgICByZXR1cm4gMDsgICAgLy8gbWVtb3J5IGVycm9yCiAgICAgfQorI2Vsc2UKKyAgICByZXR1cm4gMDsgICAvLyByZXNjYWxpbmcgc3VwcG9ydCBub3QgY29tcGlsZWQKKyNlbmRpZgogICB9IGVsc2UgewogICAgIGlmIChpc19yZ2IpIHsKKyAgICAgIFdlYlBJbml0U2FtcGxlcnMoKTsKICAgICAgIHAtPmVtaXQgPSBFbWl0U2FtcGxlZFJHQjsgICAvLyBkZWZhdWx0Ci0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwogICAgICAgaWYgKGlvLT5mYW5jeV91cHNhbXBsaW5nKSB7CisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORwogICAgICAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAoaW8tPm1iX3cgKyAxKSA+PiAxOwotICAgICAgICBwLT5tZW1vcnkgPSBTYk1lbW9yeUFsbG9jYXRlKGlvLT5tYl93ICsgMiAqIHV2X3dpZHRoKTsKKyAgICAgICAgcC0+bWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoMVVMTCwgKHNpemVfdCkoaW8tPm1iX3cgKyAyICogdXZfd2lkdGgpKTsKICAgICAgICAgaWYgKHAtPm1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgICAgcmV0dXJuIDA7ICAgLy8gbWVtb3J5IGVycm9yLgogICAgICAgICB9CkBAIC01NzUsMjQgKzU5NCwyMyBAQAogICAgICAgICBwLT50bXBfdiA9IHAtPnRtcF91ICsgdXZfd2lkdGg7CiAgICAgICAgIHAtPmVtaXQgPSBFbWl0RmFuY3lSR0I7CiAgICAgICAgIFdlYlBJbml0VXBzYW1wbGVycygpOwotICAgICAgfQogI2VuZGlmCisgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHAtPmVtaXQgPSBFbWl0WVVWOwogICAgIH0KICAgICBpZiAoaXNfYWxwaGEpIHsgIC8vIG5lZWQgdHJhbnNwYXJlbmN5IG91dHB1dAotICAgICAgaWYgKFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSBXZWJQSW5pdFByZW11bHRpcGx5KCk7CiAgICAgICBwLT5lbWl0X2FscGhhID0KICAgICAgICAgICAoY29sb3JzcGFjZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fCBjb2xvcnNwYWNlID09IE1PREVfcmdiQV80NDQ0KSA/CiAgICAgICAgICAgICAgIEVtaXRBbHBoYVJHQkE0NDQ0CiAgICAgICAgICAgOiBpc19yZ2IgPyBFbWl0QWxwaGFSR0IKICAgICAgICAgICA6IEVtaXRBbHBoYVlVVjsKKyAgICAgIGlmIChpc19yZ2IpIHsKKyAgICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZiAoaXNfcmdiKSB7Ci0gICAgVlA4WVVWSW5pdCgpOwotICB9CiAgIHJldHVybiAxOwogfQogCkBAIC02MDMsMTQgKzYyMSwxNCBAQAogICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwogICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOwogICBpbnQgbnVtX2xpbmVzX291dDsKLSAgU0JfRENIRUNLKCEoaW8tPm1iX3kgJiAxKSk7CisgIGFzc2VydCghKGlvLT5tYl95ICYgMSkpOwogCiAgIGlmIChtYl93IDw9IDAgfHwgbWJfaCA8PSAwKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgbnVtX2xpbmVzX291dCA9IHAtPmVtaXQoaW8sIHApOwotICBpZiAocC0+ZW1pdF9hbHBoYSkgewotICAgIHAtPmVtaXRfYWxwaGEoaW8sIHApOworICBpZiAocC0+ZW1pdF9hbHBoYSAhPSBOVUxMKSB7CisgICAgcC0+ZW1pdF9hbHBoYShpbywgcCwgbnVtX2xpbmVzX291dCk7CiAgIH0KICAgcC0+bGFzdF95ICs9IG51bV9saW5lc19vdXQ7CiAgIHJldHVybiAxOwpAQCAtNjIwLDcgKzYzOCw3IEBACiAKIHN0YXRpYyB2b2lkIEN1c3RvbVRlYXJkb3duKGNvbnN0IFZQOElvKiBpbykgewogICBXZWJQRGVjUGFyYW1zKiBjb25zdCBwID0gKFdlYlBEZWNQYXJhbXMqKWlvLT5vcGFxdWU7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShwLT5tZW1vcnkpOworICBXZWJQU2FmZUZyZWUocC0+bWVtb3J5KTsKICAgcC0+bWVtb3J5ID0gTlVMTDsKIH0KIApAQCAtNjM1LDcgKzY1MywzIEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3F1YW50LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3F1YW50X2RlYy5jCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9xdWFudC5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3F1YW50X2RlYy5jCmluZGV4IGE0Y2M2OTMuLmYwNzIxMmEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9xdWFudC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvcXVhbnRfZGVjLmMKQEAgLTExLDExICsxMSw3IEBACiAvLwogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAotI2luY2x1ZGUgIi4vdnA4aS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCiAKIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IE0pIHsKICAgcmV0dXJuIHYgPCAwID8gMCA6IHYgPiBNID8gTSA6IHY7CkBAIC0xMDQsMTIgKzEwMCwxMSBAQAogCiAgICAgICBtLT51dl9tYXRfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZHF1dl9kYywgMTE3KV07CiAgICAgICBtLT51dl9tYXRfWzFdID0ga0FjVGFibGVbY2xpcChxICsgZHF1dl9hYywgMTI3KV07CisKKyAgICAgIG0tPnV2X3F1YW50XyA9IHEgKyBkcXV2X2FjOyAgIC8vIGZvciBkaXRoZXJpbmcgc3RyZW5ndGggZXZhbHVhdGlvbgogICAgIH0KICAgfQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy90cmVlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3RyZWVfZGVjLmMKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3RyZWUuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy90cmVlX2RlYy5jCmluZGV4IGRjYjMyZmMuLjFiZDRkZmMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy90cmVlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy90cmVlX2RlYy5jCkBAIC0xMSwxOSArMTEsMjMgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaW5jbHVkZSAidnA4aS5oIgotCi0jZGVmaW5lIFVTRV9HRU5FUklDX1RSRUUKLQogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCIKIAotI2lmZGVmIFVTRV9HRU5FUklDX1RSRUUKKyNpZiAhZGVmaW5lZChVU0VfR0VORVJJQ19UUkVFKQorI2lmICFkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9NX0FSTSkgJiYgIWRlZmluZWQoX19hYXJjaDY0X18pCisvLyB1c2luZyBhIHRhYmxlIGlzIH4xLTIlIHNsb3dlciBvbiBBUk0uIFByZWZlciB0aGUgY29kZWQtdHJlZSBhcHByb2FjaCB0aGVuLgorI2RlZmluZSBVU0VfR0VORVJJQ19UUkVFIDEgICAvLyBBTFRFUk5BVEVfQ09ERQorI2Vsc2UKKyNkZWZpbmUgVVNFX0dFTkVSSUNfVFJFRSAwCisjZW5kaWYKKyNlbmRpZiAgLy8gVVNFX0dFTkVSSUNfVFJFRQorCisjaWYgKFVTRV9HRU5FUklDX1RSRUUgPT0gMSkKIHN0YXRpYyBjb25zdCBpbnQ4X3Qga1lNb2Rlc0ludHJhNFsxOF0gPSB7CiAgIC1CX0RDX1BSRUQsIDEsCiAgICAgLUJfVE1fUFJFRCwgMiwKQEAgLTM3LDYxICs0MSwxMiBAQAogfTsKICNlbmRpZgogCi0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotCi0vLyBpbnRlciBwcmVkaWN0aW9uIG1vZGVzCi1lbnVtIHsKLSAgTEVGVDQgPSAwLCBBQk9WRTQgPSAxLCBaRVJPNCA9IDIsIE5FVzQgPSAzLAotICBORUFSRVNUTVYsIE5FQVJNViwgWkVST01WLCBORVdNViwgU1BMSVRNViB9OwotCi1zdGF0aWMgY29uc3QgaW50OF90IGtZTW9kZXNJbnRlcls4XSA9IHsKLSAgLURDX1BSRUQsIDEsCi0gICAgMiwgMywKLSAgICAgIC1WX1BSRUQsIC1IX1BSRUQsCi0gICAgICAtVE1fUFJFRCwgLUJfUFJFRAotfTsKLQotc3RhdGljIGNvbnN0IGludDhfdCBrTUJTcGxpdFs2XSA9IHsKLSAgLTMsIDEsCi0gICAgLTIsIDIsCi0gICAgICAtMCwgLTEKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga01WUmVmWzhdID0gewotICAtWkVST01WLCAxLAotICAgIC1ORUFSRVNUTVYsIDIsCi0gICAgICAtTkVBUk1WLCAzLAotICAgICAgICAtTkVXTVYsIC1TUExJVE1WCi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IGtNVlJlZjRbNl0gPSB7Ci0gIC1MRUZUNCwgMSwKLSAgICAtQUJPVkU0LCAyLAotICAgICAgLVpFUk80LCAtTkVXNAotfTsKLSNlbmRpZgotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRGVmYXVsdCBwcm9iYWJpbGl0aWVzCiAKLS8vIEludGVyCi0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1lNb2RlUHJvYmFJbnRlcjBbNF0gPSB7IDExMiwgODYsIDE0MCwgMzcgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtVVk1vZGVQcm9iYUludGVyMFszXSA9IHsgMTYyLCAxMDEsIDIwNCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01WUHJvYmEwWzJdW05VTV9NVl9QUk9CQVNdID0gewotICB7IDE2MiwgMTI4LCAyMjUsIDE0NiwgMTcyLCAxNDcsIDIxNCwgIDM5LAotICAgIDE1NiwgMTI4LCAxMjksIDEzMiwgIDc1LCAxNDUsIDE3OCwgMjA2LAotICAgIDIzOSwgMjU0LCAyNTQgfSwKLSAgeyAxNjQsIDEyOCwgMjA0LCAxNzAsIDExOSwgMjM1LCAxNDAsIDIzMCwKLSAgICAyMjgsIDEyOCwgMTMwLCAxMzAsICA3NCwgMTQ4LCAxODAsIDIwMywKLSAgICAyMzYsIDI1NCwgMjU0IH0KLX07Ci0jZW5kaWYKLQogLy8gUGFyYWdyYXBoIDEzLjUKIHN0YXRpYyBjb25zdCB1aW50OF90CiAgIENvZWZmc1Byb2JhMFtOVU1fVFlQRVNdW05VTV9CQU5EU11bTlVNX0NUWF1bTlVNX1BST0JBU10gPSB7Ci0gIC8vIGdlbmVyZWF0ZWQgdXNpbmcgdnA4X2RlZmF1bHRfY29lZl9wcm9icygpIGluIGVudHJvcHkuYzoxMjkKICAgeyB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKICAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKICAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQpAQCAtMzMxLDQxICsyODYsNTEgQEAKIH07CiAKIHZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgU2JNZW1vcnlTZXQocHJvYmEtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2JhLT5zZWdtZW50c18pKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT5jb2VmZnNfLCBDb2VmZnNQcm9iYTAsIHNpemVvZihDb2VmZnNQcm9iYTApKTsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIFNiTWVtb3J5Q29weShwcm9iYS0+bXZfLCBrTVZQcm9iYTAsIHNpemVvZihrTVZQcm9iYTApKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT55bW9kZV8sIGtZTW9kZVByb2JhSW50ZXIwLCBzaXplb2Yoa1lNb2RlUHJvYmFJbnRlcjApKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT51dm1vZGVfLCBrVVZNb2RlUHJvYmFJbnRlcjAsIHNpemVvZihrVVZNb2RlUHJvYmFJbnRlcjApKTsKLSNlbmRpZgorICBtZW1zZXQocHJvYmEtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2JhLT5zZWdtZW50c18pKTsKKyAgLy8gcHJvYmEtPmJhbmRzX1tdW10gaXMgaW5pdGlhbGl6ZWQgbGF0ZXIKIH0KIAotdm9pZCBWUDhQYXJzZUludHJhTW9kZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCAgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGRlYy0+aW50cmFfdF8gKyA0ICogZGVjLT5tYl94XzsKK3N0YXRpYyB2b2lkIFBhcnNlSW50cmFNb2RlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCBtYl94KSB7CisgIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGRlYy0+aW50cmFfdF8gKyA0ICogbWJfeDsKICAgdWludDhfdCogY29uc3QgbGVmdCA9IGRlYy0+aW50cmFfbF87Ci0gIC8vIEhhcmRjb2RlZCAxNngxNiBpbnRyYS1tb2RlIGRlY2lzaW9uIHRyZWUuCi0gIGRlYy0+aXNfaTR4NF8gPSAhVlA4R2V0Qml0KGJyLCAxNDUpOyAgIC8vIGRlY2lkZSBmb3IgQl9QUkVEIGZpcnN0Ci0gIGlmICghZGVjLT5pc19pNHg0XykgeworICBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gZGVjLT5tYl9kYXRhXyArIG1iX3g7CisKKyAgLy8gTm90ZTogd2UgZG9uJ3Qgc2F2ZSBzZWdtZW50IG1hcCAoeWV0KSwgYXMgd2UgZG9uJ3QgZXhwZWN0CisgIC8vIHRvIGRlY29kZSBtb3JlIHRoYW4gMSBrZXlmcmFtZS4KKyAgaWYgKGRlYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfKSB7CisgICAgLy8gSGFyZGNvZGVkIHRyZWUgcGFyc2luZworICAgIGJsb2NrLT5zZWdtZW50XyA9ICFWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1swXSkKKyAgICAgICAgICAgICAgICAgICAgPyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1sxXSkKKyAgICAgICAgICAgICAgICAgICAgOiAyICsgVlA4R2V0Qml0KGJyLCBkZWMtPnByb2JhXy5zZWdtZW50c19bMl0pOworICB9IGVsc2UgeworICAgIGJsb2NrLT5zZWdtZW50XyA9IDA7ICAvLyBkZWZhdWx0IGZvciBpbnRyYQorICB9CisgIGlmIChkZWMtPnVzZV9za2lwX3Byb2JhXykgYmxvY2stPnNraXBfID0gVlA4R2V0Qml0KGJyLCBkZWMtPnNraXBfcF8pOworCisgIGJsb2NrLT5pc19pNHg0XyA9ICFWUDhHZXRCaXQoYnIsIDE0NSk7ICAgLy8gZGVjaWRlIGZvciBCX1BSRUQgZmlyc3QKKyAgaWYgKCFibG9jay0+aXNfaTR4NF8pIHsKKyAgICAvLyBIYXJkY29kZWQgMTZ4MTYgaW50cmEtbW9kZSBkZWNpc2lvbiB0cmVlLgogICAgIGNvbnN0IGludCB5bW9kZSA9CiAgICAgICAgIFZQOEdldEJpdChiciwgMTU2KSA/IChWUDhHZXRCaXQoYnIsIDEyOCkgPyBUTV9QUkVEIDogSF9QUkVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoVlA4R2V0Qml0KGJyLCAxNjMpID8gVl9QUkVEIDogRENfUFJFRCk7Ci0gICAgZGVjLT5pbW9kZXNfWzBdID0geW1vZGU7Ci0gICAgU2JNZW1vcnlTZXQodG9wLCB5bW9kZSwgNCAqIHNpemVvZih0b3BbMF0pKTsKLSAgICBTYk1lbW9yeVNldChsZWZ0LCB5bW9kZSwgNCAqIHNpemVvZihsZWZ0WzBdKSk7CisgICAgYmxvY2stPmltb2Rlc19bMF0gPSB5bW9kZTsKKyAgICBtZW1zZXQodG9wLCB5bW9kZSwgNCAqIHNpemVvZigqdG9wKSk7CisgICAgbWVtc2V0KGxlZnQsIHltb2RlLCA0ICogc2l6ZW9mKCpsZWZ0KSk7CiAgIH0gZWxzZSB7Ci0gICAgdWludDhfdCogbW9kZXMgPSBkZWMtPmltb2Rlc187CisgICAgdWludDhfdCogbW9kZXMgPSBibG9jay0+aW1vZGVzXzsKICAgICBpbnQgeTsKICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CiAgICAgICBpbnQgeW1vZGUgPSBsZWZ0W3ldOwogICAgICAgaW50IHg7CiAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2IgPSBrQk1vZGVzUHJvYmFbdG9wW3hdXVt5bW9kZV07Ci0jaWZkZWYgVVNFX0dFTkVSSUNfVFJFRQorI2lmIChVU0VfR0VORVJJQ19UUkVFID09IDEpCiAgICAgICAgIC8vIEdlbmVyaWMgdHJlZS1wYXJzaW5nCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZG8geworICAgICAgICBpbnQgaSA9IGtZTW9kZXNJbnRyYTRbVlA4R2V0Qml0KGJyLCBwcm9iWzBdKV07CisgICAgICAgIHdoaWxlIChpID4gMCkgewogICAgICAgICAgIGkgPSBrWU1vZGVzSW50cmE0WzIgKiBpICsgVlA4R2V0Qml0KGJyLCBwcm9iW2ldKV07Ci0gICAgICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICAgICAgfQogICAgICAgICB5bW9kZSA9IC1pOwogI2Vsc2UKICAgICAgICAgLy8gSGFyZGNvZGVkIHRyZWUgcGFyc2luZwpAQCAtMzc4LDE3ICszNDMsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICghVlA4R2V0Qml0KGJyLCBwcm9iWzZdKSA/IEJfTERfUFJFRCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICghVlA4R2V0Qml0KGJyLCBwcm9iWzddKSA/IEJfVkxfUFJFRCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbOF0pID8gQl9IRF9QUkVEIDogQl9IVV9QUkVEKSkpOwotI2VuZGlmICAgIC8vIFVTRV9HRU5FUklDX1RSRUUKKyNlbmRpZiAgLy8gVVNFX0dFTkVSSUNfVFJFRQogICAgICAgICB0b3BbeF0gPSB5bW9kZTsKLSAgICAgICAgKm1vZGVzKysgPSB5bW9kZTsKICAgICAgIH0KKyAgICAgIG1lbWNweShtb2RlcywgdG9wLCA0ICogc2l6ZW9mKCp0b3ApKTsKKyAgICAgIG1vZGVzICs9IDQ7CiAgICAgICBsZWZ0W3ldID0geW1vZGU7CiAgICAgfQogICB9CiAgIC8vIEhhcmRjb2RlZCBVVk1vZGUgZGVjaXNpb24gdHJlZQotICBkZWMtPnV2bW9kZV8gPSAhVlA4R2V0Qml0KGJyLCAxNDIpID8gRENfUFJFRAotICAgICAgICAgICAgICAgOiAhVlA4R2V0Qml0KGJyLCAxMTQpID8gVl9QUkVECi0gICAgICAgICAgICAgICA6IFZQOEdldEJpdChiciwgMTgzKSA/IFRNX1BSRUQgOiBIX1BSRUQ7CisgIGJsb2NrLT51dm1vZGVfID0gIVZQOEdldEJpdChiciwgMTQyKSA/IERDX1BSRUQKKyAgICAgICAgICAgICAgICAgOiAhVlA4R2V0Qml0KGJyLCAxMTQpID8gVl9QUkVECisgICAgICAgICAgICAgICAgIDogVlA4R2V0Qml0KGJyLCAxODMpID8gVE1fUFJFRCA6IEhfUFJFRDsKK30KKworaW50IFZQOFBhcnNlSW50cmFNb2RlUm93KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgbWJfeDsKKyAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGRlYy0+bWJfd187ICsrbWJfeCkgeworICAgIFBhcnNlSW50cmFNb2RlKGJyLCBkZWMsIG1iX3gpOworICB9CisgIHJldHVybiAhZGVjLT5icl8uZW9mXzsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUzMCwxOCArNTA0LDEzIEBACiAgIH0KIH07CiAKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi1zdGF0aWMgY29uc3QgdWludDhfdCBNVlVwZGF0ZVByb2JhWzJdW05VTV9NVl9QUk9CQVNdID0gewotICB7IDIzNywgMjQ2LCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LAotICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1MCwgMjUwLAotICAgIDI1MiwgMjU0LCAyNTQgfSwKLSAgeyAyMzEsIDI0MywgMjQ1LCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NCwKLSAgICAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTEsIDI1MSwKLSAgICAyNTQsIDI1NCwgMjU0IH0KLX07Ci0jZW5kaWYKLQogLy8gUGFyYWdyYXBoIDkuOQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrQmFuZHNbMTYgKyAxXSA9IHsKKyAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKKyAgMCAgLy8gZXh0cmEgZW50cnkgYXMgc2VudGluZWwKK307CisKIHZvaWQgVlA4UGFyc2VQcm9iYShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKICAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmRlYy0+cHJvYmFfOwogICBpbnQgdCwgYiwgYywgcDsKQEAgLTU0OSw0NyArNTE4LDE5IEBACiAgICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7CiAgICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7CiAgICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKLSAgICAgICAgICBpZiAoVlA4R2V0Qml0KGJyLCBDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXSkpIHsKLSAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBpbnQgdiA9IFZQOEdldEJpdChiciwgQ29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF0pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOEdldFZhbHVlKGJyLCA4KSA6IENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXTsKKyAgICAgICAgICBwcm9iYS0+YmFuZHNfW3RdW2JdLnByb2Jhc19bY11bcF0gPSB2OwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgIGZvciAoYiA9IDA7IGIgPCAxNiArIDE7ICsrYikgeworICAgICAgcHJvYmEtPmJhbmRzX3B0cl9bdF1bYl0gPSAmcHJvYmEtPmJhbmRzX1t0XVtrQmFuZHNbYl1dOworICAgIH0KICAgfQogICBkZWMtPnVzZV9za2lwX3Byb2JhXyA9IFZQOEdldChicik7CiAgIGlmIChkZWMtPnVzZV9za2lwX3Byb2JhXykgewogICAgIGRlYy0+c2tpcF9wXyA9IFZQOEdldFZhbHVlKGJyLCA4KTsKICAgfQotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgaWYgKCFkZWMtPmZybV9oZHJfLmtleV9mcmFtZV8pIHsKLSAgICBpbnQgaTsKLSAgICBkZWMtPmludHJhX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgIGRlYy0+bGFzdF9wXyA9IFZQOEdldFZhbHVlKGJyLCA4KTsKLSAgICBkZWMtPmdvbGRlbl9wXyA9IFZQOEdldFZhbHVlKGJyLCA4KTsKLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSB5LW1vZGUKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgICAgcHJvYmEtPnltb2RlX1tpXSA9IFZQOEdldFZhbHVlKGJyLCA4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgdXYtbW9kZQotICAgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotICAgICAgICBwcm9iYS0+dXZtb2RlX1tpXSA9IFZQOEdldFZhbHVlKGJyLCA4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gdXBkYXRlIE1WCi0gICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgaW50IGs7Ci0gICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX01WX1BST0JBUzsgKytrKSB7Ci0gICAgICAgIGlmIChWUDhHZXRCaXQoYnIsIE1WVXBkYXRlUHJvYmFbaV1ba10pKSB7Ci0gICAgICAgICAgY29uc3QgaW50IHYgPSBWUDhHZXRWYWx1ZShiciwgNyk7Ci0gICAgICAgICAgcHJvYmEtPm12X1tpXVtrXSA9IHYgPyB2IDw8IDEgOiAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0jZW5kaWYKIH0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOF9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDc2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOF9kZWMuYwpAQCAtMCwwICsxLDcyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy9hbHBoYWlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBHZXREZWNvZGVyVmVyc2lvbih2b2lkKSB7CisgIHJldHVybiAoREVDX01BSl9WRVJTSU9OIDw8IDE2KSB8IChERUNfTUlOX1ZFUlNJT04gPDwgOCkgfCBERUNfUkVWX1ZFUlNJT047Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaWduYXR1cmUgYW5kIHBvaW50ZXItdG8tZnVuY3Rpb24gZm9yIEdldENvZWZmcygpIHZhcmlhbnRzIGJlbG93LgorCit0eXBlZGVmIGludCAoKkdldENvZWZmc0Z1bmMpKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGNvbnN0IHByb2JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0eCwgY29uc3QgcXVhbnRfdCBkcSwgaW50IG4sIGludDE2X3QqIG91dCk7CitzdGF0aWMgdm9sYXRpbGUgR2V0Q29lZmZzRnVuYyBHZXRDb2VmZnMgPSBOVUxMOworCitzdGF0aWMgdm9pZCBJbml0R2V0Q29lZmZzKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4RGVjb2RlcgorCitzdGF0aWMgdm9pZCBTZXRPayhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgZGVjLT5lcnJvcl9tc2dfID0gIk9LIjsKK30KKworaW50IFZQOEluaXRJb0ludGVybmFsKFZQOElvKiBjb25zdCBpbywgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAvLyBtaXNtYXRjaCBlcnJvcgorICB9CisgIGlmIChpbyAhPSBOVUxMKSB7CisgICAgbWVtc2V0KGlvLCAwLCBzaXplb2YoKmlvKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK1ZQOERlY29kZXIqIFZQOE5ldyh2b2lkKSB7CisgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmRlYykpOworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBTZXRPayhkZWMpOworICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+SW5pdCgmZGVjLT53b3JrZXJfKTsKKyAgICBkZWMtPnJlYWR5XyA9IDA7CisgICAgZGVjLT5udW1fcGFydHNfbWludXNfb25lXyA9IDA7CisgICAgSW5pdEdldENvZWZmcygpOworICB9CisgIHJldHVybiBkZWM7Cit9CisKK1ZQOFN0YXR1c0NvZGUgVlA4U3RhdHVzKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoIWRlYykgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgcmV0dXJuIGRlYy0+c3RhdHVzXzsKK30KKworY29uc3QgY2hhciogVlA4U3RhdHVzTWVzc2FnZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gIm5vIG9iamVjdCI7CisgIGlmICghZGVjLT5lcnJvcl9tc2dfKSByZXR1cm4gIk9LIjsKKyAgcmV0dXJuIGRlYy0+ZXJyb3JfbXNnXzsKK30KKwordm9pZCBWUDhEZWxldGUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFZQOENsZWFyKGRlYyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KKworaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpIHsKKyAgLy8gVGhlIG9sZGVzdCBlcnJvciByZXBvcnRlZCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG5ldyBvbmUuCisgIGlmIChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19PSykgeworICAgIGRlYy0+c3RhdHVzXyA9IGVycm9yOworICAgIGRlYy0+ZXJyb3JfbXNnXyA9IG1zZzsKKyAgICBkZWMtPnJlYWR5XyA9IDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIHJldHVybiAoZGF0YV9zaXplID49IDMgJiYKKyAgICAgICAgICBkYXRhWzBdID09IDB4OWQgJiYgZGF0YVsxXSA9PSAweDAxICYmIGRhdGFbMl0gPT0gMHgyYSk7Cit9CisKK2ludCBWUDhHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBjaHVua19zaXplLAorICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpIHsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBWUDhfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKKyAgfQorICAvLyBjaGVjayBzaWduYXR1cmUKKyAgaWYgKCFWUDhDaGVja1NpZ25hdHVyZShkYXRhICsgMywgZGF0YV9zaXplIC0gMykpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBXcm9uZyBzaWduYXR1cmUuCisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgYml0cyA9IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKKyAgICBjb25zdCBpbnQga2V5X2ZyYW1lID0gIShiaXRzICYgMSk7CisgICAgY29uc3QgaW50IHcgPSAoKGRhdGFbN10gPDwgOCkgfCBkYXRhWzZdKSAmIDB4M2ZmZjsKKyAgICBjb25zdCBpbnQgaCA9ICgoZGF0YVs5XSA8PCA4KSB8IGRhdGFbOF0pICYgMHgzZmZmOworCisgICAgaWYgKCFrZXlfZnJhbWUpIHsgICAvLyBOb3QgYSBrZXlmcmFtZS4KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoKGJpdHMgPj4gMSkgJiA3KSA+IDMpIHsKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIHVua25vd24gcHJvZmlsZQorICAgIH0KKyAgICBpZiAoISgoYml0cyA+PiA0KSAmIDEpKSB7CisgICAgICByZXR1cm4gMDsgICAgICAgICAvLyBmaXJzdCBmcmFtZSBpcyBpbnZpc2libGUhCisgICAgfQorICAgIGlmICgoKGJpdHMgPj4gNSkpID49IGNodW5rX3NpemUpIHsgIC8vIHBhcnRpdGlvbl9sZW5ndGgKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIGluY29uc2lzdGVudCBzaXplIGluZm9ybWF0aW9uLgorICAgIH0KKyAgICBpZiAodyA9PSAwIHx8IGggPT0gMCkgeworICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBib3RoIHdpZHRoIGFuZCBoZWlnaHQgdG8gYmUgemVyby4KKyAgICB9CisKKyAgICBpZiAod2lkdGgpIHsKKyAgICAgICp3aWR0aCA9IHc7CisgICAgfQorICAgIGlmIChoZWlnaHQpIHsKKyAgICAgICpoZWlnaHQgPSBoOworICAgIH0KKworICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXIgcGFyc2luZworCitzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyKSB7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisgIGhkci0+dXNlX3NlZ21lbnRfID0gMDsKKyAgaGRyLT51cGRhdGVfbWFwXyA9IDA7CisgIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gMTsKKyAgbWVtc2V0KGhkci0+cXVhbnRpemVyXywgMCwgc2l6ZW9mKGhkci0+cXVhbnRpemVyXykpOworICBtZW1zZXQoaGRyLT5maWx0ZXJfc3RyZW5ndGhfLCAwLCBzaXplb2YoaGRyLT5maWx0ZXJfc3RyZW5ndGhfKSk7Cit9CisKKy8vIFBhcmFncmFwaCA5LjMKK3N0YXRpYyBpbnQgUGFyc2VTZWdtZW50SGVhZGVyKFZQOEJpdFJlYWRlciogYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhTZWdtZW50SGVhZGVyKiBoZHIsIFZQOFByb2JhKiBwcm9iYSkgeworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisgIGhkci0+dXNlX3NlZ21lbnRfID0gVlA4R2V0KGJyKTsKKyAgaWYgKGhkci0+dXNlX3NlZ21lbnRfKSB7CisgICAgaGRyLT51cGRhdGVfbWFwXyA9IFZQOEdldChicik7CisgICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgZGF0YQorICAgICAgaW50IHM7CisgICAgICBoZHItPmFic29sdXRlX2RlbHRhXyA9IFZQOEdldChicik7CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgaGRyLT5xdWFudGl6ZXJfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA3KSA6IDA7CisgICAgICB9CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgaGRyLT5maWx0ZXJfc3RyZW5ndGhfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KSA6IDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChoZHItPnVwZGF0ZV9tYXBfKSB7CisgICAgICBpbnQgczsKKyAgICAgIGZvciAocyA9IDA7IHMgPCBNQl9GRUFUVVJFX1RSRUVfUFJPQlM7ICsrcykgeworICAgICAgICBwcm9iYS0+c2VnbWVudHNfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFZhbHVlKGJyLCA4KSA6IDI1NXU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGhkci0+dXBkYXRlX21hcF8gPSAwOworICB9CisgIHJldHVybiAhYnItPmVvZl87Cit9CisKKy8vIFBhcmFncmFwaCA5LjUKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBWUDhfU1RBVFVTX1NVU1BFTkRFRCBpZiB3ZSBkb24ndCBoYXZlIGFsbCB0aGUKKy8vIG5lY2Vzc2FyeSBkYXRhIGluICdidWYnLgorLy8gVGhpcyBjYXNlIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvciAoZm9yIGluY3JlbWVudGFsIGRlY29kaW5nKS4KKy8vIFN0aWxsLCBubyBiaXRyZWFkZXIgaXMgZXZlciBpbml0aWFsaXplZCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlYWQKKy8vIHVuYXZhaWxhYmxlIG1lbW9yeS4KKy8vIElmIHdlIGRvbid0IGV2ZW4gaGF2ZSB0aGUgcGFydGl0aW9ucycgc2l6ZXMsIHRoYW4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEKKy8vIGlzIHJldHVybmVkLCBhbmQgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorLy8gSWYgdGhlIHBhcnRpdGlvbnMgd2VyZSBwb3NpdGlvbmVkIG9rLCBWUDhfU1RBVFVTX09LIGlzIHJldHVybmVkLgorc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VQYXJ0aXRpb25zKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBzaXplKSB7CisgIFZQOEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIGNvbnN0IHVpbnQ4X3QqIHN6ID0gYnVmOworICBjb25zdCB1aW50OF90KiBidWZfZW5kID0gYnVmICsgc2l6ZTsKKyAgY29uc3QgdWludDhfdCogcGFydF9zdGFydDsKKyAgc2l6ZV90IHNpemVfbGVmdCA9IHNpemU7CisgIHNpemVfdCBsYXN0X3BhcnQ7CisgIHNpemVfdCBwOworCisgIGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPSAoMSA8PCBWUDhHZXRWYWx1ZShiciwgMikpIC0gMTsKKyAgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfbWludXNfb25lXzsKKyAgaWYgKHNpemUgPCAzICogbGFzdF9wYXJ0KSB7CisgICAgLy8gd2UgY2FuJ3QgZXZlbiByZWFkIHRoZSBzaXplcyB3aXRoIHN6W10hIFRoYXQncyBhIGZhaWx1cmUuCisgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICB9CisgIHBhcnRfc3RhcnQgPSBidWYgKyBsYXN0X3BhcnQgKiAzOworICBzaXplX2xlZnQgLT0gbGFzdF9wYXJ0ICogMzsKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RfcGFydDsgKytwKSB7CisgICAgc2l6ZV90IHBzaXplID0gc3pbMF0gfCAoc3pbMV0gPDwgOCkgfCAoc3pbMl0gPDwgMTYpOworICAgIGlmIChwc2l6ZSA+IHNpemVfbGVmdCkgcHNpemUgPSBzaXplX2xlZnQ7CisgICAgVlA4SW5pdEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIHBhcnRfc3RhcnQsIHBzaXplKTsKKyAgICBwYXJ0X3N0YXJ0ICs9IHBzaXplOworICAgIHNpemVfbGVmdCAtPSBwc2l6ZTsKKyAgICBzeiArPSAzOworICB9CisgIFZQOEluaXRCaXRSZWFkZXIoZGVjLT5wYXJ0c18gKyBsYXN0X3BhcnQsIHBhcnRfc3RhcnQsIHNpemVfbGVmdCk7CisgIHJldHVybiAocGFydF9zdGFydCA8IGJ1Zl9lbmQpID8gVlA4X1NUQVRVU19PSyA6CisgICAgICAgICAgIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgIC8vIEluaXQgaXMgb2ssIGJ1dCB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YQorfQorCisvLyBQYXJhZ3JhcGggOS40CitzdGF0aWMgaW50IFBhcnNlRmlsdGVySGVhZGVyKFZQOEJpdFJlYWRlciogYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZkZWMtPmZpbHRlcl9oZHJfOworICBoZHItPnNpbXBsZV8gICAgPSBWUDhHZXQoYnIpOworICBoZHItPmxldmVsXyAgICAgPSBWUDhHZXRWYWx1ZShiciwgNik7CisgIGhkci0+c2hhcnBuZXNzXyA9IFZQOEdldFZhbHVlKGJyLCAzKTsKKyAgaGRyLT51c2VfbGZfZGVsdGFfID0gVlA4R2V0KGJyKTsKKyAgaWYgKGhkci0+dXNlX2xmX2RlbHRhXykgeworICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIGxmLWRlbHRhPworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFRl9MRl9ERUxUQVM7ICsraSkgeworICAgICAgICBpZiAoVlA4R2V0KGJyKSkgeworICAgICAgICAgIGhkci0+cmVmX2xmX2RlbHRhX1tpXSA9IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NT0RFX0xGX0RFTFRBUzsgKytpKSB7CisgICAgICAgIGlmIChWUDhHZXQoYnIpKSB7CisgICAgICAgICAgaGRyLT5tb2RlX2xmX2RlbHRhX1tpXSA9IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWMtPmZpbHRlcl90eXBlXyA9IChoZHItPmxldmVsXyA9PSAwKSA/IDAgOiBoZHItPnNpbXBsZV8gPyAxIDogMjsKKyAgcmV0dXJuICFici0+ZW9mXzsKK30KKworLy8gVG9wbW9zdCBjYWxsCitpbnQgVlA4R2V0SGVhZGVycyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBjb25zdCB1aW50OF90KiBidWY7CisgIHNpemVfdCBidWZfc2l6ZTsKKyAgVlA4RnJhbWVIZWFkZXIqIGZybV9oZHI7CisgIFZQOFBpY3R1cmVIZWFkZXIqIHBpY19oZHI7CisgIFZQOEJpdFJlYWRlciogYnI7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworCisgIGlmIChkZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIFNldE9rKGRlYyk7CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBWUDhJbyBwYXNzZWQgdG8gVlA4R2V0SGVhZGVycygpIik7CisgIH0KKyAgYnVmID0gaW8tPmRhdGE7CisgIGJ1Zl9zaXplID0gaW8tPmRhdGFfc2l6ZTsKKyAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGVkIGhlYWRlci4iKTsKKyAgfQorCisgIC8vIFBhcmFncmFwaCA5LjEKKyAgeworICAgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSBidWZbMF0gfCAoYnVmWzFdIDw8IDgpIHwgKGJ1ZlsyXSA8PCAxNik7CisgICAgZnJtX2hkciA9ICZkZWMtPmZybV9oZHJfOworICAgIGZybV9oZHItPmtleV9mcmFtZV8gPSAhKGJpdHMgJiAxKTsKKyAgICBmcm1faGRyLT5wcm9maWxlXyA9IChiaXRzID4+IDEpICYgNzsKKyAgICBmcm1faGRyLT5zaG93XyA9IChiaXRzID4+IDQpICYgMTsKKyAgICBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA9IChiaXRzID4+IDUpOworICAgIGlmIChmcm1faGRyLT5wcm9maWxlXyA+IDMpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3Qga2V5ZnJhbWUgcGFyYW1ldGVycy4iKTsKKyAgICB9CisgICAgaWYgKCFmcm1faGRyLT5zaG93XykgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBub3QgZGlzcGxheWFibGUuIik7CisgICAgfQorICAgIGJ1ZiArPSAzOworICAgIGJ1Zl9zaXplIC09IDM7CisgIH0KKworICBwaWNfaGRyID0gJmRlYy0+cGljX2hkcl87CisgIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgLy8gUGFyYWdyYXBoIDkuMgorICAgIGlmIChidWZfc2l6ZSA8IDcpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgcGljdHVyZSBoZWFkZXIiKTsKKyAgICB9CisgICAgaWYgKCFWUDhDaGVja1NpZ25hdHVyZShidWYsIGJ1Zl9zaXplKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBjb2RlIHdvcmQiKTsKKyAgICB9CisgICAgcGljX2hkci0+d2lkdGhfID0gKChidWZbNF0gPDwgOCkgfCBidWZbM10pICYgMHgzZmZmOworICAgIHBpY19oZHItPnhzY2FsZV8gPSBidWZbNF0gPj4gNjsgICAvLyByYXRpbzogMSwgNS80IDUvMyBvciAyCisgICAgcGljX2hkci0+aGVpZ2h0XyA9ICgoYnVmWzZdIDw8IDgpIHwgYnVmWzVdKSAmIDB4M2ZmZjsKKyAgICBwaWNfaGRyLT55c2NhbGVfID0gYnVmWzZdID4+IDY7CisgICAgYnVmICs9IDc7CisgICAgYnVmX3NpemUgLT0gNzsKKworICAgIGRlYy0+bWJfd18gPSAocGljX2hkci0+d2lkdGhfICsgMTUpID4+IDQ7CisgICAgZGVjLT5tYl9oXyA9IChwaWNfaGRyLT5oZWlnaHRfICsgMTUpID4+IDQ7CisKKyAgICAvLyBTZXR1cCBkZWZhdWx0IG91dHB1dCBhcmVhIChjYW4gYmUgbGF0ZXIgbW9kaWZpZWQgZHVyaW5nIGlvLT5zZXR1cCgpKQorICAgIGlvLT53aWR0aCA9IHBpY19oZHItPndpZHRoXzsKKyAgICBpby0+aGVpZ2h0ID0gcGljX2hkci0+aGVpZ2h0XzsKKyAgICAvLyBJTVBPUlRBTlQhIHVzZSBzb21lIHNhbmUgZGltZW5zaW9ucyBpbiBjcm9wXyogYW5kIHNjYWxlZF8qIGZpZWxkcy4KKyAgICAvLyBTbyB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRob3V0IGFsd2F5cyB0ZXN0aW5nIGZvcgorICAgIC8vICd1c2VfY3JvcHBpbmcnLgorICAgIGlvLT51c2VfY3JvcHBpbmcgPSAwOworICAgIGlvLT5jcm9wX3RvcCAgPSAwOworICAgIGlvLT5jcm9wX2xlZnQgPSAwOworICAgIGlvLT5jcm9wX3JpZ2h0ICA9IGlvLT53aWR0aDsKKyAgICBpby0+Y3JvcF9ib3R0b20gPSBpby0+aGVpZ2h0OworICAgIGlvLT51c2Vfc2NhbGluZyAgPSAwOworICAgIGlvLT5zY2FsZWRfd2lkdGggPSBpby0+d2lkdGg7CisgICAgaW8tPnNjYWxlZF9oZWlnaHQgPSBpby0+aGVpZ2h0OworCisgICAgaW8tPm1iX3cgPSBpby0+d2lkdGg7ICAgLy8gc2FuaXR5IGNoZWNrCisgICAgaW8tPm1iX2ggPSBpby0+aGVpZ2h0OyAgLy8gZGl0dG8KKworICAgIFZQOFJlc2V0UHJvYmEoJmRlYy0+cHJvYmFfKTsKKyAgICBSZXNldFNlZ21lbnRIZWFkZXIoJmRlYy0+c2VnbWVudF9oZHJfKTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHRoZSBwYXJ0aXRpb24gIzAgYXZhaWxhYmxlLCBhbmQgaW5pdGlhbGl6ZSBkZWMtPmJyXworICAvLyB0byByZWFkIHRoaXMgcGFydGl0aW9uIChhbmQgdGhpcyBwYXJ0aXRpb24gb25seSkuCisgIGlmIChmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA+IGJ1Zl9zaXplKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFydGl0aW9uIGxlbmd0aCIpOworICB9CisKKyAgYnIgPSAmZGVjLT5icl87CisgIFZQOEluaXRCaXRSZWFkZXIoYnIsIGJ1ZiwgZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF8pOworICBidWYgKz0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87CisgIGJ1Zl9zaXplIC09IGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfOworCisgIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgcGljX2hkci0+Y29sb3JzcGFjZV8gPSBWUDhHZXQoYnIpOworICAgIHBpY19oZHItPmNsYW1wX3R5cGVfID0gVlA4R2V0KGJyKTsKKyAgfQorICBpZiAoIVBhcnNlU2VnbWVudEhlYWRlcihiciwgJmRlYy0+c2VnbWVudF9oZHJfLCAmZGVjLT5wcm9iYV8pKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2Ugc2VnbWVudCBoZWFkZXIiKTsKKyAgfQorICAvLyBGaWx0ZXIgc3BlY3MKKyAgaWYgKCFQYXJzZUZpbHRlckhlYWRlcihiciwgZGVjKSkgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHBhcnNlIGZpbHRlciBoZWFkZXIiKTsKKyAgfQorICBzdGF0dXMgPSBQYXJzZVBhcnRpdGlvbnMoZGVjLCBidWYsIGJ1Zl9zaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgc3RhdHVzLCAiY2Fubm90IHBhcnNlIHBhcnRpdGlvbnMiKTsKKyAgfQorCisgIC8vIHF1YW50aXplciBjaGFuZ2UKKyAgVlA4UGFyc2VRdWFudChkZWMpOworCisgIC8vIEZyYW1lIGJ1ZmZlciBtYXJraW5nCisgIGlmICghZnJtX2hkci0+a2V5X2ZyYW1lXykgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBhIGtleSBmcmFtZS4iKTsKKyAgfQorCisgIFZQOEdldChicik7ICAgLy8gaWdub3JlIHRoZSB2YWx1ZSBvZiB1cGRhdGVfcHJvYmFfCisKKyAgVlA4UGFyc2VQcm9iYShiciwgZGVjKTsKKworICAvLyBzYW5pdGl6ZWQgc3RhdGUKKyAgZGVjLT5yZWFkeV8gPSAxOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlc2lkdWFsIGRlY29kaW5nIChQYXJhZ3JhcGggMTMuMiAvIDEzLjMpCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ2W10gPQorICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5LCAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCogY29uc3Qga0NhdDM0NTZbXSA9IHsga0NhdDMsIGtDYXQ0LCBrQ2F0NSwga0NhdDYgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0geworICAwLCAxLCA0LCA4LCAgNSwgMiwgMywgNiwgIDksIDEyLCAxMywgMTAsICA3LCAxMSwgMTQsIDE1Cit9OworCisvLyBTZWUgc2VjdGlvbiAxMy0yOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2Mzg2I3NlY3Rpb24tMTMuMgorc3RhdGljIGludCBHZXRMYXJnZVZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHApIHsKKyAgaW50IHY7CisgIGlmICghVlA4R2V0Qml0KGJyLCBwWzNdKSkgeworICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzRdKSkgeworICAgICAgdiA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHYgPSAzICsgVlA4R2V0Qml0KGJyLCBwWzVdKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNl0pKSB7CisgICAgICBpZiAoIVZQOEdldEJpdChiciwgcFs3XSkpIHsKKyAgICAgICAgdiA9IDUgKyBWUDhHZXRCaXQoYnIsIDE1OSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2ID0gNyArIDIgKiBWUDhHZXRCaXQoYnIsIDE2NSk7CisgICAgICAgIHYgKz0gVlA4R2V0Qml0KGJyLCAxNDUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1aW50OF90KiB0YWI7CisgICAgICBjb25zdCBpbnQgYml0MSA9IFZQOEdldEJpdChiciwgcFs4XSk7CisgICAgICBjb25zdCBpbnQgYml0MCA9IFZQOEdldEJpdChiciwgcFs5ICsgYml0MV0pOworICAgICAgY29uc3QgaW50IGNhdCA9IDIgKiBiaXQxICsgYml0MDsKKyAgICAgIHYgPSAwOworICAgICAgZm9yICh0YWIgPSBrQ2F0MzQ1NltjYXRdOyAqdGFiOyArK3RhYikgeworICAgICAgICB2ICs9IHYgKyBWUDhHZXRCaXQoYnIsICp0YWIpOworICAgICAgfQorICAgICAgdiArPSAzICsgKDggPDwgY2F0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKKy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG5vbi16ZXJvIGNvZWZmIHBsdXMgb25lCitzdGF0aWMgaW50IEdldENvZWZmc0Zhc3QoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCBwcm9iW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0eCwgY29uc3QgcXVhbnRfdCBkcSwgaW50IG4sIGludDE2X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwID0gcHJvYltuXS0+cHJvYmFzX1tjdHhdOworICBmb3IgKDsgbiA8IDE2OyArK24pIHsKKyAgICBpZiAoIVZQOEdldEJpdChiciwgcFswXSkpIHsKKyAgICAgIHJldHVybiBuOyAgLy8gcHJldmlvdXMgY29lZmYgd2FzIGxhc3Qgbm9uLXplcm8gY29lZmYKKyAgICB9CisgICAgd2hpbGUgKCFWUDhHZXRCaXQoYnIsIHBbMV0pKSB7ICAgICAgIC8vIHNlcXVlbmNlIG9mIHplcm8gY29lZmZzCisgICAgICBwID0gcHJvYlsrK25dLT5wcm9iYXNfWzBdOworICAgICAgaWYgKG4gPT0gMTYpIHJldHVybiAxNjsKKyAgICB9CisgICAgeyAgICAgICAgLy8gbm9uIHplcm8gY29lZmYKKyAgICAgIGNvbnN0IFZQOFByb2JhQXJyYXkqIGNvbnN0IHBfY3R4ID0gJnByb2JbbiArIDFdLT5wcm9iYXNfWzBdOworICAgICAgaW50IHY7CisgICAgICBpZiAoIVZQOEdldEJpdChiciwgcFsyXSkpIHsKKyAgICAgICAgdiA9IDE7CisgICAgICAgIHAgPSBwX2N0eFsxXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHYgPSBHZXRMYXJnZVZhbHVlKGJyLCBwKTsKKyAgICAgICAgcCA9IHBfY3R4WzJdOworICAgICAgfQorICAgICAgb3V0W2taaWd6YWdbbl1dID0gVlA4R2V0U2lnbmVkKGJyLCB2KSAqIGRxW24gPiAwXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE2OworfQorCisvLyBUaGlzIHZlcnNpb24gb2YgR2V0Q29lZmZzKCkgdXNlcyBWUDhHZXRCaXRBbHQoKSB3aGljaCBpcyBhbiBhbHRlcm5hdGUgdmVyc2lvbgorLy8gb2YgVlA4R2V0Qml0QWx0KCkgdGFyZ2V0aW5nIHNwZWNpZmljIHBsYXRmb3Jtcy4KK3N0YXRpYyBpbnQgR2V0Q29lZmZzQWx0KFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCBwcm9iW10sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwcm9iW25dLT5wcm9iYXNfW2N0eF07CisgIGZvciAoOyBuIDwgMTY7ICsrbikgeworICAgIGlmICghVlA4R2V0Qml0QWx0KGJyLCBwWzBdKSkgeworICAgICAgcmV0dXJuIG47ICAvLyBwcmV2aW91cyBjb2VmZiB3YXMgbGFzdCBub24temVybyBjb2VmZgorICAgIH0KKyAgICB3aGlsZSAoIVZQOEdldEJpdEFsdChiciwgcFsxXSkpIHsgICAgICAgLy8gc2VxdWVuY2Ugb2YgemVybyBjb2VmZnMKKyAgICAgIHAgPSBwcm9iWysrbl0tPnByb2Jhc19bMF07CisgICAgICBpZiAobiA9PSAxNikgcmV0dXJuIDE2OworICAgIH0KKyAgICB7ICAgICAgICAvLyBub24gemVybyBjb2VmZgorICAgICAgY29uc3QgVlA4UHJvYmFBcnJheSogY29uc3QgcF9jdHggPSAmcHJvYltuICsgMV0tPnByb2Jhc19bMF07CisgICAgICBpbnQgdjsKKyAgICAgIGlmICghVlA4R2V0Qml0QWx0KGJyLCBwWzJdKSkgeworICAgICAgICB2ID0gMTsKKyAgICAgICAgcCA9IHBfY3R4WzFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOworICAgICAgICBwID0gcF9jdHhbMl07CisgICAgICB9CisgICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOworICAgIH0KKyAgfQorICByZXR1cm4gMTY7Cit9CisKK3N0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgSW5pdEdldENvZWZmcyh2b2lkKSB7CisgIGlmIChHZXRDb2VmZnMgPT0gTlVMTCkgeworICAgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrU2xvd1NTU0UzKSkgeworICAgICAgR2V0Q29lZmZzID0gR2V0Q29lZmZzQWx0OworICAgIH0gZWxzZSB7CisgICAgICBHZXRDb2VmZnMgPSBHZXRDb2VmZnNGYXN0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTnpDb2RlQml0cyh1aW50MzJfdCBuel9jb2VmZnMsIGludCBueiwgaW50IGRjX256KSB7CisgIG56X2NvZWZmcyA8PD0gMjsKKyAgbnpfY29lZmZzIHw9IChueiA+IDMpID8gMyA6IChueiA+IDEpID8gMiA6IGRjX256OworICByZXR1cm4gbnpfY29lZmZzOworfQorCitzdGF0aWMgaW50IFBhcnNlUmVzaWR1YWxzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TUIqIGNvbnN0IG1iLCBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyKSB7CisgIGNvbnN0IFZQOEJhbmRQcm9iYXMqICgqIGNvbnN0IGJhbmRzKVsxNiArIDFdID0gZGVjLT5wcm9iYV8uYmFuZHNfcHRyXzsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogY29uc3QgKiBhY19wcm9iYTsKKyAgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGRlYy0+bWJfZGF0YV8gKyBkZWMtPm1iX3hfOworICBjb25zdCBWUDhRdWFudE1hdHJpeCogY29uc3QgcSA9ICZkZWMtPmRxbV9bYmxvY2stPnNlZ21lbnRfXTsKKyAgaW50MTZfdCogZHN0ID0gYmxvY2stPmNvZWZmc187CisgIFZQOE1CKiBjb25zdCBsZWZ0X21iID0gZGVjLT5tYl9pbmZvXyAtIDE7CisgIHVpbnQ4X3QgdG56LCBsbno7CisgIHVpbnQzMl90IG5vbl96ZXJvX3kgPSAwOworICB1aW50MzJfdCBub25femVyb191diA9IDA7CisgIGludCB4LCB5LCBjaDsKKyAgdWludDMyX3Qgb3V0X3RfbnosIG91dF9sX256OworICBpbnQgZmlyc3Q7CisKKyAgbWVtc2V0KGRzdCwgMCwgMzg0ICogc2l6ZW9mKCpkc3QpKTsKKyAgaWYgKCFibG9jay0+aXNfaTR4NF8pIHsgICAgLy8gcGFyc2UgREMKKyAgICBpbnQxNl90IGRjWzE2XSA9IHsgMCB9OworICAgIGNvbnN0IGludCBjdHggPSBtYi0+bnpfZGNfICsgbGVmdF9tYi0+bnpfZGNfOworICAgIGNvbnN0IGludCBueiA9IEdldENvZWZmcyh0b2tlbl9iciwgYmFuZHNbMV0sIGN0eCwgcS0+eTJfbWF0XywgMCwgZGMpOworICAgIG1iLT5uel9kY18gPSBsZWZ0X21iLT5uel9kY18gPSAobnogPiAwKTsKKyAgICBpZiAobnogPiAxKSB7ICAgLy8gbW9yZSB0aGFuIGp1c3QgdGhlIERDIC0+IHBlcmZvcm0gdGhlIGZ1bGwgdHJhbnNmb3JtCisgICAgICBWUDhUcmFuc2Zvcm1XSFQoZGMsIGRzdCk7CisgICAgfSBlbHNlIHsgICAgICAgIC8vIG9ubHkgREMgaXMgbm9uLXplcm8gLT4gaW5saW5lZCBzaW1wbGlmaWVkIHRyYW5zZm9ybQorICAgICAgaW50IGk7CisgICAgICBjb25zdCBpbnQgZGMwID0gKGRjWzBdICsgMykgPj4gMzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNiAqIDE2OyBpICs9IDE2KSBkc3RbaV0gPSBkYzA7CisgICAgfQorICAgIGZpcnN0ID0gMTsKKyAgICBhY19wcm9iYSA9IGJhbmRzWzBdOworICB9IGVsc2UgeworICAgIGZpcnN0ID0gMDsKKyAgICBhY19wcm9iYSA9IGJhbmRzWzNdOworICB9CisKKyAgdG56ID0gbWItPm56XyAmIDB4MGY7CisgIGxueiA9IGxlZnRfbWItPm56XyAmIDB4MGY7CisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBpbnQgbCA9IGxueiAmIDE7CisgICAgdWludDMyX3QgbnpfY29lZmZzID0gMDsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gbCArICh0bnogJiAxKTsKKyAgICAgIGNvbnN0IGludCBueiA9IEdldENvZWZmcyh0b2tlbl9iciwgYWNfcHJvYmEsIGN0eCwgcS0+eTFfbWF0XywgZmlyc3QsIGRzdCk7CisgICAgICBsID0gKG56ID4gZmlyc3QpOworICAgICAgdG56ID0gKHRueiA+PiAxKSB8IChsIDw8IDcpOworICAgICAgbnpfY29lZmZzID0gTnpDb2RlQml0cyhuel9jb2VmZnMsIG56LCBkc3RbMF0gIT0gMCk7CisgICAgICBkc3QgKz0gMTY7CisgICAgfQorICAgIHRueiA+Pj0gNDsKKyAgICBsbnogPSAobG56ID4+IDEpIHwgKGwgPDwgNyk7CisgICAgbm9uX3plcm9feSA9IChub25femVyb195IDw8IDgpIHwgbnpfY29lZmZzOworICB9CisgIG91dF90X256ID0gdG56OworICBvdXRfbF9ueiA9IGxueiA+PiA0OworCisgIGZvciAoY2ggPSAwOyBjaCA8IDQ7IGNoICs9IDIpIHsKKyAgICB1aW50MzJfdCBuel9jb2VmZnMgPSAwOworICAgIHRueiA9IG1iLT5uel8gPj4gKDQgKyBjaCk7CisgICAgbG56ID0gbGVmdF9tYi0+bnpfID4+ICg0ICsgY2gpOworICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgIGludCBsID0gbG56ICYgMTsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGwgKyAodG56ICYgMSk7CisgICAgICAgIGNvbnN0IGludCBueiA9IEdldENvZWZmcyh0b2tlbl9iciwgYmFuZHNbMl0sIGN0eCwgcS0+dXZfbWF0XywgMCwgZHN0KTsKKyAgICAgICAgbCA9IChueiA+IDApOworICAgICAgICB0bnogPSAodG56ID4+IDEpIHwgKGwgPDwgMyk7CisgICAgICAgIG56X2NvZWZmcyA9IE56Q29kZUJpdHMobnpfY29lZmZzLCBueiwgZHN0WzBdICE9IDApOworICAgICAgICBkc3QgKz0gMTY7CisgICAgICB9CisgICAgICB0bnogPj49IDI7CisgICAgICBsbnogPSAobG56ID4+IDEpIHwgKGwgPDwgNSk7CisgICAgfQorICAgIC8vIE5vdGU6IHdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBwZXItNHg0IGRldGFpbHMgZm9yIFUvViBibG9ja3MuCisgICAgbm9uX3plcm9fdXYgfD0gbnpfY29lZmZzIDw8ICg0ICogY2gpOworICAgIG91dF90X256IHw9ICh0bnogPDwgNCkgPDwgY2g7CisgICAgb3V0X2xfbnogfD0gKGxueiAmIDB4ZjApIDw8IGNoOworICB9CisgIG1iLT5uel8gPSBvdXRfdF9uejsKKyAgbGVmdF9tYi0+bnpfID0gb3V0X2xfbno7CisKKyAgYmxvY2stPm5vbl96ZXJvX3lfID0gbm9uX3plcm9feTsKKyAgYmxvY2stPm5vbl96ZXJvX3V2XyA9IG5vbl96ZXJvX3V2OworCisgIC8vIFdlIGxvb2sgYXQgdGhlIG1vZGUtY29kZSBvZiBlYWNoIGJsb2NrIGFuZCBjaGVjayBpZiBzb21lIGJsb2NrcyBoYXZlIGxlc3MKKyAgLy8gdGhhbiB0aHJlZSBub24temVybyBjb2VmZnMgKGNvZGUgPCAyKS4gVGhpcyBpcyB0byBhdm9pZCBkaXRoZXJpbmcgZmxhdCBhbmQKKyAgLy8gZW1wdHkgYmxvY2tzLgorICBibG9jay0+ZGl0aGVyXyA9IChub25femVyb191diAmIDB4YWFhYSkgPyAwIDogcS0+ZGl0aGVyXzsKKworICByZXR1cm4gIShub25femVyb195IHwgbm9uX3plcm9fdXYpOyAgLy8gd2lsbCBiZSB1c2VkIGZvciBmdXJ0aGVyIG9wdGltaXphdGlvbgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBsb29wCisKK2ludCBWUDhEZWNvZGVNQihWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKKyAgVlA4TUIqIGNvbnN0IGxlZnQgPSBkZWMtPm1iX2luZm9fIC0gMTsKKyAgVlA4TUIqIGNvbnN0IG1iID0gZGVjLT5tYl9pbmZvXyArIGRlYy0+bWJfeF87CisgIFZQOE1CRGF0YSogY29uc3QgYmxvY2sgPSBkZWMtPm1iX2RhdGFfICsgZGVjLT5tYl94XzsKKyAgaW50IHNraXAgPSBkZWMtPnVzZV9za2lwX3Byb2JhXyA/IGJsb2NrLT5za2lwXyA6IDA7CisKKyAgaWYgKCFza2lwKSB7CisgICAgc2tpcCA9IFBhcnNlUmVzaWR1YWxzKGRlYywgbWIsIHRva2VuX2JyKTsKKyAgfSBlbHNlIHsKKyAgICBsZWZ0LT5uel8gPSBtYi0+bnpfID0gMDsKKyAgICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeworICAgICAgbGVmdC0+bnpfZGNfID0gbWItPm56X2RjXyA9IDA7CisgICAgfQorICAgIGJsb2NrLT5ub25femVyb195XyA9IDA7CisgICAgYmxvY2stPm5vbl96ZXJvX3V2XyA9IDA7CisgICAgYmxvY2stPmRpdGhlcl8gPSAwOworICB9CisKKyAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgeyAgLy8gc3RvcmUgZmlsdGVyIGluZm8KKyAgICBWUDhGSW5mbyogY29uc3QgZmluZm8gPSBkZWMtPmZfaW5mb18gKyBkZWMtPm1iX3hfOworICAgICpmaW5mbyA9IGRlYy0+ZnN0cmVuZ3Roc19bYmxvY2stPnNlZ21lbnRfXVtibG9jay0+aXNfaTR4NF9dOworICAgIGZpbmZvLT5mX2lubmVyXyB8PSAhc2tpcDsKKyAgfQorCisgIHJldHVybiAhdG9rZW5fYnItPmVvZl87Cit9CisKK3ZvaWQgVlA4SW5pdFNjYW5saW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOworICBsZWZ0LT5uel8gPSAwOworICBsZWZ0LT5uel9kY18gPSAwOworICBtZW1zZXQoZGVjLT5pbnRyYV9sXywgQl9EQ19QUkVELCBzaXplb2YoZGVjLT5pbnRyYV9sXykpOworICBkZWMtPm1iX3hfID0gMDsKK30KKworc3RhdGljIGludCBQYXJzZUZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7CisgIGZvciAoZGVjLT5tYl95XyA9IDA7IGRlYy0+bWJfeV8gPCBkZWMtPmJyX21iX3lfOyArK2RlYy0+bWJfeV8pIHsKKyAgICAvLyBQYXJzZSBiaXRzdHJlYW0gZm9yIHRoaXMgcm93LgorICAgIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIgPQorICAgICAgICAmZGVjLT5wYXJ0c19bZGVjLT5tYl95XyAmIGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV9dOworICAgIGlmICghVlA4UGFyc2VJbnRyYU1vZGVSb3coJmRlYy0+YnJfLCBkZWMpKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlbWF0dXJlIGVuZC1vZi1wYXJ0aXRpb24wIGVuY291bnRlcmVkLiIpOworICAgIH0KKyAgICBmb3IgKDsgZGVjLT5tYl94XyA8IGRlYy0+bWJfd187ICsrZGVjLT5tYl94XykgeworICAgICAgaWYgKCFWUDhEZWNvZGVNQihkZWMsIHRva2VuX2JyKSkgeworICAgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kLW9mLWZpbGUgZW5jb3VudGVyZWQuIik7CisgICAgICB9CisgICAgfQorICAgIFZQOEluaXRTY2FubGluZShkZWMpOyAgIC8vIFByZXBhcmUgZm9yIG5leHQgc2NhbmxpbmUKKworICAgIC8vIFJlY29uc3RydWN0LCBmaWx0ZXIgYW5kIGVtaXQgdGhlIHJvdy4KKyAgICBpZiAoIVZQOFByb2Nlc3NSb3coZGVjLCBpbykpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwgIk91dHB1dCBhYm9ydGVkLiIpOworICAgIH0KKyAgfQorICBpZiAoZGVjLT5tdF9tZXRob2RfID4gMCkgeworICAgIGlmICghV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5TeW5jKCZkZWMtPndvcmtlcl8pKSByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAxOworfQorCisvLyBNYWluIGVudHJ5IHBvaW50CitpbnQgVlA4RGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGludCBvayA9IDA7CisgIGlmIChkZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBWUDhJbyBwYXJhbWV0ZXIgaW4gVlA4RGVjb2RlKCkuIik7CisgIH0KKworICBpZiAoIWRlYy0+cmVhZHlfKSB7CisgICAgaWYgKCFWUDhHZXRIZWFkZXJzKGRlYywgaW8pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgYXNzZXJ0KGRlYy0+cmVhZHlfKTsKKworICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVyLiBXaWxsIGNhbGwgaW8tPnNldHVwKCkuCisgIG9rID0gKFZQOEVudGVyQ3JpdGljYWwoZGVjLCBpbykgPT0gVlA4X1NUQVRVU19PSyk7CisgIGlmIChvaykgeyAgIC8vIGdvb2QgdG8gZ28uCisgICAgLy8gV2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIHByZXBhcmUgZXZlcnl0aGluZy4KKyAgICBpZiAob2spIG9rID0gVlA4SW5pdEZyYW1lKGRlYywgaW8pOworCisgICAgLy8gTWFpbiBkZWNvZGluZyBsb29wCisgICAgaWYgKG9rKSBvayA9IFBhcnNlRnJhbWUoZGVjLCBpbyk7CisKKyAgICAvLyBFeGl0LgorICAgIG9rICY9IFZQOEV4aXRDcml0aWNhbChkZWMsIGlvKTsKKyAgfQorCisgIGlmICghb2spIHsKKyAgICBWUDhDbGVhcihkZWMpOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5yZWFkeV8gPSAwOworICByZXR1cm4gb2s7Cit9CisKK3ZvaWQgVlA4Q2xlYXIoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkVuZCgmZGVjLT53b3JrZXJfKTsKKyAgV2ViUERlYWxsb2NhdGVBbHBoYU1lbW9yeShkZWMpOworICBXZWJQU2FmZUZyZWUoZGVjLT5tZW1fKTsKKyAgZGVjLT5tZW1fID0gTlVMTDsKKyAgZGVjLT5tZW1fc2l6ZV8gPSAwOworICBtZW1zZXQoJmRlYy0+YnJfLCAwLCBzaXplb2YoZGVjLT5icl8pKTsKKyAgZGVjLT5yZWFkeV8gPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2RlY29kZV92cDguaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5oCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9kZWNvZGVfdnA4LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5oCmluZGV4IGFjZGIxNWEuLmNhODViMzQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9kZWNvZGVfdnA4LmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhfZGVjLmgKQEAgLTExLDEyICsxMSwxMiBAQAogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpZm5kZWYgV0VCUF9XRUJQX0RFQ09ERV9WUDhfSF8KLSNkZWZpbmUgV0VCUF9XRUJQX0RFQ09ERV9WUDhfSF8KKyNpZm5kZWYgV0VCUF9ERUNfVlA4X0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19WUDhfREVDX0hfCiAKLSNpbmNsdWRlICIuLi93ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2RlY29kZS5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCkBAIC0zMyw3ICszMyw3IEBACiAvLyAgIC8qIGN1c3RvbWl6ZSBpbydzIGZ1bmN0aW9ucyAoc2V0dXAoKS9wdXQoKS90ZWFyZG93bigpKSBpZiBuZWVkZWQuICovCiAvLwogLy8gICBWUDhEZWNvZGVyKiBkZWMgPSBWUDhOZXcoKTsKLS8vICAgYm9vbCBvayA9IFZQOERlY29kZShkZWMpOworLy8gICBpbnQgb2sgPSBWUDhEZWNvZGUoZGVjLCAmaW8pOwogLy8gICBpZiAoIW9rKSBwcmludGYoIkVycm9yOiAlc1xuIiwgVlA4U3RhdHVzTWVzc2FnZShkZWMpKTsKIC8vICAgVlA4RGVsZXRlKGRlYyk7CiAvLyAgIHJldHVybiBvazsKQEAgLTEzMiw3ICsxMzIsOCBAQAogICByZXR1cm4gVlA4SW5pdElvSW50ZXJuYWwoaW8sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTik7CiB9CiAKLS8vIFN0YXJ0IGRlY29kaW5nIGEgbmV3IHBpY3R1cmUuIFJldHVybnMgdHJ1ZSBpZiBvay4KKy8vIERlY29kZSB0aGUgVlA4IGZyYW1lIGhlYWRlci4gUmV0dXJucyB0cnVlIGlmIG9rLgorLy8gTm90ZTogJ2lvLT5kYXRhJyBtdXN0IGJlIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgVlA4IGZyYW1lIGhlYWRlci4KIGludCBWUDhHZXRIZWFkZXJzKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKIAogLy8gRGVjb2RlIGEgcGljdHVyZS4gV2lsbCBjYWxsIFZQOEdldEhlYWRlcnMoKSBpZiBpdCB3YXNuJ3QgZG9uZSBhbHJlYWR5LgpAQCAtMTU2LDI5ICsxNTcsMjkgQEAKIC8vIE1pc2NlbGxhbmVvdXMgVlA4L1ZQOEwgYml0c3RyZWFtIHByb2JpbmcgZnVuY3Rpb25zLgogCiAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgMyBieXRlcyBpbiBkYXRhIGNvbnRhaW4gdGhlIFZQOCBzaWduYXR1cmUuCi1XRUJQX0VYVEVSTihpbnQpIFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworV0VCUF9FWFRFUk4gaW50IFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwogCiAvLyBWYWxpZGF0ZXMgdGhlIFZQOCBkYXRhLWhlYWRlciBhbmQgcmV0cmlldmVzIGJhc2ljIGhlYWRlciBpbmZvcm1hdGlvbiB2aXoKIC8vIHdpZHRoIGFuZCBoZWlnaHQuIFJldHVybnMgMCBpbiBjYXNlIG9mIGZvcm1hdHRpbmcgZXJyb3IuICp3aWR0aC8qaGVpZ2h0CiAvLyBjYW4gYmUgcGFzc2VkIE5VTEwuCi1XRUJQX0VYVEVSTihpbnQpIFZQOEdldEluZm8oCitXRUJQX0VYVEVSTiBpbnQgVlA4R2V0SW5mbygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLAogICAgIHNpemVfdCBkYXRhX3NpemUsICAgIC8vIGRhdGEgYXZhaWxhYmxlIHNvIGZhcgogICAgIHNpemVfdCBjaHVua19zaXplLCAgIC8vIHRvdGFsIGRhdGEgc2l6ZSBleHBlY3RlZCBpbiB0aGUgY2h1bmsKICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCk7CiAKIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCBieXRlKHMpIGluIGRhdGEgaXMgYSBWUDhMIHNpZ25hdHVyZS4KLVdFQlBfRVhURVJOKGludCkgVlA4TENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKTsKK1dFQlBfRVhURVJOIGludCBWUDhMQ2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpOwogCiAvLyBWYWxpZGF0ZXMgdGhlIFZQOEwgZGF0YS1oZWFkZXIgYW5kIHJldHJpZXZlcyBiYXNpYyBoZWFkZXIgaW5mb3JtYXRpb24gdml6CiAvLyB3aWR0aCwgaGVpZ2h0IGFuZCBhbHBoYS4gUmV0dXJucyAwIGluIGNhc2Ugb2YgZm9ybWF0dGluZyBlcnJvci4KIC8vIHdpZHRoL2hlaWdodC9oYXNfYWxwaGEgY2FuIGJlIHBhc3NlZCBOVUxMLgotV0VCUF9FWFRFUk4oaW50KSBWUDhMR2V0SW5mbygKK1dFQlBfRVhURVJOIGludCBWUDhMR2V0SW5mbygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCAgLy8gZGF0YSBhdmFpbGFibGUgc28gZmFyCiAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQsIGludCogY29uc3QgaGFzX2FscGhhKTsKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvKiBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXyAqLworI2VuZGlmICAvKiBXRUJQX0RFQ19WUDhfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGlfZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGlfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMGRiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4aV9kZWMuaApAQCAtMCwwICsxLDMyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFZQOCBkZWNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0RFQ19WUDhJX0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19WUDhJX0RFQ19IXworCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvY29tbW9uX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3RocmVhZF91dGlscy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgZGVmaW5lcyBhbmQgZW51bXMKKworLy8gdmVyc2lvbiBudW1iZXJzCisjZGVmaW5lIERFQ19NQUpfVkVSU0lPTiAxCisjZGVmaW5lIERFQ19NSU5fVkVSU0lPTiAwCisjZGVmaW5lIERFQ19SRVZfVkVSU0lPTiAwCisKKy8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLiBDYWNoZSBpcyAzMi1ieXRlcyB3aWRlICg9IG9uZSBjYWNoZWxpbmUpLgorLy8gQ29uc3RyYWludHMgYXJlOiBXZSBuZWVkIHRvIHN0b3JlIG9uZSAxNngxNiBibG9jayBvZiBsdW1hIHNhbXBsZXMgKHkpLAorLy8gYW5kIHR3byA4eDggY2hyb21hIGJsb2NrcyAodS92KS4gVGhlc2UgYXJlIGJldHRlciBiZSAxNi1ieXRlcyBhbGlnbmVkLAorLy8gaW4gb3JkZXIgdG8gYmUgU0lNRC1mcmllbmRseS4gV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3AsIGxlZnQgYW5kCisvLyB0b3AtbGVmdCBzYW1wbGVzIChmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9ja3MpLCBhbG9uZyB3aXRoIGZvdXIKKy8vIGV4dHJhIHRvcC1yaWdodCBzYW1wbGVzIGZvciBsdW1hIChpbnRyYTR4NCBwcmVkaWN0aW9uIG9ubHkpLgorLy8gT25lIHBvc3NpYmxlIGxheW91dCBpcywgdXNpbmcgMzIgKiAoMTcgKyA5KSBieXRlczoKKy8vCisvLyAgIC4rLS0tLS0tICAgPC0gb25seSAxIHBpeGVsIGhpZ2gKKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5Li4KKy8vICAgListLS4rLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAorLy8gICAufHV1Lnx2dgorLy8gICAufHV1Lnx2dgorLy8KKy8vIEV2ZXJ5IGNoYXJhY3RlciBpcyBhIDR4NCBibG9jaywgd2l0aCBsZWdlbmQ6CisvLyAgJy4nID0gdW51c2VkCisvLyAgJ3knID0geS1zYW1wbGVzICAgJ3UnID0gdS1zYW1wbGVzICAgICAndicgPSB1LXNhbXBsZXMKKy8vICAnfCcgPSBsZWZ0IHNhbXBsZSwgICAnLScgPSB0b3Agc2FtcGxlLCAgICAnKycgPSB0b3AtbGVmdCBzYW1wbGUKKy8vICAndCcgPSBleHRyYSB0b3AtcmlnaHQgc2FtcGxlIGZvciA0eDQgbW9kZXMKKyNkZWZpbmUgWVVWX1NJWkUgKEJQUyAqIDE3ICsgQlBTICogOSkKKyNkZWZpbmUgWV9PRkYgICAgKEJQUyAqIDEgKyA4KQorI2RlZmluZSBVX09GRiAgICAoWV9PRkYgKyBCUFMgKiAxNiArIEJQUykKKyNkZWZpbmUgVl9PRkYgICAgKFVfT0ZGICsgMTYpCisKKy8vIG1pbmltYWwgd2lkdGggdW5kZXIgd2hpY2ggbG9zc3kgbXVsdGktdGhyZWFkaW5nIGlzIGFsd2F5cyBkaXNhYmxlZAorI2RlZmluZSBNSU5fV0lEVEhfRk9SX1RIUkVBRFMgNTEyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXJzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBrZXlfZnJhbWVfOworICB1aW50OF90IHByb2ZpbGVfOworICB1aW50OF90IHNob3dfOworICB1aW50MzJfdCBwYXJ0aXRpb25fbGVuZ3RoXzsKK30gVlA4RnJhbWVIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDE2X3Qgd2lkdGhfOworICB1aW50MTZfdCBoZWlnaHRfOworICB1aW50OF90IHhzY2FsZV87CisgIHVpbnQ4X3QgeXNjYWxlXzsKKyAgdWludDhfdCBjb2xvcnNwYWNlXzsgICAvLyAwID0gWUNiQ3IKKyAgdWludDhfdCBjbGFtcF90eXBlXzsKK30gVlA4UGljdHVyZUhlYWRlcjsKKworLy8gc2VnbWVudCBmZWF0dXJlcwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgdXNlX3NlZ21lbnRfOworICBpbnQgdXBkYXRlX21hcF87ICAgICAgICAvLyB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgc2VnbWVudCBtYXAgb3Igbm90CisgIGludCBhYnNvbHV0ZV9kZWx0YV87ICAgIC8vIGFic29sdXRlIG9yIGRlbHRhIHZhbHVlcyBmb3IgcXVhbnRpemVyIGFuZCBmaWx0ZXIKKyAgaW50OF90IHF1YW50aXplcl9bTlVNX01CX1NFR01FTlRTXTsgICAgICAgIC8vIHF1YW50aXphdGlvbiBjaGFuZ2VzCisgIGludDhfdCBmaWx0ZXJfc3RyZW5ndGhfW05VTV9NQl9TRUdNRU5UU107ICAvLyBmaWx0ZXIgc3RyZW5ndGggZm9yIHNlZ21lbnRzCit9IFZQOFNlZ21lbnRIZWFkZXI7CisKKy8vIHByb2JhcyBhc3NvY2lhdGVkIHRvIG9uZSBvZiB0aGUgY29udGV4dHMKK3R5cGVkZWYgdWludDhfdCBWUDhQcm9iYUFycmF5W05VTV9QUk9CQVNdOworCit0eXBlZGVmIHN0cnVjdCB7ICAgLy8gYWxsIHRoZSBwcm9iYXMgYXNzb2NpYXRlZCB0byBvbmUgYmFuZAorICBWUDhQcm9iYUFycmF5IHByb2Jhc19bTlVNX0NUWF07Cit9IFZQOEJhbmRQcm9iYXM7CisKKy8vIFN0cnVjdCBjb2xsZWN0aW5nIGFsbCBmcmFtZS1wZXJzaXN0ZW50IHByb2JhYmlsaXRpZXMuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3Qgc2VnbWVudHNfW01CX0ZFQVRVUkVfVFJFRV9QUk9CU107CisgIC8vIFR5cGU6IDA6SW50cmExNi1BQyAgMTpJbnRyYTE2LURDICAgMjpDaHJvbWEgICAzOkludHJhNAorICBWUDhCYW5kUHJvYmFzIGJhbmRzX1tOVU1fVFlQRVNdW05VTV9CQU5EU107CisgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGJhbmRzX3B0cl9bTlVNX1RZUEVTXVsxNiArIDFdOworfSBWUDhQcm9iYTsKKworLy8gRmlsdGVyIHBhcmFtZXRlcnMKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNpbXBsZV87ICAgICAgICAgICAgICAgICAgLy8gMD1jb21wbGV4LCAxPXNpbXBsZQorICBpbnQgbGV2ZWxfOyAgICAgICAgICAgICAgICAgICAvLyBbMC4uNjNdCisgIGludCBzaGFycG5lc3NfOyAgICAgICAgICAgICAgIC8vIFswLi43XQorICBpbnQgdXNlX2xmX2RlbHRhXzsKKyAgaW50IHJlZl9sZl9kZWx0YV9bTlVNX1JFRl9MRl9ERUxUQVNdOworICBpbnQgbW9kZV9sZl9kZWx0YV9bTlVNX01PREVfTEZfREVMVEFTXTsKK30gVlA4RmlsdGVySGVhZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5mb3JtYXRpb25zIGFib3V0IHRoZSBtYWNyb2Jsb2Nrcy4KKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gZmlsdGVyIHNwZWNzCisgIHVpbnQ4X3QgZl9saW1pdF87ICAgICAgLy8gZmlsdGVyIGxpbWl0IGluIFszLi4xODldLCBvciAwIGlmIG5vIGZpbHRlcmluZworICB1aW50OF90IGZfaWxldmVsXzsgICAgIC8vIGlubmVyIGxpbWl0IGluIFsxLi42M10KKyAgdWludDhfdCBmX2lubmVyXzsgICAgICAvLyBkbyBpbm5lciBmaWx0ZXJpbmc/CisgIHVpbnQ4X3QgaGV2X3RocmVzaF87ICAgLy8gaGlnaCBlZGdlIHZhcmlhbmNlIHRocmVzaG9sZCBpbiBbMC4uMl0KK30gVlA4RkluZm87CisKK3R5cGVkZWYgc3RydWN0IHsgIC8vIFRvcC9MZWZ0IENvbnRleHRzIHVzZWQgZm9yIHN5bnRheC1wYXJzaW5nCisgIHVpbnQ4X3QgbnpfOyAgICAgICAgLy8gbm9uLXplcm8gQUMvREMgY29lZmZzICg0Yml0IGZvciBsdW1hICsgNGJpdCBmb3IgY2hyb21hKQorICB1aW50OF90IG56X2RjXzsgICAgIC8vIG5vbi16ZXJvIERDIGNvZWZmICgxYml0KQorfSBWUDhNQjsKKworLy8gRGVxdWFudGl6YXRpb24gbWF0cmljZXMKK3R5cGVkZWYgaW50IHF1YW50X3RbMl07ICAgICAgLy8gW0RDIC8gQUNdLiAgQ2FuIGJlICd1aW50MTZfdFsyXScgdG9vICh+c2xvd2VyKS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgcXVhbnRfdCB5MV9tYXRfLCB5Ml9tYXRfLCB1dl9tYXRfOworCisgIGludCB1dl9xdWFudF87ICAgLy8gVS9WIHF1YW50aXplciB2YWx1ZQorICBpbnQgZGl0aGVyXzsgICAgIC8vIGRpdGhlcmluZyBhbXBsaXR1ZGUgKDAgPSBvZmYsIG1heD0yNTUpCit9IFZQOFF1YW50TWF0cml4OworCisvLyBEYXRhIG5lZWRlZCB0byByZWNvbnN0cnVjdCBhIG1hY3JvYmxvY2sKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50MTZfdCBjb2VmZnNfWzM4NF07ICAgLy8gMzg0IGNvZWZmcyA9ICgxNis0KzQpICogNCo0CisgIHVpbnQ4X3QgaXNfaTR4NF87ICAgICAgIC8vIHRydWUgaWYgaW50cmE0eDQKKyAgdWludDhfdCBpbW9kZXNfWzE2XTsgICAgLy8gb25lIDE2eDE2IG1vZGUgKCMwKSBvciBzaXh0ZWVuIDR4NCBtb2RlcworICB1aW50OF90IHV2bW9kZV87ICAgICAgICAvLyBjaHJvbWEgcHJlZGljdGlvbiBtb2RlCisgIC8vIGJpdC13aXNlIGluZm8gYWJvdXQgdGhlIGNvbnRlbnQgb2YgZWFjaCBzdWItNHg0IGJsb2NrcyAoaW4gZGVjb2Rpbmcgb3JkZXIpLgorICAvLyBFYWNoIG9mIHRoZSA0eDQgYmxvY2tzIGZvciB5L3UvdiBpcyBhc3NvY2lhdGVkIHdpdGggYSAyYiBjb2RlIGFjY29yZGluZyB0bzoKKyAgLy8gICBjb2RlPTAgLT4gbm8gY29lZmZpY2llbnQKKyAgLy8gICBjb2RlPTEgLT4gb25seSBEQworICAvLyAgIGNvZGU9MiAtPiBmaXJzdCB0aHJlZSBjb2VmZmljaWVudHMgYXJlIG5vbi16ZXJvCisgIC8vICAgY29kZT0zIC0+IG1vcmUgdGhhbiB0aHJlZSBjb2VmZmljaWVudHMgYXJlIG5vbi16ZXJvCisgIC8vIFRoaXMgYWxsb3dzIHRvIGNhbGwgc3BlY2lhbGl6ZWQgdHJhbnNmb3JtIGZ1bmN0aW9ucy4KKyAgdWludDMyX3Qgbm9uX3plcm9feV87CisgIHVpbnQzMl90IG5vbl96ZXJvX3V2XzsKKyAgdWludDhfdCBkaXRoZXJfOyAgICAgIC8vIGxvY2FsIGRpdGhlcmluZyBzdHJlbmd0aCAoZGVkdWNlZCBmcm9tIG5vbl96ZXJvXyopCisgIHVpbnQ4X3Qgc2tpcF87CisgIHVpbnQ4X3Qgc2VnbWVudF87Cit9IFZQOE1CRGF0YTsKKworLy8gUGVyc2lzdGVudCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIHBhcmFsbGVsIHByb2Nlc3NpbmcKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGlkXzsgICAgICAgICAgICAgIC8vIGNhY2hlIHJvdyB0byBwcm9jZXNzIChpbiBbMC4uMl0pCisgIGludCBtYl95XzsgICAgICAgICAgICAvLyBtYWNyb2Jsb2NrIHBvc2l0aW9uIG9mIHRoZSByb3cKKyAgaW50IGZpbHRlcl9yb3dfOyAgICAgIC8vIHRydWUgaWYgcm93LWZpbHRlcmluZyBpcyBuZWVkZWQKKyAgVlA4RkluZm8qIGZfaW5mb187ICAgIC8vIGZpbHRlciBzdHJlbmd0aHMgKHN3YXBwZWQgd2l0aCBkZWMtPmZfaW5mb18pCisgIFZQOE1CRGF0YSogbWJfZGF0YV87ICAvLyByZWNvbnN0cnVjdGlvbiBkYXRhIChzd2FwcGVkIHdpdGggZGVjLT5tYl9kYXRhXykKKyAgVlA4SW8gaW9fOyAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIFZQOElvIHRvIHBhc3MgdG8gcHV0KCkKK30gVlA4VGhyZWFkQ29udGV4dDsKKworLy8gU2F2ZWQgdG9wIHNhbXBsZXMsIHBlciBtYWNyb2Jsb2NrLiBGaXRzIGludG8gYSBjYWNoZS1saW5lLgordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IHlbMTZdLCB1WzhdLCB2WzhdOworfSBWUDhUb3BTYW1wbGVzOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4RGVjb2RlcjogdGhlIG1haW4gb3BhcXVlIHN0cnVjdHVyZSBoYW5kZWQgb3ZlciB0byB1c2VyCisKK3N0cnVjdCBWUDhEZWNvZGVyIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXNfOworICBpbnQgcmVhZHlfOyAgICAgLy8gdHJ1ZSBpZiByZWFkeSB0byBkZWNvZGUgYSBwaWN0dXJlIHdpdGggVlA4RGVjb2RlKCkKKyAgY29uc3QgY2hhciogZXJyb3JfbXNnXzsgIC8vIHNldCB3aGVuIHN0YXR1c18gaXMgbm90IE9LLgorCisgIC8vIE1haW4gZGF0YSBzb3VyY2UKKyAgVlA4Qml0UmVhZGVyIGJyXzsKKworICAvLyBoZWFkZXJzCisgIFZQOEZyYW1lSGVhZGVyICAgZnJtX2hkcl87CisgIFZQOFBpY3R1cmVIZWFkZXIgcGljX2hkcl87CisgIFZQOEZpbHRlckhlYWRlciAgZmlsdGVyX2hkcl87CisgIFZQOFNlZ21lbnRIZWFkZXIgc2VnbWVudF9oZHJfOworCisgIC8vIFdvcmtlcgorICBXZWJQV29ya2VyIHdvcmtlcl87CisgIGludCBtdF9tZXRob2RfOyAgICAgIC8vIG11bHRpLXRocmVhZCBtZXRob2Q6IDA9b2ZmLCAxPVtwYXJzZStyZWNvbl1bZmlsdGVyXQorICAgICAgICAgICAgICAgICAgICAgICAvLyAyPVtwYXJzZV1bcmVjb24rZmlsdGVyXQorICBpbnQgY2FjaGVfaWRfOyAgICAgICAvLyBjdXJyZW50IGNhY2hlIHJvdworICBpbnQgbnVtX2NhY2hlc187ICAgICAvLyBudW1iZXIgb2YgY2FjaGVkIHJvd3Mgb2YgMTYgcGl4ZWxzICgxLCAyIG9yIDMpCisgIFZQOFRocmVhZENvbnRleHQgdGhyZWFkX2N0eF87ICAvLyBUaHJlYWQgY29udGV4dAorCisgIC8vIGRpbWVuc2lvbiwgaW4gbWFjcm9ibG9jayB1bml0cy4KKyAgaW50IG1iX3dfLCBtYl9oXzsKKworICAvLyBNYWNyb2Jsb2NrIHRvIHByb2Nlc3MvZmlsdGVyLCBkZXBlbmRpbmcgb24gY3JvcHBpbmcgYW5kIGZpbHRlcl90eXBlLgorICBpbnQgdGxfbWJfeF8sIHRsX21iX3lfOyAgLy8gdG9wLWxlZnQgTUIgdGhhdCBtdXN0IGJlIGluLWxvb3AgZmlsdGVyZWQKKyAgaW50IGJyX21iX3hfLCBicl9tYl95XzsgIC8vIGxhc3QgYm90dG9tLXJpZ2h0IE1CIHRoYXQgbXVzdCBiZSBkZWNvZGVkCisKKyAgLy8gbnVtYmVyIG9mIHBhcnRpdGlvbnMgbWludXMgb25lLgorICB1aW50MzJfdCBudW1fcGFydHNfbWludXNfb25lXzsKKyAgLy8gcGVyLXBhcnRpdGlvbiBib29sZWFuIGRlY29kZXJzLgorICBWUDhCaXRSZWFkZXIgcGFydHNfW01BWF9OVU1fUEFSVElUSU9OU107CisKKyAgLy8gRGl0aGVyaW5nIHN0cmVuZ3RoLCBkZWR1Y2VkIGZyb20gZGVjb2Rpbmcgb3B0aW9ucworICBpbnQgZGl0aGVyXzsgICAgICAgICAgICAgICAgLy8gd2hldGhlciB0byB1c2UgZGl0aGVyaW5nIG9yIG5vdAorICBWUDhSYW5kb20gZGl0aGVyaW5nX3JnXzsgICAgLy8gcmFuZG9tIGdlbmVyYXRvciBmb3IgZGl0aGVyaW5nCisKKyAgLy8gZGVxdWFudGl6YXRpb24gKG9uZSBzZXQgb2YgREMvQUMgZGVxdWFudCBmYWN0b3IgcGVyIHNlZ21lbnQpCisgIFZQOFF1YW50TWF0cml4IGRxbV9bTlVNX01CX1NFR01FTlRTXTsKKworICAvLyBwcm9iYWJpbGl0aWVzCisgIFZQOFByb2JhIHByb2JhXzsKKyAgaW50IHVzZV9za2lwX3Byb2JhXzsKKyAgdWludDhfdCBza2lwX3BfOworCisgIC8vIEJvdW5kYXJ5IGRhdGEgY2FjaGUgYW5kIHBlcnNpc3RlbnQgYnVmZmVycy4KKyAgdWludDhfdCogaW50cmFfdF87ICAgICAgLy8gdG9wIGludHJhIG1vZGVzIHZhbHVlczogNCAqIG1iX3dfCisgIHVpbnQ4X3QgIGludHJhX2xfWzRdOyAgIC8vIGxlZnQgaW50cmEgbW9kZXMgdmFsdWVzCisKKyAgVlA4VG9wU2FtcGxlcyogeXV2X3RfOyAgLy8gdG9wIHkvdS92IHNhbXBsZXMKKworICBWUDhNQiogbWJfaW5mb187ICAgICAgICAvLyBjb250ZXh0dWFsIG1hY3JvYmxvY2sgaW5mbyAobWJfd18gKyAxKQorICBWUDhGSW5mbyogZl9pbmZvXzsgICAgICAvLyBmaWx0ZXIgc3RyZW5ndGggaW5mbworICB1aW50OF90KiB5dXZfYl87ICAgICAgICAvLyBtYWluIGJsb2NrIGZvciBZL1UvViAoc2l6ZSA9IFlVVl9TSVpFKQorCisgIHVpbnQ4X3QqIGNhY2hlX3lfOyAgICAgIC8vIG1hY3JvYmxvY2sgcm93IGZvciBzdG9yaW5nIHVuZmlsdGVyZWQgc2FtcGxlcworICB1aW50OF90KiBjYWNoZV91XzsKKyAgdWludDhfdCogY2FjaGVfdl87CisgIGludCBjYWNoZV95X3N0cmlkZV87CisgIGludCBjYWNoZV91dl9zdHJpZGVfOworCisgIC8vIG1haW4gbWVtb3J5IGNodW5rIGZvciB0aGUgYWJvdmUgZGF0YS4gUGVyc2lzdGVudC4KKyAgdm9pZCogbWVtXzsKKyAgc2l6ZV90IG1lbV9zaXplXzsKKworICAvLyBQZXIgbWFjcm9ibG9jayBub24tcGVyc2lzdGVudCBpbmZvcy4KKyAgaW50IG1iX3hfLCBtYl95XzsgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbiwgaW4gbWFjcm9ibG9jayB1bml0cworICBWUDhNQkRhdGEqIG1iX2RhdGFfOyAgICAvLyBwYXJzZWQgcmVjb25zdHJ1Y3Rpb24gZGF0YQorCisgIC8vIEZpbHRlcmluZyBzaWRlLWluZm8KKyAgaW50IGZpbHRlcl90eXBlXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA9b2ZmLCAxPXNpbXBsZSwgMj1jb21wbGV4CisgIFZQOEZJbmZvIGZzdHJlbmd0aHNfW05VTV9NQl9TRUdNRU5UU11bMl07ICAvLyBwcmVjYWxjdWxhdGVkIHBlci1zZWdtZW50L3R5cGUKKworICAvLyBBbHBoYQorICBzdHJ1Y3QgQUxQSERlY29kZXIqIGFscGhfZGVjXzsgIC8vIGFscGhhLXBsYW5lIGRlY29kZXIgb2JqZWN0CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX2RhdGFfOyAgICAgLy8gY29tcHJlc3NlZCBhbHBoYSBkYXRhIChpZiBwcmVzZW50KQorICBzaXplX3QgYWxwaGFfZGF0YV9zaXplXzsKKyAgaW50IGlzX2FscGhhX2RlY29kZWRfOyAgICAgIC8vIHRydWUgaWYgYWxwaGFfZGF0YV8gaXMgZGVjb2RlZCBpbiBhbHBoYV9wbGFuZV8KKyAgdWludDhfdCogYWxwaGFfcGxhbmVfbWVtXzsgIC8vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGFscGhhX3BsYW5lXworICB1aW50OF90KiBhbHBoYV9wbGFuZV87ICAgICAgLy8gb3V0cHV0LiBQZXJzaXN0ZW50LCBjb250YWlucyB0aGUgd2hvbGUgZGF0YS4KKyAgY29uc3QgdWludDhfdCogYWxwaGFfcHJldl9saW5lXzsgIC8vIGxhc3QgZGVjb2RlZCBhbHBoYSByb3cgKG9yIE5VTEwpCisgIGludCBhbHBoYV9kaXRoZXJpbmdfOyAgICAgICAvLyBkZXJpdmVkIGZyb20gZGVjb2Rpbmcgb3B0aW9ucyAoMD1vZmYsIDEwMD1mdWxsKQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KKworLy8gaW4gdnA4LmMKK2ludCBWUDhTZXRFcnJvcihWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgVlA4U3RhdHVzQ29kZSBlcnJvciwgY29uc3QgY2hhciogY29uc3QgbXNnKTsKKworLy8gaW4gdHJlZS5jCit2b2lkIFZQOFJlc2V0UHJvYmEoVlA4UHJvYmEqIGNvbnN0IHByb2JhKTsKK3ZvaWQgVlA4UGFyc2VQcm9iYShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworLy8gcGFyc2VzIG9uZSByb3cgb2YgaW50cmEgbW9kZSBkYXRhIGluIHBhcnRpdGlvbiAwLCByZXR1cm5zICFlb2YKK2ludCBWUDhQYXJzZUludHJhTW9kZVJvdyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBpbiBxdWFudC5jCit2b2lkIFZQOFBhcnNlUXVhbnQoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKworLy8gaW4gZnJhbWUuYworaW50IFZQOEluaXRGcmFtZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7CisvLyBDYWxsIGlvLT5zZXR1cCgpIGFuZCBmaW5pc2ggc2V0dGluZyB1cCBzY2FuIHBhcmFtZXRlcnMuCisvLyBBZnRlciB0aGlzIGNhbGwgcmV0dXJucywgb25lIG11c3QgYWx3YXlzIGNhbGwgVlA4RXhpdENyaXRpY2FsKCkgd2l0aCB0aGUKKy8vIHNhbWUgcGFyYW1ldGVycy4gQm90aCBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW4gcGFpci4gUmV0dXJucyBWUDhfU1RBVFVTX09LCisvLyBpZiBvaywgb3RoZXJ3aXNlIHNldHMgYW5kIHJldHVybnMgdGhlIGVycm9yIHN0YXR1cyBvbiAqZGVjLgorVlA4U3RhdHVzQ29kZSBWUDhFbnRlckNyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBpbiBwYWlyIHdpdGggVlA4RW50ZXJDcml0aWNhbCgpLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgoraW50IFZQOEV4aXRDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7CisvLyBSZXR1cm4gdGhlIG11bHRpLXRocmVhZGluZyBtZXRob2QgdG8gdXNlICgwPW9mZiksIGRlcGVuZGluZworLy8gb24gb3B0aW9ucyBhbmQgYml0c3RyZWFtIHNpemUuIE9ubHkgZm9yIGxvc3N5IGRlY29kaW5nLgoraW50IFZQOEdldFRocmVhZE1ldGhvZChjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisvLyBJbml0aWFsaXplIGRpdGhlcmluZyBwb3N0LXByb2Nlc3MgaWYgbmVlZGVkLgordm9pZCBWUDhJbml0RGl0aGVyaW5nKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworLy8gUHJvY2VzcyB0aGUgbGFzdCBkZWNvZGVkIHJvdyAoZmlsdGVyaW5nICsgb3V0cHV0KS4KK2ludCBWUDhQcm9jZXNzUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIFRvIGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbmxpbmUsIHRvIGluaXRpYWxpemUgcHJlZGljdG9ycy4KK3ZvaWQgVlA4SW5pdFNjYW5saW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBEZWNvZGUgb25lIG1hY3JvYmxvY2suIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhLgoraW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icik7CisKKy8vIGluIGFscGhhLmMKK2NvbnN0IHVpbnQ4X3QqIFZQOERlY29tcHJlc3NBbHBoYVJvd3MoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhJbyogY29uc3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0RFQ19WUDhJX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhsX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhsX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzI0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxfZGVjLmMKQEAgLTAsMCArMSwxNjk0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbWFpbiBlbnRyeSBmb3IgdGhlIGRlY29kZXIKKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZGVjL2FscGhhaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGxpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9odWZmbWFuX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgTlVNX0FSR0JfQ0FDSEVfUk9XUyAgICAgICAgICAxNgorCitzdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoTGl0ZXJhbHMgPSAxNjsKK3N0YXRpYyBjb25zdCBpbnQga0NvZGVMZW5ndGhSZXBlYXRDb2RlID0gMTY7CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aEV4dHJhQml0c1szXSA9IHsgMiwgMywgNyB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NvZGVMZW5ndGhSZXBlYXRPZmZzZXRzWzNdID0geyAzLCAzLCAxMSB9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEZpdmUgSHVmZm1hbiBjb2RlcyBhcmUgdXNlZCBhdCBlYWNoIG1ldGEgY29kZToKKy8vICAxLiBncmVlbiArIGxlbmd0aCBwcmVmaXggY29kZXMgKyBjb2xvciBjYWNoZSBjb2RlcywKKy8vICAyLiBhbHBoYSwKKy8vICAzLiByZWQsCisvLyAgNC4gYmx1ZSwgYW5kLAorLy8gIDUuIGRpc3RhbmNlIHByZWZpeCBjb2Rlcy4KK3R5cGVkZWYgZW51bSB7CisgIEdSRUVOID0gMCwKKyAgUkVEICAgPSAxLAorICBCTFVFICA9IDIsCisgIEFMUEhBID0gMywKKyAgRElTVCAgPSA0Cit9IEh1ZmZJbmRleDsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBbHBoYWJldFNpemVbSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXSA9IHsKKyAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTLAorICBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTV9MSVRFUkFMX0NPREVTLAorICBOVU1fRElTVEFOQ0VfQ09ERVMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtMaXRlcmFsTWFwW0hVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERV0gPSB7CisgIDAsIDEsIDEsIDEsIDAKK307CisKKyNkZWZpbmUgTlVNX0NPREVfTEVOR1RIX0NPREVTICAgICAgIDE5CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aENvZGVPcmRlcltOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0geworICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Cit9OworCisjZGVmaW5lIENPREVfVE9fUExBTkVfQ09ERVMgICAgICAgIDEyMAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NvZGVUb1BsYW5lW0NPREVfVE9fUExBTkVfQ09ERVNdID0geworICAweDE4LCAweDA3LCAweDE3LCAweDE5LCAweDI4LCAweDA2LCAweDI3LCAweDI5LCAweDE2LCAweDFhLAorICAweDI2LCAweDJhLCAweDM4LCAweDA1LCAweDM3LCAweDM5LCAweDE1LCAweDFiLCAweDM2LCAweDNhLAorICAweDI1LCAweDJiLCAweDQ4LCAweDA0LCAweDQ3LCAweDQ5LCAweDE0LCAweDFjLCAweDM1LCAweDNiLAorICAweDQ2LCAweDRhLCAweDI0LCAweDJjLCAweDU4LCAweDQ1LCAweDRiLCAweDM0LCAweDNjLCAweDAzLAorICAweDU3LCAweDU5LCAweDEzLCAweDFkLCAweDU2LCAweDVhLCAweDIzLCAweDJkLCAweDQ0LCAweDRjLAorICAweDU1LCAweDViLCAweDMzLCAweDNkLCAweDY4LCAweDAyLCAweDY3LCAweDY5LCAweDEyLCAweDFlLAorICAweDY2LCAweDZhLCAweDIyLCAweDJlLCAweDU0LCAweDVjLCAweDQzLCAweDRkLCAweDY1LCAweDZiLAorICAweDMyLCAweDNlLCAweDc4LCAweDAxLCAweDc3LCAweDc5LCAweDUzLCAweDVkLCAweDExLCAweDFmLAorICAweDY0LCAweDZjLCAweDQyLCAweDRlLCAweDc2LCAweDdhLCAweDIxLCAweDJmLCAweDc1LCAweDdiLAorICAweDMxLCAweDNmLCAweDYzLCAweDZkLCAweDUyLCAweDVlLCAweDAwLCAweDc0LCAweDdjLCAweDQxLAorICAweDRmLCAweDEwLCAweDIwLCAweDYyLCAweDZlLCAweDMwLCAweDczLCAweDdkLCAweDUxLCAweDVmLAorICAweDQwLCAweDcyLCAweDdlLCAweDYxLCAweDZmLCAweDUwLCAweDcxLCAweDdmLCAweDYwLCAweDcwCit9OworCisvLyBNZW1vcnkgbmVlZGVkIGZvciBsb29rdXAgdGFibGVzIG9mIG9uZSBIdWZmbWFuIHRyZWUgZ3JvdXAuIFJlZCwgYmx1ZSwgYWxwaGEKKy8vIGFuZCBkaXN0YW5jZSBhbHBoYWJldHMgYXJlIGNvbnN0YW50ICgyNTYgZm9yIHJlZCwgYmx1ZSBhbmQgYWxwaGEsIDQwIGZvcgorLy8gZGlzdGFuY2UpIGFuZCBsb29rdXAgdGFibGUgc2l6ZXMgZm9yIHRoZW0gaW4gd29yc3QgY2FzZSBhcmUgNjMwIGFuZCA0MTAKKy8vIHJlc3BlY3RpdmVseS4gU2l6ZSBvZiBncmVlbiBhbHBoYWJldCBkZXBlbmRzIG9uIGNvbG9yIGNhY2hlIHNpemUgYW5kIGlzIGVxdWFsCisvLyB0byAyNTYgKGdyZWVuIGNvbXBvbmVudCB2YWx1ZXMpICsgMjQgKGxlbmd0aCBwcmVmaXggdmFsdWVzKQorLy8gKyBjb2xvcl9jYWNoZV9zaXplIChiZXR3ZWVuIDAgYW5kIDIwNDgpLgorLy8gQWxsIHZhbHVlcyBjb21wdXRlZCBmb3IgOC1iaXQgZmlyc3QgbGV2ZWwgbG9va3VwIHdpdGggTWFyayBBZGxlcidzIHRvb2w6CisvLyBodHRwOi8vd3d3LmhkZmdyb3VwLm9yZy9mdHAvbGliLWV4dGVybmFsL3psaWIvemxpYi0xLjIuNS9leGFtcGxlcy9lbm91Z2guYworI2RlZmluZSBGSVhFRF9UQUJMRV9TSVpFICg2MzAgKiAzICsgNDEwKQorc3RhdGljIGNvbnN0IHVpbnQxNl90IGtUYWJsZVNpemVbMTJdID0geworICBGSVhFRF9UQUJMRV9TSVpFICsgNjU0LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjU2LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjU4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjYyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjcwLAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjg2LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNzE4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNzgyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgOTEyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgMTE2OCwKKyAgRklYRURfVEFCTEVfU0laRSArIDE2ODAsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyAyNzA0Cit9OworCitzdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhMQ2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIChzaXplID49IFZQOExfRlJBTUVfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgICBkYXRhWzBdID09IFZQOExfTUFHSUNfQllURSAmJgorICAgICAgICAgIChkYXRhWzRdID4+IDUpID09IDApOyAgLy8gdmVyc2lvbgorfQorCitzdGF0aWMgaW50IFJlYWRJbWFnZUluZm8oVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYWxwaGEpIHsKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgOCkgIT0gVlA4TF9NQUdJQ19CWVRFKSByZXR1cm4gMDsKKyAgKndpZHRoID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOworICAqaGVpZ2h0ID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOworICAqaGFzX2FscGhhID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgVlA4TF9WRVJTSU9OX0JJVFMpICE9IDApIHJldHVybiAwOworICByZXR1cm4gIWJyLT5lb3NfOworfQorCitpbnQgVlA4TEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwgaW50KiBjb25zdCBoYXNfYWxwaGEpIHsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhCisgIH0gZWxzZSBpZiAoIVZQOExDaGVja1NpZ25hdHVyZShkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gYmFkIHNpZ25hdHVyZQorICB9IGVsc2UgeworICAgIGludCB3LCBoLCBhOworICAgIFZQOExCaXRSZWFkZXIgYnI7CisgICAgVlA4TEluaXRCaXRSZWFkZXIoJmJyLCBkYXRhLCBkYXRhX3NpemUpOworICAgIGlmICghUmVhZEltYWdlSW5mbygmYnIsICZ3LCAmaCwgJmEpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHc7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaDsKKyAgICBpZiAoaGFzX2FscGhhICE9IE5VTEwpICpoYXNfYWxwaGEgPSBhOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0Q29weURpc3RhbmNlKGludCBkaXN0YW5jZV9zeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBpbnQgZXh0cmFfYml0cywgb2Zmc2V0OworICBpZiAoZGlzdGFuY2Vfc3ltYm9sIDwgNCkgeworICAgIHJldHVybiBkaXN0YW5jZV9zeW1ib2wgKyAxOworICB9CisgIGV4dHJhX2JpdHMgPSAoZGlzdGFuY2Vfc3ltYm9sIC0gMikgPj4gMTsKKyAgb2Zmc2V0ID0gKDIgKyAoZGlzdGFuY2Vfc3ltYm9sICYgMSkpIDw8IGV4dHJhX2JpdHM7CisgIHJldHVybiBvZmZzZXQgKyBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRDb3B5TGVuZ3RoKGludCBsZW5ndGhfc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIC8vIExlbmd0aCBhbmQgZGlzdGFuY2UgcHJlZml4ZXMgYXJlIGVuY29kZWQgdGhlIHNhbWUgd2F5LgorICByZXR1cm4gR2V0Q29weURpc3RhbmNlKGxlbmd0aF9zeW1ib2wsIGJyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQbGFuZUNvZGVUb0Rpc3RhbmNlKGludCB4c2l6ZSwgaW50IHBsYW5lX2NvZGUpIHsKKyAgaWYgKHBsYW5lX2NvZGUgPiBDT0RFX1RPX1BMQU5FX0NPREVTKSB7CisgICAgcmV0dXJuIHBsYW5lX2NvZGUgLSBDT0RFX1RPX1BMQU5FX0NPREVTOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBkaXN0X2NvZGUgPSBrQ29kZVRvUGxhbmVbcGxhbmVfY29kZSAtIDFdOworICAgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdF9jb2RlID4+IDQ7CisgICAgY29uc3QgaW50IHhvZmZzZXQgPSA4IC0gKGRpc3RfY29kZSAmIDB4Zik7CisgICAgY29uc3QgaW50IGRpc3QgPSB5b2Zmc2V0ICogeHNpemUgKyB4b2Zmc2V0OworICAgIHJldHVybiAoZGlzdCA+PSAxKSA/IGRpc3QgOiAxOyAgLy8gZGlzdDwxIGNhbiBoYXBwZW4gaWYgeHNpemUgaXMgdmVyeSBzbWFsbAorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGVzIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBmcm9tIGJpdC1zdHJlYW0uCisvLyBGaWxsQml0V2luZG93KGJyKSBuZWVkcyB0byBiZSBjYWxsZWQgYXQgbWluaW11bSBldmVyeSBzZWNvbmQgY2FsbAorLy8gdG8gUmVhZFN5bWJvbCwgaW4gb3JkZXIgdG8gcHJlLWZldGNoIGVub3VnaCBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkU3ltYm9sKGNvbnN0IEh1ZmZtYW5Db2RlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBpbnQgbmJpdHM7CisgIHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpOworICB0YWJsZSArPSB2YWwgJiBIVUZGTUFOX1RBQkxFX01BU0s7CisgIG5iaXRzID0gdGFibGUtPmJpdHMgLSBIVUZGTUFOX1RBQkxFX0JJVFM7CisgIGlmIChuYml0cyA+IDApIHsKKyAgICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyBIVUZGTUFOX1RBQkxFX0JJVFMpOworICAgIHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpOworICAgIHRhYmxlICs9IHRhYmxlLT52YWx1ZTsKKyAgICB0YWJsZSArPSB2YWwgJiAoKDEgPDwgbmJpdHMpIC0gMSk7CisgIH0KKyAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgdGFibGUtPmJpdHMpOworICByZXR1cm4gdGFibGUtPnZhbHVlOworfQorCisvLyBSZWFkcyBwYWNrZWQgc3ltYm9sIGRlcGVuZGluZyBvbiBHUkVFTiBjaGFubmVsCisjZGVmaW5lIEJJVFNfU1BFQ0lBTF9NQVJLRVIgMHgxMDAgIC8vIHNvbWV0aGluZyBsYXJnZSBlbm91Z2ggKGFuZCBhIGJpdC1tYXNrKQorI2RlZmluZSBQQUNLRURfTk9OX0xJVEVSQUxfQ09ERSAwICAvLyBtdXN0IGJlIDwgTlVNX0xJVEVSQUxfQ09ERVMKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUmVhZFBhY2tlZFN5bWJvbHMoY29uc3QgSFRyZWVHcm91cCogZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpICYgKEhVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkUgLSAxKTsKKyAgY29uc3QgSHVmZm1hbkNvZGUzMiBjb2RlID0gZ3JvdXAtPnBhY2tlZF90YWJsZVt2YWxdOworICBhc3NlcnQoZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUpOworICBpZiAoY29kZS5iaXRzIDwgQklUU19TUEVDSUFMX01BUktFUikgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIGNvZGUuYml0cyk7CisgICAgKmRzdCA9IGNvZGUudmFsdWU7CisgICAgcmV0dXJuIFBBQ0tFRF9OT05fTElURVJBTF9DT0RFOworICB9IGVsc2UgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIGNvZGUuYml0cyAtIEJJVFNfU1BFQ0lBTF9NQVJLRVIpOworICAgIGFzc2VydChjb2RlLnZhbHVlID49IE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICByZXR1cm4gY29kZS52YWx1ZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEFjY3VtdWxhdGVIQ29kZShIdWZmbWFuQ29kZSBoY29kZSwgaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hbkNvZGUzMiogY29uc3QgaHVmZikgeworICBodWZmLT5iaXRzICs9IGhjb2RlLmJpdHM7CisgIGh1ZmYtPnZhbHVlIHw9ICh1aW50MzJfdCloY29kZS52YWx1ZSA8PCBzaGlmdDsKKyAgYXNzZXJ0KGh1ZmYtPmJpdHMgPD0gSFVGRk1BTl9UQUJMRV9CSVRTKTsKKyAgcmV0dXJuIGhjb2RlLmJpdHM7Cit9CisKK3N0YXRpYyB2b2lkIEJ1aWxkUGFja2VkVGFibGUoSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXApIHsKKyAgdWludDMyX3QgY29kZTsKKyAgZm9yIChjb2RlID0gMDsgY29kZSA8IEhVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkU7ICsrY29kZSkgeworICAgIHVpbnQzMl90IGJpdHMgPSBjb2RlOworICAgIEh1ZmZtYW5Db2RlMzIqIGNvbnN0IGh1ZmYgPSAmaHRyZWVfZ3JvdXAtPnBhY2tlZF90YWJsZVtiaXRzXTsKKyAgICBIdWZmbWFuQ29kZSBoY29kZSA9IGh0cmVlX2dyb3VwLT5odHJlZXNbR1JFRU5dW2JpdHNdOworICAgIGlmIChoY29kZS52YWx1ZSA+PSBOVU1fTElURVJBTF9DT0RFUykgeworICAgICAgaHVmZi0+Yml0cyA9IGhjb2RlLmJpdHMgKyBCSVRTX1NQRUNJQUxfTUFSS0VSOworICAgICAgaHVmZi0+dmFsdWUgPSBoY29kZS52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaHVmZi0+Yml0cyA9IDA7CisgICAgICBodWZmLT52YWx1ZSA9IDA7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaGNvZGUsIDgsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbUkVEXVtiaXRzXSwgMTYsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbQkxVRV1bYml0c10sIDAsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbQUxQSEFdW2JpdHNdLCAyNCwgaHVmZik7CisgICAgICAodm9pZCliaXRzOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoCisgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsCisgICAgaW50IG51bV9zeW1ib2xzLCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocykgeworICBpbnQgb2sgPSAwOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgaW50IHN5bWJvbDsKKyAgaW50IG1heF9zeW1ib2w7CisgIGludCBwcmV2X2NvZGVfbGVuID0gREVGQVVMVF9DT0RFX0xFTkdUSDsKKyAgSHVmZm1hbkNvZGUgdGFibGVbMSA8PCBMRU5HVEhTX1RBQkxFX0JJVFNdOworCisgIGlmICghVlA4TEJ1aWxkSHVmZm1hblRhYmxlKHRhYmxlLCBMRU5HVEhTX1RBQkxFX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0NPREVfTEVOR1RIX0NPREVTKSkgeworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgMSkpIHsgICAgLy8gdXNlIGxlbmd0aAorICAgIGNvbnN0IGludCBsZW5ndGhfbmJpdHMgPSAyICsgMiAqIFZQOExSZWFkQml0cyhiciwgMyk7CisgICAgbWF4X3N5bWJvbCA9IDIgKyBWUDhMUmVhZEJpdHMoYnIsIGxlbmd0aF9uYml0cyk7CisgICAgaWYgKG1heF9zeW1ib2wgPiBudW1fc3ltYm9scykgeworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9IGVsc2UgeworICAgIG1heF9zeW1ib2wgPSBudW1fc3ltYm9sczsKKyAgfQorCisgIHN5bWJvbCA9IDA7CisgIHdoaWxlIChzeW1ib2wgPCBudW1fc3ltYm9scykgeworICAgIGNvbnN0IEh1ZmZtYW5Db2RlKiBwOworICAgIGludCBjb2RlX2xlbjsKKyAgICBpZiAobWF4X3N5bWJvbC0tID09IDApIGJyZWFrOworICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICBwID0gJnRhYmxlW1ZQOExQcmVmZXRjaEJpdHMoYnIpICYgTEVOR1RIU19UQUJMRV9NQVNLXTsKKyAgICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyBwLT5iaXRzKTsKKyAgICBjb2RlX2xlbiA9IHAtPnZhbHVlOworICAgIGlmIChjb2RlX2xlbiA8IGtDb2RlTGVuZ3RoTGl0ZXJhbHMpIHsKKyAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBjb2RlX2xlbjsKKyAgICAgIGlmIChjb2RlX2xlbiAhPSAwKSBwcmV2X2NvZGVfbGVuID0gY29kZV9sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCB1c2VfcHJldiA9IChjb2RlX2xlbiA9PSBrQ29kZUxlbmd0aFJlcGVhdENvZGUpOworICAgICAgY29uc3QgaW50IHNsb3QgPSBjb2RlX2xlbiAtIGtDb2RlTGVuZ3RoTGl0ZXJhbHM7CisgICAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IGtDb2RlTGVuZ3RoRXh0cmFCaXRzW3Nsb3RdOworICAgICAgY29uc3QgaW50IHJlcGVhdF9vZmZzZXQgPSBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbc2xvdF07CisgICAgICBpbnQgcmVwZWF0ID0gVlA4TFJlYWRCaXRzKGJyLCBleHRyYV9iaXRzKSArIHJlcGVhdF9vZmZzZXQ7CisgICAgICBpZiAoc3ltYm9sICsgcmVwZWF0ID4gbnVtX3N5bWJvbHMpIHsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gdXNlX3ByZXYgPyBwcmV2X2NvZGVfbGVuIDogMDsKKyAgICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb2sgPSAxOworCisgRW5kOgorICBpZiAoIW9rKSBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgcmV0dXJuIG9rOworfQorCisvLyAnY29kZV9sZW5ndGhzJyBpcyBwcmUtYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIsIHVzZWQgZm9yIGNyZWF0aW5nIEh1ZmZtYW4KKy8vIHRyZWUuCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZShpbnQgYWxwaGFiZXRfc2l6ZSwgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgY29kZV9sZW5ndGhzLCBIdWZmbWFuQ29kZSogY29uc3QgdGFibGUpIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IHNpemUgPSAwOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3QgaW50IHNpbXBsZV9jb2RlID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKworICBtZW1zZXQoY29kZV9sZW5ndGhzLCAwLCBhbHBoYWJldF9zaXplICogc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKKworICBpZiAoc2ltcGxlX2NvZGUpIHsgIC8vIFJlYWQgc3ltYm9scywgY29kZXMgJiBjb2RlIGxlbmd0aHMgZGlyZWN0bHkuCisgICAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gVlA4TFJlYWRCaXRzKGJyLCAxKSArIDE7CisgICAgY29uc3QgaW50IGZpcnN0X3N5bWJvbF9sZW5fY29kZSA9IFZQOExSZWFkQml0cyhiciwgMSk7CisgICAgLy8gVGhlIGZpcnN0IGNvZGUgaXMgZWl0aGVyIDEgYml0IG9yIDggYml0IGNvZGUuCisgICAgaW50IHN5bWJvbCA9IFZQOExSZWFkQml0cyhiciwgKGZpcnN0X3N5bWJvbF9sZW5fY29kZSA9PSAwKSA/IDEgOiA4KTsKKyAgICBjb2RlX2xlbmd0aHNbc3ltYm9sXSA9IDE7CisgICAgLy8gVGhlIHNlY29uZCBjb2RlIChpZiBwcmVzZW50KSwgaXMgYWx3YXlzIDggYml0IGxvbmcuCisgICAgaWYgKG51bV9zeW1ib2xzID09IDIpIHsKKyAgICAgIHN5bWJvbCA9IFZQOExSZWFkQml0cyhiciwgOCk7CisgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sXSA9IDE7CisgICAgfQorICAgIG9rID0gMTsKKyAgfSBlbHNlIHsgIC8vIERlY29kZSBIdWZmbWFuLWNvZGVkIGNvZGUgbGVuZ3Rocy4KKyAgICBpbnQgaTsKKyAgICBpbnQgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgICBjb25zdCBpbnQgbnVtX2NvZGVzID0gVlA4TFJlYWRCaXRzKGJyLCA0KSArIDQ7CisgICAgaWYgKG51bV9jb2RlcyA+IE5VTV9DT0RFX0xFTkdUSF9DT0RFUykgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZGVzOyArK2kpIHsKKyAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1trQ29kZUxlbmd0aENvZGVPcmRlcltpXV0gPSBWUDhMUmVhZEJpdHMoYnIsIDMpOworICAgIH0KKyAgICBvayA9IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoZGVjLCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3Rocyk7CisgIH0KKworICBvayA9IG9rICYmICFici0+ZW9zXzsKKyAgaWYgKG9rKSB7CisgICAgc2l6ZSA9IFZQOExCdWlsZEh1ZmZtYW5UYWJsZSh0YWJsZSwgSFVGRk1BTl9UQUJMRV9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzLCBhbHBoYWJldF9zaXplKTsKKyAgfQorICBpZiAoIW9rIHx8IHNpemUgPT0gMCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX2NhY2hlX2JpdHMsIGludCBhbGxvd19yZWN1cnNpb24pIHsKKyAgaW50IGksIGo7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIHVpbnQzMl90KiBodWZmbWFuX2ltYWdlID0gTlVMTDsKKyAgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzID0gTlVMTDsKKyAgSHVmZm1hbkNvZGUqIGh1ZmZtYW5fdGFibGVzID0gTlVMTDsKKyAgSHVmZm1hbkNvZGUqIG5leHQgPSBOVUxMOworICBpbnQgbnVtX2h0cmVlX2dyb3VwcyA9IDE7CisgIGludCBtYXhfYWxwaGFiZXRfc2l6ZSA9IDA7CisgIGludCogY29kZV9sZW5ndGhzID0gTlVMTDsKKyAgY29uc3QgaW50IHRhYmxlX3NpemUgPSBrVGFibGVTaXplW2NvbG9yX2NhY2hlX2JpdHNdOworCisgIGlmIChhbGxvd19yZWN1cnNpb24gJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgeworICAgIC8vIHVzZSBtZXRhIEh1ZmZtYW4gY29kZXMuCisgICAgY29uc3QgaW50IGh1ZmZtYW5fcHJlY2lzaW9uID0gVlA4TFJlYWRCaXRzKGJyLCAzKSArIDI7CisgICAgY29uc3QgaW50IGh1ZmZtYW5feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOworICAgIGNvbnN0IGludCBodWZmbWFuX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGh1ZmZtYW5fcHJlY2lzaW9uKTsKKyAgICBjb25zdCBpbnQgaHVmZm1hbl9waXhzID0gaHVmZm1hbl94c2l6ZSAqIGh1ZmZtYW5feXNpemU7CisgICAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShodWZmbWFuX3hzaXplLCBodWZmbWFuX3lzaXplLCAwLCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVmZm1hbl9pbWFnZSkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c18gPSBodWZmbWFuX3ByZWNpc2lvbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaHVmZm1hbl9waXhzOyArK2kpIHsKKyAgICAgIC8vIFRoZSBodWZmbWFuIGRhdGEgaXMgc3RvcmVkIGluIHJlZCBhbmQgZ3JlZW4gYnl0ZXMuCisgICAgICBjb25zdCBpbnQgZ3JvdXAgPSAoaHVmZm1hbl9pbWFnZVtpXSA+PiA4KSAmIDB4ZmZmZjsKKyAgICAgIGh1ZmZtYW5faW1hZ2VbaV0gPSBncm91cDsKKyAgICAgIGlmIChncm91cCA+PSBudW1faHRyZWVfZ3JvdXBzKSB7CisgICAgICAgIG51bV9odHJlZV9ncm91cHMgPSBncm91cCArIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGJyLT5lb3NfKSBnb3RvIEVycm9yOworCisgIC8vIEZpbmQgbWF4aW11bSBhbHBoYWJldCBzaXplIGZvciB0aGUgaHRyZWUgZ3JvdXAuCisgIGZvciAoaiA9IDA7IGogPCBIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREU7ICsraikgeworICAgIGludCBhbHBoYWJldF9zaXplID0ga0FscGhhYmV0U2l6ZVtqXTsKKyAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7CisgICAgICBhbHBoYWJldF9zaXplICs9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKKyAgICB9CisgICAgaWYgKG1heF9hbHBoYWJldF9zaXplIDwgYWxwaGFiZXRfc2l6ZSkgeworICAgICAgbWF4X2FscGhhYmV0X3NpemUgPSBhbHBoYWJldF9zaXplOworICAgIH0KKyAgfQorCisgIGh1ZmZtYW5fdGFibGVzID0gKEh1ZmZtYW5Db2RlKilXZWJQU2FmZU1hbGxvYyhudW1faHRyZWVfZ3JvdXBzICogdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZm1hbl90YWJsZXMpKTsKKyAgaHRyZWVfZ3JvdXBzID0gVlA4TEh0cmVlR3JvdXBzTmV3KG51bV9odHJlZV9ncm91cHMpOworICBjb2RlX2xlbmd0aHMgPSAoaW50KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpbWF4X2FscGhhYmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY29kZV9sZW5ndGhzKSk7CisKKyAgaWYgKGh0cmVlX2dyb3VwcyA9PSBOVUxMIHx8IGNvZGVfbGVuZ3RocyA9PSBOVUxMIHx8IGh1ZmZtYW5fdGFibGVzID09IE5VTEwpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIG5leHQgPSBodWZmbWFuX3RhYmxlczsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9odHJlZV9ncm91cHM7ICsraSkgeworICAgIEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3VwID0gJmh0cmVlX2dyb3Vwc1tpXTsKKyAgICBIdWZmbWFuQ29kZSoqIGNvbnN0IGh0cmVlcyA9IGh0cmVlX2dyb3VwLT5odHJlZXM7CisgICAgaW50IHNpemU7CisgICAgaW50IHRvdGFsX3NpemUgPSAwOworICAgIGludCBpc190cml2aWFsX2xpdGVyYWwgPSAxOworICAgIGludCBtYXhfYml0cyA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7CisgICAgICBpbnQgYWxwaGFiZXRfc2l6ZSA9IGtBbHBoYWJldFNpemVbal07CisgICAgICBodHJlZXNbal0gPSBuZXh0OworICAgICAgaWYgKGogPT0gMCAmJiBjb2xvcl9jYWNoZV9iaXRzID4gMCkgeworICAgICAgICBhbHBoYWJldF9zaXplICs9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKKyAgICAgIH0KKyAgICAgIHNpemUgPSBSZWFkSHVmZm1hbkNvZGUoYWxwaGFiZXRfc2l6ZSwgZGVjLCBjb2RlX2xlbmd0aHMsIG5leHQpOworICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgaWYgKGlzX3RyaXZpYWxfbGl0ZXJhbCAmJiBrTGl0ZXJhbE1hcFtqXSA9PSAxKSB7CisgICAgICAgIGlzX3RyaXZpYWxfbGl0ZXJhbCA9IChuZXh0LT5iaXRzID09IDApOworICAgICAgfQorICAgICAgdG90YWxfc2l6ZSArPSBuZXh0LT5iaXRzOworICAgICAgbmV4dCArPSBzaXplOworICAgICAgaWYgKGogPD0gQUxQSEEpIHsKKyAgICAgICAgaW50IGxvY2FsX21heF9iaXRzID0gY29kZV9sZW5ndGhzWzBdOworICAgICAgICBpbnQgazsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IGFscGhhYmV0X3NpemU7ICsraykgeworICAgICAgICAgIGlmIChjb2RlX2xlbmd0aHNba10gPiBsb2NhbF9tYXhfYml0cykgeworICAgICAgICAgICAgbG9jYWxfbWF4X2JpdHMgPSBjb2RlX2xlbmd0aHNba107CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1heF9iaXRzICs9IGxvY2FsX21heF9iaXRzOworICAgICAgfQorICAgIH0KKyAgICBodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9saXRlcmFsID0gaXNfdHJpdmlhbF9saXRlcmFsOworICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUgPSAwOworICAgIGlmIChpc190cml2aWFsX2xpdGVyYWwpIHsKKyAgICAgIGNvbnN0IGludCByZWQgPSBodHJlZXNbUkVEXVswXS52YWx1ZTsKKyAgICAgIGNvbnN0IGludCBibHVlID0gaHRyZWVzW0JMVUVdWzBdLnZhbHVlOworICAgICAgY29uc3QgaW50IGFscGhhID0gaHRyZWVzW0FMUEhBXVswXS52YWx1ZTsKKyAgICAgIGh0cmVlX2dyb3VwLT5saXRlcmFsX2FyYiA9CisgICAgICAgICAgKCh1aW50MzJfdClhbHBoYSA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IGJsdWU7CisgICAgICBpZiAodG90YWxfc2l6ZSA9PSAwICYmIGh0cmVlc1tHUkVFTl1bMF0udmFsdWUgPCBOVU1fTElURVJBTF9DT0RFUykgeworICAgICAgICBodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9jb2RlID0gMTsKKyAgICAgICAgaHRyZWVfZ3JvdXAtPmxpdGVyYWxfYXJiIHw9IGh0cmVlc1tHUkVFTl1bMF0udmFsdWUgPDwgODsKKyAgICAgIH0KKyAgICB9CisgICAgaHRyZWVfZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUgPSAhaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heF9iaXRzIDwgSFVGRk1BTl9QQUNLRURfQklUUyk7CisgICAgaWYgKGh0cmVlX2dyb3VwLT51c2VfcGFja2VkX3RhYmxlKSBCdWlsZFBhY2tlZFRhYmxlKGh0cmVlX2dyb3VwKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoY29kZV9sZW5ndGhzKTsKKworICAvLyBBbGwgT0suIEZpbmFsaXplIHBvaW50ZXJzIGFuZCByZXR1cm4uCisgIGhkci0+aHVmZm1hbl9pbWFnZV8gPSBodWZmbWFuX2ltYWdlOworICBoZHItPm51bV9odHJlZV9ncm91cHNfID0gbnVtX2h0cmVlX2dyb3VwczsKKyAgaGRyLT5odHJlZV9ncm91cHNfID0gaHRyZWVfZ3JvdXBzOworICBoZHItPmh1ZmZtYW5fdGFibGVzXyA9IGh1ZmZtYW5fdGFibGVzOworICByZXR1cm4gMTsKKworIEVycm9yOgorICBXZWJQU2FmZUZyZWUoY29kZV9sZW5ndGhzKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5faW1hZ2UpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl90YWJsZXMpOworICBWUDhMSHRyZWVHcm91cHNGcmVlKGh0cmVlX2dyb3Vwcyk7CisgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2NhbGluZy4KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCitzdGF0aWMgaW50IEFsbG9jYXRlQW5kSW5pdFJlc2NhbGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBjb25zdCBpbnQgbnVtX2NoYW5uZWxzID0gNDsKKyAgY29uc3QgaW50IGluX3dpZHRoID0gaW8tPm1iX3c7CisgIGNvbnN0IGludCBvdXRfd2lkdGggPSBpby0+c2NhbGVkX3dpZHRoOworICBjb25zdCBpbnQgaW5faGVpZ2h0ID0gaW8tPm1iX2g7CisgIGNvbnN0IGludCBvdXRfaGVpZ2h0ID0gaW8tPnNjYWxlZF9oZWlnaHQ7CisgIGNvbnN0IHVpbnQ2NF90IHdvcmtfc2l6ZSA9IDIgKiBudW1fY2hhbm5lbHMgKiAodWludDY0X3Qpb3V0X3dpZHRoOworICByZXNjYWxlcl90KiB3b3JrOyAgICAgICAgLy8gUmVzY2FsZXIgd29yayBhcmVhLgorICBjb25zdCB1aW50NjRfdCBzY2FsZWRfZGF0YV9zaXplID0gKHVpbnQ2NF90KW91dF93aWR0aDsKKyAgdWludDMyX3QqIHNjYWxlZF9kYXRhOyAgLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHNjYWxlZCBCR1JBIGRhdGEuCisgIGNvbnN0IHVpbnQ2NF90IG1lbW9yeV9zaXplID0gc2l6ZW9mKCpkZWMtPnJlc2NhbGVyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya19zaXplICogc2l6ZW9mKCp3b3JrKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkX2RhdGFfc2l6ZSAqIHNpemVvZigqc2NhbGVkX2RhdGEpOworICB1aW50OF90KiBtZW1vcnkgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MobWVtb3J5X3NpemUsIHNpemVvZigqbWVtb3J5KSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBhc3NlcnQoZGVjLT5yZXNjYWxlcl9tZW1vcnkgPT0gTlVMTCk7CisgIGRlYy0+cmVzY2FsZXJfbWVtb3J5ID0gbWVtb3J5OworCisgIGRlYy0+cmVzY2FsZXIgPSAoV2ViUFJlc2NhbGVyKiltZW1vcnk7CisgIG1lbW9yeSArPSBzaXplb2YoKmRlYy0+cmVzY2FsZXIpOworICB3b3JrID0gKHJlc2NhbGVyX3QqKW1lbW9yeTsKKyAgbWVtb3J5ICs9IHdvcmtfc2l6ZSAqIHNpemVvZigqd29yayk7CisgIHNjYWxlZF9kYXRhID0gKHVpbnQzMl90KiltZW1vcnk7CisKKyAgV2ViUFJlc2NhbGVySW5pdChkZWMtPnJlc2NhbGVyLCBpbl93aWR0aCwgaW5faGVpZ2h0LCAodWludDhfdCopc2NhbGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCBudW1fY2hhbm5lbHMsIHdvcmspOworICByZXR1cm4gMTsKK30KKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX1NJWkUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4cG9ydCB0byBBUkdCCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisvLyBXZSBoYXZlIHNwZWNpYWwgImV4cG9ydCIgZnVuY3Rpb24gc2luY2Ugd2UgbmVlZCB0byBjb252ZXJ0IGZyb20gQkdSQQorc3RhdGljIGludCBFeHBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgaW50IHJnYmFfc3RyaWRlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIHVpbnQzMl90KiBjb25zdCBzcmMgPSAodWludDMyX3QqKXJlc2NhbGVyLT5kc3Q7CisgIGNvbnN0IGludCBkc3Rfd2lkdGggPSByZXNjYWxlci0+ZHN0X3dpZHRoOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHJnYmEgKyBudW1fbGluZXNfb3V0ICogcmdiYV9zdHJpZGU7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKKyAgICBXZWJQTXVsdEFSR0JSb3coc3JjLCBkc3Rfd2lkdGgsIDEpOworICAgIFZQOExDb252ZXJ0RnJvbUJHUkEoc3JjLCBkc3Rfd2lkdGgsIGNvbG9yc3BhY2UsIGRzdCk7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCisvLyBFbWl0IHNjYWxlZCByb3dzLgorc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzUkdCQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IG91dF9zdHJpZGUpIHsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gZGVjLT5vdXRwdXRfLT5jb2xvcnNwYWNlOworICBpbnQgbnVtX2xpbmVzX2luID0gMDsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICB3aGlsZSAobnVtX2xpbmVzX2luIDwgbWJfaCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHJvd19pbiA9IGluICsgbnVtX2xpbmVzX2luICogaW5fc3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IHJvd19vdXQgPSBvdXQgKyBudW1fbGluZXNfb3V0ICogb3V0X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbGluZXNfbGVmdCA9IG1iX2ggLSBudW1fbGluZXNfaW47CisgICAgY29uc3QgaW50IG5lZWRlZF9saW5lcyA9IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCk7CisgICAgaW50IGxpbmVzX2ltcG9ydGVkOworICAgIGFzc2VydChuZWVkZWRfbGluZXMgPiAwICYmIG5lZWRlZF9saW5lcyA8PSBsaW5lc19sZWZ0KTsKKyAgICBXZWJQTXVsdEFSR0JSb3dzKHJvd19pbiwgaW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgZGVjLT5yZXNjYWxlci0+c3JjX3dpZHRoLCBuZWVkZWRfbGluZXMsIDApOworICAgIGxpbmVzX2ltcG9ydGVkID0KKyAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQsIHJvd19pbiwgaW5fc3RyaWRlKTsKKyAgICBhc3NlcnQobGluZXNfaW1wb3J0ZWQgPT0gbmVlZGVkX2xpbmVzKTsKKyAgICBudW1fbGluZXNfaW4gKz0gbGluZXNfaW1wb3J0ZWQ7CisgICAgbnVtX2xpbmVzX291dCArPSBFeHBvcnQoZGVjLT5yZXNjYWxlciwgY29sb3JzcGFjZSwgb3V0X3N0cmlkZSwgcm93X291dCk7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX1NJWkUKKworLy8gRW1pdCByb3dzIHdpdGhvdXQgYW55IHNjYWxpbmcuCitzdGF0aWMgaW50IEVtaXRSb3dzKFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcm93X2luLCBpbnQgaW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdywgaW50IG1iX2gsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IG91dF9zdHJpZGUpIHsKKyAgaW50IGxpbmVzID0gbWJfaDsKKyAgdWludDhfdCogcm93X291dCA9IG91dDsKKyAgd2hpbGUgKGxpbmVzLS0gPiAwKSB7CisgICAgVlA4TENvbnZlcnRGcm9tQkdSQSgoY29uc3QgdWludDMyX3QqKXJvd19pbiwgbWJfdywgY29sb3JzcGFjZSwgcm93X291dCk7CisgICAgcm93X2luICs9IGluX3N0cmlkZTsKKyAgICByb3dfb3V0ICs9IG91dF9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIG1iX2g7ICAvLyBOdW0gcm93cyBvdXQgPT0gbnVtIHJvd3MgaW4uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHBvcnQgdG8gWVVWQQorCitzdGF0aWMgdm9pZCBDb252ZXJ0VG9ZVVZBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsIGludCB3aWR0aCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQpIHsKKyAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuWVVWQTsKKworICAvLyBmaXJzdCwgdGhlIGx1bWEgcGxhbmUKKyAgV2ViUENvbnZlcnRBUkdCVG9ZKHNyYywgYnVmLT55ICsgeV9wb3MgKiBidWYtPnlfc3RyaWRlLCB3aWR0aCk7CisKKyAgLy8gdGhlbiBVL1YgcGxhbmVzCisgIHsKKyAgICB1aW50OF90KiBjb25zdCB1ID0gYnVmLT51ICsgKHlfcG9zID4+IDEpICogYnVmLT51X3N0cmlkZTsKKyAgICB1aW50OF90KiBjb25zdCB2ID0gYnVmLT52ICsgKHlfcG9zID4+IDEpICogYnVmLT52X3N0cmlkZTsKKyAgICAvLyBldmVuIGxpbmVzOiBzdG9yZSB2YWx1ZXMKKyAgICAvLyBvZGQgbGluZXM6IGF2ZXJhZ2Ugd2l0aCBwcmV2aW91cyB2YWx1ZXMKKyAgICBXZWJQQ29udmVydEFSR0JUb1VWKHNyYywgdSwgdiwgd2lkdGgsICEoeV9wb3MgJiAxKSk7CisgIH0KKyAgLy8gTGFzdGx5LCBzdG9yZSBhbHBoYSBpZiBuZWVkZWQuCisgIGlmIChidWYtPmEgIT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGEgPSBidWYtPmEgKyB5X3BvcyAqIGJ1Zi0+YV9zdHJpZGU7CisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgICAgV2ViUEV4dHJhY3RBbHBoYSgodWludDhfdCopc3JjICsgMCwgMCwgd2lkdGgsIDEsIGEsIDApOworI2Vsc2UKKyAgICBXZWJQRXh0cmFjdEFscGhhKCh1aW50OF90KilzcmMgKyAzLCAwLCB3aWR0aCwgMSwgYSwgMCk7CisjZW5kaWYKKyAgfQorfQorCitzdGF0aWMgaW50IEV4cG9ydFlVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHlfcG9zKSB7CisgIFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIgPSBkZWMtPnJlc2NhbGVyOworICB1aW50MzJfdCogY29uc3Qgc3JjID0gKHVpbnQzMl90KilyZXNjYWxlci0+ZHN0OworICBjb25zdCBpbnQgZHN0X3dpZHRoID0gcmVzY2FsZXItPmRzdF93aWR0aDsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChyZXNjYWxlcikpIHsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOworICAgIFdlYlBNdWx0QVJHQlJvdyhzcmMsIGRzdF93aWR0aCwgMSk7CisgICAgQ29udmVydFRvWVVWQShzcmMsIGRzdF93aWR0aCwgeV9wb3MsIGRlYy0+b3V0cHV0Xyk7CisgICAgKyt5X3BvczsKKyAgICArK251bV9saW5lc19vdXQ7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKK3N0YXRpYyBpbnQgRW1pdFJlc2NhbGVkUm93c1lVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaW4sIGludCBpbl9zdHJpZGUsIGludCBtYl9oKSB7CisgIGludCBudW1fbGluZXNfaW4gPSAwOworICBpbnQgeV9wb3MgPSBkZWMtPmxhc3Rfb3V0X3Jvd187CisgIHdoaWxlIChudW1fbGluZXNfaW4gPCBtYl9oKSB7CisgICAgY29uc3QgaW50IGxpbmVzX2xlZnQgPSBtYl9oIC0gbnVtX2xpbmVzX2luOworICAgIGNvbnN0IGludCBuZWVkZWRfbGluZXMgPSBXZWJQUmVzY2FsZU5lZWRlZExpbmVzKGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQpOworICAgIGludCBsaW5lc19pbXBvcnRlZDsKKyAgICBXZWJQTXVsdEFSR0JSb3dzKGluLCBpbl9zdHJpZGUsIGRlYy0+cmVzY2FsZXItPnNyY193aWR0aCwgbmVlZGVkX2xpbmVzLCAwKTsKKyAgICBsaW5lc19pbXBvcnRlZCA9CisgICAgICAgIFdlYlBSZXNjYWxlckltcG9ydChkZWMtPnJlc2NhbGVyLCBsaW5lc19sZWZ0LCBpbiwgaW5fc3RyaWRlKTsKKyAgICBhc3NlcnQobGluZXNfaW1wb3J0ZWQgPT0gbmVlZGVkX2xpbmVzKTsKKyAgICBudW1fbGluZXNfaW4gKz0gbGluZXNfaW1wb3J0ZWQ7CisgICAgaW4gKz0gbmVlZGVkX2xpbmVzICogaW5fc3RyaWRlOworICAgIHlfcG9zICs9IEV4cG9ydFlVVkEoZGVjLCB5X3Bvcyk7CisgIH0KKyAgcmV0dXJuIHlfcG9zOworfQorCitzdGF0aWMgaW50IEVtaXRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW4sIGludCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdywgaW50IG51bV9yb3dzKSB7CisgIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgd2hpbGUgKG51bV9yb3dzLS0gPiAwKSB7CisgICAgQ29udmVydFRvWVVWQSgoY29uc3QgdWludDMyX3QqKWluLCBtYl93LCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKKyAgICBpbiArPSBpbl9zdHJpZGU7CisgICAgKyt5X3BvczsKKyAgfQorICByZXR1cm4geV9wb3M7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcm9wcGluZy4KKworLy8gU2V0cyBpby0+bWJfeSwgaW8tPm1iX2ggJiBpby0+bWJfdyBhY2NvcmRpbmcgdG8gc3RhcnQgcm93LCBlbmQgcm93IGFuZAorLy8gY3JvcCBvcHRpb25zLiBBbHNvIHVwZGF0ZXMgdGhlIGlucHV0IGRhdGEgcG9pbnRlciwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisvLyBzdGFydCBvZiB0aGUgY3JvcHBlZCB3aW5kb3cuIE5vdGUgdGhhdCBwaXhlbHMgYXJlIGluIEFSR0IgZm9ybWF0IGV2ZW4gaWYKKy8vICdpbl9kYXRhJyBpcyB1aW50OF90Ki4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3JvcCB3aW5kb3cgaXMgbm90IGVtcHR5Lgorc3RhdGljIGludCBTZXRDcm9wV2luZG93KFZQOElvKiBjb25zdCBpbywgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogY29uc3QgaW5fZGF0YSwgaW50IHBpeGVsX3N0cmlkZSkgeworICBhc3NlcnQoeV9zdGFydCA8IHlfZW5kKTsKKyAgYXNzZXJ0KGlvLT5jcm9wX2xlZnQgPCBpby0+Y3JvcF9yaWdodCk7CisgIGlmICh5X2VuZCA+IGlvLT5jcm9wX2JvdHRvbSkgeworICAgIHlfZW5kID0gaW8tPmNyb3BfYm90dG9tOyAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IG9uIGxhc3Qgcm93LgorICB9CisgIGlmICh5X3N0YXJ0IDwgaW8tPmNyb3BfdG9wKSB7CisgICAgY29uc3QgaW50IGRlbHRhID0gaW8tPmNyb3BfdG9wIC0geV9zdGFydDsKKyAgICB5X3N0YXJ0ID0gaW8tPmNyb3BfdG9wOworICAgICppbl9kYXRhICs9IGRlbHRhICogcGl4ZWxfc3RyaWRlOworICB9CisgIGlmICh5X3N0YXJ0ID49IHlfZW5kKSByZXR1cm4gMDsgIC8vIENyb3Agd2luZG93IGlzIGVtcHR5LgorCisgICppbl9kYXRhICs9IGlvLT5jcm9wX2xlZnQgKiBzaXplb2YodWludDMyX3QpOworCisgIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKKyAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7CisgIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OworICByZXR1cm4gMTsgIC8vIE5vbi1lbXB0eSBjcm9wIHdpbmRvdy4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNZXRhSW5kZXgoCisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgeHNpemUsIGludCBiaXRzLCBpbnQgeCwgaW50IHkpIHsKKyAgaWYgKGJpdHMgPT0gMCkgcmV0dXJuIDA7CisgIHJldHVybiBpbWFnZVt4c2l6ZSAqICh5ID4+IGJpdHMpICsgKHggPj4gYml0cyldOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgSFRyZWVHcm91cCogR2V0SHRyZWVHcm91cEZvclBvcyhWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgeworICBjb25zdCBpbnQgbWV0YV9pbmRleCA9IEdldE1ldGFJbmRleChoZHItPmh1ZmZtYW5faW1hZ2VfLCBoZHItPmh1ZmZtYW5feHNpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfLCB4LCB5KTsKKyAgYXNzZXJ0KG1ldGFfaW5kZXggPCBoZHItPm51bV9odHJlZV9ncm91cHNfKTsKKyAgcmV0dXJuIGhkci0+aHRyZWVfZ3JvdXBzXyArIG1ldGFfaW5kZXg7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3AsIHdpdGggY3VzdG9tIHJvdy1wcm9jZXNzaW5nIGZ1bmN0aW9uCisKK3R5cGVkZWYgdm9pZCAoKlByb2Nlc3NSb3dzRnVuYykoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdyk7CisKK3N0YXRpYyB2b2lkIEFwcGx5SW52ZXJzZVRyYW5zZm9ybXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cykgeworICBpbnQgbiA9IGRlYy0+bmV4dF90cmFuc2Zvcm1fOworICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IGRlYy0+d2lkdGhfICogbnVtX3Jvd3M7CisgIGNvbnN0IGludCBzdGFydF9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKKyAgY29uc3QgaW50IGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgY29uc3QgdWludDMyX3QqIHJvd3NfaW4gPSByb3dzOworICB1aW50MzJfdCogY29uc3Qgcm93c19vdXQgPSBkZWMtPmFyZ2JfY2FjaGVfOworCisgIC8vIEludmVyc2UgdHJhbnNmb3Jtcy4KKyAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1tuXTsKKyAgICBWUDhMSW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHN0YXJ0X3JvdywgZW5kX3Jvdywgcm93c19pbiwgcm93c19vdXQpOworICAgIHJvd3NfaW4gPSByb3dzX291dDsKKyAgfQorICBpZiAocm93c19pbiAhPSByb3dzX291dCkgeworICAgIC8vIE5vIHRyYW5zZm9ybSBjYWxsZWQsIGhlbmNlIGp1c3QgY29weS4KKyAgICBtZW1jcHkocm93c19vdXQsIHJvd3NfaW4sIGNhY2hlX3BpeHMgKiBzaXplb2YoKnJvd3Nfb3V0KSk7CisgIH0KK30KKworLy8gUHJvY2Vzc2VzICh0cmFuc2Zvcm1zLCBzY2FsZXMgJiBjb2xvci1jb252ZXJ0cykgdGhlIHJvd3MgZGVjb2RlZCBhZnRlciB0aGUKKy8vIGxhc3QgY2FsbC4KK3N0YXRpYyB2b2lkIFByb2Nlc3NSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJvd3MgPSBkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKKworICBhc3NlcnQocm93IDw9IGRlYy0+aW9fLT5jcm9wX2JvdHRvbSk7CisgIC8vIFdlIGNhbid0IHByb2Nlc3MgbW9yZSB0aGFuIE5VTV9BUkdCX0NBQ0hFX1JPV1MgYXQgYSB0aW1lICh0aGF0J3MgdGhlIHNpemUKKyAgLy8gb2YgYXJnYl9jYWNoZV8pLCBidXQgd2UgY3VycmVudGx5IGRvbid0IG5lZWQgbW9yZSB0aGFuIHRoYXQuCisgIGFzc2VydChudW1fcm93cyA8PSBOVU1fQVJHQl9DQUNIRV9ST1dTKTsKKyAgaWYgKG51bV9yb3dzID4gMCkgeyAgICAvLyBFbWl0IG91dHB1dC4KKyAgICBWUDhJbyogY29uc3QgaW8gPSBkZWMtPmlvXzsKKyAgICB1aW50OF90KiByb3dzX2RhdGEgPSAodWludDhfdCopZGVjLT5hcmdiX2NhY2hlXzsKKyAgICBjb25zdCBpbnQgaW5fc3RyaWRlID0gaW8tPndpZHRoICogc2l6ZW9mKHVpbnQzMl90KTsgIC8vIGluIHVuaXQgb2YgUkdCQQorCisgICAgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhkZWMsIG51bV9yb3dzLCByb3dzKTsKKyAgICBpZiAoIVNldENyb3BXaW5kb3coaW8sIGRlYy0+bGFzdF9yb3dfLCByb3csICZyb3dzX2RhdGEsIGluX3N0cmlkZSkpIHsKKyAgICAgIC8vIE5vdGhpbmcgdG8gb3V0cHV0ICh0aGlzIHRpbWUpLgorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBkZWMtPm91dHB1dF87CisgICAgICBpZiAoV2ViUElzUkdCTW9kZShvdXRwdXQtPmNvbG9yc3BhY2UpKSB7ICAvLyBjb252ZXJ0IHRvIFJHQkEKKyAgICAgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuUkdCQTsKKyAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSA9IGJ1Zi0+cmdiYSArIGRlYy0+bGFzdF9vdXRfcm93XyAqIGJ1Zi0+c3RyaWRlOworICAgICAgICBjb25zdCBpbnQgbnVtX3Jvd3Nfb3V0ID0KKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICAgICAgICAgaW8tPnVzZV9zY2FsaW5nID8KKyAgICAgICAgICAgIEVtaXRSZXNjYWxlZFJvd3NSR0JBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSwgYnVmLT5zdHJpZGUpIDoKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfU0laRQorICAgICAgICAgICAgRW1pdFJvd3Mob3V0cHV0LT5jb2xvcnNwYWNlLCByb3dzX2RhdGEsIGluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBpby0+bWJfaCwgcmdiYSwgYnVmLT5zdHJpZGUpOworICAgICAgICAvLyBVcGRhdGUgJ2xhc3Rfb3V0X3Jvd18nLgorICAgICAgICBkZWMtPmxhc3Rfb3V0X3Jvd18gKz0gbnVtX3Jvd3Nfb3V0OworICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIFlVVkEKKyAgICAgICAgZGVjLT5sYXN0X291dF9yb3dfID0gaW8tPnVzZV9zY2FsaW5nID8KKyAgICAgICAgICAgIEVtaXRSZXNjYWxlZFJvd3NZVVZBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oKSA6CisgICAgICAgICAgICBFbWl0Um93c1lVVkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX3csIGlvLT5tYl9oKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydChkZWMtPmxhc3Rfb3V0X3Jvd18gPD0gb3V0cHV0LT5oZWlnaHQpOworICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSAnbGFzdF9yb3dfJy4KKyAgZGVjLT5sYXN0X3Jvd18gPSByb3c7CisgIGFzc2VydChkZWMtPmxhc3Rfcm93XyA8PSBkZWMtPmhlaWdodF8pOworfQorCisvLyBSb3ctcHJvY2Vzc2luZyBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3aGVuIGFscGhhIGRhdGEgY29udGFpbnMgb25seSBvbmUKKy8vIHRyYW5zZm9ybSAoY29sb3IgaW5kZXhpbmcpLCBhbmQgdHJpdmlhbCBub24tZ3JlZW4gbGl0ZXJhbHMuCitzdGF0aWMgaW50IElzOGJPcHRpbWl6YWJsZShjb25zdCBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgeworICBpbnQgaTsKKyAgaWYgKGhkci0+Y29sb3JfY2FjaGVfc2l6ZV8gPiAwKSByZXR1cm4gMDsKKyAgLy8gV2hlbiB0aGUgSHVmZm1hbiB0cmVlIGNvbnRhaW5zIG9ubHkgb25lIHN5bWJvbCwgd2UgY2FuIHNraXAgdGhlCisgIC8vIGNhbGwgdG8gUmVhZFN5bWJvbCgpIGZvciByZWQvYmx1ZS9hbHBoYSBjaGFubmVscy4KKyAgZm9yIChpID0gMDsgaSA8IGhkci0+bnVtX2h0cmVlX2dyb3Vwc187ICsraSkgeworICAgIEh1ZmZtYW5Db2RlKiogY29uc3QgaHRyZWVzID0gaGRyLT5odHJlZV9ncm91cHNfW2ldLmh0cmVlczsKKyAgICBpZiAoaHRyZWVzW1JFRF1bMF0uYml0cyA+IDApIHJldHVybiAwOworICAgIGlmIChodHJlZXNbQkxVRV1bMF0uYml0cyA+IDApIHJldHVybiAwOworICAgIGlmIChodHJlZXNbQUxQSEFdWzBdLmJpdHMgPiAwKSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQWxwaGFBcHBseUZpbHRlcihBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9yb3csIGludCBsYXN0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgc3RyaWRlKSB7CisgIGlmIChhbHBoX2RlYy0+ZmlsdGVyXyAhPSBXRUJQX0ZJTFRFUl9OT05FKSB7CisgICAgaW50IHk7CisgICAgY29uc3QgdWludDhfdCogcHJldl9saW5lID0gYWxwaF9kZWMtPnByZXZfbGluZV87CisgICAgYXNzZXJ0KFdlYlBVbmZpbHRlcnNbYWxwaF9kZWMtPmZpbHRlcl9dICE9IE5VTEwpOworICAgIGZvciAoeSA9IGZpcnN0X3JvdzsgeSA8IGxhc3Rfcm93OyArK3kpIHsKKyAgICAgIFdlYlBVbmZpbHRlcnNbYWxwaF9kZWMtPmZpbHRlcl9dKHByZXZfbGluZSwgb3V0LCBvdXQsIHN0cmlkZSk7CisgICAgICBwcmV2X2xpbmUgPSBvdXQ7CisgICAgICBvdXQgKz0gc3RyaWRlOworICAgIH0KKyAgICBhbHBoX2RlYy0+cHJldl9saW5lXyA9IHByZXZfbGluZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGxhc3Rfcm93KSB7CisgIC8vIEZvciB2ZXJ0aWNhbCBhbmQgZ3JhZGllbnQgZmlsdGVyaW5nLCB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgcGFydCBhYm92ZSB0aGUKKyAgLy8gY3JvcF90b3Agcm93LCBpbiBvcmRlciB0byBoYXZlIHRoZSBjb3JyZWN0IHNwYXRpYWwgcHJlZGljdG9ycy4KKyAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gKEFMUEhEZWNvZGVyKilkZWMtPmlvXy0+b3BhcXVlOworICBjb25zdCBpbnQgdG9wX3JvdyA9CisgICAgICAoYWxwaF9kZWMtPmZpbHRlcl8gPT0gV0VCUF9GSUxURVJfTk9ORSB8fAorICAgICAgIGFscGhfZGVjLT5maWx0ZXJfID09IFdFQlBfRklMVEVSX0hPUklaT05UQUwpID8gZGVjLT5pb18tPmNyb3BfdG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWMtPmxhc3Rfcm93XzsKKyAgY29uc3QgaW50IGZpcnN0X3JvdyA9IChkZWMtPmxhc3Rfcm93XyA8IHRvcF9yb3cpID8gdG9wX3JvdyA6IGRlYy0+bGFzdF9yb3dfOworICBhc3NlcnQobGFzdF9yb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgaWYgKGxhc3Rfcm93ID4gZmlyc3Rfcm93KSB7CisgICAgLy8gU3BlY2lhbCBtZXRob2QgZm9yIHBhbGV0dGVkIGFscGhhIGRhdGEuIFdlIG9ubHkgcHJvY2VzcyB0aGUgY3JvcHBlZCBhcmVhLgorICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsKKyAgICB1aW50OF90KiBvdXQgPSBhbHBoX2RlYy0+b3V0cHV0XyArIHdpZHRoICogZmlyc3Rfcm93OworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0KKyAgICAgICh1aW50OF90KilkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGZpcnN0X3JvdzsKKyAgICBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1swXTsKKyAgICBhc3NlcnQoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPT0gMSk7CisgICAgYXNzZXJ0KHRyYW5zZm9ybS0+dHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNKTsKKyAgICBWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSh0cmFuc2Zvcm0sIGZpcnN0X3JvdywgbGFzdF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4sIG91dCk7CisgICAgQWxwaGFBcHBseUZpbHRlcihhbHBoX2RlYywgZmlyc3Rfcm93LCBsYXN0X3Jvdywgb3V0LCB3aWR0aCk7CisgIH0KKyAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBsYXN0X3JvdzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGZhc3QgcGF0dGVybiBjb3B5ICg4YiBhbmQgMzJiKQorCisvLyBjeWNsaWMgcm90YXRpb24gb2YgcGF0dGVybiB3b3JkCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUm90YXRlOGIodWludDMyX3QgVikgeworI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorICByZXR1cm4gKChWICYgMHhmZjAwMDAwMHUpID4+IDI0KSB8IChWIDw8IDgpOworI2Vsc2UKKyAgcmV0dXJuICgoViAmIDB4ZmZ1KSA8PCAyNCkgfCAoViA+PiA4KTsKKyNlbmRpZgorfQorCisvLyBjb3B5IDEsIDIgb3IgNC1ieXRlcyBwYXR0ZXJuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5U21hbGxQYXR0ZXJuOGIoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgdWludDMyX3QgcGF0dGVybikgeworICBpbnQgaTsKKyAgLy8gYWxpZ24gJ2RzdCcgdG8gNC1ieXRlcyBib3VuZGFyeS4gQWRqdXN0IHRoZSBwYXR0ZXJuIGFsb25nIHRoZSB3YXkuCisgIHdoaWxlICgodWludHB0cl90KWRzdCAmIDMpIHsKKyAgICAqZHN0KysgPSAqc3JjKys7CisgICAgcGF0dGVybiA9IFJvdGF0ZThiKHBhdHRlcm4pOworICAgIC0tbGVuZ3RoOworICB9CisgIC8vIENvcHkgdGhlIHBhdHRlcm4gNCBieXRlcyBhdCBhIHRpbWUuCisgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoID4+IDIpOyArK2kpIHsKKyAgICAoKHVpbnQzMl90Kilkc3QpW2ldID0gcGF0dGVybjsKKyAgfQorICAvLyBGaW5pc2ggd2l0aCBsZWZ0LW92ZXJzLiAncGF0dGVybicgaXMgc3RpbGwgY29ycmVjdGx5IHBvc2l0aW9uZWQsCisgIC8vIHNvIG5vIFJvdGF0ZThiKCkgY2FsbCBpcyBuZWVkZWQuCisgIGZvciAoaSA8PD0gMjsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgZHN0W2ldID0gc3JjW2ldOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHlCbG9jazhiKHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IGRpc3QsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgdWludDhfdCogc3JjID0gZHN0IC0gZGlzdDsKKyAgaWYgKGxlbmd0aCA+PSA4KSB7CisgICAgdWludDMyX3QgcGF0dGVybiA9IDA7CisgICAgc3dpdGNoIChkaXN0KSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIHBhdHRlcm4gPSBzcmNbMF07CisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgICAvLyBhcm0gZG9lc24ndCBsaWtlIG11bHRpcGx5IHRoYXQgbXVjaAorICAgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgODsKKyAgICAgICAgcGF0dGVybiB8PSBwYXR0ZXJuIDw8IDE2OworI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoInJlcGx2LnFiICUwLCAlMCIgOiAiK3IiKHBhdHRlcm4pKTsKKyNlbHNlCisgICAgICAgIHBhdHRlcm4gPSAweDAxMDEwMTAxdSAqIHBhdHRlcm47CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG1lbWNweSgmcGF0dGVybiwgc3JjLCBzaXplb2YodWludDE2X3QpKTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKQorICAgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgMTY7CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgicmVwbHYucGggJTAsICUwIiA6ICIrciIocGF0dGVybikpOworI2Vsc2UKKyAgICAgICAgcGF0dGVybiA9IDB4MDAwMTAwMDF1ICogcGF0dGVybjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgbWVtY3B5KCZwYXR0ZXJuLCBzcmMsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gQ29weTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIENvcHlTbWFsbFBhdHRlcm44YihzcmMsIGRzdCwgbGVuZ3RoLCBwYXR0ZXJuKTsKKyAgICByZXR1cm47CisgIH0KKyBDb3B5OgorICBpZiAoZGlzdCA+PSBsZW5ndGgpIHsgIC8vIG5vIG92ZXJsYXAgLT4gdXNlIG1lbWNweSgpCisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGggKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldOworICB9Cit9CisKKy8vIGNvcHkgcGF0dGVybiBvZiAxIG9yIDIgdWludDMyX3Qncworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weVNtYWxsUGF0dGVybjMyYihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCB1aW50NjRfdCBwYXR0ZXJuKSB7CisgIGludCBpOworICBpZiAoKHVpbnRwdHJfdClkc3QgJiA0KSB7ICAgICAgICAgICAvLyBBbGlnbiAnZHN0JyB0byA4LWJ5dGVzIGJvdW5kYXJ5LgorICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICBwYXR0ZXJuID0gKHBhdHRlcm4gPj4gMzIpIHwgKHBhdHRlcm4gPDwgMzIpOworICAgIC0tbGVuZ3RoOworICB9CisgIGFzc2VydCgwID09ICgodWludHB0cl90KWRzdCAmIDcpKTsKKyAgZm9yIChpID0gMDsgaSA8IChsZW5ndGggPj4gMSk7ICsraSkgeworICAgICgodWludDY0X3QqKWRzdClbaV0gPSBwYXR0ZXJuOyAgICAvLyBDb3B5IHRoZSBwYXR0ZXJuIDggYnl0ZXMgYXQgYSB0aW1lLgorICB9CisgIGlmIChsZW5ndGggJiAxKSB7ICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB3aXRoIGxlZnQtb3Zlci4KKyAgICBkc3RbaSA8PCAxXSA9IHNyY1tpIDw8IDFdOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHlCbG9jazMyYih1aW50MzJfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0LCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBkc3QgLSBkaXN0OworICBpZiAoZGlzdCA8PSAyICYmIGxlbmd0aCA+PSA0ICYmICgodWludHB0cl90KWRzdCAmIDMpID09IDApIHsKKyAgICB1aW50NjRfdCBwYXR0ZXJuOworICAgIGlmIChkaXN0ID09IDEpIHsKKyAgICAgIHBhdHRlcm4gPSAodWludDY0X3Qpc3JjWzBdOworICAgICAgcGF0dGVybiB8PSBwYXR0ZXJuIDw8IDMyOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkoJnBhdHRlcm4sIHNyYywgc2l6ZW9mKHBhdHRlcm4pKTsKKyAgICB9CisgICAgQ29weVNtYWxsUGF0dGVybjMyYihzcmMsIGRzdCwgbGVuZ3RoLCBwYXR0ZXJuKTsKKyAgfSBlbHNlIGlmIChkaXN0ID49IGxlbmd0aCkgeyAgLy8gbm8gb3ZlcmxhcAorICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IERlY29kZUFscGhhRGF0YShWUDhMRGVjb2RlciogY29uc3QgZGVjLCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGFzdF9yb3cpIHsKKyAgaW50IG9rID0gMTsKKyAgaW50IHJvdyA9IGRlYy0+bGFzdF9waXhlbF8gLyB3aWR0aDsKKyAgaW50IGNvbCA9IGRlYy0+bGFzdF9waXhlbF8gJSB3aWR0aDsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgaW50IHBvcyA9IGRlYy0+bGFzdF9waXhlbF87ICAgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbgorICBjb25zdCBpbnQgZW5kID0gd2lkdGggKiBoZWlnaHQ7ICAgICAvLyBFbmQgb2YgZGF0YQorICBjb25zdCBpbnQgbGFzdCA9IHdpZHRoICogbGFzdF9yb3c7ICAvLyBMYXN0IHBpeGVsIHRvIGRlY29kZQorICBjb25zdCBpbnQgbGVuX2NvZGVfbGltaXQgPSBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVM7CisgIGNvbnN0IGludCBtYXNrID0gaGRyLT5odWZmbWFuX21hc2tfOworICBjb25zdCBIVHJlZUdyb3VwKiBodHJlZV9ncm91cCA9CisgICAgICAocG9zIDwgbGFzdCkgPyBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpIDogTlVMTDsKKyAgYXNzZXJ0KHBvcyA8PSBlbmQpOworICBhc3NlcnQobGFzdF9yb3cgPD0gaGVpZ2h0KTsKKyAgYXNzZXJ0KElzOGJPcHRpbWl6YWJsZShoZHIpKTsKKworICB3aGlsZSAoIWJyLT5lb3NfICYmIHBvcyA8IGxhc3QpIHsKKyAgICBpbnQgY29kZTsKKyAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIGNoYW5naW5nIHRpbGUuCisgICAgaWYgKChjb2wgJiBtYXNrKSA9PSAwKSB7CisgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgfQorICAgIGFzc2VydChodHJlZV9ncm91cCAhPSBOVUxMKTsKKyAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgY29kZSA9IFJlYWRTeW1ib2woaHRyZWVfZ3JvdXAtPmh0cmVlc1tHUkVFTl0sIGJyKTsKKyAgICBpZiAoY29kZSA8IE5VTV9MSVRFUkFMX0NPREVTKSB7ICAvLyBMaXRlcmFsCisgICAgICBkYXRhW3Bvc10gPSBjb2RlOworICAgICAgKytwb3M7CisgICAgICArK2NvbDsKKyAgICAgIGlmIChjb2wgPj0gd2lkdGgpIHsKKyAgICAgICAgY29sID0gMDsKKyAgICAgICAgKytyb3c7CisgICAgICAgIGlmIChyb3cgPD0gbGFzdF9yb3cgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsKKyAgICAgICAgICBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoZGVjLCByb3cpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlIDwgbGVuX2NvZGVfbGltaXQpIHsgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZQorICAgICAgaW50IGRpc3RfY29kZSwgZGlzdDsKKyAgICAgIGNvbnN0IGludCBsZW5ndGhfc3ltID0gY29kZSAtIE5VTV9MSVRFUkFMX0NPREVTOworICAgICAgY29uc3QgaW50IGxlbmd0aCA9IEdldENvcHlMZW5ndGgobGVuZ3RoX3N5bSwgYnIpOworICAgICAgY29uc3QgaW50IGRpc3Rfc3ltYm9sID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0RJU1RdLCBicik7CisgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICBkaXN0X2NvZGUgPSBHZXRDb3B5RGlzdGFuY2UoZGlzdF9zeW1ib2wsIGJyKTsKKyAgICAgIGRpc3QgPSBQbGFuZUNvZGVUb0Rpc3RhbmNlKHdpZHRoLCBkaXN0X2NvZGUpOworICAgICAgaWYgKHBvcyA+PSBkaXN0ICYmIGVuZCAtIHBvcyA+PSBsZW5ndGgpIHsKKyAgICAgICAgQ29weUJsb2NrOGIoZGF0YSArIHBvcywgZGlzdCwgbGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9rID0gMDsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgICBwb3MgKz0gbGVuZ3RoOworICAgICAgY29sICs9IGxlbmd0aDsKKyAgICAgIHdoaWxlIChjb2wgPj0gd2lkdGgpIHsKKyAgICAgICAgY29sIC09IHdpZHRoOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhkZWMsIHJvdyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwb3MgPCBsYXN0ICYmIChjb2wgJiBtYXNrKSkgeworICAgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIE5vdCByZWFjaGVkCisgICAgICBvayA9IDA7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgYnItPmVvc18gPSBWUDhMSXNFbmRPZlN0cmVhbShicik7CisgIH0KKyAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4KKyAgRXh0cmFjdFBhbGV0dGVkQWxwaGFSb3dzKGRlYywgcm93ID4gbGFzdF9yb3cgPyBsYXN0X3JvdyA6IHJvdyk7CisKKyBFbmQ6CisgIGJyLT5lb3NfID0gVlA4TElzRW5kT2ZTdHJlYW0oYnIpOworICBpZiAoIW9rIHx8IChici0+ZW9zXyAmJiBwb3MgPCBlbmQpKSB7CisgICAgb2sgPSAwOworICAgIGRlYy0+c3RhdHVzXyA9IGJyLT5lb3NfID8gVlA4X1NUQVRVU19TVVNQRU5ERUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICB9IGVsc2UgeworICAgIGRlYy0+bGFzdF9waXhlbF8gPSBwb3M7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBTYXZlU3RhdGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGxhc3RfcGl4ZWwpIHsKKyAgYXNzZXJ0KGRlYy0+aW5jcmVtZW50YWxfKTsKKyAgZGVjLT5zYXZlZF9icl8gPSBkZWMtPmJyXzsKKyAgZGVjLT5zYXZlZF9sYXN0X3BpeGVsXyA9IGxhc3RfcGl4ZWw7CisgIGlmIChkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPiAwKSB7CisgICAgVlA4TENvbG9yQ2FjaGVDb3B5KCZkZWMtPmhkcl8uY29sb3JfY2FjaGVfLCAmZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzdG9yZVN0YXRlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgYXNzZXJ0KGRlYy0+YnJfLmVvc18pOworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgZGVjLT5icl8gPSBkZWMtPnNhdmVkX2JyXzsKKyAgZGVjLT5sYXN0X3BpeGVsXyA9IGRlYy0+c2F2ZWRfbGFzdF9waXhlbF87CisgIGlmIChkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPiAwKSB7CisgICAgVlA4TENvbG9yQ2FjaGVDb3B5KCZkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfLCAmZGVjLT5oZHJfLmNvbG9yX2NhY2hlXyk7CisgIH0KK30KKworI2RlZmluZSBTWU5DX0VWRVJZX05fUk9XUyA4ICAvLyBtaW5pbXVtIG51bWJlciBvZiByb3dzIGJldHdlZW4gY2hlY2stcG9pbnRzCitzdGF0aWMgaW50IERlY29kZUltYWdlRGF0YShWUDhMRGVjb2RlciogY29uc3QgZGVjLCB1aW50MzJfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxhc3Rfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1Jvd3NGdW5jIHByb2Nlc3NfZnVuYykgeworICBpbnQgcm93ID0gZGVjLT5sYXN0X3BpeGVsXyAvIHdpZHRoOworICBpbnQgY29sID0gZGVjLT5sYXN0X3BpeGVsXyAlIHdpZHRoOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOworICB1aW50MzJfdCogc3JjID0gZGF0YSArIGRlYy0+bGFzdF9waXhlbF87CisgIHVpbnQzMl90KiBsYXN0X2NhY2hlZCA9IHNyYzsKKyAgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBkYXRhICsgd2lkdGggKiBoZWlnaHQ7ICAgICAvLyBFbmQgb2YgZGF0YQorICB1aW50MzJfdCogY29uc3Qgc3JjX2xhc3QgPSBkYXRhICsgd2lkdGggKiBsYXN0X3JvdzsgIC8vIExhc3QgcGl4ZWwgdG8gZGVjb2RlCisgIGNvbnN0IGludCBsZW5fY29kZV9saW1pdCA9IE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUzsKKyAgY29uc3QgaW50IGNvbG9yX2NhY2hlX2xpbWl0ID0gbGVuX2NvZGVfbGltaXQgKyBoZHItPmNvbG9yX2NhY2hlX3NpemVfOworICBpbnQgbmV4dF9zeW5jX3JvdyA9IGRlYy0+aW5jcmVtZW50YWxfID8gcm93IDogMSA8PCAyNDsKKyAgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlID0KKyAgICAgIChoZHItPmNvbG9yX2NhY2hlX3NpemVfID4gMCkgPyAmaGRyLT5jb2xvcl9jYWNoZV8gOiBOVUxMOworICBjb25zdCBpbnQgbWFzayA9IGhkci0+aHVmZm1hbl9tYXNrXzsKKyAgY29uc3QgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXAgPQorICAgICAgKHNyYyA8IHNyY19sYXN0KSA/IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdykgOiBOVUxMOworICBhc3NlcnQoZGVjLT5sYXN0X3Jvd18gPCBsYXN0X3Jvdyk7CisgIGFzc2VydChzcmNfbGFzdCA8PSBzcmNfZW5kKTsKKworICB3aGlsZSAoc3JjIDwgc3JjX2xhc3QpIHsKKyAgICBpbnQgY29kZTsKKyAgICBpZiAocm93ID49IG5leHRfc3luY19yb3cpIHsKKyAgICAgIFNhdmVTdGF0ZShkZWMsIChpbnQpKHNyYyAtIGRhdGEpKTsKKyAgICAgIG5leHRfc3luY19yb3cgPSByb3cgKyBTWU5DX0VWRVJZX05fUk9XUzsKKyAgICB9CisgICAgLy8gT25seSB1cGRhdGUgd2hlbiBjaGFuZ2luZyB0aWxlLiBOb3RlIHdlIGNvdWxkIHVzZSB0aGlzIHRlc3Q6CisgICAgLy8gaWYgIigoKChwcmV2X2NvbCBeIGNvbCkgfCBwcmV2X3JvdyBeIHJvdykpID4gbWFzaykiIC0+IHRpbGUgY2hhbmdlZAorICAgIC8vIGJ1dCB0aGF0J3MgYWN0dWFsbHkgc2xvd2VyIGFuZCBuZWVkcyBzdG9yaW5nIHRoZSBwcmV2aW91cyBjb2wvcm93LgorICAgIGlmICgoY29sICYgbWFzaykgPT0gMCkgeworICAgICAgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgIH0KKyAgICBhc3NlcnQoaHRyZWVfZ3JvdXAgIT0gTlVMTCk7CisgICAgaWYgKGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUpIHsKKyAgICAgICpzcmMgPSBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmI7CisgICAgICBnb3RvIEFkdmFuY2VCeU9uZTsKKyAgICB9CisgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgIGlmIChodHJlZV9ncm91cC0+dXNlX3BhY2tlZF90YWJsZSkgeworICAgICAgY29kZSA9IFJlYWRQYWNrZWRTeW1ib2xzKGh0cmVlX2dyb3VwLCBiciwgc3JjKTsKKyAgICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgICAgaWYgKGNvZGUgPT0gUEFDS0VEX05PTl9MSVRFUkFMX0NPREUpIGdvdG8gQWR2YW5jZUJ5T25lOworICAgIH0gZWxzZSB7CisgICAgICBjb2RlID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0dSRUVOXSwgYnIpOworICAgIH0KKyAgICBpZiAoVlA4TElzRW5kT2ZTdHJlYW0oYnIpKSBicmVhazsKKyAgICBpZiAoY29kZSA8IE5VTV9MSVRFUkFMX0NPREVTKSB7ICAvLyBMaXRlcmFsCisgICAgICBpZiAoaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfbGl0ZXJhbCkgeworICAgICAgICAqc3JjID0gaHRyZWVfZ3JvdXAtPmxpdGVyYWxfYXJiIHwgKGNvZGUgPDwgOCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmVkLCBibHVlLCBhbHBoYTsKKyAgICAgICAgcmVkID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW1JFRF0sIGJyKTsKKyAgICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgICAgICBibHVlID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0JMVUVdLCBicik7CisgICAgICAgIGFscGhhID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0FMUEhBXSwgYnIpOworICAgICAgICBpZiAoVlA4TElzRW5kT2ZTdHJlYW0oYnIpKSBicmVhazsKKyAgICAgICAgKnNyYyA9ICgodWludDMyX3QpYWxwaGEgPDwgMjQpIHwgKHJlZCA8PCAxNikgfCAoY29kZSA8PCA4KSB8IGJsdWU7CisgICAgICB9CisgICAgQWR2YW5jZUJ5T25lOgorICAgICAgKytzcmM7CisgICAgICArK2NvbDsKKyAgICAgIGlmIChjb2wgPj0gd2lkdGgpIHsKKyAgICAgICAgY29sID0gMDsKKyAgICAgICAgKytyb3c7CisgICAgICAgIGlmIChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChyb3cgPD0gbGFzdF9yb3cgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2xvcl9jYWNoZSAhPSBOVUxMKSB7CisgICAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7CisgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29kZSA8IGxlbl9jb2RlX2xpbWl0KSB7ICAvLyBCYWNrd2FyZCByZWZlcmVuY2UKKyAgICAgIGludCBkaXN0X2NvZGUsIGRpc3Q7CisgICAgICBjb25zdCBpbnQgbGVuZ3RoX3N5bSA9IGNvZGUgLSBOVU1fTElURVJBTF9DT0RFUzsKKyAgICAgIGNvbnN0IGludCBsZW5ndGggPSBHZXRDb3B5TGVuZ3RoKGxlbmd0aF9zeW0sIGJyKTsKKyAgICAgIGNvbnN0IGludCBkaXN0X3N5bWJvbCA9IFJlYWRTeW1ib2woaHRyZWVfZ3JvdXAtPmh0cmVlc1tESVNUXSwgYnIpOworICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgICAgZGlzdF9jb2RlID0gR2V0Q29weURpc3RhbmNlKGRpc3Rfc3ltYm9sLCBicik7CisgICAgICBkaXN0ID0gUGxhbmVDb2RlVG9EaXN0YW5jZSh3aWR0aCwgZGlzdF9jb2RlKTsKKyAgICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgICAgaWYgKHNyYyAtIGRhdGEgPCAocHRyZGlmZl90KWRpc3QgfHwgc3JjX2VuZCAtIHNyYyA8IChwdHJkaWZmX3QpbGVuZ3RoKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb3B5QmxvY2szMmIoc3JjLCBkaXN0LCBsZW5ndGgpOworICAgICAgfQorICAgICAgc3JjICs9IGxlbmd0aDsKKyAgICAgIGNvbCArPSBsZW5ndGg7CisgICAgICB3aGlsZSAoY29sID49IHdpZHRoKSB7CisgICAgICAgIGNvbCAtPSB3aWR0aDsKKyAgICAgICAgKytyb3c7CisgICAgICAgIGlmIChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChyb3cgPD0gbGFzdF9yb3cgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBCZWNhdXNlIG9mIHRoZSBjaGVjayBkb25lIGFib3ZlIChiZWZvcmUgJ3NyYycgd2FzIGluY3JlbWVudGVkIGJ5CisgICAgICAvLyAnbGVuZ3RoJyksIHRoZSBmb2xsb3dpbmcgaG9sZHMgdHJ1ZS4KKyAgICAgIGFzc2VydChzcmMgPD0gc3JjX2VuZCk7CisgICAgICBpZiAoY29sICYgbWFzaykgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29kZSA8IGNvbG9yX2NhY2hlX2xpbWl0KSB7ICAvLyBDb2xvciBjYWNoZQorICAgICAgY29uc3QgaW50IGtleSA9IGNvZGUgLSBsZW5fY29kZV9saW1pdDsKKyAgICAgIGFzc2VydChjb2xvcl9jYWNoZSAhPSBOVUxMKTsKKyAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeworICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOworICAgICAgfQorICAgICAgKnNyYyA9IFZQOExDb2xvckNhY2hlTG9va3VwKGNvbG9yX2NhY2hlLCBrZXkpOworICAgICAgZ290byBBZHZhbmNlQnlPbmU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCByZWFjaGVkCisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIGJyLT5lb3NfID0gVlA4TElzRW5kT2ZTdHJlYW0oYnIpOworICBpZiAoZGVjLT5pbmNyZW1lbnRhbF8gJiYgYnItPmVvc18gJiYgc3JjIDwgc3JjX2VuZCkgeworICAgIFJlc3RvcmVTdGF0ZShkZWMpOworICB9IGVsc2UgaWYgKCFici0+ZW9zXykgeworICAgIC8vIFByb2Nlc3MgdGhlIHJlbWFpbmluZyByb3dzIGNvcnJlc3BvbmRpbmcgdG8gbGFzdCByb3ctYmxvY2suCisgICAgaWYgKHByb2Nlc3NfZnVuYyAhPSBOVUxMKSB7CisgICAgICBwcm9jZXNzX2Z1bmMoZGVjLCByb3cgPiBsYXN0X3JvdyA/IGxhc3Rfcm93IDogcm93KTsKKyAgICB9CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgICBkZWMtPmxhc3RfcGl4ZWxfID0gKGludCkoc3JjIC0gZGF0YSk7ICAvLyBlbmQtb2Ytc2NhbiBtYXJrZXIKKyAgfSBlbHNlIHsKKyAgICAvLyBpZiBub3QgaW5jcmVtZW50YWwsIGFuZCB3ZSBhcmUgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZlciAoZW9zXz0xKSwgdGhlbiB0aGlzCisgICAgLy8gaXMgYSByZWFsIGJpdHN0cmVhbSBlcnJvci4KKyAgICBnb3RvIEVycm9yOworICB9CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgQ2xlYXJUcmFuc2Zvcm0oVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtKSB7CisgIFdlYlBTYWZlRnJlZSh0cmFuc2Zvcm0tPmRhdGFfKTsKKyAgdHJhbnNmb3JtLT5kYXRhXyA9IE5VTEw7Cit9CisKKy8vIEZvciBzZWN1cml0eSByZWFzb24sIHdlIG5lZWQgdG8gcmVtYXAgdGhlIGNvbG9yIG1hcCB0byBzcGFuCisvLyB0aGUgdG90YWwgcG9zc2libGUgYnVuZGxlZCB2YWx1ZXMsIGFuZCBub3QganVzdCB0aGUgbnVtX2NvbG9ycy4KK3N0YXRpYyBpbnQgRXhwYW5kQ29sb3JNYXAoaW50IG51bV9jb2xvcnMsIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGZpbmFsX251bV9jb2xvcnMgPSAxIDw8ICg4ID4+IHRyYW5zZm9ybS0+Yml0c18pOworICB1aW50MzJfdCogY29uc3QgbmV3X2NvbG9yX21hcCA9CisgICAgICAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdClmaW5hbF9udW1fY29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm5ld19jb2xvcl9tYXApKTsKKyAgaWYgKG5ld19jb2xvcl9tYXAgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSAodWludDhfdCopdHJhbnNmb3JtLT5kYXRhXzsKKyAgICB1aW50OF90KiBjb25zdCBuZXdfZGF0YSA9ICh1aW50OF90KiluZXdfY29sb3JfbWFwOworICAgIG5ld19jb2xvcl9tYXBbMF0gPSB0cmFuc2Zvcm0tPmRhdGFfWzBdOworICAgIGZvciAoaSA9IDQ7IGkgPCA0ICogbnVtX2NvbG9yczsgKytpKSB7CisgICAgICAvLyBFcXVpdmFsZW50IHRvIEFkZFBpeGVsRXEoKSwgb24gYSBieXRlLWJhc2lzLgorICAgICAgbmV3X2RhdGFbaV0gPSAoZGF0YVtpXSArIG5ld19kYXRhW2kgLSA0XSkgJiAweGZmOworICAgIH0KKyAgICBmb3IgKDsgaSA8IDQgKiBmaW5hbF9udW1fY29sb3JzOyArK2kpIHsKKyAgICAgIG5ld19kYXRhW2ldID0gMDsgIC8vIGJsYWNrIHRhaWwuCisgICAgfQorICAgIFdlYlBTYWZlRnJlZSh0cmFuc2Zvcm0tPmRhdGFfKTsKKyAgICB0cmFuc2Zvcm0tPmRhdGFfID0gbmV3X2NvbG9yX21hcDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBSZWFkVHJhbnNmb3JtKGludCogY29uc3QgeHNpemUsIGludCBjb25zdCogeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgb2sgPSAxOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgVlA4TFRyYW5zZm9ybSogdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bZGVjLT5uZXh0X3RyYW5zZm9ybV9dOworICBjb25zdCBWUDhMSW1hZ2VUcmFuc2Zvcm1UeXBlIHR5cGUgPQorICAgICAgKFZQOExJbWFnZVRyYW5zZm9ybVR5cGUpVlA4TFJlYWRCaXRzKGJyLCAyKTsKKworICAvLyBFYWNoIHRyYW5zZm9ybSB0eXBlIGNhbiBvbmx5IGJlIHByZXNlbnQgb25jZSBpbiB0aGUgc3RyZWFtLgorICBpZiAoZGVjLT50cmFuc2Zvcm1zX3NlZW5fICYgKDFVIDw8IHR5cGUpKSB7CisgICAgcmV0dXJuIDA7ICAvLyBBbHJlYWR5IHRoZXJlLCBsZXQncyBub3QgYWNjZXB0IHRoZSBzZWNvbmQgc2FtZSB0cmFuc2Zvcm0uCisgIH0KKyAgZGVjLT50cmFuc2Zvcm1zX3NlZW5fIHw9ICgxVSA8PCB0eXBlKTsKKworICB0cmFuc2Zvcm0tPnR5cGVfID0gdHlwZTsKKyAgdHJhbnNmb3JtLT54c2l6ZV8gPSAqeHNpemU7CisgIHRyYW5zZm9ybS0+eXNpemVfID0gKnlzaXplOworICB0cmFuc2Zvcm0tPmRhdGFfID0gTlVMTDsKKyAgKytkZWMtPm5leHRfdHJhbnNmb3JtXzsKKyAgYXNzZXJ0KGRlYy0+bmV4dF90cmFuc2Zvcm1fIDw9IE5VTV9UUkFOU0ZPUk1TKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFBSRURJQ1RPUl9UUkFOU0ZPUk06CisgICAgY2FzZSBDUk9TU19DT0xPUl9UUkFOU0ZPUk06CisgICAgICB0cmFuc2Zvcm0tPmJpdHNfID0gVlA4TFJlYWRCaXRzKGJyLCAzKSArIDI7CisgICAgICBvayA9IERlY29kZUltYWdlU3RyZWFtKFZQOExTdWJTYW1wbGVTaXplKHRyYW5zZm9ybS0+eHNpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0tPmJpdHNfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT55c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS0+Yml0c18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBkZWMsICZ0cmFuc2Zvcm0tPmRhdGFfKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNOiB7CisgICAgICAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBWUDhMUmVhZEJpdHMoYnIsIDgpICsgMTsKKyAgICAgICBjb25zdCBpbnQgYml0cyA9IChudW1fY29sb3JzID4gMTYpID8gMAorICAgICAgICAgICAgICAgICAgICAgIDogKG51bV9jb2xvcnMgPiA0KSA/IDEKKyAgICAgICAgICAgICAgICAgICAgICA6IChudW1fY29sb3JzID4gMikgPyAyCisgICAgICAgICAgICAgICAgICAgICAgOiAzOworICAgICAgICp4c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHRyYW5zZm9ybS0+eHNpemVfLCBiaXRzKTsKKyAgICAgICB0cmFuc2Zvcm0tPmJpdHNfID0gYml0czsKKyAgICAgICBvayA9IERlY29kZUltYWdlU3RyZWFtKG51bV9jb2xvcnMsIDEsIDAsIGRlYywgJnRyYW5zZm9ybS0+ZGF0YV8pOworICAgICAgIG9rID0gb2sgJiYgRXhwYW5kQ29sb3JNYXAobnVtX2NvbG9ycywgdHJhbnNmb3JtKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFNVQlRSQUNUX0dSRUVOOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwKTsgICAgLy8gY2FuJ3QgaGFwcGVuCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExNZXRhZGF0YQorCitzdGF0aWMgdm9pZCBJbml0TWV0YWRhdGEoVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIpIHsKKyAgYXNzZXJ0KGhkciAhPSBOVUxMKTsKKyAgbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKK30KKworc3RhdGljIHZvaWQgQ2xlYXJNZXRhZGF0YShWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgeworICBhc3NlcnQoaGRyICE9IE5VTEwpOworCisgIFdlYlBTYWZlRnJlZShoZHItPmh1ZmZtYW5faW1hZ2VfKTsKKyAgV2ViUFNhZmVGcmVlKGhkci0+aHVmZm1hbl90YWJsZXNfKTsKKyAgVlA4TEh0cmVlR3JvdXBzRnJlZShoZHItPmh0cmVlX2dyb3Vwc18pOworICBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoZHItPmNvbG9yX2NhY2hlXyk7CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhkci0+c2F2ZWRfY29sb3JfY2FjaGVfKTsKKyAgSW5pdE1ldGFkYXRhKGhkcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMRGVjb2RlcgorCitWUDhMRGVjb2RlciogVlA4TE5ldyh2b2lkKSB7CisgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4TERlY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZGVjKSk7CisgIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT0s7CisgIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07CisKKyAgVlA4TERzcEluaXQoKTsgIC8vIEluaXQgY3JpdGljYWwgZnVuY3Rpb24gcG9pbnRlcnMuCisKKyAgcmV0dXJuIGRlYzsKK30KKwordm9pZCBWUDhMQ2xlYXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgaTsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm47CisgIENsZWFyTWV0YWRhdGEoJmRlYy0+aGRyXyk7CisKKyAgV2ViUFNhZmVGcmVlKGRlYy0+cGl4ZWxzXyk7CisgIGRlYy0+cGl4ZWxzXyA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBkZWMtPm5leHRfdHJhbnNmb3JtXzsgKytpKSB7CisgICAgQ2xlYXJUcmFuc2Zvcm0oJmRlYy0+dHJhbnNmb3Jtc19baV0pOworICB9CisgIGRlYy0+bmV4dF90cmFuc2Zvcm1fID0gMDsKKyAgZGVjLT50cmFuc2Zvcm1zX3NlZW5fID0gMDsKKworICBXZWJQU2FmZUZyZWUoZGVjLT5yZXNjYWxlcl9tZW1vcnkpOworICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IE5VTEw7CisKKyAgZGVjLT5vdXRwdXRfID0gTlVMTDsgICAvLyBsZWF2ZSBubyB0cmFjZSBiZWhpbmQKK30KKwordm9pZCBWUDhMRGVsZXRlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgVlA4TENsZWFyKGRlYyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVXBkYXRlRGVjb2RlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOworICBjb25zdCBpbnQgbnVtX2JpdHMgPSBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfOworICBkZWMtPndpZHRoXyA9IHdpZHRoOworICBkZWMtPmhlaWdodF8gPSBoZWlnaHQ7CisKKyAgaGRyLT5odWZmbWFuX3hzaXplXyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBudW1fYml0cyk7CisgIGhkci0+aHVmZm1hbl9tYXNrXyA9IChudW1fYml0cyA9PSAwKSA/IH4wIDogKDEgPDwgbnVtX2JpdHMpIC0gMTsKK30KKworc3RhdGljIGludCBEZWNvZGVJbWFnZVN0cmVhbShpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2xldmVsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiBjb25zdCBkZWNvZGVkX2RhdGEpIHsKKyAgaW50IG9rID0gMTsKKyAgaW50IHRyYW5zZm9ybV94c2l6ZSA9IHhzaXplOworICBpbnQgdHJhbnNmb3JtX3lzaXplID0geXNpemU7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIHVpbnQzMl90KiBkYXRhID0gTlVMTDsKKyAgaW50IGNvbG9yX2NhY2hlX2JpdHMgPSAwOworCisgIC8vIFJlYWQgdGhlIHRyYW5zZm9ybXMgKG1heSByZWN1cnNlKS4KKyAgaWYgKGlzX2xldmVsMCkgeworICAgIHdoaWxlIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgICBvayA9IFJlYWRUcmFuc2Zvcm0oJnRyYW5zZm9ybV94c2l6ZSwgJnRyYW5zZm9ybV95c2l6ZSwgZGVjKTsKKyAgICB9CisgIH0KKworICAvLyBDb2xvciBjYWNoZQorICBpZiAob2sgJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgeworICAgIGNvbG9yX2NhY2hlX2JpdHMgPSBWUDhMUmVhZEJpdHMoYnIsIDQpOworICAgIG9rID0gKGNvbG9yX2NhY2hlX2JpdHMgPj0gMSAmJiBjb2xvcl9jYWNoZV9iaXRzIDw9IE1BWF9DQUNIRV9CSVRTKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgfQorCisgIC8vIFJlYWQgdGhlIEh1ZmZtYW4gY29kZXMgKG1heSByZWN1cnNlKS4KKyAgb2sgPSBvayAmJiBSZWFkSHVmZm1hbkNvZGVzKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9jYWNoZV9iaXRzLCBpc19sZXZlbDApOworICBpZiAoIW9rKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgY29sb3ItY2FjaGUKKyAgaWYgKGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7CisgICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKKyAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmaGRyLT5jb2xvcl9jYWNoZV8sIGNvbG9yX2NhY2hlX2JpdHMpKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBvayA9IDA7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDA7CisgIH0KKyAgVXBkYXRlRGVjb2RlcihkZWMsIHRyYW5zZm9ybV94c2l6ZSwgdHJhbnNmb3JtX3lzaXplKTsKKworICBpZiAoaXNfbGV2ZWwwKSB7ICAgLy8gbGV2ZWwgMCBjb21wbGV0ZQorICAgIGRlYy0+c3RhdGVfID0gUkVBRF9IRFI7CisgICAgZ290byBFbmQ7CisgIH0KKworICB7CisgICAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9ICh1aW50NjRfdCl0cmFuc2Zvcm1feHNpemUgKiB0cmFuc2Zvcm1feXNpemU7CisgICAgZGF0YSA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpkYXRhKSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgICAgb2sgPSAwOworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9CisKKyAgLy8gVXNlIHRoZSBIdWZmbWFuIHRyZWVzIHRvIGRlY29kZSB0aGUgTFo3NyBlbmNvZGVkIGRhdGEuCisgIG9rID0gRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGF0YSwgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV95c2l6ZSwgTlVMTCk7CisgIG9rID0gb2sgJiYgIWJyLT5lb3NfOworCisgRW5kOgorICBpZiAoIW9rKSB7CisgICAgV2ViUFNhZmVGcmVlKGRhdGEpOworICAgIENsZWFyTWV0YWRhdGEoaGRyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVjb2RlZF9kYXRhICE9IE5VTEwpIHsKKyAgICAgICpkZWNvZGVkX2RhdGEgPSBkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBhbGxvY2F0ZSBpbWFnZSBkYXRhIGluIHRoaXMgZnVuY3Rpb24gb25seSBmb3IgdHJhbnNmb3Jtcy4gQXQgbGV2ZWwgMAorICAgICAgLy8gKHRoYXQgaXM6IG5vdCB0aGUgdHJhbnNmb3JtcyksIHdlIHNob3VsZG4ndCBoYXZlIGFsbG9jYXRlZCBhbnl0aGluZy4KKyAgICAgIGFzc2VydChkYXRhID09IE5VTEwpOworICAgICAgYXNzZXJ0KGlzX2xldmVsMCk7CisgICAgfQorICAgIGRlYy0+bGFzdF9waXhlbF8gPSAwOyAgLy8gUmVzZXQgZm9yIGZ1dHVyZSBERUNPREVfREFUQV9GVU5DKCkgY2FsbHMuCisgICAgaWYgKCFpc19sZXZlbDApIENsZWFyTWV0YWRhdGEoaGRyKTsgIC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkYXRhIGJlaGluZC4KKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzIGRlYy0+cGl4ZWxzXyBhbmQgZGVjLT5hcmdiX2NhY2hlXy4KK3N0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMzMmIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGZpbmFsX3dpZHRoKSB7CisgIGNvbnN0IHVpbnQ2NF90IG51bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87CisgIC8vIFNjcmF0Y2ggYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdG9wLXByZWRpY3Rpb24gcm93IGZvciB0cmFuc2Zvcm1pbmcgdGhlCisgIC8vIGZpcnN0IHJvdyBpbiB0aGUgcm93LWJsb2Nrcy4gTm90IG5lZWRlZCBmb3IgcGFsZXR0ZWQgYWxwaGEuCisgIGNvbnN0IHVpbnQ2NF90IGNhY2hlX3RvcF9waXhlbHMgPSAodWludDE2X3QpZmluYWxfd2lkdGg7CisgIC8vIFNjcmF0Y2ggYnVmZmVyIGZvciB0ZW1wb3JhcnkgQkdSQSBzdG9yYWdlLiBOb3QgbmVlZGVkIGZvciBwYWxldHRlZCBhbHBoYS4KKyAgY29uc3QgdWludDY0X3QgY2FjaGVfcGl4ZWxzID0gKHVpbnQ2NF90KWZpbmFsX3dpZHRoICogTlVNX0FSR0JfQ0FDSEVfUk9XUzsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfbnVtX3BpeGVscyA9CisgICAgICBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVscyArIGNhY2hlX3BpeGVsczsKKworICBhc3NlcnQoZGVjLT53aWR0aF8gPD0gZmluYWxfd2lkdGgpOworICBkZWMtPnBpeGVsc18gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX251bV9waXhlbHMsIHNpemVvZih1aW50MzJfdCkpOworICBpZiAoZGVjLT5waXhlbHNfID09IE5VTEwpIHsKKyAgICBkZWMtPmFyZ2JfY2FjaGVfID0gTlVMTDsgICAgLy8gZm9yIHNhbml0eSBjaGVjaworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkZWMtPmFyZ2JfY2FjaGVfID0gZGVjLT5waXhlbHNfICsgbnVtX3BpeGVscyArIGNhY2hlX3RvcF9waXhlbHM7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzOGIoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0gKHVpbnQ2NF90KWRlYy0+d2lkdGhfICogZGVjLT5oZWlnaHRfOworICBkZWMtPmFyZ2JfY2FjaGVfID0gTlVMTDsgICAgLy8gZm9yIHNhbml0eSBjaGVjaworICBkZWMtPnBpeGVsc18gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX251bV9waXhlbHMsIHNpemVvZih1aW50OF90KSk7CisgIGlmIChkZWMtPnBpeGVsc18gPT0gTlVMTCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3BlY2lhbCByb3ctcHJvY2Vzc2luZyB0aGF0IG9ubHkgc3RvcmVzIHRoZSBhbHBoYSBkYXRhLgorc3RhdGljIHZvaWQgRXh0cmFjdEFscGhhUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgaW50IGN1cl9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKKyAgaW50IG51bV9yb3dzID0gbGFzdF9yb3cgLSBjdXJfcm93OworICBjb25zdCB1aW50MzJfdCogaW4gPSBkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGN1cl9yb3c7CisKKyAgYXNzZXJ0KGxhc3Rfcm93IDw9IGRlYy0+aW9fLT5jcm9wX2JvdHRvbSk7CisgIHdoaWxlIChudW1fcm93cyA+IDApIHsKKyAgICBjb25zdCBpbnQgbnVtX3Jvd3NfdG9fcHJvY2VzcyA9CisgICAgICAgIChudW1fcm93cyA+IE5VTV9BUkdCX0NBQ0hFX1JPV1MpID8gTlVNX0FSR0JfQ0FDSEVfUk9XUyA6IG51bV9yb3dzOworICAgIC8vIEV4dHJhY3QgYWxwaGEgKHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgZ3JlZW4gcGxhbmUpLgorICAgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IChBTFBIRGVjb2RlciopZGVjLT5pb18tPm9wYXF1ZTsKKyAgICB1aW50OF90KiBjb25zdCBvdXRwdXQgPSBhbHBoX2RlYy0+b3V0cHV0XzsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBkZWMtPmlvXy0+d2lkdGg7ICAgICAgLy8gdGhlIGZpbmFsIHdpZHRoICghPSBkZWMtPndpZHRoXykKKyAgICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IHdpZHRoICogbnVtX3Jvd3NfdG9fcHJvY2VzczsKKyAgICB1aW50OF90KiBjb25zdCBkc3QgPSBvdXRwdXQgKyB3aWR0aCAqIGN1cl9yb3c7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGRlYy0+YXJnYl9jYWNoZV87CisgICAgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhkZWMsIG51bV9yb3dzX3RvX3Byb2Nlc3MsIGluKTsKKyAgICBXZWJQRXh0cmFjdEdyZWVuKHNyYywgZHN0LCBjYWNoZV9waXhzKTsKKyAgICBBbHBoYUFwcGx5RmlsdGVyKGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgY3VyX3JvdywgY3VyX3JvdyArIG51bV9yb3dzX3RvX3Byb2Nlc3MsIGRzdCwgd2lkdGgpOworICAgIG51bV9yb3dzIC09IG51bV9yb3dzX3RvX3Byb2Nlc3M7CisgICAgaW4gKz0gbnVtX3Jvd3NfdG9fcHJvY2VzcyAqIGRlYy0+d2lkdGhfOworICAgIGN1cl9yb3cgKz0gbnVtX3Jvd3NfdG9fcHJvY2VzczsKKyAgfQorICBhc3NlcnQoY3VyX3JvdyA9PSBsYXN0X3Jvdyk7CisgIGRlYy0+bGFzdF9yb3dfID0gZGVjLT5sYXN0X291dF9yb3dfID0gbGFzdF9yb3c7Cit9CisKK2ludCBWUDhMRGVjb2RlQWxwaGFIZWFkZXIoQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIGludCBvayA9IDA7CisgIFZQOExEZWNvZGVyKiBkZWMgPSBWUDhMTmV3KCk7CisKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBhc3NlcnQoYWxwaF9kZWMgIT0gTlVMTCk7CisgIGFscGhfZGVjLT52cDhsX2RlY18gPSBkZWM7CisKKyAgZGVjLT53aWR0aF8gPSBhbHBoX2RlYy0+d2lkdGhfOworICBkZWMtPmhlaWdodF8gPSBhbHBoX2RlYy0+aGVpZ2h0XzsKKyAgZGVjLT5pb18gPSAmYWxwaF9kZWMtPmlvXzsKKyAgZGVjLT5pb18tPm9wYXF1ZSA9IGFscGhfZGVjOworICBkZWMtPmlvXy0+d2lkdGggPSBhbHBoX2RlYy0+d2lkdGhfOworICBkZWMtPmlvXy0+aGVpZ2h0ID0gYWxwaF9kZWMtPmhlaWdodF87CisKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBkYXRhLCBkYXRhX3NpemUpOworCisgIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0oYWxwaF9kZWMtPndpZHRoXywgYWxwaF9kZWMtPmhlaWdodF8sIDEsIGRlYywgTlVMTCkpIHsKKyAgICBnb3RvIEVycjsKKyAgfQorCisgIC8vIFNwZWNpYWwgY2FzZTogaWYgYWxwaGEgZGF0YSB1c2VzIG9ubHkgdGhlIGNvbG9yIGluZGV4aW5nIHRyYW5zZm9ybSBhbmQKKyAgLy8gZG9lc24ndCB1c2UgY29sb3IgY2FjaGUgKGEgZnJlcXVlbnQgY2FzZSksIHdlIHdpbGwgdXNlIERlY29kZUFscGhhRGF0YSgpCisgIC8vIG1ldGhvZCB0aGF0IG9ubHkgbmVlZHMgYWxsb2NhdGlvbiBvZiAxIGJ5dGUgcGVyIHBpeGVsIChhbHBoYSBjaGFubmVsKS4KKyAgaWYgKGRlYy0+bmV4dF90cmFuc2Zvcm1fID09IDEgJiYKKyAgICAgIGRlYy0+dHJhbnNmb3Jtc19bMF0udHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNICYmCisgICAgICBJczhiT3B0aW1pemFibGUoJmRlYy0+aGRyXykpIHsKKyAgICBhbHBoX2RlYy0+dXNlXzhiX2RlY29kZV8gPSAxOworICAgIG9rID0gQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnM4YihkZWMpOworICB9IGVsc2UgeworICAgIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgKG5vdGUgdGhhdCBkZWMtPndpZHRoXyBtYXkgaGF2ZSBjaGFuZ2VkIGhlcmUpLgorICAgIGFscGhfZGVjLT51c2VfOGJfZGVjb2RlXyA9IDA7CisgICAgb2sgPSBBbGxvY2F0ZUludGVybmFsQnVmZmVyczMyYihkZWMsIGFscGhfZGVjLT53aWR0aF8pOworICB9CisKKyAgaWYgKCFvaykgZ290byBFcnI7CisKKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIFZQOExEZWxldGUoYWxwaF9kZWMtPnZwOGxfZGVjXyk7CisgIGFscGhfZGVjLT52cDhsX2RlY18gPSBOVUxMOworICByZXR1cm4gMDsKK30KKworaW50IFZQOExEZWNvZGVBbHBoYUltYWdlU3RyZWFtKEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywgaW50IGxhc3Rfcm93KSB7CisgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSBhbHBoX2RlYy0+dnA4bF9kZWNfOworICBhc3NlcnQoZGVjICE9IE5VTEwpOworICBhc3NlcnQobGFzdF9yb3cgPD0gZGVjLT5oZWlnaHRfKTsKKworICBpZiAoZGVjLT5sYXN0X3Jvd18gPj0gbGFzdF9yb3cpIHsKKyAgICByZXR1cm4gMTsgIC8vIGRvbmUKKyAgfQorCisgIGlmICghYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfKSBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworCisgIC8vIERlY29kZSAod2l0aCBzcGVjaWFsIHJvdyBwcm9jZXNzaW5nKS4KKyAgcmV0dXJuIGFscGhfZGVjLT51c2VfOGJfZGVjb2RlXyA/CisgICAgICBEZWNvZGVBbHBoYURhdGEoZGVjLCAodWludDhfdCopZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAorICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfcm93KSA6CisgICAgICBEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yb3csIEV4dHJhY3RBbHBoYVJvd3MpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVlA4TERlY29kZUhlYWRlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQsIGhhc19hbHBoYTsKKworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworICBpZiAoaW8gPT0gTlVMTCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRlYy0+aW9fID0gaW87CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT0s7CisgIFZQOExJbml0Qml0UmVhZGVyKCZkZWMtPmJyXywgaW8tPmRhdGEsIGlvLT5kYXRhX3NpemUpOworICBpZiAoIVJlYWRJbWFnZUluZm8oJmRlYy0+YnJfLCAmd2lkdGgsICZoZWlnaHQsICZoYXNfYWxwaGEpKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBkZWMtPnN0YXRlXyA9IFJFQURfRElNOworICBpby0+d2lkdGggPSB3aWR0aDsKKyAgaW8tPmhlaWdodCA9IGhlaWdodDsKKworICBpZiAoIURlY29kZUltYWdlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIDEsIGRlYywgTlVMTCkpIGdvdG8gRXJyb3I7CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIFZQOExDbGVhcihkZWMpOworICBhc3NlcnQoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOworICByZXR1cm4gMDsKK30KKworaW50IFZQOExEZWNvZGVJbWFnZShWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOElvKiBpbyA9IE5VTEw7CisgIFdlYlBEZWNQYXJhbXMqIHBhcmFtcyA9IE5VTEw7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBhc3NlcnQoZGVjLT5oZHJfLmh1ZmZtYW5fdGFibGVzXyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRlYy0+aGRyXy5odHJlZV9ncm91cHNfICE9IE5VTEwpOworICBhc3NlcnQoZGVjLT5oZHJfLm51bV9odHJlZV9ncm91cHNfID4gMCk7CisKKyAgaW8gPSBkZWMtPmlvXzsKKyAgYXNzZXJ0KGlvICE9IE5VTEwpOworICBwYXJhbXMgPSAoV2ViUERlY1BhcmFtcyopaW8tPm9wYXF1ZTsKKyAgYXNzZXJ0KHBhcmFtcyAhPSBOVUxMKTsKKworICAvLyBJbml0aWFsaXphdGlvbi4KKyAgaWYgKGRlYy0+c3RhdGVfICE9IFJFQURfREFUQSkgeworICAgIGRlYy0+b3V0cHV0XyA9IHBhcmFtcy0+b3V0cHV0OworICAgIGFzc2VydChkZWMtPm91dHB1dF8gIT0gTlVMTCk7CisKKyAgICBpZiAoIVdlYlBJb0luaXRGcm9tT3B0aW9ucyhwYXJhbXMtPm9wdGlvbnMsIGlvLCBNT0RFX0JHUkEpKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgICBnb3RvIEVycjsKKyAgICB9CisKKyAgICBpZiAoIUFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzMzJiKGRlYywgaW8tPndpZHRoKSkgZ290byBFcnI7CisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICAgIGlmIChpby0+dXNlX3NjYWxpbmcgJiYgIUFsbG9jYXRlQW5kSW5pdFJlc2NhbGVyKGRlYywgaW8pKSBnb3RvIEVycjsKKyNlbHNlCisgICAgaWYgKGlvLT51c2Vfc2NhbGluZykgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgICAgZ290byBFcnI7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGlvLT51c2Vfc2NhbGluZyB8fCBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2UpKSB7CisgICAgICAvLyBuZWVkIHRoZSBhbHBoYS1tdWx0aXBseSBmdW5jdGlvbnMgZm9yIHByZW11bHRpcGxpZWQgb3V0cHV0IG9yIHJlc2NhbGluZworICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgICB9CisKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUoZGVjLT5vdXRwdXRfLT5jb2xvcnNwYWNlKSkgeworICAgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKCk7CisgICAgICBpZiAoZGVjLT5vdXRwdXRfLT51LllVVkEuYSAhPSBOVUxMKSBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgIH0KKyAgICBpZiAoZGVjLT5pbmNyZW1lbnRhbF8pIHsKKyAgICAgIGlmIChkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPiAwICYmCisgICAgICAgICAgZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXy5jb2xvcnNfID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFWUDhMQ29sb3JDYWNoZUluaXQoJmRlYy0+aGRyXy5zYXZlZF9jb2xvcl9jYWNoZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy0+aGRyXy5jb2xvcl9jYWNoZV8uaGFzaF9iaXRzXykpIHsKKyAgICAgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICAgICAgZ290byBFcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RBVEE7CisgIH0KKworICAvLyBEZWNvZGUuCisgIGlmICghRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAorICAgICAgICAgICAgICAgICAgICAgICBpby0+Y3JvcF9ib3R0b20sIFByb2Nlc3NSb3dzKSkgeworICAgIGdvdG8gRXJyOworICB9CisKKyAgcGFyYW1zLT5sYXN0X3kgPSBkZWMtPmxhc3Rfb3V0X3Jvd187CisgIHJldHVybiAxOworCisgRXJyOgorICBWUDhMQ2xlYXIoZGVjKTsKKyAgYXNzZXJ0KGRlYy0+c3RhdHVzXyAhPSBWUDhfU1RBVFVTX09LKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4bGkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4bGlfZGVjLmgKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGxpLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4bGlfZGVjLmgKaW5kZXggZGJkZDljMS4uY2VhMjJmNyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGxpLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhsaV9kZWMuaApAQCAtMTIsMjIgKzEyLDE4IEBACiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogLy8gICAgICAgICBWaWthcyBBcm9yYSh2aWthYXMuYXJvcmFAZ21haWwuY29tKQogCi0jaWZuZGVmIFdFQlBfREVDX1ZQOExJX0hfCi0jZGVmaW5lIFdFQlBfREVDX1ZQOExJX0hfCisjaWZuZGVmIFdFQlBfREVDX1ZQOExJX0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19WUDhMSV9ERUNfSF8KIAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCiAjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCIKIAotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfcmVhZGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvY29sb3JfY2FjaGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKQEAgLTQ3LDEyICs0Myw5IEBACiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIEh1ZmZtYW5UcmVlIGh0cmVlc19bSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXTsKLX0gSFRyZWVHcm91cDsKLQotdHlwZWRlZiBzdHJ1Y3QgewogICBpbnQgICAgICAgICAgICAgY29sb3JfY2FjaGVfc2l6ZV87CiAgIFZQOExDb2xvckNhY2hlICBjb2xvcl9jYWNoZV87CisgIFZQOExDb2xvckNhY2hlICBzYXZlZF9jb2xvcl9jYWNoZV87ICAvLyBmb3IgaW5jcmVtZW50YWwKIAogICBpbnQgICAgICAgICAgICAgaHVmZm1hbl9tYXNrXzsKICAgaW50ICAgICAgICAgICAgIGh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfOwpAQCAtNjAsMTEgKzUzLDEyIEBACiAgIHVpbnQzMl90ICAgICAgICpodWZmbWFuX2ltYWdlXzsKICAgaW50ICAgICAgICAgICAgIG51bV9odHJlZV9ncm91cHNfOwogICBIVHJlZUdyb3VwICAgICAqaHRyZWVfZ3JvdXBzXzsKKyAgSHVmZm1hbkNvZGUgICAgKmh1ZmZtYW5fdGFibGVzXzsKIH0gVlA4TE1ldGFkYXRhOwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBWUDhMRGVjb2RlciBWUDhMRGVjb2RlcjsKK3N0cnVjdCBWUDhMRGVjb2RlciB7CiAgIFZQOFN0YXR1c0NvZGUgICAgc3RhdHVzXzsKLSAgVlA4TERlY29kZVN0YXRlICBhY3Rpb25fOwogICBWUDhMRGVjb2RlU3RhdGUgIHN0YXRlXzsKICAgVlA4SW8gICAgICAgICAgICppb187CiAKQEAgLTc1LDEwICs2OSwxNiBAQAogICB1aW50MzJfdCAgICAgICAgKmFyZ2JfY2FjaGVfOyAgICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgdGVtcG9yYXJ5IEJHUkEgc3RvcmFnZS4KIAogICBWUDhMQml0UmVhZGVyICAgIGJyXzsKKyAgaW50ICAgICAgICAgICAgICBpbmNyZW1lbnRhbF87ICAgLy8gaWYgdHJ1ZSwgaW5jcmVtZW50YWwgZGVjb2RpbmcgaXMgZXhwZWN0ZWQKKyAgVlA4TEJpdFJlYWRlciAgICBzYXZlZF9icl87ICAgICAgLy8gbm90ZTogY291bGQgYmUgbG9jYWwgdmFyaWFibGVzIHRvbworICBpbnQgICAgICAgICAgICAgIHNhdmVkX2xhc3RfcGl4ZWxfOwogCiAgIGludCAgICAgICAgICAgICAgd2lkdGhfOwogICBpbnQgICAgICAgICAgICAgIGhlaWdodF87CiAgIGludCAgICAgICAgICAgICAgbGFzdF9yb3dfOyAgICAgIC8vIGxhc3QgaW5wdXQgcm93IGRlY29kZWQgc28gZmFyLgorICBpbnQgICAgICAgICAgICAgIGxhc3RfcGl4ZWxfOyAgICAvLyBsYXN0IHBpeGVsIGRlY29kZWQgc28gZmFyLiBIb3dldmVyLCBpdCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGJlIHRyYW5zZm9ybWVkLCBzY2FsZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yLWNvbnZlcnRlZCB5ZXQuCiAgIGludCAgICAgICAgICAgICAgbGFzdF9vdXRfcm93XzsgIC8vIGxhc3Qgcm93IG91dHB1dCBzbyBmYXIuCiAKICAgVlA4TE1ldGFkYXRhICAgICBoZHJfOwpAQCAtOTAsMTggKzkwLDI2IEBACiAKICAgdWludDhfdCAgICAgICAgICpyZXNjYWxlcl9tZW1vcnk7ICAvLyBXb3JraW5nIG1lbW9yeSBmb3IgcmVzY2FsaW5nIHdvcmsuCiAgIFdlYlBSZXNjYWxlciAgICAqcmVzY2FsZXI7ICAgICAgICAgLy8gQ29tbW9uIHJlc2NhbGVyIGZvciBhbGwgY2hhbm5lbHMuCi19IFZQOExEZWNvZGVyOworfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KIAorc3RydWN0IEFMUEhEZWNvZGVyOyAgLy8gRGVmaW5lZCBpbiBkZWMvYWxwaGFpLmguCisKIC8vIGluIHZwOGwuYwogCi0vLyBEZWNvZGVzIGEgcmF3IGltYWdlIHN0cmVhbSAod2l0aG91dCBoZWFkZXIpIGFuZCBzdG9yZSB0aGUgYWxwaGEgZGF0YQotLy8gaW50byAqb3V0cHV0LCB3aGljaCBtdXN0IGJlIG9mIHNpemUgd2lkdGggeCBoZWlnaHQuIFJldHVybnMgZmFsc2UgaW4gY2FzZQotLy8gb2YgZXJyb3IuCi1pbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCk7CisvLyBEZWNvZGVzIGltYWdlIGhlYWRlciBmb3IgYWxwaGEgZGF0YSBzdG9yZWQgdXNpbmcgbG9zc2xlc3MgY29tcHJlc3Npb24uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgVlA4TERlY29kZUFscGhhSGVhZGVyKHN0cnVjdCBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvLyBEZWNvZGVzICphdCBsZWFzdCogJ2xhc3Rfcm93JyByb3dzIG9mIGFscGhhLiBJZiBzb21lIG9mIHRoZSBpbml0aWFsIHJvd3MgYXJlCisvLyBhbHJlYWR5IGRlY29kZWQgaW4gcHJldmlvdXMgY2FsbChzKSwgaXQgd2lsbCByZXN1bWUgZGVjb2RpbmcgZnJvbSB3aGVyZSBpdAorLy8gd2FzIHBhdXNlZC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBiaXRzdHJlYW0gZXJyb3IuCitpbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oc3RydWN0IEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9yb3cpOwogCiAvLyBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemUgYSBuZXcgbG9zc2xlc3MgZGVjb2RlciBpbnN0YW5jZS4KIFZQOExEZWNvZGVyKiBWUDhMTmV3KHZvaWQpOwpAQCAtMTIyLDggKzEzMCw4IEBACiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLyogV0VCUF9ERUNfVlA4TElfSF8gKi8KKyNlbmRpZiAgLyogV0VCUF9ERUNfVlA4TElfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwX2RlYy5jCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy93ZWJwLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicF9kZWMuYwppbmRleCAzMzY0YWI4Li4yNGQ0MjI3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicF9kZWMuYwpAQCAtMTIsMjAgKzEyLDE4IEBACiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIi4vdnA4aS5oIgotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuL3dlYnBpLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9tdXhfdHlwZXMuaCIgIC8vIEFMUEhBX0ZMQUcKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9tdXhfdHlwZXMuaCIgIC8vIEFMUEhBX0ZMQUcKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFJJRkYgbGF5b3V0IGlzOgpAQCAtNDcsMzggKzQ1LDMxIEBACiAvLyAgIDIwLi4yMyAgVlA4WCBmbGFncyBiaXQtbWFwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNodW5rLXR5cGVzIHByZXNlbnQuCiAvLyAgIDI0Li4yNiAgV2lkdGggb2YgdGhlIENhbnZhcyBJbWFnZS4KIC8vICAgMjcuLjI5ICBIZWlnaHQgb2YgdGhlIENhbnZhcyBJbWFnZS4KLS8vIFRoZXJlIGNhbiBiZSBleHRyYSBjaHVua3MgYWZ0ZXIgdGhlICJWUDhYIiBjaHVuayAoSUNDUCwgRlJHTSwgQU5NRiwgVlA4LAotLy8gVlA4TCwgWE1QLCBFWElGICAuLi4pCisvLyBUaGVyZSBjYW4gYmUgZXh0cmEgY2h1bmtzIGFmdGVyIHRoZSAiVlA4WCIgY2h1bmsgKElDQ1AsIEFOTUYsIFZQOCwgVlA4TCwKKy8vIFhNUCwgRVhJRiAgLi4uKQogLy8gQWxsIHNpemVzIGFyZSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgogLy8gTm90ZTogY2h1bmsgZGF0YSBzaXplIG11c3QgYmUgcGFkZGVkIHRvIG11bHRpcGxlIG9mIDIgd2hlbiB3cml0dGVuLgogCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgZ2V0X2xlMjQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgZ2V0X2xlMzIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gKHVpbnQzMl90KWdldF9sZTI0KGRhdGEpIHwgKGRhdGFbM10gPDwgMjQpOwotfQotCiAvLyBWYWxpZGF0ZXMgdGhlIFJJRkYgY29udGFpbmVyIChpZiBkZXRlY3RlZCkgYW5kIHNraXBzIG92ZXIgaXQuCi0vLyBJZiBhIFJJRkYgY29udGFpbmVyIGlzIGRldGVjdGVkLAotLy8gUmV0dXJucyBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiBmb3IgaW52YWxpZCBoZWFkZXIsIGFuZAotLy8gICAgICAgICBWUDhfU1RBVFVTX09LIG90aGVyd2lzZS4KKy8vIElmIGEgUklGRiBjb250YWluZXIgaXMgZGV0ZWN0ZWQsIHJldHVybnM6CisvLyAgICAgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgZm9yIGludmFsaWQgaGVhZGVyLAorLy8gICAgIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBIGZvciB0cnVuY2F0ZWQgZGF0YSBpZiBoYXZlX2FsbF9kYXRhIGlzIHRydWUsCisvLyBhbmQgVlA4X1NUQVRVU19PSyBvdGhlcndpc2UuCiAvLyBJbiBjYXNlIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIChwYXJ0aWFsIFJJRkYgY29udGFpbmVyKSwgcmV0dXJuIDAgZm9yCiAvLyAqcmlmZl9zaXplLiBFbHNlIHJldHVybiB0aGUgUklGRiBzaXplIGV4dHJhY3RlZCBmcm9tIHRoZSBoZWFkZXIuCiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVJJRkYoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsIGludCBoYXZlX2FsbF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgcmlmZl9zaXplKSB7Ci0gIFNCX0RDSEVDSyhkYXRhICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soZGF0YV9zaXplICE9IE5VTEwpOwotICBTQl9EQ0hFQ0socmlmZl9zaXplICE9IE5VTEwpOworICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGFfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KHJpZmZfc2l6ZSAhPSBOVUxMKTsKIAogICAqcmlmZl9zaXplID0gMDsgIC8vIERlZmF1bHQ6IG5vIFJJRkYgcHJlc2VudC4KLSAgaWYgKCpkYXRhX3NpemUgPj0gUklGRl9IRUFERVJfU0laRSAmJiAhU2JNZW1vcnlDb21wYXJlKCpkYXRhLCAiUklGRiIsIFRBR19TSVpFKSkgewotICAgIGlmIChTYk1lbW9yeUNvbXBhcmUoKmRhdGEgKyA4LCAiV0VCUCIsIFRBR19TSVpFKSkgeworICBpZiAoKmRhdGFfc2l6ZSA+PSBSSUZGX0hFQURFUl9TSVpFICYmICFtZW1jbXAoKmRhdGEsICJSSUZGIiwgVEFHX1NJWkUpKSB7CisgICAgaWYgKG1lbWNtcCgqZGF0YSArIDgsICJXRUJQIiwgVEFHX1NJWkUpKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBXcm9uZyBpbWFnZSBmaWxlIHNpZ25hdHVyZS4KICAgICB9IGVsc2UgewotICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGdldF9sZTMyKCpkYXRhICsgVEFHX1NJWkUpOworICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IEdldExFMzIoKmRhdGEgKyBUQUdfU0laRSk7CiAgICAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNodW5rIChpLmUgIldFQlAiICsgIlZQOD9ubm5uIikuCiAgICAgICBpZiAoc2l6ZSA8IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUpIHsKICAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwpAQCAtODYsNiArNzcsOSBAQAogICAgICAgaWYgKHNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgewogICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CiAgICAgICB9CisgICAgICBpZiAoaGF2ZV9hbGxfZGF0YSAmJiAoc2l6ZSA+ICpkYXRhX3NpemUgLSBDSFVOS19IRUFERVJfU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gVHJ1bmNhdGVkIGJpdHN0cmVhbS4KKyAgICAgIH0KICAgICAgIC8vIFdlIGhhdmUgYSBSSUZGIGNvbnRhaW5lci4gU2tpcCBpdC4KICAgICAgICpyaWZmX3NpemUgPSBzaXplOwogICAgICAgKmRhdGEgKz0gUklGRl9IRUFERVJfU0laRTsKQEAgLTEwOCw5ICsxMDIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGhfcHRyLCBpbnQqIGNvbnN0IGhlaWdodF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGZsYWdzX3B0cikgewogICBjb25zdCB1aW50MzJfdCB2cDh4X3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRTsKLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhkYXRhX3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhmb3VuZF92cDh4ICE9IE5VTEwpOworICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGFfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGZvdW5kX3ZwOHggIT0gTlVMTCk7CiAKICAgKmZvdW5kX3ZwOHggPSAwOwogCkBAIC0xMTgsMTAgKzExMiwxMCBAQAogICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIEluc3VmZmljaWVudCBkYXRhLgogICB9CiAKLSAgaWYgKCFTYk1lbW9yeUNvbXBhcmUoKmRhdGEsICJWUDhYIiwgVEFHX1NJWkUpKSB7CisgIGlmICghbWVtY21wKCpkYXRhLCAiVlA4WCIsIFRBR19TSVpFKSkgewogICAgIGludCB3aWR0aCwgaGVpZ2h0OwogICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBnZXRfbGUzMigqZGF0YSArIFRBR19TSVpFKTsKKyAgICBjb25zdCB1aW50MzJfdCBjaHVua19zaXplID0gR2V0TEUzMigqZGF0YSArIFRBR19TSVpFKTsKICAgICBpZiAoY2h1bmtfc2l6ZSAhPSBWUDhYX0NIVU5LX1NJWkUpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIFdyb25nIGNodW5rIHNpemUuCiAgICAgfQpAQCAtMTMwLDkgKzEyNCw5IEBACiAgICAgaWYgKCpkYXRhX3NpemUgPCB2cDh4X3NpemUpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIEluc3VmZmljaWVudCBkYXRhLgogICAgIH0KLSAgICBmbGFncyA9IGdldF9sZTMyKCpkYXRhICsgOCk7Ci0gICAgd2lkdGggPSAxICsgZ2V0X2xlMjQoKmRhdGEgKyAxMik7Ci0gICAgaGVpZ2h0ID0gMSArIGdldF9sZTI0KCpkYXRhICsgMTUpOworICAgIGZsYWdzID0gR2V0TEUzMigqZGF0YSArIDgpOworICAgIHdpZHRoID0gMSArIEdldExFMjQoKmRhdGEgKyAxMik7CisgICAgaGVpZ2h0ID0gMSArIEdldExFMjQoKmRhdGEgKyAxNSk7CiAgICAgaWYgKHdpZHRoICogKHVpbnQ2NF90KWhlaWdodCA+PSBNQVhfSU1BR0VfQVJFQSkgewogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gaW1hZ2UgaXMgdG9vIGxhcmdlCiAgICAgfQpAQCAtMTY1LDEzICsxNTksMTMgQEAKICAgdWludDMyX3QgdG90YWxfc2l6ZSA9IFRBR19TSVpFICsgICAgICAgICAgIC8vICJXRUJQIi4KICAgICAgICAgICAgICAgICAgICAgICAgIENIVU5LX0hFQURFUl9TSVpFICsgIC8vICJWUDhYbm5ubiIuCiAgICAgICAgICAgICAgICAgICAgICAgICBWUDhYX0NIVU5LX1NJWkU7ICAgICAvLyBkYXRhLgotICBTQl9EQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGRhdGFfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CiAgIGJ1ZiA9ICpkYXRhOwogICBidWZfc2l6ZSA9ICpkYXRhX3NpemU7CiAKLSAgU0JfRENIRUNLKGFscGhhX2RhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhhbHBoYV9zaXplICE9IE5VTEwpOworICBhc3NlcnQoYWxwaGFfZGF0YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGFscGhhX3NpemUgIT0gTlVMTCk7CiAgICphbHBoYV9kYXRhID0gTlVMTDsKICAgKmFscGhhX3NpemUgPSAwOwogCkBAIC0xODYsNyArMTgwLDcgQEAKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICBjaHVua19zaXplID0gZ2V0X2xlMzIoYnVmICsgVEFHX1NJWkUpOworICAgIGNodW5rX3NpemUgPSBHZXRMRTMyKGJ1ZiArIFRBR19TSVpFKTsKICAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGNodW5rIHNpemUuCiAgICAgfQpAQCAtMjAzLDggKzE5Nyw4IEBACiAgICAgLy8gcGFyc2VkIGFsbCB0aGUgb3B0aW9uYWwgY2h1bmtzLgogICAgIC8vIE5vdGU6IFRoaXMgY2hlY2sgbXVzdCBvY2N1ciBiZWZvcmUgdGhlIGNoZWNrICdidWZfc2l6ZSA8IGRpc2tfY2h1bmtfc2l6ZScKICAgICAvLyBiZWxvdyB0byBhbGxvdyBpbmNvbXBsZXRlIFZQOC9WUDhMIGNodW5rcy4KLSAgICBpZiAoIVNiTWVtb3J5Q29tcGFyZShidWYsICJWUDggIiwgVEFHX1NJWkUpIHx8Ci0gICAgICAgICFTYk1lbW9yeUNvbXBhcmUoYnVmLCAiVlA4TCIsIFRBR19TSVpFKSkgeworICAgIGlmICghbWVtY21wKGJ1ZiwgIlZQOCAiLCBUQUdfU0laRSkgfHwKKyAgICAgICAgIW1lbWNtcChidWYsICJWUDhMIiwgVEFHX1NJWkUpKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19PSzsKICAgICB9CiAKQEAgLTIxMiw3ICsyMDYsNyBAQAogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKGJ1ZiwgIkFMUEgiLCBUQUdfU0laRSkpIHsgICAgICAgICAvLyBBIHZhbGlkIEFMUEggaGVhZGVyLgorICAgIGlmICghbWVtY21wKGJ1ZiwgIkFMUEgiLCBUQUdfU0laRSkpIHsgICAgICAgICAvLyBBIHZhbGlkIEFMUEggaGVhZGVyLgogICAgICAgKmFscGhhX2RhdGEgPSBidWYgKyBDSFVOS19IRUFERVJfU0laRTsKICAgICAgICphbHBoYV9zaXplID0gY2h1bmtfc2l6ZTsKICAgICB9CkBAIC0yMzIsMjAgKzIyNiwxOSBAQAogLy8gZXh0cmFjdGVkIGZyb20gdGhlIFZQOC9WUDhMIGNodW5rIGhlYWRlci4KIC8vIFRoZSBmbGFnICcqaXNfbG9zc2xlc3MnIGlzIHNldCB0byAxIGluIGNhc2Ugb2YgVlA4TCBjaHVuayAvIHJhdyBWUDhMIGRhdGEuCiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVZQOEhlYWRlcihjb25zdCB1aW50OF90KiogY29uc3QgZGF0YV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwgaW50IGhhdmVfYWxsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLCBzaXplX3QqIGNvbnN0IGNodW5rX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGlzX2xvc3NsZXNzKSB7CiAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSAqZGF0YV9wdHI7Ci0gIGNvbnN0IGludCBpc192cDggPSAhU2JNZW1vcnlDb21wYXJlKGRhdGEsICJWUDggIiwgVEFHX1NJWkUpOwotICBjb25zdCBpbnQgaXNfdnA4bCA9ICFTYk1lbW9yeUNvbXBhcmUoZGF0YSwgIlZQOEwiLCBUQUdfU0laRSk7CisgIGNvbnN0IGludCBpc192cDggPSAhbWVtY21wKGRhdGEsICJWUDggIiwgVEFHX1NJWkUpOworICBjb25zdCBpbnQgaXNfdnA4bCA9ICFtZW1jbXAoZGF0YSwgIlZQOEwiLCBUQUdfU0laRSk7CiAgIGNvbnN0IHVpbnQzMl90IG1pbmltYWxfc2l6ZSA9CiAgICAgICBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFOyAgLy8gIldFQlAiICsgIlZQOCBubm5uIiBPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJXRUJQIiArICJWUDhMbm5ubiIKLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhkYXRhX3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhjaHVua19zaXplICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soaXNfbG9zc2xlc3MgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQoY2h1bmtfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGlzX2xvc3NsZXNzICE9IE5VTEwpOwogCiAgIGlmICgqZGF0YV9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KQEAgLTI1MywxMCArMjQ2LDEzIEBACiAKICAgaWYgKGlzX3ZwOCB8fCBpc192cDhsKSB7CiAgICAgLy8gQml0c3RyZWFtIGNvbnRhaW5zIFZQOC9WUDhMIGhlYWRlci4KLSAgICBjb25zdCB1aW50MzJfdCBzaXplID0gZ2V0X2xlMzIoZGF0YSArIFRBR19TSVpFKTsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gR2V0TEUzMihkYXRhICsgVEFHX1NJWkUpOwogICAgIGlmICgocmlmZl9zaXplID49IG1pbmltYWxfc2l6ZSkgJiYgKHNpemUgPiByaWZmX3NpemUgLSBtaW5pbWFsX3NpemUpKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBJbmNvbnNpc3RlbnQgc2l6ZSBpbmZvcm1hdGlvbi4KICAgICB9CisgICAgaWYgKGhhdmVfYWxsX2RhdGEgJiYgKHNpemUgPiAqZGF0YV9zaXplIC0gQ0hVTktfSEVBREVSX1NJWkUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBUcnVuY2F0ZWQgYml0c3RyZWFtLgorICAgIH0KICAgICAvLyBTa2lwIG92ZXIgQ0hVTktfSEVBREVSX1NJWkUgYnl0ZXMgZnJvbSBWUDgvVlA4TCBIZWFkZXIuCiAgICAgKmNodW5rX3NpemUgPSBzaXplOwogICAgICpkYXRhX3B0ciArPSBDSFVOS19IRUFERVJfU0laRTsKQEAgLTI5MCwyMSArMjg2LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSGVhZGVyU3RydWN0dXJlKiBjb25zdCBoZWFkZXJzKSB7CisgIGludCBjYW52YXNfd2lkdGggPSAwOworICBpbnQgY2FudmFzX2hlaWdodCA9IDA7CisgIGludCBpbWFnZV93aWR0aCA9IDA7CisgIGludCBpbWFnZV9oZWlnaHQgPSAwOwogICBpbnQgZm91bmRfcmlmZiA9IDA7CiAgIGludCBmb3VuZF92cDh4ID0gMDsKKyAgaW50IGFuaW1hdGlvbl9wcmVzZW50ID0gMDsKKyAgY29uc3QgaW50IGhhdmVfYWxsX2RhdGEgPSAoaGVhZGVycyAhPSBOVUxMKSA/IGhlYWRlcnMtPmhhdmVfYWxsX2RhdGEgOiAwOworCiAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOwogICBXZWJQSGVhZGVyU3RydWN0dXJlIGhkcnM7CiAKICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBSSUZGX0hFQURFUl9TSVpFKSB7CiAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwogICB9Ci0gIFNiTWVtb3J5U2V0KCZoZHJzLCAwLCBzaXplb2YoaGRycykpOworICBtZW1zZXQoJmhkcnMsIDAsIHNpemVvZihoZHJzKSk7CiAgIGhkcnMuZGF0YSA9IGRhdGE7CiAgIGhkcnMuZGF0YV9zaXplID0gZGF0YV9zaXplOwogCiAgIC8vIFNraXAgb3ZlciBSSUZGIGhlYWRlci4KLSAgc3RhdHVzID0gUGFyc2VSSUZGKCZkYXRhLCAmZGF0YV9zaXplLCAmaGRycy5yaWZmX3NpemUpOworICBzdGF0dXMgPSBQYXJzZVJJRkYoJmRhdGEsICZkYXRhX3NpemUsIGhhdmVfYWxsX2RhdGEsICZoZHJzLnJpZmZfc2l6ZSk7CiAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewogICAgIHJldHVybiBzdGF0dXM7ICAgLy8gV3JvbmcgUklGRiBoZWFkZXIgLyBpbnN1ZmZpY2llbnQgZGF0YS4KICAgfQpAQCAtMzEzLDg2ICszMTcsMTE5IEBACiAgIC8vIFNraXAgb3ZlciBWUDhYLgogICB7CiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgIHN0YXR1cyA9IFBhcnNlVlA4WCgmZGF0YSwgJmRhdGFfc2l6ZSwgJmZvdW5kX3ZwOHgsIHdpZHRoLCBoZWlnaHQsICZmbGFncyk7CisgICAgc3RhdHVzID0gUGFyc2VWUDhYKCZkYXRhLCAmZGF0YV9zaXplLCAmZm91bmRfdnA4eCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNhbnZhc193aWR0aCwgJmNhbnZhc19oZWlnaHQsICZmbGFncyk7CiAgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgICByZXR1cm4gc3RhdHVzOyAgLy8gV3JvbmcgVlA4WCAvIGluc3VmZmljaWVudCBkYXRhLgogICAgIH0KKyAgICBhbmltYXRpb25fcHJlc2VudCA9ICEhKGZsYWdzICYgQU5JTUFUSU9OX0ZMQUcpOwogICAgIGlmICghZm91bmRfcmlmZiAmJiBmb3VuZF92cDh4KSB7CiAgICAgICAvLyBOb3RlOiBUaGlzIHJlc3RyaWN0aW9uIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsIGlmIGl0IGJlY29tZXMKICAgICAgIC8vIG5lY2Vzc2FyeSB0byBzZW5kIFZQOFggY2h1bmsgdG8gdGhlIGRlY29kZXIuCiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CiAgICAgfQogICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgKmhhc19hbHBoYSA9ICEhKGZsYWdzICYgQUxQSEFfRkxBRyk7Ci0gICAgaWYgKGhhc19hbmltYXRpb24gIT0gTlVMTCkgKmhhc19hbmltYXRpb24gPSAhIShmbGFncyAmIEFOSU1BVElPTl9GTEFHKTsKLSAgICBpZiAoZm91bmRfdnA4eCAmJiBoZWFkZXJzID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX09LOyAgLy8gUmV0dXJuIGZlYXR1cmVzIGZyb20gVlA4WCBoZWFkZXIuCisgICAgaWYgKGhhc19hbmltYXRpb24gIT0gTlVMTCkgKmhhc19hbmltYXRpb24gPSBhbmltYXRpb25fcHJlc2VudDsKKyAgICBpZiAoZm9ybWF0ICE9IE5VTEwpICpmb3JtYXQgPSAwOyAgIC8vIGRlZmF1bHQgPSB1bmRlZmluZWQKKworICAgIGltYWdlX3dpZHRoID0gY2FudmFzX3dpZHRoOworICAgIGltYWdlX2hlaWdodCA9IGNhbnZhc19oZWlnaHQ7CisgICAgaWYgKGZvdW5kX3ZwOHggJiYgYW5pbWF0aW9uX3ByZXNlbnQgJiYgaGVhZGVycyA9PSBOVUxMKSB7CisgICAgICBzdGF0dXMgPSBWUDhfU1RBVFVTX09LOworICAgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsgIC8vIEp1c3QgcmV0dXJuIGZlYXR1cmVzIGZyb20gVlA4WCBoZWFkZXIuCiAgICAgfQogICB9CiAKLSAgaWYgKGRhdGFfc2l6ZSA8IFRBR19TSVpFKSByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgIGlmIChkYXRhX3NpemUgPCBUQUdfU0laRSkgeworICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7CisgIH0KIAogICAvLyBTa2lwIG92ZXIgb3B0aW9uYWwgY2h1bmtzIGlmIGRhdGEgc3RhcnRlZCB3aXRoICJSSUZGICsgVlA4WCIgb3IgIkFMUEgiLgogICBpZiAoKGZvdW5kX3JpZmYgJiYgZm91bmRfdnA4eCkgfHwKLSAgICAgICghZm91bmRfcmlmZiAmJiAhZm91bmRfdnA4eCAmJiAhU2JNZW1vcnlDb21wYXJlKGRhdGEsICJBTFBIIiwgVEFHX1NJWkUpKSkgeworICAgICAgKCFmb3VuZF9yaWZmICYmICFmb3VuZF92cDh4ICYmICFtZW1jbXAoZGF0YSwgIkFMUEgiLCBUQUdfU0laRSkpKSB7CiAgICAgc3RhdHVzID0gUGFyc2VPcHRpb25hbENodW5rcygmZGF0YSwgJmRhdGFfc2l6ZSwgaGRycy5yaWZmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRycy5hbHBoYV9kYXRhLCAmaGRycy5hbHBoYV9kYXRhX3NpemUpOwogICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgICAgcmV0dXJuIHN0YXR1czsgIC8vIEZvdW5kIGFuIGludmFsaWQgY2h1bmsgc2l6ZSAvIGluc3VmZmljaWVudCBkYXRhLgorICAgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsgIC8vIEludmFsaWQgY2h1bmsgc2l6ZSAvIGluc3VmZmljaWVudCBkYXRhLgogICAgIH0KICAgfQogCiAgIC8vIFNraXAgb3ZlciBWUDgvVlA4TCBoZWFkZXIuCi0gIHN0YXR1cyA9IFBhcnNlVlA4SGVhZGVyKCZkYXRhLCAmZGF0YV9zaXplLCBoZHJzLnJpZmZfc2l6ZSwKKyAgc3RhdHVzID0gUGFyc2VWUDhIZWFkZXIoJmRhdGEsICZkYXRhX3NpemUsIGhhdmVfYWxsX2RhdGEsIGhkcnMucmlmZl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRycy5jb21wcmVzc2VkX3NpemUsICZoZHJzLmlzX2xvc3NsZXNzKTsKICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIHN0YXR1czsgIC8vIFdyb25nIFZQOC9WUDhMIGNodW5rLWhlYWRlciAvIGluc3VmZmljaWVudCBkYXRhLgorICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7ICAvLyBXcm9uZyBWUDgvVlA4TCBjaHVuay1oZWFkZXIgLyBpbnN1ZmZpY2llbnQgZGF0YS4KICAgfQogICBpZiAoaGRycy5jb21wcmVzc2VkX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgewogICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgfQogCisgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiAhYW5pbWF0aW9uX3ByZXNlbnQpIHsKKyAgICAqZm9ybWF0ID0gaGRycy5pc19sb3NzbGVzcyA/IDIgOiAxOworICB9CisKICAgaWYgKCFoZHJzLmlzX2xvc3NsZXNzKSB7CiAgICAgaWYgKGRhdGFfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgICBnb3RvIFJldHVybldpZHRoSGVpZ2h0OwogICAgIH0KICAgICAvLyBWYWxpZGF0ZXMgcmF3IFZQOCBkYXRhLgotICAgIGlmICghVlA4R2V0SW5mbyhkYXRhLCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCloZHJzLmNvbXByZXNzZWRfc2l6ZSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICBpZiAoIVZQOEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCAodWludDMyX3QpaGRycy5jb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICZpbWFnZV93aWR0aCwgJmltYWdlX2hlaWdodCkpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsKICAgICB9CiAgICAgLy8gVmFsaWRhdGVzIHJhdyBWUDhMIGRhdGEuCi0gICAgaWYgKCFWUDhMR2V0SW5mbyhkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIGhhc19hbHBoYSkpIHsKKyAgICBpZiAoIVZQOExHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0LCBoYXNfYWxwaGEpKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CiAgICAgfQogICB9Ci0KLSAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSB7Ci0gICAgLy8gSWYgdGhlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgVlA4WC9WUDhMIGNodW5rIHRoZSBvbmx5IGRlZmluaXRpdmUgd2F5Ci0gICAgLy8gdG8gc2V0IHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxwaGEgZGF0YSAoZnJvbSBhbiBBTFBIIGNodW5rKS4KLSAgICAqaGFzX2FscGhhIHw9IChoZHJzLmFscGhhX2RhdGEgIT0gTlVMTCk7CisgIC8vIFZhbGlkYXRlcyBpbWFnZSBzaXplIGNvaGVyZW5jeS4KKyAgaWYgKGZvdW5kX3ZwOHgpIHsKKyAgICBpZiAoY2FudmFzX3dpZHRoICE9IGltYWdlX3dpZHRoIHx8IGNhbnZhc19oZWlnaHQgIT0gaW1hZ2VfaGVpZ2h0KSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgfQogICB9CiAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKICAgICAqaGVhZGVycyA9IGhkcnM7CiAgICAgaGVhZGVycy0+b2Zmc2V0ID0gZGF0YSAtIGhlYWRlcnMtPmRhdGE7Ci0gICAgU0JfRENIRUNLKCh1aW50NjRfdCkoZGF0YSAtIGhlYWRlcnMtPmRhdGEpIDwgTUFYX0NIVU5LX1BBWUxPQUQpOwotICAgIFNCX0RDSEVDSyhoZWFkZXJzLT5vZmZzZXQgPT0gaGVhZGVycy0+ZGF0YV9zaXplIC0gZGF0YV9zaXplKTsKKyAgICBhc3NlcnQoKHVpbnQ2NF90KShkYXRhIC0gaGVhZGVycy0+ZGF0YSkgPCBNQVhfQ0hVTktfUEFZTE9BRCk7CisgICAgYXNzZXJ0KGhlYWRlcnMtPm9mZnNldCA9PSBoZWFkZXJzLT5kYXRhX3NpemUgLSBkYXRhX3NpemUpOwogICB9Ci0gIHJldHVybiBWUDhfU1RBVFVTX09LOyAgLy8gUmV0dXJuIGZlYXR1cmVzIGZyb20gVlA4IGhlYWRlci4KKyBSZXR1cm5XaWR0aEhlaWdodDoKKyAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8CisgICAgICAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBICYmIGZvdW5kX3ZwOHggJiYgaGVhZGVycyA9PSBOVUxMKSkgeworICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgeworICAgICAgLy8gSWYgdGhlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgVlA4WC9WUDhMIGNodW5rIHRoZSBvbmx5IGRlZmluaXRpdmUgd2F5CisgICAgICAvLyB0byBzZXQgdGhpcyBpcyBieSBsb29raW5nIGZvciBhbHBoYSBkYXRhIChmcm9tIGFuIEFMUEggY2h1bmspLgorICAgICAgKmhhc19hbHBoYSB8PSAoaGRycy5hbHBoYV9kYXRhICE9IE5VTEwpOworICAgIH0KKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gaW1hZ2Vfd2lkdGg7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0OworICAgIHJldHVybiBWUDhfU1RBVFVTX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KIH0KIAogVlA4U3RhdHVzQ29kZSBXZWJQUGFyc2VIZWFkZXJzKFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpIHsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIC8vIHN0YXR1cyBpcyBtYXJrZWQgdm9sYXRpbGUgYXMgYSB3b3JrYXJvdW5kIGZvciBhIGNsYW5nLTMuOCAoYWFyY2g2NCkgYnVnCisgIHZvbGF0aWxlIFZQOFN0YXR1c0NvZGUgc3RhdHVzOwogICBpbnQgaGFzX2FuaW1hdGlvbiA9IDA7Ci0gIFNCX0RDSEVDSyhoZWFkZXJzICE9IE5VTEwpOworICBhc3NlcnQoaGVhZGVycyAhPSBOVUxMKTsKICAgLy8gZmlsbCBvdXQgaGVhZGVycywgaWdub3JlIHdpZHRoL2hlaWdodC9oYXNfYWxwaGEuCiAgIHN0YXR1cyA9IFBhcnNlSGVhZGVyc0ludGVybmFsKGhlYWRlcnMtPmRhdGEsIGhlYWRlcnMtPmRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJmhhc19hbmltYXRpb24sIGhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmaGFzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaGVhZGVycyk7CiAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyB8fCBzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKLSAgICAvLyBUT0RPKGp6ZXJuKTogZnVsbCBzdXBwb3J0IG9mIGFuaW1hdGlvbiBmcmFtZXMgd2lsbCByZXF1aXJlIEFQSSBhZGRpdGlvbnMuCisgICAgLy8gVGhlIFdlYlBEZW11eCBBUEkgKyBsaWJ3ZWJwIGNhbiBiZSB1c2VkIHRvIGRlY29kZSBpbmRpdmlkdWFsCisgICAgLy8gdW5jb21wb3NpdGVkIGZyYW1lcyBvciB0aGUgV2ViUEFuaW1EZWNvZGVyIGNhbiBiZSB1c2VkIHRvIGZ1bGx5CisgICAgLy8gcmVjb25zdHJ1Y3QgdGhlbSAoc2VlIHdlYnAvZGVtdXguaCkuCiAgICAgaWYgKGhhc19hbmltYXRpb24pIHsKICAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRTsKICAgICB9CkBAIC00MDQsOCArNDQxLDggQEAKIC8vIFdlYlBEZWNQYXJhbXMKIAogdm9pZCBXZWJQUmVzZXREZWNQYXJhbXMoV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zKSB7Ci0gIGlmIChwYXJhbXMpIHsKLSAgICBTYk1lbW9yeVNldChwYXJhbXMsIDAsIHNpemVvZigqcGFyYW1zKSk7CisgIGlmIChwYXJhbXMgIT0gTlVMTCkgeworICAgIG1lbXNldChwYXJhbXMsIDAsIHNpemVvZigqcGFyYW1zKSk7CiAgIH0KIH0KIApAQCAtNDIxLDEyICs0NTgsMTMgQEAKIAogICBoZWFkZXJzLmRhdGEgPSBkYXRhOwogICBoZWFkZXJzLmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgaGVhZGVycy5oYXZlX2FsbF9kYXRhID0gMTsKICAgc3RhdHVzID0gV2ViUFBhcnNlSGVhZGVycygmaGVhZGVycyk7ICAgLy8gUHJvY2VzcyBQcmUtVlA4IGNodW5rcy4KICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgcmV0dXJuIHN0YXR1czsKICAgfQogCi0gIFNCX0RDSEVDSyhwYXJhbXMgIT0gTlVMTCk7CisgIGFzc2VydChwYXJhbXMgIT0gTlVMTCk7CiAgIFZQOEluaXRJbygmaW8pOwogICBpby5kYXRhID0gaGVhZGVycy5kYXRhICsgaGVhZGVycy5vZmZzZXQ7CiAgIGlvLmRhdGFfc2l6ZSA9IGhlYWRlcnMuZGF0YV9zaXplIC0gaGVhZGVycy5vZmZzZXQ7CkBAIC00MzcsMTEgKzQ3NSw2IEBACiAgICAgaWYgKGRlYyA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwogICAgIH0KLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IHBhcmFtcy0+b3B0aW9ucyAmJiAocGFyYW1zLT5vcHRpb25zLT51c2VfdGhyZWFkcyA+IDApOwotI2Vsc2UKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IDA7Ci0jZW5kaWYKICAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOwogICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOwogCkBAIC00NTMsNiArNDg2LDEwIEBACiAgICAgICBzdGF0dXMgPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8ud2lkdGgsIGlvLmhlaWdodCwgcGFyYW1zLT5vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+b3V0cHV0KTsKICAgICAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSykgeyAgLy8gRGVjb2RlCisgICAgICAgIC8vIFRoaXMgY2hhbmdlIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBWUDhEZWNvZGUoKQorICAgICAgICBkZWMtPm10X21ldGhvZF8gPSBWUDhHZXRUaHJlYWRNZXRob2QocGFyYW1zLT5vcHRpb25zLCAmaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLndpZHRoLCBpby5oZWlnaHQpOworICAgICAgICBWUDhJbml0RGl0aGVyaW5nKHBhcmFtcy0+b3B0aW9ucywgZGVjKTsKICAgICAgICAgaWYgKCFWUDhEZWNvZGUoZGVjLCAmaW8pKSB7CiAgICAgICAgICAgc3RhdHVzID0gZGVjLT5zdGF0dXNfOwogICAgICAgICB9CkBAIC00ODEsNiArNTE4LDEyIEBACiAKICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgV2ViUEZyZWVEZWNCdWZmZXIocGFyYW1zLT5vdXRwdXQpOworICB9IGVsc2UgeworICAgIGlmIChwYXJhbXMtPm9wdGlvbnMgIT0gTlVMTCAmJiBwYXJhbXMtPm9wdGlvbnMtPmZsaXApIHsKKyAgICAgIC8vIFRoaXMgcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmlkZSB2YWx1ZXMgaWYgb3B0aW9ucy0+ZmxpcCB3YXMgdXNlZAorICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsIHRvIFdlYlBBbGxvY2F0ZURlY0J1ZmZlciBhYm92ZS4KKyAgICAgIHN0YXR1cyA9IFdlYlBGbGlwQnVmZmVyKHBhcmFtcy0+b3V0cHV0KTsKKyAgICB9CiAgIH0KICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTYzMSwxNSArNjc0LDE0IEBACiAgICAgKnYgPSBidWYtPnY7CiAgICAgKnN0cmlkZSA9IGJ1Zi0+eV9zdHJpZGU7CiAgICAgKnV2X3N0cmlkZSA9IGJ1Zi0+dV9zdHJpZGU7Ci0gICAgU0JfRENIRUNLKGJ1Zi0+dV9zdHJpZGUgPT0gYnVmLT52X3N0cmlkZSk7CisgICAgYXNzZXJ0KGJ1Zi0+dV9zdHJpZGUgPT0gYnVmLT52X3N0cmlkZSk7CiAgIH0KICAgcmV0dXJuIG91dDsKIH0KIAogc3RhdGljIHZvaWQgRGVmYXVsdEZlYXR1cmVzKFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKLSAgU0JfRENIRUNLKGZlYXR1cmVzICE9IE5VTEwpOwotICBTYk1lbW9yeVNldChmZWF0dXJlcywgMCwgc2l6ZW9mKCpmZWF0dXJlcykpOwotICBmZWF0dXJlcy0+Yml0c3RyZWFtX3ZlcnNpb24gPSAwOworICBhc3NlcnQoZmVhdHVyZXMgIT0gTlVMTCk7CisgIG1lbXNldChmZWF0dXJlcywgMCwgc2l6ZW9mKCpmZWF0dXJlcykpOwogfQogCiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBHZXRGZWF0dXJlcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLApAQCAtNjUzLDcgKzY5NSw3IEBACiAgIHJldHVybiBQYXJzZUhlYWRlcnNJbnRlcm5hbChkYXRhLCBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMtPndpZHRoLCAmZmVhdHVyZXMtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcy0+aGFzX2FscGhhLCAmZmVhdHVyZXMtPmhhc19hbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcy0+Zm9ybWF0LCBOVUxMKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY4OCw3ICs3MzAsNyBAQAogICBpZiAoY29uZmlnID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKICAgfQotICBTYk1lbW9yeVNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CisgIG1lbXNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CiAgIERlZmF1bHRGZWF0dXJlcygmY29uZmlnLT5pbnB1dCk7CiAgIFdlYlBJbml0RGVjQnVmZmVyKCZjb25maWctPm91dHB1dCk7CiAgIHJldHVybiAxOwpAQCAtNzI0LDkgKzc2NiwyNCBAQAogICB9CiAKICAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOwotICBwYXJhbXMub3V0cHV0ID0gJmNvbmZpZy0+b3V0cHV0OwogICBwYXJhbXMub3B0aW9ucyA9ICZjb25maWctPm9wdGlvbnM7Ci0gIHN0YXR1cyA9IERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKTsKKyAgcGFyYW1zLm91dHB1dCA9ICZjb25maWctPm91dHB1dDsKKyAgaWYgKFdlYlBBdm9pZFNsb3dNZW1vcnkocGFyYW1zLm91dHB1dCwgJmNvbmZpZy0+aW5wdXQpKSB7CisgICAgLy8gZGVjb2RpbmcgdG8gc2xvdyBtZW1vcnk6IHVzZSBhIHRlbXBvcmFyeSBpbi1tZW0gYnVmZmVyIHRvIGRlY29kZSBpbnRvLgorICAgIFdlYlBEZWNCdWZmZXIgaW5fbWVtX2J1ZmZlcjsKKyAgICBXZWJQSW5pdERlY0J1ZmZlcigmaW5fbWVtX2J1ZmZlcik7CisgICAgaW5fbWVtX2J1ZmZlci5jb2xvcnNwYWNlID0gY29uZmlnLT5vdXRwdXQuY29sb3JzcGFjZTsKKyAgICBpbl9tZW1fYnVmZmVyLndpZHRoID0gY29uZmlnLT5pbnB1dC53aWR0aDsKKyAgICBpbl9tZW1fYnVmZmVyLmhlaWdodCA9IGNvbmZpZy0+aW5wdXQuaGVpZ2h0OworICAgIHBhcmFtcy5vdXRwdXQgPSAmaW5fbWVtX2J1ZmZlcjsKKyAgICBzdGF0dXMgPSBEZWNvZGVJbnRvKGRhdGEsIGRhdGFfc2l6ZSwgJnBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBkbyB0aGUgc2xvdy1jb3B5CisgICAgICBzdGF0dXMgPSBXZWJQQ29weURlY0J1ZmZlclBpeGVscygmaW5fbWVtX2J1ZmZlciwgJmNvbmZpZy0+b3V0cHV0KTsKKyAgICB9CisgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmluX21lbV9idWZmZXIpOworICB9IGVsc2UgeworICAgIHN0YXR1cyA9IERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKTsKKyAgfQogCiAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC03NDcsOSArODA0LDkgQEAKICAgICBoID0gb3B0aW9ucy0+Y3JvcF9oZWlnaHQ7CiAgICAgeCA9IG9wdGlvbnMtPmNyb3BfbGVmdDsKICAgICB5ID0gb3B0aW9ucy0+Y3JvcF90b3A7Ci0gICAgaWYgKCFXZWJQSXNSR0JNb2RlKHNyY19jb2xvcnNwYWNlKSkgeyAgIC8vIG9ubHkgc25hcCBmb3IgWVVWNDIwIG9yIFlVVjQyMgorICAgIGlmICghV2ViUElzUkdCTW9kZShzcmNfY29sb3JzcGFjZSkpIHsgICAvLyBvbmx5IHNuYXAgZm9yIFlVVjQyMAogICAgICAgeCAmPSB+MTsKLSAgICAgIHkgJj0gfjE7ICAgIC8vIFRPRE8obGF0ZXIpOiBvbmx5IGZvciBZVVY0MjAsIG5vdCBZVVY0MjIuCisgICAgICB5ICY9IH4xOwogICAgIH0KICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgdyA8PSAwIHx8IGggPD0gMCB8fCB4ICsgdyA+IFcgfHwgeSArIGggPiBIKSB7CiAgICAgICByZXR1cm4gMDsgIC8vIG91dCBvZiBmcmFtZSBib3VuZGFyeSBlcnJvcgpAQCAtNzY1LDE1ICs4MjIsMTcgQEAKICAgLy8gU2NhbGluZwogICBpby0+dXNlX3NjYWxpbmcgPSAob3B0aW9ucyAhPSBOVUxMKSAmJiAob3B0aW9ucy0+dXNlX3NjYWxpbmcgPiAwKTsKICAgaWYgKGlvLT51c2Vfc2NhbGluZykgewotICAgIGlmIChvcHRpb25zLT5zY2FsZWRfd2lkdGggPD0gMCB8fCBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0IDw9IDApIHsKKyAgICBpbnQgc2NhbGVkX3dpZHRoID0gb3B0aW9ucy0+c2NhbGVkX3dpZHRoOworICAgIGludCBzY2FsZWRfaGVpZ2h0ID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKKyAgICBpZiAoIVdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnModywgaCwgJnNjYWxlZF93aWR0aCwgJnNjYWxlZF9oZWlnaHQpKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaW8tPnNjYWxlZF93aWR0aCA9IG9wdGlvbnMtPnNjYWxlZF93aWR0aDsKLSAgICBpby0+c2NhbGVkX2hlaWdodCA9IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQ7CisgICAgaW8tPnNjYWxlZF93aWR0aCA9IHNjYWxlZF93aWR0aDsKKyAgICBpby0+c2NhbGVkX2hlaWdodCA9IHNjYWxlZF9oZWlnaHQ7CiAgIH0KIAogICAvLyBGaWx0ZXIKLSAgaW8tPmJ5cGFzc19maWx0ZXJpbmcgPSBvcHRpb25zICYmIG9wdGlvbnMtPmJ5cGFzc19maWx0ZXJpbmc7CisgIGlvLT5ieXBhc3NfZmlsdGVyaW5nID0gKG9wdGlvbnMgIT0gTlVMTCkgJiYgb3B0aW9ucy0+YnlwYXNzX2ZpbHRlcmluZzsKIAogICAvLyBGYW5jeSB1cHNhbXBsZXIKICNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCkBAIC03OTAsNyArODQ5LDMgQEAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicGkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicGlfZGVjLmgKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnBpLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicGlfZGVjLmgKaW5kZXggNGFlMGJmYy4uYzM3OGJhNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnBpLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwaV9kZWMuaApAQCAtMTEsMjIgKzExLDI1IEBACiAvLwogLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCiAKLSNpZm5kZWYgV0VCUF9ERUNfV0VCUElfSF8KLSNkZWZpbmUgV0VCUF9ERUNfV0VCUElfSF8KKyNpZm5kZWYgV0VCUF9ERUNfV0VCUElfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1dFQlBJX0RFQ19IXwogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jaW5jbHVkZSAiLi4vdXRpbHMvcmVzY2FsZXIuaCIKLSNpbmNsdWRlICIuL2RlY29kZV92cDguaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOF9kZWMuaCIKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFdlYlBEZWNQYXJhbXM6IERlY29kaW5nIG91dHB1dCBwYXJhbWV0ZXJzLiBUcmFuc2llbnQgaW50ZXJuYWwgb2JqZWN0LgogCiB0eXBlZGVmIHN0cnVjdCBXZWJQRGVjUGFyYW1zIFdlYlBEZWNQYXJhbXM7CiB0eXBlZGVmIGludCAoKk91dHB1dEZ1bmMpKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCk7Ci10eXBlZGVmIGludCAoKk91dHB1dFJvd0Z1bmMpKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3Bvcyk7Cit0eXBlZGVmIGludCAoKk91dHB1dEFscGhhRnVuYykoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fb3V0X2xpbmVzKTsKK3R5cGVkZWYgaW50ICgqT3V0cHV0Um93RnVuYykoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X291dF9saW5lcyk7CiAKIHN0cnVjdCBXZWJQRGVjUGFyYW1zIHsKICAgV2ViUERlY0J1ZmZlciogb3V0cHV0OyAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyLgpAQCAtMzUsMTIgKzM4LDEyIEBACiAKICAgaW50IGxhc3RfeTsgICAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGUgb2YgdGhlIGxpbmUgdGhhdCB3YXMgbGFzdCBvdXRwdXQKICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBvcHRpb25zOyAgLy8gaWYgbm90IE5VTEwsIHVzZSBhbHQgZGVjb2RpbmcgZmVhdHVyZXMKLSAgLy8gcmVzY2FsZXJzCi0gIFdlYlBSZXNjYWxlciBzY2FsZXJfeSwgc2NhbGVyX3UsIHNjYWxlcl92LCBzY2FsZXJfYTsKKworICBXZWJQUmVzY2FsZXIqIHNjYWxlcl95LCAqc2NhbGVyX3UsICpzY2FsZXJfdiwgKnNjYWxlcl9hOyAgLy8gcmVzY2FsZXJzCiAgIHZvaWQqIG1lbW9yeTsgICAgICAgICAgICAgICAgICAvLyBvdmVyYWxsIHNjcmF0Y2ggbWVtb3J5IGZvciB0aGUgb3V0cHV0IHdvcmsuCiAKICAgT3V0cHV0RnVuYyBlbWl0OyAgICAgICAgICAgICAgIC8vIG91dHB1dCBSR0Igb3IgWVVWIHNhbXBsZXMKLSAgT3V0cHV0RnVuYyBlbWl0X2FscGhhOyAgICAgICAgIC8vIG91dHB1dCBhbHBoYSBjaGFubmVsCisgIE91dHB1dEFscGhhRnVuYyBlbWl0X2FscGhhOyAgICAvLyBvdXRwdXQgYWxwaGEgY2hhbm5lbAogICBPdXRwdXRSb3dGdW5jIGVtaXRfYWxwaGFfcm93OyAgLy8gb3V0cHV0IG9uZSBsaW5lIG9mIHJlc2NhbGVkIGFscGhhIHZhbHVlcwogfTsKIApAQCAtNTQsNiArNTcsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCB1aW50OF90KiBkYXRhOyAgICAgICAgIC8vIGlucHV0IGJ1ZmZlcgogICBzaXplX3QgZGF0YV9zaXplOyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplCisgIGludCBoYXZlX2FsbF9kYXRhOyAgICAgICAgICAgLy8gdHJ1ZSBpZiBhbGwgZGF0YSBpcyBrbm93biB0byBiZSBhdmFpbGFibGUKICAgc2l6ZV90IG9mZnNldDsgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gbWFpbiBkYXRhIGNodW5rIChWUDggb3IgVlA4TCkKICAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YTsgICAvLyBwb2ludHMgdG8gYWxwaGEgY2h1bmsgKGlmIHByZXNlbnQpCiAgIHNpemVfdCBhbHBoYV9kYXRhX3NpemU7ICAgICAgLy8gYWxwaGEgY2h1bmsgc2l6ZQpAQCAtOTMsMjQgKzk3LDM3IEBACiAvLyBkaW1lbnNpb24gLyBldGMuKS4gSWYgKm9wdGlvbnMgaXMgbm90IE5VTEwsIGFsc28gdmVyaWZ5IHRoYXQgdGhlIG9wdGlvbnMnCiAvLyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBhbmQgYXBwbHkgdGhlbSB0byB0aGUgd2lkdGgvaGVpZ2h0IGRpbWVuc2lvbnMgb2YgdGhlCiAvLyBvdXRwdXQgYnVmZmVyLiBUaGlzIHRha2VzIGNyb3BwaW5nIC8gc2NhbGluZyAvIHJvdGF0aW9uIGludG8gYWNjb3VudC4KKy8vIEFsc28gaW5jb3Jwb3JhdGVzIHRoZSBvcHRpb25zLT5mbGlwIGZsYWcgdG8gZmxpcCB0aGUgYnVmZmVyIHBhcmFtZXRlcnMgaWYKKy8vIG5lZWRlZC4KIFZQOFN0YXR1c0NvZGUgV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CiAKKy8vIEZsaXAgYnVmZmVyIHZlcnRpY2FsbHkgYnkgbmVnYXRpbmcgdGhlIHZhcmlvdXMgc3RyaWRlcy4KK1ZQOFN0YXR1c0NvZGUgV2ViUEZsaXBCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKwogLy8gQ29weSAnc3JjJyBpbnRvICdkc3QnIGJ1ZmZlciwgbWFraW5nIHN1cmUgJ2RzdCcgaXMgbm90IG1hcmtlZCBhcyBvd25lciBvZiB0aGUKLS8vIG1lbW9yeSAoc3RpbGwgaGVsZCBieSAnc3JjJykuCisvLyBtZW1vcnkgKHN0aWxsIGhlbGQgYnkgJ3NyYycpLiBObyBwaXhlbHMgYXJlIGNvcGllZC4KIHZvaWQgV2ViUENvcHlEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpOwogCiAvLyBDb3B5IGFuZCB0cmFuc2ZlciBvd25lcnNoaXAgZnJvbSBzcmMgdG8gZHN0IChiZXdhcmUgb2YgcGFyYW1ldGVyIG9yZGVyISkKIHZvaWQgV2ViUEdyYWJEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLCBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpOwogCisvLyBDb3B5IHBpeGVscyBmcm9tICdzcmMnIGludG8gYSAqcHJlYWxsb2NhdGVkKiAnZHN0JyBidWZmZXIuIFJldHVybnMKKy8vIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTSBpZiB0aGUgJ2RzdCcgaXMgbm90IHNldCB1cCBjb3JyZWN0bHkgZm9yIHRoZSBjb3B5LgorVlA4U3RhdHVzQ29kZSBXZWJQQ29weURlY0J1ZmZlclBpeGVscyhjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCk7CiAKKy8vIFJldHVybnMgdHJ1ZSBpZiBkZWNvZGluZyB3aWxsIGJlIHNsb3cgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisvLyBhbmQgYml0c3RyZWFtIGZlYXR1cmVzLgoraW50IFdlYlBBdm9pZFNsb3dNZW1vcnkoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcyk7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLyogV0VCUF9ERUNfV0VCUElfSF8gKi8KKyNlbmRpZiAgLyogV0VCUF9ERUNfV0VCUElfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MGJkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK2xpYl9MVExJQlJBUklFUyA9IGxpYndlYnBkZW11eC5sYQorCitsaWJ3ZWJwZGVtdXhfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZGVtdXhfbGFfU09VUkNFUyArPSBhbmltX2RlY29kZS5jIGRlbXV4LmMKKworbGlid2VicGRlbXV4aW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBkZW11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL2RlY29kZS5oCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9kZW11eC5oCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9tdXhfdHlwZXMuaAorbGlid2VicGRlbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvdHlwZXMuaAorbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicGRlbXV4X2xhX0xJQkFERCA9IC4uL2xpYndlYnAubGEKK2xpYndlYnBkZW11eF9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDI6NDowCitsaWJ3ZWJwZGVtdXhpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCitwa2djb25maWdfREFUQSA9IGxpYndlYnBkZW11eC5wYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvYW5pbV9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUzMTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQW5pbURlY29kZXIgaW1wbGVtZW50YXRpb24uCisvLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZW11eC5oIgorCisjZGVmaW5lIE5VTV9DSEFOTkVMUyA0CisKK3R5cGVkZWYgdm9pZCAoKkJsZW5kUm93RnVuYykodWludDMyX3QqIGNvbnN0LCBjb25zdCB1aW50MzJfdCogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93Tm9uUHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdCwgaW50IG51bV9waXhlbHMpOworc3RhdGljIHZvaWQgQmxlbmRQaXhlbFJvd1ByZW11bHQodWludDMyX3QqIGNvbnN0IHNyYywgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKTsKKworc3RydWN0IFdlYlBBbmltRGVjb2RlciB7CisgIFdlYlBEZW11eGVyKiBkZW11eF87ICAgICAgICAgICAgIC8vIERlbXV4ZXIgY3JlYXRlZCBmcm9tIGdpdmVuIFdlYlAgYml0c3RyZWFtLgorICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWdfOyAgICAgICAvLyBEZWNvZGVyIGNvbmZpZy4KKyAgLy8gTm90ZTogd2UgdXNlIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIGJsZW5kaW5nIG11bHRpcGxlIHBpeGVscyBhdCBhIHRpbWUgdG8KKyAgLy8gYWxsb3cgcG9zc2libGUgaW5saW5pbmcgb2YgcGVyLXBpeGVsIGJsZW5kaW5nIGZ1bmN0aW9uLgorICBCbGVuZFJvd0Z1bmMgYmxlbmRfZnVuY187ICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBjaG9zZSBibGVuZCByb3cgZnVuY3Rpb24uCisgIFdlYlBBbmltSW5mbyBpbmZvXzsgICAgICAgICAgICAgIC8vIEdsb2JhbCBpbmZvIGFib3V0IHRoZSBhbmltYXRpb24uCisgIHVpbnQ4X3QqIGN1cnJfZnJhbWVfOyAgICAgICAgICAgIC8vIEN1cnJlbnQgY2FudmFzIChub3QgZGlzcG9zZWQpLgorICB1aW50OF90KiBwcmV2X2ZyYW1lX2Rpc3Bvc2VkXzsgICAvLyBQcmV2aW91cyBjYW52YXMgKHByb3Blcmx5IGRpc3Bvc2VkKS4KKyAgaW50IHByZXZfZnJhbWVfdGltZXN0YW1wXzsgICAgICAgLy8gUHJldmlvdXMgZnJhbWUgdGltZXN0YW1wIChtaWxsaXNlY29uZHMpLgorICBXZWJQSXRlcmF0b3IgcHJldl9pdGVyXzsgICAgICAgICAvLyBJdGVyYXRvciBvYmplY3QgZm9yIHByZXZpb3VzIGZyYW1lLgorICBpbnQgcHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfOyAgICAvLyBUcnVlIGlmIHByZXZpb3VzIGZyYW1lIHdhcyBhIGtleWZyYW1lLgorICBpbnQgbmV4dF9mcmFtZV87ICAgICAgICAgICAgICAgICAvLyBJbmRleCBvZiB0aGUgbmV4dCBmcmFtZSB0byBiZSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzdGFydGluZyBmcm9tIDEpLgorfTsKKworc3RhdGljIHZvaWQgRGVmYXVsdERlY29kZXJPcHRpb25zKFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGNvbnN0IGRlY19vcHRpb25zKSB7CisgIGRlY19vcHRpb25zLT5jb2xvcl9tb2RlID0gTU9ERV9SR0JBOworICBkZWNfb3B0aW9ucy0+dXNlX3RocmVhZHMgPSAwOworfQorCitpbnQgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbChXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYmlfdmVyc2lvbikgeworICBpZiAoZGVjX29wdGlvbnMgPT0gTlVMTCB8fAorICAgICAgV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGFiaV92ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOworICB9CisgIERlZmF1bHREZWNvZGVyT3B0aW9ucyhkZWNfb3B0aW9ucyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEFwcGx5RGVjb2Rlck9wdGlvbnMoY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogY29uc3QgZGVjX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEFuaW1EZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgV0VCUF9DU1BfTU9ERSBtb2RlOworICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnID0gJmRlYy0+Y29uZmlnXzsKKyAgYXNzZXJ0KGRlY19vcHRpb25zICE9IE5VTEwpOworCisgIG1vZGUgPSBkZWNfb3B0aW9ucy0+Y29sb3JfbW9kZTsKKyAgaWYgKG1vZGUgIT0gTU9ERV9SR0JBICYmIG1vZGUgIT0gTU9ERV9CR1JBICYmCisgICAgICBtb2RlICE9IE1PREVfcmdiQSAmJiBtb2RlICE9IE1PREVfYmdyQSkgeworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YmxlbmRfZnVuY18gPSAobW9kZSA9PSBNT0RFX1JHQkEgfHwgbW9kZSA9PSBNT0RFX0JHUkEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQmxlbmRQaXhlbFJvd05vblByZW11bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICZCbGVuZFBpeGVsUm93UHJlbXVsdDsKKyAgV2ViUEluaXREZWNvZGVyQ29uZmlnKGNvbmZpZyk7CisgIGNvbmZpZy0+b3V0cHV0LmNvbG9yc3BhY2UgPSBtb2RlOworICBjb25maWctPm91dHB1dC5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICBjb25maWctPm9wdGlvbnMudXNlX3RocmVhZHMgPSBkZWNfb3B0aW9ucy0+dXNlX3RocmVhZHM7CisgIC8vIE5vdGU6IGNvbmZpZy0+b3V0cHV0LnUuUkdCQSBpcyBzZXQgYXQgdGhlIHRpbWUgb2YgZGVjb2RpbmcgZWFjaCBmcmFtZS4KKyAgcmV0dXJuIDE7Cit9CisKK1dlYlBBbmltRGVjb2RlciogV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqIHdlYnBfZGF0YSwgY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogZGVjX29wdGlvbnMsCisgICAgaW50IGFiaV92ZXJzaW9uKSB7CisgIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMgb3B0aW9uczsKKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWMgPSBOVUxMOworICBpZiAod2VicF9kYXRhID09IE5VTEwgfHwKKyAgICAgIFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRShhYmlfdmVyc2lvbiwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIE5vdGU6IGNhbGxvYygpIHNvIHRoYXQgdGhlIHBvaW50ZXIgbWVtYmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KKyAgZGVjID0gKFdlYlBBbmltRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGlmIChkZWNfb3B0aW9ucyAhPSBOVUxMKSB7CisgICAgb3B0aW9ucyA9ICpkZWNfb3B0aW9uczsKKyAgfSBlbHNlIHsKKyAgICBEZWZhdWx0RGVjb2Rlck9wdGlvbnMoJm9wdGlvbnMpOworICB9CisgIGlmICghQXBwbHlEZWNvZGVyT3B0aW9ucygmb3B0aW9ucywgZGVjKSkgZ290byBFcnJvcjsKKworICBkZWMtPmRlbXV4XyA9IFdlYlBEZW11eCh3ZWJwX2RhdGEpOworICBpZiAoZGVjLT5kZW11eF8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBkZWMtPmluZm9fLmNhbnZhc193aWR0aCA9IFdlYlBEZW11eEdldEkoZGVjLT5kZW11eF8sIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKKyAgZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKKyAgZGVjLT5pbmZvXy5sb29wX2NvdW50ID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9MT09QX0NPVU5UKTsKKyAgZGVjLT5pbmZvXy5iZ2NvbG9yID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SKTsKKyAgZGVjLT5pbmZvXy5mcmFtZV9jb3VudCA9IFdlYlBEZW11eEdldEkoZGVjLT5kZW11eF8sIFdFQlBfRkZfRlJBTUVfQ09VTlQpOworCisgIC8vIE5vdGU6IGNhbGxvYygpIGJlY2F1c2Ugd2UgZmlsbCBmcmFtZSB3aXRoIHplcm9lcyBhcyB3ZWxsLgorICBkZWMtPmN1cnJfZnJhbWVfID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKAorICAgICAgZGVjLT5pbmZvXy5jYW52YXNfd2lkdGggKiBOVU1fQ0hBTk5FTFMsIGRlYy0+aW5mb18uY2FudmFzX2hlaWdodCk7CisgIGlmIChkZWMtPmN1cnJfZnJhbWVfID09IE5VTEwpIGdvdG8gRXJyb3I7CisgIGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2MoCisgICAgICBkZWMtPmluZm9fLmNhbnZhc193aWR0aCAqIE5VTV9DSEFOTkVMUywgZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0KTsKKyAgaWYgKGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBXZWJQQW5pbURlY29kZXJSZXNldChkZWMpOworICByZXR1cm4gZGVjOworCisgRXJyb3I6CisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworICByZXR1cm4gTlVMTDsKK30KKworaW50IFdlYlBBbmltRGVjb2RlckdldEluZm8oY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMsIFdlYlBBbmltSW5mbyogaW5mbykgeworICBpZiAoZGVjID09IE5VTEwgfHwgaW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgKmluZm8gPSBkZWMtPmluZm9fOworICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmcmFtZSBjb3ZlcnMgdGhlIGZ1bGwgY2FudmFzLgorc3RhdGljIGludCBJc0Z1bGxGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIHJldHVybiAod2lkdGggPT0gY2FudmFzX3dpZHRoICYmIGhlaWdodCA9PSBjYW52YXNfaGVpZ2h0KTsKK30KKworLy8gQ2xlYXIgdGhlIGNhbnZhcyB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyBpbnQgWmVyb0ZpbGxDYW52YXModWludDhfdCogYnVmLCB1aW50MzJfdCBjYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbnZhc19oZWlnaHQpIHsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9CisgICAgICAodWludDY0X3QpY2FudmFzX3dpZHRoICogY2FudmFzX2hlaWdodCAqIE5VTV9DSEFOTkVMUyAqIHNpemVvZigqYnVmKTsKKyAgaWYgKHNpemUgIT0gKHNpemVfdClzaXplKSByZXR1cm4gMDsKKyAgbWVtc2V0KGJ1ZiwgMCwgKHNpemVfdClzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIENsZWFyIGdpdmVuIGZyYW1lIHJlY3RhbmdsZSB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyB2b2lkIFplcm9GaWxsRnJhbWVSZWN0KHVpbnQ4X3QqIGJ1ZiwgaW50IGJ1Zl9zdHJpZGUsIGludCB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X29mZnNldCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBqOworICBhc3NlcnQod2lkdGggKiBOVU1fQ0hBTk5FTFMgPD0gYnVmX3N0cmlkZSk7CisgIGJ1ZiArPSB5X29mZnNldCAqIGJ1Zl9zdHJpZGUgKyB4X29mZnNldCAqIE5VTV9DSEFOTkVMUzsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgbWVtc2V0KGJ1ZiwgMCwgd2lkdGggKiBOVU1fQ0hBTk5FTFMpOworICAgIGJ1ZiArPSBidWZfc3RyaWRlOworICB9Cit9CisKKy8vIENvcHkgd2lkdGggKiBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcuCitzdGF0aWMgaW50IENvcHlDYW52YXMoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0ICogTlVNX0NIQU5ORUxTOworICBpZiAoc2l6ZSAhPSAoc2l6ZV90KXNpemUpIHJldHVybiAwOworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBtZW1jcHkoZHN0LCBzcmMsIChzaXplX3Qpc2l6ZSk7CisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgYSBrZXktZnJhbWUuCitzdGF0aWMgaW50IElzS2V5RnJhbWUoY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl9mcmFtZV93YXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGlmIChjdXJyLT5mcmFtZV9udW0gPT0gMSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKCghY3Vyci0+aGFzX2FscGhhIHx8IGN1cnItPmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9OT19CTEVORCkgJiYKKyAgICAgICAgICAgICBJc0Z1bGxGcmFtZShjdXJyLT53aWR0aCwgY3Vyci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCkpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKHByZXYtPmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgJiYKKyAgICAgICAgICAgKElzRnVsbEZyYW1lKHByZXYtPndpZHRoLCBwcmV2LT5oZWlnaHQsIGNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc19oZWlnaHQpIHx8CisgICAgICAgICAgICBwcmV2X2ZyYW1lX3dhc19rZXlfZnJhbWUpOworICB9Cit9CisKKworLy8gQmxlbmQgYSBzaW5nbGUgY2hhbm5lbCBvZiAnc3JjJyBvdmVyICdkc3QnLCBnaXZlbiB0aGVpciBhbHBoYSBjaGFubmVsIHZhbHVlcy4KKy8vICdzcmMnIGFuZCAnZHN0JyBhcmUgYXNzdW1lZCB0byBiZSBOT1QgcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCitzdGF0aWMgdWludDhfdCBCbGVuZENoYW5uZWxOb25QcmVtdWx0KHVpbnQzMl90IHNyYywgdWludDhfdCBzcmNfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0LCB1aW50OF90IGRzdF9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZSwgaW50IHNoaWZ0KSB7CisgIGNvbnN0IHVpbnQ4X3Qgc3JjX2NoYW5uZWwgPSAoc3JjID4+IHNoaWZ0KSAmIDB4ZmY7CisgIGNvbnN0IHVpbnQ4X3QgZHN0X2NoYW5uZWwgPSAoZHN0ID4+IHNoaWZ0KSAmIDB4ZmY7CisgIGNvbnN0IHVpbnQzMl90IGJsZW5kX3Vuc2NhbGVkID0gc3JjX2NoYW5uZWwgKiBzcmNfYSArIGRzdF9jaGFubmVsICogZHN0X2E7CisgIGFzc2VydChibGVuZF91bnNjYWxlZCA8ICgxVUxMIDw8IDMyKSAvIHNjYWxlKTsKKyAgcmV0dXJuIChibGVuZF91bnNjYWxlZCAqIHNjYWxlKSA+PiAyNDsKK30KKworLy8gQmxlbmQgJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBOT1QgcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCitzdGF0aWMgdWludDMyX3QgQmxlbmRQaXhlbE5vblByZW11bHQodWludDMyX3Qgc3JjLCB1aW50MzJfdCBkc3QpIHsKKyAgY29uc3QgdWludDhfdCBzcmNfYSA9IChzcmMgPj4gMjQpICYgMHhmZjsKKworICBpZiAoc3JjX2EgPT0gMCkgeworICAgIHJldHVybiBkc3Q7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCBkc3RfYSA9IChkc3QgPj4gMjQpICYgMHhmZjsKKyAgICAvLyBUaGlzIGlzIHRoZSBhcHByb3hpbWF0ZSBpbnRlZ2VyIGFyaXRobWV0aWMgZm9yIHRoZSBhY3R1YWwgZm9ybXVsYToKKyAgICAvLyBkc3RfZmFjdG9yX2EgPSAoZHN0X2EgKiAoMjU1IC0gc3JjX2EpKSAvIDI1NS4KKyAgICBjb25zdCB1aW50OF90IGRzdF9mYWN0b3JfYSA9IChkc3RfYSAqICgyNTYgLSBzcmNfYSkpID4+IDg7CisgICAgY29uc3QgdWludDhfdCBibGVuZF9hID0gc3JjX2EgKyBkc3RfZmFjdG9yX2E7CisgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSAoMVVMIDw8IDI0KSAvIGJsZW5kX2E7CisKKyAgICBjb25zdCB1aW50OF90IGJsZW5kX3IgPQorICAgICAgICBCbGVuZENoYW5uZWxOb25QcmVtdWx0KHNyYywgc3JjX2EsIGRzdCwgZHN0X2ZhY3Rvcl9hLCBzY2FsZSwgMCk7CisgICAgY29uc3QgdWludDhfdCBibGVuZF9nID0KKyAgICAgICAgQmxlbmRDaGFubmVsTm9uUHJlbXVsdChzcmMsIHNyY19hLCBkc3QsIGRzdF9mYWN0b3JfYSwgc2NhbGUsIDgpOworICAgIGNvbnN0IHVpbnQ4X3QgYmxlbmRfYiA9CisgICAgICAgIEJsZW5kQ2hhbm5lbE5vblByZW11bHQoc3JjLCBzcmNfYSwgZHN0LCBkc3RfZmFjdG9yX2EsIHNjYWxlLCAxNik7CisgICAgYXNzZXJ0KHNyY19hICsgZHN0X2ZhY3Rvcl9hIDwgMjU2KTsKKworICAgIHJldHVybiAoYmxlbmRfciA8PCAwKSB8CisgICAgICAgICAgIChibGVuZF9nIDw8IDgpIHwKKyAgICAgICAgICAgKGJsZW5kX2IgPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdClibGVuZF9hIDw8IDI0KTsKKyAgfQorfQorCisvLyBCbGVuZCAnbnVtX3BpeGVscycgaW4gJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBOT1QgcHJlLW11bHRpcGxpZWQKKy8vIGJ5IGFscGhhLgorc3RhdGljIHZvaWQgQmxlbmRQaXhlbFJvd05vblByZW11bHQodWludDMyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3QsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDhfdCBzcmNfYWxwaGEgPSAoc3JjW2ldID4+IDI0KSAmIDB4ZmY7CisgICAgaWYgKHNyY19hbHBoYSAhPSAweGZmKSB7CisgICAgICBzcmNbaV0gPSBCbGVuZFBpeGVsTm9uUHJlbXVsdChzcmNbaV0sIGRzdFtpXSk7CisgICAgfQorICB9Cit9CisKKy8vIEluZGl2aWR1YWxseSBtdWx0aXBseSBlYWNoIGNoYW5uZWwgaW4gJ3BpeCcgYnkgJ3NjYWxlJy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDaGFubmVsd2lzZU11bHRpcGx5KHVpbnQzMl90IHBpeCwgdWludDMyX3Qgc2NhbGUpIHsKKyAgdWludDMyX3QgbWFzayA9IDB4MDBGRjAwRkY7CisgIHVpbnQzMl90IHJiID0gKChwaXggJiBtYXNrKSAqIHNjYWxlKSA+PiA4OworICB1aW50MzJfdCBhZyA9ICgocGl4ID4+IDgpICYgbWFzaykgKiBzY2FsZTsKKyAgcmV0dXJuIChyYiAmIG1hc2spIHwgKGFnICYgfm1hc2spOworfQorCisvLyBCbGVuZCAnc3JjJyBvdmVyICdkc3QnIGFzc3VtaW5nIHRoZXkgYXJlIHByZS1tdWx0aXBsaWVkIGJ5IGFscGhhLgorc3RhdGljIHVpbnQzMl90IEJsZW5kUGl4ZWxQcmVtdWx0KHVpbnQzMl90IHNyYywgdWludDMyX3QgZHN0KSB7CisgIGNvbnN0IHVpbnQ4X3Qgc3JjX2EgPSAoc3JjID4+IDI0KSAmIDB4ZmY7CisgIHJldHVybiBzcmMgKyBDaGFubmVsd2lzZU11bHRpcGx5KGRzdCwgMjU2IC0gc3JjX2EpOworfQorCisvLyBCbGVuZCAnbnVtX3BpeGVscycgaW4gJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBwcmUtbXVsdGlwbGllZCBieQorLy8gYWxwaGEuCitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93UHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLCBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50OF90IHNyY19hbHBoYSA9IChzcmNbaV0gPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoc3JjX2FscGhhICE9IDB4ZmYpIHsKKyAgICAgIHNyY1tpXSA9IEJsZW5kUGl4ZWxQcmVtdWx0KHNyY1tpXSwgZHN0W2ldKTsKKyAgICB9CisgIH0KK30KKworLy8gUmV0dXJucyB0d28gcmFuZ2VzICg8bGVmdCwgd2lkdGg+IHBhaXJzKSBhdCByb3cgJ2NhbnZhc195JywgdGhhdCBiZWxvbmcgdG8KKy8vICdzcmMnIGJ1dCBub3QgJ2RzdCcuIEEgcG9pbnQgcmFuZ2UgaXMgZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgd2lkdGggaXMgMC4KK3N0YXRpYyB2b2lkIEZpbmRCbGVuZFJhbmdlQXRSb3coY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgZHN0LCBpbnQgY2FudmFzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdDEsIGludCogY29uc3Qgd2lkdGgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQyLCBpbnQqIGNvbnN0IHdpZHRoMikgeworICBjb25zdCBpbnQgc3JjX21heF94ID0gc3JjLT54X29mZnNldCArIHNyYy0+d2lkdGg7CisgIGNvbnN0IGludCBkc3RfbWF4X3ggPSBkc3QtPnhfb2Zmc2V0ICsgZHN0LT53aWR0aDsKKyAgY29uc3QgaW50IGRzdF9tYXhfeSA9IGRzdC0+eV9vZmZzZXQgKyBkc3QtPmhlaWdodDsKKyAgYXNzZXJ0KGNhbnZhc195ID49IHNyYy0+eV9vZmZzZXQgJiYgY2FudmFzX3kgPCAoc3JjLT55X29mZnNldCArIHNyYy0+aGVpZ2h0KSk7CisgICpsZWZ0MSA9IC0xOworICAqd2lkdGgxID0gMDsKKyAgKmxlZnQyID0gLTE7CisgICp3aWR0aDIgPSAwOworCisgIGlmIChjYW52YXNfeSA8IGRzdC0+eV9vZmZzZXQgfHwgY2FudmFzX3kgPj0gZHN0X21heF95IHx8CisgICAgICBzcmMtPnhfb2Zmc2V0ID49IGRzdF9tYXhfeCB8fCBzcmNfbWF4X3ggPD0gZHN0LT54X29mZnNldCkgeworICAgICpsZWZ0MSA9IHNyYy0+eF9vZmZzZXQ7CisgICAgKndpZHRoMSA9IHNyYy0+d2lkdGg7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNyYy0+eF9vZmZzZXQgPCBkc3QtPnhfb2Zmc2V0KSB7CisgICAgKmxlZnQxID0gc3JjLT54X29mZnNldDsKKyAgICAqd2lkdGgxID0gZHN0LT54X29mZnNldCAtIHNyYy0+eF9vZmZzZXQ7CisgIH0KKworICBpZiAoc3JjX21heF94ID4gZHN0X21heF94KSB7CisgICAgKmxlZnQyID0gZHN0X21heF94OworICAgICp3aWR0aDIgPSBzcmNfbWF4X3ggLSBkc3RfbWF4X3g7CisgIH0KK30KKworaW50IFdlYlBBbmltRGVjb2RlckdldE5leHQoV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYnVmX3B0ciwgaW50KiB0aW1lc3RhbXBfcHRyKSB7CisgIFdlYlBJdGVyYXRvciBpdGVyOworICB1aW50MzJfdCB3aWR0aDsKKyAgdWludDMyX3QgaGVpZ2h0OworICBpbnQgaXNfa2V5X2ZyYW1lOworICBpbnQgdGltZXN0YW1wOworICBCbGVuZFJvd0Z1bmMgYmxlbmRfcm93OworCisgIGlmIChkZWMgPT0gTlVMTCB8fCBidWZfcHRyID09IE5VTEwgfHwgdGltZXN0YW1wX3B0ciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFXZWJQQW5pbURlY29kZXJIYXNNb3JlRnJhbWVzKGRlYykpIHJldHVybiAwOworCisgIHdpZHRoID0gZGVjLT5pbmZvXy5jYW52YXNfd2lkdGg7CisgIGhlaWdodCA9IGRlYy0+aW5mb18uY2FudmFzX2hlaWdodDsKKyAgYmxlbmRfcm93ID0gZGVjLT5ibGVuZF9mdW5jXzsKKworICAvLyBHZXQgY29tcHJlc3NlZCBmcmFtZS4KKyAgaWYgKCFXZWJQRGVtdXhHZXRGcmFtZShkZWMtPmRlbXV4XywgZGVjLT5uZXh0X2ZyYW1lXywgJml0ZXIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdGltZXN0YW1wID0gZGVjLT5wcmV2X2ZyYW1lX3RpbWVzdGFtcF8gKyBpdGVyLmR1cmF0aW9uOworCisgIC8vIEluaXRpYWxpemUuCisgIGlzX2tleV9mcmFtZSA9IElzS2V5RnJhbWUoJml0ZXIsICZkZWMtPnByZXZfaXRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5wcmV2X2ZyYW1lX3dhc19rZXlmcmFtZV8sIHdpZHRoLCBoZWlnaHQpOworICBpZiAoaXNfa2V5X2ZyYW1lKSB7CisgICAgaWYgKCFaZXJvRmlsbENhbnZhcyhkZWMtPmN1cnJfZnJhbWVfLCB3aWR0aCwgaGVpZ2h0KSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFDb3B5Q2FudmFzKGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIGRlYy0+Y3Vycl9mcmFtZV8sCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIERlY29kZS4KKyAgeworICAgIGNvbnN0IHVpbnQ4X3QqIGluID0gaXRlci5mcmFnbWVudC5ieXRlczsKKyAgICBjb25zdCBzaXplX3QgaW5fc2l6ZSA9IGl0ZXIuZnJhZ21lbnQuc2l6ZTsKKyAgICBjb25zdCBzaXplX3Qgb3V0X29mZnNldCA9CisgICAgICAgIChpdGVyLnlfb2Zmc2V0ICogd2lkdGggKyBpdGVyLnhfb2Zmc2V0KSAqIE5VTV9DSEFOTkVMUzsKKyAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnID0gJmRlYy0+Y29uZmlnXzsKKyAgICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmNvbmZpZy0+b3V0cHV0LnUuUkdCQTsKKyAgICBidWYtPnN0cmlkZSA9IE5VTV9DSEFOTkVMUyAqIHdpZHRoOworICAgIGJ1Zi0+c2l6ZSA9IGJ1Zi0+c3RyaWRlICogaXRlci5oZWlnaHQ7CisgICAgYnVmLT5yZ2JhID0gZGVjLT5jdXJyX2ZyYW1lXyArIG91dF9vZmZzZXQ7CisKKyAgICBpZiAoV2ViUERlY29kZShpbiwgaW5fc2l6ZSwgY29uZmlnKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIER1cmluZyB0aGUgZGVjb2Rpbmcgb2YgY3VycmVudCBmcmFtZSwgd2UgbWF5IGhhdmUgc2V0IHNvbWUgcGl4ZWxzIHRvIGJlCisgIC8vIHRyYW5zcGFyZW50IChpLmUuIGFscGhhIDwgMjU1KS4gSG93ZXZlciwgdGhlIHZhbHVlIG9mIGVhY2ggb2YgdGhlc2UKKyAgLy8gcGl4ZWxzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBieSBibGVuZGluZyBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZgorICAvLyB0aGF0IHBpeGVsIGluIHRoZSBwcmV2aW91cyBmcmFtZSBpZiBibGVuZGluZyBtZXRob2Qgb2YgaXMgV0VCUF9NVVhfQkxFTkQuCisgIGlmIChpdGVyLmZyYW1lX251bSA+IDEgJiYgaXRlci5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfQkxFTkQgJiYKKyAgICAgICFpc19rZXlfZnJhbWUpIHsKKyAgICBpZiAoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfTk9ORSkgeworICAgICAgaW50IHk7CisgICAgICAvLyBCbGVuZCB0cmFuc3BhcmVudCBwaXhlbHMgd2l0aCBwaXhlbHMgaW4gcHJldmlvdXMgY2FudmFzLgorICAgICAgZm9yICh5ID0gMDsgeSA8IGl0ZXIuaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9CisgICAgICAgICAgICAoaXRlci55X29mZnNldCArIHkpICogd2lkdGggKyBpdGVyLnhfb2Zmc2V0OworICAgICAgICBibGVuZF9yb3coKHVpbnQzMl90KilkZWMtPmN1cnJfZnJhbWVfICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KilkZWMtPnByZXZfZnJhbWVfZGlzcG9zZWRfICsgb2Zmc2V0LCBpdGVyLndpZHRoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IHk7CisgICAgICBhc3NlcnQoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCk7CisgICAgICAvLyBXZSBuZWVkIHRvIGJsZW5kIGEgdHJhbnNwYXJlbnQgcGl4ZWwgd2l0aCBpdHMgdmFsdWUganVzdCBhZnRlcgorICAgICAgLy8gaW5pdGlhbGl6YXRpb24uIFRoYXQgaXMsIGJsZW5kIGl0IHdpdGg6CisgICAgICAvLyAqIEZ1bGx5IHRyYW5zcGFyZW50IHBpeGVsIGlmIGl0IGJlbG9uZ3MgdG8gcHJldlJlY3QgPC0tIE5vLW9wLgorICAgICAgLy8gKiBUaGUgcGl4ZWwgaW4gdGhlIHByZXZpb3VzIGNhbnZhcyBvdGhlcndpc2UgPC0tIE5lZWQgYWxwaGEtYmxlbmRpbmcuCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaXRlci5oZWlnaHQ7ICsreSkgeworICAgICAgICBjb25zdCBpbnQgY2FudmFzX3kgPSBpdGVyLnlfb2Zmc2V0ICsgeTsKKyAgICAgICAgaW50IGxlZnQxLCB3aWR0aDEsIGxlZnQyLCB3aWR0aDI7CisgICAgICAgIEZpbmRCbGVuZFJhbmdlQXRSb3coJml0ZXIsICZkZWMtPnByZXZfaXRlcl8sIGNhbnZhc195LCAmbGVmdDEsICZ3aWR0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQyLCAmd2lkdGgyKTsKKyAgICAgICAgaWYgKHdpZHRoMSA+IDApIHsKKyAgICAgICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0MSA9IGNhbnZhc195ICogd2lkdGggKyBsZWZ0MTsKKyAgICAgICAgICBibGVuZF9yb3coKHVpbnQzMl90KilkZWMtPmN1cnJfZnJhbWVfICsgb2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KilkZWMtPnByZXZfZnJhbWVfZGlzcG9zZWRfICsgb2Zmc2V0MSwgd2lkdGgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2lkdGgyID4gMCkgeworICAgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQyID0gY2FudmFzX3kgKiB3aWR0aCArIGxlZnQyOworICAgICAgICAgIGJsZW5kX3JvdygodWludDMyX3QqKWRlYy0+Y3Vycl9mcmFtZV8gKyBvZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QqKWRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gKyBvZmZzZXQyLCB3aWR0aDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlIGluZm8gb2YgdGhlIHByZXZpb3VzIGZyYW1lIGFuZCBkaXNwb3NlIGl0IGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgIGRlYy0+cHJldl9mcmFtZV90aW1lc3RhbXBfID0gdGltZXN0YW1wOworICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJmRlYy0+cHJldl9pdGVyXyk7CisgIGRlYy0+cHJldl9pdGVyXyA9IGl0ZXI7CisgIGRlYy0+cHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfID0gaXNfa2V5X2ZyYW1lOworICBDb3B5Q2FudmFzKGRlYy0+Y3Vycl9mcmFtZV8sIGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIHdpZHRoLCBoZWlnaHQpOworICBpZiAoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgeworICAgIFplcm9GaWxsRnJhbWVSZWN0KGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIHdpZHRoICogTlVNX0NIQU5ORUxTLAorICAgICAgICAgICAgICAgICAgICAgIGRlYy0+cHJldl9pdGVyXy54X29mZnNldCwgZGVjLT5wcmV2X2l0ZXJfLnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGRlYy0+cHJldl9pdGVyXy53aWR0aCwgZGVjLT5wcmV2X2l0ZXJfLmhlaWdodCk7CisgIH0KKyAgKytkZWMtPm5leHRfZnJhbWVfOworCisgIC8vIEFsbCBPSywgZmlsbCBpbiB0aGUgdmFsdWVzLgorICAqYnVmX3B0ciA9IGRlYy0+Y3Vycl9mcmFtZV87CisgICp0aW1lc3RhbXBfcHRyID0gdGltZXN0YW1wOworICByZXR1cm4gMTsKKworIEVycm9yOgorICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJml0ZXIpOworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcmV0dXJuIChkZWMtPm5leHRfZnJhbWVfIDw9IChpbnQpZGVjLT5pbmZvXy5mcmFtZV9jb3VudCk7Cit9CisKK3ZvaWQgV2ViUEFuaW1EZWNvZGVyUmVzZXQoV2ViUEFuaW1EZWNvZGVyKiBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgZGVjLT5wcmV2X2ZyYW1lX3RpbWVzdGFtcF8gPSAwOworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmZGVjLT5wcmV2X2l0ZXJfKTsKKyAgICBtZW1zZXQoJmRlYy0+cHJldl9pdGVyXywgMCwgc2l6ZW9mKGRlYy0+cHJldl9pdGVyXykpOworICAgIGRlYy0+cHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfID0gMDsKKyAgICBkZWMtPm5leHRfZnJhbWVfID0gMTsKKyAgfQorfQorCitjb25zdCBXZWJQRGVtdXhlciogV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcihjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYykgeworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZGVjLT5kZW11eF87Cit9CisKK3ZvaWQgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKFdlYlBBbmltRGVjb2RlciogZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmZGVjLT5wcmV2X2l0ZXJfKTsKKyAgICBXZWJQRGVtdXhEZWxldGUoZGVjLT5kZW11eF8pOworICAgIFdlYlBTYWZlRnJlZShkZWMtPmN1cnJfZnJhbWVfKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvZGVtdXguYwpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZW11eC9kZW11eC5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvZGVtdXguYwppbmRleCA4YmNhNmM2Li42ODQyMTVlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZW11eC9kZW11eC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9kZW11eC5jCkBAIC0xMSwzMCArMTEsMjEgQEAKIC8vCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCiAKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZGVjb2RlLmgiICAgICAvLyBXZWJQR2V0RmVhdHVyZXMKLSNpbmNsdWRlICIuLi93ZWJwL2RlbXV4LmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiICAgICAvLyBXZWJQR2V0RmVhdHVyZXMKKyNpbmNsdWRlICJzcmMvd2VicC9kZW11eC5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgRE1VWF9NQUpfVkVSU0lPTiAwCi0jZGVmaW5lIERNVVhfTUlOX1ZFUlNJT04gMQotI2RlZmluZSBETVVYX1JFVl9WRVJTSU9OIDEKKyNkZWZpbmUgRE1VWF9NQUpfVkVSU0lPTiAxCisjZGVmaW5lIERNVVhfTUlOX1ZFUlNJT04gMAorI2RlZmluZSBETVVYX1JFVl9WRVJTSU9OIDAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBzaXplX3Qgc3RhcnRfOyAgICAgICAgLy8gc3RhcnQgbG9jYXRpb24gb2YgdGhlIGRhdGEKQEAgLTUyLDEwICs0MywxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgRnJhbWUgewogICBpbnQgeF9vZmZzZXRfLCB5X29mZnNldF87CiAgIGludCB3aWR0aF8sIGhlaWdodF87CisgIGludCBoYXNfYWxwaGFfOwogICBpbnQgZHVyYXRpb25fOwogICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2RfOwotICBpbnQgaXNfZnJhZ21lbnRfOyAgLy8gdGhpcyBpcyBhIGZyYW1lIGZyYWdtZW50IChhbmQgbm90IGEgZnVsbCBmcmFtZSkuCi0gIGludCBmcmFtZV9udW1fOyAgLy8gdGhlIHJlZmVyZW50IGZyYW1lIG51bWJlciBmb3IgdXNlIGluIGFzc2VtYmxpbmcgZnJhZ21lbnRzLgorICBXZWJQTXV4QW5pbUJsZW5kIGJsZW5kX21ldGhvZF87CisgIGludCBmcmFtZV9udW1fOwogICBpbnQgY29tcGxldGVfOyAgIC8vIGltZ19jb21wb25lbnRzXyBjb250YWlucyBhIGZ1bGwgaW1hZ2UuCiAgIENodW5rRGF0YSBpbWdfY29tcG9uZW50c19bMl07ICAvLyAwPVZQOHssTH0gMT1BTFBICiAgIHN0cnVjdCBGcmFtZSogbmV4dF87CkBAIC03OCw2ICs3MCw3IEBACiAgIEZyYW1lKiBmcmFtZXNfOwogICBGcmFtZSoqIGZyYW1lc190YWlsXzsKICAgQ2h1bmsqIGNodW5rc187ICAvLyBub24taW1hZ2UgY2h1bmtzCisgIENodW5rKiogY2h1bmtzX3RhaWxfOwogfTsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTEyNCw3ICsxMTcsNyBAQAogCiBzdGF0aWMgaW50IEluaXRNZW1CdWZmZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgU2JNZW1vcnlTZXQobWVtLCAwLCBzaXplb2YoKm1lbSkpOworICBtZW1zZXQobWVtLCAwLCBzaXplb2YoKm1lbSkpOwogICByZXR1cm4gUmVtYXBNZW1CdWZmZXIobWVtLCBkYXRhLCBzaXplKTsKIH0KIApAQCAtMTgyLDEwICsxNzUsOSBAQAogLy8gU2Vjb25kYXJ5IGNodW5rIHBhcnNpbmcKIAogc3RhdGljIHZvaWQgQWRkQ2h1bmsoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIENodW5rKiBjb25zdCBjaHVuaykgewotICBDaHVuayoqIGMgPSAmZG11eC0+Y2h1bmtzXzsKLSAgd2hpbGUgKCpjICE9IE5VTEwpIGMgPSAmKCpjKS0+bmV4dF87Ci0gICpjID0gY2h1bms7CisgICpkbXV4LT5jaHVua3NfdGFpbF8gPSBjaHVuazsKICAgY2h1bmstPm5leHRfID0gTlVMTDsKKyAgZG11eC0+Y2h1bmtzX3RhaWxfID0gJmNodW5rLT5uZXh0XzsKIH0KIAogLy8gQWRkIGEgZnJhbWUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZW5zdXJpbmcgdGhlIGxhc3QgZnJhbWUgaXMgY29tcGxldGUuCkBAIC0yMDAsMTkgKzE5MiwyOSBAQAogICByZXR1cm4gMTsKIH0KIAotLy8gU3RvcmUgaW1hZ2UgYmVhcmluZyBjaHVua3MgdG8gJ2ZyYW1lJy4KLS8vIElmICdoYXNfdnA4bF9hbHBoYScgaXMgbm90IE5VTEwsIGl0IHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgdGhlIGZyYW1lIGlzIGEKLS8vIGxvc3NsZXNzIGltYWdlIHdpdGggYWxwaGEuCitzdGF0aWMgdm9pZCBTZXRGcmFtZUluZm8oc2l6ZV90IHN0YXJ0X29mZnNldCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwgaW50IGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CisgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMF0ub2Zmc2V0XyA9IHN0YXJ0X29mZnNldDsKKyAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5zaXplXyA9IHNpemU7CisgIGZyYW1lLT53aWR0aF8gPSBmZWF0dXJlcy0+d2lkdGg7CisgIGZyYW1lLT5oZWlnaHRfID0gZmVhdHVyZXMtPmhlaWdodDsKKyAgZnJhbWUtPmhhc19hbHBoYV8gfD0gZmVhdHVyZXMtPmhhc19hbHBoYTsKKyAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07CisgIGZyYW1lLT5jb21wbGV0ZV8gPSBjb21wbGV0ZTsKK30KKworLy8gU3RvcmUgaW1hZ2UgYmVhcmluZyBjaHVua3MgdG8gJ2ZyYW1lJy4gJ21pbl9zaXplJyBpcyBhbiBvcHRpb25hbCBzaXplCisvLyByZXF1aXJlbWVudCwgaXQgbWF5IGJlIHplcm8uCiBzdGF0aWMgUGFyc2VTdGF0dXMgU3RvcmVGcmFtZShpbnQgZnJhbWVfbnVtLCB1aW50MzJfdCBtaW5fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUJ1ZmZlciogY29uc3QgbWVtLCBGcmFtZSogY29uc3QgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc192cDhsX2FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1CdWZmZXIqIGNvbnN0IG1lbSwgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CiAgIGludCBhbHBoYV9jaHVua3MgPSAwOwogICBpbnQgaW1hZ2VfY2h1bmtzID0gMDsKLSAgaW50IGRvbmUgPSAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKTsKKyAgaW50IGRvbmUgPSAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFIHx8CisgICAgICAgICAgICAgIE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSk7CiAgIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOwogCi0gIGlmIChoYXNfdnA4bF9hbHBoYSAhPSBOVUxMKSAqaGFzX3ZwOGxfYWxwaGEgPSAwOyAgLy8gRGVmYXVsdC4KLQogICBpZiAoZG9uZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwogCiAgIGRvIHsKQEAgLTIzNCw2ICsyMzYsNyBAQAogICAgICAgICAgICsrYWxwaGFfY2h1bmtzOwogICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0ub2Zmc2V0XyA9IGNodW5rX3N0YXJ0X29mZnNldDsKICAgICAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICBmcmFtZS0+aGFzX2FscGhhXyA9IDE7CiAgICAgICAgICAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07CiAgICAgICAgICAgU2tpcChtZW0sIHBheWxvYWRfYXZhaWxhYmxlKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI1OSwxMyArMjYyLDggQEAKICAgICAgICAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKICAgICAgICAgICB9CiAgICAgICAgICAgKytpbWFnZV9jaHVua3M7Ci0gICAgICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5vZmZzZXRfID0gY2h1bmtfc3RhcnRfb2Zmc2V0OwotICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMF0uc2l6ZV8gPSBjaHVua19zaXplOwotICAgICAgICAgIGZyYW1lLT53aWR0aF8gPSBmZWF0dXJlcy53aWR0aDsKLSAgICAgICAgICBmcmFtZS0+aGVpZ2h0XyA9IGZlYXR1cmVzLmhlaWdodDsKLSAgICAgICAgICBpZiAoaGFzX3ZwOGxfYWxwaGEgIT0gTlVMTCkgKmhhc192cDhsX2FscGhhID0gZmVhdHVyZXMuaGFzX2FscGhhOwotICAgICAgICAgIGZyYW1lLT5mcmFtZV9udW1fID0gZnJhbWVfbnVtOwotICAgICAgICAgIGZyYW1lLT5jb21wbGV0ZV8gPSAoc3RhdHVzID09IFBBUlNFX09LKTsKKyAgICAgICAgICBTZXRGcmFtZUluZm8oY2h1bmtfc3RhcnRfb2Zmc2V0LCBjaHVua19zaXplLCBmcmFtZV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBQQVJTRV9PSywgJmZlYXR1cmVzLCBmcmFtZSk7CiAgICAgICAgICAgU2tpcChtZW0sIHBheWxvYWRfYXZhaWxhYmxlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBnb3RvIERvbmU7CkBAIC0zMDAsNyArMjk4LDcgQEAKICAgaWYgKGFjdHVhbF9zaXplIDwgbWluX3NpemUpIHJldHVybiBQQVJTRV9FUlJPUjsKICAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSkgIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKIAotICAqZnJhbWUgPSAoRnJhbWUqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqKmZyYW1lKSk7CisgICpmcmFtZSA9IChGcmFtZSopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCoqZnJhbWUpKTsKICAgcmV0dXJuICgqZnJhbWUgPT0gTlVMTCkgPyBQQVJTRV9FUlJPUiA6IFBBUlNFX09LOwogfQogCkBAIC0zMDgsOSArMzA2LDEwIEBACiAvLyAnZnJhbWVfY2h1bmtfc2l6ZScgaXMgdGhlIHByZXZpb3VzbHkgdmFsaWRhdGVkLCBwYWRkZWQgY2h1bmsgc2l6ZS4KIHN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZUFuaW1hdGlvbkZyYW1lKAogICAgIFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCB1aW50MzJfdCBmcmFtZV9jaHVua19zaXplKSB7Ci0gIGNvbnN0IGludCBoYXNfZnJhbWVzID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIGNvbnN0IGludCBpc19hbmltYXRpb24gPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKICAgY29uc3QgdWludDMyX3QgYW5tZl9wYXlsb2FkX3NpemUgPSBmcmFtZV9jaHVua19zaXplIC0gQU5NRl9DSFVOS19TSVpFOwogICBpbnQgYWRkZWRfZnJhbWUgPSAwOworICBpbnQgYml0czsKICAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKICAgRnJhbWUqIGZyYW1lOwogICBQYXJzZVN0YXR1cyBzdGF0dXMgPQpAQCAtMzIyLDE3ICszMjEsMTkgQEAKICAgZnJhbWUtPndpZHRoXyAgICAgICAgICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKICAgZnJhbWUtPmhlaWdodF8gICAgICAgICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKICAgZnJhbWUtPmR1cmF0aW9uXyAgICAgICA9IFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+ZGlzcG9zZV9tZXRob2RfID0gKFdlYlBNdXhBbmltRGlzcG9zZSkoUmVhZEJ5dGUobWVtKSAmIDEpOworICBiaXRzID0gUmVhZEJ5dGUobWVtKTsKKyAgZnJhbWUtPmRpc3Bvc2VfbWV0aG9kXyA9CisgICAgICAoYml0cyAmIDEpID8gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EIDogV0VCUF9NVVhfRElTUE9TRV9OT05FOworICBmcmFtZS0+YmxlbmRfbWV0aG9kXyA9IChiaXRzICYgMikgPyBXRUJQX01VWF9OT19CTEVORCA6IFdFQlBfTVVYX0JMRU5EOwogICBpZiAoZnJhbWUtPndpZHRoXyAqICh1aW50NjRfdClmcmFtZS0+aGVpZ2h0XyA+PSBNQVhfSU1BR0VfQVJFQSkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7CisgICAgV2ViUFNhZmVGcmVlKGZyYW1lKTsKICAgICByZXR1cm4gUEFSU0VfRVJST1I7CiAgIH0KIAogICAvLyBTdG9yZSBhIGZyYW1lIG9ubHkgaWYgdGhlIGFuaW1hdGlvbiBmbGFnIGlzIHNldCB0aGVyZSBpcyBzb21lIGRhdGEgZm9yCiAgIC8vIHRoaXMgZnJhbWUgaXMgYXZhaWxhYmxlLgotICBzdGF0dXMgPSBTdG9yZUZyYW1lKGRtdXgtPm51bV9mcmFtZXNfICsgMSwgYW5tZl9wYXlsb2FkX3NpemUsIG1lbSwgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgaGFzX2ZyYW1lcyAmJiBmcmFtZS0+ZnJhbWVfbnVtXyA+IDApIHsKKyAgc3RhdHVzID0gU3RvcmVGcmFtZShkbXV4LT5udW1fZnJhbWVzXyArIDEsIGFubWZfcGF5bG9hZF9zaXplLCBtZW0sIGZyYW1lKTsKKyAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiBpc19hbmltYXRpb24gJiYgZnJhbWUtPmZyYW1lX251bV8gPiAwKSB7CiAgICAgYWRkZWRfZnJhbWUgPSBBZGRGcmFtZShkbXV4LCBmcmFtZSk7CiAgICAgaWYgKGFkZGVkX2ZyYW1lKSB7CiAgICAgICArK2RtdXgtPm51bV9mcmFtZXNfOwpAQCAtMzQxLDUzICszNDIsMTcgQEAKICAgICB9CiAgIH0KIAotICBpZiAoIWFkZGVkX2ZyYW1lKSBTYk1lbW9yeURlYWxsb2NhdGUoZnJhbWUpOworICBpZiAoIWFkZGVkX2ZyYW1lKSBXZWJQU2FmZUZyZWUoZnJhbWUpOwogICByZXR1cm4gc3RhdHVzOwogfQogCi0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLS8vIFBhcnNlIGEgJ0ZSR00nIGNodW5rIGFuZCBhbnkgaW1hZ2UgYmVhcmluZyBjaHVua3MgdGhhdCBpbW1lZGlhdGVseSBmb2xsb3cuCi0vLyAnZnJhZ21lbnRfY2h1bmtfc2l6ZScgaXMgdGhlIHByZXZpb3VzbHkgdmFsaWRhdGVkLCBwYWRkZWQgY2h1bmsgc2l6ZS4KLXN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZUZyYWdtZW50KFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhZ21lbnRfY2h1bmtfc2l6ZSkgewotICBjb25zdCBpbnQgZnJhbWVfbnVtID0gMTsgIC8vIEFsbCBmcmFnbWVudHMgYmVsb25nIHRvIHRoZSAxc3QgKGFuZCBvbmx5KSBmcmFtZS4KLSAgY29uc3QgaW50IGhhc19mcmFnbWVudHMgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEZSQUdNRU5UU19GTEFHKTsKLSAgY29uc3QgdWludDMyX3QgZnJnbV9wYXlsb2FkX3NpemUgPSBmcmFnbWVudF9jaHVua19zaXplIC0gRlJHTV9DSFVOS19TSVpFOwotICBpbnQgYWRkZWRfZnJhZ21lbnQgPSAwOwotICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOwotICBGcmFtZSogZnJhbWU7Ci0gIFBhcnNlU3RhdHVzIHN0YXR1cyA9Ci0gICAgICBOZXdGcmFtZShtZW0sIEZSR01fQ0hVTktfU0laRSwgZnJhZ21lbnRfY2h1bmtfc2l6ZSwgJmZyYW1lKTsKLSAgaWYgKHN0YXR1cyAhPSBQQVJTRV9PSykgcmV0dXJuIHN0YXR1czsKLQotICBmcmFtZS0+aXNfZnJhZ21lbnRfID0gMTsKLSAgZnJhbWUtPnhfb2Zmc2V0XyA9IDIgKiBSZWFkTEUyNHMobWVtKTsKLSAgZnJhbWUtPnlfb2Zmc2V0XyA9IDIgKiBSZWFkTEUyNHMobWVtKTsKLQotICAvLyBTdG9yZSBhIGZyYWdtZW50IG9ubHkgaWYgdGhlIGZyYWdtZW50cyBmbGFnIGlzIHNldCB0aGVyZSBpcyBzb21lIGRhdGEgZm9yCi0gIC8vIHRoaXMgZnJhZ21lbnQgaXMgYXZhaWxhYmxlLgotICBzdGF0dXMgPSBTdG9yZUZyYW1lKGZyYW1lX251bSwgZnJnbV9wYXlsb2FkX3NpemUsIG1lbSwgZnJhbWUsIE5VTEwpOwotICBpZiAoc3RhdHVzICE9IFBBUlNFX0VSUk9SICYmIGhhc19mcmFnbWVudHMgJiYgZnJhbWUtPmZyYW1lX251bV8gPiAwKSB7Ci0gICAgYWRkZWRfZnJhZ21lbnQgPSBBZGRGcmFtZShkbXV4LCBmcmFtZSk7Ci0gICAgaWYgKCFhZGRlZF9mcmFnbWVudCkgewotICAgICAgc3RhdHVzID0gUEFSU0VfRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRtdXgtPm51bV9mcmFtZXNfID0gMTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWFkZGVkX2ZyYWdtZW50KSBTYk1lbW9yeURlYWxsb2NhdGUoZnJhbWUpOwotICByZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmICAvLyBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotCiAvLyBHZW5lcmFsIGNodW5rIHN0b3JhZ2UsIHN0YXJ0aW5nIHdpdGggdGhlIGhlYWRlciBhdCAnc3RhcnRfb2Zmc2V0JywgYWxsb3dpbmcKIC8vIHRoZSB1c2VyIHRvIHJlcXVlc3QgdGhlIHBheWxvYWQgdmlhIGEgZm91cmNjIHN0cmluZy4gJ3NpemUnIGluY2x1ZGVzIHRoZQogLy8gaGVhZGVyIGFuZCB0aGUgdW5wYWRkZWQgcGF5bG9hZCBzaXplLgogLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KIHN0YXRpYyBpbnQgU3RvcmVDaHVuayhXZWJQRGVtdXhlciogY29uc3QgZG11eCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnRfb2Zmc2V0LCB1aW50MzJfdCBzaXplKSB7Ci0gIENodW5rKiBjb25zdCBjaHVuayA9IChDaHVuayopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCpjaHVuaykpOworICBDaHVuayogY29uc3QgY2h1bmsgPSAoQ2h1bmsqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqY2h1bmspKTsKICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiAwOwogCiAgIGNodW5rLT5kYXRhXy5vZmZzZXRfID0gc3RhcnRfb2Zmc2V0OwpAQCAtMzk5LDIwICszNjQsMjAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQcmltYXJ5IGNodW5rIHBhcnNpbmcKIAotc3RhdGljIGludCBSZWFkSGVhZGVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CitzdGF0aWMgUGFyc2VTdGF0dXMgUmVhZEhlYWRlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgewogICBjb25zdCBzaXplX3QgbWluX3NpemUgPSBSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkU7CiAgIHVpbnQzMl90IHJpZmZfc2l6ZTsKIAogICAvLyBCYXNpYyBmaWxlIGxldmVsIHZhbGlkYXRpb24uCi0gIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpIHJldHVybiAwOwotICBpZiAoU2JNZW1vcnlDb21wYXJlKEdldEJ1ZmZlcihtZW0pLCAiUklGRiIsIENIVU5LX1NJWkVfQllURVMpIHx8Ci0gICAgICBTYk1lbW9yeUNvbXBhcmUoR2V0QnVmZmVyKG1lbSkgKyBDSFVOS19IRUFERVJfU0laRSwgIldFQlAiLCBDSFVOS19TSVpFX0JZVEVTKSkgewotICAgIHJldHVybiAwOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisgIGlmIChtZW1jbXAoR2V0QnVmZmVyKG1lbSksICJSSUZGIiwgQ0hVTktfU0laRV9CWVRFUykgfHwKKyAgICAgIG1lbWNtcChHZXRCdWZmZXIobWVtKSArIENIVU5LX0hFQURFUl9TSVpFLCAiV0VCUCIsIENIVU5LX1NJWkVfQllURVMpKSB7CisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOwogICB9CiAKICAgcmlmZl9zaXplID0gR2V0TEUzMihHZXRCdWZmZXIobWVtKSArIFRBR19TSVpFKTsKLSAgaWYgKHJpZmZfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gMDsKLSAgaWYgKHJpZmZfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gMDsKKyAgaWYgKHJpZmZfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChyaWZmX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIFBBUlNFX0VSUk9SOwogCiAgIC8vIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIFJJRkYgY2h1bmsKICAgbWVtLT5yaWZmX2VuZF8gPSByaWZmX3NpemUgKyBDSFVOS19IRUFERVJfU0laRTsKQEAgLTQyMSw3ICszODYsNyBAQAogICB9CiAKICAgU2tpcChtZW0sIFJJRkZfSEVBREVSX1NJWkUpOwotICByZXR1cm4gMTsKKyAgcmV0dXJuIFBBUlNFX09LOwogfQogCiBzdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VTaW5nbGVJbWFnZShXZWJQRGVtdXhlciogY29uc3QgZG11eCkgewpAQCAtNDI5LDI1ICszOTQsMjUgQEAKICAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKICAgRnJhbWUqIGZyYW1lOwogICBQYXJzZVN0YXR1cyBzdGF0dXM7Ci0gIGludCBoYXNfdnA4bF9hbHBoYSA9IDA7ICAvLyBGcmFtZSBjb250YWlucyBhIGxvc3NsZXNzIGltYWdlIHdpdGggYWxwaGEuCisgIGludCBpbWFnZV9hZGRlZCA9IDA7CiAKICAgaWYgKGRtdXgtPmZyYW1lc18gIT0gTlVMTCkgcmV0dXJuIFBBUlNFX0VSUk9SOwogICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIG1pbl9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOwogICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CiAKLSAgZnJhbWUgPSAoRnJhbWUqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZnJhbWUpKTsKKyAgZnJhbWUgPSAoRnJhbWUqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZnJhbWUpKTsKICAgaWYgKGZyYW1lID09IE5VTEwpIHJldHVybiBQQVJTRV9FUlJPUjsKIAotICAvLyBGb3IgdGhlIHNpbmdsZSBpbWFnZSBjYXNlIHdlIGFsbG93IHBhcnNpbmcgb2YgYSBwYXJ0aWFsIGZyYW1lLCBidXQgd2UgbmVlZAotICAvLyBhdCBsZWFzdCBDSFVOS19IRUFERVJfU0laRSBmb3IgcGFyc2luZy4KLSAgc3RhdHVzID0gU3RvcmVGcmFtZSgxLCBDSFVOS19IRUFERVJfU0laRSwgJmRtdXgtPm1lbV8sIGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICZoYXNfdnA4bF9hbHBoYSk7CisgIC8vIEZvciB0aGUgc2luZ2xlIGltYWdlIGNhc2Ugd2UgYWxsb3cgcGFyc2luZyBvZiBhIHBhcnRpYWwgZnJhbWUsIHNvIG5vCisgIC8vIG1pbmltdW0gc2l6ZSBpcyBpbXBvc2VkIGhlcmUuCisgIHN0YXR1cyA9IFN0b3JlRnJhbWUoMSwgMCwgJmRtdXgtPm1lbV8sIGZyYW1lKTsKICAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUikgewogICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFMUEhBX0ZMQUcpOwogICAgIC8vIENsZWFyIGFueSBhbHBoYSB3aGVuIHRoZSBhbHBoYSBmbGFnIGlzIG1pc3NpbmcuCiAgICAgaWYgKCFoYXNfYWxwaGEgJiYgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5zaXplXyA+IDApIHsKICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0ub2Zmc2V0XyA9IDA7CiAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID0gMDsKKyAgICAgIGZyYW1lLT5oYXNfYWxwaGFfID0gMDsKICAgICB9CiAKICAgICAvLyBVc2UgdGhlIGZyYW1lIHdpZHRoL2hlaWdodCBhcyB0aGUgY2FudmFzIHZhbHVlcyBmb3Igbm9uLXZwOHggZmlsZXMuCkBAIC00NTYsNDcgKzQyMSwyNiBAQAogICAgICAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTRURfSEVBREVSOwogICAgICAgZG11eC0+Y2FudmFzX3dpZHRoXyA9IGZyYW1lLT53aWR0aF87CiAgICAgICBkbXV4LT5jYW52YXNfaGVpZ2h0XyA9IGZyYW1lLT5oZWlnaHRfOwotICAgICAgZG11eC0+ZmVhdHVyZV9mbGFnc18gfD0gaGFzX3ZwOGxfYWxwaGEgPyBBTFBIQV9GTEFHIDogMDsKKyAgICAgIGRtdXgtPmZlYXR1cmVfZmxhZ3NfIHw9IGZyYW1lLT5oYXNfYWxwaGFfID8gQUxQSEFfRkxBRyA6IDA7CiAgICAgfQotICAgIEFkZEZyYW1lKGRtdXgsIGZyYW1lKTsKLSAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGZyYW1lKTsKKyAgICBpZiAoIUFkZEZyYW1lKGRtdXgsIGZyYW1lKSkgeworICAgICAgc3RhdHVzID0gUEFSU0VfRVJST1I7ICAvLyBsYXN0IGZyYW1lIHdhcyBsZWZ0IGluY29tcGxldGUKKyAgICB9IGVsc2UgeworICAgICAgaW1hZ2VfYWRkZWQgPSAxOworICAgICAgZG11eC0+bnVtX2ZyYW1lc18gPSAxOworICAgIH0KICAgfQogCisgIGlmICghaW1hZ2VfYWRkZWQpIFdlYlBTYWZlRnJlZShmcmFtZSk7CiAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpIHsKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFhDaHVua3MoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpIHsKKyAgY29uc3QgaW50IGlzX2FuaW1hdGlvbiA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgQU5JTUFUSU9OX0ZMQUcpOwogICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOwogICBpbnQgYW5pbV9jaHVua3MgPSAwOwotICB1aW50MzJfdCB2cDh4X3NpemU7CiAgIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOwogCi0gIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKLQotICBkbXV4LT5pc19leHRfZm9ybWF0XyA9IDE7Ci0gIFNraXAobWVtLCBUQUdfU0laRSk7ICAvLyBWUDhYCi0gIHZwOHhfc2l6ZSA9IFJlYWRMRTMyKG1lbSk7Ci0gIGlmICh2cDh4X3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICBpZiAodnA4eF9zaXplIDwgVlA4WF9DSFVOS19TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0gIHZwOHhfc2l6ZSArPSB2cDh4X3NpemUgJiAxOwotICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIHZwOHhfc2l6ZSkpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCB2cDh4X3NpemUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKLQotICBkbXV4LT5mZWF0dXJlX2ZsYWdzXyA9IFJlYWRCeXRlKG1lbSk7Ci0gIFNraXAobWVtLCAzKTsgIC8vIFJlc2VydmVkLgotICBkbXV4LT5jYW52YXNfd2lkdGhfICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKLSAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSAxICsgUmVhZExFMjRzKG1lbSk7Ci0gIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfICogKHVpbnQ2NF90KWRtdXgtPmNhbnZhc19oZWlnaHRfID49IE1BWF9JTUFHRV9BUkVBKSB7Ci0gICAgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gaW1hZ2UgZmluYWwgZGltZW5zaW9uIGlzIHRvbyBsYXJnZQotICB9Ci0gIFNraXAobWVtLCB2cDh4X3NpemUgLSBWUDhYX0NIVU5LX1NJWkUpOyAgLy8gc2tpcCBhbnkgdHJhaWxpbmcgZGF0YS4KLSAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTRURfSEVBREVSOwotCi0gIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgQ0hVTktfSEVBREVSX1NJWkUpKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0gIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKLQogICBkbyB7CiAgICAgaW50IHN0b3JlX2NodW5rID0gMTsKICAgICBjb25zdCBzaXplX3QgY2h1bmtfc3RhcnRfb2Zmc2V0ID0gbWVtLT5zdGFydF87CkBAIC01MTUsNyArNDU5LDcgQEAKICAgICAgIGNhc2UgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJyAnKToKICAgICAgIGNhc2UgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJ0wnKTogewogICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXNuJ3QgYW4gYW5pbWF0aW9uIChhbGwgZnJhbWVzIHNob3VsZCBiZSBpbiBhbiBBTk1GKS4KLSAgICAgICAgaWYgKGFuaW1fY2h1bmtzID4gMCkgcmV0dXJuIFBBUlNFX0VSUk9SOworICAgICAgICBpZiAoYW5pbV9jaHVua3MgPiAwIHx8IGlzX2FuaW1hdGlvbikgcmV0dXJuIFBBUlNFX0VSUk9SOwogCiAgICAgICAgIFJld2luZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKTsKICAgICAgICAgc3RhdHVzID0gUGFyc2VTaW5nbGVJbWFnZShkbXV4KTsKQEAgLTU0MiwyNCArNDg2LDE4IEBACiAgICAgICAgIHN0YXR1cyA9IFBhcnNlQW5pbWF0aW9uRnJhbWUoZG11eCwgY2h1bmtfc2l6ZV9wYWRkZWQpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgICAgY2FzZSBNS0ZPVVJDQygnRicsICdSJywgJ0cnLCAnTScpOiB7Ci0gICAgICAgIHN0YXR1cyA9IFBhcnNlRnJhZ21lbnQoZG11eCwgY2h1bmtfc2l6ZV9wYWRkZWQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZgogICAgICAgY2FzZSBNS0ZPVVJDQygnSScsICdDJywgJ0MnLCAnUCcpOiB7CiAgICAgICAgIHN0b3JlX2NodW5rID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBJQ0NQX0ZMQUcpOwogICAgICAgICBnb3RvIFNraXA7CiAgICAgICB9Ci0gICAgICBjYXNlIE1LRk9VUkNDKCdYJywgJ00nLCAnUCcsICcgJyk6IHsKLSAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIFhNUF9GTEFHKTsKLSAgICAgICAgZ290byBTa2lwOwotICAgICAgfQogICAgICAgY2FzZSBNS0ZPVVJDQygnRScsICdYJywgJ0knLCAnRicpOiB7CiAgICAgICAgIHN0b3JlX2NodW5rID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBFWElGX0ZMQUcpOwogICAgICAgICBnb3RvIFNraXA7CiAgICAgICB9CisgICAgICBjYXNlIE1LRk9VUkNDKCdYJywgJ00nLCAnUCcsICcgJyk6IHsKKyAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIFhNUF9GTEFHKTsKKyAgICAgICAgZ290byBTa2lwOworICAgICAgfQogIFNraXA6CiAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgIGlmIChjaHVua19zaXplX3BhZGRlZCA8PSBNZW1EYXRhU2l6ZShtZW0pKSB7CkBAIC01ODgsNiArNTI2LDM3IEBACiAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpIHsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKKyAgdWludDMyX3QgdnA4eF9zaXplOworCisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICBkbXV4LT5pc19leHRfZm9ybWF0XyA9IDE7CisgIFNraXAobWVtLCBUQUdfU0laRSk7ICAvLyBWUDhYCisgIHZwOHhfc2l6ZSA9IFJlYWRMRTMyKG1lbSk7CisgIGlmICh2cDh4X3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAodnA4eF9zaXplIDwgVlA4WF9DSFVOS19TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIHZwOHhfc2l6ZSArPSB2cDh4X3NpemUgJiAxOworICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIHZwOHhfc2l6ZSkpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCB2cDh4X3NpemUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICBkbXV4LT5mZWF0dXJlX2ZsYWdzXyA9IFJlYWRCeXRlKG1lbSk7CisgIFNraXAobWVtLCAzKTsgIC8vIFJlc2VydmVkLgorICBkbXV4LT5jYW52YXNfd2lkdGhfICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKKyAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSAxICsgUmVhZExFMjRzKG1lbSk7CisgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfICogKHVpbnQ2NF90KWRtdXgtPmNhbnZhc19oZWlnaHRfID49IE1BWF9JTUFHRV9BUkVBKSB7CisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gaW1hZ2UgZmluYWwgZGltZW5zaW9uIGlzIHRvbyBsYXJnZQorICB9CisgIFNraXAobWVtLCB2cDh4X3NpemUgLSBWUDhYX0NIVU5LX1NJWkUpOyAgLy8gc2tpcCBhbnkgdHJhaWxpbmcgZGF0YS4KKyAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTRURfSEVBREVSOworCisgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgQ0hVTktfSEVBREVSX1NJWkUpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICByZXR1cm4gUGFyc2VWUDhYQ2h1bmtzKGRtdXgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRm9ybWF0IHZhbGlkYXRpb24KIApAQCAtNjAyLDMwICs1NzEsNDcgQEAKICAgcmV0dXJuIDE7CiB9CiAKKy8vIElmICdleGFjdCcgaXMgdHJ1ZSwgY2hlY2sgdGhhdCB0aGUgaW1hZ2UgcmVzb2x1dGlvbiBtYXRjaGVzIHRoZSBjYW52YXMuCisvLyBJZiAnZXhhY3QnIGlzIGZhbHNlLCBjaGVjayB0aGF0IHRoZSB4L3kgb2Zmc2V0cyBkbyBub3QgZXhjZWVkIHRoZSBjYW52YXMuCitzdGF0aWMgaW50IENoZWNrRnJhbWVCb3VuZHMoY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLCBpbnQgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc193aWR0aCwgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgaWYgKGV4YWN0KSB7CisgICAgaWYgKGZyYW1lLT54X29mZnNldF8gIT0gMCB8fCBmcmFtZS0+eV9vZmZzZXRfICE9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZnJhbWUtPndpZHRoXyAhPSBjYW52YXNfd2lkdGggfHwgZnJhbWUtPmhlaWdodF8gIT0gY2FudmFzX2hlaWdodCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChmcmFtZS0+eF9vZmZzZXRfIDwgMCB8fCBmcmFtZS0+eV9vZmZzZXRfIDwgMCkgcmV0dXJuIDA7CisgICAgaWYgKGZyYW1lLT53aWR0aF8gKyBmcmFtZS0+eF9vZmZzZXRfID4gY2FudmFzX3dpZHRoKSByZXR1cm4gMDsKKyAgICBpZiAoZnJhbWUtPmhlaWdodF8gKyBmcmFtZS0+eV9vZmZzZXRfID4gY2FudmFzX2hlaWdodCkgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgSXNWYWxpZEV4dGVuZGVkRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7Ci0gIGNvbnN0IGludCBoYXNfZnJhZ21lbnRzID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBGUkFHTUVOVFNfRkxBRyk7Ci0gIGNvbnN0IGludCBoYXNfZnJhbWVzID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7Ci0gIGNvbnN0IEZyYW1lKiBmOworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIGNvbnN0IEZyYW1lKiBmID0gZG11eC0+ZnJhbWVzXzsKIAogICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOwogCiAgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7CiAgIGlmIChkbXV4LT5sb29wX2NvdW50XyA8IDApIHJldHVybiAwOwogICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSAmJiBkbXV4LT5mcmFtZXNfID09IE5VTEwpIHJldHVybiAwOworICBpZiAoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiB+QUxMX1ZBTElEX0ZMQUdTKSByZXR1cm4gMDsgIC8vIGludmFsaWQgYml0c3RyZWFtCiAKLSAgZm9yIChmID0gZG11eC0+ZnJhbWVzXzsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dF8pIHsKKyAgd2hpbGUgKGYgIT0gTlVMTCkgewogICAgIGNvbnN0IGludCBjdXJfZnJhbWVfc2V0ID0gZi0+ZnJhbWVfbnVtXzsKLSAgICBpbnQgZnJhbWVfY291bnQgPSAwLCBmcmFnbWVudF9jb3VudCA9IDA7CisgICAgaW50IGZyYW1lX2NvdW50ID0gMDsKIAotICAgIC8vIENoZWNrIGZyYW1lIHByb3BlcnRpZXMgYW5kIGlmIHRoZSBpbWFnZSBpcyBjb21wb3NlZCBvZiBmcmFnbWVudHMgdGhhdAotICAgIC8vIGVhY2ggZnJhZ21lbnQgY2FtZSBmcm9tIGEgZnJhZ21lbnQuCisgICAgLy8gQ2hlY2sgZnJhbWUgcHJvcGVydGllcy4KICAgICBmb3IgKDsgZiAhPSBOVUxMICYmIGYtPmZyYW1lX251bV8gPT0gY3VyX2ZyYW1lX3NldDsgZiA9IGYtPm5leHRfKSB7CiAgICAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGltYWdlID0gZi0+aW1nX2NvbXBvbmVudHNfOwogICAgICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBhbHBoYSA9IGYtPmltZ19jb21wb25lbnRzXyArIDE7CiAKLSAgICAgIGlmICghaGFzX2ZyYWdtZW50cyAmJiBmLT5pc19mcmFnbWVudF8pIHJldHVybiAwOwotICAgICAgaWYgKCFoYXNfZnJhbWVzICYmIGYtPmZyYW1lX251bV8gPiAxKSByZXR1cm4gMDsKLSAgICAgIGlmIChmLT54X29mZnNldF8gPCAwIHx8IGYtPnlfb2Zmc2V0XyA8IDApIHJldHVybiAwOworICAgICAgaWYgKCFpc19hbmltYXRpb24gJiYgZi0+ZnJhbWVfbnVtXyA+IDEpIHJldHVybiAwOworCiAgICAgICBpZiAoZi0+Y29tcGxldGVfKSB7CiAgICAgICAgIGlmIChhbHBoYS0+c2l6ZV8gPT0gMCAmJiBpbWFnZS0+c2l6ZV8gPT0gMCkgcmV0dXJuIDA7CiAgICAgICAgIC8vIEVuc3VyZSBhbHBoYSBwcmVjZWRlcyBpbWFnZSBiaXRzdHJlYW0uCkBAIC02NDcsMTIgKzYzMywxNCBAQAogICAgICAgICBpZiAoZi0+bmV4dF8gIT0gTlVMTCkgcmV0dXJuIDA7CiAgICAgICB9CiAKLSAgICAgIGZyYWdtZW50X2NvdW50ICs9IGYtPmlzX2ZyYWdtZW50XzsKKyAgICAgIGlmIChmLT53aWR0aF8gPiAwICYmIGYtPmhlaWdodF8gPiAwICYmCisgICAgICAgICAgIUNoZWNrRnJhbWVCb3VuZHMoZiwgIWlzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXV4LT5jYW52YXNfd2lkdGhfLCBkbXV4LT5jYW52YXNfaGVpZ2h0XykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKICAgICAgICsrZnJhbWVfY291bnQ7CiAgICAgfQotICAgIGlmICghaGFzX2ZyYWdtZW50cyAmJiBmcmFtZV9jb3VudCA+IDEpIHJldHVybiAwOwotICAgIGlmIChmcmFnbWVudF9jb3VudCA+IDAgJiYgZnJhbWVfY291bnQgIT0gZnJhZ21lbnRfY291bnQpIHJldHVybiAwOwotICAgIGlmIChmID09IE5VTEwpIGJyZWFrOwogICB9CiAgIHJldHVybiAxOwogfQpAQCAtNjY3LDkgKzY1NSw0NSBAQAogICBkbXV4LT5jYW52YXNfd2lkdGhfID0gLTE7CiAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gLTE7CiAgIGRtdXgtPmZyYW1lc190YWlsXyA9ICZkbXV4LT5mcmFtZXNfOworICBkbXV4LT5jaHVua3NfdGFpbF8gPSAmZG11eC0+Y2h1bmtzXzsKICAgZG11eC0+bWVtXyA9ICptZW07CiB9CiAKK3N0YXRpYyBQYXJzZVN0YXR1cyBDcmVhdGVSYXdJbWFnZURlbXV4ZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZW11eGVyKiogZGVtdXhlcikgeworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgZmVhdHVyZXM7CisgIGNvbnN0IFZQOFN0YXR1c0NvZGUgc3RhdHVzID0KKyAgICAgIFdlYlBHZXRGZWF0dXJlcyhtZW0tPmJ1Zl8sIG1lbS0+YnVmX3NpemVfLCAmZmVhdHVyZXMpOworICAqZGVtdXhlciA9IE5VTEw7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSA/IFBBUlNFX05FRURfTU9SRV9EQVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUEFSU0VfRVJST1I7CisgIH0KKworICB7CisgICAgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXggPSAoV2ViUERlbXV4ZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZG11eCkpOworICAgIEZyYW1lKiBjb25zdCBmcmFtZSA9IChGcmFtZSopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpmcmFtZSkpOworICAgIGlmIChkbXV4ID09IE5VTEwgfHwgZnJhbWUgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICBJbml0RGVtdXgoZG11eCwgbWVtKTsKKyAgICBTZXRGcmFtZUluZm8oMCwgbWVtLT5idWZfc2l6ZV8sIDEgLypmcmFtZV9udW0qLywgMSAvKmNvbXBsZXRlKi8sICZmZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgZnJhbWUpOworICAgIGlmICghQWRkRnJhbWUoZG11eCwgZnJhbWUpKSBnb3RvIEVycm9yOworICAgIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfRE9ORTsKKyAgICBkbXV4LT5jYW52YXNfd2lkdGhfID0gZnJhbWUtPndpZHRoXzsKKyAgICBkbXV4LT5jYW52YXNfaGVpZ2h0XyA9IGZyYW1lLT5oZWlnaHRfOworICAgIGRtdXgtPmZlYXR1cmVfZmxhZ3NfIHw9IGZyYW1lLT5oYXNfYWxwaGFfID8gQUxQSEFfRkxBRyA6IDA7CisgICAgZG11eC0+bnVtX2ZyYW1lc18gPSAxOworICAgIGFzc2VydChJc1ZhbGlkU2ltcGxlRm9ybWF0KGRtdXgpKTsKKyAgICAqZGVtdXhlciA9IGRtdXg7CisgICAgcmV0dXJuIFBBUlNFX09LOworCisgRXJyb3I6CisgICAgV2ViUFNhZmVGcmVlKGRtdXgpOworICAgIFdlYlBTYWZlRnJlZShmcmFtZSk7CisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICB9Cit9CisKIFdlYlBEZW11eGVyKiBXZWJQRGVtdXhJbnRlcm5hbChjb25zdCBXZWJQRGF0YSogZGF0YSwgaW50IGFsbG93X3BhcnRpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlbXV4U3RhdGUqIHN0YXRlLCBpbnQgdmVyc2lvbikgewogICBjb25zdCBDaHVua1BhcnNlciogcGFyc2VyOwpAQCAtNjc4LDI5ICs3MDIsNDkgQEAKICAgTWVtQnVmZmVyIG1lbTsKICAgV2ViUERlbXV4ZXIqIGRtdXg7CiAKKyAgaWYgKHN0YXRlICE9IE5VTEwpICpzdGF0ZSA9IFdFQlBfREVNVVhfUEFSU0VfRVJST1I7CisKICAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgcmV0dXJuIE5VTEw7CiAgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Ynl0ZXMgPT0gTlVMTCB8fCBkYXRhLT5zaXplID09IDApIHJldHVybiBOVUxMOwogCiAgIGlmICghSW5pdE1lbUJ1ZmZlcigmbWVtLCBkYXRhLT5ieXRlcywgZGF0YS0+c2l6ZSkpIHJldHVybiBOVUxMOwotICBpZiAoIVJlYWRIZWFkZXIoJm1lbSkpIHJldHVybiBOVUxMOworICBzdGF0dXMgPSBSZWFkSGVhZGVyKCZtZW0pOworICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSB7CisgICAgLy8gSWYgcGFyc2luZyBvZiB0aGUgd2VicCBmaWxlIGhlYWRlciBmYWlscyBhdHRlbXB0IHRvIGhhbmRsZSBhIHJhdworICAgIC8vIFZQOC9WUDhMIGZyYW1lLiBOb3RlICdhbGxvd19wYXJ0aWFsJyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSB7CisgICAgICBzdGF0dXMgPSBDcmVhdGVSYXdJbWFnZURlbXV4ZXIoJm1lbSwgJmRtdXgpOworICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9PSykgeworICAgICAgICBpZiAoc3RhdGUgIT0gTlVMTCkgKnN0YXRlID0gV0VCUF9ERU1VWF9ET05FOworICAgICAgICByZXR1cm4gZG11eDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICpzdGF0ZSA9IChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEpID8gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCiAgIHBhcnRpYWwgPSAobWVtLmJ1Zl9zaXplXyA8IG1lbS5yaWZmX2VuZF8pOwogICBpZiAoIWFsbG93X3BhcnRpYWwgJiYgcGFydGlhbCkgcmV0dXJuIE5VTEw7CiAKLSAgZG11eCA9IChXZWJQRGVtdXhlciopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCpkbXV4KSk7CisgIGRtdXggPSAoV2ViUERlbXV4ZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZG11eCkpOwogICBpZiAoZG11eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgSW5pdERlbXV4KGRtdXgsICZtZW0pOwogCisgIHN0YXR1cyA9IFBBUlNFX0VSUk9SOwogICBmb3IgKHBhcnNlciA9IGtNYXN0ZXJDaHVua3M7IHBhcnNlci0+cGFyc2UgIT0gTlVMTDsgKytwYXJzZXIpIHsKLSAgICBpZiAoIVNiTWVtb3J5Q29tcGFyZShwYXJzZXItPmlkLCBHZXRCdWZmZXIoJmRtdXgtPm1lbV8pLCBUQUdfU0laRSkpIHsKKyAgICBpZiAoIW1lbWNtcChwYXJzZXItPmlkLCBHZXRCdWZmZXIoJmRtdXgtPm1lbV8pLCBUQUdfU0laRSkpIHsKICAgICAgIHN0YXR1cyA9IHBhcnNlci0+cGFyc2UoZG11eCk7CiAgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX09LKSBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX0RPTkU7CiAgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX05FRURfTU9SRV9EQVRBICYmICFwYXJ0aWFsKSBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKICAgICAgIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgIXBhcnNlci0+dmFsaWQoZG11eCkpIHN0YXR1cyA9IFBBUlNFX0VSUk9SOworICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9FUlJPUikgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTRV9FUlJPUjsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBpZiAoc3RhdGUpICpzdGF0ZSA9IGRtdXgtPnN0YXRlXzsKKyAgaWYgKHN0YXRlICE9IE5VTEwpICpzdGF0ZSA9IGRtdXgtPnN0YXRlXzsKIAogICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSB7CiAgICAgV2ViUERlbXV4RGVsZXRlKGRtdXgpOwpAQCAtNzE3LDE0ICs3NjEsMTQgQEAKICAgZm9yIChmID0gZG11eC0+ZnJhbWVzXzsgZiAhPSBOVUxMOykgewogICAgIEZyYW1lKiBjb25zdCBjdXJfZnJhbWUgPSBmOwogICAgIGYgPSBmLT5uZXh0XzsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoY3VyX2ZyYW1lKTsKKyAgICBXZWJQU2FmZUZyZWUoY3VyX2ZyYW1lKTsKICAgfQogICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7KSB7CiAgICAgQ2h1bmsqIGNvbnN0IGN1cl9jaHVuayA9IGM7CiAgICAgYyA9IGMtPm5leHRfOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjdXJfY2h1bmspOworICAgIFdlYlBTYWZlRnJlZShjdXJfY2h1bmspOwogICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShkbXV4KTsKKyAgV2ViUFNhZmVGcmVlKGRtdXgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzQ2LDggKzc5MCw2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRnJhbWUgaXRlcmF0aW9uCiAKLS8vIEZpbmQgdGhlIGZpcnN0ICdmcmFtZV9udW0nIGZyYW1lLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc3VjaCBmcmFtZXMgaW4gYQotLy8gZnJhZ21lbnRlZCBmcmFtZS4KIHN0YXRpYyBjb25zdCBGcmFtZSogR2V0RnJhbWUoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGludCBmcmFtZV9udW0pIHsKICAgY29uc3QgRnJhbWUqIGY7CiAgIGZvciAoZiA9IGRtdXgtPmZyYW1lc187IGYgIT0gTlVMTDsgZiA9IGYtPm5leHRfKSB7CkBAIC03NTYsMjEgKzc5OCw2IEBACiAgIHJldHVybiBmOwogfQogCi0vLyBSZXR1cm5zIGZyYWdtZW50ICdmcmFnbWVudF9udW0nIGFuZCB0aGUgdG90YWwgY291bnQuCi1zdGF0aWMgY29uc3QgRnJhbWUqIEdldEZyYWdtZW50KAotICAgIGNvbnN0IEZyYW1lKiBjb25zdCBmcmFtZV9zZXQsIGludCBmcmFnbWVudF9udW0sIGludCogY29uc3QgY291bnQpIHsKLSAgY29uc3QgaW50IHRoaXNfZnJhbWUgPSBmcmFtZV9zZXQtPmZyYW1lX251bV87Ci0gIGNvbnN0IEZyYW1lKiBmID0gZnJhbWVfc2V0OwotICBjb25zdCBGcmFtZSogZnJhZ21lbnQgPSBOVUxMOwotICBpbnQgdG90YWw7Ci0KLSAgZm9yICh0b3RhbCA9IDA7IGYgIT0gTlVMTCAmJiBmLT5mcmFtZV9udW1fID09IHRoaXNfZnJhbWU7IGYgPSBmLT5uZXh0XykgewotICAgIGlmICgrK3RvdGFsID09IGZyYWdtZW50X251bSkgZnJhZ21lbnQgPSBmOwotICB9Ci0gICpjb3VudCA9IHRvdGFsOwotICByZXR1cm4gZnJhZ21lbnQ7Ci19Ci0KIHN0YXRpYyBjb25zdCB1aW50OF90KiBHZXRGcmFtZVBheWxvYWQoY29uc3QgdWludDhfdCogY29uc3QgbWVtX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSkgewpAQCAtNzk3LDMyICs4MjQsMjcgQEAKIAogLy8gQ3JlYXRlIGEgd2hvbGUgJ2ZyYW1lJyBmcm9tIFZQOCAoKyBhbHBoYSkgb3IgbG9zc2xlc3MuCiBzdGF0aWMgaW50IFN5bnRoZXNpemVGcmFtZShjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lKiBjb25zdCBmaXJzdF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFnbWVudF9udW0sIFdlYlBJdGVyYXRvciogY29uc3QgaXRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEl0ZXJhdG9yKiBjb25zdCBpdGVyKSB7CiAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87Ci0gIGludCBudW1fZnJhZ21lbnRzOwogICBzaXplX3QgcGF5bG9hZF9zaXplID0gMDsKLSAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYWdtZW50ID0KLSAgICAgIEdldEZyYWdtZW50KGZpcnN0X2ZyYW1lLCBmcmFnbWVudF9udW0sICZudW1fZnJhZ21lbnRzKTsKLSAgY29uc3QgdWludDhfdCogY29uc3QgcGF5bG9hZCA9Ci0gICAgICBHZXRGcmFtZVBheWxvYWQobWVtX2J1ZiwgZnJhZ21lbnQsICZwYXlsb2FkX3NpemUpOworICBjb25zdCB1aW50OF90KiBjb25zdCBwYXlsb2FkID0gR2V0RnJhbWVQYXlsb2FkKG1lbV9idWYsIGZyYW1lLCAmcGF5bG9hZF9zaXplKTsKICAgaWYgKHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIFNCX0RDSEVDSyhmaXJzdF9mcmFtZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOwogCi0gIGl0ZXItPmZyYW1lX251bSAgICAgID0gZmlyc3RfZnJhbWUtPmZyYW1lX251bV87CisgIGl0ZXItPmZyYW1lX251bSAgICAgID0gZnJhbWUtPmZyYW1lX251bV87CiAgIGl0ZXItPm51bV9mcmFtZXMgICAgID0gZG11eC0+bnVtX2ZyYW1lc187Ci0gIGl0ZXItPmZyYWdtZW50X251bSAgID0gZnJhZ21lbnRfbnVtOwotICBpdGVyLT5udW1fZnJhZ21lbnRzICA9IG51bV9mcmFnbWVudHM7Ci0gIGl0ZXItPnhfb2Zmc2V0ICAgICAgID0gZnJhZ21lbnQtPnhfb2Zmc2V0XzsKLSAgaXRlci0+eV9vZmZzZXQgICAgICAgPSBmcmFnbWVudC0+eV9vZmZzZXRfOwotICBpdGVyLT53aWR0aCAgICAgICAgICA9IGZyYWdtZW50LT53aWR0aF87Ci0gIGl0ZXItPmhlaWdodCAgICAgICAgID0gZnJhZ21lbnQtPmhlaWdodF87Ci0gIGl0ZXItPmR1cmF0aW9uICAgICAgID0gZnJhZ21lbnQtPmR1cmF0aW9uXzsKLSAgaXRlci0+ZGlzcG9zZV9tZXRob2QgPSBmcmFnbWVudC0+ZGlzcG9zZV9tZXRob2RfOwotICBpdGVyLT5jb21wbGV0ZSAgICAgICA9IGZyYWdtZW50LT5jb21wbGV0ZV87CisgIGl0ZXItPnhfb2Zmc2V0ICAgICAgID0gZnJhbWUtPnhfb2Zmc2V0XzsKKyAgaXRlci0+eV9vZmZzZXQgICAgICAgPSBmcmFtZS0+eV9vZmZzZXRfOworICBpdGVyLT53aWR0aCAgICAgICAgICA9IGZyYW1lLT53aWR0aF87CisgIGl0ZXItPmhlaWdodCAgICAgICAgID0gZnJhbWUtPmhlaWdodF87CisgIGl0ZXItPmhhc19hbHBoYSAgICAgID0gZnJhbWUtPmhhc19hbHBoYV87CisgIGl0ZXItPmR1cmF0aW9uICAgICAgID0gZnJhbWUtPmR1cmF0aW9uXzsKKyAgaXRlci0+ZGlzcG9zZV9tZXRob2QgPSBmcmFtZS0+ZGlzcG9zZV9tZXRob2RfOworICBpdGVyLT5ibGVuZF9tZXRob2QgICA9IGZyYW1lLT5ibGVuZF9tZXRob2RfOworICBpdGVyLT5jb21wbGV0ZSAgICAgICA9IGZyYW1lLT5jb21wbGV0ZV87CiAgIGl0ZXItPmZyYWdtZW50LmJ5dGVzID0gcGF5bG9hZDsKICAgaXRlci0+ZnJhZ21lbnQuc2l6ZSAgPSBwYXlsb2FkX3NpemU7Ci0gIC8vIFRPRE8oanplcm4pOiBhZGp1c3Qgb2Zmc2V0cyBmb3IgJ0ZSR00ncyBlbWJlZGRlZCBpbiAnQU5NRidzCiAgIHJldHVybiAxOwogfQogCkBAIC04MzYsMTMgKzg1OCwxMyBAQAogICBmcmFtZSA9IEdldEZyYW1lKGRtdXgsIGZyYW1lX251bSk7CiAgIGlmIChmcmFtZSA9PSBOVUxMKSByZXR1cm4gMDsKIAotICByZXR1cm4gU3ludGhlc2l6ZUZyYW1lKGRtdXgsIGZyYW1lLCAxLCBpdGVyKTsKKyAgcmV0dXJuIFN5bnRoZXNpemVGcmFtZShkbXV4LCBmcmFtZSwgaXRlcik7CiB9CiAKIGludCBXZWJQRGVtdXhHZXRGcmFtZShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lLCBXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKICAgaWYgKGl0ZXIgPT0gTlVMTCkgcmV0dXJuIDA7CiAKLSAgU2JNZW1vcnlTZXQoaXRlciwgMCwgc2l6ZW9mKCppdGVyKSk7CisgIG1lbXNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKICAgaXRlci0+cHJpdmF0ZV8gPSAodm9pZCopZG11eDsKICAgcmV0dXJuIFNldEZyYW1lKGZyYW1lLCBpdGVyKTsKIH0KQEAgLTg1OCwxNyArODgwLDYgQEAKICAgcmV0dXJuIFNldEZyYW1lKGl0ZXItPmZyYW1lX251bSAtIDEsIGl0ZXIpOwogfQogCi1pbnQgV2ViUERlbXV4U2VsZWN0RnJhZ21lbnQoV2ViUEl0ZXJhdG9yKiBpdGVyLCBpbnQgZnJhZ21lbnRfbnVtKSB7Ci0gIGlmIChpdGVyICE9IE5VTEwgJiYgaXRlci0+cHJpdmF0ZV8gIT0gTlVMTCAmJiBmcmFnbWVudF9udW0gPiAwKSB7Ci0gICAgY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXggPSAoV2ViUERlbXV4ZXIqKWl0ZXItPnByaXZhdGVfOwotICAgIGNvbnN0IEZyYW1lKiBjb25zdCBmcmFtZSA9IEdldEZyYW1lKGRtdXgsIGl0ZXItPmZyYW1lX251bSk7Ci0gICAgaWYgKGZyYW1lID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgcmV0dXJuIFN5bnRoZXNpemVGcmFtZShkbXV4LCBmcmFtZSwgZnJhZ21lbnRfbnVtLCBpdGVyKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQogdm9pZCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoV2ViUEl0ZXJhdG9yKiBpdGVyKSB7CiAgICh2b2lkKWl0ZXI7CiB9CkBAIC04ODIsNyArODkzLDcgQEAKICAgaW50IGNvdW50ID0gMDsKICAgZm9yIChjID0gZG11eC0+Y2h1bmtzXzsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dF8pIHsKICAgICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXIgPSBtZW1fYnVmICsgYy0+ZGF0YV8ub2Zmc2V0XzsKLSAgICBpZiAoIVNiTWVtb3J5Q29tcGFyZShoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OworICAgIGlmICghbWVtY21wKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7CiAgIH0KICAgcmV0dXJuIGNvdW50OwogfQpAQCAtODk0LDcgKzkwNSw3IEBACiAgIGludCBjb3VudCA9IDA7CiAgIGZvciAoYyA9IGRtdXgtPmNodW5rc187IGMgIT0gTlVMTDsgYyA9IGMtPm5leHRfKSB7CiAgICAgY29uc3QgdWludDhfdCogY29uc3QgaGVhZGVyID0gbWVtX2J1ZiArIGMtPmRhdGFfLm9mZnNldF87Ci0gICAgaWYgKCFTYk1lbW9yeUNvbXBhcmUoaGVhZGVyLCBmb3VyY2MsIFRBR19TSVpFKSkgKytjb3VudDsKKyAgICBpZiAoIW1lbWNtcChoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OwogICAgIGlmIChjb3VudCA9PSBjaHVua19udW0pIGJyZWFrOwogICB9CiAgIHJldHVybiBjOwpAQCAtOTI3LDcgKzkzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpIHsKICAgaWYgKGl0ZXIgPT0gTlVMTCkgcmV0dXJuIDA7CiAKLSAgU2JNZW1vcnlTZXQoaXRlciwgMCwgc2l6ZW9mKCppdGVyKSk7CisgIG1lbXNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKICAgaXRlci0+cHJpdmF0ZV8gPSAodm9pZCopZG11eDsKICAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgY2h1bmtfbnVtLCBpdGVyKTsKIH0KQEAgLTk1NCw2ICs5NjUsMyBAQAogICAodm9pZClpdGVyOwogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZiYmJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGlid2VicGRlbXV4CitEZXNjcmlwdGlvbjogTGlicmFyeSBmb3IgcGFyc2luZyB0aGUgV2ViUCBncmFwaGljcyBmb3JtYXQgY29udGFpbmVyCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorUmVxdWlyZXM6IGxpYndlYnAgPj0gMC4yLjAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbHdlYnBkZW11eApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5yYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YThiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucmMKQEAgLTAsMCArMSw0MSBAQAorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjaW5jbHVkZSAid2lucmVzLmgiCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiAxLDAsMCwwCisgUFJPRFVDVFZFUlNJT04gMSwwLDAsMAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUsIEluYy4iCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImxpYndlYnBkZW11eCBETEwiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImxpYndlYnBkZW11eC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE4IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGlid2VicGRlbXV4LmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJXZWJQIEltYWdlIERlbXV4ZXIiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MzZkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTYzIEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK25vaW5zdF9MVExJQlJBUklFUyA9Citub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcC5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BfYXZ4Mi5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3Bfc3NlMi5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BkZWNvZGVfc3NlMi5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3Bfc3NlNDEubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcF9uZW9uLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcGRlY29kZV9uZW9uLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcF9tc2EubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwZGVjb2RlX21zYS5sYQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcGRlY29kZS5sYQorZW5kaWYKKworY29tbW9uX0hFQURFUlMgPSAuLi93ZWJwL3R5cGVzLmgKK2NvbW1vbmRpciA9ICQoaW5jbHVkZWRpcikvd2VicAorCitDT01NT05fU09VUkNFUyA9CitDT01NT05fU09VUkNFUyArPSBhbHBoYV9wcm9jZXNzaW5nLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGFscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0gY29tbW9uX3NzZTIuaAorQ09NTU9OX1NPVVJDRVMgKz0gY3B1LmMKK0NPTU1PTl9TT1VSQ0VTICs9IGRlYy5jCitDT01NT05fU09VUkNFUyArPSBkZWNfY2xpcF90YWJsZXMuYworQ09NTU9OX1NPVVJDRVMgKz0gZGVjX21pcHMzMi5jCitDT01NT05fU09VUkNFUyArPSBkZWNfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0gZHNwLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGZpbHRlcnMuYworQ09NTU9OX1NPVVJDRVMgKz0gZmlsdGVyc19taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSBsb3NzbGVzcy5jCitDT01NT05fU09VUkNFUyArPSBsb3NzbGVzcy5oCitDT01NT05fU09VUkNFUyArPSBsb3NzbGVzc19jb21tb24uaAorQ09NTU9OX1NPVVJDRVMgKz0gbG9zc2xlc3NfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0gbWlwc19tYWNyby5oCitDT01NT05fU09VUkNFUyArPSByZXNjYWxlci5jCitDT01NT05fU09VUkNFUyArPSByZXNjYWxlcl9taXBzMzIuYworQ09NTU9OX1NPVVJDRVMgKz0gcmVzY2FsZXJfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0gdXBzYW1wbGluZy5jCitDT01NT05fU09VUkNFUyArPSB1cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHl1di5jCitDT01NT05fU09VUkNFUyArPSB5dXYuaAorQ09NTU9OX1NPVVJDRVMgKz0geXV2X21pcHMzMi5jCitDT01NT05fU09VUkNFUyArPSB5dXZfbWlwc19kc3BfcjIuYworCitFTkNfU09VUkNFUyA9CitFTkNfU09VUkNFUyArPSBjb3N0LmMKK0VOQ19TT1VSQ0VTICs9IGNvc3RfbWlwczMyLmMKK0VOQ19TT1VSQ0VTICs9IGNvc3RfbWlwc19kc3BfcjIuYworRU5DX1NPVVJDRVMgKz0gZW5jLmMKK0VOQ19TT1VSQ0VTICs9IGVuY19taXBzMzIuYworRU5DX1NPVVJDRVMgKz0gZW5jX21pcHNfZHNwX3IyLmMKK0VOQ19TT1VSQ0VTICs9IGxvc3NsZXNzX2VuYy5jCitFTkNfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfbWlwczMyLmMKK0VOQ19TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jCitFTkNfU09VUkNFUyArPSBzc2ltLmMKKworbGlid2VicGRzcF9hdngyX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcF9hdngyX2xhX1NPVVJDRVMgKz0gZW5jX2F2eDIuYworbGlid2VicGRzcF9hdngyX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcF9hdngyX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEFWWDJfRkxBR1MpCisKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX1NPVVJDRVMgKz0gYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX1NPVVJDRVMgKz0gZGVjX3NzZTQxLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfU09VUkNFUyArPSB1cHNhbXBsaW5nX3NzZTQxLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfU09VUkNFUyArPSB5dXZfc3NlNDEuYworbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoU1NFNDFfRkxBR1MpCisKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IGFscGhhX3Byb2Nlc3Npbmdfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSBkZWNfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSBmaWx0ZXJzX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3Nfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSByZXNjYWxlcl9zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IHVwc2FtcGxpbmdfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSB5dXZfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3Bfc3NlMl9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9DRkxBR1MgPSAkKGxpYndlYnBkc3Bfc3NlMl9sYV9DRkxBR1MpCisKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IGFscGhhX3Byb2Nlc3NpbmdfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSBkZWNfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSBmaWx0ZXJzX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSBuZW9uLmgKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IHJlc2NhbGVyX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gdXBzYW1wbGluZ19uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IHl1dl9uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9uZW9uX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX0NGTEFHUyA9ICQobGlid2VicGRzcF9uZW9uX2xhX0NGTEFHUykKKworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IGRlY19tc2EuYworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSBmaWx0ZXJzX21zYS5jCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX21zYS5jCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IG1zYV9tYWNyby5oCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IHJlc2NhbGVyX21zYS5jCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IHVwc2FtcGxpbmdfbXNhLmMKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX21zYV9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX0NGTEFHUyA9ICQobGlid2VicGRzcF9tc2FfbGFfQ0ZMQUdTKQorCitsaWJ3ZWJwZHNwX3NzZTJfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwX3NzZTJfbGFfU09VUkNFUyArPSBjb3N0X3NzZTIuYworbGlid2VicGRzcF9zc2UyX2xhX1NPVVJDRVMgKz0gZW5jX3NzZTIuYworbGlid2VicGRzcF9zc2UyX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX3NzZTIuYworbGlid2VicGRzcF9zc2UyX2xhX1NPVVJDRVMgKz0gc3NpbV9zc2UyLmMKK2xpYndlYnBkc3Bfc3NlMl9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3Bfc3NlMl9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChTU0UyX0ZMQUdTKQorbGlid2VicGRzcF9zc2UyX2xhX0xJQkFERCA9IGxpYndlYnBkc3BkZWNvZGVfc3NlMi5sYQorCitsaWJ3ZWJwZHNwX3NzZTQxX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcF9zc2U0MV9sYV9TT1VSQ0VTICs9IGVuY19zc2U0MS5jCitsaWJ3ZWJwZHNwX3NzZTQxX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX3NzZTQxLmMKK2xpYndlYnBkc3Bfc3NlNDFfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX3NzZTQxX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFNTRTQxX0ZMQUdTKQorbGlid2VicGRzcF9zc2U0MV9sYV9MSUJBREQgPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxLmxhCisKK2xpYndlYnBkc3BfbmVvbl9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BfbmVvbl9sYV9TT1VSQ0VTICs9IGVuY19uZW9uLmMKK2xpYndlYnBkc3BfbmVvbl9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19uZW9uLmMKK2xpYndlYnBkc3BfbmVvbl9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BfbmVvbl9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChORU9OX0ZMQUdTKQorbGlid2VicGRzcF9uZW9uX2xhX0xJQkFERCA9IGxpYndlYnBkc3BkZWNvZGVfbmVvbi5sYQorCitsaWJ3ZWJwZHNwX21zYV9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BfbXNhX2xhX1NPVVJDRVMgKz0gZW5jX21zYS5jCitsaWJ3ZWJwZHNwX21zYV9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19tc2EuYworbGlid2VicGRzcF9tc2FfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX21zYV9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykKK2xpYndlYnBkc3BfbXNhX2xhX0xJQkFERCA9IGxpYndlYnBkc3BkZWNvZGVfbXNhLmxhCisKK2xpYndlYnBkc3BfbGFfU09VUkNFUyA9ICQoQ09NTU9OX1NPVVJDRVMpICQoRU5DX1NPVVJDRVMpCisKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL2RlYy92cDhfZGVjLmgKK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZGVjb2RlLmgKKworbGlid2VicGRzcF9sYV9DUFBGTEFHUyA9CitsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTICs9ICQoQU1fQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTICs9ICQoVVNFX1NXQVBfMTZCSVRfQ1NQKQorbGlid2VicGRzcF9sYV9MREZMQUdTID0gLWxtCitsaWJ3ZWJwZHNwX2xhX0xJQkFERCA9CitsaWJ3ZWJwZHNwX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwX2F2eDIubGEKK2xpYndlYnBkc3BfbGFfTElCQUREICs9IGxpYndlYnBkc3Bfc3NlMi5sYQorbGlid2VicGRzcF9sYV9MSUJBREQgKz0gbGlid2VicGRzcF9zc2U0MS5sYQorbGlid2VicGRzcF9sYV9MSUJBREQgKz0gbGlid2VicGRzcF9uZW9uLmxhCitsaWJ3ZWJwZHNwX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwX21zYS5sYQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX1NPVVJDRVMgPSAkKENPTU1PTl9TT1VSQ0VTKQorCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTERGTEFHUyA9ICQobGlid2VicGRzcF9sYV9MREZMQUdTKQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xJQkFERCA9CisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTElCQUREICs9IGxpYndlYnBkc3BkZWNvZGVfc3NlMi5sYQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxLmxhCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTElCQUREICs9IGxpYndlYnBkc3BkZWNvZGVfbmVvbi5sYQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwZGVjb2RlX21zYS5sYQorZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5ZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5jCkBAIC0wLDAgKzEsNDcyIEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKy8vIFRhYmxlcyBjYW4gYmUgZmFzdGVyIG9uIHNvbWUgcGxhdGZvcm0gYnV0IGluY3VyIHNvbWUgZXh0cmEgYmluYXJ5IHNpemUgKH4yaykuCisjaWYgIWRlZmluZWQoVVNFX1RBQkxFU19GT1JfQUxQSEFfTVVMVCkKKyNkZWZpbmUgVVNFX1RBQkxFU19GT1JfQUxQSEFfTVVMVCAwICAgLy8gQUxURVJOQVRFX0NPREUKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUZJWCAyNCAgICAvLyAyNGJpdCBmaXhlZC1wb2ludCBhcml0aG1ldGljCisjZGVmaW5lIEhBTEYgKCgxdSA8PCBNRklYKSA+PiAxKQorI2RlZmluZSBLSU5WXzI1NSAoKDF1IDw8IE1GSVgpIC8gMjU1dSkKKworc3RhdGljIHVpbnQzMl90IE11bHQodWludDhfdCB4LCB1aW50MzJfdCBtdWx0KSB7CisgIGNvbnN0IHVpbnQzMl90IHYgPSAoeCAqIG11bHQgKyBIQUxGKSA+PiBNRklYOworICBhc3NlcnQodiA8PSAyNTUpOyAgLy8gPC0gMjRiaXQgcHJlY2lzaW9uIGlzIGVub3VnaCB0byBlbnN1cmUgdGhhdC4KKyAgcmV0dXJuIHY7Cit9CisKKyNpZiAoVVNFX1RBQkxFU19GT1JfQUxQSEFfTVVMVCA9PSAxKQorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga011bHRUYWJsZXNbMl1bMjU2XSA9IHsKKyAgeyAgICAvLyAoMjU1dSA8PCBNRklYKSAvIGFscGhhCisgICAgMHgwMDAwMDAwMCwgMHhmZjAwMDAwMCwgMHg3ZjgwMDAwMCwgMHg1NTAwMDAwMCwgMHgzZmMwMDAwMCwgMHgzMzAwMDAwMCwKKyAgICAweDJhODAwMDAwLCAweDI0NmRiNmRiLCAweDFmZTAwMDAwLCAweDFjNTU1NTU1LCAweDE5ODAwMDAwLCAweDE3MmU4YmEyLAorICAgIDB4MTU0MDAwMDAsIDB4MTM5ZDg5ZDgsIDB4MTIzNmRiNmQsIDB4MTEwMDAwMDAsIDB4MGZmMDAwMDAsIDB4MGYwMDAwMDAsCisgICAgMHgwZTJhYWFhYSwgMHgwZDZiY2ExYSwgMHgwY2MwMDAwMCwgMHgwYzI0OTI0OSwgMHgwYjk3NDVkMSwgMHgwYjE2NDJjOCwKKyAgICAweDBhYTAwMDAwLCAweDBhMzMzMzMzLCAweDA5Y2VjNGVjLCAweDA5NzFjNzFjLCAweDA5MWI2ZGI2LCAweDA4Y2IwOGQzLAorICAgIDB4MDg4MDAwMDAsIDB4MDgzOWNlNzMsIDB4MDdmODAwMDAsIDB4MDdiYTJlOGIsIDB4MDc4MDAwMDAsIDB4MDc0OTI0OTIsCisgICAgMHgwNzE1NTU1NSwgMHgwNmU0NTMwNiwgMHgwNmI1ZTUwZCwgMHgwNjg5ZDg5ZCwgMHgwNjYwMDAwMCwgMHgwNjM4MzFmMywKKyAgICAweDA2MTI0OTI0LCAweDA1ZWUyM2I4LCAweDA1Y2JhMmU4LCAweDA1YWFhYWFhLCAweDA1OGIyMTY0LCAweDA1NmNlZmE4LAorICAgIDB4MDU1MDAwMDAsIDB4MDUzNDNlYjEsIDB4MDUxOTk5OTksIDB4MDUwMDAwMDAsIDB4MDRlNzYyNzYsIDB4MDRjZmIyYjcsCisgICAgMHgwNGI4ZTM4ZSwgMHgwNGEyZThiYSwgMHgwNDhkYjZkYiwgMHgwNDc5NDM1ZSwgMHgwNDY1ODQ2OSwgMHgwNDUyNzBkMCwKKyAgICAweDA0NDAwMDAwLCAweDA0MmUyOWY3LCAweDA0MWNlNzM5LCAweDA0MGMzMGMzLCAweDAzZmMwMDAwLCAweDAzZWM0ZWM0LAorICAgIDB4MDNkZDE3NDUsIDB4MDNjZTU0MGYsIDB4MDNjMDAwMDAsIDB4MDNiMjE2NDIsIDB4MDNhNDkyNDksIDB4MDM5NzZmYzYsCisgICAgMHgwMzhhYWFhYSwgMHgwMzdlM2YxZiwgMHgwMzcyMjk4MywgMHgwMzY2NjY2NiwgMHgwMzVhZjI4NiwgMHgwMzRmY2FjZSwKKyAgICAweDAzNDRlYzRlLCAweDAzM2E1NDQwLCAweDAzMzAwMDAwLCAweDAzMjVlZDA5LCAweDAzMWMxOGY5LCAweDAzMTI4MThhLAorICAgIDB4MDMwOTI0OTIsIDB4MDMwMDAwMDAsIDB4MDJmNzExZGMsIDB4MDJlZTU4NDYsIDB4MDJlNWQxNzQsIDB4MDJkZDdiYWYsCisgICAgMHgwMmQ1NTU1NSwgMHgwMmNkNWNkNSwgMHgwMmM1OTBiMiwgMHgwMmJkZWY3YiwgMHgwMmI2NzdkNCwgMHgwMmFmMjg2YiwKKyAgICAweDAyYTgwMDAwLCAweDAyYTBmZDVjLCAweDAyOWExZjU4LCAweDAyOTM2NGQ5LCAweDAyOGNjY2NjLCAweDAyODY1NjJkLAorICAgIDB4MDI4MDAwMDAsIDB4MDI3OWM5NTIsIDB4MDI3M2IxM2IsIDB4MDI2ZGI2ZGIsIDB4MDI2N2Q5NWIsIDB4MDI2MjE3ZWMsCisgICAgMHgwMjVjNzFjNywgMHgwMjU2ZTYyYSwgMHgwMjUxNzQ1ZCwgMHgwMjRjMWJhYywgMHgwMjQ2ZGI2ZCwgMHgwMjQxYjJmOSwKKyAgICAweDAyM2NhMWFmLCAweDAyMzdhNmY0LCAweDAyMzJjMjM0LCAweDAyMmRmMmRmLCAweDAyMjkzODY4LCAweDAyMjQ5MjQ5LAorICAgIDB4MDIyMDAwMDAsIDB4MDIxYjgxMGUsIDB4MDIxNzE0ZmIsIDB4MDIxMmJiNTEsIDB4MDIwZTczOWMsIDB4MDIwYTNkNzAsCisgICAgMHgwMjA2MTg2MSwgMHgwMjAyMDQwOCwgMHgwMWZlMDAwMCwgMHgwMWZhMGJlOCwgMHgwMWY2Mjc2MiwgMHgwMWYyNTIxMywKKyAgICAweDAxZWU4YmEyLCAweDAxZWFkM2JhLCAweDAxZTcyYTA3LCAweDAxZTM4ZTM4LCAweDAxZTAwMDAwLCAweDAxZGM3ZjEwLAorICAgIDB4MDFkOTBiMjEsIDB4MDFkNWEzZTksIDB4MDFkMjQ5MjQsIDB4MDFjZWZhOGQsIDB4MDFjYmI3ZTMsIDB4MDFjODgwZTUsCisgICAgMHgwMWM1NTU1NSwgMHgwMWMyMzRmNywgMHgwMWJmMWY4ZiwgMHgwMWJjMTRlNSwgMHgwMWI5MTRjMSwgMHgwMWI2MWVlZCwKKyAgICAweDAxYjMzMzMzLCAweDAxYjA1MTYwLCAweDAxYWQ3OTQzLCAweDAxYWFhYWFhLCAweDAxYTdlNTY3LCAweDAxYTUyOTRhLAorICAgIDB4MDFhMjc2MjcsIDB4MDE5ZmNiZDIsIDB4MDE5ZDJhMjAsIDB4MDE5YTkwZTcsIDB4MDE5ODAwMDAsIDB4MDE5NTc3NDEsCisgICAgMHgwMTkyZjY4NCwgMHgwMTkwN2RhNCwgMHgwMThlMGM3YywgMHgwMThiYTJlOCwgMHgwMTg5NDBjNSwgMHgwMTg2ZTVmMCwKKyAgICAweDAxODQ5MjQ5LCAweDAxODI0NWFlLCAweDAxODAwMDAwLCAweDAxN2RjMTFmLCAweDAxN2I4OGVlLCAweDAxNzk1NzRlLAorICAgIDB4MDE3NzJjMjMsIDB4MDE3NTA3NTAsIDB4MDE3MmU4YmEsIDB4MDE3MGQwNDUsIDB4MDE2ZWJkZDcsIDB4MDE2Y2IxNTcsCisgICAgMHgwMTZhYWFhYSwgMHgwMTY4YTliOSwgMHgwMTY2YWU2YSwgMHgwMTY0YjhhNywgMHgwMTYyYzg1OSwgMHgwMTYwZGQ2NywKKyAgICAweDAxNWVmN2JkLCAweDAxNWQxNzQ1LCAweDAxNWIzYmVhLCAweDAxNTk2NTk2LCAweDAxNTc5NDM1LCAweDAxNTVjN2I0LAorICAgIDB4MDE1NDAwMDAsIDB4MDE1MjNkMDMsIDB4MDE1MDdlYWUsIDB4MDE0ZWM0ZWMsIDB4MDE0ZDBmYWMsIDB4MDE0YjVlZGMsCisgICAgMHgwMTQ5YjI2YywgMHgwMTQ4MGE0YSwgMHgwMTQ2NjY2NiwgMHgwMTQ0YzZhZiwgMHgwMTQzMmIxNiwgMHgwMTQxOTM4YiwKKyAgICAweDAxNDAwMDAwLCAweDAxM2U3MDYzLCAweDAxM2NlNGE5LCAweDAxM2I1Y2MwLCAweDAxMzlkODlkLCAweDAxMzg1ODMwLAorICAgIDB4MDEzNmRiNmQsIDB4MDEzNTYyNDYsIDB4MDEzM2VjYWQsIDB4MDEzMjdhOTcsIDB4MDEzMTBiZjYsIDB4MDEyZmEwYmUsCisgICAgMHgwMTJlMzhlMywgMHgwMTJjZDQ1OSwgMHgwMTJiNzMxNSwgMHgwMTJhMTUwYSwgMHgwMTI4YmEyZSwgMHgwMTI3NjI3NiwKKyAgICAweDAxMjYwZGQ2LCAweDAxMjRiYzQ0LCAweDAxMjM2ZGI2LCAweDAxMjIyMjIyLCAweDAxMjBkOTdjLCAweDAxMWY5M2JjLAorICAgIDB4MDExZTUwZDcsIDB4MDExZDEwYzQsIDB4MDExYmQzN2EsIDB4MDExYTk4ZWYsIDB4MDExOTYxMWEsIDB4MDExODJiZjIsCisgICAgMHgwMTE2Zjk2ZiwgMHgwMTE1Yzk4OCwgMHgwMTE0OWMzNCwgMHgwMTEzNzE2YSwgMHgwMTEyNDkyNCwgMHgwMTExMjM1OCwKKyAgICAweDAxMTAwMDAwLCAweDAxMGVkZjEyLCAweDAxMGRjMDg3LCAweDAxMGNhNDU4LCAweDAxMGI4YTdkLCAweDAxMGE3MmYwLAorICAgIDB4MDEwOTVkYTgsIDB4MDEwODRhOWYsIDB4MDEwNzM5Y2UsIDB4MDEwNjJiMmUsIDB4MDEwNTFlYjgsIDB4MDEwNDE0NjUsCisgICAgMHgwMTAzMGMzMCwgMHgwMTAyMDYxMiwgMHgwMTAxMDIwNCwgMHgwMTAwMDAwMCB9LAorICB7ICAgLy8gYWxwaGEgKiBLSU5WXzI1NQorICAgIDB4MDAwMDAwMDAsIDB4MDAwMTAxMDEsIDB4MDAwMjAyMDIsIDB4MDAwMzAzMDMsIDB4MDAwNDA0MDQsIDB4MDAwNTA1MDUsCisgICAgMHgwMDA2MDYwNiwgMHgwMDA3MDcwNywgMHgwMDA4MDgwOCwgMHgwMDA5MDkwOSwgMHgwMDBhMGEwYSwgMHgwMDBiMGIwYiwKKyAgICAweDAwMGMwYzBjLCAweDAwMGQwZDBkLCAweDAwMGUwZTBlLCAweDAwMGYwZjBmLCAweDAwMTAxMDEwLCAweDAwMTExMTExLAorICAgIDB4MDAxMjEyMTIsIDB4MDAxMzEzMTMsIDB4MDAxNDE0MTQsIDB4MDAxNTE1MTUsIDB4MDAxNjE2MTYsIDB4MDAxNzE3MTcsCisgICAgMHgwMDE4MTgxOCwgMHgwMDE5MTkxOSwgMHgwMDFhMWExYSwgMHgwMDFiMWIxYiwgMHgwMDFjMWMxYywgMHgwMDFkMWQxZCwKKyAgICAweDAwMWUxZTFlLCAweDAwMWYxZjFmLCAweDAwMjAyMDIwLCAweDAwMjEyMTIxLCAweDAwMjIyMjIyLCAweDAwMjMyMzIzLAorICAgIDB4MDAyNDI0MjQsIDB4MDAyNTI1MjUsIDB4MDAyNjI2MjYsIDB4MDAyNzI3MjcsIDB4MDAyODI4MjgsIDB4MDAyOTI5MjksCisgICAgMHgwMDJhMmEyYSwgMHgwMDJiMmIyYiwgMHgwMDJjMmMyYywgMHgwMDJkMmQyZCwgMHgwMDJlMmUyZSwgMHgwMDJmMmYyZiwKKyAgICAweDAwMzAzMDMwLCAweDAwMzEzMTMxLCAweDAwMzIzMjMyLCAweDAwMzMzMzMzLCAweDAwMzQzNDM0LCAweDAwMzUzNTM1LAorICAgIDB4MDAzNjM2MzYsIDB4MDAzNzM3MzcsIDB4MDAzODM4MzgsIDB4MDAzOTM5MzksIDB4MDAzYTNhM2EsIDB4MDAzYjNiM2IsCisgICAgMHgwMDNjM2MzYywgMHgwMDNkM2QzZCwgMHgwMDNlM2UzZSwgMHgwMDNmM2YzZiwgMHgwMDQwNDA0MCwgMHgwMDQxNDE0MSwKKyAgICAweDAwNDI0MjQyLCAweDAwNDM0MzQzLCAweDAwNDQ0NDQ0LCAweDAwNDU0NTQ1LCAweDAwNDY0NjQ2LCAweDAwNDc0NzQ3LAorICAgIDB4MDA0ODQ4NDgsIDB4MDA0OTQ5NDksIDB4MDA0YTRhNGEsIDB4MDA0YjRiNGIsIDB4MDA0YzRjNGMsIDB4MDA0ZDRkNGQsCisgICAgMHgwMDRlNGU0ZSwgMHgwMDRmNGY0ZiwgMHgwMDUwNTA1MCwgMHgwMDUxNTE1MSwgMHgwMDUyNTI1MiwgMHgwMDUzNTM1MywKKyAgICAweDAwNTQ1NDU0LCAweDAwNTU1NTU1LCAweDAwNTY1NjU2LCAweDAwNTc1NzU3LCAweDAwNTg1ODU4LCAweDAwNTk1OTU5LAorICAgIDB4MDA1YTVhNWEsIDB4MDA1YjViNWIsIDB4MDA1YzVjNWMsIDB4MDA1ZDVkNWQsIDB4MDA1ZTVlNWUsIDB4MDA1ZjVmNWYsCisgICAgMHgwMDYwNjA2MCwgMHgwMDYxNjE2MSwgMHgwMDYyNjI2MiwgMHgwMDYzNjM2MywgMHgwMDY0NjQ2NCwgMHgwMDY1NjU2NSwKKyAgICAweDAwNjY2NjY2LCAweDAwNjc2NzY3LCAweDAwNjg2ODY4LCAweDAwNjk2OTY5LCAweDAwNmE2YTZhLCAweDAwNmI2YjZiLAorICAgIDB4MDA2YzZjNmMsIDB4MDA2ZDZkNmQsIDB4MDA2ZTZlNmUsIDB4MDA2ZjZmNmYsIDB4MDA3MDcwNzAsIDB4MDA3MTcxNzEsCisgICAgMHgwMDcyNzI3MiwgMHgwMDczNzM3MywgMHgwMDc0NzQ3NCwgMHgwMDc1NzU3NSwgMHgwMDc2NzY3NiwgMHgwMDc3Nzc3NywKKyAgICAweDAwNzg3ODc4LCAweDAwNzk3OTc5LCAweDAwN2E3YTdhLCAweDAwN2I3YjdiLCAweDAwN2M3YzdjLCAweDAwN2Q3ZDdkLAorICAgIDB4MDA3ZTdlN2UsIDB4MDA3ZjdmN2YsIDB4MDA4MDgwODAsIDB4MDA4MTgxODEsIDB4MDA4MjgyODIsIDB4MDA4MzgzODMsCisgICAgMHgwMDg0ODQ4NCwgMHgwMDg1ODU4NSwgMHgwMDg2ODY4NiwgMHgwMDg3ODc4NywgMHgwMDg4ODg4OCwgMHgwMDg5ODk4OSwKKyAgICAweDAwOGE4YThhLCAweDAwOGI4YjhiLCAweDAwOGM4YzhjLCAweDAwOGQ4ZDhkLCAweDAwOGU4ZThlLCAweDAwOGY4ZjhmLAorICAgIDB4MDA5MDkwOTAsIDB4MDA5MTkxOTEsIDB4MDA5MjkyOTIsIDB4MDA5MzkzOTMsIDB4MDA5NDk0OTQsIDB4MDA5NTk1OTUsCisgICAgMHgwMDk2OTY5NiwgMHgwMDk3OTc5NywgMHgwMDk4OTg5OCwgMHgwMDk5OTk5OSwgMHgwMDlhOWE5YSwgMHgwMDliOWI5YiwKKyAgICAweDAwOWM5YzljLCAweDAwOWQ5ZDlkLCAweDAwOWU5ZTllLCAweDAwOWY5ZjlmLCAweDAwYTBhMGEwLCAweDAwYTFhMWExLAorICAgIDB4MDBhMmEyYTIsIDB4MDBhM2EzYTMsIDB4MDBhNGE0YTQsIDB4MDBhNWE1YTUsIDB4MDBhNmE2YTYsIDB4MDBhN2E3YTcsCisgICAgMHgwMGE4YThhOCwgMHgwMGE5YTlhOSwgMHgwMGFhYWFhYSwgMHgwMGFiYWJhYiwgMHgwMGFjYWNhYywgMHgwMGFkYWRhZCwKKyAgICAweDAwYWVhZWFlLCAweDAwYWZhZmFmLCAweDAwYjBiMGIwLCAweDAwYjFiMWIxLCAweDAwYjJiMmIyLCAweDAwYjNiM2IzLAorICAgIDB4MDBiNGI0YjQsIDB4MDBiNWI1YjUsIDB4MDBiNmI2YjYsIDB4MDBiN2I3YjcsIDB4MDBiOGI4YjgsIDB4MDBiOWI5YjksCisgICAgMHgwMGJhYmFiYSwgMHgwMGJiYmJiYiwgMHgwMGJjYmNiYywgMHgwMGJkYmRiZCwgMHgwMGJlYmViZSwgMHgwMGJmYmZiZiwKKyAgICAweDAwYzBjMGMwLCAweDAwYzFjMWMxLCAweDAwYzJjMmMyLCAweDAwYzNjM2MzLCAweDAwYzRjNGM0LCAweDAwYzVjNWM1LAorICAgIDB4MDBjNmM2YzYsIDB4MDBjN2M3YzcsIDB4MDBjOGM4YzgsIDB4MDBjOWM5YzksIDB4MDBjYWNhY2EsIDB4MDBjYmNiY2IsCisgICAgMHgwMGNjY2NjYywgMHgwMGNkY2RjZCwgMHgwMGNlY2VjZSwgMHgwMGNmY2ZjZiwgMHgwMGQwZDBkMCwgMHgwMGQxZDFkMSwKKyAgICAweDAwZDJkMmQyLCAweDAwZDNkM2QzLCAweDAwZDRkNGQ0LCAweDAwZDVkNWQ1LCAweDAwZDZkNmQ2LCAweDAwZDdkN2Q3LAorICAgIDB4MDBkOGQ4ZDgsIDB4MDBkOWQ5ZDksIDB4MDBkYWRhZGEsIDB4MDBkYmRiZGIsIDB4MDBkY2RjZGMsIDB4MDBkZGRkZGQsCisgICAgMHgwMGRlZGVkZSwgMHgwMGRmZGZkZiwgMHgwMGUwZTBlMCwgMHgwMGUxZTFlMSwgMHgwMGUyZTJlMiwgMHgwMGUzZTNlMywKKyAgICAweDAwZTRlNGU0LCAweDAwZTVlNWU1LCAweDAwZTZlNmU2LCAweDAwZTdlN2U3LCAweDAwZThlOGU4LCAweDAwZTllOWU5LAorICAgIDB4MDBlYWVhZWEsIDB4MDBlYmViZWIsIDB4MDBlY2VjZWMsIDB4MDBlZGVkZWQsIDB4MDBlZWVlZWUsIDB4MDBlZmVmZWYsCisgICAgMHgwMGYwZjBmMCwgMHgwMGYxZjFmMSwgMHgwMGYyZjJmMiwgMHgwMGYzZjNmMywgMHgwMGY0ZjRmNCwgMHgwMGY1ZjVmNSwKKyAgICAweDAwZjZmNmY2LCAweDAwZjdmN2Y3LCAweDAwZjhmOGY4LCAweDAwZjlmOWY5LCAweDAwZmFmYWZhLCAweDAwZmJmYmZiLAorICAgIDB4MDBmY2ZjZmMsIDB4MDBmZGZkZmQsIDB4MDBmZWZlZmUsIDB4MDBmZmZmZmYgfQorfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldFNjYWxlKHVpbnQzMl90IGEsIGludCBpbnZlcnNlKSB7CisgIHJldHVybiBrTXVsdFRhYmxlc1shaW52ZXJzZV1bYV07Cit9CisKKyNlbHNlCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRTY2FsZSh1aW50MzJfdCBhLCBpbnQgaW52ZXJzZSkgeworICByZXR1cm4gaW52ZXJzZSA/ICgyNTV1IDw8IE1GSVgpIC8gYSA6IGEgKiBLSU5WXzI1NTsKK30KKworI2VuZGlmICAvLyBVU0VfVEFCTEVTX0ZPUl9BTFBIQV9NVUxUCisKK3ZvaWQgV2ViUE11bHRBUkdCUm93X0ModWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gcHRyW3hdOworICAgIGlmIChhcmdiIDwgMHhmZjAwMDAwMHUpIHsgICAgICAvLyBhbHBoYSA8IDI1NQorICAgICAgaWYgKGFyZ2IgPD0gMHgwMGZmZmZmZnUpIHsgICAvLyBhbHBoYSA9PSAwCisgICAgICAgIHB0clt4XSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gR2V0U2NhbGUoYWxwaGEsIGludmVyc2UpOworICAgICAgICB1aW50MzJfdCBvdXQgPSBhcmdiICYgMHhmZjAwMDAwMHU7CisgICAgICAgIG91dCB8PSBNdWx0KGFyZ2IgPj4gIDAsIHNjYWxlKSA8PCAgMDsKKyAgICAgICAgb3V0IHw9IE11bHQoYXJnYiA+PiAgOCwgc2NhbGUpIDw8ICA4OworICAgICAgICBvdXQgfD0gTXVsdChhcmdiID4+IDE2LCBzY2FsZSkgPDwgMTY7CisgICAgICAgIHB0clt4XSA9IG91dDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBXZWJQTXVsdFJvd19DKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gYWxwaGFbeF07CisgICAgaWYgKGEgIT0gMjU1KSB7CisgICAgICBpZiAoYSA9PSAwKSB7CisgICAgICAgIHB0clt4XSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IEdldFNjYWxlKGEsIGludmVyc2UpOworICAgICAgICBwdHJbeF0gPSBNdWx0KHB0clt4XSwgc2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjdW5kZWYgS0lOVl8yNTUKKyN1bmRlZiBIQUxGCisjdW5kZWYgTUZJWAorCit2b2lkICgqV2ViUE11bHRBUkdCUm93KSh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKK3ZvaWQgKCpXZWJQTXVsdFJvdykodWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmljIHBlci1wbGFuZSBjYWxscworCit2b2lkIFdlYlBNdWx0QVJHQlJvd3ModWludDhfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSkgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IG51bV9yb3dzOyArK24pIHsKKyAgICBXZWJQTXVsdEFSR0JSb3coKHVpbnQzMl90KilwdHIsIHdpZHRoLCBpbnZlcnNlKTsKKyAgICBwdHIgKz0gc3RyaWRlOworICB9Cit9CisKK3ZvaWQgV2ViUE11bHRSb3dzKHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgbnVtX3Jvd3MsIGludCBpbnZlcnNlKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3Jvd3M7ICsrbikgeworICAgIFdlYlBNdWx0Um93KHB0ciwgYWxwaGEsIHdpZHRoLCBpbnZlcnNlKTsKKyAgICBwdHIgKz0gc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlbXVsdGlwbGllZCBtb2RlcworCisvLyBub24gZGl0aGVyZWQtbW9kZXMKKworLy8gKHggKiBhICogMzI4OTcpID4+IDIzIGlzIGJpdC13aXNlIGVxdWl2YWxlbnQgdG8gKGludCkoeCAqIGEgLyAyNTUuKQorLy8gZm9yIGFsbCA4Yml0IHggb3IgYS4gRm9yIGJpdC13aXNlIGVxdWl2YWxlbmNlIHRvIChpbnQpKHggKiBhIC8gMjU1LiArIC41KSwKKy8vIG9uZSBjYW4gdXNlIGluc3RlYWQ6ICh4ICogYSAqIDY1NzkzICsgKDEgPDwgMjMpKSA+PiAyNAorI2lmIDEgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LikKKyNkZWZpbmUgTVVMVElQTElFUihhKSAgICgoYSkgKiAzMjg5N1UpCisjZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pKSA+PiAyMykKKyNlbHNlICAgICAvLyAoaW50KSh4ICogYSAvIDI1NS4gKyAuNSkKKyNkZWZpbmUgTVVMVElQTElFUihhKSAoKGEpICogNjU3OTNVKQorI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSArICgxVSA8PCAyMykpID4+IDI0KQorI2VuZGlmCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHlfQyh1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICB1aW50OF90KiBjb25zdCByZ2IgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMSA6IDApOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhID0gYWxwaGFbNCAqIGldOworICAgICAgaWYgKGEgIT0gMHhmZikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKKyAgICAgICAgcmdiWzQgKiBpICsgMF0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAwXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDFdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMV0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAyXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDJdLCBtdWx0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorI3VuZGVmIE1VTFRJUExJRVIKKyN1bmRlZiBQUkVNVUxUSVBMWQorCisvLyByZ2JBNDQ0NAorCisjZGVmaW5lIE1VTFRJUExJRVIoYSkgICgoYSkgKiAweDExMTEpICAgIC8vIDB4MTExMSB+PSAoMSA8PCAxNikgLyAxNQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBkaXRoZXJfaGkodWludDhfdCB4KSB7CisgIHJldHVybiAoeCAmIDB4ZjApIHwgKHggPj4gNCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9sbyh1aW50OF90IHgpIHsKKyAgcmV0dXJuICh4ICYgMHgwZikgfCAoeCA8PCA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgbXVsdGlwbHkodWludDhfdCB4LCB1aW50MzJfdCBtKSB7CisgIHJldHVybiAoeCAqIG0pID4+IDE2OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBcHBseUFscGhhTXVsdGlwbHk0NDQ0X0ModWludDhfdCogcmdiYTQ0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ19ieXRlX3BvcyAvKiAwIG9yIDEgKi8pIHsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCByZyA9IHJnYmE0NDQ0WzIgKiBpICsgcmdfYnl0ZV9wb3NdOworICAgICAgY29uc3QgdWludDMyX3QgYmEgPSByZ2JhNDQ0NFsyICogaSArIChyZ19ieXRlX3BvcyBeIDEpXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYSA9IGJhICYgMHgwZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IG11bHQgPSBNVUxUSVBMSUVSKGEpOworICAgICAgY29uc3QgdWludDhfdCByID0gbXVsdGlwbHkoZGl0aGVyX2hpKHJnKSwgbXVsdCk7CisgICAgICBjb25zdCB1aW50OF90IGcgPSBtdWx0aXBseShkaXRoZXJfbG8ocmcpLCBtdWx0KTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IG11bHRpcGx5KGRpdGhlcl9oaShiYSksIG11bHQpOworICAgICAgcmdiYTQ0NDRbMiAqIGkgKyByZ19ieXRlX3Bvc10gPSAociAmIDB4ZjApIHwgKChnID4+IDQpICYgMHgwZik7CisgICAgICByZ2JhNDQ0NFsyICogaSArIChyZ19ieXRlX3BvcyBeIDEpXSA9IChiICYgMHhmMCkgfCBhOworICAgIH0KKyAgICByZ2JhNDQ0NCArPSBzdHJpZGU7CisgIH0KK30KKyN1bmRlZiBNVUxUSVBMSUVSCisKK3N0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseV8xNmJfQyh1aW50OF90KiByZ2JhNDQ0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICBBcHBseUFscGhhTXVsdGlwbHk0NDQ0X0MocmdiYTQ0NDQsIHcsIGgsIHN0cmlkZSwgMSk7CisjZWxzZQorICBBcHBseUFscGhhTXVsdGlwbHk0NDQ0X0MocmdiYTQ0NDQsIHcsIGgsIHN0cmlkZSwgMCk7CisjZW5kaWYKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBpbnQgRGlzcGF0Y2hBbHBoYV9DKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZjsKKyAgaW50IGksIGo7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYWxwaGFbaV07CisgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KKworICByZXR1cm4gKGFscGhhX21hc2sgIT0gMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIERpc3BhdGNoQWxwaGFUb0dyZWVuX0MoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBkc3RbaV0gPSBhbHBoYVtpXSA8PCA4OyAgLy8gbGVhdmUgQS9SL0IgY2hhbm5lbHMgemVybydkLgorICAgIH0KKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KK30KKworc3RhdGljIGludCBFeHRyYWN0QWxwaGFfQyhjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUpIHsKKyAgdWludDhfdCBhbHBoYV9tYXNrID0gMHhmZjsKKyAgaW50IGksIGo7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYWxwaGFfdmFsdWUgPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhW2ldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorICByZXR1cm4gKGFscGhhX21hc2sgPT0gMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIEV4dHJhY3RHcmVlbl9DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiBhbHBoYSwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIGFscGhhW2ldID0gYXJnYltpXSA+PiA4OworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgSGFzQWxwaGE4Yl9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCkgeworICB3aGlsZSAobGVuZ3RoLS0gPiAwKSBpZiAoKnNyYysrICE9IDB4ZmYpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBIYXNBbHBoYTMyYl9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgbGVuZ3RoLS0gPiAwOyB4ICs9IDQpIGlmIChzcmNbeF0gIT0gMHhmZikgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIGNoYW5uZWwgbWFuaXB1bGF0aW9ucy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE1ha2VBUkdCMzIoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgcmV0dXJuICgoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKK30KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorc3RhdGljIHZvaWQgUGFja0FSR0JfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiLCBpbnQgbGVuLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBvdXRbaV0gPSBNYWtlQVJHQjMyKGFbNCAqIGldLCByWzQgKiBpXSwgZ1s0ICogaV0sIGJbNCAqIGldKTsKKyAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFBhY2tSR0JfQyhjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzdGVwLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpLCBvZmZzZXQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBvdXRbaV0gPSBNYWtlQVJHQjMyKDB4ZmYsIHJbb2Zmc2V0XSwgZ1tvZmZzZXRdLCBiW29mZnNldF0pOworICAgIG9mZnNldCArPSBzdGVwOworICB9Cit9CisKK3ZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5KSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgaW50KTsKK3ZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCkodWludDhfdCosIGludCwgaW50LCBpbnQpOworaW50ICgqV2ViUERpc3BhdGNoQWxwaGEpKGNvbnN0IHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCB1aW50OF90KiwgaW50KTsKK3ZvaWQgKCpXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4pKGNvbnN0IHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCB1aW50MzJfdCosIGludCk7CitpbnQgKCpXZWJQRXh0cmFjdEFscGhhKShjb25zdCB1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDhfdCosIGludCk7Cit2b2lkICgqV2ViUEV4dHJhY3RHcmVlbikoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIGFscGhhLCBpbnQgc2l6ZSk7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCit2b2lkICgqV2ViUFBhY2tBUkdCKShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYiwgaW50LCB1aW50MzJfdCopOworI2VuZGlmCit2b2lkICgqV2ViUFBhY2tSR0IpKGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzdGVwLCB1aW50MzJfdCogb3V0KTsKKworaW50ICgqV2ViUEhhc0FscGhhOGIpKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCk7CitpbnQgKCpXZWJQSGFzQWxwaGEzMmIpKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0IGZ1bmN0aW9uCisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTkVPTih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKSB7CisgIFdlYlBNdWx0QVJHQlJvdyA9IFdlYlBNdWx0QVJHQlJvd19DOworICBXZWJQTXVsdFJvdyA9IFdlYlBNdWx0Um93X0M7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0ID0gQXBwbHlBbHBoYU11bHRpcGx5XzE2Yl9DOworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgIFdlYlBQYWNrQVJHQiA9IFBhY2tBUkdCX0M7CisjZW5kaWYKKyAgV2ViUFBhY2tSR0IgPSBQYWNrUkdCX0M7CisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5ID0gQXBwbHlBbHBoYU11bHRpcGx5X0M7CisgIFdlYlBEaXNwYXRjaEFscGhhID0gRGlzcGF0Y2hBbHBoYV9DOworICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4gPSBEaXNwYXRjaEFscGhhVG9HcmVlbl9DOworICBXZWJQRXh0cmFjdEFscGhhID0gRXh0cmFjdEFscGhhX0M7CisgIFdlYlBFeHRyYWN0R3JlZW4gPSBFeHRyYWN0R3JlZW5fQzsKKyNlbmRpZgorCisgIFdlYlBIYXNBbHBoYThiID0gSGFzQWxwaGE4Yl9DOworICBXZWJQSGFzQWxwaGEzMmIgPSBIYXNBbHBoYTMyYl9DOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSgpOworICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoV2ViUE11bHRBUkdCUm93ICE9IE5VTEwpOworICBhc3NlcnQoV2ViUE11bHRSb3cgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQXBwbHlBbHBoYU11bHRpcGx5ICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRGlzcGF0Y2hBbHBoYSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBFeHRyYWN0QWxwaGEgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRXh0cmFjdEdyZWVuICE9IE5VTEwpOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICBhc3NlcnQoV2ViUFBhY2tBUkdCICE9IE5VTEwpOworI2VuZGlmCisgIGFzc2VydChXZWJQUGFja1JHQiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBIYXNBbHBoYThiICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEhhc0FscGhhMzJiICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkwZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwyMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbC4KKy8vCisvLyBBdXRob3Iocyk6IEJyYW5pbWlyIFZhc2ljIChicmFuaW1pci52YXNpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBEam9yZGplIFBlc3V0ICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKK3N0YXRpYyBpbnQgRGlzcGF0Y2hBbHBoYV9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZmZmZmZmZjsKKyAgaW50IGksIGosIHRlbXAwOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIHVpbnQ4X3QqIHBkc3QgPSBkc3Q7CisgICAgY29uc3QgdWludDhfdCogcGFscGhhID0gYWxwaGE7CisgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAyKTsgKytpKSB7CisgICAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ1bHcgICAgJVt0ZW1wMF0sICAgICAgMCglW3BhbHBoYV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwYWxwaGFdLCAgICAgJVtwYWxwaGFdLCAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwZHN0XSwgICAgICAgJVtwZHN0XSwgICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMF0sICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMF0sICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMF0sICAgICAgMjQgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMF0sICAgICAgLTE2KCVbcGRzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMV0sICAgICAgLTEyKCVbcGRzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMl0sICAgICAgLTgoJVtwZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wM10sICAgICAgLTQoJVtwZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbcGFscGhhXSIrciIocGFscGhhKSwgW3Bkc3RdIityIihwZHN0KSwKKyAgICAgICAgICBbYWxwaGFfbWFza10iK3IiKGFscGhhX21hc2spCisgICAgICAgIDoKKyAgICAgICAgOiAibWVtb3J5IgorICAgICAgKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoICYgMyk7ICsraSkgeworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsYnUgICAgJVt0ZW1wMF0sICAgICAgMCglW3BhbHBoYV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwYWxwaGFdLCAgICAgJVtwYWxwaGFdLCAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMF0sICAgICAgMCglW3Bkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwZHN0XSwgICAgICAgJVtwZHN0XSwgICAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3BhbHBoYV0iK3IiKHBhbHBoYSksIFtwZHN0XSIrciIocGRzdCksCisgICAgICAgICAgW2FscGhhX21hc2tdIityIihhbHBoYV9tYXNrKQorICAgICAgICA6CisgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICk7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJleHQgICAgJVt0ZW1wMF0sICAgICAgJVthbHBoYV9tYXNrXSwgMCwgMTYgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgICJleHQgICAgJVt0ZW1wMF0sICAgICAgJVthbHBoYV9tYXNrXSwgMCwgOCAgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgOCAgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW2FscGhhX21hc2tdIityIihhbHBoYV9tYXNrKQorICAgIDoKKyAgKTsKKworICByZXR1cm4gKGFscGhhX21hc2sgIT0gMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIE11bHRBUkdCUm93X01JUFNkc3BSMih1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UpIHsKKyAgaW50IHg7CisgIGNvbnN0IHVpbnQzMl90IGNfMDBmZmZmZmYgPSAweDAwZmZmZmZmdTsKKyAgY29uc3QgdWludDMyX3QgY19mZjAwMDAwMCA9IDB4ZmYwMDAwMDB1OworICBjb25zdCB1aW50MzJfdCBjXzgwMDAwMDAgID0gMHgwMDgwMDAwMHU7CisgIGNvbnN0IHVpbnQzMl90IGNfODAwMDA4MCAgPSAweDAwODAwMDgwdTsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gcHRyW3hdOworICAgIGlmIChhcmdiIDwgMHhmZjAwMDAwMHUpIHsgICAgICAvLyBhbHBoYSA8IDI1NQorICAgICAgaWYgKGFyZ2IgPD0gMHgwMGZmZmZmZnUpIHsgICAvLyBhbHBoYSA9PSAwCisgICAgICAgIHB0clt4XSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGFscGhhOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAic3JsICAgICAgICAgICVbYWxwaGFdLCAgICVbYXJnYl0sICAgICAgIDI0ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW2FscGhhXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJhbmQgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICAgJVtjXzAwZmZmZmZmXSAgICAgXG5cdCIKKyAgICAgICAgICAiYmVxeiAgICAgICAgICVbaW52ZXJzZV0sIDBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImRpdnUgICAgICAgICAkemVybywgICAgICAlW2NfZmYwMDAwMDBdLCAlW2FscGhhXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJtZmxvICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImFuZGkgICAgICAgICAlW3RlbXAxXSwgICAlW2FyZ2JdLCAgICAgICAweGZmICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJleHQgICAgICAgICAgJVt0ZW1wMl0sICAgJVthcmdiXSwgICAgICAgOCwgICAgICAgICAgICAgOCAgXG5cdCIKKyAgICAgICAgICAiZXh0ICAgICAgICAgICVbdGVtcDNdLCAgICVbYXJnYl0sICAgICAgIDE2LCAgICAgICAgICAgIDggIFxuXHQiCisgICAgICAgICAgIm11bCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJtdWwgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAibXVsICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICVbdGVtcDBdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgInByZWNycS5waC53ICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgICAlW3RlbXAxXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJhZGR1ICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgJVtjXzgwMDAwMDBdICAgICAgXG5cdCIKKyAgICAgICAgICAiYWRkdSAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICVbY184MDAwMDgwXSAgICAgIFxuXHQiCisgICAgICAgICAgInByZWNycS5waC53ICAlW3RlbXAzXSwgICAlW2FyZ2JdLCAgICAgICAlW3RlbXAzXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJwcmVjcnEucWIucGggJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbYWxwaGFdIj0mciIoYWxwaGEpCisgICAgICAgICAgOiBbaW52ZXJzZV0iciIoaW52ZXJzZSksIFtjXzAwZmZmZmZmXSJyIihjXzAwZmZmZmZmKSwKKyAgICAgICAgICAgIFtjXzgwMDAwMDBdInIiKGNfODAwMDAwMCksIFtjXzgwMDAwODBdInIiKGNfODAwMDA4MCksCisgICAgICAgICAgICBbY19mZjAwMDAwMF0iciIoY19mZjAwMDAwMCksIFthcmdiXSJyIihhcmdiKQorICAgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICAgKTsKKyAgICAgICAgcHRyW3hdID0gdGVtcDE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KK3N0YXRpYyB2b2lkIFBhY2tBUkdCX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGcsIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIG9mZnNldDsKKyAgY29uc3QgaW50IHJlc3QgPSBsZW4gJiAxOworICBjb25zdCB1aW50MzJfdCogY29uc3QgbG9vcF9lbmQgPSBvdXQgKyBsZW4gLSByZXN0OworICBjb25zdCBpbnQgc3RlcCA9IDQ7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4b3IgICAgICAgICAgJVtvZmZzZXRdLCAgICVbb2Zmc2V0XSwgJVtvZmZzZXRdICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAlW2xvb3BfZW5kXSwgJVtvdXRdLCAgICAwZiAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW2FdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbcl0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtnXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wM10sICAgICVbb2Zmc2V0XSglW2JdKSAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgJVtvdXRdLCAgICAgICVbb3V0XSwgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAlW3RlbXAzXSAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICVbdGVtcDBdLCAgICAtNCglW291dF0pICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVtvZmZzZXRdLCAgICVbb2Zmc2V0XSwgJVtzdGVwXSAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgICAlW2xvb3BfZW5kXSwgJVtvdXRdLCAgICAyYiAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgJVtyZXN0XSwgICAgICR6ZXJvLCAgICAgMWYgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAwXSwgICAgJVtvZmZzZXRdKCVbYV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDFdLCAgICAlW29mZnNldF0oJVtyXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMl0sICAgICVbb2Zmc2V0XSglW2ddKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAzXSwgICAgJVtvZmZzZXRdKCVbYl0pICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAwXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAlW3RlbXAzXSAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbb3V0XSkgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW29mZnNldF0iPSZyIihvZmZzZXQpLCBbb3V0XSIrJnIiKG91dCkKKyAgICA6IFthXSJyIihhKSwgW3JdInIiKHIpLCBbZ10iciIoZyksIFtiXSJyIihiKSwgW3N0ZXBdInIiKHN0ZXApLAorICAgICAgW2xvb3BfZW5kXSJyIihsb29wX2VuZCksIFtyZXN0XSJyIihyZXN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKyNlbmRpZiAgLy8gV09SRFNfQklHRU5ESUFOCisKK3N0YXRpYyB2b2lkIFBhY2tSR0JfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiLCBpbnQgbGVuLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIG9mZnNldDsKKyAgY29uc3QgaW50IHJlc3QgPSBsZW4gJiAxOworICBjb25zdCBpbnQgYSA9IDB4ZmY7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBsb29wX2VuZCA9IG91dCArIGxlbiAtIHJlc3Q7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4b3IgICAgICAgICAgJVtvZmZzZXRdLCAgICVbb2Zmc2V0XSwgJVtvZmZzZXRdICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAlW2xvb3BfZW5kXSwgJVtvdXRdLCAgICAwZiAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMF0sICAgICVbYV0sICAgICAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICVbb3V0XSwgICAgICAlW291dF0sICAgIDQgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtvdXRdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbc3RlcF0gICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMmIgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbcmVzdF0sICAgICAkemVybywgICAgIDFmICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMF0sICAgICVbYV0sICAgICAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICVbdGVtcDJdICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtvdXRdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbb2Zmc2V0XSI9JnIiKG9mZnNldCksIFtvdXRdIismciIob3V0KQorICAgIDogW2FdInIiKGEpLCBbcl0iciIociksIFtnXSJyIihnKSwgW2JdInIiKGIpLCBbc3RlcF0iciIoc3RlcCksCisgICAgICBbbG9vcF9lbmRdInIiKGxvb3BfZW5kKSwgW3Jlc3RdInIiKHJlc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBEaXNwYXRjaEFscGhhID0gRGlzcGF0Y2hBbHBoYV9NSVBTZHNwUjI7CisgIFdlYlBNdWx0QVJHQlJvdyA9IE11bHRBUkdCUm93X01JUFNkc3BSMjsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgV2ViUFBhY2tBUkdCID0gUGFja0FSR0JfTUlQU2RzcFIyOworI2VuZGlmCisgIFdlYlBQYWNrUkdCID0gUGFja1JHQl9NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDU1NDIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24uYwpAQCAtMCwwICsxLDE5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLCBORU9OIHZlcnNpb24uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNVUxUSVBMSUVSKGEpICgoYSkgKiAweDgwODEpCisjZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pKSA+PiAyMykKKworI2RlZmluZSBNVUxUSVBMWV9CWV9BTFBIQShWLCBBTFBIQSwgT1RIRVIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBhbHBoYSA9IChWKS52YWxbKEFMUEhBKV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCByMSA9IHZtdWxsX3U4KChWKS52YWxbMV0sIGFscGhhKTsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGcxID0gdm11bGxfdTgoKFYpLnZhbFsyXSwgYWxwaGEpOyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYjEgPSB2bXVsbF91OCgoVikudmFsWyhPVEhFUildLCBhbHBoYSk7ICAgICAgICAgICAgIFwKKyAgLyogd2UgdXNlOiB2IC8gMjU1ID0gKHYgKyAxICsgKHYgPj4gOCkpID4+IDggKi8gICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IHIyID0gdnNyYXFfbl91MTYocjEsIHIxLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgZzIgPSB2c3JhcV9uX3UxNihnMSwgZzEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBiMiA9IHZzcmFxX25fdTE2KGIxLCBiMSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IHIzID0gdmFkZHFfdTE2KHIyLCBrT25lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgZzMgPSB2YWRkcV91MTYoZzIsIGtPbmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBiMyA9IHZhZGRxX3UxNihiMiwga09uZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVikudmFsWzFdID0gdnNocm5fbl91MTYocjMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChWKS52YWxbMl0gPSB2c2hybl9uX3UxNihnMywgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFYpLnZhbFsoT1RIRVIpXSA9IHZzaHJuX25fdTE2KGIzLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5X05FT04odWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgIGNvbnN0IHVpbnQxNng4X3Qga09uZSA9IHZkdXBxX25fdTE2KDF1KTsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICB1aW50MzJfdCogY29uc3QgcmdieCA9ICh1aW50MzJfdCopcmdiYTsKKyAgICBpbnQgaSA9IDA7CisgICAgaWYgKGFscGhhX2ZpcnN0KSB7CisgICAgICBmb3IgKDsgaSArIDggPD0gdzsgaSArPSA4KSB7CisgICAgICAgIC8vIGxvYWQgYWFhYS4uLnxycnJyLi4ufGdnZ2cuLi58YmJiYi4uLgorICAgICAgICB1aW50OHg4eDRfdCBSR0JYID0gdmxkNF91OCgoY29uc3QgdWludDhfdCopKHJnYnggKyBpKSk7CisgICAgICAgIE1VTFRJUExZX0JZX0FMUEhBKFJHQlgsIDAsIDMpOworICAgICAgICB2c3Q0X3U4KCh1aW50OF90KikocmdieCArIGkpLCBSR0JYKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yICg7IGkgKyA4IDw9IHc7IGkgKz0gOCkgeworICAgICAgICB1aW50OHg4eDRfdCBSR0JYID0gdmxkNF91OCgoY29uc3QgdWludDhfdCopKHJnYnggKyBpKSk7CisgICAgICAgIE1VTFRJUExZX0JZX0FMUEhBKFJHQlgsIDMsIDApOworICAgICAgICB2c3Q0X3U4KCh1aW50OF90KikocmdieCArIGkpLCBSR0JYKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRmluaXNoIHdpdGggbGVmdC1vdmVycy4KKyAgICBmb3IgKDsgaSA8IHc7ICsraSkgeworICAgICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhbHBoYVs0ICogaV07CisgICAgICBpZiAoYSAhPSAweGZmKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG11bHQgPSBNVUxUSVBMSUVSKGEpOworICAgICAgICByZ2JbNCAqIGkgKyAwXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDBdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMV0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAxXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDJdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMl0sIG11bHQpOworICAgICAgfQorICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorfQorI3VuZGVmIE1VTFRJUExZX0JZX0FMUEhBCisjdW5kZWYgTVVMVElQTElFUgorI3VuZGVmIFBSRU1VTFRJUExZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRGlzcGF0Y2hBbHBoYV9ORU9OKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZmZmZmZmZnU7CisgIHVpbnQ4eDhfdCBtYXNrOCA9IHZkdXBfbl91OCgweGZmKTsKKyAgdWludDMyX3QgdG1wWzJdOworICBpbnQgaSwgajsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgLy8gV2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyBmaXJzdCBvciBsYXN0IGluIGRzdFtdIChkZXBlbmRpbmcgb24gcmdiQS9BcmdiCisgICAgLy8gbW9kZSkuIFNvIHdlIG11c3QgYmUgc3VyZSBkc3RbNCppICsgOCAtIDFdIGlzIHdyaXRhYmxlIGZvciB0aGUgc3RvcmUuCisgICAgLy8gSGVuY2UgdGhlIHRlc3Qgd2l0aCAnd2lkdGggLSAxJyBpbnN0ZWFkIG9mIGp1c3QgJ3dpZHRoJy4KKyAgICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aCAtIDE7IGkgKz0gOCkgeworICAgICAgdWludDh4OHg0X3QgcmdiWCA9IHZsZDRfdTgoKGNvbnN0IHVpbnQ4X3QqKShkc3QgKyA0ICogaSkpOworICAgICAgY29uc3QgdWludDh4OF90IGFscGhhcyA9IHZsZDFfdTgoYWxwaGEgKyBpKTsKKyAgICAgIHJnYlgudmFsWzBdID0gYWxwaGFzOworICAgICAgdnN0NF91OCgodWludDhfdCopKGRzdCArIDQgKiBpKSwgcmdiWCk7CisgICAgICBtYXNrOCA9IHZhbmRfdTgobWFzazgsIGFscGhhcyk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhbHBoYVtpXTsKKyAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorICB2c3QxX3U4KCh1aW50OF90Kil0bXAsIG1hc2s4KTsKKyAgYWxwaGFfbWFzayAmPSB0bXBbMF07CisgIGFscGhhX21hc2sgJj0gdG1wWzFdOworICByZXR1cm4gKGFscGhhX21hc2sgIT0gMHhmZmZmZmZmZnUpOworfQorCitzdGF0aWMgdm9pZCBEaXNwYXRjaEFscGhhVG9HcmVlbl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICB1aW50OHg4eDRfdCBncmVlbnM7ICAgLy8gbGVhdmUgQS9SL0IgY2hhbm5lbHMgemVybydkLgorICBncmVlbnMudmFsWzBdID0gdmR1cF9uX3U4KDApOworICBncmVlbnMudmFsWzJdID0gdmR1cF9uX3U4KDApOworICBncmVlbnMudmFsWzNdID0gdmR1cF9uX3U4KDApOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4KSB7CisgICAgICBncmVlbnMudmFsWzFdID0gdmxkMV91OChhbHBoYSArIGkpOworICAgICAgdnN0NF91OCgodWludDhfdCopKGRzdCArIGkpLCBncmVlbnMpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIGRzdFtpXSA9IGFscGhhW2ldIDw8IDg7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRXh0cmFjdEFscGhhX05FT04oY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKSB7CisgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweGZmZmZmZmZmdTsKKyAgdWludDh4OF90IG1hc2s4ID0gdmR1cF9uX3U4KDB4ZmYpOworICB1aW50MzJfdCB0bXBbMl07CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICAvLyBXZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIGZpcnN0IG9yIGxhc3QgaW4gZHN0W10gKGRlcGVuZGluZyBvbiByZ2JBL0FyZ2IKKyAgICAvLyBtb2RlKS4gU28gd2UgbXVzdCBiZSBzdXJlIGRzdFs0KmkgKyA4IC0gMV0gaXMgd3JpdGFibGUgZm9yIHRoZSBzdG9yZS4KKyAgICAvLyBIZW5jZSB0aGUgdGVzdCB3aXRoICd3aWR0aCAtIDEnIGluc3RlYWQgb2YganVzdCAnd2lkdGgnLgorICAgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoIC0gMTsgaSArPSA4KSB7CisgICAgICBjb25zdCB1aW50OHg4eDRfdCByZ2JYID0gdmxkNF91OCgoY29uc3QgdWludDhfdCopKGFyZ2IgKyA0ICogaSkpOworICAgICAgY29uc3QgdWludDh4OF90IGFscGhhcyA9IHJnYlgudmFsWzBdOworICAgICAgdnN0MV91OCgodWludDhfdCopKGFscGhhICsgaSksIGFscGhhcyk7CisgICAgICBtYXNrOCA9IHZhbmRfdTgobWFzazgsIGFscGhhcyk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgYWxwaGFbaV0gPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFbaV07CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIHZzdDFfdTgoKHVpbnQ4X3QqKXRtcCwgbWFzazgpOworICBhbHBoYV9tYXNrICY9IHRtcFswXTsKKyAgYWxwaGFfbWFzayAmPSB0bXBbMV07CisgIHJldHVybiAoYWxwaGFfbWFzayA9PSAweGZmZmZmZmZmdSk7Cit9CisKK3N0YXRpYyB2b2lkIEV4dHJhY3RHcmVlbl9ORU9OKGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBzaXplKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgMTYgPD0gc2l6ZTsgaSArPSAxNikgeworICAgIGNvbnN0IHVpbnQ4eDE2eDRfdCByZ2JYID0gdmxkNHFfdTgoKGNvbnN0IHVpbnQ4X3QqKShhcmdiICsgaSkpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZ3JlZW5zID0gcmdiWC52YWxbMV07CisgICAgdnN0MXFfdTgoYWxwaGEgKyBpLCBncmVlbnMpOworICB9CisgIGZvciAoOyBpIDwgc2l6ZTsgKytpKSBhbHBoYVtpXSA9IChhcmdiW2ldID4+IDgpICYgMHhmZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdORU9OKHZvaWQpIHsKKyAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseSA9IEFwcGx5QWxwaGFNdWx0aXBseV9ORU9OOworICBXZWJQRGlzcGF0Y2hBbHBoYSA9IERpc3BhdGNoQWxwaGFfTkVPTjsKKyAgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuID0gRGlzcGF0Y2hBbHBoYVRvR3JlZW5fTkVPTjsKKyAgV2ViUEV4dHJhY3RBbHBoYSA9IEV4dHJhY3RBbHBoYV9ORU9OOworICBXZWJQRXh0cmFjdEdyZWVuID0gRXh0cmFjdEdyZWVuX05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTg3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jCkBAIC0wLDAgKzEsMzQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRGlzcGF0Y2hBbHBoYV9TU0UyKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICAvLyBhbHBoYV9hbmQgc3RvcmVzIGFuICdhbmQnIG9wZXJhdGlvbiBvZiBhbGwgdGhlIGFscGhhW10gdmFsdWVzLiBUaGUgZmluYWwKKyAgLy8gdmFsdWUgaXMgbm90IDB4ZmYgaWYgYW55IG9mIHRoZSBhbHBoYVtdIGlzIG5vdCBlcXVhbCB0byAweGZmLgorICB1aW50MzJfdCBhbHBoYV9hbmQgPSAweGZmOworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSByZ2JfbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmZmZmZmMDB1KTsgIC8vIHRvIHByZXNlcnZlIFJHQgorICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldF9lcGkzMigwLCAwLCB+MHUsIH4wdSk7CisgIF9fbTEyOGkgYWxsX2FscGhhcyA9IGFsbF8weGZmOworCisgIC8vIFdlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgMyBleHRyYSBieXRlcyBhZnRlciB0aGUgbGFzdCB3cml0dGVuIGJ5dGUKKyAgLy8gJ2RzdFs0ICogd2lkdGggLSA0XScsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3Qgb3IgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldC4KKyAgY29uc3QgaW50IGxpbWl0ID0gKHdpZHRoIC0gMSkgJiB+NzsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSArPSA4KSB7CisgICAgICAvLyBsb2FkIDggYWxwaGEgYnl0ZXMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhbHBoYVtpXSk7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX3VucGFja2xvX2VwaTgoYTAsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBhMl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNihhMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX3VucGFja2hpX2VwaTE2KGExLCB6ZXJvKTsKKyAgICAgIC8vIGxvYWQgOCBkc3QgcGl4ZWxzICgzMiBieXRlcykKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjBfbG8gPSBfbW1fbG9hZHVfc2kxMjgob3V0ICsgMCk7CisgICAgICBjb25zdCBfX20xMjhpIGIwX2hpID0gX21tX2xvYWR1X3NpMTI4KG91dCArIDEpOworICAgICAgLy8gbWFzayBkc3QgYWxwaGEgdmFsdWVzCisgICAgICBjb25zdCBfX20xMjhpIGIxX2xvID0gX21tX2FuZF9zaTEyOChiMF9sbywgcmdiX21hc2spOworICAgICAgY29uc3QgX19tMTI4aSBiMV9oaSA9IF9tbV9hbmRfc2kxMjgoYjBfaGksIHJnYl9tYXNrKTsKKyAgICAgIC8vIGNvbWJpbmUKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjJfbG8gPSBfbW1fb3Jfc2kxMjgoYjFfbG8sIGEyX2xvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjJfaGkgPSBfbW1fb3Jfc2kxMjgoYjFfaGksIGEyX2hpKTsKKyAgICAgIC8vIHN0b3JlCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDAsIGIyX2xvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMSwgYjJfaGkpOworICAgICAgLy8gYWNjdW11bGF0ZSBlaWdodCBhbHBoYSAnYW5kJyBpbiBwYXJhbGxlbAorICAgICAgYWxsX2FscGhhcyA9IF9tbV9hbmRfc2kxMjgoYWxsX2FscGhhcywgYTApOworICAgICAgb3V0ICs9IDI7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhbHBoYVtpXTsKKyAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX2FuZCAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9CisgIC8vIENvbWJpbmUgdGhlIGVpZ2h0IGFscGhhICdhbmQnIGludG8gYSA4LWJpdCBtYXNrLgorICBhbHBoYV9hbmQgJj0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgoYWxsX2FscGhhcywgYWxsXzB4ZmYpKTsKKyAgcmV0dXJuIChhbHBoYV9hbmQgIT0gMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIERpc3BhdGNoQWxwaGFUb0dyZWVuX1NTRTIoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IGludCBsaW1pdCA9IHdpZHRoICYgfjE1OworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gMTYpIHsgICAvLyBwcm9jZXNzIDE2IGFscGhhIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYWxwaGFbaV0pOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIGEwKTsgIC8vIG5vdGUgdGhlICd6ZXJvJyBmaXJzdCEKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCBhMCk7CisgICAgICBjb25zdCBfX20xMjhpIGEyX2xvID0gX21tX3VucGFja2xvX2VwaTE2KGExLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjJfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoYjEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBhMl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihhMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGIyX2hpID0gX21tX3VucGFja2hpX2VwaTE2KGIxLCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArICAwXSwgYTJfbG8pOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDRdLCBhMl9oaSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAgOF0sIGIyX2xvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArIDEyXSwgYjJfaGkpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIGRzdFtpXSA9IGFscGhhW2ldIDw8IDg7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRXh0cmFjdEFscGhhX1NTRTIoY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKSB7CisgIC8vIGFscGhhX2FuZCBzdG9yZXMgYW4gJ2FuZCcgb3BlcmF0aW9uIG9mIGFsbCB0aGUgYWxwaGFbXSB2YWx1ZXMuIFRoZSBmaW5hbAorICAvLyB2YWx1ZSBpcyBub3QgMHhmZiBpZiBhbnkgb2YgdGhlIGFscGhhW10gaXMgbm90IGVxdWFsIHRvIDB4ZmYuCisgIHVpbnQzMl90IGFscGhhX2FuZCA9IDB4ZmY7CisgIGludCBpLCBqOworICBjb25zdCBfX20xMjhpIGFfbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmZ1KTsgIC8vIHRvIHByZXNlcnZlIGFscGhhCisgIGNvbnN0IF9fbTEyOGkgYWxsXzB4ZmYgPSBfbW1fc2V0X2VwaTMyKDAsIDAsIH4wdSwgfjB1KTsKKyAgX19tMTI4aSBhbGxfYWxwaGFzID0gYWxsXzB4ZmY7CisKKyAgLy8gV2UgbXVzdCBiZSBhYmxlIHRvIGFjY2VzcyAzIGV4dHJhIGJ5dGVzIGFmdGVyIHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZQorICAvLyAnc3JjWzQgKiB3aWR0aCAtIDRdJywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIHRoZSBmaXJzdCBvciB0aGUKKyAgLy8gbGFzdCBieXRlIG9mIHRoZSBxdWFkcnVwbGV0LgorICBjb25zdCBpbnQgbGltaXQgPSAod2lkdGggLSAxKSAmIH43OworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGNvbnN0IF9fbTEyOGkqIHNyYyA9IChjb25zdCBfX20xMjhpKilhcmdiOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSArPSA4KSB7CisgICAgICAvLyBsb2FkIDMyIGFyZ2IgYnl0ZXMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMCk7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDEpOworICAgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hbmRfc2kxMjgoYTAsIGFfbWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FuZF9zaTEyOChhMSwgYV9tYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fcGFja3NfZXBpMzIoYjAsIGIxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fcGFja3VzX2VwaTE2KGMwLCBjMCk7CisgICAgICAvLyBzdG9yZQorICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmFscGhhW2ldLCBkMCk7CisgICAgICAvLyBhY2N1bXVsYXRlIGVpZ2h0IGFscGhhICdhbmQnIGluIHBhcmFsbGVsCisgICAgICBhbGxfYWxwaGFzID0gX21tX2FuZF9zaTEyOChhbGxfYWxwaGFzLCBkMCk7CisgICAgICBzcmMgKz0gMjsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFyZ2JbNCAqIGldOworICAgICAgYWxwaGFbaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX2FuZCAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KKyAgLy8gQ29tYmluZSB0aGUgZWlnaHQgYWxwaGEgJ2FuZCcgaW50byBhIDgtYml0IG1hc2suCisgIGFscGhhX2FuZCAmPSBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChhbGxfYWxwaGFzLCBhbGxfMHhmZikpOworICByZXR1cm4gKGFscGhhX2FuZCA9PSAweGZmKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vbi1kaXRoZXIgcHJlbXVsdGlwbGllZCBtb2RlcworCisjZGVmaW5lIE1VTFRJUExJRVIoYSkgICAoKGEpICogMHg4MDgxKQorI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSkgPj4gMjMpCisKKy8vIFdlIGNhbid0IHVzZSBhICdjb25zdCBpbnQnIGZvciB0aGUgU0hVRkZMRSB2YWx1ZSwgYmVjYXVzZSBpdCBoYXMgdG8gYmUgYW4KKy8vIGltbWVkaWF0ZSBpbiB0aGUgX21tX3NodWZmbGV4eF9lcGkxNigpIGluc3RydWN0aW9uLiBXZSByZWFsbHkgbmVlZCBhIG1hY3JvLgorLy8gV2UgdXNlOiB2IC8gMjU1ID0gKHYgKiAweDgwODEpID4+IDIzLCB3aGVyZSB2ID0gYWxwaGEgKiB7cixnLGJ9IGlzIGEgMTZiaXQKKy8vIHZhbHVlLgorI2RlZmluZSBBUFBMWV9BTFBIQShSR0JYLCBTSFVGRkxFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2IwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKFJHQlgpKTsgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2IxX2xvID0gX21tX3VucGFja2xvX2VwaTgoYXJnYjAsIHplcm8pOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2IxX2hpID0gX21tX3VucGFja2hpX2VwaTgoYXJnYjAsIHplcm8pOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFscGhhMF9sbyA9IF9tbV9vcl9zaTEyOChhcmdiMV9sbywga01hc2spOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFscGhhMF9oaSA9IF9tbV9vcl9zaTEyOChhcmdiMV9oaSwga01hc2spOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFscGhhMV9sbyA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoYWxwaGEwX2xvLCBTSFVGRkxFKTsgXAorICBjb25zdCBfX20xMjhpIGFscGhhMV9oaSA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoYWxwaGEwX2hpLCBTSFVGRkxFKTsgXAorICBjb25zdCBfX20xMjhpIGFscGhhMl9sbyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoYWxwaGExX2xvLCBTSFVGRkxFKTsgXAorICBjb25zdCBfX20xMjhpIGFscGhhMl9oaSA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoYWxwaGExX2hpLCBTSFVGRkxFKTsgXAorICAvKiBhbHBoYTIgPSBbZmYgYTAgYTAgYTBdW2ZmIGExIGExIGExXSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEwX2xvID0gX21tX211bGxvX2VwaTE2KGFscGhhMl9sbywgYXJnYjFfbG8pOyAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEwX2hpID0gX21tX211bGxvX2VwaTE2KGFscGhhMl9oaSwgYXJnYjFfaGkpOyAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEExX2xvID0gX21tX211bGhpX2VwdTE2KEEwX2xvLCBrTXVsdCk7ICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEExX2hpID0gX21tX211bGhpX2VwdTE2KEEwX2hpLCBrTXVsdCk7ICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEyX2xvID0gX21tX3NybGlfZXBpMTYoQTFfbG8sIDcpOyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEyX2hpID0gX21tX3NybGlfZXBpMTYoQTFfaGksIDcpOyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEzID0gX21tX3BhY2t1c19lcGkxNihBMl9sbywgQTJfaGkpOyAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmKFJHQlgpLCBBMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5X1NTRTIodWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkga011bHQgPSBfbW1fc2V0MV9lcGkxNigweDgwODF1KTsKKyAgY29uc3QgX19tMTI4aSBrTWFzayA9IF9tbV9zZXRfZXBpMTYoMCwgMHhmZiwgMHhmZiwgMCwgMCwgMHhmZiwgMHhmZiwgMCk7CisgIGNvbnN0IGludCBrU3BhbiA9IDQ7CisgIHdoaWxlIChoLS0gPiAwKSB7CisgICAgdWludDMyX3QqIGNvbnN0IHJnYnggPSAodWludDMyX3QqKXJnYmE7CisgICAgaW50IGk7CisgICAgaWYgKCFhbHBoYV9maXJzdCkgeworICAgICAgZm9yIChpID0gMDsgaSArIGtTcGFuIDw9IHc7IGkgKz0ga1NwYW4pIHsKKyAgICAgICAgQVBQTFlfQUxQSEEocmdieFtpXSwgX01NX1NIVUZGTEUoMiwgMywgMywgMykpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpICsga1NwYW4gPD0gdzsgaSArPSBrU3BhbikgeworICAgICAgICBBUFBMWV9BTFBIQShyZ2J4W2ldLCBfTU1fU0hVRkZMRSgwLCAwLCAwLCAxKSk7CisgICAgICB9CisgICAgfQorICAgIC8vIEZpbmlzaCB3aXRoIGxlZnQtb3ZlcnMuCisgICAgZm9yICg7IGkgPCB3OyArK2kpIHsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYiA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAxIDogMCk7CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgICBjb25zdCB1aW50MzJfdCBhID0gYWxwaGFbNCAqIGldOworICAgICAgaWYgKGEgIT0gMHhmZikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKKyAgICAgICAgcmdiWzQgKiBpICsgMF0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAwXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDFdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMV0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAyXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDJdLCBtdWx0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KK30KKyN1bmRlZiBNVUxUSVBMSUVSCisjdW5kZWYgUFJFTVVMVElQTFkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFscGhhIGRldGVjdGlvbgorCitzdGF0aWMgaW50IEhhc0FscGhhOGJfU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXQxX2VwaTgoMHhmZik7CisgIGludCBpID0gMDsKKyAgZm9yICg7IGkgKyAxNiA8PSBsZW5ndGg7IGkgKz0gMTYpIHsKKyAgICBjb25zdCBfX20xMjhpIHYgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBiaXRzID0gX21tX2NtcGVxX2VwaTgodiwgYWxsXzB4ZmYpOworICAgIGNvbnN0IGludCBtYXNrID0gX21tX21vdmVtYXNrX2VwaTgoYml0cyk7CisgICAgaWYgKG1hc2sgIT0gMHhmZmZmKSByZXR1cm4gMTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSBpZiAoc3JjW2ldICE9IDB4ZmYpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBIYXNBbHBoYTMyYl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCkgeworICBjb25zdCBfX20xMjhpIGFscGhhX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmKTsKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXQxX2VwaTgoMHhmZik7CisgIGludCBpID0gMDsKKyAgLy8gV2UgZG9uJ3Qga25vdyBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBsYXN0IDMgYnl0ZXMgYWZ0ZXIgdGhlIGxhc3QgYWxwaGEKKyAgLy8gdmFsdWUgJ3NyY1s0ICogbGVuZ3RoIC0gNF0nIChiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgdGhlIGZpcnN0CisgIC8vIG9yIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHF1YWRydXBsZXQpLiBIZW5jZSB0aGUgJy0zJyBwcm90ZWN0aW9uIGJlbG93LgorICBsZW5ndGggPSBsZW5ndGggKiA0IC0gMzsgICAvLyBzaXplIGluIGJ5dGVzCisgIGZvciAoOyBpICsgNjQgPD0gbGVuZ3RoOyBpICs9IDY0KSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMTYpKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDMyKSk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyA0OCkpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYW5kX3NpMTI4KGEwLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FuZF9zaTEyOChhMSwgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9hbmRfc2kxMjgoYTIsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fYW5kX3NpMTI4KGEzLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX3BhY2tzX2VwaTMyKGIwLCBiMSk7CisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9wYWNrc19lcGkzMihiMiwgYjMpOworICAgIGNvbnN0IF9fbTEyOGkgZCAgPSBfbW1fcGFja3VzX2VwaTE2KGMwLCBjMSk7CisgICAgY29uc3QgX19tMTI4aSBiaXRzID0gX21tX2NtcGVxX2VwaTgoZCwgYWxsXzB4ZmYpOworICAgIGNvbnN0IGludCBtYXNrID0gX21tX21vdmVtYXNrX2VwaTgoYml0cyk7CisgICAgaWYgKG1hc2sgIT0gMHhmZmZmKSByZXR1cm4gMTsKKyAgfQorICBmb3IgKDsgaSArIDMyIDw9IGxlbmd0aDsgaSArPSAzMikgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgIDApKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDE2KSk7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hbmRfc2kxMjgoYTAsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYW5kX3NpMTI4KGExLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGMgID0gX21tX3BhY2tzX2VwaTMyKGIwLCBiMSk7CisgICAgY29uc3QgX19tMTI4aSBkICA9IF9tbV9wYWNrdXNfZXBpMTYoYywgYyk7CisgICAgY29uc3QgX19tMTI4aSBiaXRzID0gX21tX2NtcGVxX2VwaTgoZCwgYWxsXzB4ZmYpOworICAgIGNvbnN0IGludCBtYXNrID0gX21tX21vdmVtYXNrX2VwaTgoYml0cyk7CisgICAgaWYgKG1hc2sgIT0gMHhmZmZmKSByZXR1cm4gMTsKKyAgfQorICBmb3IgKDsgaSA8PSBsZW5ndGg7IGkgKz0gNCkgaWYgKHNyY1tpXSAhPSAweGZmKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBcHBseSBhbHBoYSB2YWx1ZSB0byByb3dzCisKK3N0YXRpYyB2b2lkIE11bHRBUkdCUm93X1NTRTIodWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeCA9IDA7CisgIGlmICghaW52ZXJzZSkgeworICAgIGNvbnN0IGludCBrU3BhbiA9IDI7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGsxMjggPSBfbW1fc2V0MV9lcGkxNigxMjgpOworICAgIGNvbnN0IF9fbTEyOGkga011bHQgPSBfbW1fc2V0MV9lcGkxNigweDAxMDEpOworICAgIGNvbnN0IF9fbTEyOGkga01hc2sgPSBfbW1fc2V0X2VwaTE2KDAsIDB4ZmYsIDAsIDAsIDAsIDB4ZmYsIDAsIDApOworICAgIGZvciAoeCA9IDA7IHggKyBrU3BhbiA8PSB3aWR0aDsgeCArPSBrU3BhbikgeworICAgICAgLy8gVG8gY29tcHV0ZSAncmVzdWx0ID0gKGludCkoYSAqIHggLyAyNTUuICsgLjUpJywgd2UgdXNlOgorICAgICAgLy8gICB0bXAgPSBhICogdiArIDEyOCwgcmVzdWx0ID0gKHRtcCAqIDB4MDEwMXUpID4+IDE2CisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcHRyW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNrbG9fZXBpOChBMCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIEEyID0gX21tX29yX3NpMTI4KEExLCBrTWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NodWZmbGVsb19lcGkxNihBMiwgX01NX1NIVUZGTEUoMiwgMywgMywgMykpOworICAgICAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQTMsIF9NTV9TSFVGRkxFKDIsIDMsIDMsIDMpKTsKKyAgICAgIC8vIGhlcmUsIEE0ID0gW2ZmIGEwIGEwIGEwXVtmZiBhMSBhMSBhMV0KKyAgICAgIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fbXVsbG9fZXBpMTYoQTQsIEExKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTYgPSBfbW1fYWRkX2VwaTE2KEE1LCBrMTI4KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTcgPSBfbW1fbXVsaGlfZXB1MTYoQTYsIGtNdWx0KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEwID0gX21tX3BhY2t1c19lcGkxNihBNywgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdLCBBMTApOworICAgIH0KKyAgfQorICB3aWR0aCAtPSB4OworICBpZiAod2lkdGggPiAwKSBXZWJQTXVsdEFSR0JSb3dfQyhwdHIgKyB4LCB3aWR0aCwgaW52ZXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkIE11bHRSb3dfU1NFMih1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IHggPSAwOworICBpZiAoIWludmVyc2UpIHsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGNvbnN0IF9fbTEyOGkgazEyOCA9IF9tbV9zZXQxX2VwaTE2KDEyOCk7CisgICAgY29uc3QgX19tMTI4aSBrTXVsdCA9IF9tbV9zZXQxX2VwaTE2KDB4MDEwMSk7CisgICAgZm9yICh4ID0gMDsgeCArIDggPD0gd2lkdGg7IHggKz0gOCkgeworICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnB0clt4XSk7CisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYWxwaGFbeF0pOworICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV91bnBhY2tsb19lcGk4KHYwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fdW5wYWNrbG9fZXBpOChhMCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIHYyID0gX21tX211bGxvX2VwaTE2KHYxLCBhMSk7CisgICAgICBjb25zdCBfX20xMjhpIHYzID0gX21tX2FkZF9lcGkxNih2MiwgazEyOCk7CisgICAgICBjb25zdCBfX20xMjhpIHY0ID0gX21tX211bGhpX2VwdTE2KHYzLCBrTXVsdCk7CisgICAgICBjb25zdCBfX20xMjhpIHY1ID0gX21tX3BhY2t1c19lcGkxNih2NCwgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdLCB2NSk7CisgICAgfQorICB9CisgIHdpZHRoIC09IHg7CisgIGlmICh3aWR0aCA+IDApIFdlYlBNdWx0Um93X0MocHRyICsgeCwgYWxwaGEgKyB4LCB3aWR0aCwgaW52ZXJzZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTIodm9pZCkgeworICBXZWJQTXVsdEFSR0JSb3cgPSBNdWx0QVJHQlJvd19TU0UyOworICBXZWJQTXVsdFJvdyA9IE11bHRSb3dfU1NFMjsKKyAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseSA9IEFwcGx5QWxwaGFNdWx0aXBseV9TU0UyOworICBXZWJQRGlzcGF0Y2hBbHBoYSA9IERpc3BhdGNoQWxwaGFfU1NFMjsKKyAgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuID0gRGlzcGF0Y2hBbHBoYVRvR3JlZW5fU1NFMjsKKyAgV2ViUEV4dHJhY3RBbHBoYSA9IEV4dHJhY3RBbHBoYV9TU0UyOworCisgIFdlYlBIYXNBbHBoYThiID0gSGFzQWxwaGE4Yl9TU0UyOworICBXZWJQSGFzQWxwaGEzMmIgPSBIYXNBbHBoYTMyYl9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDQwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYwpAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwsIFNTRTQuMSB2YXJpYW50LgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYV9TU0U0MShjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICAvLyBhbHBoYV9hbmQgc3RvcmVzIGFuICdhbmQnIG9wZXJhdGlvbiBvZiBhbGwgdGhlIGFscGhhW10gdmFsdWVzLiBUaGUgZmluYWwKKyAgLy8gdmFsdWUgaXMgbm90IDB4ZmYgaWYgYW55IG9mIHRoZSBhbHBoYVtdIGlzIG5vdCBlcXVhbCB0byAweGZmLgorICB1aW50MzJfdCBhbHBoYV9hbmQgPSAweGZmOworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXQxX2VwaTMyKH4wdSk7CisgIF9fbTEyOGkgYWxsX2FscGhhcyA9IGFsbF8weGZmOworCisgIC8vIFdlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgMyBleHRyYSBieXRlcyBhZnRlciB0aGUgbGFzdCB3cml0dGVuIGJ5dGUKKyAgLy8gJ3NyY1s0ICogd2lkdGggLSA0XScsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3Qgb3IgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldC4KKyAgY29uc3QgaW50IGxpbWl0ID0gKHdpZHRoIC0gMSkgJiB+MTU7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMCA9IF9tbV9zZXRfZXBpOCgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMTIsIDgsIDQsIDApOworICBjb25zdCBfX20xMjhpIGtDc3RBbHBoYTEgPSBfbW1fc2V0X2VwaTgoLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDgsIDQsIDAsIC0xLCAtMSwgLTEsIC0xKTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0QWxwaGEyID0gX21tX3NldF9lcGk4KC0xLCAtMSwgLTEsIC0xLCAxMiwgOCwgNCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMyA9IF9tbV9zZXRfZXBpOCgxMiwgOCwgNCwgMCwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpKiBzcmMgPSAoY29uc3QgX19tMTI4aSopYXJnYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gMTYpIHsKKyAgICAgIC8vIGxvYWQgNjQgYXJnYiBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMSk7CisgICAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDIpOworICAgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fc2h1ZmZsZV9lcGk4KGEwLCBrQ3N0QWxwaGEwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc2h1ZmZsZV9lcGk4KGExLCBrQ3N0QWxwaGExKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc2h1ZmZsZV9lcGk4KGEyLCBrQ3N0QWxwaGEyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc2h1ZmZsZV9lcGk4KGEzLCBrQ3N0QWxwaGEzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fb3Jfc2kxMjgoYjAsIGIxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fb3Jfc2kxMjgoYjIsIGIzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fb3Jfc2kxMjgoYzAsIGMxKTsKKyAgICAgIC8vIHN0b3JlCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYWxwaGFbaV0sIGQwKTsKKyAgICAgIC8vIGFjY3VtdWxhdGUgc2l4dGVlbiBhbHBoYSAnYW5kJyBpbiBwYXJhbGxlbAorICAgICAgYWxsX2FscGhhcyA9IF9tbV9hbmRfc2kxMjgoYWxsX2FscGhhcywgZDApOworICAgICAgc3JjICs9IDQ7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhW2ldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIC8vIENvbWJpbmUgdGhlIHNpeHRlZW4gYWxwaGEgJ2FuZCcgaW50byBhbiA4LWJpdCBtYXNrLgorICBhbHBoYV9hbmQgfD0gMHhmZjAwdTsgIC8vIHByZXRlbmQgdGhlIHVwcGVyIGJpdHMgWzguLjE1XSB3ZXJlIHRlc3RlZCBvay4KKyAgYWxwaGFfYW5kICY9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KGFsbF9hbHBoYXMsIGFsbF8weGZmKSk7CisgIHJldHVybiAoYWxwaGFfYW5kID09IDB4ZmZmZnUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEodm9pZCkgeworICBXZWJQRXh0cmFjdEFscGhhID0gRXh0cmFjdEFscGhhX1NTRTQxOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2UyLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMWViZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTIuaApAQCAtMCwwICsxLDE5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgY29kZSBjb21tb24gdG8gc2V2ZXJhbCBmaWxlcy4KKy8vCisvLyBBdXRob3I6IFZpbmNlbnQgUmFiYXVkICh2cmFiYXVkQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfQ09NTU9OX1NTRTJfSF8KKyNkZWZpbmUgV0VCUF9EU1BfQ09NTU9OX1NTRTJfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWl0ZSB1c2VmdWwgbWFjcm8gZm9yIGRlYnVnZ2luZy4gTGVmdCBoZXJlIGZvciBjb252ZW5pZW5jZS4KKworI2lmIDAKKyNpbmNsdWRlIDxzdGRpby5oPgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJpbnRSZWcoY29uc3QgX19tMTI4aSByLCBjb25zdCBjaGFyKiBjb25zdCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHsKKyAgaW50IG47CisgIHVuaW9uIHsKKyAgICBfX20xMjhpIHI7CisgICAgdWludDhfdCBpOFsxNl07CisgICAgdWludDE2X3QgaTE2WzhdOworICAgIHVpbnQzMl90IGkzMls0XTsKKyAgICB1aW50NjRfdCBpNjRbMl07CisgIH0gdG1wOworICB0bXAuciA9IHI7CisgIGZwcmludGYoc3RkZXJyLCAiJXNcdDogIiwgbmFtZSk7CisgIGlmIChzaXplID09IDgpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjJ4ICIsIHRtcC5pOFtuXSk7CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxNikgeworICAgIGZvciAobiA9IDA7IG4gPCA4OyArK24pIGZwcmludGYoc3RkZXJyLCAiJS40eCAiLCB0bXAuaTE2W25dKTsKKyAgfSBlbHNlIGlmIChzaXplID09IDMyKSB7CisgICAgZm9yIChuID0gMDsgbiA8IDQ7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjh4ICIsIHRtcC5pMzJbbl0pOworICB9IGVsc2UgeworICAgIGZvciAobiA9IDA7IG4gPCAyOyArK24pIGZwcmludGYoc3RkZXJyLCAiJS4xNmx4ICIsIHRtcC5pNjRbbl0pOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWF0aCBmdW5jdGlvbnMuCisKKy8vIFJldHVybiB0aGUgc3VtIG9mIGFsbCB0aGUgOGIgaW4gdGhlIHJlZ2lzdGVyLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhIb3Jpem9udGFsQWRkOGIoY29uc3QgX19tMTI4aSogY29uc3QgYSkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNhZDh4MiA9IF9tbV9zYWRfZXB1OCgqYSwgemVybyk7CisgIC8vIHN1bSB0aGUgdHdvIHNhZHM6IHNhZDh4MlswOjFdICsgc2FkOHgyWzg6OV0KKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTMyKHNhZDh4MiwgX21tX3NodWZmbGVfZXBpMzIoc2FkOHgyLCAyKSk7CisgIHJldHVybiBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pOworfQorCisvLyBUcmFuc3Bvc2UgdHdvIDR4NCAxNmIgbWF0cmljZXMgaG9yaXpvbnRhbGx5IHN0b3JlZCBpbiByZWdpc3RlcnMuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKAorICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMCwgY29uc3QgX19tMTI4aSogY29uc3QgaW4xLAorICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMiwgY29uc3QgX19tMTI4aSogY29uc3QgaW4zLCBfX20xMjhpKiBjb25zdCBvdXQwLAorICAgIF9fbTEyOGkqIGNvbnN0IG91dDEsIF9fbTEyOGkqIGNvbnN0IG91dDIsIF9fbTEyOGkqIGNvbnN0IG91dDMpIHsKKyAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoKmluMCwgKmluMSk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KCppbjIsICppbjMpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNigqaW4wLCAqaW4xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzMgPSBfbW1fdW5wYWNraGlfZXBpMTYoKmluMiwgKmluMyk7CisgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMworICAvLyBhMjAgYTMwIGEyMSBhMzEgICBhMjIgYTMyIGEyMyBhMzMKKyAgLy8gYjAwIGIxMCBiMDEgYjExICAgYjAyIGIxMiBiMDMgYjEzCisgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMyA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7CisgIC8vIGEwMCBhMTAgYTIwIGEzMCBhMDEgYTExIGEyMSBhMzEKKyAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQorICAvLyBhMDIgYTEyIGEyMiBhMzIgYTAzIGExMyBhMjMgYTMzCisgIC8vIGIwMiBiMTIgYTIyIGIzMiBiMDMgYjEzIGIyMyBiMzMKKyAgKm91dDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOworICAqb3V0MSA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7CisgICpvdXQyID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKKyAgKm91dDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOworICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKKyAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCisgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgorICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoYW5uZWwgbWl4aW5nLgorCisvLyBGdW5jdGlvbiB1c2VkIHNldmVyYWwgdGltZXMgaW4gVlA4UGxhbmFyVG8yNGIuCisvLyBJdCBzYW1wbGVzIHRoZSBpbiBidWZmZXIgYXMgZm9sbG93czogb25lIGV2ZXJ5IHR3byB1bnNpZ25lZCBjaGFyIGlzIHN0b3JlZAorLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBpcyBzdG9yZWQgYXQgdGhlIGVuZC4KKyNkZWZpbmUgVlA4UGxhbmFyVG8yNGJIZWxwZXIoSU4sIE9VVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSB2X21hc2sgPSBfbW1fc2V0MV9lcGkxNigweDAwZmYpOyAgICAgICAgICAgICAgIFwKKyAgICAvKiBUYWtlIG9uZSBldmVyeSB0d28gdXBwZXIgOGIgdmFsdWVzLiovICAgICAgICAgICAgICAgICAgICAgXAorICAgIChPVVQjIzApID0gX21tX3BhY2t1c19lcGkxNihfbW1fYW5kX3NpMTI4KChJTiMjMCksIHZfbWFzayksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9hbmRfc2kxMjgoKElOIyMxKSwgdl9tYXNrKSk7IFwKKyAgICAoT1VUIyMxKSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FuZF9zaTEyOCgoSU4jIzIpLCB2X21hc2spLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3NpMTI4KChJTiMjMyksIHZfbWFzaykpOyBcCisgICAgKE9VVCMjMikgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hbmRfc2kxMjgoKElOIyM0KSwgdl9tYXNrKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2FuZF9zaTEyOCgoSU4jIzUpLCB2X21hc2spKTsgXAorICAgIC8qIFRha2Ugb25lIGV2ZXJ5IHR3byBsb3dlciA4YiB2YWx1ZXMuKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgKE9VVCMjMykgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9zcmxpX2VwaTE2KChJTiMjMCksIDgpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NybGlfZXBpMTYoKElOIyMxKSwgOCkpOyAgICAgXAorICAgIChPVVQjIzQpID0gX21tX3BhY2t1c19lcGkxNihfbW1fc3JsaV9lcGkxNigoSU4jIzIpLCA4KSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zcmxpX2VwaTE2KChJTiMjMyksIDgpKTsgICAgIFwKKyAgICAoT1VUIyM1KSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX3NybGlfZXBpMTYoKElOIyM0KSwgOCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc3JsaV9lcGkxNigoSU4jIzUpLCA4KSk7ICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vIFBhY2sgdGhlIHBsYW5hciBidWZmZXJzCisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIHRyaXBsZXQgYnkgdHJpcGxldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciByZ2IgYXMgcmdicmdicmdicmdiIC4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4UGxhbmFyVG8yNGJfU1NFMigKKyAgICBfX20xMjhpKiBjb25zdCBpbjAsIF9fbTEyOGkqIGNvbnN0IGluMSwgX19tMTI4aSogY29uc3QgaW4yLAorICAgIF9fbTEyOGkqIGNvbnN0IGluMywgX19tMTI4aSogY29uc3QgaW40LCBfX20xMjhpKiBjb25zdCBpbjUpIHsKKyAgLy8gVGhlIGlucHV0IGlzIDYgcmVnaXN0ZXJzIG9mIHNpeHRlZW4gOGIgYnV0IGZvciB0aGUgc2FrZSBvZiBleHBsYW5hdGlvbiwKKyAgLy8gbGV0J3MgdGFrZSA2IHJlZ2lzdGVycyBvZiBmb3VyIDhiIHZhbHVlcy4KKyAgLy8gVG8gcGFjaywgd2Ugd2lsbCBrZWVwIHRha2luZyBvbmUgZXZlcnkgdHdvIDhiIGludGVnZXIgYW5kIG1vdmUgaXQKKyAgLy8gYXJvdW5kIGFzIGZvbGxvd3M6CisgIC8vIElucHV0OgorICAvLyAgIHIwcjFyMnIzIHwgcjRyNXI2cjcgfCBnMGcxZzJnMyB8IGc0ZzVnNmc3IHwgYjBiMWIyYjMgfCBiNGI1YjZiNworICAvLyBTcGxpdCB0aGUgNiByZWdpc3RlcnMgaW4gdHdvIHNldHMgb2YgMyByZWdpc3RlcnM6IHRoZSBmaXJzdCBzZXQgYXMgdGhlIGV2ZW4KKyAgLy8gOGIgYnl0ZXMsIHRoZSBzZWNvbmQgdGhlIG9kZCBvbmVzOgorICAvLyAgIHIwcjJyNHI2IHwgZzBnMmc0ZzYgfCBiMGIyYjRiNiB8IHIxcjNyNXI3IHwgZzFnM2c1ZzcgfCBiMWIzYjViNworICAvLyBSZXBlYXQgdGhlIHNhbWUgcGVybXV0YXRpb25zIHR3aWNlIG1vcmU6CisgIC8vICAgcjByNGcwZzQgfCBiMGI0cjFyNSB8IGcxZzViMWI1IHwgcjJyNmcyZzYgfCBiMmI2cjNyNyB8IGczZzdiM2I3CisgIC8vICAgcjBnMGIwcjEgfCBnMWIxcjJnMiB8IGIycjNnM2IzIHwgcjRnNGI0cjUgfCBnNWI1cjZnNiB8IGI2cjdnN2I3CisgIF9fbTEyOGkgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgVlA4UGxhbmFyVG8yNGJIZWxwZXIoKmluLCB0bXApOworICBWUDhQbGFuYXJUbzI0YkhlbHBlcih0bXAsICppbik7CisgIFZQOFBsYW5hclRvMjRiSGVscGVyKCppbiwgdG1wKTsKKyAgLy8gV2UgbmVlZCB0byBkbyBpdCB0d28gbW9yZSB0aW1lcyB0aGFuIHRoZSBleGFtcGxlIGFzIHdlIGhhdmUgc2l4dGVlbiBieXRlcy4KKyAgeworICAgIF9fbTEyOGkgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NTsKKyAgICBWUDhQbGFuYXJUbzI0YkhlbHBlcih0bXAsIG91dCk7CisgICAgVlA4UGxhbmFyVG8yNGJIZWxwZXIob3V0LCAqaW4pOworICB9Cit9CisKKyN1bmRlZiBWUDhQbGFuYXJUbzI0YkhlbHBlcgorCisvLyBDb252ZXJ0IGZvdXIgcGFja2VkIGZvdXItY2hhbm5lbCBidWZmZXJzIGxpa2UgYXJnYmFyZ2JhcmdiYXJnYi4uLiBpbnRvIHRoZQorLy8gc3BsaXQgY2hhbm5lbHMgYWFhYWEgLi4uIHJycnIgLi4uIGdnZ2cgLi4uLiBiYmJiYiAuLi4uLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOEwzMmJUb1BsYW5hcl9TU0UyKF9fbTEyOGkqIGNvbnN0IGluMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMykgeworICAvLyBDb2x1bW4td2lzZSB0cmFuc3Bvc2UuCisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fdW5wYWNrbG9fZXBpOCgqaW4wLCAqaW4xKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2toaV9lcGk4KCppbjAsICppbjEpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3VucGFja2xvX2VwaTgoKmluMiwgKmluMyk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fdW5wYWNraGlfZXBpOCgqaW4yLCAqaW4zKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGk4KEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNraGlfZXBpOChBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX3VucGFja2xvX2VwaTgoQTIsIEEzKTsKKyAgY29uc3QgX19tMTI4aSBCMyA9IF9tbV91bnBhY2toaV9lcGk4KEEyLCBBMyk7CisgIC8vIEMwID0gZzcgZzYgLi4uIGcxIGcwIHwgYjcgYjYgLi4uIGIxIGIwCisgIC8vIEMxID0gYTcgYTYgLi4uIGExIGEwIHwgcjcgcjYgLi4uIHIxIHIwCisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChCMCwgQjEpOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTgoQjAsIEIxKTsKKyAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV91bnBhY2tsb19lcGk4KEIyLCBCMyk7CisgIGNvbnN0IF9fbTEyOGkgQzMgPSBfbW1fdW5wYWNraGlfZXBpOChCMiwgQjMpOworICAvLyBHYXRoZXIgdGhlIGNoYW5uZWxzLgorICAqaW4wID0gX21tX3VucGFja2hpX2VwaTY0KEMxLCBDMyk7CisgICppbjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQzEsIEMzKTsKKyAgKmluMiA9IF9tbV91bnBhY2toaV9lcGk2NChDMCwgQzIpOworICAqaW4zID0gX21tX3VucGFja2xvX2VwaTY0KEMwLCBDMik7Cit9CisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRFNQX0NPTU1PTl9TU0UyX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2U0MS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlNDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE3M2MwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlNDEuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQgY29kZSBjb21tb24gdG8gc2V2ZXJhbCBmaWxlcy4KKy8vCisvLyBBdXRob3I6IFZpbmNlbnQgUmFiYXVkICh2cmFiYXVkQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfQ09NTU9OX1NTRTQxX0hfCisjZGVmaW5lIFdFQlBfRFNQX0NPTU1PTl9TU0U0MV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hhbm5lbCBtaXhpbmcuCisvLyBTaHVmZmxlcyB0aGUgaW5wdXQgYnVmZmVyIGFzIEEwIDAgMCBBMSAwIDAgQTIgLi4uCisjZGVmaW5lIFdFQlBfU1NFNDFfU0hVRkYoT1VULCBJTjAsIElOMSkgICAgXAorICBPVVQjIzAgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjAsIHNodWZmMCk7IFwKKyAgT1VUIyMxID0gX21tX3NodWZmbGVfZXBpOCgqSU4wLCBzaHVmZjEpOyBcCisgIE9VVCMjMiA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMCwgc2h1ZmYyKTsgXAorICBPVVQjIzMgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjEsIHNodWZmMCk7IFwKKyAgT1VUIyM0ID0gX21tX3NodWZmbGVfZXBpOCgqSU4xLCBzaHVmZjEpOyBcCisgIE9VVCMjNSA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMSwgc2h1ZmYyKTsKKworLy8gUGFjayB0aGUgcGxhbmFyIGJ1ZmZlcnMKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gdHJpcGxldCBieSB0cmlwbGV0IGluIHRoZSBvdXRwdXQgYnVmZmVyIHJnYiBhcyByZ2JyZ2JyZ2JyZ2IgLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhQbGFuYXJUbzI0Yl9TU0U0MSgKKyAgICBfX20xMjhpKiBjb25zdCBpbjAsIF9fbTEyOGkqIGNvbnN0IGluMSwgX19tMTI4aSogY29uc3QgaW4yLAorICAgIF9fbTEyOGkqIGNvbnN0IGluMywgX19tMTI4aSogY29uc3QgaW40LCBfX20xMjhpKiBjb25zdCBpbjUpIHsKKyAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgUjQsIFI1OworICBfX20xMjhpIEcwLCBHMSwgRzIsIEczLCBHNCwgRzU7CisgIF9fbTEyOGkgQjAsIEIxLCBCMiwgQjMsIEI0LCBCNTsKKworICAvLyBQcm9jZXNzIFIuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgNSwgLTEsIC0xLCA0LCAtMSwgLTEsIDMsIC0xLCAtMSwgMiwgLTEsIC0xLCAxLCAtMSwgLTEsIDApOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgMTAsIC0xLCAtMSwgOSwgLTEsIC0xLCA4LCAtMSwgLTEsIDcsIC0xLCAtMSwgNiwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgLTEsIC0xLCAxNSwgLTEsIC0xLCAxNCwgLTEsIC0xLCAxMywgLTEsIC0xLCAxMiwgLTEsIC0xLCAxMSwgLTEpOworICAgIFdFQlBfU1NFNDFfU0hVRkYoUiwgaW4wLCBpbjEpCisgIH0KKworICAvLyBQcm9jZXNzIEcuCisgIHsKKyAgICAvLyBTYW1lIGFzIGJlZm9yZSwganVzdCBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IG9uZSBhbmQgaW5jbHVkaW5nIHRoZSByaWdodAorICAgIC8vIHBhZGRpbmcuCisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgNCwgLTEsIC0xLCAzLCAtMSwgLTEsIDIsIC0xLCAtMSwgMSwgLTEsIC0xLCAwLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIDEwLCAtMSwgLTEsIDksIC0xLCAtMSwgOCwgLTEsIC0xLCA3LCAtMSwgLTEsIDYsIC0xLCAtMSwgNSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgIC0xLCAxNSwgLTEsIC0xLCAxNCwgLTEsIC0xLCAxMywgLTEsIC0xLCAxMiwgLTEsIC0xLCAxMSwgLTEsIC0xKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKEcsIGluMiwgaW4zKQorICB9CisKKyAgLy8gUHJvY2VzcyBCLgorICB7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCA0LCAtMSwgLTEsIDMsIC0xLCAtMSwgMiwgLTEsIC0xLCAxLCAtMSwgLTEsIDAsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgOSwgLTEsIC0xLCA4LCAtMSwgLTEsIDcsIC0xLCAtMSwgNiwgLTEsIC0xLCA1LCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgICAxNSwgLTEsIC0xLCAxNCwgLTEsIC0xLCAxMywgLTEsIC0xLCAxMiwgLTEsIC0xLCAxMSwgLTEsIC0xLCAxMCk7CisgICAgV0VCUF9TU0U0MV9TSFVGRihCLCBpbjQsIGluNSkKKyAgfQorCisgIC8vIE9SIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIFJHMCA9IF9tbV9vcl9zaTEyOChSMCwgRzApOworICAgIGNvbnN0IF9fbTEyOGkgUkcxID0gX21tX29yX3NpMTI4KFIxLCBHMSk7CisgICAgY29uc3QgX19tMTI4aSBSRzIgPSBfbW1fb3Jfc2kxMjgoUjIsIEcyKTsKKyAgICBjb25zdCBfX20xMjhpIFJHMyA9IF9tbV9vcl9zaTEyOChSMywgRzMpOworICAgIGNvbnN0IF9fbTEyOGkgUkc0ID0gX21tX29yX3NpMTI4KFI0LCBHNCk7CisgICAgY29uc3QgX19tMTI4aSBSRzUgPSBfbW1fb3Jfc2kxMjgoUjUsIEc1KTsKKyAgICAqaW4wID0gX21tX29yX3NpMTI4KFJHMCwgQjApOworICAgICppbjEgPSBfbW1fb3Jfc2kxMjgoUkcxLCBCMSk7CisgICAgKmluMiA9IF9tbV9vcl9zaTEyOChSRzIsIEIyKTsKKyAgICAqaW4zID0gX21tX29yX3NpMTI4KFJHMywgQjMpOworICAgICppbjQgPSBfbW1fb3Jfc2kxMjgoUkc0LCBCNCk7CisgICAgKmluNSA9IF9tbV9vcl9zaTEyOChSRzUsIEI1KTsKKyAgfQorfQorCisjdW5kZWYgV0VCUF9TU0U0MV9TSFVGRgorCisvLyBDb252ZXJ0IGZvdXIgcGFja2VkIGZvdXItY2hhbm5lbCBidWZmZXJzIGxpa2UgYXJnYmFyZ2JhcmdiYXJnYi4uLiBpbnRvIHRoZQorLy8gc3BsaXQgY2hhbm5lbHMgYWFhYWEgLi4uIHJycnIgLi4uIGdnZ2cgLi4uLiBiYmJiYiAuLi4uLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOEwzMmJUb1BsYW5hcl9TU0U0MShfX20xMjhpKiBjb25zdCBpbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjMpIHsKKyAgLy8gYWFhYXJycnJnZ2dnYmJiYgorICBjb25zdCBfX20xMjhpIHNodWZmMCA9CisgICAgICBfbW1fc2V0X2VwaTgoMTUsIDExLCA3LCAzLCAxNCwgMTAsIDYsIDIsIDEzLCA5LCA1LCAxLCAxMiwgOCwgNCwgMCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc2h1ZmZsZV9lcGk4KCppbjAsIHNodWZmMCk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc2h1ZmZsZV9lcGk4KCppbjEsIHNodWZmMCk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc2h1ZmZsZV9lcGk4KCppbjIsIHNodWZmMCk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc2h1ZmZsZV9lcGk4KCppbjMsIHNodWZmMCk7CisgIC8vIEEwQTFSMFIxCisgIC8vIEcwRzFCMEIxCisgIC8vIEEyQTNSMlIzCisgIC8vIEcwRzFCMEIxCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGkzMihBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX3VucGFja2xvX2VwaTMyKEEyLCBBMyk7CisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fdW5wYWNraGlfZXBpMzIoQTIsIEEzKTsKKyAgKmluMyA9IF9tbV91bnBhY2tsb19lcGk2NChCMCwgQjIpOworICAqaW4yID0gX21tX3VucGFja2hpX2VwaTY0KEIwLCBCMik7CisgICppbjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjEsIEIzKTsKKyAgKmluMCA9IF9tbV91bnBhY2toaV9lcGk2NChCMSwgQjMpOworfQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfQ09NTU9OX1NTRTQxX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0LmMKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0LmMKaW5kZXggZDQ5MTZkNy4uNDhmYjNkYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3QuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKIC8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQpAQCAtNywxNiArNywxNiBAQAogLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KLS8vIENvc3QgdGFibGVzIGZvciBsZXZlbCBhbmQgbW9kZXMKLS8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQm9vbGVhbi1jb3N0IGNvc3QgdGFibGUKIApAQCAtNTIsMjkgKzUyLDYgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMZXZlbCBjb3N0IHRhYmxlcwogCi0vLyBGb3IgZWFjaCBnaXZlbiBsZXZlbCwgdGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyB0aGUgcGF0dGVybiBvZiBjb250ZXh0cyB0bwotLy8gdXNlIGZvciBjb2RpbmcgaXQgKGluIFtdWzBdKSBhcyB3ZWxsIGFzIHRoZSBiaXQgdmFsdWUgdG8gdXNlIGZvciBlYWNoCi0vLyBjb250ZXh0IChpbiBbXVsxXSkuCi1jb25zdCB1aW50MTZfdCBWUDhMZXZlbENvZGVzW01BWF9WQVJJQUJMRV9MRVZFTF1bMl0gPSB7Ci0gICAgICAgICAgICAgICAgICB7MHgwMDEsIDB4MDAwfSwgezB4MDA3LCAweDAwMX0sIHsweDAwZiwgMHgwMDV9LAotICB7MHgwMGYsIDB4MDBkfSwgezB4MDMzLCAweDAwM30sIHsweDAzMywgMHgwMDN9LCB7MHgwMzMsIDB4MDIzfSwKLSAgezB4MDMzLCAweDAyM30sIHsweDAzMywgMHgwMjN9LCB7MHgwMzMsIDB4MDIzfSwgezB4MGQzLCAweDAxM30sCi0gIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LAotICB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDkzfSwKLSAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCi0gIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAotICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKLSAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MTUzfQotfTsKLQogLy8gZml4ZWQgY29zdHMgZm9yIGNvZGluZyBsZXZlbHMsIGRlZHVjZSBmcm9tIHRoZSBjb2RpbmcgdHJlZS4KIC8vIFRoaXMgaXMgb25seSB0aGUgcGFydCB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBwcm9iYWJpbGl0eSBzdGF0ZS4KIGNvbnN0IHVpbnQxNl90IFZQOExldmVsRml4ZWRDb3N0c1tNQVhfTEVWRUwgKyAxXSA9IHsKQEAgLTMzNiwxNjEgKzMxMyw5OCBAQAogICA3Njk0LCA3NzAzLCA3NzA5LCA3NzI5LCA3NzM1LCA3NzQ0LCA3NzUwLCA3NzYxCiB9OwogCi1zdGF0aWMgaW50IFZhcmlhYmxlTGV2ZWxDb3N0KGludCBsZXZlbCwgY29uc3QgdWludDhfdCBwcm9iYXNbTlVNX1BST0JBU10pIHsKLSAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMF07Ci0gIGludCBiaXRzID0gVlA4TGV2ZWxDb2Rlc1tsZXZlbCAtIDFdWzFdOwotICBpbnQgY29zdCA9IDA7Ci0gIGludCBpOwotICBmb3IgKGkgPSAyOyBwYXR0ZXJuOyArK2kpIHsKLSAgICBpZiAocGF0dGVybiAmIDEpIHsKLSAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdChiaXRzICYgMSwgcHJvYmFzW2ldKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZXMgZm9yIGxldmVsIGNvZGluZworCitjb25zdCB1aW50OF90IFZQOEVuY0JhbmRzWzE2ICsgMV0gPSB7CisgIDAsIDEsIDIsIDMsIDYsIDQsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDcsCisgIDAgIC8vIHNlbnRpbmVsCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9kZSBjb3N0cworCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdF9DKGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBjb25zdCBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9IHJlcy0+Y29zdHM7CisgIGNvbnN0IHVpbnQxNl90KiB0ID0gY29zdHNbbl1bY3R4MF07CisgIC8vIGJpdF9jb3N0KDEsIHAwKSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiB0W10gdGFibGVzLCBidXQgb25seSBpZiBjdHggIT0gMAorICAvLyAoYXMgcmVxdWlyZWQgYnkgdGhlIHN5bnRheCkuIEZvciBjdHgwID09IDAsIHdlIG5lZWQgdG8gYWRkIGl0IGhlcmUgb3IgaXQnbGwKKyAgLy8gYmUgbWlzc2luZyBkdXJpbmcgdGhlIGxvb3AuCisgIGludCBjb3N0ID0gKGN0eDAgPT0gMCkgPyBWUDhCaXRDb3N0KDEsIHAwKSA6IDA7CisKKyAgaWYgKHJlcy0+bGFzdCA8IDApIHsKKyAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7CisgIH0KKyAgZm9yICg7IG4gPCByZXMtPmxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKKyAgICBjb25zdCBpbnQgY3R4ID0gKHYgPj0gMikgPyAyIDogdjsKKyAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKKyAgICB0ID0gY29zdHNbbiArIDFdW2N0eF07CisgIH0KKyAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KKyAgeworICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKKyAgICBhc3NlcnQodiAhPSAwKTsKKyAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKKyAgICBpZiAobiA8IDE1KSB7CisgICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOworICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKICAgICB9Ci0gICAgYml0cyA+Pj0gMTsKLSAgICBwYXR0ZXJuID4+PSAxOwogICB9CiAgIHJldHVybiBjb3N0OwogfQogCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlLWNhbGMgbGV2ZWwgY29zdHMgb25jZSBmb3IgYWxsCi0KLXZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgaW50IGN0eXBlLCBiYW5kLCBjdHg7Ci0KLSAgaWYgKCFwcm9iYS0+ZGlydHlfKSByZXR1cm47ICAvLyBub3RoaW5nIHRvIGRvLgotCi0gIGZvciAoY3R5cGUgPSAwOyBjdHlwZSA8IE5VTV9UWVBFUzsgKytjdHlwZSkgewotICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBOVU1fQkFORFM7ICsrYmFuZCkgewotICAgICAgZm9yIChjdHggPSAwOyBjdHggPCBOVU1fQ1RYOyArK2N0eCkgewotICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gcHJvYmEtPmNvZWZmc19bY3R5cGVdW2JhbmRdW2N0eF07Ci0gICAgICAgIHVpbnQxNl90KiBjb25zdCB0YWJsZSA9IHByb2JhLT5sZXZlbF9jb3N0X1tjdHlwZV1bYmFuZF1bY3R4XTsKLSAgICAgICAgY29uc3QgaW50IGNvc3RfYmFzZSA9IFZQOEJpdENvc3QoMSwgcFsxXSk7Ci0gICAgICAgIGludCB2OwotICAgICAgICB0YWJsZVswXSA9IFZQOEJpdENvc3QoMCwgcFsxXSk7Ci0gICAgICAgIGZvciAodiA9IDE7IHYgPD0gTUFYX1ZBUklBQkxFX0xFVkVMOyArK3YpIHsKLSAgICAgICAgICB0YWJsZVt2XSA9IGNvc3RfYmFzZSArIFZhcmlhYmxlTGV2ZWxDb3N0KHYsIHApOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0YXJ0aW5nIGF0IGxldmVsIDY3IGFuZCB1cCwgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIGNvc3QgaXMKLSAgICAgICAgLy8gYWN0dWFsbHkgY29uc3RhbnQuCi0gICAgICB9CitzdGF0aWMgdm9pZCBTZXRSZXNpZHVhbENvZWZmc19DKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbjsKKyAgcmVzLT5sYXN0ID0gLTE7CisgIGFzc2VydChyZXMtPmZpcnN0ID09IDAgfHwgY29lZmZzWzBdID09IDApOworICBmb3IgKG4gPSAxNTsgbiA+PSAwOyAtLW4pIHsKKyAgICBpZiAoY29lZmZzW25dKSB7CisgICAgICByZXMtPmxhc3QgPSBuOworICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIHByb2JhLT5kaXJ0eV8gPSAwOworICByZXMtPmNvZWZmcyA9IGNvZWZmczsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1vZGUgY29zdCB0YWJsZXMuCisvLyBpbml0IGZ1bmN0aW9uCiAKLS8vIFRoZXNlIGFyZSB0aGUgZml4ZWQgcHJvYmFiaWxpdGllcyAoaW4gdGhlIGNvZGluZyB0cmVlcykgdHVybmVkIGludG8gYml0LWNvc3QKLS8vIGJ5IGNhbGxpbmcgVlA4Qml0Q29zdCgpLgotY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c1VWWzRdID0geyAzMDIsIDk4NCwgNDM5LCA2NDIgfTsKLS8vIG5vdGU6IHRoZXNlIHZhbHVlcyBpbmNsdWRlIHRoZSBmaXhlZCBWUDhCaXRDb3N0KDEsIDE0NSkgbW9kZSBzZWxlY3Rpb24gY29zdC4KLWNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJMTZbNF0gPSB7IDY2MywgOTE5LCA4NzIsIDkxOSB9OwotY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0k0W05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdID0gewotICB7IHsgIDI1MSwgMTM2MiwgMTkzNCwgMjA4NSwgMjMxNCwgMjIzMCwgMTgzOSwgMTk4OCwgMjQzNywgMjM0OCB9LAotICAgIHsgIDQwMywgIDY4MCwgMTUwNywgMTUxOSwgMjA2MCwgMjAwNSwgMTk5MiwgMTkxNCwgMTkyNCwgMTczMyB9LAotICAgIHsgIDM1MywgMTEyMSwgIDk3MywgMTg5NSwgMjA2MCwgMTc4NywgMTY3MSwgMTUxNiwgMjAxMiwgMTg2OCB9LAotICAgIHsgIDc3MCwgIDg1MiwgMTU4MSwgIDYzMiwgMTM5MywgMTc4MCwgMTgyMywgMTkzNiwgMTA3NCwgMTIxOCB9LAotICAgIHsgIDUxMCwgMTI3MCwgMTQ2NywgMTMxOSwgIDg0NywgMTI3OSwgMTc5MiwgMjA5NCwgMTA4MCwgMTM1MyB9LAotICAgIHsgIDQ4OCwgMTMyMiwgIDkxOCwgMTU3MywgMTMwMCwgIDg4MywgMTgxNCwgMTc1MiwgMTc1NiwgMTUwMiB9LAotICAgIHsgIDQyNSwgIDk5MiwgMTgyMCwgMTUxNCwgMTg0MywgMjQ0MCwgIDkzNywgMTc3MSwgMTkyNCwgMTEyOSB9LAotICAgIHsgIDM2MywgMTI0OCwgMTI1NywgMTk3MCwgMjE5NCwgMjM4NSwgMTU2OSwgIDk1MywgMTk1MSwgMTYwMSB9LAotICAgIHsgIDcyMywgMTI1NywgMTYzMSwgIDk2NCwgIDk2MywgMTUwOCwgMTY5NywgMTgyNCwgIDY3MSwgMTQxOCB9LAotICAgIHsgIDYzNSwgMTAzOCwgMTU3MywgIDkzMCwgMTY3MywgMTQxMywgMTQxMCwgMTY4NywgMTQxMCwgIDc0OSB9IH0sCi0gIHsgeyAgNDUxLCAgNjEzLCAxMzQ1LCAxNzAyLCAxODcwLCAxNzE2LCAxNzI4LCAxNzY2LCAyMTkwLCAyMzEwIH0sCi0gICAgeyAgNjc4LCAgNDUzLCAxMTcxLCAxNDQzLCAxOTI1LCAxODMxLCAyMDQ1LCAxNzgxLCAxODg3LCAxNjAyIH0sCi0gICAgeyAgNzExLCAgNjY2LCAgNjc0LCAxNzE4LCAxOTEwLCAxNDkzLCAxNzc1LCAxMTkzLCAyMzI1LCAyMzI1IH0sCi0gICAgeyAgODgzLCAgODU0LCAxNTgzLCAgNTQyLCAxODAwLCAxODc4LCAxNjY0LCAyMTQ5LCAxMjA3LCAxMDg3IH0sCi0gICAgeyAgNjY5LCAgOTk0LCAxMjQ4LCAxMTIyLCAgOTQ5LCAxMTc5LCAxMzc2LCAxNzI5LCAxMDcwLCAxMjQ0IH0sCi0gICAgeyAgNzE1LCAxMDI2LCAgNzE1LCAxMzUwLCAxNDMwLCAgOTMwLCAxNzE3LCAxMjk2LCAxNDc5LCAxNDc5IH0sCi0gICAgeyAgNTQ0LCAgODQxLCAxNjU2LCAxNDUwLCAyMDk0LCAzODgzLCAxMDEwLCAxNzU5LCAyMDc2LCAgODA5IH0sCi0gICAgeyAgNjEwLCAgODU1LCAgOTU3LCAxNTUzLCAyMDY3LCAxNTYxLCAxNzA0LCAgODI0LCAyMDY2LCAxMjI2IH0sCi0gICAgeyAgODMzLCAgOTYwLCAxNDE2LCAgODE5LCAxMjc3LCAxNjE5LCAxNTAxLCAxNjE3LCAgNzU3LCAxMTgyIH0sCi0gICAgeyAgNzExLCAgOTY0LCAxMjUyLCAgODc5LCAxNDQxLCAxODI4LCAxNTA4LCAxNjM2LCAxNTk0LCAgNzM0IH0gfSwKLSAgeyB7ICA2MDUsICA3NjQsICA3MzQsIDE3MTMsIDE3NDcsIDExOTIsIDE4MTksIDEzNTMsIDE4NzcsIDIzOTIgfSwKLSAgICB7ICA4NjYsICA2NDEsICA1ODYsIDE2MjIsIDIwNzIsIDE0MzEsIDE4ODgsIDEzNDYsIDIxODksIDE3NjQgfSwKLSAgICB7ICA5MDEsICA4NTEsICA0NTYsIDIxNjUsIDIyODEsIDE0MDUsIDE3MzksIDExOTMsIDIxODMsIDI0NDMgfSwKLSAgICB7ICA3NzAsIDEwNDUsICA5NTIsIDEwNzgsIDEzNDIsIDExOTEsIDE0MzYsIDEwNjMsIDEzMDMsICA5OTUgfSwKLSAgICB7ICA5MDEsIDEwODYsICA3MjcsIDExNzAsICA4ODQsIDExMDUsIDEyNjcsIDE0MDEsIDE3MzksIDEzMzcgfSwKLSAgICB7ICA5NTEsIDExNjIsICA1OTUsIDE0ODgsIDEzODgsICA3MDMsIDE3OTAsIDEzNjYsIDIwNTcsIDE3MjQgfSwKLSAgICB7ICA1MzQsICA5ODYsIDEyNzMsIDE5ODcsIDMyNzMsIDE0ODUsIDEwMjQsIDEzOTksIDE1ODMsICA4NjYgfSwKLSAgICB7ICA2OTksIDExODIsICA2OTUsIDE5NzgsIDE3MjYsIDE5ODYsIDEzMjYsICA3MTQsIDE3NTAsIDE2NzIgfSwKLSAgICB7ICA5NTEsIDEyMTcsIDEyMDksICA5MjAsIDEwNjIsIDE0NDEsIDE1NDgsICA5OTksICA5NTIsICA5MzIgfSwKLSAgICB7ICA3MzMsIDEyODQsICA3ODQsIDEyNTYsIDE1NTcsIDEwOTgsIDEyNTcsIDEzNTcsIDE0MTQsICA5MDggfSB9LAotICB7IHsgIDMxNiwgMTA3NSwgMTY1MywgMTIyMCwgMjE0NSwgMjA1MSwgMTczMCwgMjEzMSwgMTg4NCwgMTc5MCB9LAotICAgIHsgIDc0NSwgIDUxNiwgMTQwNCwgIDg5NCwgMTU5OSwgMjM3NSwgMjAxMywgMjEwNSwgMTQ3NSwgMTM4MSB9LAotICAgIHsgIDUxNiwgIDcyOSwgMTA4OCwgMTMxOSwgMTYzNywgMzQyNiwgMTYzNiwgMTI3NSwgMTUzMSwgMTQ1MyB9LAotICAgIHsgIDg5NCwgIDk0MywgMjEzOCwgIDQ2OCwgMTcwNCwgMjI1OSwgMjA2OSwgMTc2MywgMTI2NiwgMTE1OCB9LAotICAgIHsgIDYwNSwgMTAyNSwgMTIzNSwgIDg3MSwgMTE3MCwgMTc2NywgMTQ5MywgMTUwMCwgMTEwNCwgMTI1OCB9LAotICAgIHsgIDczOSwgIDgyNiwgMTIwNywgMTE1MSwgMTQxMiwgIDg0NiwgMTMwNSwgMjcyNiwgMTAxNCwgMTU2OSB9LAotICAgIHsgIDU1OCwgIDgyNSwgMTgyMCwgMTM5OCwgMzM0NCwgMTU1NiwgMTIxOCwgMTU1MCwgMTIyOCwgIDg3OCB9LAotICAgIHsgIDQyOSwgIDk1MSwgMTA4OSwgMTgxNiwgMzg2MSwgMzg2MSwgMTU1NiwgIDk2OSwgMTU2OCwgMTgyOCB9LAotICAgIHsgIDg4MywgIDk2MSwgMTc1MiwgIDc2OSwgMTQ2OCwgMTgxMCwgMjA4MSwgMjM0NiwgIDYxMywgMTI5OCB9LAotICAgIHsgIDgwMywgIDg5NSwgMTM3MiwgIDY0MSwgMTMwMywgMTcwOCwgMTY4NiwgMTcwMCwgMTMwNiwgMTAzMyB9IH0sCi0gIHsgeyAgNDM5LCAxMjY3LCAxMjcwLCAxNTc5LCAgOTYzLCAxMTkzLCAxNzIzLCAxNzI5LCAxMTk4LCAxOTkzIH0sCi0gICAgeyAgNzA1LCAgNzI1LCAxMDI5LCAxMTUzLCAxMTc2LCAxMTAzLCAxODIxLCAxNTY3LCAxMjU5LCAxNTc0IH0sCi0gICAgeyAgNzIzLCAgODU5LCAgODAyLCAxMjUzLCAgOTcyLCAxMjAyLCAxNDA3LCAxNjY1LCAxNTIwLCAxNjc0IH0sCi0gICAgeyAgODk0LCAgOTYwLCAxMjU0LCAgODg3LCAxMDUyLCAxNjA3LCAxMzQ0LCAxMzQ5LCAgODY1LCAxMTUwIH0sCi0gICAgeyAgODMzLCAxMzEyLCAxMzM3LCAxMjA1LCAgNTcyLCAxMjg4LCAxNDE0LCAxNTI5LCAxMDg4LCAxNDMwIH0sCi0gICAgeyAgODQyLCAxMjc5LCAxMDY4LCAxODYxLCAgODYyLCAgNjg4LCAxODYxLCAxNjMwLCAxMDM5LCAxMzgxIH0sCi0gICAgeyAgNzY2LCAgOTM4LCAxMjc5LCAxNTQ2LCAzMzM4LCAxNTUwLCAxMDMxLCAxNTQyLCAxMjg4LCAgNjQwIH0sCi0gICAgeyAgNzE1LCAxMDkwLCAgODM1LCAxNjA5LCAxMTAwLCAxMTAwLCAxNjAzLCAxMDE5LCAxMTAyLCAxNjE3IH0sCi0gICAgeyAgODk0LCAxODEzLCAxNTAwLCAxMTg4LCAgNzg5LCAxMTk0LCAxNDkxLCAxOTE5LCAgNjE3LCAxMzMzIH0sCi0gICAgeyAgNjEwLCAxMDc2LCAxNjQ0LCAxMjgxLCAxMjgzLCAgOTc1LCAxMTc5LCAxNjg4LCAxNDM0LCAgODg5IH0gfSwKLSAgeyB7ICA1NDQsICA5NzEsIDExNDYsIDE4NDksIDEyMjEsICA3NDAsIDE4NTcsIDE2MjEsIDE2ODMsIDI0MzAgfSwKLSAgICB7ICA3MjMsICA3MDUsICA5NjEsIDEzNzEsIDE0MjYsICA4MjEsIDIwODEsIDIwNzksIDE4MzksIDEzODAgfSwKLSAgICB7ICA3ODMsICA4NTcsICA3MDMsIDIxNDUsIDE0MTksICA4MTQsIDE3OTEsIDEzMTAsIDE2MDksIDIyMDYgfSwKLSAgICB7ICA5OTcsIDEwMDAsIDExNTMsICA3OTIsIDEyMjksIDExNjIsIDE4MTAsIDE0MTgsICA5NDIsICA5NzkgfSwKLSAgICB7ICA5MDEsIDEyMjYsICA4ODMsIDEyODksICA3OTMsICA3MTUsIDE5MDQsIDE2NDksIDEzMTksIDMxMDggfSwKLSAgICB7ICA5NzksIDE0NzgsICA3ODIsIDIyMTYsIDE0NTQsICA0NTUsIDMwOTIsIDE1OTEsIDE5OTcsIDE2NjQgfSwKLSAgICB7ICA2NjMsIDExMTAsIDE1MDQsIDExMTQsIDE1MjIsIDMzMTEsICA2NzYsIDE1MjIsIDE1MzAsIDEwMjQgfSwKLSAgICB7ICA2MDUsIDExMzgsIDExNTMsIDEzMTQsIDE1NjksIDEzMTUsIDExNTcsICA4MDQsIDE1NzQsIDEzMjAgfSwKLSAgICB7ICA3NzAsIDEyMTYsIDEyMTgsIDEyMjcsICA4NjksIDEzODQsIDEyMzIsIDEzNzUsICA4MzQsIDEyMzkgfSwKLSAgICB7ICA3NzUsIDEwMDcsICA4NDMsIDEyMTYsIDEyMjUsIDEwNzQsIDI1MjcsIDE0NzksIDExNDksICA5NzUgfSB9LAotICB7IHsgIDQ3NywgIDgxNywgMTMwOSwgMTQzOSwgMTcwOCwgMTQ1NCwgMTE1OSwgMTI0MSwgMTk0NSwgMTY3MiB9LAotICAgIHsgIDU3NywgIDc5NiwgMTExMiwgMTI3MSwgMTYxOCwgMTQ1OCwgMTA4NywgMTM0NSwgMTgzMSwgMTI2NSB9LAotICAgIHsgIDY2MywgIDc3NiwgIDc1MywgMTk0MCwgMTY5MCwgMTY5MCwgMTIyNywgMTA5NywgMzE0OSwgMTM2MSB9LAotICAgIHsgIDc2NiwgMTI5OSwgMTc0NCwgMTE2MSwgMTU2NSwgMTEwNiwgMTA0NSwgMTIzMCwgMTIzMiwgIDcwNyB9LAotICAgIHsgIDkxNSwgMTAyNiwgMTQwNCwgMTE4MiwgMTE4NCwgIDg1MSwgMTQyOCwgMjQyNSwgMTA0MywgIDc4OSB9LAotICAgIHsgIDg4MywgMTQ1NiwgIDc5MCwgMTA4MiwgMTA4NiwgIDk4NSwgMTA4MywgMTQ4NCwgMTIzOCwgMTE2MCB9LAotICAgIHsgIDUwNywgMTM0NSwgMjI2MSwgMTk5NSwgMTg0NywgMzYzNiwgIDY1MywgMTc2MSwgMjI4NywgIDkzMyB9LAotICAgIHsgIDU1MywgMTE5MywgMTQ3MCwgMjA1NywgMjA1OSwgMjA1OSwgIDgzMywgIDc3OSwgMjA1OCwgMTI2MyB9LAotICAgIHsgIDc2NiwgMTI3NSwgMTUxNSwgMTAzOSwgIDk1NywgMTU1NCwgMTI4NiwgMTU0MCwgMTI4OSwgIDcwNSB9LAotICAgIHsgIDQ5OSwgMTM3OCwgMTQ5NiwgMTM4NSwgMTg1MCwgMTg1MCwgMTA0NCwgMjQ2NSwgMTUxNSwgIDcyMCB9IH0sCi0gIHsgeyAgNTUzLCAgOTMwLCAgOTc4LCAyMDc3LCAxOTY4LCAxNDgxLCAxNDU3LCAgNzYxLCAxOTU3LCAyMzYyIH0sCi0gICAgeyAgNjk0LCAgODY0LCAgOTA1LCAxNzIwLCAxNjcwLCAxNjIxLCAxNDI5LCAgNzE4LCAyMTI1LCAxNDc3IH0sCi0gICAgeyAgNjk5LCAgOTY4LCAgNjU4LCAzMTkwLCAyMDI0LCAxNDc5LCAxODY1LCAgNzUwLCAyMDYwLCAyMzIwIH0sCi0gICAgeyAgNzMzLCAxMzA4LCAxMjk2LCAxMDYyLCAxNTc2LCAxMzIyLCAxMDYyLCAxMTEyLCAxMTcyLCAgODE2IH0sCi0gICAgeyAgOTIwLCAgOTI3LCAxMDUyLCAgOTM5LCAgOTQ3LCAxMTU2LCAxMTUyLCAxMDczLCAzMDU2LCAxMjY4IH0sCi0gICAgeyAgNzIzLCAxNTM0LCAgNzExLCAxNTQ3LCAxMjk0LCAgODkyLCAxNTUzLCAgOTI4LCAxODE1LCAxNTYxIH0sCi0gICAgeyAgNjYzLCAxMzY2LCAxNTgzLCAyMTExLCAxNzEyLCAzNTAxLCAgNTIyLCAxMTU1LCAyMTMwLCAxMTMzIH0sCi0gICAgeyAgNjE0LCAxNzMxLCAxMTg4LCAyMzQzLCAxOTQ0LCAzNzMzLCAxMjg3LCAgNDg3LCAzNTQ2LCAxNzU4IH0sCi0gICAgeyAgNzcwLCAxNTg1LCAxMzEyLCAgODI2LCAgODg0LCAyNjczLCAxMTg1LCAxMDA2LCAxMTk1LCAxMTk1IH0sCi0gICAgeyAgNzU4LCAxMzMzLCAxMjczLCAxMDIzLCAxNjIxLCAxMTYyLCAxMzUxLCAgODMzLCAxNDc5LCAgODYyIH0gfSwKLSAgeyB7ICAzNzYsIDExOTMsIDE0NDYsIDExNDksIDE1NDUsIDE1NzcsIDE4NzAsIDE3ODksIDExNzUsIDE4MjMgfSwKLSAgICB7ICA4MDMsICA2MzMsIDExMzYsIDEwNTgsIDEzNTAsIDEzMjMsIDE1OTgsIDIyNDcsIDEwNzIsIDEyNTIgfSwKLSAgICB7ICA2MTQsIDEwNDgsICA5NDMsICA5ODEsIDExNTIsIDE4NjksIDE0NjEsIDEwMjAsIDE2MTgsIDE2MTggfSwKLSAgICB7IDExMDcsIDEwODUsIDEyODIsICA1OTIsIDE3NzksIDE5MzMsIDE2NDgsIDI0MDMsICA2OTEsIDEyNDYgfSwKLSAgICB7ICA4NTEsIDEzMDksIDEyMjMsIDEyNDMsICA4OTUsIDE1OTMsIDE3OTIsIDIzMTcsICA2MjcsIDEwNzYgfSwKLSAgICB7ICA3NzAsIDEyMTYsIDEwMzAsIDExMjUsICA5MjEsICA5ODEsIDE2MjksIDExMzEsIDEwNDksIDE2NDYgfSwKLSAgICB7ICA2MjYsIDE0NjksIDE0NTYsIDEwODEsIDE0ODksIDMyNzgsICA5ODEsIDEyMzIsIDE0OTgsICA3MzMgfSwKLSAgICB7ICA2MTcsIDEyMDEsICA4MTIsIDEyMjAsIDE0NzYsIDE0NzYsIDE0NzgsICA5NzAsIDEyMjgsIDE0ODggfSwKLSAgICB7IDExNzksIDEzOTMsIDE1NDAsICA5OTksIDEyNDMsIDE1MDMsIDE5MTYsIDE5MjUsICA0MTQsIDE2MTQgfSwKLSAgICB7ICA5NDMsIDEwODgsIDE0OTAsICA2ODIsIDExMTIsIDEzNzIsIDE3NTYsIDE1MDUsICA5NjYsICA5NjYgfSB9LAotICB7IHsgIDMyMiwgMTE0MiwgMTU4OSwgMTM5NiwgMjE0NCwgMTg1OSwgMTM1OSwgMTkyNSwgMjA4NCwgMTUxOCB9LAotICAgIHsgIDYxNywgIDYyNSwgMTI0MSwgMTIzNCwgMjEyMSwgMTYxNSwgMTUyNCwgMTg1OCwgMTcyMCwgMTAwNCB9LAotICAgIHsgIDU1MywgIDg1MSwgIDc4NiwgMTI5OSwgMTQ1MiwgMTU2MCwgMTM3MiwgMTU2MSwgMTk2NywgMTcxMyB9LAotICAgIHsgIDc3MCwgIDk3NywgMTM5NiwgIDU2OCwgMTg5MywgMTYzOSwgMTU0MCwgMjEwOCwgMTQzMCwgMTAxMyB9LAotICAgIHsgIDY4NCwgMTEyMCwgMTM3NSwgIDk4MiwgIDkzMCwgMjcxOSwgMTYzOCwgMTY0MywgIDkzMywgIDk5MyB9LAotICAgIHsgIDU1MywgMTEwMywgIDk5NiwgMTM1NiwgMTM2MSwgMTAwNSwgMTUwNywgMTc2MSwgMTE4NCwgMTI2OCB9LAotICAgIHsgIDQxOSwgMTI0NywgMTUzNywgMTU1NCwgMTgxNywgMzYwNiwgMTAyNiwgMTY2NiwgMTgyOSwgIDkyMyB9LAotICAgIHsgIDQzOSwgMTEzOSwgMTEwMSwgMTI1NywgMzcxMCwgMTkyMiwgMTIwNSwgMTA0MCwgMTkzMSwgMTUyOSB9LAotICAgIHsgIDk3OSwgIDkzNSwgMTI2OSwgIDg0NywgMTIwMiwgMTI4NiwgMTUzMCwgMTUzNSwgIDgyNywgMTAzNiB9LAotICAgIHsgIDUxNiwgMTM3OCwgMTU2OSwgMTExMCwgMTc5OCwgMTc5OCwgMTE5OCwgMjE5OSwgMTU0MywgIDcxMiB9IH0sCi19OworVlA4R2V0UmVzaWR1YWxDb3N0RnVuYyBWUDhHZXRSZXNpZHVhbENvc3Q7CitWUDhTZXRSZXNpZHVhbENvZWZmc0Z1bmMgVlA4U2V0UmVzaWR1YWxDb2VmZnM7CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdFNTRTIodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhFbmNEc3BDb3N0SW5pdCkgeworICBWUDhHZXRSZXNpZHVhbENvc3QgPSBHZXRSZXNpZHVhbENvc3RfQzsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMgPSBTZXRSZXNpZHVhbENvZWZmc19DOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOEVuY0RzcENvc3RJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorICB9Cit9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzU4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwczMyLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdF9NSVBTMzIoaW50IGN0eDAsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMTsKKyAgaW50IHZfcmVnLCBjdHhfcmVnOworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworICBjb25zdCBpbnQxNl90KiByZXNfY29lZmZzID0gcmVzLT5jb2VmZnM7CisgIGNvbnN0IGludCByZXNfbGFzdCA9IHJlcy0+bGFzdDsKKyAgY29uc3QgaW50IGNvbnN0X21heF9sZXZlbCA9IE1BWF9WQVJJQUJMRV9MRVZFTDsKKyAgY29uc3QgaW50IGNvbnN0XzIgPSAyOworICBjb25zdCB1aW50MTZfdCoqIHBfY29zdHMgPSAmY29zdHNbbl1bMF07CisgIGNvbnN0IHNpemVfdCBpbmNfcF9jb3N0cyA9IE5VTV9DVFggKiBzaXplb2YoKnBfY29zdHMpOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgICAgICAgJVtyZXNfbGFzdF0sICAgICAgICAlW25dICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbbl0sICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibGV6ICAgICAgJVt0ZW1wMV0sICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZHUgICAgICVbcmVzX2NvZWZmc10sICAgJVtyZXNfY29lZmZzXSwgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAgJVt2X3JlZ10sICAgICAgICAwKCVbcmVzX2NvZWZmc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbbl0sICAgICAgICAgICAgJVtuXSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbHRpICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92biAgICAgICVbdl9yZWddLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdGl1ICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3ZlICAgICAgJVtjdHhfcmVnXSwgICAgICAlW3ZfcmVnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgICVbY3R4X3JlZ10sICAgICAgJVtjb25zdF8yXSwgICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAxXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3RlbXAxXSwgICAgICAgICAgICVbVlA4TGV2ZWxGaXhlZENvc3RzXSAgXG5cdCIKKyAgICAibGh1ICAgICAgICVbdGVtcDFdLCAgICAgICAgMCglW3RlbXAxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgJVtjb25zdF9tYXhfbGV2ZWxdICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgJVt2X3JlZ10sICAgICAgICAlW2NvbnN0X21heF9sZXZlbF0sICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbY29zdF0sICAgICAgICAgJVtjb3N0XSwgICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3ZfcmVnXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2N0eF9yZWddLCAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdl9yZWddLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAlW3RdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxodSAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVt2X3JlZ10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwX2Nvc3RzXSwgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbaW5jX3BfY29zdHNdICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdF0sICAgICAgICAgICAgJVtwX2Nvc3RzXSwgICAgICAgICAlW2N0eF9yZWddICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtyZXNfY29lZmZzXSwgICAlW3Jlc19jb2VmZnNdLCAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICVbbl0sICAgICAgICAgICAgJVtyZXNfbGFzdF0sICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBsdyAgICAgICAlW3RdLCAgICAgICAgICAgIDAoJVt0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbY29zdF0iKyZyIihjb3N0KSwgW3RdIismciIodCksIFtuXSIrJnIiKG4pLCBbdl9yZWddIj0mciIodl9yZWcpLAorICAgICAgW2N0eF9yZWddIj0mciIoY3R4X3JlZyksIFtwX2Nvc3RzXSIrJnIiKHBfY29zdHMpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3Jlc19jb2VmZnNdIismciIocmVzX2NvZWZmcykKKyAgICA6IFtjb25zdF8yXSJyIihjb25zdF8yKSwgW2NvbnN0X21heF9sZXZlbF0iciIoY29uc3RfbWF4X2xldmVsKSwKKyAgICAgIFtWUDhMZXZlbEZpeGVkQ29zdHNdInIiKFZQOExldmVsRml4ZWRDb3N0cyksIFtyZXNfbGFzdF0iciIocmVzX2xhc3QpLAorICAgICAgW2luY19wX2Nvc3RzXSJyIihpbmNfcF9jb3N0cykKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KKyAgeworICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKKyAgICBhc3NlcnQodiAhPSAwKTsKKyAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKKyAgICBpZiAobiA8IDE1KSB7CisgICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOworICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKK3N0YXRpYyB2b2lkIFNldFJlc2lkdWFsQ29lZmZzX01JUFMzMihjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBjb25zdCBpbnQxNl90KiBwX2NvZWZmcyA9IChpbnQxNl90Kiljb2VmZnM7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCBuLCBuMTsKKyAgYXNzZXJ0KHJlcy0+Zmlyc3QgPT0gMCB8fCBjb2VmZnNbMF0gPT0gMCk7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbcF9jb2VmZnNdLCAgICVbcF9jb2VmZnNdLCAgICAyOCAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICVbbl0sICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICVbdGVtcDJdLCAgICAgIC0xICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICVbdGVtcDBdLCAgICAgIDAoJVtwX2NvZWZmc10pICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDBdLCAgICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgICAgIiBzbGwgICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDBdLCAgICAgICAxNiAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICIgc3JsICAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSwgICAgICAgMTYgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImFkZGl1ICAgICVbbjFdLCAgICAgICAgICVbbl0sICAgICAgICAgICAtMSAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDBdLCAgICAgICVbbjFdLCAgICAgICAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgIm1vdm4gICAgICVbdGVtcDBdLCAgICAgICVbbl0sICAgICAgICAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImogICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICVbdGVtcDJdLCAgICAgICVbdGVtcDBdLCAgICAgICAwICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbbl0sICAgICAgICAgICVbbl0sICAgICAgICAgICAtMiAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICVbbl0sICAgICAgICAgIDBiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICVbcF9jb2VmZnNdLCAgICVbcF9jb2VmZnNdLCAgICAtNCAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbcF9jb2VmZnNdIismciIocF9jb2VmZnMpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFtuXSI9JnIiKG4pLCBbbjFdIj0mciIobjEpCisgICAgOgorICAgIDogIm1lbW9yeSIKKyAgKTsKKyAgcmVzLT5sYXN0ID0gdGVtcDI7CisgIHJlcy0+Y29lZmZzID0gY29lZmZzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdF9NSVBTMzI7CisgIFZQOFNldFJlc2lkdWFsQ29lZmZzID0gU2V0UmVzaWR1YWxDb2VmZnNfTUlQUzMyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzE1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworc3RhdGljIGludCBHZXRSZXNpZHVhbENvc3RfTUlQU2RzcFIyKGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCB0ZW1wMCwgdGVtcDE7CisgIGludCB2X3JlZywgY3R4X3JlZzsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGludCBwMCA9IHJlcy0+cHJvYltuXVtjdHgwXVswXTsKKyAgQ29zdEFycmF5UHRyIGNvbnN0IGNvc3RzID0gcmVzLT5jb3N0czsKKyAgY29uc3QgdWludDE2X3QqIHQgPSBjb3N0c1tuXVtjdHgwXTsKKyAgLy8gYml0X2Nvc3QoMSwgcDApIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGluIHRbXSB0YWJsZXMsIGJ1dCBvbmx5IGlmIGN0eCAhPSAwCisgIC8vIChhcyByZXF1aXJlZCBieSB0aGUgc3ludGF4KS4gRm9yIGN0eDAgPT0gMCwgd2UgbmVlZCB0byBhZGQgaXQgaGVyZSBvciBpdCdsbAorICAvLyBiZSBtaXNzaW5nIGR1cmluZyB0aGUgbG9vcC4KKyAgaW50IGNvc3QgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgcDApIDogMDsKKyAgY29uc3QgaW50MTZfdCogcmVzX2NvZWZmcyA9IHJlcy0+Y29lZmZzOworICBjb25zdCBpbnQgcmVzX2xhc3QgPSByZXMtPmxhc3Q7CisgIGNvbnN0IGludCBjb25zdF9tYXhfbGV2ZWwgPSBNQVhfVkFSSUFCTEVfTEVWRUw7CisgIGNvbnN0IGludCBjb25zdF8yID0gMjsKKyAgY29uc3QgdWludDE2X3QqKiBwX2Nvc3RzID0gJmNvc3RzW25dWzBdOworICBjb25zdCBzaXplX3QgaW5jX3BfY29zdHMgPSBOVU1fQ1RYICogc2l6ZW9mKCpwX2Nvc3RzKTsKKworICBpZiAocmVzLT5sYXN0IDwgMCkgeworICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKKyAgfQorCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICAgICAgICVbcmVzX2xhc3RdLCAgICAgICAgJVtuXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJibGV6ICAgICAgJVt0ZW1wMV0sICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh4ICAgICAgICVbdl9yZWddLCAgICAgICAgJVt0ZW1wMF0oJVtyZXNfY29lZmZzXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW25dLCAgICAgICAgICAgICVbbl0sICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0aXUgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdmUgICAgICAlW2N0eF9yZWddLCAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2NvbnN0XzJdLCAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDFdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoeCAgICAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdKCVbVlA4TGV2ZWxGaXhlZENvc3RzXSkgICAgICAgICBcblx0IgorICAgICJzbHQgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSAgXG5cdCIKKyAgICAibW92eiAgICAgICVbdl9yZWddLCAgICAgICAgJVtjb25zdF9tYXhfbGV2ZWxdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbY3R4X3JlZ10sICAgICAgJVtjdHhfcmVnXSwgICAgICAgICAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoeCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddKCVbdF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwX2Nvc3RzXSwgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbaW5jX3BfY29zdHNdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdF0sICAgICAgICAgICAgJVtwX2Nvc3RzXSwgICAgICAgICAlW2N0eF9yZWddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgJVtuXSwgICAgICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGx3ICAgICAgICVbdF0sICAgICAgICAgICAgMCglW3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtjb3N0XSIrJnIiKGNvc3QpLCBbdF0iKyZyIih0KSwgW25dIismciIobiksIFt2X3JlZ10iPSZyIih2X3JlZyksCisgICAgICBbY3R4X3JlZ10iPSZyIihjdHhfcmVnKSwgW3BfY29zdHNdIismciIocF9jb3N0cyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpCisgICAgOiBbY29uc3RfMl0iciIoY29uc3RfMiksIFtjb25zdF9tYXhfbGV2ZWxdInIiKGNvbnN0X21heF9sZXZlbCksCisgICAgICBbVlA4TGV2ZWxGaXhlZENvc3RzXSJyIihWUDhMZXZlbEZpeGVkQ29zdHMpLCBbcmVzX2xhc3RdInIiKHJlc19sYXN0KSwKKyAgICAgIFtyZXNfY29lZmZzXSJyIihyZXNfY29lZmZzKSwgW2luY19wX2Nvc3RzXSJyIihpbmNfcF9jb3N0cykKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KKyAgeworICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKKyAgICBhc3NlcnQodiAhPSAwKTsKKyAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKKyAgICBpZiAobiA8IDE1KSB7CisgICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOworICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4R2V0UmVzaWR1YWxDb3N0ID0gR2V0UmVzaWR1YWxDb3N0X01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwQ29zdEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3Rfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjAwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3Rfc3NlMi5jCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIGNvc3QgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBTZXRSZXNpZHVhbENvZWZmc19TU0UyKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBjb25zdCBfX20xMjhpIGMwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoY29lZmZzICsgMCkpOworICBjb25zdCBfX20xMjhpIGMxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoY29lZmZzICsgOCkpOworICAvLyBVc2UgU1NFMiB0byBjb21wYXJlIDE2IHZhbHVlcyB3aXRoIGEgc2luZ2xlIGluc3RydWN0aW9uLgorICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIG0wID0gX21tX3BhY2tzX2VwaTE2KGMwLCBjMSk7CisgIGNvbnN0IF9fbTEyOGkgbTEgPSBfbW1fY21wZXFfZXBpOChtMCwgemVybyk7CisgIC8vIEdldCB0aGUgY29tcGFyaXNvbiByZXN1bHRzIGFzIGEgYml0bWFzayBpbnRvIDE2Yml0cy4gTmVnYXRlIHRoZSBtYXNrIHRvIGdldAorICAvLyB0aGUgcG9zaXRpb24gb2YgZW50cmllcyB0aGF0IGFyZSBub3QgZXF1YWwgdG8gemVyby4gV2UgZG9uJ3QgbmVlZCB0byBtYXNrCisgIC8vIG91dCBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFjY29yZGluZyB0byByZXMtPmZpcnN0LCBzaW5jZSBjb2VmZnNbMF0gaXMgMAorICAvLyBpZiByZXMtPmZpcnN0ID4gMC4KKyAgY29uc3QgdWludDMyX3QgbWFzayA9IDB4MDAwMGZmZmZ1IF4gKHVpbnQzMl90KV9tbV9tb3ZlbWFza19lcGk4KG0xKTsKKyAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IG5vbi16ZXJvIGJpdCBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mCisgIC8vIHRoZSBsYXN0IG5vbi16ZXJvIHZhbHVlLgorICBhc3NlcnQocmVzLT5maXJzdCA9PSAwIHx8IGNvZWZmc1swXSA9PSAwKTsKKyAgcmVzLT5sYXN0ID0gbWFzayA/IEJpdHNMb2cyRmxvb3IobWFzaykgOiAtMTsKKyAgcmVzLT5jb2VmZnMgPSBjb2VmZnM7Cit9CisKK3N0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0X1NTRTIoaW50IGN0eDAsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgdWludDhfdCBsZXZlbHNbMTZdLCBjdHhzWzE2XTsKKyAgdWludDE2X3QgYWJzX2xldmVsc1sxNl07CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBjb25zdCBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9IHJlcy0+Y29zdHM7CisgIGNvbnN0IHVpbnQxNl90KiB0ID0gY29zdHNbbl1bY3R4MF07CisgIC8vIGJpdF9jb3N0KDEsIHAwKSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiB0W10gdGFibGVzLCBidXQgb25seSBpZiBjdHggIT0gMAorICAvLyAoYXMgcmVxdWlyZWQgYnkgdGhlIHN5bnRheCkuIEZvciBjdHgwID09IDAsIHdlIG5lZWQgdG8gYWRkIGl0IGhlcmUgb3IgaXQnbGwKKyAgLy8gYmUgbWlzc2luZyBkdXJpbmcgdGhlIGxvb3AuCisgIGludCBjb3N0ID0gKGN0eDAgPT0gMCkgPyBWUDhCaXRDb3N0KDEsIHAwKSA6IDA7CisKKyAgaWYgKHJlcy0+bGFzdCA8IDApIHsKKyAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7CisgIH0KKworICB7ICAgLy8gcHJlY29tcHV0ZSBjbGFtcGVkIGxldmVscyBhbmQgY29udGV4dHMsIHBhY2tlZCB0byA4Yi4KKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGNvbnN0IF9fbTEyOGkga0NzdDIgPSBfbW1fc2V0MV9lcGk4KDIpOworICAgIGNvbnN0IF9fbTEyOGkga0NzdDY3ID0gX21tX3NldDFfZXBpOChNQVhfVkFSSUFCTEVfTEVWRUwpOworICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZXMtPmNvZWZmc1swXSk7CisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlcy0+Y29lZmZzWzhdKTsKKyAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBjMCk7CisgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9zdWJfZXBpMTYoemVybywgYzEpOworICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fbWF4X2VwaTE2KGMwLCBEMCk7ICAgLy8gYWJzKHYpLCAxNmIKKyAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX21heF9lcGkxNihjMSwgRDEpOworICAgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9wYWNrc19lcGkxNihFMCwgRTEpOworICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9taW5fZXB1OChGLCBrQ3N0Mik7ICAgIC8vIGNvbnRleHQgPSAwLDEsMgorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9taW5fZXB1OChGLCBrQ3N0NjcpOyAgIC8vIGNsYW1wX2xldmVsIGluIFswLi42N10KKworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZjdHhzWzBdLCBHKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmbGV2ZWxzWzBdLCBIKTsKKworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhYnNfbGV2ZWxzWzBdLCBFMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFic19sZXZlbHNbOF0sIEUxKTsKKyAgfQorICBmb3IgKDsgbiA8IHJlcy0+bGFzdDsgKytuKSB7CisgICAgY29uc3QgaW50IGN0eCA9IGN0eHNbbl07CisgICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWxzW25dOworICAgIGNvbnN0IGludCBmbGV2ZWwgPSBhYnNfbGV2ZWxzW25dOyAgIC8vIGZ1bGwgbGV2ZWwKKyAgICBjb3N0ICs9IFZQOExldmVsRml4ZWRDb3N0c1tmbGV2ZWxdICsgdFtsZXZlbF07ICAvLyBzaW1wbGlmaWVkIFZQOExldmVsQ29zdCgpCisgICAgdCA9IGNvc3RzW24gKyAxXVtjdHhdOworICB9CisgIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCisgIHsKKyAgICBjb25zdCBpbnQgbGV2ZWwgPSBsZXZlbHNbbl07CisgICAgY29uc3QgaW50IGZsZXZlbCA9IGFic19sZXZlbHNbbl07CisgICAgYXNzZXJ0KGZsZXZlbCAhPSAwKTsKKyAgICBjb3N0ICs9IFZQOExldmVsRml4ZWRDb3N0c1tmbGV2ZWxdICsgdFtsZXZlbF07CisgICAgaWYgKG4gPCAxNSkgeworICAgICAgY29uc3QgaW50IGIgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBjb25zdCBpbnQgY3R4ID0gY3R4c1tuXTsKKyAgICAgIGNvbnN0IGludCBsYXN0X3AwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wMCk7CisgICAgfQorICB9CisgIHJldHVybiBjb3N0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMgPSBTZXRSZXNpZHVhbENvZWZmc19TU0UyOworICBWUDhHZXRSZXNpZHVhbENvc3QgPSBHZXRSZXNpZHVhbENvc3RfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BDb3N0SW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jcHUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0MGZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY3B1LmMKQEAgLTAsMCArMSwyMjIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDUFUgZGV0ZWN0aW9uCisvLworLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX05FT05fUlRDRCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfQU5EUk9JRF9ORU9OKQorI2luY2x1ZGUgPGNwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0UyIGRldGVjdGlvbi4KKy8vCisKKy8vIGFwcGxlL2RhcndpbiBnY2MtNC4wLjEgZGVmaW5lcyBfX1BJQ19fLCBidXQgbm90IF9fcGljX18gd2l0aCAtZlBJQy4KKyNpZiAoZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKF9fUElDX18pKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm1vdiAlJWVieCwgJSVlZGlcbiIKKyAgICAiY3B1aWRcbiIKKyAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPUQiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCisgICAgOiAiYSIoaW5mb190eXBlKSwgImMiKDApKTsKK30KKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgXAorICAgICAgKGRlZmluZWQoX19jb2RlX21vZGVsX21lZGl1bV9fKSB8fCBkZWZpbmVkKF9fY29kZV9tb2RlbF9sYXJnZV9fKSkgJiYgXAorICAgICAgZGVmaW5lZChfX1BJQ19fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInhjaGd7cX1cdHslJXJieH0sICVxMVxuIgorICAgICJjcHVpZFxuIgorICAgICJ4Y2hne3F9XHR7JSVyYnh9LCAlcTFcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPSZyIihjcHVfaW5mb1sxXSksICI9YyIoY3B1X2luZm9bMl0pLAorICAgICAgIj1kIihjcHVfaW5mb1szXSkKKyAgICA6ICJhIihpbmZvX3R5cGUpLCAiYyIoMCkpOworfQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImNwdWlkXG4iCisgICAgOiAiPWEiKGNwdV9pbmZvWzBdKSwgIj1iIihjcHVfaW5mb1sxXSksICI9YyIoY3B1X2luZm9bMl0pLCAiPWQiKGNwdV9pbmZvWzNdKQorICAgIDogImEiKGluZm9fdHlwZSksICJjIigwKSk7Cit9CisjZWxpZiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpICYmIFwKKyAgICAgIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxNTAwMzA3MjkgIC8vID49IFZTMjAwOCBTUDEKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNkZWZpbmUgR2V0Q1BVSW5mbyhpbmZvLCB0eXBlKSBfX2NwdWlkZXgoaW5mbywgdHlwZSwgMCkgIC8vIHNldCBlY3g9MAorI2VsaWYgZGVmaW5lZChXRUJQX01TQ19TU0UyKQorI2RlZmluZSBHZXRDUFVJbmZvIF9fY3B1aWQKKyNlbmRpZgorCisvLyBOYUNsIGhhcyBubyBzdXBwb3J0IGZvciB4Z2V0YnYgb3IgdGhlIHJhdyBvcGNvZGUuCisjaWYgIWRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IHhnZXRidih2b2lkKSB7CisgIGNvbnN0IHVpbnQzMl90IGVjeCA9IDA7CisgIHVpbnQzMl90IGVheCwgZWR4OworICAvLyBVc2UgdGhlIHJhdyBvcGNvZGUgZm9yIHhnZXRidiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRvb2xjaGFpbnMuCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuYnl0ZSAweDBmLCAweDAxLCAweGQwXG4iCisgICAgOiAiPWEiKGVheCksICI9ZCIoZWR4KSA6ICJjIiAoZWN4KSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWVkeCA8PCAzMikgfCBlYXg7Cit9CisjZWxpZiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpICYmIFwKKyAgICAgIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxNjAwNDAyMTkgIC8vID49IFZTMjAxMCBTUDEKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNkZWZpbmUgeGdldGJ2KCkgX3hnZXRidigwKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IHhnZXRidih2b2lkKSB7CisgIHVpbnQzMl90IGVheF8sIGVkeF87CisgIF9fYXNtIHsKKyAgICB4b3IgZWN4LCBlY3ggIC8vIGVjeCA9IDAKKyAgICAvLyBVc2UgdGhlIHJhdyBvcGNvZGUgZm9yIHhnZXRidiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRvb2xjaGFpbnMuCisgICAgX19hc20gX2VtaXQgMHgwZiBfX2FzbSBfZW1pdCAweDAxIF9fYXNtIF9lbWl0IDB4ZDAKKyAgICBtb3YgZWF4XywgZWF4CisgICAgbW92IGVkeF8sIGVkeAorICB9CisgIHJldHVybiAoKHVpbnQ2NF90KWVkeF8gPDwgMzIpIHwgZWF4XzsKK30KKyNlbHNlCisjZGVmaW5lIHhnZXRidigpIDBVICAvLyBubyBBVlggZm9yIG9sZGVyIHg2NCBvciB1bnJlY29nbml6ZWQgdG9vbGNoYWlucy4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCisKKy8vIGhlbHBlciBmdW5jdGlvbiBmb3IgcnVuLXRpbWUgZGV0ZWN0aW9uIG9mIHNsb3cgU1NTRTMgcGxhdGZvcm1zCitzdGF0aWMgaW50IENoZWNrU2xvd01vZGVsKGludCBpbmZvKSB7CisgIC8vIFRhYmxlIGxpc3RpbmcgZGlzcGxheSBtb2RlbHMgd2l0aCBsb25nZXIgbGF0ZW5jaWVzIGZvciB0aGUgYnNyIGluc3RydWN0aW9uCisgIC8vIChpZSAyIGN5Y2xlcyB2cyAxMC8xNiBjeWNsZXMpIGFuZCBzb21lIFNTU0UzIGluc3RydWN0aW9ucyBsaWtlIHBzaHVmYi4KKyAgLy8gUmVmZXIgdG8gSW50ZWwgNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgT3B0aW1pemF0aW9uIFJlZmVyZW5jZSBNYW51YWwuCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTbG93TW9kZWxzW10gPSB7CisgICAgMHgzNywgMHg0YSwgMHg0ZCwgIC8vIFNpbHZlcm1vbnQgTWljcm9hcmNoaXRlY3R1cmUKKyAgICAweDFjLCAweDI2LCAweDI3ICAgLy8gQXRvbSBNaWNyb2FyY2hpdGVjdHVyZQorICB9OworICBjb25zdCB1aW50MzJfdCBtb2RlbCA9ICgoaW5mbyAmIDB4ZjAwMDApID4+IDEyKSB8ICgoaW5mbyA+PiA0KSAmIDB4Zik7CisgIGNvbnN0IHVpbnQzMl90IGZhbWlseSA9IChpbmZvID4+IDgpICYgMHhmOworICBpZiAoZmFtaWx5ID09IDB4MDYpIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGtTbG93TW9kZWxzKSAvIHNpemVvZihrU2xvd01vZGVsc1swXSk7ICsraSkgeworICAgICAgaWYgKG1vZGVsID09IGtTbG93TW9kZWxzW2ldKSByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeDg2Q1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgaW50IG1heF9jcHVpZF92YWx1ZTsKKyAgaW50IGNwdV9pbmZvWzRdOworICBpbnQgaXNfaW50ZWwgPSAwOworCisgIC8vIGdldCB0aGUgaGlnaGVzdCBmZWF0dXJlIHZhbHVlIGNwdWlkIHN1cHBvcnRzCisgIEdldENQVUluZm8oY3B1X2luZm8sIDApOworICBtYXhfY3B1aWRfdmFsdWUgPSBjcHVfaW5mb1swXTsKKyAgaWYgKG1heF9jcHVpZF92YWx1ZSA8IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgVkVORE9SX0lEX0lOVEVMX0VCWCA9IDB4NzU2ZTY1NDc7ICAvLyB1bmVHCisgICAgY29uc3QgaW50IFZFTkRPUl9JRF9JTlRFTF9FRFggPSAweDQ5NjU2ZTY5OyAgLy8gSWVuaQorICAgIGNvbnN0IGludCBWRU5ET1JfSURfSU5URUxfRUNYID0gMHg2YzY1NzQ2ZTsgIC8vIGxldG4KKyAgICBpc19pbnRlbCA9IChjcHVfaW5mb1sxXSA9PSBWRU5ET1JfSURfSU5URUxfRUJYICYmCisgICAgICAgICAgICAgICAgY3B1X2luZm9bMl0gPT0gVkVORE9SX0lEX0lOVEVMX0VDWCAmJgorICAgICAgICAgICAgICAgIGNwdV9pbmZvWzNdID09IFZFTkRPUl9JRF9JTlRFTF9FRFgpOyAgICAvLyBnZW51aW5lIEludGVsPworICB9CisKKyAgR2V0Q1BVSW5mbyhjcHVfaW5mbywgMSk7CisgIGlmIChmZWF0dXJlID09IGtTU0UyKSB7CisgICAgcmV0dXJuICEhKGNwdV9pbmZvWzNdICYgKDEgPDwgMjYpKTsKKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrU1NFMykgeworICAgIHJldHVybiAhIShjcHVfaW5mb1syXSAmICgxIDw8IDApKTsKKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrU2xvd1NTU0UzKSB7CisgICAgaWYgKGlzX2ludGVsICYmIChjcHVfaW5mb1syXSAmICgxIDw8IDkpKSkgeyAgIC8vIFNTU0UzPworICAgICAgcmV0dXJuIENoZWNrU2xvd01vZGVsKGNwdV9pbmZvWzBdKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZmVhdHVyZSA9PSBrU1NFNF8xKSB7CisgICAgcmV0dXJuICEhKGNwdV9pbmZvWzJdICYgKDEgPDwgMTkpKTsKKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrQVZYKSB7CisgICAgLy8gYml0cyAyNyAoT1NYU0FWRSkgJiAyOCAoMjU2LWJpdCBBVlgpCisgICAgaWYgKChjcHVfaW5mb1syXSAmIDB4MTgwMDAwMDApID09IDB4MTgwMDAwMDApIHsKKyAgICAgIC8vIFhNTSBzdGF0ZSBhbmQgWU1NIHN0YXRlIGVuYWJsZWQgYnkgdGhlIE9TLgorICAgICAgcmV0dXJuICh4Z2V0YnYoKSAmIDB4NikgPT0gMHg2OworICAgIH0KKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrQVZYMikgeworICAgIGlmICh4ODZDUFVJbmZvKGtBVlgpICYmIG1heF9jcHVpZF92YWx1ZSA+PSA3KSB7CisgICAgICBHZXRDUFVJbmZvKGNwdV9pbmZvLCA3KTsKKyAgICAgIHJldHVybiAhIShjcHVfaW5mb1sxXSAmICgxIDw8IDUpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSB4ODZDUFVJbmZvOworI2VsaWYgZGVmaW5lZChXRUJQX0FORFJPSURfTkVPTikgIC8vIE5COiBuZWVkcyB0byBiZSBiZWZvcmUgZ2VuZXJpYyBORU9OIHRlc3QuCitzdGF0aWMgaW50IEFuZHJvaWRDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgeworICBjb25zdCBBbmRyb2lkQ3B1RmFtaWx5IGNwdV9mYW1pbHkgPSBhbmRyb2lkX2dldENwdUZhbWlseSgpOworICBjb25zdCB1aW50NjRfdCBjcHVfZmVhdHVyZXMgPSBhbmRyb2lkX2dldENwdUZlYXR1cmVzKCk7CisgIGlmIChmZWF0dXJlID09IGtORU9OKSB7CisgICAgcmV0dXJuIChjcHVfZmFtaWx5ID09IEFORFJPSURfQ1BVX0ZBTUlMWV9BUk0gJiYKKyAgICAgICAgICAgIDAgIT0gKGNwdV9mZWF0dXJlcyAmIEFORFJPSURfQ1BVX0FSTV9GRUFUVVJFX05FT04pKTsKKyAgfQorICByZXR1cm4gMDsKK30KK1ZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IEFuZHJvaWRDUFVJbmZvOworI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorLy8gZGVmaW5lIGEgZHVtbXkgZnVuY3Rpb24gdG8gZW5hYmxlIHR1cm5pbmcgb2ZmIE5FT04gYXQgcnVudGltZSBieSBzZXR0aW5nCisvLyBWUDhEZWNHZXRDUFVJbmZvID0gTlVMTAorc3RhdGljIGludCBhcm1DUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgeworICBpZiAoZmVhdHVyZSAhPSBrTkVPTikgcmV0dXJuIDA7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoV0VCUF9IQVZFX05FT05fUlRDRCkKKyAgeworICAgIGludCBoYXNfbmVvbiA9IDA7CisgICAgY2hhciBsaW5lWzIwMF07CisgICAgRklMRSogY29uc3QgY3B1aW5mbyA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInIiKTsKKyAgICBpZiAoY3B1aW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBjcHVpbmZvKSkgeworICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJGZWF0dXJlcyIsIDgpKSB7CisgICAgICAgIGlmIChzdHJzdHIobGluZSwgIiBuZW9uICIpICE9IE5VTEwpIHsKKyAgICAgICAgICBoYXNfbmVvbiA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGNwdWluZm8pOworICAgIHJldHVybiBoYXNfbmVvbjsKKyAgfQorI2Vsc2UKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KK1ZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IGFybUNQVUluZm87CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikgfHwgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikgfHwgXAorICAgICAgZGVmaW5lZChXRUJQX1VTRV9NU0EpCitzdGF0aWMgaW50IG1pcHNDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgeworICBpZiAoKGZlYXR1cmUgPT0ga01JUFMzMikgfHwgKGZlYXR1cmUgPT0ga01JUFNkc3BSMikgfHwgKGZlYXR1cmUgPT0ga01TQSkpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBtaXBzQ1BVSW5mbzsKKyNlbHNlCitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBOVUxMOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTIwNzliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWMuYwpAQCAtMCwwICsxLDg5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwZWVkLWNyaXRpY2FsIGRlY29kaW5nIGZ1bmN0aW9ucywgZGVmYXVsdCBwbGFpbi1DIGltcGxlbWVudGF0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwXzhiKGludCB2KSB7CisgIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCisjZGVmaW5lIFNUT1JFKHgsIHksIHYpIFwKKyAgZHN0Wyh4KSArICh5KSAqIEJQU10gPSBjbGlwXzhiKGRzdFsoeCkgKyAoeSkgKiBCUFNdICsgKCh2KSA+PiAzKSkKKworI2RlZmluZSBTVE9SRTIoeSwgZGMsIGQsIGMpIGRvIHsgICAgXAorICBjb25zdCBpbnQgREMgPSAoZGMpOyAgICAgICAgICAgICAgXAorICBTVE9SRSgwLCB5LCBEQyArIChkKSk7ICAgICAgICAgICAgXAorICBTVE9SRSgxLCB5LCBEQyArIChjKSk7ICAgICAgICAgICAgXAorICBTVE9SRSgyLCB5LCBEQyAtIChjKSk7ICAgICAgICAgICAgXAorICBTVE9SRSgzLCB5LCBEQyAtIChkKSk7ICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNVUwxKGEpICgoKChhKSAqIDIwMDkxKSA+PiAxNikgKyAoYSkpCisjZGVmaW5lIE1VTDIoYSkgKCgoYSkgKiAzNTQ2OCkgPj4gMTYpCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmVfQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCBDWzQgKiA0XSwgKnRtcDsKKyAgaW50IGk7CisgIHRtcCA9IEM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gdmVydGljYWwgcGFzcworICAgIGNvbnN0IGludCBhID0gaW5bMF0gKyBpbls4XTsgICAgLy8gWy00MDk2LCA0MDk0XQorICAgIGNvbnN0IGludCBiID0gaW5bMF0gLSBpbls4XTsgICAgLy8gWy00MDk1LCA0MDk1XQorICAgIGNvbnN0IGludCBjID0gTVVMMihpbls0XSkgLSBNVUwxKGluWzEyXSk7ICAgLy8gWy0zNzgzLCAzNzgzXQorICAgIGNvbnN0IGludCBkID0gTVVMMShpbls0XSkgKyBNVUwyKGluWzEyXSk7ICAgLy8gWy0zNzg1LCAzNzgxXQorICAgIHRtcFswXSA9IGEgKyBkOyAgIC8vIFstNzg4MSwgNzg3NV0KKyAgICB0bXBbMV0gPSBiICsgYzsgICAvLyBbLTc4NzgsIDc4NzhdCisgICAgdG1wWzJdID0gYiAtIGM7ICAgLy8gWy03ODc4LCA3ODc4XQorICAgIHRtcFszXSA9IGEgLSBkOyAgIC8vIFstNzg3NywgNzg3OV0KKyAgICB0bXAgKz0gNDsKKyAgICBpbisrOworICB9CisgIC8vIEVhY2ggcGFzcyBpcyBleHBhbmRpbmcgdGhlIGR5bmFtaWMgcmFuZ2UgYnkgfjMuODUgKHVwcGVyIGJvdW5kKS4KKyAgLy8gVGhlIGV4YWN0IHZhbHVlIGlzICgyLiArICgyMDA5MSArIDM1NDY4KSAvIDY1NTM2KS4KKyAgLy8gQWZ0ZXIgdGhlIHNlY29uZCBwYXNzLCBtYXhpbXVtIGludGVydmFsIGlzIFstMzc5NCwgMzc5NF0sIGFzc3VtaW5nCisgIC8vIGFuIGlucHV0IGluIFstMjA0OCwgMjA0N10gaW50ZXJ2YWwuIFdlIHRoZW4gbmVlZCB0byBhZGQgYSBkc3QgdmFsdWUKKyAgLy8gaW4gdGhlIFswLCAyNTVdIHJhbmdlLgorICAvLyBJbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbywgdGhlIGlucHV0IHRvIGNsaXBfOGIoKSBjYW4gYmUgYXMgbGFyZ2UgYXMKKyAgLy8gWy02MDcxMywgNjA5NjhdLgorICB0bXAgPSBDOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIGhvcml6b250YWwgcGFzcworICAgIGNvbnN0IGludCBkYyA9IHRtcFswXSArIDQ7CisgICAgY29uc3QgaW50IGEgPSAgZGMgKyAgdG1wWzhdOworICAgIGNvbnN0IGludCBiID0gIGRjIC0gIHRtcFs4XTsKKyAgICBjb25zdCBpbnQgYyA9IE1VTDIodG1wWzRdKSAtIE1VTDEodG1wWzEyXSk7CisgICAgY29uc3QgaW50IGQgPSBNVUwxKHRtcFs0XSkgKyBNVUwyKHRtcFsxMl0pOworICAgIFNUT1JFKDAsIDAsIGEgKyBkKTsKKyAgICBTVE9SRSgxLCAwLCBiICsgYyk7CisgICAgU1RPUkUoMiwgMCwgYiAtIGMpOworICAgIFNUT1JFKDMsIDAsIGEgLSBkKTsKKyAgICB0bXArKzsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKy8vIFNpbXBsaWZpZWQgdHJhbnNmb3JtIHdoZW4gb25seSBpblswXSwgaW5bMV0gYW5kIGluWzRdIGFyZSBub24temVybworc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgYSA9IGluWzBdICsgNDsKKyAgY29uc3QgaW50IGM0ID0gTVVMMihpbls0XSk7CisgIGNvbnN0IGludCBkNCA9IE1VTDEoaW5bNF0pOworICBjb25zdCBpbnQgYzEgPSBNVUwyKGluWzFdKTsKKyAgY29uc3QgaW50IGQxID0gTVVMMShpblsxXSk7CisgIFNUT1JFMigwLCBhICsgZDQsIGQxLCBjMSk7CisgIFNUT1JFMigxLCBhICsgYzQsIGQxLCBjMSk7CisgIFNUT1JFMigyLCBhIC0gYzQsIGQxLCBjMSk7CisgIFNUT1JFMigzLCBhIC0gZDQsIGQxLCBjMSk7Cit9CisjdW5kZWYgTVVMMQorI3VuZGVmIE1VTDIKKyN1bmRlZiBTVE9SRTIKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmVfQyhpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIFRyYW5zZm9ybU9uZV9DKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVVZfQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIFZQOFRyYW5zZm9ybShpbiArIDAgKiAxNiwgZHN0LCAxKTsKKyAgVlA4VHJhbnNmb3JtKGluICsgMiAqIDE2LCBkc3QgKyA0ICogQlBTLCAxKTsKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgREMgPSBpblswXSArIDQ7CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgU1RPUkUoaSwgaiwgREMpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDVVZfQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGlmIChpblswICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDAgKiAxNiwgZHN0KTsKKyAgaWYgKGluWzEgKiAxNl0pIFZQOFRyYW5zZm9ybURDKGluICsgMSAqIDE2LCBkc3QgKyA0KTsKKyAgaWYgKGluWzIgKiAxNl0pIFZQOFRyYW5zZm9ybURDKGluICsgMiAqIDE2LCBkc3QgKyA0ICogQlBTKTsKKyAgaWYgKGluWzMgKiAxNl0pIFZQOFRyYW5zZm9ybURDKGluICsgMyAqIDE2LCBkc3QgKyA0ICogQlBTICsgNCk7Cit9CisKKyN1bmRlZiBTVE9SRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFyYWdyYXBoIDE0LjMKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVF9DKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgaW50IHRtcFsxNl07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGEwID0gaW5bMCArIGldICsgaW5bMTIgKyBpXTsKKyAgICBjb25zdCBpbnQgYTEgPSBpbls0ICsgaV0gKyBpblsgOCArIGldOworICAgIGNvbnN0IGludCBhMiA9IGluWzQgKyBpXSAtIGluWyA4ICsgaV07CisgICAgY29uc3QgaW50IGEzID0gaW5bMCArIGldIC0gaW5bMTIgKyBpXTsKKyAgICB0bXBbMCAgKyBpXSA9IGEwICsgYTE7CisgICAgdG1wWzggICsgaV0gPSBhMCAtIGExOworICAgIHRtcFs0ICArIGldID0gYTMgKyBhMjsKKyAgICB0bXBbMTIgKyBpXSA9IGEzIC0gYTI7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGNvbnN0IGludCBkYyA9IHRtcFswICsgaSAqIDRdICsgMzsgICAgLy8gdy8gcm91bmRlcgorICAgIGNvbnN0IGludCBhMCA9IGRjICAgICAgICAgICAgICsgdG1wWzMgKyBpICogNF07CisgICAgY29uc3QgaW50IGExID0gdG1wWzEgKyBpICogNF0gKyB0bXBbMiArIGkgKiA0XTsKKyAgICBjb25zdCBpbnQgYTIgPSB0bXBbMSArIGkgKiA0XSAtIHRtcFsyICsgaSAqIDRdOworICAgIGNvbnN0IGludCBhMyA9IGRjICAgICAgICAgICAgIC0gdG1wWzMgKyBpICogNF07CisgICAgb3V0WyAwXSA9IChhMCArIGExKSA+PiAzOworICAgIG91dFsxNl0gPSAoYTMgKyBhMikgPj4gMzsKKyAgICBvdXRbMzJdID0gKGEwIC0gYTEpID4+IDM7CisgICAgb3V0WzQ4XSA9IChhMyAtIGEyKSA+PiAzOworICAgIG91dCArPSA2NDsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3ZvaWQgKCpWUDhUcmFuc2Zvcm1XSFQpKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24odWludDhfdCogZHN0LCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAwID0gVlA4a2NsaXAxIC0gdG9wWy0xXTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwID0gY2xpcDAgKyBkc3RbLTFdOworICAgIGludCB4OworICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKKyAgICAgIGRzdFt4XSA9IGNsaXBbdG9wW3hdXTsKKyAgICB9CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorc3RhdGljIHZvaWQgVE00X0ModWludDhfdCogZHN0KSAgIHsgVHJ1ZU1vdGlvbihkc3QsIDQpOyB9CitzdGF0aWMgdm9pZCBUTTh1dl9DKHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uKGRzdCwgOCk7IH0KK3N0YXRpYyB2b2lkIFRNMTZfQyh1aW50OF90KiBkc3QpICB7IFRydWVNb3Rpb24oZHN0LCAxNik7IH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDE2eDE2CisKK3N0YXRpYyB2b2lkIFZFMTZfQyh1aW50OF90KiBkc3QpIHsgICAgIC8vIHZlcnRpY2FsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIG1lbWNweShkc3QgKyBqICogQlBTLCBkc3QgLSBCUFMsIDE2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTE2X0ModWludDhfdCogZHN0KSB7ICAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAxNjsgaiA+IDA7IC0taikgeworICAgIG1lbXNldChkc3QsIGRzdFstMV0sIDE2KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDE2KGludCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIHYsIDE2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2X0ModWludDhfdCogZHN0KSB7ICAgIC8vIERDCisgIGludCBEQyA9IDE2OworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXSArIGRzdFtqIC0gQlBTXTsKKyAgfQorICBQdXQxNihEQyA+PiA1LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BfQyh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIHRvcCBzYW1wbGVzIG5vdCBhdmFpbGFibGUKKyAgaW50IERDID0gODsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU107CisgIH0KKyAgUHV0MTYoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vTGVmdF9DKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBEQyArPSBkc3RbaSAtIEJQU107CisgIH0KKyAgUHV0MTYoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdF9DKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3AgYW5kIGxlZnQgc2FtcGxlcworICBQdXQxNigweDgwLCBkc3QpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK1ZQOFByZWRGdW5jIFZQOFByZWRMdW1hMTZbTlVNX0JfRENfTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gNHg0CisKKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKHVpbnQ4X3QpKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikpCisjZGVmaW5lIEFWRzIoYSwgYikgKCgoYSkgKyAoYikgKyAxKSA+PiAxKQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVkU0X0ModWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IGRzdCAtIEJQUzsKKyAgY29uc3QgdWludDhfdCB2YWxzWzRdID0geworICAgIEFWRzModG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pLAorICAgIEFWRzModG9wWyAwXSwgdG9wWzFdLCB0b3BbMl0pLAorICAgIEFWRzModG9wWyAxXSwgdG9wWzJdLCB0b3BbM10pLAorICAgIEFWRzModG9wWyAyXSwgdG9wWzNdLCB0b3BbNF0pCisgIH07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgbWVtY3B5KGRzdCArIGkgKiBCUFMsIHZhbHMsIHNpemVvZih2YWxzKSk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBIRTRfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gaG9yaXpvbnRhbAorICBjb25zdCBpbnQgQSA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0Wy0xXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbLTEgKyBCUFNdOworICBjb25zdCBpbnQgRCA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgRSA9IGRzdFstMSArIDMgKiBCUFNdOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEEsIEIsIEMpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhCLCBDLCBEKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoQywgRCwgRSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEQsIEUsIEUpKTsKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIERDNF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIHVpbnQzMl90IGRjID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIGRjICs9IGRzdFtpIC0gQlBTXSArIGRzdFstMSArIGkgKiBCUFNdOworICBkYyA+Pj0gMzsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgbWVtc2V0KGRzdCArIGkgKiBCUFMsIGRjLCA0KTsKK30KKworc3RhdGljIHZvaWQgUkQ0X0ModWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBEU1QoMCwgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEosIEssIEwpOworICBEU1QoMSwgMykgPSBEU1QoMCwgMikgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEksIEosIEspOworICBEU1QoMiwgMykgPSBEU1QoMSwgMikgPSBEU1QoMCwgMSkgICAgICAgICAgICAgPSBBVkczKFgsIEksIEopOworICBEU1QoMywgMykgPSBEU1QoMiwgMikgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMCkgPSBBVkczKEEsIFgsIEkpOworICAgICAgICAgICAgICBEU1QoMywgMikgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMCkgPSBBVkczKEIsIEEsIFgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMSkgPSBEU1QoMiwgMCkgPSBBVkczKEMsIEIsIEEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMCkgPSBBVkczKEQsIEMsIEIpOworfQorCitzdGF0aWMgdm9pZCBMRDRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLUxlZnQKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIGNvbnN0IGludCBFID0gZHN0WzQgLSBCUFNdOworICBjb25zdCBpbnQgRiA9IGRzdFs1IC0gQlBTXTsKKyAgY29uc3QgaW50IEcgPSBkc3RbNiAtIEJQU107CisgIGNvbnN0IGludCBIID0gZHN0WzcgLSBCUFNdOworICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOworICAgICAgICAgICAgICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgPSBBVkczKEUsIEYsIEcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMikgPSBEU1QoMiwgMykgPSBBVkczKEYsIEcsIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMykgPSBBVkczKEcsIEgsIEgpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIFZSNF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLVJpZ2h0CisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIERTVCgwLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoWCwgQSk7CisgIERTVCgxLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoQSwgQik7CisgIERTVCgyLCAwKSA9IERTVCgzLCAyKSA9IEFWRzIoQiwgQyk7CisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzIoQywgRCk7CisKKyAgRFNUKDAsIDMpID0gICAgICAgICAgICAgQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDAsIDIpID0gICAgICAgICAgICAgQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDIsIDEpID0gRFNUKDMsIDMpID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDMsIDEpID0gICAgICAgICAgICAgQVZHMyhCLCBDLCBEKTsKK30KKworc3RhdGljIHZvaWQgVkw0X0ModWludDhfdCogZHN0KSB7ICAgLy8gVmVydGljYWwtTGVmdAorICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107CisgIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOworICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKKyAgY29uc3QgaW50IEUgPSBkc3RbNCAtIEJQU107CisgIGNvbnN0IGludCBGID0gZHN0WzUgLSBCUFNdOworICBjb25zdCBpbnQgRyA9IGRzdFs2IC0gQlBTXTsKKyAgY29uc3QgaW50IEggPSBkc3RbNyAtIEJQU107CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgwLCAyKSA9IEFWRzIoQiwgQyk7CisgIERTVCgyLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoQywgRCk7CisgIERTVCgzLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoRCwgRSk7CisKKyAgRFNUKDAsIDEpID0gICAgICAgICAgICAgQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDEsIDEpID0gRFNUKDAsIDMpID0gQVZHMyhCLCBDLCBEKTsKKyAgRFNUKDIsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhDLCBELCBFKTsKKyAgRFNUKDMsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhELCBFLCBGKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDIpID0gQVZHMyhFLCBGLCBHKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhGLCBHLCBIKTsKK30KKworc3RhdGljIHZvaWQgSFU0X0ModWludDhfdCogZHN0KSB7ICAgLy8gSG9yaXpvbnRhbC1VcAorICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEksIEopOworICBEU1QoMiwgMCkgPSBEU1QoMCwgMSkgPSBBVkcyKEosIEspOworICBEU1QoMiwgMSkgPSBEU1QoMCwgMikgPSBBVkcyKEssIEwpOworICBEU1QoMSwgMCkgPSAgICAgICAgICAgICBBVkczKEksIEosIEspOworICBEU1QoMywgMCkgPSBEU1QoMSwgMSkgPSBBVkczKEosIEssIEwpOworICBEU1QoMywgMSkgPSBEU1QoMSwgMikgPSBBVkczKEssIEwsIEwpOworICBEU1QoMywgMikgPSBEU1QoMiwgMikgPQorICAgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyB2b2lkIEhENF9DKHVpbnQ4X3QqIGRzdCkgeyAgLy8gSG9yaXpvbnRhbC1Eb3duCisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCitWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTRbTlVNX0JNT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFZFOHV2X0ModWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbWVtY3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgOCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEU4dXZfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIG1lbXNldChkc3QsIGRzdFstMV0sIDgpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIG1lbXNldChkc3QgKyBqICogQlBTLCB2YWx1ZSwgOCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZfQyh1aW50OF90KiBkc3QpIHsgICAgIC8vIERDCisgIGludCBkYzAgPSA4OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjMCArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBQdXQ4eDh1dihkYzAgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb0xlZnRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcworICBpbnQgZGMwID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0W2kgLSBCUFNdOworICB9CisgIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wX0ModWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCBzYW1wbGVzCisgIGludCBkYzAgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjMCArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBQdXQ4eDh1dihkYzAgPj4gMywgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcExlZnRfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gREMgd2l0aCBub3RoaW5nCisgIFB1dDh4OHV2KDB4ODAsIGRzdCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworVlA4UHJlZEZ1bmMgVlA4UHJlZENocm9tYThbTlVNX0JfRENfTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKy8vIDQgcGl4ZWxzIGluLCAyIHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyMl9DKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCkgKyBWUDhrc2NsaXAxW3AxIC0gcTFdOyAgLy8gaW4gWy04OTMsODkyXQorICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107ICAgICAgICAgICAgLy8gaW4gWy0xNiwxNV0KKyAgY29uc3QgaW50IGEyID0gVlA4a3NjbGlwMlsoYSArIDMpID4+IDNdOworICBwWy1zdGVwXSA9IFZQOGtjbGlwMVtwMCArIGEyXTsKKyAgcFsgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07Cit9CisKKy8vIDQgcGl4ZWxzIGluLCA0IHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNF9DKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCk7CisgIGNvbnN0IGludCBhMSA9IFZQOGtzY2xpcDJbKGEgKyA0KSA+PiAzXTsKKyAgY29uc3QgaW50IGEyID0gVlA4a3NjbGlwMlsoYSArIDMpID4+IDNdOworICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOworICBwWy0yKnN0ZXBdID0gVlA4a2NsaXAxW3AxICsgYTNdOworICBwWy0gIHN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworICBwWyAgIHN0ZXBdID0gVlA4a2NsaXAxW3ExIC0gYTNdOworfQorCisvLyA2IHBpeGVscyBpbiwgNiBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjZfQyh1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDIgPSBwWy0zKnN0ZXBdLCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF07CisgIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIqc3RlcF07CisgIGNvbnN0IGludCBhID0gVlA4a3NjbGlwMVszICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXV07CisgIC8vIGEgaXMgaW4gWy0xMjgsMTI3XSwgYTEgaW4gWy0yNywyN10sIGEyIGluIFstMTgsMThdIGFuZCBhMyBpbiBbLTksOV0KKyAgY29uc3QgaW50IGExID0gKDI3ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMyAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEyID0gKDE4ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMiAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEzID0gKDkgICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMSAqIGEgKyA3KSAqIDkpID4+IDcKKyAgcFstMypzdGVwXSA9IFZQOGtjbGlwMVtwMiArIGEzXTsKKyAgcFstMipzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEyXTsKKyAgcFstICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGExXTsKKyAgcFsgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEyXTsKKyAgcFsgMipzdGVwXSA9IFZQOGtjbGlwMVtxMiAtIGEzXTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBIZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIHJldHVybiAoVlA4a2FiczBbcDEgLSBwMF0gPiB0aHJlc2gpIHx8IChWUDhrYWJzMFtxMSAtIHEwXSA+IHRocmVzaCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBOZWVkc0ZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKCg0ICogVlA4a2FiczBbcDAgLSBxMF0gKyBWUDhrYWJzMFtwMSAtIHExXSkgPD0gdCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIFdFQlBfSU5MSU5FIGludCBOZWVkc0ZpbHRlcjJfQyhjb25zdCB1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgeworICBjb25zdCBpbnQgcDMgPSBwWy00ICogc3RlcF0sIHAyID0gcFstMyAqIHN0ZXBdLCBwMSA9IHBbLTIgKiBzdGVwXTsKKyAgY29uc3QgaW50IHAwID0gcFstc3RlcF0sIHEwID0gcFswXTsKKyAgY29uc3QgaW50IHExID0gcFtzdGVwXSwgcTIgPSBwWzIgKiBzdGVwXSwgcTMgPSBwWzMgKiBzdGVwXTsKKyAgaWYgKCg0ICogVlA4a2FiczBbcDAgLSBxMF0gKyBWUDhrYWJzMFtwMSAtIHExXSkgPiB0KSByZXR1cm4gMDsKKyAgcmV0dXJuIFZQOGthYnMwW3AzIC0gcDJdIDw9IGl0ICYmIFZQOGthYnMwW3AyIC0gcDFdIDw9IGl0ICYmCisgICAgICAgICBWUDhrYWJzMFtwMSAtIHAwXSA8PSBpdCAmJiBWUDhrYWJzMFtxMyAtIHEyXSA8PSBpdCAmJgorICAgICAgICAgVlA4a2FiczBbcTIgLSBxMV0gPD0gaXQgJiYgVlA4a2FiczBbcTEgLSBxMF0gPD0gaXQ7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNl9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKE5lZWRzRmlsdGVyX0MocCArIGksIHN0cmlkZSwgdGhyZXNoMikpIHsKKyAgICAgIERvRmlsdGVyMl9DKHAgKyBpLCBzdHJpZGUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChOZWVkc0ZpbHRlcl9DKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gyKSkgeworICAgICAgRG9GaWx0ZXIyX0MocCArIGkgKiBzdHJpZGUsIDEpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpX0ModWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTZfQyhwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aV9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2X0MocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjZfQyh1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAoTmVlZHNGaWx0ZXIyX0MocCwgaHN0cmlkZSwgdGhyZXNoMiwgaXRocmVzaCkpIHsKKyAgICAgIGlmIChIZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKKyAgICAgICAgRG9GaWx0ZXIyX0MocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEb0ZpbHRlcjZfQyhwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNF9DKHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChOZWVkc0ZpbHRlcjJfQyhwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKEhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBEb0ZpbHRlcjJfQyhwLCBoc3RyaWRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERvRmlsdGVyNF9DKHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisvLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNl9DKHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNl9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2X0MocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmlfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBGaWx0ZXJMb29wMjRfQyhwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIHZvaWQgSEZpbHRlcjE2aV9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIEZpbHRlckxvb3AyNF9DKHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOF9DKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjZfQyh1LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNl9DKHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgdm9pZCBIRmlsdGVyOF9DKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjZfQyh1LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNl9DKHYsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBWRmlsdGVyOGlfQyh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNF9DKHUgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNF9DKHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIHZvaWQgSEZpbHRlcjhpX0ModWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjRfQyh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjRfQyh2ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRGl0aGVyQ29tYmluZTh4OF9DKGNvbnN0IHVpbnQ4X3QqIGRpdGhlciwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgY29uc3QgaW50IGRlbHRhMCA9IGRpdGhlcltpXSAtIFZQOF9ESVRIRVJfQU1QX0NFTlRFUjsKKyAgICAgIGNvbnN0IGludCBkZWx0YTEgPQorICAgICAgICAgIChkZWx0YTAgKyBWUDhfRElUSEVSX0RFU0NBTEVfUk9VTkRFUikgPj4gVlA4X0RJVEhFUl9ERVNDQUxFOworICAgICAgZHN0W2ldID0gY2xpcF84YigoaW50KWRzdFtpXSArIGRlbHRhMSk7CisgICAgfQorICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIGRpdGhlciArPSA4OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQOERlY0lkY3QyIFZQOFRyYW5zZm9ybTsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtQUMzOworVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1VVjsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtREM7CitWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDVVY7CisKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNjsKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNjsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjg7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4OworVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2aTsKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNmk7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4aTsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjhpOworVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTY7CitWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNjsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2aTsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2aTsKKwordm9pZCAoKlZQOERpdGhlckNvbWJpbmU4eDgpKGNvbnN0IHVpbnQ4X3QqIGRpdGhlciwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKTsKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOERzcEluaXQpIHsKKyAgVlA4SW5pdENsaXBUYWJsZXMoKTsKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUX0M7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVR3b19DOworICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDX0M7CisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDM19DOworI2VuZGlmCisgIFZQOFRyYW5zZm9ybVVWID0gVHJhbnNmb3JtVVZfQzsKKyAgVlA4VHJhbnNmb3JtRENVViA9IFRyYW5zZm9ybURDVVZfQzsKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2X0M7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpX0M7CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNl9DOworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4X0M7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aV9DOworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTZfQzsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2X0M7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpX0M7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpX0M7CisjZW5kaWYKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aV9DOworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4X0M7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aV9DOworI2VuZGlmCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOFByZWRMdW1hNFswXSA9IERDNF9DOworICBWUDhQcmVkTHVtYTRbMV0gPSBUTTRfQzsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0X0M7CisgIFZQOFByZWRMdW1hNFs0XSA9IFJENF9DOworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDRfQzsKKyNlbmRpZgorCisgIFZQOFByZWRMdW1hNFszXSA9IEhFNF9DOworICBWUDhQcmVkTHVtYTRbNV0gPSBWUjRfQzsKKyAgVlA4UHJlZEx1bWE0WzddID0gVkw0X0M7CisgIFZQOFByZWRMdW1hNFs4XSA9IEhENF9DOworICBWUDhQcmVkTHVtYTRbOV0gPSBIVTRfQzsKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4UHJlZEx1bWExNlswXSA9IERDMTZfQzsKKyAgVlA4UHJlZEx1bWExNlsxXSA9IFRNMTZfQzsKKyAgVlA4UHJlZEx1bWExNlsyXSA9IFZFMTZfQzsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTZfQzsKKyAgVlA4UHJlZEx1bWExNls0XSA9IERDMTZOb1RvcF9DOworICBWUDhQcmVkTHVtYTE2WzVdID0gREMxNk5vTGVmdF9DOworICBWUDhQcmVkTHVtYTE2WzZdID0gREMxNk5vVG9wTGVmdF9DOworCisgIFZQOFByZWRDaHJvbWE4WzBdID0gREM4dXZfQzsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUTTh1dl9DOworICBWUDhQcmVkQ2hyb21hOFsyXSA9IFZFOHV2X0M7CisgIFZQOFByZWRDaHJvbWE4WzNdID0gSEU4dXZfQzsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wX0M7CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnRfQzsKKyAgVlA4UHJlZENocm9tYThbNl0gPSBEQzh1dk5vVG9wTGVmdF9DOworI2VuZGlmCisKKyAgVlA4RGl0aGVyQ29tYmluZTh4OCA9IERpdGhlckNvbWJpbmU4eDhfQzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RHNwSW5pdFNTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgVlA4RHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgVlA4RHNwSW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOERzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgVlA4RHNwSW5pdE1TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgVlA4RHNwSW5pdE5FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybVdIVCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybURDICE9IE5VTEwpOworICBhc3NlcnQoVlA4VHJhbnNmb3JtQUMzICE9IE5VTEwpOworICBhc3NlcnQoVlA4VHJhbnNmb3JtVVYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhUcmFuc2Zvcm1EQ1VWICE9IE5VTEwpOworICBhc3NlcnQoVlA4VkZpbHRlcjE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4SEZpbHRlcjE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4VkZpbHRlcjggIT0gTlVMTCk7CisgIGFzc2VydChWUDhIRmlsdGVyOCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFZGaWx0ZXIxNmkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhIRmlsdGVyMTZpICE9IE5VTEwpOworICBhc3NlcnQoVlA4VkZpbHRlcjhpICE9IE5VTEwpOworICBhc3NlcnQoVlA4SEZpbHRlcjhpICE9IE5VTEwpOworICBhc3NlcnQoVlA4U2ltcGxlVkZpbHRlcjE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4U2ltcGxlSEZpbHRlcjE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4U2ltcGxlVkZpbHRlcjE2aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNpbXBsZUhGaWx0ZXIxNmkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbNl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbN10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbOF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTRbOV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNlsxXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNls0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzZdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFsxXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFs0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbNl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhEaXRoZXJDb21iaW5lOHg4ICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX2NsaXBfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3Yjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX2NsaXBfdGFibGVzLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDbGlwcGluZyB0YWJsZXMgZm9yIGZpbHRlcmluZworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisvLyBkZWZpbmUgdG8gMCB0byBoYXZlIHJ1bi10aW1lIHRhYmxlIGluaXRpYWxpemF0aW9uCisjaWYgIWRlZmluZWQoVVNFX1NUQVRJQ19UQUJMRVMpCisjZGVmaW5lIFVTRV9TVEFUSUNfVEFCTEVTIDEgICAvLyBBTFRFUk5BVEVfQ09ERQorI2VuZGlmCisKKyNpZiAoVVNFX1NUQVRJQ19UQUJMRVMgPT0gMSkKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXSA9IHsKKyAgMHhmZiwgMHhmZSwgMHhmZCwgMHhmYywgMHhmYiwgMHhmYSwgMHhmOSwgMHhmOCwgMHhmNywgMHhmNiwgMHhmNSwgMHhmNCwKKyAgMHhmMywgMHhmMiwgMHhmMSwgMHhmMCwgMHhlZiwgMHhlZSwgMHhlZCwgMHhlYywgMHhlYiwgMHhlYSwgMHhlOSwgMHhlOCwKKyAgMHhlNywgMHhlNiwgMHhlNSwgMHhlNCwgMHhlMywgMHhlMiwgMHhlMSwgMHhlMCwgMHhkZiwgMHhkZSwgMHhkZCwgMHhkYywKKyAgMHhkYiwgMHhkYSwgMHhkOSwgMHhkOCwgMHhkNywgMHhkNiwgMHhkNSwgMHhkNCwgMHhkMywgMHhkMiwgMHhkMSwgMHhkMCwKKyAgMHhjZiwgMHhjZSwgMHhjZCwgMHhjYywgMHhjYiwgMHhjYSwgMHhjOSwgMHhjOCwgMHhjNywgMHhjNiwgMHhjNSwgMHhjNCwKKyAgMHhjMywgMHhjMiwgMHhjMSwgMHhjMCwgMHhiZiwgMHhiZSwgMHhiZCwgMHhiYywgMHhiYiwgMHhiYSwgMHhiOSwgMHhiOCwKKyAgMHhiNywgMHhiNiwgMHhiNSwgMHhiNCwgMHhiMywgMHhiMiwgMHhiMSwgMHhiMCwgMHhhZiwgMHhhZSwgMHhhZCwgMHhhYywKKyAgMHhhYiwgMHhhYSwgMHhhOSwgMHhhOCwgMHhhNywgMHhhNiwgMHhhNSwgMHhhNCwgMHhhMywgMHhhMiwgMHhhMSwgMHhhMCwKKyAgMHg5ZiwgMHg5ZSwgMHg5ZCwgMHg5YywgMHg5YiwgMHg5YSwgMHg5OSwgMHg5OCwgMHg5NywgMHg5NiwgMHg5NSwgMHg5NCwKKyAgMHg5MywgMHg5MiwgMHg5MSwgMHg5MCwgMHg4ZiwgMHg4ZSwgMHg4ZCwgMHg4YywgMHg4YiwgMHg4YSwgMHg4OSwgMHg4OCwKKyAgMHg4NywgMHg4NiwgMHg4NSwgMHg4NCwgMHg4MywgMHg4MiwgMHg4MSwgMHg4MCwgMHg3ZiwgMHg3ZSwgMHg3ZCwgMHg3YywKKyAgMHg3YiwgMHg3YSwgMHg3OSwgMHg3OCwgMHg3NywgMHg3NiwgMHg3NSwgMHg3NCwgMHg3MywgMHg3MiwgMHg3MSwgMHg3MCwKKyAgMHg2ZiwgMHg2ZSwgMHg2ZCwgMHg2YywgMHg2YiwgMHg2YSwgMHg2OSwgMHg2OCwgMHg2NywgMHg2NiwgMHg2NSwgMHg2NCwKKyAgMHg2MywgMHg2MiwgMHg2MSwgMHg2MCwgMHg1ZiwgMHg1ZSwgMHg1ZCwgMHg1YywgMHg1YiwgMHg1YSwgMHg1OSwgMHg1OCwKKyAgMHg1NywgMHg1NiwgMHg1NSwgMHg1NCwgMHg1MywgMHg1MiwgMHg1MSwgMHg1MCwgMHg0ZiwgMHg0ZSwgMHg0ZCwgMHg0YywKKyAgMHg0YiwgMHg0YSwgMHg0OSwgMHg0OCwgMHg0NywgMHg0NiwgMHg0NSwgMHg0NCwgMHg0MywgMHg0MiwgMHg0MSwgMHg0MCwKKyAgMHgzZiwgMHgzZSwgMHgzZCwgMHgzYywgMHgzYiwgMHgzYSwgMHgzOSwgMHgzOCwgMHgzNywgMHgzNiwgMHgzNSwgMHgzNCwKKyAgMHgzMywgMHgzMiwgMHgzMSwgMHgzMCwgMHgyZiwgMHgyZSwgMHgyZCwgMHgyYywgMHgyYiwgMHgyYSwgMHgyOSwgMHgyOCwKKyAgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwgMHgyMSwgMHgyMCwgMHgxZiwgMHgxZSwgMHgxZCwgMHgxYywKKyAgMHgxYiwgMHgxYSwgMHgxOSwgMHgxOCwgMHgxNywgMHgxNiwgMHgxNSwgMHgxNCwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwKKyAgMHgwZiwgMHgwZSwgMHgwZCwgMHgwYywgMHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNSwgMHgwNCwKKyAgMHgwMywgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKKyAgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwKKyAgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKKyAgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywKKyAgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwKKyAgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKKyAgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywKKyAgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwKKyAgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg4MCwKKyAgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywKKyAgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwKKyAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwKKyAgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywKKyAgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKKyAgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwKKyAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywKKyAgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2NsaXAxWzEwMjAgKyAxMDIwICsgMV0gPSB7CisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCisgIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsCisgIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCisgIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsCisgIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCisgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsCisgIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCisgIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsCisgIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCisgIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsCisgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCisgIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCisgIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCisgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCisgIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisgIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCisgIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCisgIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCisgIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisgIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNjbGlwMlsxMTIgKyAxMTIgKyAxXSA9IHsKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKyAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwKKyAgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKyAgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTExICsgMV0gPSB7CisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCisgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsCisgIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsCisgIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsCisgIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsCisgIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsCisgIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsCisgIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsCisgIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsCisgIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsCisgIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsCisgIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsCisgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsCisgIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsCisgIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsCisgIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsCisgIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsCisgIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKKyNlbHNlCisKKy8vIHVuaW5pdGlhbGl6ZWQgdGFibGVzCitzdGF0aWMgdWludDhfdCBhYnMwWzI1NSArIDI1NSArIDFdOworc3RhdGljIGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXTsKK3N0YXRpYyBpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdOworc3RhdGljIHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTExICsgMV07CisKKy8vIFdlIGRlY2xhcmUgdGhpcyB2YXJpYWJsZSAndm9sYXRpbGUnIHRvIHByZXZlbnQgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZworLy8gYW5kIG1ha2Ugc3VyZSBpdCdzIHNldCB0byB0cnVlIF9sYXN0XyAoc28gYXMgdG8gYmUgdGhyZWFkLXNhZmUpCitzdGF0aWMgdm9sYXRpbGUgaW50IHRhYmxlc19vayA9IDA7CisKKyNlbmRpZiAgICAvLyBVU0VfU1RBVElDX1RBQkxFUworCitjb25zdCBpbnQ4X3QqIGNvbnN0IFZQOGtzY2xpcDEgPSAoY29uc3QgaW50OF90Kikmc2NsaXAxWzEwMjBdOworY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAyID0gKGNvbnN0IGludDhfdCopJnNjbGlwMlsxMTJdOworY29uc3QgdWludDhfdCogY29uc3QgVlA4a2NsaXAxID0gJmNsaXAxWzI1NV07Citjb25zdCB1aW50OF90KiBjb25zdCBWUDhrYWJzMCA9ICZhYnMwWzI1NV07CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhJbml0Q2xpcFRhYmxlcyh2b2lkKSB7CisjaWYgKFVTRV9TVEFUSUNfVEFCTEVTID09IDApCisgIGludCBpOworICBpZiAoIXRhYmxlc19vaykgeworICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1OyArK2kpIHsKKyAgICAgIGFiczBbMjU1ICsgaV0gPSAoaSA8IDApID8gLWkgOiBpOworICAgIH0KKyAgICBmb3IgKGkgPSAtMTAyMDsgaSA8PSAxMDIwOyArK2kpIHsKKyAgICAgIHNjbGlwMVsxMDIwICsgaV0gPSAoaSA8IC0xMjgpID8gLTEyOCA6IChpID4gMTI3KSA/IDEyNyA6IGk7CisgICAgfQorICAgIGZvciAoaSA9IC0xMTI7IGkgPD0gMTEyOyArK2kpIHsKKyAgICAgIHNjbGlwMlsxMTIgKyBpXSA9IChpIDwgLTE2KSA/IC0xNiA6IChpID4gMTUpID8gMTUgOiBpOworICAgIH0KKyAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NSArIDI1NTsgKytpKSB7CisgICAgICBjbGlwMVsyNTUgKyBpXSA9IChpIDwgMCkgPyAwIDogKGkgPiAyNTUpID8gMjU1IDogaTsKKyAgICB9CisgICAgdGFibGVzX29rID0gMTsKKyAgfQorI2VuZGlmICAgIC8vIFVTRV9TVEFUSUNfVEFCTEVTCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTcwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzMzIuYwpAQCAtMCwwICsxLDU4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBkc3AgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaW5jbHVkZSAic3JjL2RzcC9taXBzX21hY3JvLmgiCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGFic19taXBzMzIoaW50IHgpIHsKKyAgY29uc3QgaW50IHNpZ24gPSB4ID4+IDMxOworICByZXR1cm4gKHggXiBzaWduKSAtIHNpZ247Cit9CisKKy8vIDQgcGl4ZWxzIGluLCAyIHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjIodWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXTsKKyAgY29uc3QgaW50IGExID0gVlA4a3NjbGlwMlsoYSArIDQpID4+IDNdOworICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIHBbLXN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKK30KKworLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCk7CisgIGNvbnN0IGludCBhMSA9IFZQOGtzY2xpcDJbKGEgKyA0KSA+PiAzXTsKKyAgY29uc3QgaW50IGEyID0gVlA4a3NjbGlwMlsoYSArIDMpID4+IDNdOworICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOworICBwWy0yICogc3RlcF0gPSBWUDhrY2xpcDFbcDEgKyBhM107CisgIHBbLSAgICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGEyXTsKKyAgcFsgICAgICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworICBwWyAgICAgc3RlcF0gPSBWUDhrY2xpcDFbcTEgLSBhM107Cit9CisKKy8vIDYgcGl4ZWxzIGluLCA2IHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjYodWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAyID0gcFstMyAqIHN0ZXBdLCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXTsKKyAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMiAqIHN0ZXBdOworICBjb25zdCBpbnQgYSA9IFZQOGtzY2xpcDFbMyAqIChxMCAtIHAwKSArIFZQOGtzY2xpcDFbcDEgLSBxMV1dOworICAvLyBhIGlzIGluIFstMTI4LDEyN10sIGExIGluIFstMjcsMjddLCBhMiBpbiBbLTE4LDE4XSBhbmQgYTMgaW4gWy05LDldCisgIGNvbnN0IGludCBhMSA9ICgyNyAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDMgKiBhICsgNykgKiA5KSA+PiA3CisgIGNvbnN0IGludCBhMiA9ICgxOCAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDIgKiBhICsgNykgKiA5KSA+PiA3CisgIGNvbnN0IGludCBhMyA9ICg5ICAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDEgKiBhICsgNykgKiA5KSA+PiA3CisgIHBbLTMgKiBzdGVwXSA9IFZQOGtjbGlwMVtwMiArIGEzXTsKKyAgcFstMiAqIHN0ZXBdID0gVlA4a2NsaXAxW3AxICsgYTJdOworICBwWy0gICAgc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMV07CisgIHBbICAgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICAgIHN0ZXBdID0gVlA4a2NsaXAxW3ExIC0gYTJdOworICBwWyAyICogc3RlcF0gPSBWUDhrY2xpcDFbcTIgLSBhM107Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgaGV2KGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIHJldHVybiAoYWJzX21pcHMzMihwMSAtIHAwKSA+IHRocmVzaCkgfHwgKGFic19taXBzMzIocTEgLSBxMCkgPiB0aHJlc2gpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHQpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgcmV0dXJuICgoNCAqIGFic19taXBzMzIocDAgLSBxMCkgKyBhYnNfbWlwczMyKHAxIC0gcTEpKSA8PSB0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBuZWVkc19maWx0ZXIyKGNvbnN0IHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCB0LCBpbnQgaXQpIHsKKyAgY29uc3QgaW50IHAzID0gcFstNCAqIHN0ZXBdLCBwMiA9IHBbLTMgKiBzdGVwXTsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdOworICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyICogc3RlcF0sIHEzID0gcFszICogc3RlcF07CisgIGlmICgoNCAqIGFic19taXBzMzIocDAgLSBxMCkgKyBhYnNfbWlwczMyKHAxIC0gcTEpKSA+IHQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gYWJzX21pcHMzMihwMyAtIHAyKSA8PSBpdCAmJiBhYnNfbWlwczMyKHAyIC0gcDEpIDw9IGl0ICYmCisgICAgICAgICBhYnNfbWlwczMyKHAxIC0gcDApIDw9IGl0ICYmIGFic19taXBzMzIocTMgLSBxMikgPD0gaXQgJiYKKyAgICAgICAgIGFic19taXBzMzIocTIgLSBxMSkgPD0gaXQgJiYgYWJzX21pcHMzMihxMSAtIHEwKSA8PSBpdDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI2KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG9fZmlsdGVyNihwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNCh1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIHdoaWxlIChzaXplLS0gPiAwKSB7CisgICAgaWYgKG5lZWRzX2ZpbHRlcjIocCwgaHN0cmlkZSwgdGhyZXNoMiwgaXRocmVzaCkpIHsKKyAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKKyAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRvX2ZpbHRlcjQocCwgaHN0cmlkZSk7CisgICAgICB9CisgICAgfQorICAgIHAgKz0gdnN0cmlkZTsKKyAgfQorfQorCisvLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBGaWx0ZXJMb29wMjQocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBGaWx0ZXJMb29wMjQocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSwgc3RyaWRlLCB0aHJlc2gyKSkgeworICAgICAgZG9fZmlsdGVyMihwICsgaSwgc3RyaWRlKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSAqIHN0cmlkZSwgMSwgdGhyZXNoMikpIHsKKyAgICAgIGRvX2ZpbHRlcjIocCArIGkgKiBzdHJpZGUsIDEpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQ7CisgIGludCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTg7CisgIGludDE2X3QqIHBfaW4gPSAoaW50MTZfdCopaW47CisKKyAgLy8gbG9vcHMgdW5yb2xsZWQgYW5kIG1lcmdlZCB0byBhdm9pZCB1c2FnZSBvZiB0bXAgYnVmZmVyCisgIC8vIGFuZCB0byByZWR1Y2UgbnVtYmVyIG9mIHN0YWxscy4gTVVMIG1hY3JvIGlzIHdyaXR0ZW4KKyAgLy8gaW4gYXNzZW1ibGVyIGFuZCBpbmxpbmVkCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgImxoICAgICAgICVbdGVtcDBdLCAgMCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wOF0sICAxNiglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA0XSwgIDgoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDEyXSwgMjQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAwXSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDhdLCAgJVt0ZW1wNF0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMl0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMV0sICAyKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA1XSwgIDEwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDldLCAgMTgoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTNdLCAyNiglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDJdLCAgNCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wNl0sICAxMiglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxMF0sIDIwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDE0XSwgMjgoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXA4XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgJVt0ZW1wMTJdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wMTZdLCAlW3RlbXA0XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNF0sICAlW3RlbXAxNl0sICVbdGVtcDRdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDFdLCAgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wM10sICA2KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA3XSwgIDE0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDExXSwgMjIoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTVdLCAzMCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMl0sICVbdGVtcDBdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOV0sICAlW3RlbXA1XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDEzXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXA5XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxM10sICVbdGVtcDFdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxNF0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDldLCAgJVt0ZW1wMTZdLCAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNV0sICAlW3RlbXAxNl0sICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDJdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTBdLCAlW3RlbXA2XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDEwXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMF0sICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTZdLCAlW3RlbXA2XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNl0sICAlW3RlbXAxNl0sICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNF0sICVbdGVtcDJdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxNV0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxNV0sICVbdGVtcDE1XSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wM10sICAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMV0sICVbdGVtcDddLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgIDQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICA0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgIDQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTFdLCAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNV0sICVbdGVtcDNdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxNl0sICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA3XSwgICVbdGVtcDE2XSwgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wOF0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMF0sICVbdGVtcDldLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTFdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOV0sICAlW3RlbXA5XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTBdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMF0sICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDldLCAgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTJdLCAlW3RlbXAxNF0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sICVbdGVtcDE0XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxNF0sICVbdGVtcDEzXSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTVdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxNV0sICVbdGVtcDE1XSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXA5XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNF0sICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNV0sICVbdGVtcDEzXSwgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE0XSwgJVt0ZW1wMF0sICAlW3RlbXAyXSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDJdICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAyXSwgICVbdGVtcDFdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEzXSwgJVt0ZW1wM10sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTNdLCAlW3RlbXAyXSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDJdLCAgJVt0ZW1wNF0sICAlW3RlbXA2XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA2XSwgICVbdGVtcDVdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDFdLCAgJVt0ZW1wN10sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA3XSwgICVbdGVtcDVdLCAgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDVdLCAgJVt0ZW1wMTZdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDhdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxN10sICVbdGVtcDEwXSwgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTBdLCAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxMl0sICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDE1XSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNF0sICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMF0sICAlW3RlbXAxM10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEzXSwgJVt0ZW1wMl0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA3XSwgICVbdGVtcDRdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXA2XSwgICR6ZXJvLCAgICAgMjU1ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDFdLCAgMCswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA1XSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMV0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wNV0sICAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDFdLCAgJVt0ZW1wNl0sICAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxOF0sIDErMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDFdLCAgMCswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMThdLCAlW3RlbXAxOF0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMV0sICVbdGVtcDE4XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMThdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTFdLCAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMThdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDE4XSwgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxXSwgIDIrMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE4XSwgMSswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA4XSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMV0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wOF0sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDFdLCAgJVt0ZW1wNl0sICAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxOF0sIDMrMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDFdLCAgMiswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMThdLCAlW3RlbXAxOF0sICVbdGVtcDE2XSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNl0sICVbdGVtcDE4XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMThdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTZdLCA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMThdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDE4XSwgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxOF0sIDMrMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDVdLCAgMCsxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wOF0sICAxKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxMV0sIDIrMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE2XSwgMysxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXAxMl0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDVdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wNV0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDVdLCAgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDhdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wOF0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCA2ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDhdLCAgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDExXSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMTFdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxNl0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDE2XSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE4XSwgN2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxMV0sICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICI3OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTddLCA4ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDE2XSwgJVt0ZW1wNl0sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgIjg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA1XSwgIDArMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDhdLCAgMSsxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTFdLCAyKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxNl0sIDMrMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDVdLCAgMCsyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wOF0sICAxKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxMV0sIDIrMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE2XSwgMysyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXAwXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDE0XSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDVdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wNV0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXA4XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDhdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTFdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMV0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDE2XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTZdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDVdLCAgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxN10sIDEwZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wOF0sICAlW3RlbXA2XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAiMTA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDEyXSwgMTFmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxMV0sICVbdGVtcDZdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICIxMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wOV0sICAxMmYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDE2XSwgJVt0ZW1wNl0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgIjEyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA1XSwgIDArMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDhdLCAgMSsyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTFdLCAyKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxNl0sIDMrMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDVdLCAgMCszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wOF0sICAxKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxMV0sIDIrMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE2XSwgMyszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXA0XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDJdICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDVdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wNV0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXA4XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDhdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTFdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMV0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDE2XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTZdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCAxM2YgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDVdLCAgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjEzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxN10sIDE0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wOF0sICAlW3RlbXA2XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAiMTQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDEyXSwgMTVmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxMV0sICVbdGVtcDZdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICIxNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wOV0sICAxNmYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDE2XSwgJVt0ZW1wNl0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgIjE2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA1XSwgIDArMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDhdLCAgMSszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTFdLCAyKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxNl0sIDMrMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLAorICAgICAgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwKKyAgICAgIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCBbdGVtcDE3XSI9JnIiKHRlbXAxNyksCisgICAgICBbdGVtcDE4XSI9JnIiKHRlbXAxOCkKKyAgICA6IFtpbl0iciIocF9pbiksIFtrQzFdInIiKGtDMSksIFtrQzJdInIiKGtDMiksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVR3byhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIFRyYW5zZm9ybU9uZShpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIFRyYW5zZm9ybU9uZShpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRNSVBTMzIodm9pZCkgeworICBWUDhJbml0Q2xpcFRhYmxlcygpOworCisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVR3bzsKKworICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTY7CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNjsKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyODsKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyODsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7CisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKKworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTY7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdE1JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTM2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsOTk0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIGRzcCBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgInNyYy9kc3AvbWlwc19tYWNyby5oIgorCitzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKworI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTA7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgImxoICAgICAgICAgICAgICAgJVt0ZW1wNV0sICAwKCVbaW5dKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDQgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDE2LCAxNiAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDMgICAgICAgICAgIFxuXHQiCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDEsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAzLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCkKKyAgICBTVE9SRV9TQVRfU1VNX1gyKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsCisgICAgICAgICAgICAgICAgICAgICBkc3QsIDAsIDEsIDIsIDMsIEJQUykKKworICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTAoKQorICAgIDogW2luXSJyIihpbiksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDMyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBhID0gaW5bMF0gKyA0OworICBpbnQgYzQgPSBNVUwoaW5bNF0sIGtDMik7CisgIGNvbnN0IGludCBkNCA9IE1VTChpbls0XSwga0MxKTsKKyAgY29uc3QgaW50IGMxID0gTVVMKGluWzFdLCBrQzIpOworICBjb25zdCBpbnQgZDEgPSBNVUwoaW5bMV0sIGtDMSk7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiaW5zICAgICAgICAgICAgICAlW2M0XSwgICAgICAlW2Q0XSwgICAgIDE2LCAgICAgICAxNiAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDFdLCAgICVbYV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNF0sICAgJVtkMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMiwgdGVtcDMsIHRlbXAxLCBjNCkKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA1XSwgICAlW2MxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNISUZUX1JfU1VNX1gyKHRlbXAxLCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMiwgdGVtcDksIHRlbXAxMCwgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgdGVtcDIsIHRlbXAyLCB0ZW1wMywgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDQsIHRlbXA1KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDMsIHRlbXA1LCB0ZW1wMTEsIHRlbXAxMiwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDEzLCB0ZW1wMTQsIHRlbXAzLCB0ZW1wMTUsIHRlbXA1LCB0ZW1wMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDExLCB0ZW1wMTcsIHRlbXAzLCB0ZW1wNSwgdGVtcDExLCB0ZW1wMTIpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXAxMiwgdGVtcDE4LCB0ZW1wNywgdGVtcDYsIHRlbXAxLCB0ZW1wOCwgdGVtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA0LCB0ZW1wNywgdGVtcDYsIHRlbXAxMCwgdGVtcDkpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wMTMsIHRlbXAxNCwgdGVtcDMsIHRlbXAxNSwgdGVtcDUsIHRlbXAxNiwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDE3LCB0ZW1wMTIsIHRlbXAxOCwgdGVtcDEsIHRlbXA4LCB0ZW1wMiwgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wNywgdGVtcDYsIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpLAorICAgICAgW2M0XSIrJnIiKGM0KQorICAgIDogW2RzdF0iciIoZHN0KSwgW2FdInIiKGEpLCBbZDFdInIiKGQxKSwgW2Q0XSJyIihkNCksIFtjMV0iciIoYzEpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTg7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMl0sICAgMTYoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9JTl9YMih0ZW1wNSwgdGVtcDYsIDI0LCAyNikKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wMikKKyAgICBMT0FEX0lOX1gyKHRlbXAxLCB0ZW1wMiwgOCwgMTApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMCwgdGVtcDgsIHRlbXA5LCB0ZW1wNywgdGVtcDEsIHRlbXAyLCB0ZW1wNSwgdGVtcDYsCisgICAgICAgICAgICAgICAgICB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTIpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDgsIHRlbXA3LCB0ZW1wMTAsIHRlbXA5KQorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE3XSwgIDQoJVtpbl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE4XSwgIDIwKCVbaW5dKSAgICAgICAgICAgICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA4KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNiwgdGVtcDQsIHRlbXA3KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgpCisgICAgTE9BRF9JTl9YMih0ZW1wMTcsIHRlbXAxOCwgMTIsIDE0KQorICAgIExPQURfSU5fWDIodGVtcDksIHRlbXAxMCwgMjgsIDMwKQorICAgIE1VTF9TSElGVF9TVU0odGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDQsIHRlbXAxNywKKyAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDE0LCB0ZW1wMTEsIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsIHRlbXA5LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICB0ZW1wMTUsIHRlbXA0LCB0ZW1wMTYsIHRlbXAxNykKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDE3LCB0ZW1wOCwgdGVtcDgsIHRlbXAxMSkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXA3LCB0ZW1wMTIpCisKKyAgICAvLyBob3Jpem9udGFsCisgICAgU1JBXzE2KHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDYsIHRlbXA1LCB0ZW1wMikKKyAgICBTUkFfMTYodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMywgdGVtcDQsIHRlbXAxNywgdGVtcDgpCisgICAgInJlcGwucGggICAgICAgICAgJVt0ZW1wMl0sICAgMHg0ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDMsIHRlbXA4LCB0ZW1wMTcsIHRlbXA0KQorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAyLCB0ZW1wNCwgdGVtcDEsIHRlbXAzKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNywgdGVtcDYsIHRlbXA4KQorICAgIE1VTF9TSElGVF9TVU0odGVtcDEsIHRlbXAzLCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMTMsIHRlbXAxNywgdGVtcDE4LAorICAgICAgICAgICAgICAgICAgdGVtcDMsIHRlbXAxMywgdGVtcDEsIHRlbXA5LCB0ZW1wOSwgdGVtcDEzLCB0ZW1wMTEsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgIHRlbXA2LCB0ZW1wMTcsIHRlbXA4LCB0ZW1wMTgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNiwgdGVtcDgsIHRlbXAxOCwgdGVtcDE3LCB0ZW1wMTEsIHRlbXAxNSwgdGVtcDEyLCB0ZW1wMTYsCisgICAgICAgICAgICAgICAgICB0ZW1wOCwgdGVtcDE1LCB0ZW1wNiwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxNiwgdGVtcDEwLCB0ZW1wMTQsCisgICAgICAgICAgICAgICAgICB0ZW1wMTgsIHRlbXAxMiwgdGVtcDE3LCB0ZW1wMTYpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDEsIHRlbXAzLCB0ZW1wOSwgdGVtcDEzKQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXA2LCB0ZW1wOCwgdGVtcDExLCB0ZW1wMTUpCisgICAgU0hJRlRfUl9TVU1fWDIodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsCisgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMiwgdGVtcDQsIHRlbXA1LCB0ZW1wNywgdGVtcDMsIHRlbXAxLCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICB0ZW1wNikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA5LCB0ZW1wMTIsIHRlbXAxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMTEsIHRlbXAxMCwgdGVtcDE1LCB0ZW1wMTQpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDE1KQorICAgIFNUT1JFX1NBVF9TVU1fWDIodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXA5LCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDEzLCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpCisgICAgOiBbZHN0XSJyIihkc3QpLCBbaW5dInIiKGluKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNih1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDFdLCAgJVtoc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3NpemVdLCAgICVbc2l6ZV0sICAgICAgICAtMSAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMl0sICAlW2hzdHJpZGVdLCAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICAgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA0XSwgICVbdGVtcDJdLCAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICVbdGVtcDddLCAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA2XSwgICVbdGVtcDNdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA1XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDldLCAgJVt0ZW1wM10oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxMF0sICVbdGVtcDFdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTFdLCAlW3RlbXA2XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDEyXSwgJVtoc3RyaWRlXSglW3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxM10sICVbdGVtcDJdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTRdLCAlW3RlbXA0XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDddICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAxMl0gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wM10sICAgICAgICVbdGVtcDRdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDE1XSwgICAgICAlW3RocmVzaDJdICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNl0sICAlW3RlbXAxXSwgICAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDExXSwgICAgICAlW3RlbXA4XSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wOF0sICAgICAgICVbdGVtcDldICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA1XSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAxMF0gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDVdLCAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTRdLCAgICAgICVbdGVtcDEzXSAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbHQgICAgICAgJVt0ZW1wNV0sICAlW2hldl90aHJlc2hdLCAgJVt0ZW1wNV0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAxM10sICAgICAgJVt0ZW1wMTJdICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICVbdGVtcDJdLCAgICAgICAyNCAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAxNV0sICVbdGVtcDEyXSwgICAgICAlW3RlbXA3XSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAxNV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDE1XSwgJVt0ZW1wMTVdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNsdCAgICAgICVbdGVtcDE1XSwgJVtoZXZfdGhyZXNoXSwgICVbdGVtcDE1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICVbdGVtcDZdLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJvciAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSwgICAgICAgJVt0ZW1wMTVdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDNdICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAlW3RlbXAyXSwgIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2hyYV9yLncgJVt0ZW1wMV0sICAlW3RlbXA1XSwgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDJdLCAgJVt0ZW1wNV0sICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbcF0sICAgICAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICVbdGVtcDddLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxMF0sICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICVbdGVtcDFdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaiAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAlW3RlbXAxXSwgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxNF0sICVbcF0sICAgICAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxNF0sICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxMV0sICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNl0sICAgICAgICVbdGVtcDFdICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAzXSwgICVbdGVtcDJdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNF0sICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDYzICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICA2MyAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgICAgNjMgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDcgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICA3ICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgICAgNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wOF0sICAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAzXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNl0sICAlW3RlbXAxMF0sICAgICAgJVt0ZW1wNF0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wN10sICAgICAgICVbdGVtcDRdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA3XSwgICVbdGVtcDEyXSwgICAgICAlW3RlbXAzXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMTBdLCAlW3BdLCAgICAgICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTNdLCAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxMl0sICVbdGVtcDEwXSwgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxXSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wNV0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICVbdGVtcDZdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNV0sICAlW3RlbXA4XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wN10oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA4XSwgICVbdGVtcDldKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAwKCVbdGVtcDE1XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgMCglW3RlbXAxMV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgIDAoJVt0ZW1wMTRdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNV0sICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDZdLCAgMCglW3RlbXAxMF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMTJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbc2l6ZV0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3BdLCAgICAgICVbcF0sICAgICAgICAgICAlW3ZzdHJpZGVdICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNiksCisgICAgICBbdGVtcDddIj0mciIodGVtcDcpLFt0ZW1wOF0iPSZyIih0ZW1wOCksW3RlbXA5XSI9JnIiKHRlbXA5KSwKKyAgICAgIFt0ZW1wMTBdIj0mciIodGVtcDEwKSxbdGVtcDExXSI9JnIiKHRlbXAxMSksW3RlbXAxMl0iPSZyIih0ZW1wMTIpLAorICAgICAgW3RlbXAxM10iPSZyIih0ZW1wMTMpLFt0ZW1wMTRdIj0mciIodGVtcDE0KSxbdGVtcDE1XSI9JnIiKHRlbXAxNSksCisgICAgICBbc2l6ZV0iKyZyIihzaXplKSwgW3BdIismciIocCkKKyAgICA6IFtoc3RyaWRlXSJyIihoc3RyaWRlKSwgW3RocmVzaDJdInIiKHRocmVzaDIpLAorICAgICAgW2l0aHJlc2hdInIiKGl0aHJlc2gpLFt2c3RyaWRlXSJyIih2c3RyaWRlKSwgW2hldl90aHJlc2hdInIiKGhldl90aHJlc2gpLAorICAgICAgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IHAwLCBxMCwgcDEsIHExLCBwMiwgcTIsIHAzLCBxMzsKKyAgaW50IHN0ZXAxLCBzdGVwMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIHVpbnQ4X3QqIHBUZW1wMDsKKyAgdWludDhfdCogcFRlbXAxOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJsdHogICAgICAlW3NpemVdLCAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3N0ZXAxXSwgICAlW2hzdHJpZGVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgJVtxMF0sICAgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcDBdLCAgICAgICVbc3RlcDFdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJsYnV4ICAgICAgJVtxMV0sICAgICAgJVtoc3RyaWRlXSglW3BdKSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgICVbcDBdLCAgICAgICAgICVbcTBdICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3AxXSwgICAgICAlW3N0ZXAxXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtzdGVwMl0sICAgJVtoc3RyaWRlXSwgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDJdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICAlW3AxXSwgICAgICAgICAlW3ExXSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0sICAgICAgJVt0aHJlc2gyXSAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbGJ1eCAgICAgJVtwMl0sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImxidXggICAgICAlW3EyXSwgICAgICAlW3N0ZXAyXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtwM10sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbcDJdLCAgICAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3N0ZXAyXSwgICAlW3N0ZXAyXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVtwM10sICAgICAgICAgJVtwMl0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtxM10sICAgICAgJVtzdGVwMl0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgInN1YnUgICAgICAlW3AzXSwgICAgICAlW3AxXSwgICAgICAgICAlW3AwXSAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wMl0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFic3Ffcy53ICVbcDNdLCAgICAgICVbcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICAlW3EzXSwgICAgICAgICAlW3EyXSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtwVGVtcDBdLCAgJVtwXSwgICAgICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3AzXSwgICAgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzbGwgICAgICAgJVtzdGVwMV0sICAgJVt0ZW1wMV0sICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDJdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVtxMl0sICAgICAgICAgJVtxMV0gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhYnNxX3MudyAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxM10sICAgICAgJVtxMV0sICAgICAgICAgJVtxMF0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbcTNdLCAgICAgICVbcTNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgJVtzdGVwMV0gICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDJdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICAlW3EzXSwgICAgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzbHQgICAgICAgJVtwM10sICAgICAgJVtoZXZfdGhyZXNoXSwgJVtwM10gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzbHQgICAgICAlW3EzXSwgICAgICAlW2hldl90aHJlc2hdLCAlW3EzXSAgICAgICBcblx0IgorICAgICJvciAgICAgICAgJVtxM10sICAgICAgJVtxM10sICAgICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbcTNdLCAgICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzaHJhX3IudyAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcFRlbXAxXSwgICVbcF0sICAgICAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbc3RlcDFdLCAgICVbdGVtcDJdLCAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwMF0sICAgICAgJVtwMF0sICAgICAgICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcDFdLCAgICAgICVbcDFdLCAgICAgICAgICVbc3RlcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3EwXSwgICAgICAlW3EwXSwgICAgICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxMV0sICAgICAgJVtxMV0sICAgICAgICAgJVtzdGVwMV0gICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgICVbcDBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAlW3EwXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNF0sICAgJVtxMV0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDJdLCAgIDAoJVtwVGVtcDBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICAlW3AxXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtwVGVtcDBdLCAgJVtwVGVtcDBdLCAgICAlW2hzdHJpZGVdICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAwKCVbcFRlbXAxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJqICAgICAgICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICVbdGVtcDFdLCAgIDAoJVtwVGVtcDBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgMjQgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJzaHJhX3IudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcDBdLCAgICAgICVbcDBdLCAgICAgICAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3EwXSwgICAgICAlW3EwXSwgICAgICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMV0sICAgJVtwMF0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgICVbcTBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAyXSwgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMV0sICAgMCglW3BUZW1wMF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3NpemVdLCAgICAlW3NpemVdLCAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtzaXplXSwgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZHUgICAgICVbcF0sICAgICAgICVbcF0sICAgICAgICAgICVbdnN0cmlkZV0gIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtwMF0iPSZyIihwMCksIFtxMF0iPSZyIihxMCksIFtwMV0iPSZyIihwMSksIFtxMV0iPSZyIihxMSksCisgICAgICBbcDJdIj0mciIocDIpLCBbcTJdIj0mciIocTIpLCBbcDNdIj0mciIocDMpLCBbcTNdIj0mciIocTMpLAorICAgICAgW3N0ZXAyXSI9JnIiKHN0ZXAyKSwgW3N0ZXAxXSI9JnIiKHN0ZXAxKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksCisgICAgICBbcFRlbXAwXSI9JnIiKHBUZW1wMCksIFtwVGVtcDFdIj0mciIocFRlbXAxKSwgW3BdIismciIocCksCisgICAgICBbc2l6ZV0iKyZyIihzaXplKQorICAgIDogW3ZzdHJpZGVdInIiKHZzdHJpZGUpLCBbaXRocmVzaF0iciIoaXRocmVzaCksCisgICAgICBbaGV2X3RocmVzaF0iciIoaGV2X3RocmVzaCksIFtoc3RyaWRlXSJyIihoc3RyaWRlKSwKKyAgICAgIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworI3VuZGVmIE1VTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICB1aW50OF90KiBwMSA9IHAgLSBzdHJpZGU7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAlW2ldLCAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDRdLCAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0sICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICAlW3N0cmlkZV0oJVtwXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNF0oJVtwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdKCVbcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDddLCAgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDNdICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDVdLCAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDIgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdLCAgICAgICAlW3RocmVzaDJdICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wNV0gICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNV0sICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICVbaV0sICAgICAgICAlW2ldLCAgICAgICAgICAgLTEgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNV0sICAgICVbdGVtcDZdLCAgICAgICAyNCAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wOF0gICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXA1XSAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDddLCAgICAlW3RlbXAzXSwgICAgICAgMyAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICAgIDMgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgJVt0ZW1wOF0sICAgICVbdGVtcDNdLCAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDBdLCAgICAlW3RlbXA3XSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDI3ICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAyNyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDBdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAlW3RlbXA0XSAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSglW1ZQOGtjbGlwMV0pICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIDAoJVtwMV0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDRdLCAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtwMV0sICAgICAgICVbcDFdLCAgICAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbaV0sICAgICAgICAwYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAlW3BdLCAgICAgICAgJVtwXSwgICAgICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICIgLnNldCAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFtwXSIrJnIiKHApLCBbaV0iPSZyIihpKSwgW3AxXSIrJnIiKHAxKQorICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKSwgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKSwgW3RocmVzaDJdInIiKHRocmVzaDIpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLyBURU1QMCA9IFNSQ1tBICsgQTEgKiBCUFNdCisvLyBURU1QMSA9IFNSQ1tCICsgQjEgKiBCUFNdCisvLyBURU1QMiA9IFNSQ1tDICsgQzEgKiBCUFNdCisvLyBURU1QMyA9IFNSQ1tEICsgRDEgKiBCUFNdCisjZGVmaW5lIExPQURfNF9CWVRFUyhURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgQSwgQTEsIEIsIEIxLCBDLCBDMSwgRCwgRDEsIFNSQykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDAgIl0sICAgIiAjQSAiKyIgI0ExICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisgICJsYnUgICAgICAlWyIgI1RFTVAxICJdLCAgICIgI0IgIisiICNCMSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pIFxuXHQiICAgXAorICAibGJ1ICAgICAgJVsiICNURU1QMiAiXSwgICAiICNDICIrIiAjQzEgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSBcblx0IiAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDMgIl0sICAgIiAjRCAiKyIgI0QxICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAlW2ldLCAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF80X0JZVEVTKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCAtMiwgMCwgLTEsIDAsIDAsIDAsIDEsIDAsIHApCisgICAgInN1YnUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDVdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgICVbdGhyZXNoMl0gIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA1XSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAlW2ldLCAgICAgICAgJVtpXSwgICAgICAgICAgIC0xICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0sICAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDhdICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDVdICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAlW3RlbXA4XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAwXSwgICAgJVt0ZW1wN10sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDBdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10oJVtWUDhrY2xpcDFdKSAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgLTEoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW2ldLCAgICAgICAgMGIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3BdLCAgICAgICAgJVtwXSwgICAgICAgICAgICVbc3RyaWRlXSAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbcF0iKyZyIihwKSwgW2ldIj0mciIoaSkKKyAgICA6IFtzdHJpZGVdInIiKHN0cmlkZSksIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworLy8gRFNUW0EgKiBCUFNdICAgICA9IFRFTVAwCisvLyBEU1RbQiArIEMgKiBCUFNdID0gVEVNUDEKKyNkZWZpbmUgU1RPUkVfOF9CWVRFUyhURU1QMCwgVEVNUDEsIEEsIEIsIEMsIERTVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1c3cgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIqIiBYU1RSKEJQUykgIiglWyIgI0RTVCAiXSkgICAgICAgICBcblx0IiAgICAgXAorICAidXN3ICAgICVbIiAjVEVNUDEgIl0sICAgIiAjQiAiKyIgI0MgIioiIFhTVFIoQlBTKSAiKCVbIiAjRFNUICJdKSAgXG5cdCIKKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAtMSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bGggICAgICAgICAgICAgJVt0ZW1wMV0sICAgMyglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA0XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDQsIHRlbXA0LCAwLCAwLCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wNCwgdGVtcDQsIDIsIDAsIDMsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgREM0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgJVt0ZW1wMF0sICAgLTEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgTE9BRF80X0JZVEVTKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgZHN0KQorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgIDgsICAgICA4ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAzXSwgICAgMTYsICAgIDggICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDRdLCAgICAyNCwgICAgOCAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMCwgMCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCAwLCAzLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzRfQllURVModGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgInVsdyAgICAgICAgICAgICVbdGVtcDddLCAgIC0xLSIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAwXSwgMTYsIDE2ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgJVt0ZW1wNV0sICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAxNiwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAlW3RlbXA0XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sIDE2LCAxNiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAxICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNV0sICVbdGVtcDFdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sIDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAlW3RlbXA2XSAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNV0sICVbdGVtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDBdLCAlW3RlbXA4XSAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAlW3RlbXA1XSwgICAzLSIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICVbdGVtcDddICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA1XSwgMCwgIDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICVbdGVtcDNdICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAgICVbdGVtcDRdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXA2XSwgICAlW3RlbXA4XSwgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMiwgdGVtcDYsIDMsIDAsIDEsIGRzdCkKKyAgICAicHJlcGVuZCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sIDggICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDRdLCA4ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDIsIHRlbXA2LCAyLCAwLCAwLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vIFRFTVAwID0gU1JDW0EgKiBCUFNdCisvLyBURU1QMSA9IFNSQ1tCICsgQyAqIEJQU10KKyNkZWZpbmUgTE9BRF84X0JZVEVTKFRFTVAwLCBURU1QMSwgQSwgQiwgQywgU1JDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgICAgICAgICBcblx0IiAgICAgXAorICAidWx3ICAgICVbIiAjVEVNUDEgIl0sICAgIiAjQiAiKyIgI0MgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSAgXG5cdCIKKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzhfQllURVModGVtcDAsIHRlbXAxLCAtMSwgNCwgLTEsIGRzdCkKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDNdICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA4XSAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAyICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDI0ICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wM10sICAgICVbdGVtcDldICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDIgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDksIHRlbXAzLCAwLCAwLCAyLCBkc3QpCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMF0sICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXA5LCB0ZW1wMywgMSwgMCwgMywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCitzdGF0aWMgdm9pZCBEQzh1dih1aW50OF90KiBkc3QpIHsgICAgIC8vIERDCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfOF9CWVRFUyh0ZW1wMCwgdGVtcDEsIC0xLCA0LCAtMSwgZHN0KQorICAgIExPQURfNF9CWVRFUyh0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgLTEsIDAsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIGRzdCkKKyAgICBMT0FEXzRfQllURVModGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIC0xLCA0LCAtMSwgNSwgLTEsIDYsIC0xLCA3LCBkc3QpCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA4XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCA0LCAwLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDEsIDQsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgNCwgMiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAzLCA0LCAzLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDQsIDQsIDQsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNSwgNCwgNSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA2LCA0LCA2LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDcsIDQsIDcsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gbGVmdCBzYW1wbGVzCisgIGludCB0ZW1wMCwgdGVtcDE7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfOF9CWVRFUyh0ZW1wMCwgdGVtcDEsIC0xLCA0LCAtMSwgZHN0KQorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDAsIDQsIDAsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMSwgNCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCA0LCAyLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDMsIDQsIDMsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNCwgNCwgNCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA1LCA0LCA1LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDYsIDQsIDYsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNywgNCwgNywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcCh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzRfQllURVModGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgTE9BRF80X0JZVEVTKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxLCAtMSwgNCwgLTEsIDUsIC0xLCA2LCAtMSwgNywgZHN0KQorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wOF0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCA0LCAwLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDEsIDQsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgNCwgMiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAzLCA0LCAzLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDQsIDQsIDQsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNSwgNCwgNSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA2LCA0LCA2LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDcsIDQsIDcsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworI3VuZGVmIExPQURfOF9CWVRFUworI3VuZGVmIFNUT1JFXzhfQllURVMKKyN1bmRlZiBMT0FEXzRfQllURVMKKworI2RlZmluZSBDTElQUElORyhTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmlmICIgI1NJWkUgIiA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDFdLCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKworI2RlZmluZSBDTElQXzhCX1RPX0RTVChEU1QsIFRPUCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGRzdF8xID0gKChpbnQpKERTVClbLTFdIDw8IDE2KSArIChEU1QpWy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtkc3RfMV0sICAgJVtkc3RfMV0sICAgICVbdG9wXzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtkc3RfMV0sICAgJVtkc3RfMV0sICAgICVbdG9wXzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIDogW2RzdF8xXSIrJnIiKGRzdF8xKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgICAgICAgICAgIFwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbdG9wXzFdInIiKHRvcF8xKSwgW3RvcF0iciIoKFRPUCkpLCBbZHN0XSJyIigoRFNUKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfVE9fRFNUKERTVCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDhfdCogdG9wID0gKERTVCkgLSBCUFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0b3BfMSA9ICgoaW50KXRvcFstMV0gPDwgMTYpICsgdG9wWy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHkgPSAwOyB5IDwgKFNJWkUpOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQXzhCX1RPX0RTVCgoRFNUKSwgdG9wLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKERTVCkgKz0gQlBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJVRV9NT1RJT04oRFNULCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBUcnVlTW90aW9uIyNTSVpFKHVpbnQ4X3QqIChEU1QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1RPX0RTVCgoRFNUKSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVFJVRV9NT1RJT04oZHN0LCA0KQorVFJVRV9NT1RJT04oZHN0LCA4KQorVFJVRV9NT1RJT04oZHN0LCAxNikKKworI3VuZGVmIFRSVUVfTU9USU9OCisjdW5kZWYgQ0xJUF9UT19EU1QKKyN1bmRlZiBDTElQXzhCX1RPX0RTVAorI3VuZGVmIENMSVBQSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtREM7CisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDMzsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2OworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4OworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4OworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTY7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOworCisgIFZQOFByZWRMdW1hNFswXSA9IERDNDsKKyAgVlA4UHJlZEx1bWE0WzFdID0gVHJ1ZU1vdGlvbjQ7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNDsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0OworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDQ7CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1djsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUcnVlTW90aW9uODsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0OworCisgIFZQOFByZWRMdW1hMTZbMV0gPSBUcnVlTW90aW9uMTY7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5MDYyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21zYS5jCkBAIC0wLDAgKzEsMTAyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2ZXJzaW9uIG9mIGRzcCBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6ICBQcmFzaGFudCBQYXRpbCAgIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworCisjZGVmaW5lIElEQ1RfMURfVyhpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIHsgIFwKKyAgdjRpMzIgYTFfbSwgYjFfbSwgYzFfbSwgZDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBjX3RtcDFfbSwgY190bXAyX20sIGRfdG1wMV9tLCBkX3RtcDJfbTsgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIGNvc3BpOHNxcnQybWludXMxID0gX19tc2FfZmlsbF93KDIwMDkxKTsgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgc2lucGk4c3FydDIgPSBfX21zYV9maWxsX3coMzU0NjgpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGExX20gPSBpbjAgKyBpbjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYjFfbSA9IGluMCAtIGluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjX3RtcDFfbSA9IChpbjEgKiBzaW5waThzcXJ0MikgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNfdG1wMl9tID0gaW4zICsgKChpbjMgKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOyAgICAgICAgICAgIFwKKyAgYzFfbSA9IGNfdG1wMV9tIC0gY190bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkX3RtcDFfbSA9IGluMSArICgoaW4xICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsgICAgICAgICAgICBcCisgIGRfdG1wMl9tID0gKGluMyAqIHNpbnBpOHNxcnQyKSA+PiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZDFfbSA9IGRfdG1wMV9tICsgZF90bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCVVRURVJGTFlfNChhMV9tLCBiMV9tLCBjMV9tLCBkMV9tLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICBcCit9CisjZGVmaW5lIE1VTFQxKGEpICgoKChhKSAqIDIwMDkxKSA+PiAxNikgKyAoYSkpCisjZGVmaW5lIE1VTFQyKGEpICgoKGEpICogMzU0NjgpID4+IDE2KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICB2OGkxNiBpbnB1dDAsIGlucHV0MTsKKyAgdjRpMzIgaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMsIHZ0MCwgdnQxLCB2dDIsIHZ0MzsKKyAgdjRpMzIgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICB2MTZpOCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0MzsKKworICBMRF9TSDIoaW4sIDgsIGlucHV0MCwgaW5wdXQxKTsKKyAgVU5QQ0tfU0hfU1coaW5wdXQwLCBpbjAsIGluMSk7CisgIFVOUENLX1NIX1NXKGlucHV0MSwgaW4yLCBpbjMpOworICBJRENUXzFEX1coaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBUUkFOU1BPU0U0eDRfU1dfU1coaHowLCBoejEsIGh6MiwgaHozLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBJRENUXzFEX1coaHowLCBoejEsIGh6MiwgaHozLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBTUkFSSV9XNF9TVyh2dDAsIHZ0MSwgdnQyLCB2dDMsIDMpOworICBUUkFOU1BPU0U0eDRfU1dfU1codnQwLCB2dDEsIHZ0MiwgdnQzLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBMRF9TQjQoZHN0LCBCUFMsIGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzKTsKKyAgSUxWUl9CNF9TVyh6ZXJvLCBkZXN0MCwgemVybywgZGVzdDEsIHplcm8sIGRlc3QyLCB6ZXJvLCBkZXN0MywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgSUxWUl9INF9TVyh6ZXJvLCByZXMwLCB6ZXJvLCByZXMxLCB6ZXJvLCByZXMyLCB6ZXJvLCByZXMzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBBREQ0KHJlczAsIHZ0MCwgcmVzMSwgdnQxLCByZXMyLCB2dDIsIHJlczMsIHZ0MywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIENMSVBfU1c0XzBfMjU1KHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBQQ0tFVl9CMl9TVyhyZXMwLCByZXMxLCByZXMyLCByZXMzLCB2dDAsIHZ0MSk7CisgIHJlczAgPSAodjRpMzIpX19tc2FfcGNrZXZfYigodjE2aTgpdnQwLCAodjE2aTgpdnQxKTsKKyAgU1Q0eDRfVUIocmVzMCwgcmVzMCwgMywgMiwgMSwgMCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud28oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmUoaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmUoaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgdjhpMTYgaW5wdXQwLCBpbnB1dDE7CisgIGNvbnN0IHY4aTE2IG1hc2swID0geyAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEgfTsKKyAgY29uc3QgdjhpMTYgbWFzazEgPSB7IDQsIDUsIDYsIDcsIDEyLCAxMywgMTQsIDE1IH07CisgIGNvbnN0IHY4aTE2IG1hc2syID0geyAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazMgPSB7IDMsIDcsIDExLCAxNSwgMiwgNiwgMTAsIDE0IH07CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIHY4aTE2IG91dDAsIG91dDE7CisKKyAgTERfU0gyKGluLCA4LCBpbnB1dDAsIGlucHV0MSk7CisgIGlucHV0MSA9IFNMRElfU0goaW5wdXQxLCBpbnB1dDEsIDgpOworICB0bXAwID0gaW5wdXQwICsgaW5wdXQxOworICB0bXAxID0gaW5wdXQwIC0gaW5wdXQxOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIG91dDAgPSB0bXAyICsgdG1wMzsKKyAgb3V0MSA9IHRtcDIgLSB0bXAzOworICBWU0hGX0gyX1NIKG91dDAsIG91dDEsIG91dDAsIG91dDEsIG1hc2syLCBtYXNrMywgaW5wdXQwLCBpbnB1dDEpOworICB0bXAwID0gaW5wdXQwICsgaW5wdXQxOworICB0bXAxID0gaW5wdXQwIC0gaW5wdXQxOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIHRtcDAgPSB0bXAyICsgdG1wMzsKKyAgdG1wMSA9IHRtcDIgLSB0bXAzOworICBBRERWSV9IMl9TSCh0bXAwLCAzLCB0bXAxLCAzLCBvdXQwLCBvdXQxKTsKKyAgU1JBSV9IMl9TSChvdXQwLCBvdXQxLCAzKTsKKyAgb3V0WzBdID0gX19tc2FfY29weV9zX2gob3V0MCwgMCk7CisgIG91dFsxNl0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCA0KTsKKyAgb3V0WzMyXSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDApOworICBvdXRbNDhdID0gX19tc2FfY29weV9zX2gob3V0MSwgNCk7CisgIG91dFs2NF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCAxKTsKKyAgb3V0WzgwXSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDUpOworICBvdXRbOTZdID0gX19tc2FfY29weV9zX2gob3V0MSwgMSk7CisgIG91dFsxMTJdID0gX19tc2FfY29weV9zX2gob3V0MSwgNSk7CisgIG91dFsxMjhdID0gX19tc2FfY29weV9zX2gob3V0MCwgMik7CisgIG91dFsxNDRdID0gX19tc2FfY29weV9zX2gob3V0MCwgNik7CisgIG91dFsxNjBdID0gX19tc2FfY29weV9zX2gob3V0MSwgMik7CisgIG91dFsxNzZdID0gX19tc2FfY29weV9zX2gob3V0MSwgNik7CisgIG91dFsxOTJdID0gX19tc2FfY29weV9zX2gob3V0MCwgMyk7CisgIG91dFsyMDhdID0gX19tc2FfY29weV9zX2gob3V0MCwgNyk7CisgIG91dFsyMjRdID0gX19tc2FfY29weV9zX2gob3V0MSwgMyk7CisgIG91dFsyNDBdID0gX19tc2FfY29weV9zX2gob3V0MSwgNyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IERDID0gKGluWzBdICsgNCkgPj4gMzsKKyAgY29uc3QgdjhpMTYgdG1wMCA9IF9fbXNhX2ZpbGxfaChEQyk7CisgIEFEREJMS19TVDR4NF9VQih0bXAwLCB0bXAwLCB0bXAwLCB0bXAwLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDMyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBhID0gaW5bMF0gKyA0OworICBjb25zdCBpbnQgYzQgPSBNVUxUMihpbls0XSk7CisgIGNvbnN0IGludCBkNCA9IE1VTFQxKGluWzRdKTsKKyAgY29uc3QgaW50IGluMiA9IE1VTFQyKGluWzFdKTsKKyAgY29uc3QgaW50IGluMyA9IE1VTFQxKGluWzFdKTsKKyAgdjRpMzIgdG1wMCA9IHsgMCB9OworICB2NGkzMiBvdXQwID0gX19tc2FfZmlsbF93KGEgKyBkNCk7CisgIHY0aTMyIG91dDEgPSBfX21zYV9maWxsX3coYSArIGM0KTsKKyAgdjRpMzIgb3V0MiA9IF9fbXNhX2ZpbGxfdyhhIC0gYzQpOworICB2NGkzMiBvdXQzID0gX19tc2FfZmlsbF93KGEgLSBkNCk7CisgIHY0aTMyIHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgIGNvbnN0IHY0aTMyIHplcm8gPSB7IDAgfTsKKyAgdjE2dTggZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDM7CisKKyAgSU5TRVJUX1c0X1NXKGluMywgaW4yLCAtaW4yLCAtaW4zLCB0bXAwKTsKKyAgQURENChvdXQwLCB0bXAwLCBvdXQxLCB0bXAwLCBvdXQyLCB0bXAwLCBvdXQzLCB0bXAwLAorICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBTUkFJX1c0X1NXKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDMpOworICBMRF9VQjQoZHN0LCBCUFMsIGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzKTsKKyAgSUxWUl9CNF9TVyh6ZXJvLCBkZXN0MCwgemVybywgZGVzdDEsIHplcm8sIGRlc3QyLCB6ZXJvLCBkZXN0MywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgSUxWUl9INF9TVyh6ZXJvLCByZXMwLCB6ZXJvLCByZXMxLCB6ZXJvLCByZXMyLCB6ZXJvLCByZXMzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBBREQ0KHJlczAsIG91dDAsIHJlczEsIG91dDEsIHJlczIsIG91dDIsIHJlczMsIG91dDMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBDTElQX1NXNF8wXzI1NShyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgUENLRVZfQjJfU1cocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgb3V0MCwgb3V0MSk7CisgIHJlczAgPSAodjRpMzIpX19tc2FfcGNrZXZfYigodjE2aTgpb3V0MCwgKHYxNmk4KW91dDEpOworICBTVDR4NF9VQihyZXMwLCByZXMwLCAzLCAyLCAxLCAwLCBkc3QsIEJQUyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKworI2RlZmluZSBGTElQX1NJR04yKGluMCwgaW4xLCBvdXQwLCBvdXQxKSB7ICBcCisgIG91dDAgPSAodjE2aTgpX19tc2FfeG9yaV9iKGluMCwgMHg4MCk7ICAgIFwKKyAgb3V0MSA9ICh2MTZpOClfX21zYV94b3JpX2IoaW4xLCAweDgwKTsgICAgXAorfQorCisjZGVmaW5lIEZMSVBfU0lHTjQoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSB7ICBcCisgIEZMSVBfU0lHTjIoaW4wLCBpbjEsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTjIoaW4yLCBpbjMsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgRklMVF9WQUwocTBfbSwgcDBfbSwgbWFzaywgZmlsdCkgZG8geyAgXAorICB2MTZpOCBxMF9zdWJfcDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHEwX3N1Yl9wMCA9IF9fbXNhX3N1YnNfc19iKHEwX20sIHAwX20pOyAgICAgIFwKKyAgZmlsdCA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIHEwX3N1Yl9wMCk7ICAgICAgXAorICBmaWx0ID0gX19tc2FfYWRkc19zX2IoZmlsdCwgcTBfc3ViX3AwKTsgICAgICBcCisgIGZpbHQgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBxMF9zdWJfcDApOyAgICAgIFwKKyAgZmlsdCA9IGZpbHQgJiBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGSUxUMihxX20sIHBfbSwgcSwgcCkgZG8geyAgICAgICAgICAgIFwKKyAgdV9yID0gU1JBSV9IKHRlbXAxLCA3KTsgICAgICAgICAgICAgICAgICAgICBcCisgIHVfciA9IF9fbXNhX3NhdF9zX2godV9yLCA3KTsgICAgICAgICAgICAgICAgXAorICB1X2wgPSBTUkFJX0godGVtcDMsIDcpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdV9sID0gX19tc2Ffc2F0X3NfaCh1X2wsIDcpOyAgICAgICAgICAgICAgICBcCisgIHUgPSBfX21zYV9wY2tldl9iKCh2MTZpOCl1X2wsICh2MTZpOCl1X3IpOyAgXAorICBxX20gPSBfX21zYV9zdWJzX3NfYihxX20sIHUpOyAgICAgICAgICAgICAgIFwKKyAgcF9tID0gX19tc2FfYWRkc19zX2IocF9tLCB1KTsgICAgICAgICAgICAgICBcCisgIHEgPSBfX21zYV94b3JpX2IoKHYxNnU4KXFfbSwgMHg4MCk7ICAgICAgICAgXAorICBwID0gX19tc2FfeG9yaV9iKCh2MTZ1OClwX20sIDB4ODApOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldikgZG8geyAgXAorICB2MTZpOCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IGZpbHQsIHQxLCB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCBjbnN0M2IgPSBfX21zYV9sZGlfYigzKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdONChwMSwgcDAsIHEwLCBxMSwgcDFfbSwgcDBfbSwgcTBfbSwgcTFfbSk7ICAgXAorICBmaWx0ID0gX19tc2Ffc3Vic19zX2IocDFfbSwgcTFfbSk7ICAgICAgICAgICAgICAgICAgICBcCisgIGZpbHQgPSBmaWx0ICYgaGV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRklMVF9WQUwocTBfbSwgcDBfbSwgbWFzaywgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3Q0Yik7ICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gU1JBSV9CKHQxLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBjbnN0M2IpOyAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IFNSQUlfQih0MiwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHEwX20gPSBfX21zYV9zdWJzX3NfYihxMF9tLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcTAgPSBfX21zYV94b3JpX2IoKHYxNnU4KXEwX20sIDB4ODApOyAgICAgICAgICAgICAgICAgXAorICBwMF9tID0gX19tc2FfYWRkc19zX2IocDBfbSwgdDIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHAwID0gX19tc2FfeG9yaV9iKCh2MTZ1OClwMF9tLCAweDgwKTsgICAgICAgICAgICAgICAgIFwKKyAgZmlsdCA9IF9fbXNhX3NyYXJpX2IodDEsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoZXYgPSBfX21zYV94b3JpX2IoaGV2LCAweGZmKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZpbHQgPSBmaWx0ICYgaGV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcTFfbSA9IF9fbXNhX3N1YnNfc19iKHExX20sIGZpbHQpOyAgICAgICAgICAgICAgICAgICAgXAorICBxMSA9IF9fbXNhX3hvcmlfYigodjE2dTgpcTFfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICBcCisgIHAxX20gPSBfX21zYV9hZGRzX3NfYihwMV9tLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgcDEgPSBfX21zYV94b3JpX2IoKHYxNnU4KXAxX20sIDB4ODApOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMUEZfTUJGSUxURVIocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2KSBkbyB7ICBcCisgIHYxNmk4IHAyX20sIHAxX20sIHAwX20sIHEyX20sIHExX20sIHEwX207ICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggdSwgZmlsdCwgdDEsIHQyLCBmaWx0X3NpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiBmaWx0X3IsIGZpbHRfbCwgdV9yLCB1X2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCBjbnN0M2IgPSBfX21zYV9sZGlfYigzKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IGNuc3Q5aCA9IF9fbXNhX2xkaV9oKDkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgY25zdDYzaCA9IF9fbXNhX2xkaV9oKDYzKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTjQocDEsIHAwLCBxMCwgcTEsIHAxX20sIHAwX20sIHEwX20sIHExX20pOyAgICAgICAgIFwKKyAgZmlsdCA9IF9fbXNhX3N1YnNfc19iKHAxX20sIHExX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGSUxUX1ZBTChxMF9tLCBwMF9tLCBtYXNrLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTjIocDIsIHEyLCBwMl9tLCBxMl9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBmaWx0ICYgaGV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBmaWx0X3ZhbCAmPSB+aGV2ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhldiA9IF9fbXNhX3hvcmlfYihoZXYsIDB4ZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmlsdCA9IGZpbHQgJiBoZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX2FkZHNfc19iKHQyLCBjbnN0NGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gU1JBSV9CKHQxLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBfX21zYV9hZGRzX3NfYih0MiwgY25zdDNiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IFNSQUlfQih0MiwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHEwX20gPSBfX21zYV9zdWJzX3NfYihxMF9tLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcDBfbSA9IF9fbXNhX2FkZHNfc19iKHAwX20sIHQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmaWx0X3NpZ24gPSBfX21zYV9jbHRpX3NfYihmaWx0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1NIKGZpbHRfc2lnbiwgZmlsdCwgZmlsdF9yLCBmaWx0X2wpOyAgICAgICAgICAgICAgIFwKKyAgLyogdXBkYXRlIHEyL3AyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMCA9IGZpbHRfciAqIGNuc3Q5aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAxID0gdGVtcDAgKyBjbnN0NjNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDIgPSBmaWx0X2wgKiBjbnN0OWg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMyA9IHRlbXAyICsgY25zdDYzaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZJTFQyKHEyX20sIHAyX20sIHEyLCBwMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogdXBkYXRlIHExL3AxICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMSA9IHRlbXAxICsgdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAzID0gdGVtcDMgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRklMVDIocTFfbSwgcDFfbSwgcTEsIHAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgcTAvcDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAxID0gdGVtcDEgKyB0ZW1wMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDMgPSB0ZW1wMyArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGSUxUMihxMF9tLCBwMF9tLCBxMCwgcDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExQRl9NQVNLX0hFVihwM19pbiwgcDJfaW4sIHAxX2luLCBwMF9pbiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHEwX2luLCBxMV9pbiwgcTJfaW4sIHEzX2luLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgbGltaXRfaW4sIGJfbGltaXRfaW4sIHRocmVzaF9pbiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBoZXZfb3V0LCBtYXNrX291dCkgZG8geyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggcDNfYXN1Yl9wMl9tLCBwMl9hc3ViX3AxX20sIHAxX2FzdWJfcDBfbSwgcTFfYXN1Yl9xMF9tOyAgXAorICB2MTZ1OCBwMV9hc3ViX3ExX20sIHAwX2FzdWJfcTBfbSwgcTNfYXN1Yl9xMl9tLCBxMl9hc3ViX3ExX207ICBcCisgIHYxNnU4IGZsYXRfb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBhYnNvbHV0ZSBzdWJ0cmFjdGlvbiBvZiBwaXhlbCB2YWx1ZXMgKi8gICAgICAgICAgICAgICAgICAgICBcCisgIHAzX2FzdWJfcDJfbSA9IF9fbXNhX2FzdWJfdV9iKHAzX2luLCBwMl9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcDJfYXN1Yl9wMV9tID0gX19tc2FfYXN1Yl91X2IocDJfaW4sIHAxX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBwMV9hc3ViX3AwX20gPSBfX21zYV9hc3ViX3VfYihwMV9pbiwgcDBfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHExX2FzdWJfcTBfbSA9IF9fbXNhX2FzdWJfdV9iKHExX2luLCBxMF9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcTJfYXN1Yl9xMV9tID0gX19tc2FfYXN1Yl91X2IocTJfaW4sIHExX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBxM19hc3ViX3EyX20gPSBfX21zYV9hc3ViX3VfYihxM19pbiwgcTJfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHAwX2FzdWJfcTBfbSA9IF9fbXNhX2FzdWJfdV9iKHAwX2luLCBxMF9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcDFfYXN1Yl9xMV9tID0gX19tc2FfYXN1Yl91X2IocDFfaW4sIHExX2luKTsgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGlvbiBvZiBoZXYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZsYXRfb3V0ID0gX19tc2FfbWF4X3VfYihwMV9hc3ViX3AwX20sIHExX2FzdWJfcTBfbSk7ICAgICAgICAgIFwKKyAgaGV2X291dCA9ICh0aHJlc2hfaW4gPCBmbGF0X291dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGlvbiBvZiBtYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHAwX2FzdWJfcTBfbSA9IF9fbXNhX2FkZHNfdV9iKHAwX2FzdWJfcTBfbSwgcDBfYXN1Yl9xMF9tKTsgICAgIFwKKyAgcDFfYXN1Yl9xMV9tID0gU1JBSV9CKHAxX2FzdWJfcTFfbSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwMF9hc3ViX3EwX20gPSBfX21zYV9hZGRzX3VfYihwMF9hc3ViX3EwX20sIHAxX2FzdWJfcTFfbSk7ICAgICBcCisgIG1hc2tfb3V0ID0gKGJfbGltaXRfaW4gPCBwMF9hc3ViX3EwX20pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFza19vdXQgPSBfX21zYV9tYXhfdV9iKGZsYXRfb3V0LCBtYXNrX291dCk7ICAgICAgICAgICAgICAgICAgXAorICBwM19hc3ViX3AyX20gPSBfX21zYV9tYXhfdV9iKHAzX2FzdWJfcDJfbSwgcDJfYXN1Yl9wMV9tKTsgICAgICBcCisgIG1hc2tfb3V0ID0gX19tc2FfbWF4X3VfYihwM19hc3ViX3AyX20sIG1hc2tfb3V0KTsgICAgICAgICAgICAgIFwKKyAgcTJfYXN1Yl9xMV9tID0gX19tc2FfbWF4X3VfYihxMl9hc3ViX3ExX20sIHEzX2FzdWJfcTJfbSk7ICAgICAgXAorICBtYXNrX291dCA9IF9fbXNhX21heF91X2IocTJfYXN1Yl9xMV9tLCBtYXNrX291dCk7ICAgICAgICAgICAgICBcCisgIG1hc2tfb3V0ID0gKGxpbWl0X2luIDwgbWFza19vdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFza19vdXQgPSBfX21zYV94b3JpX2IobWFza19vdXQsIDB4ZmYpOyAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVDZ4MV9VQihpbjAsIGluMF9pZHgsIGluMSwgaW4xX2lkeCwgcGRzdCwgc3RyaWRlKSBkbyB7IFwKKyAgY29uc3QgdWludDE2X3QgdG1wMF9oID0gX19tc2FfY29weV9zX2goKHY4aTE2KWluMSwgaW4xX2lkeCk7ICBcCisgIGNvbnN0IHVpbnQzMl90IHRtcDBfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilpbjAsIGluMF9pZHgpOyAgXAorICBTVyh0bXAwX3csIHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0godG1wMF9oLCBwZHN0ICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUNng0X1VCKGluMCwgc3RhcnRfaW4wX2lkeCwgaW4xLCBzdGFydF9pbjFfaWR4LCBwZHN0LCBzdHJpZGUpIGRvIHsgXAorICB1aW50OF90KiBwdG1wMSA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1Q2eDFfVUIoaW4wLCBzdGFydF9pbjBfaWR4LCBpbjEsIHN0YXJ0X2luMV9pZHgsIHB0bXAxLCA0KTsgICAgICAgICAgICAgICBcCisgIHB0bXAxICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVDZ4MV9VQihpbjAsIHN0YXJ0X2luMF9pZHggKyAxLCBpbjEsIHN0YXJ0X2luMV9pZHggKyAxLCBwdG1wMSwgNCk7ICAgICAgIFwKKyAgcHRtcDEgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUNngxX1VCKGluMCwgc3RhcnRfaW4wX2lkeCArIDIsIGluMSwgc3RhcnRfaW4xX2lkeCArIDIsIHB0bXAxLCA0KTsgICAgICAgXAorICBwdG1wMSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1Q2eDFfVUIoaW4wLCBzdGFydF9pbjBfaWR4ICsgMywgaW4xLCBzdGFydF9pbjFfaWR4ICsgMywgcHRtcDEsIDQpOyAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExQRl9TSU1QTEVfRklMVChwMV9pbiwgcDBfaW4sIHEwX2luLCBxMV9pbiwgbWFzaykgZG8geyAgICAgICBcCisgICAgdjE2aTggcDFfbSwgcDBfbSwgcTBfbSwgcTFfbSwgZmlsdCwgZmlsdDEsIGZpbHQyOyAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdjE2aTggY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdjE2aTggY25zdDNiID0gIF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRkxJUF9TSUdONChwMV9pbiwgcDBfaW4sIHEwX2luLCBxMV9pbiwgcDFfbSwgcDBfbSwgcTBfbSwgcTFfbSk7ICBcCisgICAgZmlsdCA9IF9fbXNhX3N1YnNfc19iKHAxX20sIHExX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMVF9WQUwocTBfbSwgcDBfbSwgbWFzaywgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdDEgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBjbnN0NGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdDEgPSBTUkFJX0IoZmlsdDEsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdDIgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBjbnN0M2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdDIgPSBTUkFJX0IoZmlsdDIsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcTBfbSA9IF9fbXNhX3N1YnNfc19iKHEwX20sIGZpbHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDBfbSA9IF9fbXNhX2FkZHNfc19iKHAwX20sIGZpbHQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcTBfaW4gPSBfX21zYV94b3JpX2IoKHYxNnU4KXEwX20sIDB4ODApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDBfaW4gPSBfX21zYV94b3JpX2IoKHYxNnU4KXAwX20sIDB4ODApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExQRl9TSU1QTEVfTUFTSyhwMSwgcDAsIHEwLCBxMSwgYl9saW1pdCwgbWFzaykgZG8geyAgICBcCisgICAgdjE2dTggcDFfYV9zdWJfcTEsIHAwX2Ffc3ViX3EwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDBfYV9zdWJfcTAgPSBfX21zYV9hc3ViX3VfYihwMCwgcTApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDFfYV9zdWJfcTEgPSBfX21zYV9hc3ViX3VfYihwMSwgcTEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcDFfYV9zdWJfcTEgPSAodjE2dTgpX19tc2Ffc3JsaV9iKCh2MTZpOClwMV9hX3N1Yl9xMSwgMSk7ICBcCisgICAgcDBfYV9zdWJfcTAgPSBfX21zYV9hZGRzX3VfYihwMF9hX3N1Yl9xMCwgcDBfYV9zdWJfcTApOyAgICBcCisgICAgbWFzayA9IF9fbXNhX2FkZHNfdV9iKHAwX2Ffc3ViX3EwLCBwMV9hX3N1Yl9xMSk7ICAgICAgICAgICBcCisgICAgbWFzayA9IChtYXNrIDw9IGJfbGltaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBWRmlsdGVyMTYodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdWludDhfdCogcHRlbXAgPSBzcmMgLSA0ICogc3RyaWRlOworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTA7CisgIHYxNnU4IG1hc2ssIGhldjsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKworICBMRF9VQjgocHRlbXAsIHN0cmlkZSwgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9NQkZJTFRFUihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXYpOworICBwdGVtcCA9IHNyYyAtIDMgKiBzdHJpZGU7CisgIFNUX1VCNChwMiwgcDEsIHAwLCBxMCwgcHRlbXAsIHN0cmlkZSk7CisgIHB0ZW1wICs9ICg0ICogc3RyaWRlKTsKKyAgU1RfVUIyKHExLCBxMiwgcHRlbXAsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNih1aW50OF90KiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB1aW50OF90KiBwdG1wICA9IHNyYyAtIDQ7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMDsKKyAgdjE2dTggbWFzaywgaGV2OworICB2MTZ1OCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LCByb3c4OworICB2MTZ1OCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworCisgIExEX1VCOChwdG1wLCBzdHJpZGUsIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcpOworICBwdG1wICs9ICg4ICogc3RyaWRlKTsKKyAgTERfVUI4KHB0bXAsIHN0cmlkZSwgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSk7CisgIFRSQU5TUE9TRTE2eDhfVUJfVUIocm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NywKKyAgICAgICAgICAgICAgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1LAorICAgICAgICAgICAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfTUJGSUxURVIocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2KTsKKyAgSUxWUl9CMl9TSChwMSwgcDIsIHEwLCBwMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDQpOworICBJTFZMX0IyX1NIKHAxLCBwMiwgcTAsIHAwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wNiwgdG1wNyk7CisgIElMVlJMX0IyX1NIKHEyLCBxMSwgdG1wMiwgdG1wNSk7CisgIHB0bXAgPSBzcmMgLSAzOworICBTVDZ4MV9VQih0bXAzLCAwLCB0bXAyLCAwLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDMsIDEsIHRtcDIsIDEsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wMywgMiwgdG1wMiwgMiwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXAzLCAzLCB0bXAyLCAzLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDQsIDAsIHRtcDIsIDQsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNCwgMSwgdG1wMiwgNSwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA0LCAyLCB0bXAyLCA2LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDQsIDMsIHRtcDIsIDcsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNiwgMCwgdG1wNSwgMCwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA2LCAxLCB0bXA1LCAxLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDYsIDIsIHRtcDUsIDIsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNiwgMywgdG1wNSwgMywgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA3LCAwLCB0bXA1LCA0LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDcsIDEsIHRtcDUsIDUsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNywgMiwgdG1wNSwgNiwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA3LCAzLCB0bXA1LCA3LCBwdG1wLCA0KTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXJIb3JFZGdlMTZpKHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0LCBpbnQgbGltaXQsIGludCB0aHJlc2gpIHsKKyAgdjE2dTggbWFzaywgaGV2OworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTA7CisgIGNvbnN0IHYxNnU4IHRocmVzaDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaCk7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0KTsKKyAgY29uc3QgdjE2dTggbGltaXQwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdCk7CisKKyAgTERfVUI4KChzcmMgLSA0ICogc3RyaWRlKSwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdDAsIGJfbGltaXQwLCB0aHJlc2gwLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldik7CisgIFNUX1VCNChwMSwgcDAsIHEwLCBxMSwgKHNyYyAtIDIgKiBzdHJpZGUpLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpKHVpbnQ4X3QqIHNyY195LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdCwgaW50IGxpbWl0LCBpbnQgdGhyZXNoKSB7CisgIFZGaWx0ZXJIb3JFZGdlMTZpKHNyY195ICsgIDQgKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7CisgIFZGaWx0ZXJIb3JFZGdlMTZpKHNyY195ICsgIDggKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7CisgIFZGaWx0ZXJIb3JFZGdlMTZpKHNyY195ICsgMTIgKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXJWZXJ0RWRnZTE2aSh1aW50OF90KiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXQsIGludCBsaW1pdCwgaW50IHRocmVzaCkgeworICB2MTZ1OCBtYXNrLCBoZXY7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMDsKKyAgdjE2dTggcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NzsKKyAgdjE2dTggcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgY29uc3QgdjE2dTggdGhyZXNoMCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoKTsKKyAgY29uc3QgdjE2dTggYl9saW1pdDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXQpOworICBjb25zdCB2MTZ1OCBsaW1pdDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0KTsKKworICBMRF9VQjgoc3JjIC0gNCwgc3RyaWRlLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKKyAgTERfVUI4KHNyYyAtIDQgKyAoOCAqIHN0cmlkZSksIHN0cmlkZSwKKyAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUpOworICBUUkFOU1BPU0UxNng4X1VCX1VCKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsCisgICAgICAgICAgICAgICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSwKKyAgICAgICAgICAgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdDAsIGJfbGltaXQwLCB0aHJlc2gwLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldik7CisgIElMVlJfQjJfU0gocDAsIHAxLCBxMSwgcTAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXAyLCB0bXAzKTsKKyAgSUxWTF9CMl9TSChwMCwgcDEsIHExLCBxMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDQsIHRtcDUpOworICBzcmMgLT0gMjsKKyAgU1Q0eDhfVUIodG1wMiwgdG1wMywgc3JjLCBzdHJpZGUpOworICBzcmMgKz0gKDggKiBzdHJpZGUpOworICBTVDR4OF9VQih0bXA0LCB0bXA1LCBzcmMsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogc3JjX3ksIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0LCBpbnQgbGltaXQsIGludCB0aHJlc2gpIHsKKyAgSEZpbHRlclZlcnRFZGdlMTZpKHNyY195ICsgIDQsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7CisgIEhGaWx0ZXJWZXJ0RWRnZTE2aShzcmNfeSArICA4LCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworICBIRmlsdGVyVmVydEVkZ2UxNmkoc3JjX3kgKyAxMiwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50cywgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHNyY191LCB1aW50OF90KiBzcmNfdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdWludDhfdCogcHRtcF9zcmNfdSA9IHNyY191IC0gNCAqIHN0cmlkZTsKKyAgdWludDhfdCogcHRtcF9zcmNfdiA9IHNyY192IC0gNCAqIHN0cmlkZTsKKyAgdWludDY0X3QgcDJfZCwgcDFfZCwgcDBfZCwgcTBfZCwgcTFfZCwgcTJfZDsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwLCBtYXNrLCBoZXY7CisgIHYxNnU4IHAzX3UsIHAyX3UsIHAxX3UsIHAwX3UsIHEzX3UsIHEyX3UsIHExX3UsIHEwX3U7CisgIHYxNnU4IHAzX3YsIHAyX3YsIHAxX3YsIHAwX3YsIHEzX3YsIHEyX3YsIHExX3YsIHEwX3Y7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisKKyAgTERfVUI4KHB0bXBfc3JjX3UsIHN0cmlkZSwgcDNfdSwgcDJfdSwgcDFfdSwgcDBfdSwgcTBfdSwgcTFfdSwgcTJfdSwgcTNfdSk7CisgIExEX1VCOChwdG1wX3NyY192LCBzdHJpZGUsIHAzX3YsIHAyX3YsIHAxX3YsIHAwX3YsIHEwX3YsIHExX3YsIHEyX3YsIHEzX3YpOworICBJTFZSX0Q0X1VCKHAzX3YsIHAzX3UsIHAyX3YsIHAyX3UsIHAxX3YsIHAxX3UsIHAwX3YsIHAwX3UsIHAzLCBwMiwgcDEsIHAwKTsKKyAgSUxWUl9ENF9VQihxMF92LCBxMF91LCBxMV92LCBxMV91LCBxMl92LCBxMl91LCBxM192LCBxM191LCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfTUJGSUxURVIocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2KTsKKyAgcDJfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMiwgMCk7CisgIHAxX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDEsIDApOworICBwMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAwLCAwKTsKKyAgcTBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMCwgMCk7CisgIHExX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTEsIDApOworICBxMl9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEyLCAwKTsKKyAgcHRtcF9zcmNfdSArPSBzdHJpZGU7CisgIFNENChwMl9kLCBwMV9kLCBwMF9kLCBxMF9kLCBwdG1wX3NyY191LCBzdHJpZGUpOworICBwdG1wX3NyY191ICs9ICg0ICogc3RyaWRlKTsKKyAgU0QocTFfZCwgcHRtcF9zcmNfdSk7CisgIHB0bXBfc3JjX3UgKz0gc3RyaWRlOworICBTRChxMl9kLCBwdG1wX3NyY191KTsKKyAgcDJfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMiwgMSk7CisgIHAxX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDEsIDEpOworICBwMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAwLCAxKTsKKyAgcTBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMCwgMSk7CisgIHExX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTEsIDEpOworICBxMl9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEyLCAxKTsKKyAgcHRtcF9zcmNfdiArPSBzdHJpZGU7CisgIFNENChwMl9kLCBwMV9kLCBwMF9kLCBxMF9kLCBwdG1wX3NyY192LCBzdHJpZGUpOworICBwdG1wX3NyY192ICs9ICg0ICogc3RyaWRlKTsKKyAgU0QocTFfZCwgcHRtcF9zcmNfdik7CisgIHB0bXBfc3JjX3YgKz0gc3RyaWRlOworICBTRChxMl9kLCBwdG1wX3NyY192KTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogc3JjX3UsIHVpbnQ4X3QqIHNyY192LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB1aW50OF90KiBwdG1wX3NyY191ID0gc3JjX3UgLSA0OworICB1aW50OF90KiBwdG1wX3NyY192ID0gc3JjX3YgLSA0OworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTAsIG1hc2ssIGhldjsKKyAgdjE2dTggcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nywgcm93ODsKKyAgdjE2dTggcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKworICBMRF9VQjgocHRtcF9zcmNfdSwgc3RyaWRlLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKKyAgTERfVUI4KHB0bXBfc3JjX3YsIHN0cmlkZSwKKyAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUpOworICBUUkFOU1BPU0UxNng4X1VCX1VCKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsCisgICAgICAgICAgICAgICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSwKKyAgICAgICAgICAgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX01CRklMVEVSKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldik7CisgIElMVlJfQjJfU0gocDEsIHAyLCBxMCwgcDAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXA0KTsKKyAgSUxWTF9CMl9TSChwMSwgcDIsIHEwLCBwMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDYsIHRtcDcpOworICBJTFZSTF9CMl9TSChxMiwgcTEsIHRtcDIsIHRtcDUpOworICBwdG1wX3NyY191ICs9IDE7CisgIFNUNng0X1VCKHRtcDMsIDAsIHRtcDIsIDAsIHB0bXBfc3JjX3UsIHN0cmlkZSk7CisgIHB0bXBfc3JjX3UgKz0gNCAqIHN0cmlkZTsKKyAgU1Q2eDRfVUIodG1wNCwgMCwgdG1wMiwgNCwgcHRtcF9zcmNfdSwgc3RyaWRlKTsKKyAgcHRtcF9zcmNfdiArPSAxOworICBTVDZ4NF9VQih0bXA2LCAwLCB0bXA1LCAwLCBwdG1wX3NyY192LCBzdHJpZGUpOworICBwdG1wX3NyY192ICs9IDQgKiBzdHJpZGU7CisgIFNUNng0X1VCKHRtcDcsIDAsIHRtcDUsIDQsIHB0bXBfc3JjX3YsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiBzcmNfdSwgdWludDhfdCogc3JjX3YsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB1aW50NjRfdCBwMV9kLCBwMF9kLCBxMF9kLCBxMV9kOworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTAsIG1hc2ssIGhldjsKKyAgdjE2dTggcDNfdSwgcDJfdSwgcDFfdSwgcDBfdSwgcTNfdSwgcTJfdSwgcTFfdSwgcTBfdTsKKyAgdjE2dTggcDNfdiwgcDJfdiwgcDFfdiwgcDBfdiwgcTNfdiwgcTJfdiwgcTFfdiwgcTBfdjsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKworICBMRF9VQjgoc3JjX3UsIHN0cmlkZSwgcDNfdSwgcDJfdSwgcDFfdSwgcDBfdSwgcTBfdSwgcTFfdSwgcTJfdSwgcTNfdSk7CisgIHNyY191ICs9ICg1ICogc3RyaWRlKTsKKyAgTERfVUI4KHNyY192LCBzdHJpZGUsIHAzX3YsIHAyX3YsIHAxX3YsIHAwX3YsIHEwX3YsIHExX3YsIHEyX3YsIHEzX3YpOworICBzcmNfdiArPSAoNSAqIHN0cmlkZSk7CisgIElMVlJfRDRfVUIocDNfdiwgcDNfdSwgcDJfdiwgcDJfdSwgcDFfdiwgcDFfdSwgcDBfdiwgcDBfdSwgcDMsIHAyLCBwMSwgcDApOworICBJTFZSX0Q0X1VCKHEwX3YsIHEwX3UsIHExX3YsIHExX3UsIHEyX3YsIHEyX3UsIHEzX3YsIHEzX3UsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYpOworICBwMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAxLCAwKTsKKyAgcDBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMCwgMCk7CisgIHEwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTAsIDApOworICBxMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXExLCAwKTsKKyAgU0Q0KHExX2QsIHEwX2QsIHAwX2QsIHAxX2QsIHNyY191LCAtc3RyaWRlKTsKKyAgcDFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMSwgMSk7CisgIHAwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDAsIDEpOworICBxMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEwLCAxKTsKKyAgcTFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMSwgMSk7CisgIFNENChxMV9kLCBxMF9kLCBwMF9kLCBwMV9kLCBzcmNfdiwgLXN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiBzcmNfdSwgdWludDhfdCogc3JjX3YsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTAsIG1hc2ssIGhldjsKKyAgdjE2dTggcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nywgcm93ODsKKyAgdjE2dTggcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNTsKKyAgdjRpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKworICBMRF9VQjgoc3JjX3UsIHN0cmlkZSwgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nyk7CisgIExEX1VCOChzcmNfdiwgc3RyaWRlLAorICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSk7CisgIFRSQU5TUE9TRTE2eDhfVUJfVUIocm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NywKKyAgICAgICAgICAgICAgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1LAorICAgICAgICAgICAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfRklMVEVSNF80VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2KTsKKyAgSUxWUl9CMl9TVyhwMCwgcDEsIHExLCBxMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NXKHRtcDEsIHRtcDAsIHRtcDIsIHRtcDMpOworICBJTFZMX0IyX1NXKHAwLCBwMSwgcTEsIHEwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU1codG1wMSwgdG1wMCwgdG1wNCwgdG1wNSk7CisgIHNyY191ICs9IDI7CisgIFNUNHg0X1VCKHRtcDIsIHRtcDIsIDAsIDEsIDIsIDMsIHNyY191LCBzdHJpZGUpOworICBzcmNfdSArPSA0ICogc3RyaWRlOworICBTVDR4NF9VQih0bXAzLCB0bXAzLCAwLCAxLCAyLCAzLCBzcmNfdSwgc3RyaWRlKTsKKyAgc3JjX3YgKz0gMjsKKyAgU1Q0eDRfVUIodG1wNCwgdG1wNCwgMCwgMSwgMiwgMywgc3JjX3YsIHN0cmlkZSk7CisgIHNyY192ICs9IDQgKiBzdHJpZGU7CisgIFNUNHg0X1VCKHRtcDUsIHRtcDUsIDAsIDEsIDIsIDMsIHNyY192LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTYodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLCBpbnQgYl9saW1pdF9pbikgeworICB2MTZ1OCBwMSwgcDAsIHExLCBxMCwgbWFzazsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisKKyAgTERfVUI0KHNyYyAtIDIgKiBzdHJpZGUsIHN0cmlkZSwgcDEsIHAwLCBxMCwgcTEpOworICBMUEZfU0lNUExFX01BU0socDEsIHAwLCBxMCwgcTEsIGJfbGltaXQsIG1hc2spOworICBMUEZfU0lNUExFX0ZJTFQocDEsIHAwLCBxMCwgcTEsIG1hc2spOworICBTVF9VQjIocDAsIHEwLCBzcmMgLSBzdHJpZGUsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBzcmMsIGludCBzdHJpZGUsIGludCBiX2xpbWl0X2luKSB7CisgIHYxNnU4IHAxLCBwMCwgcTEsIHEwLCBtYXNrLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3OworICB2MTZ1OCByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OworICB2OGkxNiB0bXAwLCB0bXAxOworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKyAgdWludDhfdCogcHRlbXBfc3JjID0gc3JjIC0gMjsKKworICBMRF9VQjgocHRlbXBfc3JjLCBzdHJpZGUsIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcpOworICBMRF9VQjgocHRlbXBfc3JjICsgOCAqIHN0cmlkZSwgc3RyaWRlLAorICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSk7CisgIFRSQU5TUE9TRTE2eDRfVUJfVUIocm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NywKKyAgICAgICAgICAgICAgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1LAorICAgICAgICAgICAgICAgICAgICAgIHAxLCBwMCwgcTAsIHExKTsKKyAgTFBGX1NJTVBMRV9NQVNLKHAxLCBwMCwgcTAsIHExLCBiX2xpbWl0LCBtYXNrKTsKKyAgTFBGX1NJTVBMRV9GSUxUKHAxLCBwMCwgcTAsIHExLCBtYXNrKTsKKyAgSUxWUkxfQjJfU0gocTAsIHAwLCB0bXAxLCB0bXAwKTsKKyAgcHRlbXBfc3JjICs9IDE7CisgIFNUMng0X1VCKHRtcDEsIDAsIHB0ZW1wX3NyYywgc3RyaWRlKTsKKyAgcHRlbXBfc3JjICs9IDQgKiBzdHJpZGU7CisgIFNUMng0X1VCKHRtcDEsIDQsIHB0ZW1wX3NyYywgc3RyaWRlKTsKKyAgcHRlbXBfc3JjICs9IDQgKiBzdHJpZGU7CisgIFNUMng0X1VCKHRtcDAsIDAsIHB0ZW1wX3NyYywgc3RyaWRlKTsKKyAgcHRlbXBfc3JjICs9IDQgKiBzdHJpZGU7CisgIFNUMng0X1VCKHRtcDAsIDQsIHB0ZW1wX3NyYywgc3RyaWRlKTsKKyAgcHRlbXBfc3JjICs9IDQgKiBzdHJpZGU7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogc3JjX3ksIGludCBzdHJpZGUsIGludCBiX2xpbWl0X2luKSB7CisgIFNpbXBsZVZGaWx0ZXIxNihzcmNfeSArICA0ICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXRfaW4pOworICBTaW1wbGVWRmlsdGVyMTYoc3JjX3kgKyAgOCAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0X2luKTsKKyAgU2ltcGxlVkZpbHRlcjE2KHNyY195ICsgMTIgKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdF9pbik7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogc3JjX3ksIGludCBzdHJpZGUsIGludCBiX2xpbWl0X2luKSB7CisgIFNpbXBsZUhGaWx0ZXIxNihzcmNfeSArICA0LCBzdHJpZGUsIGJfbGltaXRfaW4pOworICBTaW1wbGVIRmlsdGVyMTYoc3JjX3kgKyAgOCwgc3RyaWRlLCBiX2xpbWl0X2luKTsKKyAgU2ltcGxlSEZpbHRlcjE2KHNyY195ICsgMTIsIHN0cmlkZSwgYl9saW1pdF9pbik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gNHg0CisKK3N0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QpIHsgICAvLyBEQworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKKyAgZGMgPj49IDM7CisgIGRjID0gZGMgfCAoZGMgPDwgOCkgfCAoZGMgPDwgMTYpIHwgKGRjIDw8IDI0KTsKKyAgU1c0KGRjLCBkYywgZGMsIGRjLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcHRlbXAgPSBkc3QgLSBCUFMgLSAxOworICB2OGkxNiBULCBkLCByMCwgcjEsIHIyLCByMzsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2gocHRlbXBbMCAqIEJQU10pOworICBjb25zdCB2OGkxNiBMMCA9ICh2OGkxNilfX21zYV9maWxsX2gocHRlbXBbMSAqIEJQU10pOworICBjb25zdCB2OGkxNiBMMSA9ICh2OGkxNilfX21zYV9maWxsX2gocHRlbXBbMiAqIEJQU10pOworICBjb25zdCB2OGkxNiBMMiA9ICh2OGkxNilfX21zYV9maWxsX2gocHRlbXBbMyAqIEJQU10pOworICBjb25zdCB2OGkxNiBMMyA9ICh2OGkxNilfX21zYV9maWxsX2gocHRlbXBbNCAqIEJQU10pOworICBjb25zdCB2MTZ1OCBUMSA9IExEX1VCKHB0ZW1wICsgMSk7CisKKyAgVCAgPSAodjhpMTYpX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOClUMSk7CisgIGQgPSBUIC0gVEw7CisgIEFERDQoZCwgTDAsIGQsIEwxLCBkLCBMMiwgZCwgTDMsIHIwLCByMSwgcjIsIHIzKTsKKyAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICBQQ0tFVl9TVDR4NF9VQihyMCwgcjEsIHIyLCByMywgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHB0b3AgPSBkc3QgLSBCUFMgLSAxOworICBjb25zdCB1aW50MzJfdCB2YWwwID0gTFcocHRvcCArIDApOworICBjb25zdCB1aW50MzJfdCB2YWwxID0gTFcocHRvcCArIDQpOworICB1aW50MzJfdCBvdXQ7CisgIHYxNnU4IEEgPSB7IDAgfSwgQiwgQywgQUMsIEIyLCBSOworCisgIElOU0VSVF9XMl9VQih2YWwwLCB2YWwxLCBBKTsKKyAgQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIEMgPSBTTERJX1VCKEEsIEEsIDIpOworICBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgUiA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIG91dCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgU1c0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCB1aW50OF90KiBjb25zdCBwdG9wID0gZHN0IC0gMSAtIEJQUzsKKyAgdWludDMyX3QgdmFsMCA9IExXKHB0b3AgKyAwKTsKKyAgdWludDMyX3QgdmFsMSA9IExXKHB0b3AgKyA0KTsKKyAgdWludDMyX3QgdmFsMiwgdmFsMzsKKyAgdjE2dTggQSwgQiwgQywgQUMsIEIyLCBSLCBBMSA9IHsgMCB9OworCisgIElOU0VSVF9XMl9VQih2YWwwLCB2YWwxLCBBMSk7CisgIEEgPSBTTERJX1VCKEExLCBBMSwgMTIpOworICBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClBLCAzLCBwdG9wWzEgKiBCUFNdKTsKKyAgQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQSwgMiwgcHRvcFsyICogQlBTXSk7CisgIEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUEsIDEsIHB0b3BbMyAqIEJQU10pOworICBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClBLCAwLCBwdG9wWzQgKiBCUFNdKTsKKyAgQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIEMgPSBTTERJX1VCKEEsIEEsIDIpOworICBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgUiA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIHZhbDMgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwyID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDAgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFNXNCh2YWwwLCB2YWwxLCB2YWwyLCB2YWwzLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIExENCh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLUxlZnQKKyAgY29uc3QgdWludDhfdCogY29uc3QgcHRvcCA9IGRzdCAtIEJQUzsKKyAgdWludDMyX3QgdmFsMCA9IExXKHB0b3AgKyAwKTsKKyAgdWludDMyX3QgdmFsMSA9IExXKHB0b3AgKyA0KTsKKyAgdWludDMyX3QgdmFsMiwgdmFsMzsKKyAgdjE2dTggQSA9IHsgMCB9LCBCLCBDLCBBQywgQjIsIFI7CisKKyAgSU5TRVJUX1cyX1VCKHZhbDAsIHZhbDEsIEEpOworICBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgQyA9IFNMRElfVUIoQSwgQSwgMik7CisgIEMgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUMsIDYsIHB0b3BbN10pOworICBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgUiA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIHZhbDAgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwxID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMiA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDMgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFNXNCh2YWwwLCB2YWwxLCB2YWwyLCB2YWwzLCBkc3QsIEJQUyk7Cit9CisKKy8vIDE2eDE2CisKK3N0YXRpYyB2b2lkIERDMTYodWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgdWludDMyX3QgZGMgPSAxNjsKKyAgaW50IGk7CisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBjb25zdCB2OHUxNiBkY3RvcCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICB2MTZ1OCBvdXQ7CisKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBkYyArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBkYyArPSBIQUREX1VIX1UzMihkY3RvcCk7CisgIG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZGMgPj4gNSk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDggKiBCUFMsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFRNMTYodWludDhfdCogZHN0KSB7CisgIGludCBqOworICB2OGkxNiBkMSwgZDI7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSAtIEJQU10pOworICBjb25zdCB2MTZpOCBUID0gTERfU0IoZHN0IC0gQlBTKTsKKworICBJTFZSTF9CMl9TSCh6ZXJvLCBULCBkMSwgZDIpOworICBTVUIyKGQxLCBUTCwgZDIsIFRMLCBkMSwgZDIpOworICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gNCkgeworICAgIHYxNmk4IHQwLCB0MSwgdDIsIHQzOworICAgIHY4aTE2IHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNzsKKyAgICBjb25zdCB2OGkxNiBMMCA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMCAqIEJQU10pOworICAgIGNvbnN0IHY4aTE2IEwxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAxICogQlBTXSk7CisgICAgY29uc3QgdjhpMTYgTDIgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDIgKiBCUFNdKTsKKyAgICBjb25zdCB2OGkxNiBMMyA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMyAqIEJQU10pOworICAgIEFERDQoZDEsIEwwLCBkMSwgTDEsIGQxLCBMMiwgZDEsIEwzLCByMCwgcjEsIHIyLCByMyk7CisgICAgQURENChkMiwgTDAsIGQyLCBMMSwgZDIsIEwyLCBkMiwgTDMsIHI0LCByNSwgcjYsIHI3KTsKKyAgICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgICAgQ0xJUF9TSDRfMF8yNTUocjQsIHI1LCByNiwgcjcpOworICAgIFBDS0VWX0I0X1NCKHI0LCByMCwgcjUsIHIxLCByNiwgcjIsIHI3LCByMywgdDAsIHQxLCB0MiwgdDMpOworICAgIFNUX1NCNCh0MCwgdDEsIHQyLCB0MywgZHN0LCBCUFMpOworICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFZFMTYodWludDhfdCogZHN0KSB7ICAgLy8gdmVydGljYWwKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIFNUX1VCOChydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBkc3QsIEJQUyk7CisgIFNUX1VCOChydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBydG9wLCBkc3QgKyA4ICogQlBTLCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBIRTE2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDE2OyBqID4gMDsgaiAtPSA0KSB7CisgICAgY29uc3QgdjE2dTggTDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDAgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMSA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMSAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwyID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAyICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDMgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDMgKiBCUFNdKTsKKyAgICBTVF9VQjQoTDAsIEwxLCBMMiwgTDMsIGRzdCwgQlBTKTsKKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3AodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCB0b3Agc2FtcGxlcyBub3QgYXZhaWxhYmxlCisgIGludCBqOworICB1aW50MzJfdCBkYyA9IDg7CisgIHYxNnU4IG91dDsKKworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGRjICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZGMgPj4gNCk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDggKiBCUFMsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb0xlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICB1aW50MzJfdCBkYyA9IDg7CisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBjb25zdCB2OHUxNiBkY3RvcCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICB2MTZ1OCBvdXQ7CisKKyAgZGMgKz0gSEFERF9VSF9VMzIoZGN0b3ApOworICBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRjID4+IDQpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA4ICogQlBTLCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BMZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm90aGluZworICBjb25zdCB2MTZ1OCBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKDB4ODApOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA4ICogQlBTLCBCUFMpOworfQorCisvLyBDaHJvbWEKKworI2RlZmluZSBTVE9SRTh4OChvdXQsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgXAorICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyAwICogQlBTLCBCUFMpOyAgXAorICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA0ICogQlBTLCBCUFMpOyAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgREM4dXYodWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgdWludDMyX3QgZGMgPSA4OworICBpbnQgaTsKKyAgdWludDY0X3Qgb3V0OworICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgY29uc3Qgdjh1MTYgdGVtcDAgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgY29uc3QgdjR1MzIgdGVtcDEgPSBfX21zYV9oYWRkX3Vfdyh0ZW1wMCwgdGVtcDApOworICBjb25zdCB2MnU2NCB0ZW1wMiA9IF9fbXNhX2hhZGRfdV9kKHRlbXAxLCB0ZW1wMSk7CisgIHYxNnU4IGRjdGVtcDsKKworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgZGMgKz0gX19tc2FfY29weV9zX3coKHY0aTMyKXRlbXAyLCAwKTsKKyAgZGN0ZW1wID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkYyA+PiA0KTsKKyAgb3V0ID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRjdGVtcCwgMCk7CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgVE04dXYodWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCB2MTZpOCBUMSA9IExEX1NCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgVCAgPSAodjhpMTYpX19tc2FfaWx2cl9iKHplcm8sIFQxKTsKKyAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSAtIEJQU10pOworICBjb25zdCB2OGkxNiBkID0gVCAtIFRMOworCisgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICB2MTZpOCB0MCwgdDE7CisgICAgdjhpMTYgcjAgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDAgKiBCUFNdKTsKKyAgICB2OGkxNiByMSA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMSAqIEJQU10pOworICAgIHY4aTE2IHIyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAyICogQlBTXSk7CisgICAgdjhpMTYgcjMgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDMgKiBCUFNdKTsKKyAgICBBREQ0KGQsIHIwLCBkLCByMSwgZCwgcjIsIGQsIHIzLCByMCwgcjEsIHIyLCByMyk7CisgICAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICAgIFBDS0VWX0IyX1NCKHIxLCByMCwgcjMsIHIyLCB0MCwgdDEpOworICAgIFNUNHg0X1VCKHQwLCB0MSwgMCwgMiwgMCwgMiwgZHN0LCBCUFMpOworICAgIFNUNHg0X1VCKHQwLCB0MSwgMSwgMywgMSwgMywgZHN0ICsgNCwgQlBTKTsKKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBWRTh1dih1aW50OF90KiBkc3QpIHsgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgY29uc3QgdWludDY0X3Qgb3V0ID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXJ0b3AsIDApOworICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIEhFOHV2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICBjb25zdCB2MTZ1OCBMMCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMCAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwxID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAxICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDIgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDIgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMyA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMyAqIEJQU10pOworICAgIGNvbnN0IHVpbnQ2NF90IG91dDAgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDAsIDApOworICAgIGNvbnN0IHVpbnQ2NF90IG91dDEgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDEsIDApOworICAgIGNvbnN0IHVpbnQ2NF90IG91dDIgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDIsIDApOworICAgIGNvbnN0IHVpbnQ2NF90IG91dDMgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDMsIDApOworICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIEJQUyk7CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZOb0xlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKKyAgY29uc3QgdWludDMyX3QgZGMgPSA0OworICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgY29uc3Qgdjh1MTYgdGVtcDAgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgY29uc3QgdjR1MzIgdGVtcDEgPSBfX21zYV9oYWRkX3Vfdyh0ZW1wMCwgdGVtcDApOworICBjb25zdCB2MnU2NCB0ZW1wMiA9IF9fbXNhX2hhZGRfdV9kKHRlbXAxLCB0ZW1wMSk7CisgIGNvbnN0IHVpbnQzMl90IHN1bV9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKXRlbXAyLCAwKTsKKyAgY29uc3QgdjE2dTggZGN2YWwgPSAodjE2dTgpX19tc2FfZmlsbF9iKChkYyArIHN1bV9tKSA+PiAzKTsKKyAgY29uc3QgdWludDY0X3Qgb3V0ID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRjdmFsLCAwKTsKKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgdWludDY0X3Qgb3V0OworICB2MTZ1OCBkY3RlbXA7CisKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjICs9IGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIGRjdGVtcCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZGMgPj4gMyk7CisgIG91dCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkY3RlbXAsIDApOworICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm90aGluZworICBjb25zdCB1aW50NjRfdCBvdXQgPSAweDgwODA4MDgwODA4MDgwODBVTEw7CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0TVNBKHZvaWQpIHsKKyAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUOworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud287CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtREM7CisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDMzsKKworICBWUDhWRmlsdGVyMTYgID0gVkZpbHRlcjE2OworICBWUDhIRmlsdGVyMTYgID0gSEZpbHRlcjE2OworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7CisgIFZQOFZGaWx0ZXI4ICA9IFZGaWx0ZXI4OworICBWUDhIRmlsdGVyOCAgPSBIRmlsdGVyODsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGk7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNiAgPSBTaW1wbGVWRmlsdGVyMTY7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiAgPSBTaW1wbGVIRmlsdGVyMTY7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aTsKKworICBWUDhQcmVkTHVtYTRbMF0gPSBEQzQ7CisgIFZQOFByZWRMdW1hNFsxXSA9IFRNNDsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0OworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDQ7CisgIFZQOFByZWRMdW1hNFs2XSA9IExENDsKKyAgVlA4UHJlZEx1bWExNlswXSA9IERDMTY7CisgIFZQOFByZWRMdW1hMTZbMV0gPSBUTTE2OworICBWUDhQcmVkTHVtYTE2WzJdID0gVkUxNjsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTY7CisgIFZQOFByZWRMdW1hMTZbNF0gPSBEQzE2Tm9Ub3A7CisgIFZQOFByZWRMdW1hMTZbNV0gPSBEQzE2Tm9MZWZ0OworICBWUDhQcmVkTHVtYTE2WzZdID0gREMxNk5vVG9wTGVmdDsKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1djsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUTTh1djsKKyAgVlA4UHJlZENocm9tYThbMl0gPSBWRTh1djsKKyAgVlA4UHJlZENocm9tYThbM10gPSBIRTh1djsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0OworICBWUDhQcmVkQ2hyb21hOFs2XSA9IERDOHV2Tm9Ub3BMZWZ0OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdE1TQSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE2OTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbmVvbi5jCkBAIC0wLDAgKzEsMTY1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFSTSBORU9OIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucyBhbmQgbG9vcCBmaWx0ZXJpbmcuCisvLworLy8gQXV0aG9yczogU29tbmF0aCBCYW5lcmplZSAoc29tbmF0aEBnb29nbGUuY29tKQorLy8gICAgICAgICAgSm9oYW5uIEtvZW5pZyAoam9oYW5ua29lbmlnQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTnhNIExvYWRpbmcgZnVuY3Rpb25zCisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKy8vIFRoaXMgaW50cmluc2ljcyB2ZXJzaW9uIG1ha2VzIGdjYy00LjYuMyBjcmFzaCBkdXJpbmcgTG9hZDR4Pz8oKSBjb21waWxhdGlvbgorLy8gKHJlZ2lzdGVyIGFsbG9jLCBwcm9iYWJseSkuIFRoZSB2YXJpYW50cyBzb21ld2hhdCBtaXRpZ2F0ZSB0aGUgcHJvYmxlbSwgYnV0CisvLyBub3QgcXVpdGUuIEhGaWx0ZXIxNmkoKSByZW1haW5zIHByb2JsZW1hdGljLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDh4NF90IExvYWQ0eDhfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgY29uc3QgdWludDh4OF90IHplcm8gPSB2ZHVwX25fdTgoMCk7CisgIHVpbnQ4eDh4NF90IG91dDsKKyAgSU5JVF9WRUNUT1I0KG91dCwgemVybywgemVybywgemVybywgemVybyk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyAwICogc3RyaWRlLCBvdXQsIDApOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgMSAqIHN0cmlkZSwgb3V0LCAxKTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDIgKiBzdHJpZGUsIG91dCwgMik7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyAzICogc3RyaWRlLCBvdXQsIDMpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgNCAqIHN0cmlkZSwgb3V0LCA0KTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDUgKiBzdHJpZGUsIG91dCwgNSk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyA2ICogc3RyaWRlLCBvdXQsIDYpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgNyAqIHN0cmlkZSwgb3V0LCA3KTsKKyAgcmV0dXJuIG91dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDR4MTZfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHExKSB7CisgIC8vIHJvdzAgPSBwMVswLi43XXxwMFswLi43XXxxMFswLi43XXxxMVswLi43XQorICAvLyByb3c4ID0gcDFbOC4uMTVdfHAwWzguLjE1XXxxMFs4Li4xNV18cTFbOC4uMTVdCisgIGNvbnN0IHVpbnQ4eDh4NF90IHJvdzAgPSBMb2FkNHg4X05FT04oc3JjIC0gMiArIDAgKiBzdHJpZGUsIHN0cmlkZSk7CisgIGNvbnN0IHVpbnQ4eDh4NF90IHJvdzggPSBMb2FkNHg4X05FT04oc3JjIC0gMiArIDggKiBzdHJpZGUsIHN0cmlkZSk7CisgICpwMSA9IHZjb21iaW5lX3U4KHJvdzAudmFsWzBdLCByb3c4LnZhbFswXSk7CisgICpwMCA9IHZjb21iaW5lX3U4KHJvdzAudmFsWzFdLCByb3c4LnZhbFsxXSk7CisgICpxMCA9IHZjb21iaW5lX3U4KHJvdzAudmFsWzJdLCByb3c4LnZhbFsyXSk7CisgICpxMSA9IHZjb21iaW5lX3U4KHJvdzAudmFsWzNdLCByb3c4LnZhbFszXSk7Cit9CisKKyNlbHNlICAvLyBXT1JLX0FST1VORF9HQ0MKKworI2RlZmluZSBMT0FEUV9MQU5FXzMyYihWQUxVRSwgTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVkFMVUUpID0gdmxkMXFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90KilzcmMsIChWQUxVRSksIChMQU5FKSk7ICAgXAorICBzcmMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDR4MTZfTkVPTihjb25zdCB1aW50OF90KiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHExKSB7CisgIGNvbnN0IHVpbnQzMng0X3QgemVybyA9IHZkdXBxX25fdTMyKDApOworICB1aW50MzJ4NHg0X3QgaW47CisgIElOSVRfVkVDVE9SNChpbiwgemVybywgemVybywgemVybywgemVybyk7CisgIHNyYyAtPSAyOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMF0sIDApOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMV0sIDApOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMl0sIDApOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbM10sIDApOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMF0sIDEpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMV0sIDEpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMl0sIDEpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbM10sIDEpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMF0sIDIpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMV0sIDIpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMl0sIDIpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbM10sIDIpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMF0sIDMpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMV0sIDMpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbMl0sIDMpOworICBMT0FEUV9MQU5FXzMyYihpbi52YWxbM10sIDMpOworICAvLyBUcmFuc3Bvc2UgZm91ciA0eDQgcGFydHM6CisgIHsKKyAgICBjb25zdCB1aW50OHgxNngyX3Qgcm93MDEgPSB2dHJucV91OCh2cmVpbnRlcnByZXRxX3U4X3UzMihpbi52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdThfdTMyKGluLnZhbFsxXSkpOworICAgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3cyMyA9IHZ0cm5xX3U4KHZyZWludGVycHJldHFfdThfdTMyKGluLnZhbFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91OF91MzIoaW4udmFsWzNdKSk7CisgICAgY29uc3QgdWludDE2eDh4Ml90IHJvdzAyID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzAxLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzIzLnZhbFswXSkpOworICAgIGNvbnN0IHVpbnQxNng4eDJfdCByb3cxMyA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3cwMS52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3cyMy52YWxbMV0pKTsKKyAgICAqcDEgPSB2cmVpbnRlcnByZXRxX3U4X3UxNihyb3cwMi52YWxbMF0pOworICAgICpwMCA9IHZyZWludGVycHJldHFfdThfdTE2KHJvdzEzLnZhbFswXSk7CisgICAgKnEwID0gdnJlaW50ZXJwcmV0cV91OF91MTYocm93MDIudmFsWzFdKTsKKyAgICAqcTEgPSB2cmVpbnRlcnByZXRxX3U4X3UxNihyb3cxMy52YWxbMV0pOworICB9Cit9CisjdW5kZWYgTE9BRFFfTEFORV8zMmIKKworI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ4eDE2X05FT04oCisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBpbnQgc3RyaWRlLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAzLCB1aW50OHgxNl90KiBjb25zdCBwMiwgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgdWludDh4MTZfdCogY29uc3QgcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLCB1aW50OHgxNl90KiBjb25zdCBxMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBxMiwgdWludDh4MTZfdCogY29uc3QgcTMpIHsKKyAgTG9hZDR4MTZfTkVPTihzcmMgLSAyLCBzdHJpZGUsIHAzLCBwMiwgcDEsIHAwKTsKKyAgTG9hZDR4MTZfTkVPTihzcmMgKyAyLCBzdHJpZGUsIHEwLCBxMSwgcTIsIHEzKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDE2eDRfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHExKSB7CisgICpwMSA9IHZsZDFxX3U4KHNyYyAtIDIgKiBzdHJpZGUpOworICAqcDAgPSB2bGQxcV91OChzcmMgLSAxICogc3RyaWRlKTsKKyAgKnEwID0gdmxkMXFfdTgoc3JjICsgMCAqIHN0cmlkZSk7CisgICpxMSA9IHZsZDFxX3U4KHNyYyArIDEgKiBzdHJpZGUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4OF9ORU9OKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IHN0cmlkZSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMywgdWludDh4MTZfdCogY29uc3QgcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLCB1aW50OHgxNl90KiBjb25zdCBxMCwgdWludDh4MTZfdCogY29uc3QgcTEsCisgICAgdWludDh4MTZfdCogY29uc3QgcTIsIHVpbnQ4eDE2X3QqIGNvbnN0IHEzKSB7CisgIExvYWQxNng0X05FT04oc3JjIC0gMiAgKiBzdHJpZGUsIHN0cmlkZSwgcDMsIHAyLCBwMSwgcDApOworICBMb2FkMTZ4NF9ORU9OKHNyYyArIDIgICogc3RyaWRlLCBzdHJpZGUsIHEwLCBxMSwgcTIsIHEzKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4OHgyX05FT04oCisgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwgY29uc3QgdWludDhfdCogY29uc3QgdiwgaW50IHN0cmlkZSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMywgdWludDh4MTZfdCogY29uc3QgcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLCB1aW50OHgxNl90KiBjb25zdCBxMCwgdWludDh4MTZfdCogY29uc3QgcTEsCisgICAgdWludDh4MTZfdCogY29uc3QgcTIsIHVpbnQ4eDE2X3QqIGNvbnN0IHEzKSB7CisgIC8vIFdlIHBhY2sgdGhlIDh4OCB1LXNhbXBsZXMgaW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHVpbnQ4eDE2X3QgZGVzdGluYXRpb24KKyAgLy8gYW5kIHRoZSB2LXNhbXBsZXMgb24gdGhlIGhpZ2hlciBoYWxmLgorICAqcDMgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgLSA0ICogc3RyaWRlKSwgdmxkMV91OCh2IC0gNCAqIHN0cmlkZSkpOworICAqcDIgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgLSAzICogc3RyaWRlKSwgdmxkMV91OCh2IC0gMyAqIHN0cmlkZSkpOworICAqcDEgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgLSAyICogc3RyaWRlKSwgdmxkMV91OCh2IC0gMiAqIHN0cmlkZSkpOworICAqcDAgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgLSAxICogc3RyaWRlKSwgdmxkMV91OCh2IC0gMSAqIHN0cmlkZSkpOworICAqcTAgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgKyAwICogc3RyaWRlKSwgdmxkMV91OCh2ICsgMCAqIHN0cmlkZSkpOworICAqcTEgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgKyAxICogc3RyaWRlKSwgdmxkMV91OCh2ICsgMSAqIHN0cmlkZSkpOworICAqcTIgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgKyAyICogc3RyaWRlKSwgdmxkMV91OCh2ICsgMiAqIHN0cmlkZSkpOworICAqcTMgPSB2Y29tYmluZV91OCh2bGQxX3U4KHUgKyAzICogc3RyaWRlKSwgdmxkMV91OCh2ICsgMyAqIHN0cmlkZSkpOworfQorCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisjZGVmaW5lIExPQURfVVZfOChST1cpIFwKKyAgdmNvbWJpbmVfdTgodmxkMV91OCh1IC0gNCArIChST1cpICogc3RyaWRlKSwgdmxkMV91OCh2IC0gNCArIChST1cpICogc3RyaWRlKSkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4OHgyVF9ORU9OKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsIGludCBzdHJpZGUsCisgICAgdWludDh4MTZfdCogY29uc3QgcDMsIHVpbnQ4eDE2X3QqIGNvbnN0IHAyLCB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMCwgdWludDh4MTZfdCogY29uc3QgcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IHExLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEyLCB1aW50OHgxNl90KiBjb25zdCBxMykgeworICAvLyBXZSBwYWNrIHRoZSA4eDggdS1zYW1wbGVzIGluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSB1aW50OHgxNl90IGRlc3RpbmF0aW9uCisgIC8vIGFuZCB0aGUgdi1zYW1wbGVzIG9uIHRoZSBoaWdoZXIgaGFsZi4KKyAgY29uc3QgdWludDh4MTZfdCByb3cwID0gTE9BRF9VVl84KDApOworICBjb25zdCB1aW50OHgxNl90IHJvdzEgPSBMT0FEX1VWXzgoMSk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MiA9IExPQURfVVZfOCgyKTsKKyAgY29uc3QgdWludDh4MTZfdCByb3czID0gTE9BRF9VVl84KDMpOworICBjb25zdCB1aW50OHgxNl90IHJvdzQgPSBMT0FEX1VWXzgoNCk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93NSA9IExPQURfVVZfOCg1KTsKKyAgY29uc3QgdWludDh4MTZfdCByb3c2ID0gTE9BRF9VVl84KDYpOworICBjb25zdCB1aW50OHgxNl90IHJvdzcgPSBMT0FEX1VWXzgoNyk7CisgIC8vIFBlcmZvcm0gdHdvIHNpZGUtYnktc2lkZSA4eDggdHJhbnNwb3NlcworICAvLyB1MDAgdTAxIHUwMiB1MDMgdTA0IHUwNSB1MDYgdTA3IHwgdjAwIHYwMSB2MDIgdjAzIHYwNCB2MDUgdjA2IHYwNworICAvLyB1MTAgdTExIHUxMiB1MTMgdTE0IHUxNSB1MTYgdTE3IHwgdjEwIHYxMSB2MTIgLi4uCisgIC8vIHUyMCB1MjEgdTIyIHUyMyB1MjQgdTI1IHUyNiB1MjcgfCB2MjAgdjIxIC4uLgorICAvLyB1MzAgdTMxIHUzMiB1MzMgdTM0IHUzNSB1MzYgdTM3IHwgLi4uCisgIC8vIHU0MCB1NDEgdTQyIHU0MyB1NDQgdTQ1IHU0NiB1NDcgfCAuLi4KKyAgLy8gdTUwIHU1MSB1NTIgdTUzIHU1NCB1NTUgdTU2IHU1NyB8IC4uLgorICAvLyB1NjAgdTYxIHU2MiB1NjMgdTY0IHU2NSB1NjYgdTY3IHwgdjYwIC4uLgorICAvLyB1NzAgdTcxIHU3MiB1NzMgdTc0IHU3NSB1NzYgdTc3IHwgdjcwIHY3MSB2NzIgLi4uCisgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3cwMSA9IHZ0cm5xX3U4KHJvdzAsIHJvdzEpOyAgLy8gdTAwIHUxMCB1MDIgdTEyIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHUwMSB1MTEgdTAzIHUxMyAuLi4KKyAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzIzID0gdnRybnFfdTgocm93Miwgcm93Myk7ICAvLyB1MjAgdTMwIHUyMiB1MzIgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdTIxIHUzMSB1MjMgdTMzIC4uLgorICBjb25zdCB1aW50OHgxNngyX3Qgcm93NDUgPSB2dHJucV91OChyb3c0LCByb3c1KTsgIC8vIC4uLgorICBjb25zdCB1aW50OHgxNngyX3Qgcm93NjcgPSB2dHJucV91OChyb3c2LCByb3c3KTsgIC8vIC4uLgorICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93MDIgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93MDEudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzIzLnZhbFswXSkpOworICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93MTMgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93MDEudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzIzLnZhbFsxXSkpOworICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93NDYgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93NDUudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzY3LnZhbFswXSkpOworICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93NTcgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93NDUudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzY3LnZhbFsxXSkpOworICBjb25zdCB1aW50MzJ4NHgyX3Qgcm93MDQgPSB2dHJucV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzAyLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UzMl91MTYocm93NDYudmFsWzBdKSk7CisgIGNvbnN0IHVpbnQzMng0eDJfdCByb3cyNiA9IHZ0cm5xX3UzMih2cmVpbnRlcnByZXRxX3UzMl91MTYocm93MDIudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTMyX3UxNihyb3c0Ni52YWxbMV0pKTsKKyAgY29uc3QgdWludDMyeDR4Ml90IHJvdzE1ID0gdnRybnFfdTMyKHZyZWludGVycHJldHFfdTMyX3UxNihyb3cxMy52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzU3LnZhbFswXSkpOworICBjb25zdCB1aW50MzJ4NHgyX3Qgcm93MzcgPSB2dHJucV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzEzLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UzMl91MTYocm93NTcudmFsWzFdKSk7CisgICpwMyA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzA0LnZhbFswXSk7CisgICpwMiA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzE1LnZhbFswXSk7CisgICpwMSA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzI2LnZhbFswXSk7CisgICpwMCA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzM3LnZhbFswXSk7CisgICpxMCA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzA0LnZhbFsxXSk7CisgICpxMSA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzE1LnZhbFsxXSk7CisgICpxMiA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzI2LnZhbFsxXSk7CisgICpxMyA9IHZyZWludGVycHJldHFfdThfdTMyKHJvdzM3LnZhbFsxXSk7Cit9CisjdW5kZWYgTE9BRF9VVl84CisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTJ4OF9ORU9OKGNvbnN0IHVpbnQ4eDh4Ml90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICB2c3QyX2xhbmVfdTgoZHN0ICsgMCAqIHN0cmlkZSwgdiwgMCk7CisgIHZzdDJfbGFuZV91OChkc3QgKyAxICogc3RyaWRlLCB2LCAxKTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDIgKiBzdHJpZGUsIHYsIDIpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgMyAqIHN0cmlkZSwgdiwgMyk7CisgIHZzdDJfbGFuZV91OChkc3QgKyA0ICogc3RyaWRlLCB2LCA0KTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDUgKiBzdHJpZGUsIHYsIDUpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgNiAqIHN0cmlkZSwgdiwgNik7CisgIHZzdDJfbGFuZV91OChkc3QgKyA3ICogc3RyaWRlLCB2LCA3KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUyeDE2X05FT04oY29uc3QgdWludDh4MTZfdCBwMCwgY29uc3QgdWludDh4MTZfdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICB1aW50OHg4eDJfdCBsbywgaGk7CisgIGxvLnZhbFswXSA9IHZnZXRfbG93X3U4KHAwKTsKKyAgbG8udmFsWzFdID0gdmdldF9sb3dfdTgocTApOworICBoaS52YWxbMF0gPSB2Z2V0X2hpZ2hfdTgocDApOworICBoaS52YWxbMV0gPSB2Z2V0X2hpZ2hfdTgocTApOworICBTdG9yZTJ4OF9ORU9OKGxvLCBkc3QgLSAxICsgMCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgU3RvcmUyeDhfTkVPTihoaSwgZHN0IC0gMSArIDggKiBzdHJpZGUsIHN0cmlkZSk7Cit9CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4OF9ORU9OKGNvbnN0IHVpbnQ4eDh4NF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICB2c3Q0X2xhbmVfdTgoZHN0ICsgMCAqIHN0cmlkZSwgdiwgMCk7CisgIHZzdDRfbGFuZV91OChkc3QgKyAxICogc3RyaWRlLCB2LCAxKTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDIgKiBzdHJpZGUsIHYsIDIpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgMyAqIHN0cmlkZSwgdiwgMyk7CisgIHZzdDRfbGFuZV91OChkc3QgKyA0ICogc3RyaWRlLCB2LCA0KTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDUgKiBzdHJpZGUsIHYsIDUpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgNiAqIHN0cmlkZSwgdiwgNik7CisgIHZzdDRfbGFuZV91OChkc3QgKyA3ICogc3RyaWRlLCB2LCA3KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU0eDE2X05FT04oY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgdWludDh4OHg0X3QgbG8sIGhpOworICBJTklUX1ZFQ1RPUjQobG8sCisgICAgICAgICAgICAgICB2Z2V0X2xvd191OChwMSksIHZnZXRfbG93X3U4KHAwKSwKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KHEwKSwgdmdldF9sb3dfdTgocTEpKTsKKyAgSU5JVF9WRUNUT1I0KGhpLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KHAxKSwgdmdldF9oaWdoX3U4KHAwKSwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChxMCksIHZnZXRfaGlnaF91OChxMSkpOworICBTdG9yZTR4OF9ORU9OKGxvLCBkc3QgLSAyICsgMCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgU3RvcmU0eDhfTkVPTihoaSwgZHN0IC0gMiArIDggKiBzdHJpZGUsIHN0cmlkZSk7Cit9CisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUxNngyX05FT04oY29uc3QgdWludDh4MTZfdCBwMCwgY29uc3QgdWludDh4MTZfdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICB2c3QxcV91OChkc3QgLSBzdHJpZGUsIHAwKTsKKyAgdnN0MXFfdTgoZHN0LCBxMCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMTZ4NF9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIFN0b3JlMTZ4Ml9ORU9OKHAxLCBwMCwgZHN0IC0gc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTE2eDJfTkVPTihxMCwgcTEsIGRzdCArIHN0cmlkZSwgc3RyaWRlKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU4eDJ4Ml9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB1LCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgLy8gcDAgYW5kIHEwIGNvbnRhaW4gdGhlIHUrdiBzYW1wbGVzIHBhY2tlZCBpbiBsb3cvaGlnaCBoYWx2ZXMuCisgIHZzdDFfdTgodSAtIHN0cmlkZSwgdmdldF9sb3dfdTgocDApKTsKKyAgdnN0MV91OCh1LCAgICAgICAgICB2Z2V0X2xvd191OChxMCkpOworICB2c3QxX3U4KHYgLSBzdHJpZGUsIHZnZXRfaGlnaF91OChwMCkpOworICB2c3QxX3U4KHYsICAgICAgICAgIHZnZXRfaGlnaF91OChxMCkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTh4NHgyX05FT04oY29uc3QgdWludDh4MTZfdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB1LCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgLy8gVGhlIHAxLi4ucTEgcmVnaXN0ZXJzIGNvbnRhaW4gdGhlIHUrdiBzYW1wbGVzIHBhY2tlZCBpbiBsb3cvaGlnaCBoYWx2ZXMuCisgIFN0b3JlOHgyeDJfTkVPTihwMSwgcDAsIHUgLSBzdHJpZGUsIHYgLSBzdHJpZGUsIHN0cmlkZSk7CisgIFN0b3JlOHgyeDJfTkVPTihxMCwgcTEsIHUgKyBzdHJpZGUsIHYgKyBzdHJpZGUsIHN0cmlkZSk7Cit9CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKyNkZWZpbmUgU1RPUkU2X0xBTkUoRFNULCBWQUwwLCBWQUwxLCBMQU5FKSBkbyB7ICAgXAorICB2c3QzX2xhbmVfdTgoKERTVCkgLSAzLCAoVkFMMCksIChMQU5FKSk7ICAgICAgICBcCisgIHZzdDNfbGFuZV91OCgoRFNUKSArIDAsIChWQUwxKSwgKExBTkUpKTsgICAgICAgIFwKKyAgKERTVCkgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU2eDh4Ml9ORU9OKAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDIsIGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwgY29uc3QgdWludDh4MTZfdCBxMiwKKyAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlKSB7CisgIHVpbnQ4eDh4M190IHUwLCB1MSwgdjAsIHYxOworICBJTklUX1ZFQ1RPUjModTAsIHZnZXRfbG93X3U4KHAyKSwgdmdldF9sb3dfdTgocDEpLCB2Z2V0X2xvd191OChwMCkpOworICBJTklUX1ZFQ1RPUjModTEsIHZnZXRfbG93X3U4KHEwKSwgdmdldF9sb3dfdTgocTEpLCB2Z2V0X2xvd191OChxMikpOworICBJTklUX1ZFQ1RPUjModjAsIHZnZXRfaGlnaF91OChwMiksIHZnZXRfaGlnaF91OChwMSksIHZnZXRfaGlnaF91OChwMCkpOworICBJTklUX1ZFQ1RPUjModjEsIHZnZXRfaGlnaF91OChxMCksIHZnZXRfaGlnaF91OChxMSksIHZnZXRfaGlnaF91OChxMikpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDApOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDEpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDIpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDMpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDQpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDUpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDYpOworICBTVE9SRTZfTEFORSh1LCB1MCwgdTEsIDcpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDApOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDEpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDIpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDMpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDQpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDUpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDYpOworICBTVE9SRTZfTEFORSh2LCB2MCwgdjEsIDcpOworfQorI3VuZGVmIFNUT1JFNl9MQU5FCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNHg4eDJfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHUsIHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICB1aW50OHg4eDRfdCB1MCwgdjA7CisgIElOSVRfVkVDVE9SNCh1MCwKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KHAxKSwgdmdldF9sb3dfdTgocDApLAorICAgICAgICAgICAgICAgdmdldF9sb3dfdTgocTApLCB2Z2V0X2xvd191OChxMSkpOworICBJTklUX1ZFQ1RPUjQodjAsCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgocDEpLCB2Z2V0X2hpZ2hfdTgocDApLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KHEwKSwgdmdldF9oaWdoX3U4KHExKSk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDAgKiBzdHJpZGUsIHUwLCAwKTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgMSAqIHN0cmlkZSwgdTAsIDEpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyAyICogc3RyaWRlLCB1MCwgMik7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDMgKiBzdHJpZGUsIHUwLCAzKTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgNCAqIHN0cmlkZSwgdTAsIDQpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyA1ICogc3RyaWRlLCB1MCwgNSk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDYgKiBzdHJpZGUsIHUwLCA2KTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgNyAqIHN0cmlkZSwgdTAsIDcpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyAwICogc3RyaWRlLCB2MCwgMCk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDEgKiBzdHJpZGUsIHYwLCAxKTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgMiAqIHN0cmlkZSwgdjAsIDIpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyAzICogc3RyaWRlLCB2MCwgMyk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDQgKiBzdHJpZGUsIHYwLCA0KTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgNSAqIHN0cmlkZSwgdjAsIDUpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyA2ICogc3RyaWRlLCB2MCwgNik7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDcgKiBzdHJpZGUsIHYwLCA3KTsKK30KKworI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vIFplcm8gZXh0ZW5kICd2JyB0byBhbiBpbnQxNng4X3QuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OF90IENvbnZlcnRVOFRvUzE2X05FT04odWludDh4OF90IHYpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3UxNih2bW92bF91OCh2KSk7Cit9CisKKy8vIFBlcmZvcm1zIHVuc2lnbmVkIDhiIHNhdHVyYXRpb24gb24gJ2RzdDAxJyBhbmQgJ2RzdDIzJyBzdG9yaW5nIHRoZSByZXN1bHQKKy8vIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvd3Mgb2YgJ2RzdCcuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTYXR1cmF0ZUFuZFN0b3JlNHg0X05FT04odWludDhfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBkc3QwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgZHN0MjMpIHsKKyAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgIGNvbnN0IHVpbnQ4eDhfdCBkc3QwMV91OCA9IHZxbW92dW5fczE2KGRzdDAxKTsKKyAgY29uc3QgdWludDh4OF90IGRzdDIzX3U4ID0gdnFtb3Z1bl9zMTYoZHN0MjMpOworCisgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgorICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDAxX3U4KSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MDFfdTgpLCAxKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QyM191OCksIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDIzX3U4KSwgMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFkZDR4NF9ORU9OKGNvbnN0IGludDE2eDhfdCByb3cwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCByb3cyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICB1aW50MzJ4Ml90IGRzdDAxID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDMyeDJfdCBkc3QyMyA9IHZkdXBfbl91MzIoMCk7CisKKyAgLy8gTG9hZCB0aGUgc291cmNlIHBpeGVscy4KKyAgZHN0MDEgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCBkc3QwMSwgMCk7CisgIGRzdDIzID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgZHN0MjMsIDApOworICBkc3QwMSA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIGRzdDAxLCAxKTsKKyAgZHN0MjMgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCBkc3QyMywgMSk7CisKKyAgeworICAgIC8vIENvbnZlcnQgdG8gMTZiLgorICAgIGNvbnN0IGludDE2eDhfdCBkc3QwMV9zMTYgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZyZWludGVycHJldF91OF91MzIoZHN0MDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZHN0MjNfczE2ID0gQ29udmVydFU4VG9TMTZfTkVPTih2cmVpbnRlcnByZXRfdThfdTMyKGRzdDIzKSk7CisKKyAgICAvLyBEZXNjYWxlIHdpdGggcm91bmRpbmcuCisgICAgY29uc3QgaW50MTZ4OF90IG91dDAxID0gdnJzcmFxX25fczE2KGRzdDAxX3MxNiwgcm93MDEsIDMpOworICAgIGNvbnN0IGludDE2eDhfdCBvdXQyMyA9IHZyc3JhcV9uX3MxNihkc3QyM19zMTYsIHJvdzIzLCAzKTsKKyAgICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtLgorICAgIFNhdHVyYXRlQW5kU3RvcmU0eDRfTkVPTihkc3QsIG91dDAxLCBvdXQyMyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHVpbnQ4eDE2X3QgTmVlZHNGaWx0ZXJfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoKSB7CisgIGNvbnN0IHVpbnQ4eDE2X3QgdGhyZXNoX3YgPSB2ZHVwcV9uX3U4KCh1aW50OF90KXRocmVzaCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMF9xMCA9IHZhYmRxX3U4KHAwLCBxMCk7ICAgICAgICAgICAgICAgLy8gYWJzKHAwLXEwKQorICBjb25zdCB1aW50OHgxNl90IGFfcDFfcTEgPSB2YWJkcV91OChwMSwgcTEpOyAgICAgICAgICAgICAgIC8vIGFicyhwMS1xMSkKKyAgY29uc3QgdWludDh4MTZfdCBhX3AwX3EwXzIgPSB2cWFkZHFfdTgoYV9wMF9xMCwgYV9wMF9xMCk7ICAvLyAyICogYWJzKHAwLXEwKQorICBjb25zdCB1aW50OHgxNl90IGFfcDFfcTFfMiA9IHZzaHJxX25fdTgoYV9wMV9xMSwgMSk7ICAgICAgIC8vIGFicyhwMS1xMSkgLyAyCisgIGNvbnN0IHVpbnQ4eDE2X3Qgc3VtID0gdnFhZGRxX3U4KGFfcDBfcTBfMiwgYV9wMV9xMV8yKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gdmNnZXFfdTgodGhyZXNoX3YsIHN1bSk7CisgIHJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50OHgxNl90IEZsaXBTaWduX05FT04oY29uc3QgdWludDh4MTZfdCB2KSB7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2lnbl9iaXQgPSB2ZHVwcV9uX3U4KDB4ODApOworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF91OCh2ZW9ycV91OCh2LCBzaWduX2JpdCkpOworfQorCitzdGF0aWMgdWludDh4MTZfdCBGbGlwU2lnbkJhY2tfTkVPTihjb25zdCBpbnQ4eDE2X3QgdikgeworICBjb25zdCBpbnQ4eDE2X3Qgc2lnbl9iaXQgPSB2ZHVwcV9uX3M4KDB4ODApOworICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF9zOCh2ZW9ycV9zOCh2LCBzaWduX2JpdCkpOworfQorCitzdGF0aWMgaW50OHgxNl90IEdldEJhc2VEZWx0YV9ORU9OKGNvbnN0IGludDh4MTZfdCBwMSwgY29uc3QgaW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4eDE2X3QgcTAsIGNvbnN0IGludDh4MTZfdCBxMSkgeworICBjb25zdCBpbnQ4eDE2X3QgcTBfcDAgPSB2cXN1YnFfczgocTAsIHAwKTsgICAgICAvLyAocTAtcDApCisgIGNvbnN0IGludDh4MTZfdCBwMV9xMSA9IHZxc3VicV9zOChwMSwgcTEpOyAgICAgIC8vIChwMS1xMSkKKyAgY29uc3QgaW50OHgxNl90IHMxID0gdnFhZGRxX3M4KHAxX3ExLCBxMF9wMCk7ICAgLy8gKHAxLXExKSArIDEgKiAocTAgLSBwMCkKKyAgY29uc3QgaW50OHgxNl90IHMyID0gdnFhZGRxX3M4KHEwX3AwLCBzMSk7ICAgICAgLy8gKHAxLXExKSArIDIgKiAocTAgLSBwMCkKKyAgY29uc3QgaW50OHgxNl90IHMzID0gdnFhZGRxX3M4KHEwX3AwLCBzMik7ICAgICAgLy8gKHAxLXExKSArIDMgKiAocTAgLSBwMCkKKyAgcmV0dXJuIHMzOworfQorCitzdGF0aWMgaW50OHgxNl90IEdldEJhc2VEZWx0YTBfTkVPTihjb25zdCBpbnQ4eDE2X3QgcDAsIGNvbnN0IGludDh4MTZfdCBxMCkgeworICBjb25zdCBpbnQ4eDE2X3QgcTBfcDAgPSB2cXN1YnFfczgocTAsIHAwKTsgICAgICAvLyAocTAtcDApCisgIGNvbnN0IGludDh4MTZfdCBzMSA9IHZxYWRkcV9zOChxMF9wMCwgcTBfcDApOyAgIC8vIDIgKiAocTAgLSBwMCkKKyAgY29uc3QgaW50OHgxNl90IHMyID0gdnFhZGRxX3M4KHEwX3AwLCBzMSk7ICAgICAgLy8gMyAqIChxMCAtIHAwKQorICByZXR1cm4gczI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEFwcGx5RmlsdGVyMk5vRmxpcF9ORU9OKGNvbnN0IGludDh4MTZfdCBwMHMsIGNvbnN0IGludDh4MTZfdCBxMHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4eDE2X3QqIGNvbnN0IG9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDh4MTZfdCogY29uc3Qgb3EwKSB7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0MyA9IHZkdXBxX25fczgoMHgwMyk7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0NCA9IHZkdXBxX25fczgoMHgwNCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YV9wMyA9IHZxYWRkcV9zOChkZWx0YSwga0NzdDMpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGFfcDQgPSB2cWFkZHFfczgoZGVsdGEsIGtDc3Q0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMyA9IHZzaHJxX25fczgoZGVsdGFfcDMsIDMpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGE0ID0gdnNocnFfbl9zOChkZWx0YV9wNCwgMyk7CisgICpvcDAgPSB2cWFkZHFfczgocDBzLCBkZWx0YTMpOworICAqb3EwID0gdnFzdWJxX3M4KHEwcywgZGVsdGE0KTsKK30KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfSU5UUklOU0lDUykKKworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXIyX05FT04oY29uc3QgaW50OHgxNl90IHAwcywgY29uc3QgaW50OHgxNl90IHEwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwgdWludDh4MTZfdCogY29uc3Qgb3EwKSB7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0MyA9IHZkdXBxX25fczgoMHgwMyk7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0NCA9IHZkdXBxX25fczgoMHgwNCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YV9wMyA9IHZxYWRkcV9zOChkZWx0YSwga0NzdDMpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGFfcDQgPSB2cWFkZHFfczgoZGVsdGEsIGtDc3Q0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMyA9IHZzaHJxX25fczgoZGVsdGFfcDMsIDMpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGE0ID0gdnNocnFfbl9zOChkZWx0YV9wNCwgMyk7CisgIGNvbnN0IGludDh4MTZfdCBzcDAgPSB2cWFkZHFfczgocDBzLCBkZWx0YTMpOworICBjb25zdCBpbnQ4eDE2X3Qgc3EwID0gdnFzdWJxX3M4KHEwcywgZGVsdGE0KTsKKyAgKm9wMCA9IEZsaXBTaWduQmFja19ORU9OKHNwMCk7CisgICpvcTAgPSBGbGlwU2lnbkJhY2tfTkVPTihzcTApOworfQorCitzdGF0aWMgdm9pZCBEb0ZpbHRlcjJfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwgdWludDh4MTZfdCogY29uc3Qgb3EwKSB7CisgIGNvbnN0IGludDh4MTZfdCBwMXMgPSBGbGlwU2lnbl9ORU9OKHAxKTsKKyAgY29uc3QgaW50OHgxNl90IHAwcyA9IEZsaXBTaWduX05FT04ocDApOworICBjb25zdCBpbnQ4eDE2X3QgcTBzID0gRmxpcFNpZ25fTkVPTihxMCk7CisgIGNvbnN0IGludDh4MTZfdCBxMXMgPSBGbGlwU2lnbl9ORU9OKHExKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMCA9IEdldEJhc2VEZWx0YV9ORU9OKHAxcywgcDBzLCBxMHMsIHExcyk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTEgPSB2YW5kcV9zOChkZWx0YTAsIHZyZWludGVycHJldHFfczhfdTgobWFzaykpOworICBBcHBseUZpbHRlcjJfTkVPTihwMHMsIHEwcywgZGVsdGExLCBvcDAsIG9xMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMSwgcDAsIHEwLCBxMSwgb3AwLCBvcTA7CisgIExvYWQxNng0X05FT04ocCwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXJfTkVPTihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoKTsKKyAgICBEb0ZpbHRlcjJfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgJm9wMCwgJm9xMCk7CisgIH0KKyAgU3RvcmUxNngyX05FT04ob3AwLCBvcTAsIHAsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMSwgcDAsIHEwLCBxMSwgb3EwLCBvcDA7CisgIExvYWQ0eDE2X05FT04ocCwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXJfTkVPTihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoKTsKKyAgICBEb0ZpbHRlcjJfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgJm9wMCwgJm9xMCk7CisgIH0KKyAgU3RvcmUyeDE2X05FT04ob3AwLCBvcTAsIHAsIHN0cmlkZSk7Cit9CisKKyNlbHNlCisKKy8vIExvYWQvU3RvcmUgdmVydGljYWwgZWRnZQorI2RlZmluZSBMT0FEOHg0KGMxLCBjMiwgYzMsIGM0LCBiMSwgYjIsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZsZDQuOCB7IiAjYzEgIlswXSwiICNjMiAiWzBdLCIgI2MzICJbMF0sIiAjYzQgIlswXX0sIiAjYjEgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbMV0sIiAjYzIgIlsxXSwiICNjMyAiWzFdLCIgI2M0ICJbMV19LCIgI2IyICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzJdLCIgI2MyICJbMl0sIiAjYzMgIlsyXSwiICNjNCAiWzJdfSwiICNiMSAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIlszXSwiICNjMiAiWzNdLCIgI2MzICJbM10sIiAjYzQgIlszXX0sIiAjYjIgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbNF0sIiAjYzIgIls0XSwiICNjMyAiWzRdLCIgI2M0ICJbNF19LCIgI2IxICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzVdLCIgI2MyICJbNV0sIiAjYzMgIls1XSwiICNjNCAiWzVdfSwiICNiMiAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIls2XSwiICNjMiAiWzZdLCIgI2MzICJbNl0sIiAjYzQgIls2XX0sIiAjYjEgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbN10sIiAjYzIgIls3XSwiICNjMyAiWzddLCIgI2M0ICJbN119LCIgI2IyICIsIiAjc3RyaWRlICJcbiIKKworI2RlZmluZSBTVE9SRTh4MihjMSwgYzIsIHAsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzBdLCAiICNjMiAiWzBdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIlsxXSwgIiAjYzIgIlsxXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbMl0sICIgI2MyICJbMl19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzNdLCAiICNjMiAiWzNdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIls0XSwgIiAjYzIgIls0XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbNV0sICIgI2MyICJbNV19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzZdLCAiICNjMiAiWzZdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIls3XSwgIiAjYzIgIls3XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIgorCisjZGVmaW5lIFFSZWdzICJxMCIsICJxMSIsICJxMiIsICJxMyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisKKyNkZWZpbmUgRkxJUF9TSUdOX0JJVDIoYSwgYiwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2ZW9yICAgICAiICNhICIsIiAjYSAiLCIgI3MgIiAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidmVvciAgICAgIiAjYiAiLCIgI2IgIiwiICNzICIgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBGTElQX1NJR05fQklUNChhLCBiLCBjLCBkLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDIoYSwgYiwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKGMsIGQsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIE5FRURTX0ZJTFRFUihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidmFiZC51OCAgICBxMTUsIiAjcDAgIiwiICNxMCAiICAgICAgICAgXG4iICAvKiBhYnMocDAgLSBxMCkgKi8gICAgICAgICAgICAgIFwKKyAgInZhYmQudTggICAgcTE0LCIgI3AxICIsIiAjcTEgIiAgICAgICAgIFxuIiAgLyogYWJzKHAxIC0gcTEpICovICAgICAgICAgICAgICBcCisgICJ2cWFkZC51OCAgIHExNSwgcTE1LCBxMTUgICAgICAgICAgICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqIDIgKi8gICAgICAgICAgXAorICAidnNoci51OCAgICBxMTQsIHExNCwgIzEgICAgICAgICAgICAgICAgXG4iICAvKiBhYnMocDEgLSBxMSkgLyAyICovICAgICAgICAgIFwKKyAgInZxYWRkLnU4ICAgcTE1LCBxMTUsIHExNCAgICAgXG4iICAvKiBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpIC8gMiAqLyBcCisgICJ2ZHVwLjggICAgIHExNCwgIiAjdGhyZXNoICIgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidmNnZS51OCAgICIgI21hc2sgIiwgcTE0LCBxMTUgICAgICAgICAgXG4iICAvKiBtYXNrIDw9IHRocmVzaCAqLworCisjZGVmaW5lIEdFVF9CQVNFX0RFTFRBKHAxLCBwMCwgcTAsIHExLCBvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidnFzdWIuczggICBxMTUsIiAjcTAgIiwiICNwMCAiICAgICAgICAgXG4iICAvKiAocTAgLSBwMCkgKi8gICAgICAgICAgICAgICAgIFwKKyAgInZxc3ViLnM4ICAiICNvICIsIiAjcDEgIiwiICNxMSAiICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICovICAgICAgICAgICAgICAgICBcCisgICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDEgKiAocDAgLSBxMCkgKi8gXAorICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAyICogKHAwIC0gcTApICovIFwKKyAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMyAqIChwMCAtIHEwKSAqLworCisjZGVmaW5lIERPX1NJTVBMRV9GSUxURVIocDAsIHEwLCBmbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidm1vdi5pOCAgICBxMTUsICMweDAzICAgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZxYWRkLnM4ICAgcTE1LCBxMTUsICIgI2ZsICIgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA9IGZpbHRlciArIDMgKi8gICAgICBcCisgICJ2c2hyLnM4ICAgIHExNSwgcTE1LCAjMyAgICAgICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPj4gMyAqLyAgICAgICAgICAgICAgXAorICAidnFhZGQuczggICIgI3AwICIsIiAjcDAgIiwgcTE1ICAgICAgICAgXG4iICAvKiBwMCArPSBmaWx0ZXIxICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2bW92Lmk4ICAgIHExNSwgIzB4MDQgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidnFhZGQuczggICBxMTUsIHExNSwgIiAjZmwgIiAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID0gZmlsdGVyICsgNCAqLyAgICAgIFwKKyAgInZzaHIuczggICAgcTE1LCBxMTUsICMzICAgICAgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMiA+PiAzICovICAgICAgICAgICAgICBcCisgICJ2cXN1Yi5zOCAgIiAjcTAgIiwiICNxMCAiLCBxMTUgICAgICAgICBcbiIgIC8qIHEwIC09IGZpbHRlcjIgKi8KKworLy8gQXBwbGllcyBmaWx0ZXIgb24gMiBwaXhlbHMgKHAwIGFuZCBxMCkKKyNkZWZpbmUgRE9fRklMVEVSMihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE5FRURTX0ZJTFRFUihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBxOSkgICAgIC8qIGZpbHRlciBtYXNrIGluIHE5ICovICAgICAgICAgXAorICAidm1vdi5pOCAgICBxMTAsICMweDgwICAgICAgICAgICAgICAgICAgXG4iICAvKiBzaWduIGJpdCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDQocDEsIHAwLCBxMCwgcTEsIHExMCkgICAgICAgICAgLyogY29udmVydCB0byBzaWduZWQgdmFsdWUgKi8gICBcCisgIEdFVF9CQVNFX0RFTFRBKHAxLCBwMCwgcTAsIHExLCBxMTEpICAgICAgICAgIC8qIGdldCBmaWx0ZXIgbGV2ZWwgICovICAgICAgICAgXAorICAidmFuZCAgICAgICBxOSwgcTksIHExMSAgICAgICAgICAgICAgICAgXG4iICAvKiBhcHBseSBmaWx0ZXIgbWFzayAqLyAgICAgICAgIFwKKyAgRE9fU0lNUExFX0ZJTFRFUihwMCwgcTAsIHE5KSAgICAgICAgICAgICAgICAgLyogYXBwbHkgZmlsdGVyICovICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKHAwLCBxMCwgcTEwKQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQorCisgICAgInZsZDEudTggICAge3ExfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcDEKKyAgICAidmxkMS51OCAgICB7cTJ9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBwMAorICAgICJ2bGQxLnU4ICAgIHtxM30sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHEwCisgICAgInZsZDEudTggICAge3ExMn0sIFslW3BdXSAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcTEKKworICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMywgcTEyLCAlW3RocmVzaF0pCisKKyAgICAic3ViICAgICAgICAlW3BdLCAlW3BdLCAlW3N0cmlkZV0sIGxzbCAjMSAgXG4iICAvLyBwIC09IDIgKiBzdHJpZGUKKworICAgICJ2c3QxLnU4ICAgIHtxMn0sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHN0b3JlIG9wMAorICAgICJ2c3QxLnU4ICAgIHtxM30sIFslW3BdXSAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHN0b3JlIG9xMAorICAgIDogW3BdICIrciIocCkKKyAgICA6IFtzdHJpZGVdICJyIihzdHJpZGUpLCBbdGhyZXNoXSAiciIodGhyZXNoKQorICAgIDogIm1lbW9yeSIsIFFSZWdzCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInN1YiAgICAgICAgcjQsICVbcF0sICMyICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gYmFzZTEgPSBwIC0gMgorICAgICJsc2wgICAgICAgIHI2LCAlW3N0cmlkZV0sICMxICAgICAgICAgICAgICBcbiIgIC8vIHI2ID0gMiAqIHN0cmlkZQorICAgICJhZGQgICAgICAgIHI1LCByNCwgJVtzdHJpZGVdICAgICAgICAgICAgICBcbiIgIC8vIGJhc2UyID0gYmFzZTEgKyBzdHJpZGUKKworICAgIExPQUQ4eDQoZDIsIGQzLCBkNCwgZDUsIFtyNF0sIFtyNV0sIHI2KQorICAgIExPQUQ4eDQoZDI0LCBkMjUsIGQyNiwgZDI3LCBbcjRdLCBbcjVdLCByNikKKyAgICAidnN3cCAgICAgICBkMywgZDI0ICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBwMTpxMSBwMDpxMworICAgICJ2c3dwICAgICAgIGQ1LCBkMjYgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHEwOnEyIHExOnE0CisgICAgInZzd3AgICAgICAgcTIsIHExMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcDE6cTEgcDA6cTIgcTA6cTMgcTE6cTQKKworICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMTIsIHExMywgJVt0aHJlc2hdKQorCisgICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgIzEgICAgICAgICAgICAgICAgIFxuIiAgLy8gcCAtIDEKKworICAgICJ2c3dwICAgICAgICBkNSwgZDI0ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICBTVE9SRTh4MihkNCwgZDUsIFslW3BdXSwgJVtzdHJpZGVdKQorICAgIFNUT1JFOHgyKGQyNCwgZDI1LCBbJVtwXV0sICVbc3RyaWRlXSkKKworICAgIDogW3BdICIrciIocCkKKyAgICA6IFtzdHJpZGVdICJyIihzdHJpZGUpLCBbdGhyZXNoXSAiciIodGhyZXNoKQorICAgIDogIm1lbW9yeSIsICJyNCIsICJyNSIsICJyNiIsIFFSZWdzCisgICk7Cit9CisKKyN1bmRlZiBMT0FEOHg0CisjdW5kZWYgU1RPUkU4eDIKKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX0lOVFJJTlNJQ1MKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aV9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgdWludDMyX3QgazsKKyAgZm9yIChrID0gMzsgayAhPSAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2X05FT04ocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmlfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIHVpbnQzMl90IGs7CisgIGZvciAoayA9IDM7IGsgIT0gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNl9ORU9OKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCisKK3N0YXRpYyB1aW50OHgxNl90IE5lZWRzSGV2X05FT04oY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgdWludDh4MTZfdCBoZXZfdGhyZXNoX3YgPSB2ZHVwcV9uX3U4KCh1aW50OF90KWhldl90aHJlc2gpOworICBjb25zdCB1aW50OHgxNl90IGFfcDFfcDAgPSB2YWJkcV91OChwMSwgcDApOyAgLy8gYWJzKHAxIC0gcDApCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9xMV9xMCA9IHZhYmRxX3U4KHExLCBxMCk7ICAvLyBhYnMocTEgLSBxMCkKKyAgY29uc3QgdWludDh4MTZfdCBhX21heCA9IHZtYXhxX3U4KGFfcDFfcDAsIGFfcTFfcTApOworICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSB2Y2d0cV91OChhX21heCwgaGV2X3RocmVzaF92KTsKKyAgcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyB1aW50OHgxNl90IE5lZWRzRmlsdGVyMl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDMsIGNvbnN0IHVpbnQ4eDE2X3QgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTIsIGNvbnN0IHVpbnQ4eDE2X3QgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRocmVzaCwgaW50IHRocmVzaCkgeworICBjb25zdCB1aW50OHgxNl90IGl0aHJlc2hfdiA9IHZkdXBxX25fdTgoKHVpbnQ4X3QpaXRocmVzaCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wM19wMiA9IHZhYmRxX3U4KHAzLCBwMik7ICAvLyBhYnMocDMgLSBwMikKKyAgY29uc3QgdWludDh4MTZfdCBhX3AyX3AxID0gdmFiZHFfdTgocDIsIHAxKTsgIC8vIGFicyhwMiAtIHAxKQorICBjb25zdCB1aW50OHgxNl90IGFfcDFfcDAgPSB2YWJkcV91OChwMSwgcDApOyAgLy8gYWJzKHAxIC0gcDApCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9xM19xMiA9IHZhYmRxX3U4KHEzLCBxMik7ICAvLyBhYnMocTMgLSBxMikKKyAgY29uc3QgdWludDh4MTZfdCBhX3EyX3ExID0gdmFiZHFfdTgocTIsIHExKTsgIC8vIGFicyhxMiAtIHExKQorICBjb25zdCB1aW50OHgxNl90IGFfcTFfcTAgPSB2YWJkcV91OChxMSwgcTApOyAgLy8gYWJzKHExIC0gcTApCisgIGNvbnN0IHVpbnQ4eDE2X3QgbWF4MSA9IHZtYXhxX3U4KGFfcDNfcDIsIGFfcDJfcDEpOworICBjb25zdCB1aW50OHgxNl90IG1heDIgPSB2bWF4cV91OChhX3AxX3AwLCBhX3EzX3EyKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXgzID0gdm1heHFfdTgoYV9xMl9xMSwgYV9xMV9xMCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWF4MTIgPSB2bWF4cV91OChtYXgxLCBtYXgyKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXgxMjMgPSB2bWF4cV91OChtYXgxMiwgbWF4Myk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzazIgPSB2Y2dlcV91OChpdGhyZXNoX3YsIG1heDEyMyk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzazEgPSBOZWVkc0ZpbHRlcl9ORU9OKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpOworICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSB2YW5kcV91OChtYXNrMSwgbWFzazIpOworICByZXR1cm4gbWFzazsKK30KKworLy8gIDQtcG9pbnRzIGZpbHRlcgorCitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcjRfTkVPTigKKyAgICBjb25zdCBpbnQ4eDE2X3QgcDEsIGNvbnN0IGludDh4MTZfdCBwMCwKKyAgICBjb25zdCBpbnQ4eDE2X3QgcTAsIGNvbnN0IGludDh4MTZfdCBxMSwKKyAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEwLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMSwgdWludDh4MTZfdCogY29uc3Qgb3AwLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCwgdWludDh4MTZfdCogY29uc3Qgb3ExKSB7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0MyA9IHZkdXBxX25fczgoMHgwMyk7CisgIGNvbnN0IGludDh4MTZfdCBrQ3N0NCA9IHZkdXBxX25fczgoMHgwNCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTEgPSB2cWFkZHFfczgoZGVsdGEwLCBrQ3N0NCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTIgPSB2cWFkZHFfczgoZGVsdGEwLCBrQ3N0Myk7CisgIGNvbnN0IGludDh4MTZfdCBhMSA9IHZzaHJxX25fczgoZGVsdGExLCAzKTsKKyAgY29uc3QgaW50OHgxNl90IGEyID0gdnNocnFfbl9zOChkZWx0YTIsIDMpOworICBjb25zdCBpbnQ4eDE2X3QgYTMgPSB2cnNocnFfbl9zOChhMSwgMSk7ICAgLy8gYTMgPSAoYTEgKyAxKSA+PiAxCisgICpvcDAgPSBGbGlwU2lnbkJhY2tfTkVPTih2cWFkZHFfczgocDAsIGEyKSk7ICAvLyBjbGlwKHAwICsgYTIpCisgICpvcTAgPSBGbGlwU2lnbkJhY2tfTkVPTih2cXN1YnFfczgocTAsIGExKSk7ICAvLyBjbGlwKHEwIC0gYTEpCisgICpvcDEgPSBGbGlwU2lnbkJhY2tfTkVPTih2cWFkZHFfczgocDEsIGEzKSk7ICAvLyBjbGlwKHAxICsgYTMpCisgICpvcTEgPSBGbGlwU2lnbkJhY2tfTkVPTih2cXN1YnFfczgocTEsIGEzKSk7ICAvLyBjbGlwKHExIC0gYTMpCit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyNF9ORU9OKAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2ssIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2ssCisgICAgdWludDh4MTZfdCogY29uc3Qgb3AxLCB1aW50OHgxNl90KiBjb25zdCBvcDAsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3EwLCB1aW50OHgxNl90KiBjb25zdCBvcTEpIHsKKyAgLy8gVGhpcyBpcyBhIGZ1c2VkIHZlcnNpb24gb2YgRG9GaWx0ZXIyKCkgY2FsbGluZyBBcHBseUZpbHRlcjIgZGlyZWN0bHkKKyAgY29uc3QgaW50OHgxNl90IHAxcyA9IEZsaXBTaWduX05FT04ocDEpOworICBpbnQ4eDE2X3QgcDBzID0gRmxpcFNpZ25fTkVPTihwMCk7CisgIGludDh4MTZfdCBxMHMgPSBGbGlwU2lnbl9ORU9OKHEwKTsKKyAgY29uc3QgaW50OHgxNl90IHExcyA9IEZsaXBTaWduX05FT04ocTEpOworICBjb25zdCB1aW50OHgxNl90IHNpbXBsZV9sZl9tYXNrID0gdmFuZHFfdTgobWFzaywgaGV2X21hc2spOworCisgIC8vIGRvX2ZpbHRlcjIgcGFydCAoc2ltcGxlIGxvb3BmaWx0ZXIgb24gcGl4ZWxzIHdpdGggaGV2KQorICB7CisgICAgY29uc3QgaW50OHgxNl90IGRlbHRhID0gR2V0QmFzZURlbHRhX05FT04ocDFzLCBwMHMsIHEwcywgcTFzKTsKKyAgICBjb25zdCBpbnQ4eDE2X3Qgc2ltcGxlX2xmX2RlbHRhID0KKyAgICAgICAgdmFuZHFfczgoZGVsdGEsIHZyZWludGVycHJldHFfczhfdTgoc2ltcGxlX2xmX21hc2spKTsKKyAgICBBcHBseUZpbHRlcjJOb0ZsaXBfTkVPTihwMHMsIHEwcywgc2ltcGxlX2xmX2RlbHRhLCAmcDBzLCAmcTBzKTsKKyAgfQorCisgIC8vIGRvX2ZpbHRlcjQgcGFydCAoY29tcGxleCBsb29wZmlsdGVyIG9uIHBpeGVscyB3aXRob3V0IGhldikKKyAgeworICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YTAgPSBHZXRCYXNlRGVsdGEwX05FT04ocDBzLCBxMHMpOworICAgIC8vIHdlIHVzZTogKG1hc2sgJiBoZXZfbWFzaykgXiBtYXNrID0gbWFzayAmICFoZXZfbWFzaworICAgIGNvbnN0IHVpbnQ4eDE2X3QgY29tcGxleF9sZl9tYXNrID0gdmVvcnFfdTgoc2ltcGxlX2xmX21hc2ssIG1hc2spOworICAgIGNvbnN0IGludDh4MTZfdCBjb21wbGV4X2xmX2RlbHRhID0KKyAgICAgICAgdmFuZHFfczgoZGVsdGEwLCB2cmVpbnRlcnByZXRxX3M4X3U4KGNvbXBsZXhfbGZfbWFzaykpOworICAgIEFwcGx5RmlsdGVyNF9ORU9OKHAxcywgcDBzLCBxMHMsIHExcywgY29tcGxleF9sZl9kZWx0YSwgb3AxLCBvcDAsIG9xMCwgb3ExKTsKKyAgfQorfQorCisvLyAgNi1wb2ludHMgZmlsdGVyCisKK3N0YXRpYyB2b2lkIEFwcGx5RmlsdGVyNl9ORU9OKAorICAgIGNvbnN0IGludDh4MTZfdCBwMiwgY29uc3QgaW50OHgxNl90IHAxLCBjb25zdCBpbnQ4eDE2X3QgcDAsCisgICAgY29uc3QgaW50OHgxNl90IHEwLCBjb25zdCBpbnQ4eDE2X3QgcTEsIGNvbnN0IGludDh4MTZfdCBxMiwKKyAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3AyLCB1aW50OHgxNl90KiBjb25zdCBvcDEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMSwgdWludDh4MTZfdCogY29uc3Qgb3EyKSB7CisgIC8vIFdlIGhhdmUgdG8gY29tcHV0ZTogWCA9ICg5KmErNjMpID4+IDcsIFkgPSAoMTgqYSs2Myk+PjcsIFogPSAoMjcqYSs2MykgPj4gNworICAvLyBUdXJucyBvdXQsIHRoZXJlJ3MgYSBjb21tb24gc3ViLWV4cHJlc3Npb24gUz05ICogYSAtIDEgdGhhdCBjYW4gYmUgdXNlZAorICAvLyB3aXRoIHRoZSBzcGVjaWFsIHZxcnNocm5fbl9zMTYgcm91bmRpbmctc2hpZnQtYW5kLW5hcnJvdyBpbnN0cnVjdGlvbjoKKyAgLy8gICBYID0gKFMgKyA2NCkgPj4gNywgWSA9IChTICsgMzIpID4+IDYsIFogPSAoMTggKiBhICsgUyArIDY0KSA+PiA3CisgIGNvbnN0IGludDh4OF90IGRlbHRhX2xvID0gdmdldF9sb3dfczgoZGVsdGEpOworICBjb25zdCBpbnQ4eDhfdCBkZWx0YV9oaSA9IHZnZXRfaGlnaF9zOChkZWx0YSk7CisgIGNvbnN0IGludDh4OF90IGtDc3Q5ID0gdmR1cF9uX3M4KDkpOworICBjb25zdCBpbnQxNng4X3Qga0NzdG0xID0gdmR1cHFfbl9zMTYoLTEpOworICBjb25zdCBpbnQ4eDhfdCBrQ3N0MTggPSB2ZHVwX25fczgoMTgpOworICBjb25zdCBpbnQxNng4X3QgU19sbyA9IHZtbGFsX3M4KGtDc3RtMSwga0NzdDksIGRlbHRhX2xvKTsgIC8vIFMgPSA5ICogYSAtIDEKKyAgY29uc3QgaW50MTZ4OF90IFNfaGkgPSB2bWxhbF9zOChrQ3N0bTEsIGtDc3Q5LCBkZWx0YV9oaSk7CisgIGNvbnN0IGludDE2eDhfdCBaX2xvID0gdm1sYWxfczgoU19sbywga0NzdDE4LCBkZWx0YV9sbyk7ICAgLy8gUyArIDE4ICogYQorICBjb25zdCBpbnQxNng4X3QgWl9oaSA9IHZtbGFsX3M4KFNfaGksIGtDc3QxOCwgZGVsdGFfaGkpOworICBjb25zdCBpbnQ4eDhfdCBhM19sbyA9IHZxcnNocm5fbl9zMTYoU19sbywgNyk7ICAgLy8gKDkgKiBhICsgNjMpID4+IDcKKyAgY29uc3QgaW50OHg4X3QgYTNfaGkgPSB2cXJzaHJuX25fczE2KFNfaGksIDcpOworICBjb25zdCBpbnQ4eDhfdCBhMl9sbyA9IHZxcnNocm5fbl9zMTYoU19sbywgNik7ICAgLy8gKDkgKiBhICsgMzEpID4+IDYKKyAgY29uc3QgaW50OHg4X3QgYTJfaGkgPSB2cXJzaHJuX25fczE2KFNfaGksIDYpOworICBjb25zdCBpbnQ4eDhfdCBhMV9sbyA9IHZxcnNocm5fbl9zMTYoWl9sbywgNyk7ICAgLy8gKDI3ICogYSArIDYzKSA+PiA3CisgIGNvbnN0IGludDh4OF90IGExX2hpID0gdnFyc2hybl9uX3MxNihaX2hpLCA3KTsKKyAgY29uc3QgaW50OHgxNl90IGExID0gdmNvbWJpbmVfczgoYTFfbG8sIGExX2hpKTsKKyAgY29uc3QgaW50OHgxNl90IGEyID0gdmNvbWJpbmVfczgoYTJfbG8sIGEyX2hpKTsKKyAgY29uc3QgaW50OHgxNl90IGEzID0gdmNvbWJpbmVfczgoYTNfbG8sIGEzX2hpKTsKKworICAqb3AwID0gRmxpcFNpZ25CYWNrX05FT04odnFhZGRxX3M4KHAwLCBhMSkpOyAgLy8gY2xpcChwMCArIGExKQorICAqb3EwID0gRmxpcFNpZ25CYWNrX05FT04odnFzdWJxX3M4KHEwLCBhMSkpOyAgLy8gY2xpcChxMCAtIHExKQorICAqb3ExID0gRmxpcFNpZ25CYWNrX05FT04odnFzdWJxX3M4KHExLCBhMikpOyAgLy8gY2xpcChxMSAtIGEyKQorICAqb3AxID0gRmxpcFNpZ25CYWNrX05FT04odnFhZGRxX3M4KHAxLCBhMikpOyAgLy8gY2xpcChwMSArIGEyKQorICAqb3EyID0gRmxpcFNpZ25CYWNrX05FT04odnFzdWJxX3M4KHEyLCBhMykpOyAgLy8gY2xpcChxMiAtIGEzKQorICAqb3AyID0gRmxpcFNpZ25CYWNrX05FT04odnFhZGRxX3M4KHAyLCBhMykpOyAgLy8gY2xpcChwMiArIGEzKQorfQorCitzdGF0aWMgdm9pZCBEb0ZpbHRlcjZfTkVPTigKKyAgICBjb25zdCB1aW50OHgxNl90IHAyLCBjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsIGNvbnN0IHVpbnQ4eDE2X3QgcTIsCisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrLCBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMiwgdWludDh4MTZfdCogY29uc3Qgb3AxLCB1aW50OHgxNl90KiBjb25zdCBvcDAsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3EwLCB1aW50OHgxNl90KiBjb25zdCBvcTEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMikgeworICAvLyBUaGlzIGlzIGEgZnVzZWQgdmVyc2lvbiBvZiBEb0ZpbHRlcjIoKSBjYWxsaW5nIEFwcGx5RmlsdGVyMiBkaXJlY3RseQorICBjb25zdCBpbnQ4eDE2X3QgcDJzID0gRmxpcFNpZ25fTkVPTihwMik7CisgIGNvbnN0IGludDh4MTZfdCBwMXMgPSBGbGlwU2lnbl9ORU9OKHAxKTsKKyAgaW50OHgxNl90IHAwcyA9IEZsaXBTaWduX05FT04ocDApOworICBpbnQ4eDE2X3QgcTBzID0gRmxpcFNpZ25fTkVPTihxMCk7CisgIGNvbnN0IGludDh4MTZfdCBxMXMgPSBGbGlwU2lnbl9ORU9OKHExKTsKKyAgY29uc3QgaW50OHgxNl90IHEycyA9IEZsaXBTaWduX05FT04ocTIpOworICBjb25zdCB1aW50OHgxNl90IHNpbXBsZV9sZl9tYXNrID0gdmFuZHFfdTgobWFzaywgaGV2X21hc2spOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEwID0gR2V0QmFzZURlbHRhX05FT04ocDFzLCBwMHMsIHEwcywgcTFzKTsKKworICAvLyBkb19maWx0ZXIyIHBhcnQgKHNpbXBsZSBsb29wZmlsdGVyIG9uIHBpeGVscyB3aXRoIGhldikKKyAgeworICAgIGNvbnN0IGludDh4MTZfdCBzaW1wbGVfbGZfZGVsdGEgPQorICAgICAgICB2YW5kcV9zOChkZWx0YTAsIHZyZWludGVycHJldHFfczhfdTgoc2ltcGxlX2xmX21hc2spKTsKKyAgICBBcHBseUZpbHRlcjJOb0ZsaXBfTkVPTihwMHMsIHEwcywgc2ltcGxlX2xmX2RlbHRhLCAmcDBzLCAmcTBzKTsKKyAgfQorCisgIC8vIGRvX2ZpbHRlcjYgcGFydCAoY29tcGxleCBsb29wZmlsdGVyIG9uIHBpeGVscyB3aXRob3V0IGhldikKKyAgeworICAgIC8vIHdlIHVzZTogKG1hc2sgJiBoZXZfbWFzaykgXiBtYXNrID0gbWFzayAmICFoZXZfbWFzaworICAgIGNvbnN0IHVpbnQ4eDE2X3QgY29tcGxleF9sZl9tYXNrID0gdmVvcnFfdTgoc2ltcGxlX2xmX21hc2ssIG1hc2spOworICAgIGNvbnN0IGludDh4MTZfdCBjb21wbGV4X2xmX2RlbHRhID0KKyAgICAgICAgdmFuZHFfczgoZGVsdGEwLCB2cmVpbnRlcnByZXRxX3M4X3U4KGNvbXBsZXhfbGZfbWFzaykpOworICAgIEFwcGx5RmlsdGVyNl9ORU9OKHAycywgcDFzLCBwMHMsIHEwcywgcTFzLCBxMnMsIGNvbXBsZXhfbGZfZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgb3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMik7CisgIH0KK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICBMb2FkMTZ4OF9ORU9OKHAsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMjsKKyAgICBEb0ZpbHRlcjZfTkVPTihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXZfbWFzaywKKyAgICAgICAgICAgICAgICAgICAmb3AyLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExLCAmb3EyKTsKKyAgICBTdG9yZTE2eDJfTkVPTihvcDIsIG9wMSwgcCAtIDIgKiBzdHJpZGUsIHN0cmlkZSk7CisgICAgU3RvcmUxNngyX05FT04ob3AwLCBvcTAsIHAgKyAwICogc3RyaWRlLCBzdHJpZGUpOworICAgIFN0b3JlMTZ4Ml9ORU9OKG9xMSwgb3EyLCBwICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICBMb2FkOHgxNl9ORU9OKHAsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMjsKKyAgICBEb0ZpbHRlcjZfTkVPTihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXZfbWFzaywKKyAgICAgICAgICAgICAgICAgICAmb3AyLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExLCAmb3EyKTsKKyAgICBTdG9yZTJ4MTZfTkVPTihvcDIsIG9wMSwgcCAtIDIsIHN0cmlkZSk7CisgICAgU3RvcmUyeDE2X05FT04ob3AwLCBvcTAsIHAgKyAwLCBzdHJpZGUpOworICAgIFN0b3JlMngxNl9ORU9OKG9xMSwgb3EyLCBwICsgMiwgc3RyaWRlKTsKKyAgfQorfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aV9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQzMl90IGs7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDA7CisgIExvYWQxNng0X05FT04ocCArIDIgICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7CisgIGZvciAoayA9IDM7IGsgIT0gMDsgLS1rKSB7CisgICAgdWludDh4MTZfdCBxMCwgcTEsIHEyLCBxMzsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgTG9hZDE2eDRfTkVPTihwICsgMiAgKiBzdHJpZGUsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgICB7CisgICAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPQorICAgICAgICAgIE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgaXRocmVzaCwgdGhyZXNoKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICAgIC8vIHAzIGFuZCBwMiBhcmUgbm90IGp1c3QgdGVtcG9yYXJ5IHZhcmlhYmxlcyBoZXJlOiB0aGV5IHdpbGwgYmUKKyAgICAgIC8vIHJlLXVzZWQgZm9yIG5leHQgc3Bhbi4gQW5kIHEyL3EzIHdpbGwgYmVjb21lIHAxL3AwIGFjY29yZGluZ2x5LgorICAgICAgRG9GaWx0ZXI0X05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldl9tYXNrLCAmcDEsICZwMCwgJnAzLCAmcDIpOworICAgICAgU3RvcmUxNng0X05FT04ocDEsIHAwLCBwMywgcDIsIHAsIHN0cmlkZSk7CisgICAgICBwMSA9IHEyOworICAgICAgcDAgPSBxMzsKKyAgICB9CisgIH0KK30KKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmlfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50MzJfdCBrOworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwOworICBMb2FkNHgxNl9ORU9OKHAgKyAyLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7CisgIGZvciAoayA9IDM7IGsgIT0gMDsgLS1rKSB7CisgICAgdWludDh4MTZfdCBxMCwgcTEsIHEyLCBxMzsKKyAgICBwICs9IDQ7CisgICAgTG9hZDR4MTZfTkVPTihwICsgMiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICAgIHsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9CisgICAgICAgICAgTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBpdGhyZXNoLCB0aHJlc2gpOworICAgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgICAgRG9GaWx0ZXI0X05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldl9tYXNrLCAmcDEsICZwMCwgJnAzLCAmcDIpOworICAgICAgU3RvcmU0eDE2X05FT04ocDEsIHAwLCBwMywgcDIsIHAsIHN0cmlkZSk7CisgICAgICBwMSA9IHEyOworICAgICAgcDAgPSBxMzsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOF9ORU9OKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgTG9hZDh4OHgyX05FT04odSwgdiwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyOworICAgIERvRmlsdGVyNl9ORU9OKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldl9tYXNrLAorICAgICAgICAgICAgICAgICAgICZvcDIsICZvcDEsICZvcDAsICZvcTAsICZvcTEsICZvcTIpOworICAgIFN0b3JlOHgyeDJfTkVPTihvcDIsIG9wMSwgdSAtIDIgKiBzdHJpZGUsIHYgLSAyICogc3RyaWRlLCBzdHJpZGUpOworICAgIFN0b3JlOHgyeDJfTkVPTihvcDAsIG9xMCwgdSArIDAgKiBzdHJpZGUsIHYgKyAwICogc3RyaWRlLCBzdHJpZGUpOworICAgIFN0b3JlOHgyeDJfTkVPTihvcTEsIG9xMiwgdSArIDIgKiBzdHJpZGUsIHYgKyAyICogc3RyaWRlLCBzdHJpZGUpOworICB9Cit9CitzdGF0aWMgdm9pZCBWRmlsdGVyOGlfTkVPTih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICB1ICs9IDQgKiBzdHJpZGU7CisgIHYgKz0gNCAqIHN0cmlkZTsKKyAgTG9hZDh4OHgyX05FT04odSwgdiwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDEsIG9wMCwgb3EwLCBvcTE7CisgICAgRG9GaWx0ZXI0X05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldl9tYXNrLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExKTsKKyAgICBTdG9yZTh4NHgyX05FT04ob3AxLCBvcDAsIG9xMCwgb3ExLCB1LCB2LCBzdHJpZGUpOworICB9Cit9CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCitzdGF0aWMgdm9pZCBIRmlsdGVyOF9ORU9OKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgTG9hZDh4OHgyVF9ORU9OKHUsIHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMjsKKyAgICBEb0ZpbHRlcjZfTkVPTihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXZfbWFzaywKKyAgICAgICAgICAgICAgICAgICAmb3AyLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExLCAmb3EyKTsKKyAgICBTdG9yZTZ4OHgyX05FT04ob3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMiwgdSwgdiwgc3RyaWRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOGlfTkVPTih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICB1ICs9IDQ7CisgIHYgKz0gNDsKKyAgTG9hZDh4OHgyVF9ORU9OKHUsIHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AxLCBvcDAsIG9xMCwgb3ExOworICAgIERvRmlsdGVyNF9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXZfbWFzaywgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSk7CisgICAgU3RvcmU0eDh4Ml9ORU9OKG9wMSwgb3AwLCBvcTAsIG9xMSwgdSwgdiwgc3RyaWRlKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludmVyc2UgdHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCisKKy8vIFRlY2huaWNhbGx5IHRoZXNlIGFyZSB1bnNpZ25lZCBidXQgdnFkbXVsaCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzaWduZWQuCisvLyB2cWRtdWxoIHJldHVybnMgaGlnaCBoYWxmIChlZmZlY3RpdmVseSA+PiAxNikgYnV0IGFsc28gZG91YmxlcyB0aGUgdmFsdWUsCisvLyBjaGFuZ2luZyB0aGUgPj4gMTYgdG8gPj4gMTUgYW5kIHJlcXVpcmluZyBhbiBhZGRpdGlvbmFsID4+IDEuCisvLyBXZSB1c2UgdGhpcyB0byBvdXIgYWR2YW50YWdlIHdpdGgga0MyLiBUaGUgY2Fub25pY2FsIHZhbHVlIGlzIDM1NDY4LgorLy8gSG93ZXZlciwgdGhlIGhpZ2ggYml0IGlzIHNldCBzbyB0cmVhdGluZyBpdCBhcyBzaWduZWQgd2lsbCBnaXZlIGluY29ycmVjdAorLy8gcmVzdWx0cy4gV2UgYXZvaWQgdGhpcyBieSBkb3duIHNoaWZ0aW5nIGJ5IDEgaGVyZSB0byBjbGVhciB0aGUgaGlnaGVzdCBiaXQuCisvLyBDb21iaW5lZCB3aXRoIHRoZSBkb3VibGluZyBlZmZlY3Qgb2YgdnFkbXVsaCB3ZSBnZXQgPj4gMTYuCisvLyBUaGlzIGNhbiBub3QgYmUgYXBwbGllZCB0byBrQzEgYmVjYXVzZSB0aGUgbG93ZXN0IGJpdCBpcyBzZXQuIERvd24gc2hpZnRpbmcKKy8vIHRoZSBjb25zdGFudCB3b3VsZCByZWR1Y2UgcHJlY2lzaW9uLgorCisvLyBsaWJ3ZWJwIHVzZXMgYSB0cmljayB0byBhdm9pZCBzb21lIGV4dHJhIGFkZGl0aW9uIHRoYXQgbGlidnB4IGRvZXMuCisvLyBJbnN0ZWFkIG9mOgorLy8gdGVtcDIgPSBpcFsxMl0gKyAoKGlwWzEyXSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7CisvLyBsaWJ3ZWJwIGFkZHMgMSA8PCAxNiB0byBjb3NwaThzcXJ0Mm1pbnVzMSAoa0MxKS4gSG93ZXZlciwgdGhpcyBjYXVzZXMgdGhlCisvLyBzYW1lIGlzc3VlIHdpdGgga0MxIGFuZCB2cWRtdWxoIHRoYXQgd2Ugd29yayBhcm91bmQgYnkgZG93biBzaGlmdGluZyBrQzIKKworc3RhdGljIGNvbnN0IGludDE2X3Qga0MxID0gMjAwOTE7CitzdGF0aWMgY29uc3QgaW50MTZfdCBrQzIgPSAxNzczNDsgIC8vIGhhbGYgb2Yga0MyLCBhY3R1YWxseS4gU2VlIGNvbW1lbnQgYWJvdmUuCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0lOVFJJTlNJQ1MpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcmFuc3Bvc2U4eDJfTkVPTihjb25zdCBpbnQxNng4X3QgaW4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2eDh4Ml90KiBjb25zdCBvdXQpIHsKKyAgLy8gYTAgYTEgYTIgYTMgfCBiMCBiMSBiMiBiMyAgID0+IGEwIGIwIGMwIGQwIHwgYTEgYjEgYzEgZDEKKyAgLy8gYzAgYzEgYzIgYzMgfCBkMCBkMSBkMiBkMyAgICAgIGEyIGIyIGMyIGQyIHwgYTMgYjMgYzMgZDMKKyAgY29uc3QgaW50MTZ4OHgyX3QgdG1wMCA9IHZ6aXBxX3MxNihpbjAsIGluMSk7ICAgLy8gYTAgYzAgYTEgYzEgYTIgYzIgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIwIGQwIGIxIGQxIGIyIGQyIC4uLgorICAqb3V0ID0gdnppcHFfczE2KHRtcDAudmFsWzBdLCB0bXAwLnZhbFsxXSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRyYW5zZm9ybVBhc3NfTkVPTihpbnQxNng4eDJfdCogY29uc3Qgcm93cykgeworICAvLyB7cm93c30gPSBpbjAgfCBpbjQKKyAgLy8gICAgICAgICAgaW44IHwgaW4xMgorICAvLyBCMSA9IGluNCB8IGluMTIKKyAgY29uc3QgaW50MTZ4OF90IEIxID0KKyAgICAgIHZjb21iaW5lX3MxNih2Z2V0X2hpZ2hfczE2KHJvd3MtPnZhbFswXSksIHZnZXRfaGlnaF9zMTYocm93cy0+dmFsWzFdKSk7CisgIC8vIEMwID0ga0MxICogaW40IHwga0MxICogaW4xMgorICAvLyBDMSA9IGtDMiAqIGluNCB8IGtDMiAqIGluMTIKKyAgY29uc3QgaW50MTZ4OF90IEMwID0gdnNyYXFfbl9zMTYoQjEsIHZxZG11bGhxX25fczE2KEIxLCBrQzEpLCAxKTsKKyAgY29uc3QgaW50MTZ4OF90IEMxID0gdnFkbXVsaHFfbl9zMTYoQjEsIGtDMik7CisgIGNvbnN0IGludDE2eDRfdCBhID0gdnFhZGRfczE2KHZnZXRfbG93X3MxNihyb3dzLT52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYocm93cy0+dmFsWzFdKSk7ICAgLy8gaW4wICsgaW44CisgIGNvbnN0IGludDE2eDRfdCBiID0gdnFzdWJfczE2KHZnZXRfbG93X3MxNihyb3dzLT52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYocm93cy0+dmFsWzFdKSk7ICAgLy8gaW4wIC0gaW44CisgIC8vIGMgPSBrQzIgKiBpbjQgLSBrQzEgKiBpbjEyCisgIC8vIGQgPSBrQzEgKiBpbjQgKyBrQzIgKiBpbjEyCisgIGNvbnN0IGludDE2eDRfdCBjID0gdnFzdWJfczE2KHZnZXRfbG93X3MxNihDMSksIHZnZXRfaGlnaF9zMTYoQzApKTsKKyAgY29uc3QgaW50MTZ4NF90IGQgPSB2cWFkZF9zMTYodmdldF9sb3dfczE2KEMwKSwgdmdldF9oaWdoX3MxNihDMSkpOworICBjb25zdCBpbnQxNng4X3QgRDAgPSB2Y29tYmluZV9zMTYoYSwgYik7ICAgICAgLy8gRDAgPSBhIHwgYgorICBjb25zdCBpbnQxNng4X3QgRDEgPSB2Y29tYmluZV9zMTYoZCwgYyk7ICAgICAgLy8gRDEgPSBkIHwgYworICBjb25zdCBpbnQxNng4X3QgRTAgPSB2cWFkZHFfczE2KEQwLCBEMSk7ICAgICAgLy8gYStkIHwgYitjCisgIGNvbnN0IGludDE2eDhfdCBFX3RtcCA9IHZxc3VicV9zMTYoRDAsIEQxKTsgICAvLyBhLWQgfCBiLWMKKyAgY29uc3QgaW50MTZ4OF90IEUxID0gdmNvbWJpbmVfczE2KHZnZXRfaGlnaF9zMTYoRV90bXApLCB2Z2V0X2xvd19zMTYoRV90bXApKTsKKyAgVHJhbnNwb3NlOHgyX05FT04oRTAsIEUxLCByb3dzKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lX05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQxNng4eDJfdCByb3dzOworICBJTklUX1ZFQ1RPUjIocm93cywgdmxkMXFfczE2KGluICsgMCksIHZsZDFxX3MxNihpbiArIDgpKTsKKyAgVHJhbnNmb3JtUGFzc19ORU9OKCZyb3dzKTsKKyAgVHJhbnNmb3JtUGFzc19ORU9OKCZyb3dzKTsKKyAgQWRkNHg0X05FT04ocm93cy52YWxbMF0sIHJvd3MudmFsWzFdLCBkc3QpOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmVfTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBrQlBTID0gQlBTOworICAvLyBrQzEsIGtDMi4gUGFkZGVkIGJlY2F1c2UgdmxkMS4xNiBsb2FkcyA4IGJ5dGVzCisgIGNvbnN0IGludDE2X3QgY29uc3RhbnRzWzRdID0geyBrQzEsIGtDMiwgMCwgMCB9OworICAvKiBBZGFwdGVkIGZyb20gbGlidnB4OiB2cDgvY29tbW9uL2FybS9uZW9uL3Nob3J0aWRjdDR4NGxsbV9uZW9uLmFzbSAqLworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidmxkMS4xNiAgICAgICAgIHtxMSwgcTJ9LCBbJVtpbl1dICAgICAgICAgICBcbiIKKyAgICAidmxkMS4xNiAgICAgICAgIHtkMH0sIFslW2NvbnN0YW50c11dICAgICAgICBcbiIKKworICAgIC8qIGQyOiBpblswXQorICAgICAqIGQzOiBpbls4XQorICAgICAqIGQ0OiBpbls0XQorICAgICAqIGQ1OiBpblsxMl0KKyAgICAgKi8KKyAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIHE4ID0ge2luWzRdLCBpblsxMl19ICoga0MxICogMiA+PiAxNgorICAgICAqIHE5ID0ge2luWzRdLCBpblsxMl19ICoga0MyID4+IDE2CisgICAgICovCisgICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCisgICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMjIgPSBhID0gaW5bMF0gKyBpbls4XQorICAgICAqIGQyMyA9IGIgPSBpblswXSAtIGluWzhdCisgICAgICovCisgICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBUaGUgbXVsdGlwbGljYXRpb24gc2hvdWxkIGJlIHggKiBrQzEgPj4gMTYKKyAgICAgKiBIb3dldmVyLCB3aXRoIHZxZG11bGggd2UgZ2V0IHggKiBrQzEgKiAyID4+IDE2CisgICAgICogKG11bHRpcGx5LCBkb3VibGUsIHJldHVybiBoaWdoIGhhbGYpCisgICAgICogV2UgYXZvaWRlZCB0aGlzIGluIGtDMiBieSBwcmUtc2hpZnRpbmcgdGhlIGNvbnN0YW50LgorICAgICAqIHE4ID0gaW5bNF0vWzEyXSAqIGtDMSA+PiAxNgorICAgICAqLworICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogQWRkIHtpbls0XSwgaW5bMTJdfSBiYWNrIGFmdGVyIHRoZSBtdWx0aXBsaWNhdGlvbi4gVGhpcyBpcyBoYW5kbGVkIGJ5CisgICAgICogYWRkaW5nIDEgPDwgMTYgdG8ga0MxIGluIHRoZSBsaWJ3ZWJwIEMgY29kZS4KKyAgICAgKi8KKyAgICAidnFhZGQuczE2ICAgICAgIHE4LCBxMiwgcTggICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyMCA9IGMgPSBpbls0XSprQzIgLSBpblsxMl0qa0MxCisgICAgICogZDIxID0gZCA9IGluWzRdKmtDMSArIGluWzEyXSprQzIKKyAgICAgKi8KKyAgICAidnFzdWIuczE2ICAgICAgIGQyMCwgZDE4LCBkMTcgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQyMSwgZDE5LCBkMTYgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyID0gdG1wWzBdID0gYSArIGQKKyAgICAgKiBkMyA9IHRtcFsxXSA9IGIgKyBjCisgICAgICogZDQgPSB0bXBbMl0gPSBiIC0gYworICAgICAqIGQ1ID0gdG1wWzNdID0gYSAtIGQKKyAgICAgKi8KKyAgICAidnFhZGQuczE2ICAgICAgIGQyLCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQzLCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ0LCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ1LCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBxOCA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MxICogMiA+PiAxNgorICAgICAqIHE5ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzIgPj4gMTYKKyAgICAgKi8KKyAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKKyAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyMiA9IGEgPSB0bXBbMF0gKyB0bXBbOF0KKyAgICAgKiBkMjMgPSBiID0gdG1wWzBdIC0gdG1wWzhdCisgICAgICovCisgICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBTZWUgbG9uZyB3aW5kZWQgZXhwbGFuYXRpb25zIHByaW9yICovCisgICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQorICAgICAqIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCisgICAgICovCisgICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMiA9IHRtcFswXSA9IGEgKyBkCisgICAgICogZDMgPSB0bXBbMV0gPSBiICsgYworICAgICAqIGQ0ID0gdG1wWzJdID0gYiAtIGMKKyAgICAgKiBkNSA9IHRtcFszXSA9IGEgLSBkCisgICAgICovCisgICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ2WzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ3WzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKworICAgICJzdWIgICAgICAgICAlW2RzdF0sICVbZHN0XSwgJVtrQlBTXSwgbHNsICMyIFxuIgorCisgICAgLyogKHZhbCkgKyA0ID4+IDMgKi8KKyAgICAidnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogTXVzdCBhY2N1bXVsYXRlIGJlZm9yZSBzYXR1cmF0aW5nICovCisgICAgInZtb3ZsLnU4ICAgICAgICBxOCwgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtb3ZsLnU4ICAgICAgICBxOSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnFhZGQuczE2ICAgICAgIHExLCBxMSwgcTggICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIHEyLCBxMiwgcTkgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2cW1vdnVuLnMxNiAgICAgZDAsIHExICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cW1vdnVuLnMxNiAgICAgZDEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzdDEuMzIgICAgICAgICBkMFswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMFsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMVswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMVsxXSwgWyVbZHN0XV0gICAgICAgICAgICAgXG4iCisKKyAgICA6IFtpbl0gIityIihpbiksIFtkc3RdICIrciIoZHN0KSAgLyogbW9kaWZpZWQgcmVnaXN0ZXJzICovCisgICAgOiBba0JQU10gInIiKGtCUFMpLCBbY29uc3RhbnRzXSAiciIoY29uc3RhbnRzKSAgLyogY29uc3RhbnRzICovCisgICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiICAvKiBjbG9iYmVyZWQgKi8KKyAgKTsKK30KKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX0lOVFJJTlNJQ1MKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvX05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmVfTkVPTihpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIFRyYW5zZm9ybU9uZV9ORU9OKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDX05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQxNng4X3QgREMgPSB2ZHVwcV9uX3MxNihpblswXSk7CisgIEFkZDR4NF9ORU9OKERDLCBEQywgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBTVE9SRV9XSFQoZHN0LCBjb2wsIHJvd3MpIGRvIHsgICAgICAgICAgICAgICAgICBcCisgICpkc3QgPSB2Z2V0cV9sYW5lX3MzMihyb3dzLnZhbFswXSwgY29sKTsgKGRzdCkgKz0gMTY7IFwKKyAgKmRzdCA9IHZnZXRxX2xhbmVfczMyKHJvd3MudmFsWzFdLCBjb2wpOyAoZHN0KSArPSAxNjsgXAorICAqZHN0ID0gdmdldHFfbGFuZV9zMzIocm93cy52YWxbMl0sIGNvbCk7IChkc3QpICs9IDE2OyBcCisgICpkc3QgPSB2Z2V0cV9sYW5lX3MzMihyb3dzLnZhbFszXSwgY29sKTsgKGRzdCkgKz0gMTY7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVF9ORU9OKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgaW50MzJ4NHg0X3QgdG1wOworCisgIHsKKyAgICAvLyBMb2FkIHRoZSBzb3VyY2UuCisgICAgY29uc3QgaW50MTZ4NF90IGluMDBfMDMgPSB2bGQxX3MxNihpbiArIDApOworICAgIGNvbnN0IGludDE2eDRfdCBpbjA0XzA3ID0gdmxkMV9zMTYoaW4gKyA0KTsKKyAgICBjb25zdCBpbnQxNng0X3QgaW4wOF8xMSA9IHZsZDFfczE2KGluICsgOCk7CisgICAgY29uc3QgaW50MTZ4NF90IGluMTJfMTUgPSB2bGQxX3MxNihpbiArIDEyKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTAgPSB2YWRkbF9zMTYoaW4wMF8wMywgaW4xMl8xNSk7ICAvLyBpblswLi4zXSArIGluWzEyLi4xNV0KKyAgICBjb25zdCBpbnQzMng0X3QgYTEgPSB2YWRkbF9zMTYoaW4wNF8wNywgaW4wOF8xMSk7ICAvLyBpbls0Li43XSArIGluWzguLjExXQorICAgIGNvbnN0IGludDMyeDRfdCBhMiA9IHZzdWJsX3MxNihpbjA0XzA3LCBpbjA4XzExKTsgIC8vIGluWzQuLjddIC0gaW5bOC4uMTFdCisgICAgY29uc3QgaW50MzJ4NF90IGEzID0gdnN1YmxfczE2KGluMDBfMDMsIGluMTJfMTUpOyAgLy8gaW5bMC4uM10gLSBpblsxMi4uMTVdCisgICAgdG1wLnZhbFswXSA9IHZhZGRxX3MzMihhMCwgYTEpOworICAgIHRtcC52YWxbMV0gPSB2YWRkcV9zMzIoYTMsIGEyKTsKKyAgICB0bXAudmFsWzJdID0gdnN1YnFfczMyKGEwLCBhMSk7CisgICAgdG1wLnZhbFszXSA9IHZzdWJxX3MzMihhMywgYTIpOworICAgIC8vIEFycmFuZ2UgdGhlIHRlbXBvcmFyeSByZXN1bHRzIGNvbHVtbi13aXNlLgorICAgIHRtcCA9IFRyYW5zcG9zZTR4NF9ORU9OKHRtcCk7CisgIH0KKworICB7CisgICAgY29uc3QgaW50MzJ4NF90IGtDc3QzID0gdmR1cHFfbl9zMzIoMyk7CisgICAgY29uc3QgaW50MzJ4NF90IGRjID0gdmFkZHFfczMyKHRtcC52YWxbMF0sIGtDc3QzKTsgIC8vIGFkZCByb3VuZGVyCisgICAgY29uc3QgaW50MzJ4NF90IGEwID0gdmFkZHFfczMyKGRjLCB0bXAudmFsWzNdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTEgPSB2YWRkcV9zMzIodG1wLnZhbFsxXSwgdG1wLnZhbFsyXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyID0gdnN1YnFfczMyKHRtcC52YWxbMV0sIHRtcC52YWxbMl0pOworICAgIGNvbnN0IGludDMyeDRfdCBhMyA9IHZzdWJxX3MzMihkYywgdG1wLnZhbFszXSk7CisKKyAgICB0bXAudmFsWzBdID0gdmFkZHFfczMyKGEwLCBhMSk7CisgICAgdG1wLnZhbFsxXSA9IHZhZGRxX3MzMihhMywgYTIpOworICAgIHRtcC52YWxbMl0gPSB2c3VicV9zMzIoYTAsIGExKTsKKyAgICB0bXAudmFsWzNdID0gdnN1YnFfczMyKGEzLCBhMik7CisKKyAgICAvLyByaWdodCBzaGlmdCB0aGUgcmVzdWx0cyBieSAzLgorICAgIHRtcC52YWxbMF0gPSB2c2hycV9uX3MzMih0bXAudmFsWzBdLCAzKTsKKyAgICB0bXAudmFsWzFdID0gdnNocnFfbl9zMzIodG1wLnZhbFsxXSwgMyk7CisgICAgdG1wLnZhbFsyXSA9IHZzaHJxX25fczMyKHRtcC52YWxbMl0sIDMpOworICAgIHRtcC52YWxbM10gPSB2c2hycV9uX3MzMih0bXAudmFsWzNdLCAzKTsKKworICAgIFNUT1JFX1dIVChvdXQsIDAsIHRtcCk7CisgICAgU1RPUkVfV0hUKG91dCwgMSwgdG1wKTsKKyAgICBTVE9SRV9XSFQob3V0LCAyLCB0bXApOworICAgIFNUT1JFX1dIVChvdXQsIDMsIHRtcCk7CisgIH0KK30KKworI3VuZGVmIFNUT1JFX1dIVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1VTChhLCBiKSAoKChhKSAqIChiKSkgPj4gMTYpCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzNfTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIHN0YXRpYyBjb25zdCBpbnQga0MxX2Z1bGwgPSAyMDA5MSArICgxIDw8IDE2KTsKKyAgc3RhdGljIGNvbnN0IGludCBrQzJfZnVsbCA9IDM1NDY4OworICBjb25zdCBpbnQxNng0X3QgQSA9IHZsZDFfZHVwX3MxNihpbik7CisgIGNvbnN0IGludDE2eDRfdCBjNCA9IHZkdXBfbl9zMTYoTVVMKGluWzRdLCBrQzJfZnVsbCkpOworICBjb25zdCBpbnQxNng0X3QgZDQgPSB2ZHVwX25fczE2KE1VTChpbls0XSwga0MxX2Z1bGwpKTsKKyAgY29uc3QgaW50IGMxID0gTVVMKGluWzFdLCBrQzJfZnVsbCk7CisgIGNvbnN0IGludCBkMSA9IE1VTChpblsxXSwga0MxX2Z1bGwpOworICBjb25zdCB1aW50NjRfdCBjZCA9ICh1aW50NjRfdCkoIGQxICYgMHhmZmZmKSA8PCAgMCB8CisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSggYzEgJiAweGZmZmYpIDw8IDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKC1jMSAmIDB4ZmZmZikgPDwgMzIgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCkoLWQxICYgMHhmZmZmKSA8PCA0ODsKKyAgY29uc3QgaW50MTZ4NF90IENEID0gdmNyZWF0ZV9zMTYoY2QpOworICBjb25zdCBpbnQxNng0X3QgQiA9IHZxYWRkX3MxNihBLCBDRCk7CisgIGNvbnN0IGludDE2eDhfdCBtMF9tMSA9IHZjb21iaW5lX3MxNih2cWFkZF9zMTYoQiwgZDQpLCB2cWFkZF9zMTYoQiwgYzQpKTsKKyAgY29uc3QgaW50MTZ4OF90IG0yX20zID0gdmNvbWJpbmVfczE2KHZxc3ViX3MxNihCLCBjNCksIHZxc3ViX3MxNihCLCBkNCkpOworICBBZGQ0eDRfTkVPTihtMF9tMSwgbTJfbTMsIGRzdCk7Cit9CisjdW5kZWYgTVVMCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQKKworc3RhdGljIHZvaWQgREM0X05FT04odWludDhfdCogZHN0KSB7ICAgIC8vIERDCisgIGNvbnN0IHVpbnQ4eDhfdCBBID0gdmxkMV91OChkc3QgLSBCUFMpOyAgLy8gdG9wIHJvdworICBjb25zdCB1aW50MTZ4NF90IHAwID0gdnBhZGRsX3U4KEEpOyAgLy8gY2FzY2FkaW5nIHN1bW1hdGlvbiBvZiB0aGUgdG9wCisgIGNvbnN0IHVpbnQxNng0X3QgcDEgPSB2cGFkZF91MTYocDAsIHAwKTsKKyAgY29uc3QgdWludDE2eDhfdCBMMCA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMCAqIEJQUyAtIDEpKTsKKyAgY29uc3QgdWludDE2eDhfdCBMMSA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMSAqIEJQUyAtIDEpKTsKKyAgY29uc3QgdWludDE2eDhfdCBMMiA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMiAqIEJQUyAtIDEpKTsKKyAgY29uc3QgdWludDE2eDhfdCBMMyA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMyAqIEJQUyAtIDEpKTsKKyAgY29uc3QgdWludDE2eDhfdCBzMCA9IHZhZGRxX3UxNihMMCwgTDEpOworICBjb25zdCB1aW50MTZ4OF90IHMxID0gdmFkZHFfdTE2KEwyLCBMMyk7CisgIGNvbnN0IHVpbnQxNng4X3QgczAxID0gdmFkZHFfdTE2KHMwLCBzMSk7CisgIGNvbnN0IHVpbnQxNng4X3Qgc3VtID0gdmFkZHFfdTE2KHMwMSwgdmNvbWJpbmVfdTE2KHAxLCBwMSkpOworICBjb25zdCB1aW50OHg4X3QgZGMwID0gdnJzaHJuX25fdTE2KHN1bSwgMyk7ICAvLyAoc3VtICsgNCkgPj4gMworICBjb25zdCB1aW50OHg4X3QgZGMgPSB2ZHVwX2xhbmVfdTgoZGMwLCAwKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIGkgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRjKSwgMCk7CisgIH0KK30KKworLy8gVHJ1ZU1vdGlvbiAoNHg0ICsgOHg4KQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbl9ORU9OKHVpbnQ4X3QqIGRzdCwgaW50IHNpemUpIHsKKyAgY29uc3QgdWludDh4OF90IFRMID0gdmxkMV9kdXBfdTgoZHN0IC0gQlBTIC0gMSk7ICAvLyB0b3AtbGVmdCBwaXhlbCAnQVstMV0nCisgIGNvbnN0IHVpbnQ4eDhfdCBUID0gdmxkMV91OChkc3QgLSBCUFMpOyAgLy8gdG9wIHJvdyAnQVswLi4zXScKKyAgY29uc3QgaW50MTZ4OF90IGQgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgoVCwgVEwpKTsgIC8vIEFbY10gLSBBWy0xXQorICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7IHkgKz0gNCkgeworICAgIC8vIGxlZnQgZWRnZQorICAgIGNvbnN0IGludDE2eDhfdCBMMCA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMCAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDEgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDEgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwyID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAyICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMyA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMyAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjAgPSB2YWRkcV9zMTYoTDAsIGQpOyAgLy8gTFtyXSArIEFbY10gLSBBWy0xXQorICAgIGNvbnN0IGludDE2eDhfdCByMSA9IHZhZGRxX3MxNihMMSwgZCk7CisgICAgY29uc3QgaW50MTZ4OF90IHIyID0gdmFkZHFfczE2KEwyLCBkKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjMgPSB2YWRkcV9zMTYoTDMsIGQpOworICAgIC8vIFNhdHVyYXRlIGFuZCBzdG9yZSB0aGUgcmVzdWx0LgorICAgIGNvbnN0IHVpbnQzMngyX3QgcjBfdTMyID0gdnJlaW50ZXJwcmV0X3UzMl91OCh2cW1vdnVuX3MxNihyMCkpOworICAgIGNvbnN0IHVpbnQzMngyX3QgcjFfdTMyID0gdnJlaW50ZXJwcmV0X3UzMl91OCh2cW1vdnVuX3MxNihyMSkpOworICAgIGNvbnN0IHVpbnQzMngyX3QgcjJfdTMyID0gdnJlaW50ZXJwcmV0X3UzMl91OCh2cW1vdnVuX3MxNihyMikpOworICAgIGNvbnN0IHVpbnQzMngyX3QgcjNfdTMyID0gdnJlaW50ZXJwcmV0X3UzMl91OCh2cW1vdnVuX3MxNihyMykpOworICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHIwX3UzMiwgMCk7CisgICAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCByMV91MzIsIDApOworICAgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgcjJfdTMyLCAwKTsKKyAgICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHIzX3UzMiwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZzdDFfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCByMF91MzIpOworICAgICAgdnN0MV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHIxX3UzMik7CisgICAgICB2c3QxX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgcjJfdTMyKTsKKyAgICAgIHZzdDFfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCByM191MzIpOworICAgIH0KKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBUTTRfTkVPTih1aW50OF90KiBkc3QpIHsgVHJ1ZU1vdGlvbl9ORU9OKGRzdCwgNCk7IH0KKworc3RhdGljIHZvaWQgVkU0X05FT04odWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIC8vIE5COiBhdm9pZCB2bGQxX3U2NCBoZXJlIGFzIGFuIGFsaWdubWVudCBoaW50IG1heSBiZSBhZGRlZCAtPiBTSUdCVVMuCisgIGNvbnN0IHVpbnQ2NHgxX3QgQTAgPSB2cmVpbnRlcnByZXRfdTY0X3U4KHZsZDFfdTgoZHN0IC0gQlBTIC0gMSkpOyAgLy8gdG9wIHJvdworICBjb25zdCB1aW50NjR4MV90IEExID0gdnNocl9uX3U2NChBMCwgOCk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgQTIgPSB2c2hyX25fdTY0KEEwLCAxNik7CisgIGNvbnN0IHVpbnQ4eDhfdCBBQkNERUZHSCA9IHZyZWludGVycHJldF91OF91NjQoQTApOworICBjb25zdCB1aW50OHg4X3QgQkNERUZHSDAgPSB2cmVpbnRlcnByZXRfdThfdTY0KEExKTsKKyAgY29uc3QgdWludDh4OF90IENERUZHSDAwID0gdnJlaW50ZXJwcmV0X3U4X3U2NChBMik7CisgIGNvbnN0IHVpbnQ4eDhfdCBiID0gdmhhZGRfdTgoQUJDREVGR0gsIENERUZHSDAwKTsKKyAgY29uc3QgdWludDh4OF90IGF2ZyA9IHZyaGFkZF91OChiLCBCQ0RFRkdIMCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyBpICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChhdmcpLCAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBSRDRfTkVPTih1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLXJpZ2h0CisgIGNvbnN0IHVpbnQ4eDhfdCBYQUJDRF91OCA9IHZsZDFfdTgoZHN0IC0gQlBTIC0gMSk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgWEFCQ0QgPSB2cmVpbnRlcnByZXRfdTY0X3U4KFhBQkNEX3U4KTsKKyAgY29uc3QgdWludDY0eDFfdCBfX19fWEFCQyA9IHZzaGxfbl91NjQoWEFCQ0QsIDMyKTsKKyAgY29uc3QgdWludDMyX3QgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBjb25zdCB1aW50NjR4MV90IExLSklfX19fID0gdmNyZWF0ZV91NjQoTCB8IChLIDw8IDgpIHwgKEogPDwgMTYpIHwgKEkgPDwgMjQpKTsKKyAgY29uc3QgdWludDY0eDFfdCBMS0pJWEFCQyA9IHZvcnJfdTY0KExLSklfX19fLCBfX19fWEFCQyk7CisgIGNvbnN0IHVpbnQ4eDhfdCBLSklYQUJDXyA9IHZyZWludGVycHJldF91OF91NjQodnNocl9uX3U2NChMS0pJWEFCQywgOCkpOworICBjb25zdCB1aW50OHg4X3QgSklYQUJDX18gPSB2cmVpbnRlcnByZXRfdThfdTY0KHZzaHJfbl91NjQoTEtKSVhBQkMsIDE2KSk7CisgIGNvbnN0IHVpbnQ4X3QgRCA9IHZnZXRfbGFuZV91OChYQUJDRF91OCwgNCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBKSVhBQkNEXyA9IHZzZXRfbGFuZV91OChELCBKSVhBQkNfXywgNik7CisgIGNvbnN0IHVpbnQ4eDhfdCBMS0pJWEFCQ191OCA9IHZyZWludGVycHJldF91OF91NjQoTEtKSVhBQkMpOworICBjb25zdCB1aW50OHg4X3QgYXZnMSA9IHZoYWRkX3U4KEpJWEFCQ0RfLCBMS0pJWEFCQ191OCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcyID0gdnJoYWRkX3U4KGF2ZzEsIEtKSVhBQkNfKTsKKyAgY29uc3QgdWludDY0eDFfdCBhdmcyX3U2NCA9IHZyZWludGVycHJldF91NjRfdTgoYXZnMik7CisgIGNvbnN0IHVpbnQzMngyX3QgcjMgPSB2cmVpbnRlcnByZXRfdTMyX3U4KGF2ZzIpOworICBjb25zdCB1aW50MzJ4Ml90IHIyID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgOCkpOworICBjb25zdCB1aW50MzJ4Ml90IHIxID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgMTYpKTsKKyAgY29uc3QgdWludDMyeDJfdCByMCA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDI0KSk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHIwLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgcjEsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCByMiwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHIzLCAwKTsKK30KKworc3RhdGljIHZvaWQgTEQ0X05FT04odWludDhfdCogZHN0KSB7ICAgIC8vIERvd24tbGVmdAorICAvLyBOb3RlIHVzaW5nIHRoZSBzYW1lIHNoaWZ0IHRyaWNrIGFzIFZFNCgpIGlzIHNsb3dlciBoZXJlLgorICBjb25zdCB1aW50OHg4X3QgQUJDREVGR0ggPSB2bGQxX3U4KGRzdCAtIEJQUyArIDApOworICBjb25zdCB1aW50OHg4X3QgQkNERUZHSDAgPSB2bGQxX3U4KGRzdCAtIEJQUyArIDEpOworICBjb25zdCB1aW50OHg4X3QgQ0RFRkdIMDAgPSB2bGQxX3U4KGRzdCAtIEJQUyArIDIpOworICBjb25zdCB1aW50OHg4X3QgQ0RFRkdISDAgPSB2c2V0X2xhbmVfdTgoZHN0Wy1CUFMgKyA3XSwgQ0RFRkdIMDAsIDYpOworICBjb25zdCB1aW50OHg4X3QgYXZnMSA9IHZoYWRkX3U4KEFCQ0RFRkdILCBDREVGR0hIMCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcyID0gdnJoYWRkX3U4KGF2ZzEsIEJDREVGR0gwKTsKKyAgY29uc3QgdWludDY0eDFfdCBhdmcyX3U2NCA9IHZyZWludGVycHJldF91NjRfdTgoYXZnMik7CisgIGNvbnN0IHVpbnQzMngyX3QgcjAgPSB2cmVpbnRlcnByZXRfdTMyX3U4KGF2ZzIpOworICBjb25zdCB1aW50MzJ4Ml90IHIxID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgOCkpOworICBjb25zdCB1aW50MzJ4Ml90IHIyID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgMTYpKTsKKyAgY29uc3QgdWludDMyeDJfdCByMyA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDI0KSk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHIwLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgcjEsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCByMiwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHIzLCAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCitzdGF0aWMgdm9pZCBWRTh1dl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OHg4X3QgdG9wID0gdmxkMV91OChkc3QgLSBCUFMpOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIHZzdDFfdTgoZHN0ICsgaiAqIEJQUywgdG9wKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTh1dl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgY29uc3QgdWludDh4OF90IGxlZnQgPSB2bGQxX2R1cF91OChkc3QgLSAxKTsKKyAgICB2c3QxX3U4KGRzdCwgbGVmdCk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzhfTkVPTih1aW50OF90KiBkc3QsIGludCBkb190b3AsIGludCBkb19sZWZ0KSB7CisgIHVpbnQxNng4X3Qgc3VtX3RvcDsKKyAgdWludDE2eDhfdCBzdW1fbGVmdDsKKyAgdWludDh4OF90IGRjMDsKKworICBpZiAoZG9fdG9wKSB7CisgICAgY29uc3QgdWludDh4OF90IEEgPSB2bGQxX3U4KGRzdCAtIEJQUyk7ICAvLyB0b3Agcm93CisgICAgY29uc3QgdWludDE2eDRfdCBwMCA9IHZwYWRkbF91OChBKTsgIC8vIGNhc2NhZGluZyBzdW1tYXRpb24gb2YgdGhlIHRvcAorICAgIGNvbnN0IHVpbnQxNng0X3QgcDEgPSB2cGFkZF91MTYocDAsIHAwKTsKKyAgICBjb25zdCB1aW50MTZ4NF90IHAyID0gdnBhZGRfdTE2KHAxLCBwMSk7CisgICAgc3VtX3RvcCA9IHZjb21iaW5lX3UxNihwMiwgcDIpOworICB9CisKKyAgaWYgKGRvX2xlZnQpIHsKKyAgICBjb25zdCB1aW50MTZ4OF90IEwwID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAwICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDEgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDEgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMMiA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMiAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEwzID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAzICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDQgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDQgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMNSA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgNSAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEw2ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyA2ICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDcgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDcgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMCA9IHZhZGRxX3UxNihMMCwgTDEpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczEgPSB2YWRkcV91MTYoTDIsIEwzKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMyID0gdmFkZHFfdTE2KEw0LCBMNSk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMyA9IHZhZGRxX3UxNihMNiwgTDcpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczAxID0gdmFkZHFfdTE2KHMwLCBzMSk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMjMgPSB2YWRkcV91MTYoczIsIHMzKTsKKyAgICBzdW1fbGVmdCA9IHZhZGRxX3UxNihzMDEsIHMyMyk7CisgIH0KKworICBpZiAoZG9fdG9wICYmIGRvX2xlZnQpIHsKKyAgICBjb25zdCB1aW50MTZ4OF90IHN1bSA9IHZhZGRxX3UxNihzdW1fbGVmdCwgc3VtX3RvcCk7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bSwgNCk7CisgIH0gZWxzZSBpZiAoZG9fdG9wKSB7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bV90b3AsIDMpOworICB9IGVsc2UgaWYgKGRvX2xlZnQpIHsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtX2xlZnQsIDMpOworICB9IGVsc2UgeworICAgIGRjMCA9IHZkdXBfbl91OCgweDgwKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCB1aW50OHg4X3QgZGMgPSB2ZHVwX2xhbmVfdTgoZGMwLCAwKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICB2c3QxX3UzMigodWludDMyX3QqKShkc3QgKyBpICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkYykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzh1dl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzhfTkVPTihkc3QsIDEsIDEpOyB9CitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wX05FT04odWludDhfdCogZHN0KSB7IERDOF9ORU9OKGRzdCwgMCwgMSk7IH0KK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0X05FT04odWludDhfdCogZHN0KSB7IERDOF9ORU9OKGRzdCwgMSwgMCk7IH0KK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0X05FT04odWludDhfdCogZHN0KSB7IERDOF9ORU9OKGRzdCwgMCwgMCk7IH0KKworc3RhdGljIHZvaWQgVE04dXZfTkVPTih1aW50OF90KiBkc3QpIHsgVHJ1ZU1vdGlvbl9ORU9OKGRzdCwgOCk7IH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDE2eDE2CisKK3N0YXRpYyB2b2lkIFZFMTZfTkVPTih1aW50OF90KiBkc3QpIHsgICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4eDE2X3QgdG9wID0gdmxkMXFfdTgoZHN0IC0gQlBTKTsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgdnN0MXFfdTgoZHN0ICsgaiAqIEJQUywgdG9wKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTE2X05FT04odWludDhfdCogZHN0KSB7ICAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbGVmdCA9IHZsZDFxX2R1cF91OChkc3QgLSAxKTsKKyAgICB2c3QxcV91OChkc3QsIGxlZnQpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNl9ORU9OKHVpbnQ4X3QqIGRzdCwgaW50IGRvX3RvcCwgaW50IGRvX2xlZnQpIHsKKyAgdWludDE2eDhfdCBzdW1fdG9wOworICB1aW50MTZ4OF90IHN1bV9sZWZ0OworICB1aW50OHg4X3QgZGMwOworCisgIGlmIChkb190b3ApIHsKKyAgICBjb25zdCB1aW50OHgxNl90IEEgPSB2bGQxcV91OChkc3QgLSBCUFMpOyAgLy8gdG9wIHJvdworICAgIGNvbnN0IHVpbnQxNng4X3QgcDAgPSB2cGFkZGxxX3U4KEEpOyAgLy8gY2FzY2FkaW5nIHN1bW1hdGlvbiBvZiB0aGUgdG9wCisgICAgY29uc3QgdWludDE2eDRfdCBwMSA9IHZhZGRfdTE2KHZnZXRfbG93X3UxNihwMCksIHZnZXRfaGlnaF91MTYocDApKTsKKyAgICBjb25zdCB1aW50MTZ4NF90IHAyID0gdnBhZGRfdTE2KHAxLCBwMSk7CisgICAgY29uc3QgdWludDE2eDRfdCBwMyA9IHZwYWRkX3UxNihwMiwgcDIpOworICAgIHN1bV90b3AgPSB2Y29tYmluZV91MTYocDMsIHAzKTsKKyAgfQorCisgIGlmIChkb19sZWZ0KSB7CisgICAgaW50IGk7CisgICAgc3VtX2xlZnQgPSB2ZHVwcV9uX3UxNigwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gOCkgeworICAgICAgY29uc3QgdWludDE2eDhfdCBMMCA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyAwKSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDEgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgMSkgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEwyID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDIpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMMyA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyAzKSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDQgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgNCkgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEw1ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDUpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMNiA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyA2KSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDcgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgNykgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMwID0gdmFkZHFfdTE2KEwwLCBMMSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMxID0gdmFkZHFfdTE2KEwyLCBMMyk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMyID0gdmFkZHFfdTE2KEw0LCBMNSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMzID0gdmFkZHFfdTE2KEw2LCBMNyk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMwMSA9IHZhZGRxX3UxNihzMCwgczEpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMjMgPSB2YWRkcV91MTYoczIsIHMzKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3Qgc3VtID0gdmFkZHFfdTE2KHMwMSwgczIzKTsKKyAgICAgIHN1bV9sZWZ0ID0gdmFkZHFfdTE2KHN1bV9sZWZ0LCBzdW0pOworICAgIH0KKyAgfQorCisgIGlmIChkb190b3AgJiYgZG9fbGVmdCkgeworICAgIGNvbnN0IHVpbnQxNng4X3Qgc3VtID0gdmFkZHFfdTE2KHN1bV9sZWZ0LCBzdW1fdG9wKTsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtLCA1KTsKKyAgfSBlbHNlIGlmIChkb190b3ApIHsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtX3RvcCwgNCk7CisgIH0gZWxzZSBpZiAoZG9fbGVmdCkgeworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW1fbGVmdCwgNCk7CisgIH0gZWxzZSB7CisgICAgZGMwID0gdmR1cF9uX3U4KDB4ODApOworICB9CisKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZGMgPSB2ZHVwcV9sYW5lX3U4KGRjMCwgMCk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIHZzdDFxX3U4KGRzdCArIGkgKiBCUFMsIGRjKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNlRvcExlZnRfTkVPTih1aW50OF90KiBkc3QpIHsgREMxNl9ORU9OKGRzdCwgMSwgMSk7IH0KK3N0YXRpYyB2b2lkIERDMTZOb1RvcF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzE2X05FT04oZHN0LCAwLCAxKTsgfQorc3RhdGljIHZvaWQgREMxNk5vTGVmdF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzE2X05FT04oZHN0LCAxLCAwKTsgfQorc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzE2X05FT04oZHN0LCAwLCAwKTsgfQorCitzdGF0aWMgdm9pZCBUTTE2X05FT04odWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBUTCA9IHZsZDFfZHVwX3U4KGRzdCAtIEJQUyAtIDEpOyAgLy8gdG9wLWxlZnQgcGl4ZWwgJ0FbLTFdJworICBjb25zdCB1aW50OHgxNl90IFQgPSB2bGQxcV91OChkc3QgLSBCUFMpOyAgLy8gdG9wIHJvdyAnQVswLi4xNV0nCisgIC8vIEFbY10gLSBBWy0xXQorICBjb25zdCBpbnQxNng4X3QgZF9sbyA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh2Z2V0X2xvd191OChUKSwgVEwpKTsKKyAgY29uc3QgaW50MTZ4OF90IGRfaGkgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgodmdldF9oaWdoX3U4KFQpLCBUTCkpOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2OyB5ICs9IDQpIHsKKyAgICAvLyBsZWZ0IGVkZ2UKKyAgICBjb25zdCBpbnQxNng4X3QgTDAgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDAgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwxID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAxICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMiA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMiAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDMgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDMgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IHIwX2xvID0gdmFkZHFfczE2KEwwLCBkX2xvKTsgIC8vIExbcl0gKyBBW2NdIC0gQVstMV0KKyAgICBjb25zdCBpbnQxNng4X3QgcjFfbG8gPSB2YWRkcV9zMTYoTDEsIGRfbG8pOworICAgIGNvbnN0IGludDE2eDhfdCByMl9sbyA9IHZhZGRxX3MxNihMMiwgZF9sbyk7CisgICAgY29uc3QgaW50MTZ4OF90IHIzX2xvID0gdmFkZHFfczE2KEwzLCBkX2xvKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjBfaGkgPSB2YWRkcV9zMTYoTDAsIGRfaGkpOworICAgIGNvbnN0IGludDE2eDhfdCByMV9oaSA9IHZhZGRxX3MxNihMMSwgZF9oaSk7CisgICAgY29uc3QgaW50MTZ4OF90IHIyX2hpID0gdmFkZHFfczE2KEwyLCBkX2hpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjNfaGkgPSB2YWRkcV9zMTYoTDMsIGRfaGkpOworICAgIC8vIFNhdHVyYXRlIGFuZCBzdG9yZSB0aGUgcmVzdWx0LgorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MCA9IHZjb21iaW5lX3U4KHZxbW92dW5fczE2KHIwX2xvKSwgdnFtb3Z1bl9zMTYocjBfaGkpKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHJvdzEgPSB2Y29tYmluZV91OCh2cW1vdnVuX3MxNihyMV9sbyksIHZxbW92dW5fczE2KHIxX2hpKSk7CisgICAgY29uc3QgdWludDh4MTZfdCByb3cyID0gdmNvbWJpbmVfdTgodnFtb3Z1bl9zMTYocjJfbG8pLCB2cW1vdnVuX3MxNihyMl9oaSkpOworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MyA9IHZjb21iaW5lX3U4KHZxbW92dW5fczE2KHIzX2xvKSwgdnFtb3Z1bl9zMTYocjNfaGkpKTsKKyAgICB2c3QxcV91OChkc3QgKyAwICogQlBTLCByb3cwKTsKKyAgICB2c3QxcV91OChkc3QgKyAxICogQlBTLCByb3cxKTsKKyAgICB2c3QxcV91OChkc3QgKyAyICogQlBTLCByb3cyKTsKKyAgICB2c3QxcV91OChkc3QgKyAzICogQlBTLCByb3czKTsKKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKSB7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVR3b19ORU9OOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzNfTkVPTjsKKyAgVlA4VHJhbnNmb3JtREMgPSBUcmFuc2Zvcm1EQ19ORU9OOworICBWUDhUcmFuc2Zvcm1XSFQgPSBUcmFuc2Zvcm1XSFRfTkVPTjsKKworICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTZfTkVPTjsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmlfTkVPTjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2X05FT047CisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aV9ORU9OOworI2VuZGlmCisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjhfTkVPTjsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpX05FT047CisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4X05FT047CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aV9ORU9OOworI2VuZGlmCisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNl9ORU9OOworICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTZfTkVPTjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlfTkVPTjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmlfTkVPTjsKKworICBWUDhQcmVkTHVtYTRbMF0gPSBEQzRfTkVPTjsKKyAgVlA4UHJlZEx1bWE0WzFdID0gVE00X05FT047CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNF9ORU9OOworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDRfTkVPTjsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0X05FT047CisKKyAgVlA4UHJlZEx1bWExNlswXSA9IERDMTZUb3BMZWZ0X05FT047CisgIFZQOFByZWRMdW1hMTZbMV0gPSBUTTE2X05FT047CisgIFZQOFByZWRMdW1hMTZbMl0gPSBWRTE2X05FT047CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2X05FT047CisgIFZQOFByZWRMdW1hMTZbNF0gPSBEQzE2Tm9Ub3BfTkVPTjsKKyAgVlA4UHJlZEx1bWExNls1XSA9IERDMTZOb0xlZnRfTkVPTjsKKyAgVlA4UHJlZEx1bWExNls2XSA9IERDMTZOb1RvcExlZnRfTkVPTjsKKworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2X05FT047CisgIFZQOFByZWRDaHJvbWE4WzFdID0gVE04dXZfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbMl0gPSBWRTh1dl9ORU9OOworICBWUDhQcmVkQ2hyb21hOFszXSA9IEhFOHV2X05FT047CisgIFZQOFByZWRDaHJvbWE4WzRdID0gREM4dXZOb1RvcF9ORU9OOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0X05FT047CisgIFZQOFByZWRDaHJvbWE4WzZdID0gREM4dXZOb1RvcExlZnRfTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4NDBmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTIuYwpAQCAtMCwwICsxLDEyMjcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2Ygc29tZSBkZWNvZGluZyBmdW5jdGlvbnMgKGlkY3QsIGxvb3AgZmlsdGVyaW5nKS4KKy8vCisvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKy8vICAgICAgICAgY2R1dml2aWVyQGdvb2dsZS5jb20gKENocmlzdGlhbiBEdXZpdmllcikKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKy8vIFRoZSAzLWNvZWZmIHNwYXJzZSB0cmFuc2Zvcm0gaW4gU1NFMiBpcyBub3QgcmVhbGx5IGZhc3RlciB0aGFuIHRoZSBwbGFpbi1DCisvLyBvbmUgaXQgc2VlbXMgPT4gZGlzYWJsZSBpdCBieSBkZWZhdWx0LiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBlbmFibGU6CisjaWYgIWRlZmluZWQoVVNFX1RSQU5TRk9STV9BQzMpCisjZGVmaW5lIFVTRV9UUkFOU0ZPUk1fQUMzIDAgICAvLyBBTFRFUk5BVEVfQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybV9TU0UyKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgMTYtYml0IGZpeGVkIHBvaW50IHZlcnNpb25zIG9mIHR3bworICAvLyBtdWx0aXBseSBjb25zdGFudHM6CisgIC8vICAgIEsxID0gc3FydCgyKSAqIGNvcyAocGkvOCkgfj0gODU2MjcgLyAyXjE2CisgIC8vICAgIEsyID0gc3FydCgyKSAqIHNpbiAocGkvOCkgfj0gMzU0NjggLyAyXjE2CisgIC8vCisgIC8vIFRvIGJlIGFibGUgdG8gdXNlIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMsIHdlIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrIHRvCisgIC8vIGhhdmUgY29uc3RhbnRzIHdpdGhpbiByYW5nZToKKyAgLy8gLSBBc3NvY2lhdGVkIGNvbnN0YW50cyBhcmUgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgdGhlIDE2LWJpdCBmaXhlZCBwb2ludAorICAvLyAgIHZlcnNpb24gb2Ygb25lOgorICAvLyAgICAgIGsgPSBLIC0gKDEgPDwgMTYpICA9PiAgSyA9IGsgKyAoMSA8PCAxNikKKyAgLy8gICAgICBLMSA9IDg1MjY3ICA9PiAgazEgPSAgMjAwOTEKKyAgLy8gICAgICBLMiA9IDM1NDY4ICA9PiAgazIgPSAtMzAwNjgKKyAgLy8gLSBUaGUgbXVsdGlwbGljYXRpb24gb2YgYSB2YXJpYWJsZSBieSBhIGNvbnN0YW50IGJlY29tZSB0aGUgc3VtIG9mIHRoZQorICAvLyAgIHZhcmlhYmxlIGFuZCB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhhdCB2YXJpYWJsZSBieSB0aGUgYXNzb2NpYXRlZAorICAvLyAgIGNvbnN0YW50OgorICAvLyAgICAgICh4ICogSykgPj4gMTYgPSAoeCAqIChrICsgKDEgPDwgMTYpKSkgPj4gMTYgPSAoKHggKiBrICkgPj4gMTYpICsgeAorICBjb25zdCBfX20xMjhpIGsxID0gX21tX3NldDFfZXBpMTYoMjAwOTEpOworICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoLTMwMDY4KTsKKyAgX19tMTI4aSBUMCwgVDEsIFQyLCBUMzsKKworICAvLyBMb2FkIGFuZCBjb25jYXRlbmF0ZSB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyAod2UnbGwgZG8gdHdvIHRyYW5zZm9ybXMKKyAgLy8gaW4gcGFyYWxsZWwpLiBJbiB0aGUgY2FzZSBvZiBvbmx5IG9uZSB0cmFuc2Zvcm0sIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUKKyAgLy8gdmVjdG9ycyB3aWxsIGp1c3QgY29udGFpbiByYW5kb20gdmFsdWUgd2UnbGwgbmV2ZXIgdXNlIG5vciBzdG9yZS4KKyAgX19tMTI4aSBpbjAsIGluMSwgaW4yLCBpbjM7CisgIHsKKyAgICBpbjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblswXSk7CisgICAgaW4xID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bNF0pOworICAgIGluMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzhdKTsKKyAgICBpbjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsxMl0pOworICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIHggeCB4IHgKKyAgICAvLyBhMDEgYTExIGEyMSBhMzEgICB4IHggeCB4CisgICAgLy8gYTAyIGExMiBhMjIgYTMyICAgeCB4IHggeAorICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIHggeCB4IHgKKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICBjb25zdCBfX20xMjhpIGluQjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsxNl0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI0XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyOF0pOworICAgICAgaW4wID0gX21tX3VucGFja2xvX2VwaTY0KGluMCwgaW5CMCk7CisgICAgICBpbjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4xLCBpbkIxKTsKKyAgICAgIGluMiA9IF9tbV91bnBhY2tsb19lcGk2NChpbjIsIGluQjIpOworICAgICAgaW4zID0gX21tX3VucGFja2xvX2VwaTY0KGluMywgaW5CMyk7CisgICAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKKyAgICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQorICAgICAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCisgICAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKKyAgICB9CisgIH0KKworICAvLyBWZXJ0aWNhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGEgPSBfbW1fYWRkX2VwaTE2KGluMCwgaW4yKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSBfbW1fc3ViX2VwaTE2KGluMCwgaW4yKTsKKyAgICAvLyBjID0gTVVMKGluMSwgSzIpIC0gTVVMKGluMywgSzEpID0gTVVMKGluMSwgazIpIC0gTVVMKGluMywgazEpICsgaW4xIC0gaW4zCisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihpbjEsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX211bGhpX2VwaTE2KGluMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KGluMSwgaW4zKTsKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX3N1Yl9lcGkxNihjMSwgYzIpOworICAgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9hZGRfZXBpMTYoYzMsIGM0KTsKKyAgICAvLyBkID0gTVVMKGluMSwgSzEpICsgTVVMKGluMywgSzIpID0gTVVMKGluMSwgazEpICsgTVVMKGluMywgazIpICsgaW4xICsgaW4zCisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9tdWxoaV9lcGkxNihpbjEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KGluMywgazIpOworICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KGluMSwgaW4zKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2YigmdG1wMCwgJnRtcDEsICZ0bXAyLCAmdG1wMywgJlQwLCAmVDEsICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKKyAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCisgICAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpMTYoNCk7CisgICAgY29uc3QgX19tMTI4aSBkYyA9IF9tbV9hZGRfZXBpMTYoVDAsIGZvdXIpOworICAgIGNvbnN0IF9fbTEyOGkgYSA9ICBfbW1fYWRkX2VwaTE2KGRjLCBUMik7CisgICAgY29uc3QgX19tMTI4aSBiID0gIF9tbV9zdWJfZXBpMTYoZGMsIFQyKTsKKyAgICAvLyBjID0gTVVMKFQxLCBLMikgLSBNVUwoVDMsIEsxKSA9IE1VTChUMSwgazIpIC0gTVVMKFQzLCBrMSkgKyBUMSAtIFQzCisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihUMSwgVDMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoVDEsIEsxKSArIE1VTChUMywgSzIpID0gTVVMKFQxLCBrMSkgKyBNVUwoVDMsIGsyKSArIFQxICsgVDMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazIpOworICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKKyAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7CisKKyAgICAvLyBTZWNvbmQgcGFzcy4KKyAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDAgPSBfbW1fc3JhaV9lcGkxNih0bXAwLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQxID0gX21tX3NyYWlfZXBpMTYodG1wMSwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMiA9IF9tbV9zcmFpX2VwaTE2KHRtcDIsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDMgPSBfbW1fc3JhaV9lcGkxNih0bXAzLCAzKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZzaGlmdGVkMCwgJnNoaWZ0ZWQxLCAmc2hpZnRlZDIsICZzaGlmdGVkMywgJlQwLCAmVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmVDIsICZUMyk7CisgIH0KKworICAvLyBBZGQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gJ2RzdCcgYW5kIHN0b3JlLgorICB7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAvLyBMb2FkIHRoZSByZWZlcmVuY2UocykuCisgICAgX19tMTI4aSBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIGlmIChkb190d28pIHsKKyAgICAgIC8vIExvYWQgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgZHN0MCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDAgKiBCUFMpKTsKKyAgICAgIGRzdDEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAxICogQlBTKSk7CisgICAgICBkc3QyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMiAqIEJQUykpOworICAgICAgZHN0MyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDMgKiBCUFMpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTG9hZCBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIGRzdDAgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMCAqIEJQUykpOworICAgICAgZHN0MSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAxICogQlBTKSk7CisgICAgICBkc3QyID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDIgKiBCUFMpKTsKKyAgICAgIGRzdDMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMyAqIEJQUykpOworICAgIH0KKyAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgICBkc3QwID0gX21tX3VucGFja2xvX2VwaTgoZHN0MCwgemVybyk7CisgICAgZHN0MSA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDEsIHplcm8pOworICAgIGRzdDIgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QyLCB6ZXJvKTsKKyAgICBkc3QzID0gX21tX3VucGFja2xvX2VwaTgoZHN0MywgemVybyk7CisgICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KKyAgICBkc3QwID0gX21tX2FkZF9lcGkxNihkc3QwLCBUMCk7CisgICAgZHN0MSA9IF9tbV9hZGRfZXBpMTYoZHN0MSwgVDEpOworICAgIGRzdDIgPSBfbW1fYWRkX2VwaTE2KGRzdDIsIFQyKTsKKyAgICBkc3QzID0gX21tX2FkZF9lcGkxNihkc3QzLCBUMyk7CisgICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgICAgZHN0MCA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MCwgZHN0MCk7CisgICAgZHN0MSA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MSwgZHN0MSk7CisgICAgZHN0MiA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MiwgZHN0Mik7CisgICAgZHN0MyA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MywgZHN0Myk7CisgICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDAgKiBCUFMpLCBkc3QwKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAxICogQlBTKSwgZHN0MSk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMiAqIEJQUyksIGRzdDIpOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDMgKiBCUFMpLCBkc3QzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3RvcmUgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MCkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDEpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QyKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MykpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9UUkFOU0ZPUk1fQUMzID09IDEpCisjZGVmaW5lIE1VTChhLCBiKSAoKChhKSAqIChiKSkgPj4gMTYpCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworICBzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworICBjb25zdCBfX20xMjhpIEEgPSBfbW1fc2V0MV9lcGkxNihpblswXSArIDQpOworICBjb25zdCBfX20xMjhpIGM0ID0gX21tX3NldDFfZXBpMTYoTVVMKGluWzRdLCBrQzIpKTsKKyAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9zZXQxX2VwaTE2KE1VTChpbls0XSwga0MxKSk7CisgIGNvbnN0IGludCBjMSA9IE1VTChpblsxXSwga0MyKTsKKyAgY29uc3QgaW50IGQxID0gTVVMKGluWzFdLCBrQzEpOworICBjb25zdCBfX20xMjhpIENEID0gX21tX3NldF9lcGkxNigwLCAwLCAwLCAwLCAtZDEsIC1jMSwgYzEsIGQxKTsKKyAgY29uc3QgX19tMTI4aSBCID0gX21tX2FkZHNfZXBpMTYoQSwgQ0QpOworICBjb25zdCBfX20xMjhpIG0wID0gX21tX2FkZHNfZXBpMTYoQiwgZDQpOworICBjb25zdCBfX20xMjhpIG0xID0gX21tX2FkZHNfZXBpMTYoQiwgYzQpOworICBjb25zdCBfX20xMjhpIG0yID0gX21tX3N1YnNfZXBpMTYoQiwgYzQpOworICBjb25zdCBfX20xMjhpIG0zID0gX21tX3N1YnNfZXBpMTYoQiwgZDQpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAvLyBMb2FkIHRoZSBzb3VyY2UgcGl4ZWxzLgorICBfX20xMjhpIGRzdDAgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMCAqIEJQUykpOworICBfX20xMjhpIGRzdDEgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMSAqIEJQUykpOworICBfX20xMjhpIGRzdDIgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMiAqIEJQUykpOworICBfX20xMjhpIGRzdDMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMyAqIEJQUykpOworICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgZHN0MCA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDAsIHplcm8pOworICBkc3QxID0gX21tX3VucGFja2xvX2VwaTgoZHN0MSwgemVybyk7CisgIGRzdDIgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QyLCB6ZXJvKTsKKyAgZHN0MyA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDMsIHplcm8pOworICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtLgorICBkc3QwID0gX21tX2FkZHNfZXBpMTYoZHN0MCwgX21tX3NyYWlfZXBpMTYobTAsIDMpKTsKKyAgZHN0MSA9IF9tbV9hZGRzX2VwaTE2KGRzdDEsIF9tbV9zcmFpX2VwaTE2KG0xLCAzKSk7CisgIGRzdDIgPSBfbW1fYWRkc19lcGkxNihkc3QyLCBfbW1fc3JhaV9lcGkxNihtMiwgMykpOworICBkc3QzID0gX21tX2FkZHNfZXBpMTYoZHN0MywgX21tX3NyYWlfZXBpMTYobTMsIDMpKTsKKyAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgIGRzdDAgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDAsIGRzdDApOworICBkc3QxID0gX21tX3BhY2t1c19lcGkxNihkc3QxLCBkc3QxKTsKKyAgZHN0MiA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MiwgZHN0Mik7CisgIGRzdDMgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDMsIGRzdDMpOworICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDEpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDIpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDMpKTsKK30KKyN1bmRlZiBNVUwKKyNlbmRpZiAgIC8vIFVTRV9UUkFOU0ZPUk1fQUMzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb29wIEZpbHRlciAoUGFyYWdyYXBoIDE1KQorCisvLyBDb21wdXRlIGFicyhwIC0gcSkgPSBzdWJzKHAgLSBxKSBPUiBzdWJzKHEgLSBwKQorI2RlZmluZSBNTV9BQlMocCwgcSkgIF9tbV9vcl9zaTEyOCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3Vic19lcHU4KChxKSwgKHApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N1YnNfZXB1OCgocCksIChxKSkpCisKKy8vIFNoaWZ0IGVhY2ggYnl0ZSBvZiAieCIgYnkgMyBiaXRzIHdoaWxlIHByZXNlcnZpbmcgYnkgdGhlIHNpZ24gYml0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2lnbmVkU2hpZnQ4Yl9TU0UyKF9fbTEyOGkqIGNvbnN0IHgpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBsb18wID0gX21tX3VucGFja2xvX2VwaTgoemVybywgKngpOworICBjb25zdCBfX20xMjhpIGhpXzAgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCAqeCk7CisgIGNvbnN0IF9fbTEyOGkgbG9fMSA9IF9tbV9zcmFpX2VwaTE2KGxvXzAsIDMgKyA4KTsKKyAgY29uc3QgX19tMTI4aSBoaV8xID0gX21tX3NyYWlfZXBpMTYoaGlfMCwgMyArIDgpOworICAqeCA9IF9tbV9wYWNrc19lcGkxNihsb18xLCBoaV8xKTsKK30KKworI2RlZmluZSBGTElQX1NJR05fQklUMihhLCBiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGEpID0gX21tX3hvcl9zaTEyOChhLCBzaWduX2JpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChiKSA9IF9tbV94b3Jfc2kxMjgoYiwgc2lnbl9iaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEZMSVBfU0lHTl9CSVQ0KGEsIGIsIGMsIGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihhLCBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDIoYywgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIGlucHV0L291dHB1dCBpcyB1aW50OF90CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXROb3RIRVZfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoLCBfX20xMjhpKiBjb25zdCBub3RfaGV2KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdF8xID0gTU1fQUJTKCpwMSwgKnAwKTsKKyAgY29uc3QgX19tMTI4aSB0XzIgPSBNTV9BQlMoKnExLCAqcTApOworCisgIGNvbnN0IF9fbTEyOGkgaCA9IF9tbV9zZXQxX2VwaTgoaGV2X3RocmVzaCk7CisgIGNvbnN0IF9fbTEyOGkgdF9tYXggPSBfbW1fbWF4X2VwdTgodF8xLCB0XzIpOworCisgIGNvbnN0IF9fbTEyOGkgdF9tYXhfaCA9IF9tbV9zdWJzX2VwdTgodF9tYXgsIGgpOworICAqbm90X2hldiA9IF9tbV9jbXBlcV9lcGk4KHRfbWF4X2gsIHplcm8pOyAgLy8gbm90X2hldiA8PSB0MSAmJiBub3RfaGV2IDw9IHQyCit9CisKKy8vIGlucHV0IHBpeGVscyBhcmUgaW50OF90CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRCYXNlRGVsdGFfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGRlbHRhKSB7CisgIC8vIGJld2FyZSBvZiBhZGRpdGlvbiBvcmRlciwgZm9yIHNhdHVyYXRpb24hCisgIGNvbnN0IF9fbTEyOGkgcDFfcTEgPSBfbW1fc3Vic19lcGk4KCpwMSwgKnExKTsgICAvLyBwMSAtIHExCisgIGNvbnN0IF9fbTEyOGkgcTBfcDAgPSBfbW1fc3Vic19lcGk4KCpxMCwgKnAwKTsgICAvLyBxMCAtIHAwCisgIGNvbnN0IF9fbTEyOGkgczEgPSBfbW1fYWRkc19lcGk4KHAxX3ExLCBxMF9wMCk7ICAvLyBwMSAtIHExICsgMSAqIChxMCAtIHAwKQorICBjb25zdCBfX20xMjhpIHMyID0gX21tX2FkZHNfZXBpOChxMF9wMCwgczEpOyAgICAgLy8gcDEgLSBxMSArIDIgKiAocTAgLSBwMCkKKyAgY29uc3QgX19tMTI4aSBzMyA9IF9tbV9hZGRzX2VwaTgocTBfcDAsIHMyKTsgICAgIC8vIHAxIC0gcTEgKyAzICogKHEwIC0gcDApCisgICpkZWx0YSA9IHMzOworfQorCisvLyBpbnB1dCBhbmQgb3V0cHV0IGFyZSBpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvU2ltcGxlRmlsdGVyX1NTRTIoX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBmbCkgeworICBjb25zdCBfX20xMjhpIGszID0gX21tX3NldDFfZXBpOCgzKTsKKyAgY29uc3QgX19tMTI4aSBrNCA9IF9tbV9zZXQxX2VwaTgoNCk7CisgIF9fbTEyOGkgdjMgPSBfbW1fYWRkc19lcGk4KCpmbCwgazMpOworICBfX20xMjhpIHY0ID0gX21tX2FkZHNfZXBpOCgqZmwsIGs0KTsKKworICBTaWduZWRTaGlmdDhiX1NTRTIoJnY0KTsgICAgICAgICAgICAgLy8gdjQgPj4gMworICBTaWduZWRTaGlmdDhiX1NTRTIoJnYzKTsgICAgICAgICAgICAgLy8gdjMgPj4gMworICAqcTAgPSBfbW1fc3Vic19lcGk4KCpxMCwgdjQpOyAgICAgICAgLy8gcTAgLT0gdjQKKyAgKnAwID0gX21tX2FkZHNfZXBpOCgqcDAsIHYzKTsgICAgICAgIC8vIHAwICs9IHYzCit9CisKKy8vIFVwZGF0ZXMgdmFsdWVzIG9mIDIgcGl4ZWxzIGF0IE1CIGVkZ2UgZHVyaW5nIGNvbXBsZXggZmlsdGVyaW5nLgorLy8gVXBkYXRlIG9wZXJhdGlvbnM6CisvLyBxID0gcSAtIGRlbHRhIGFuZCBwID0gcCArIGRlbHRhOyB3aGVyZSBkZWx0YSA9IFsoYV9oaSA+PiA3KSwgKGFfbG8gPj4gNyldCisvLyBQaXhlbHMgJ3BpJyBhbmQgJ3FpJyBhcmUgaW50OF90IG9uIGlucHV0LCB1aW50OF90IG9uIG91dHB1dCAoc2lnbiBmbGlwKS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZTJQaXhlbHNfU1NFMihfX20xMjhpKiBjb25zdCBwaSwgX19tMTI4aSogY29uc3QgcWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgYTBfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgYTBfaGkpIHsKKyAgY29uc3QgX19tMTI4aSBhMV9sbyA9IF9tbV9zcmFpX2VwaTE2KCphMF9sbywgNyk7CisgIGNvbnN0IF9fbTEyOGkgYTFfaGkgPSBfbW1fc3JhaV9lcGkxNigqYTBfaGksIDcpOworICBjb25zdCBfX20xMjhpIGRlbHRhID0gX21tX3BhY2tzX2VwaTE2KGExX2xvLCBhMV9oaSk7CisgIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOworICAqcGkgPSBfbW1fYWRkc19lcGk4KCpwaSwgZGVsdGEpOworICAqcWkgPSBfbW1fc3Vic19lcGk4KCpxaSwgZGVsdGEpOworICBGTElQX1NJR05fQklUMigqcGksICpxaSk7Cit9CisKKy8vIGlucHV0IHBpeGVscyBhcmUgdWludDhfdAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTmVlZHNGaWx0ZXJfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgX19tMTI4aSogY29uc3QgbWFzaykgeworICBjb25zdCBfX20xMjhpIG1fdGhyZXNoID0gX21tX3NldDFfZXBpOCh0aHJlc2gpOworICBjb25zdCBfX20xMjhpIHQxID0gTU1fQUJTKCpwMSwgKnExKTsgICAgICAgIC8vIGFicyhwMSAtIHExKQorICBjb25zdCBfX20xMjhpIGtGRSA9IF9tbV9zZXQxX2VwaTgoMHhGRSk7CisgIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fYW5kX3NpMTI4KHQxLCBrRkUpOyAgLy8gc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybworICBjb25zdCBfX20xMjhpIHQzID0gX21tX3NybGlfZXBpMTYodDIsIDEpOyAgIC8vIGFicyhwMSAtIHExKSAvIDIKKworICBjb25zdCBfX20xMjhpIHQ0ID0gTU1fQUJTKCpwMCwgKnEwKTsgICAgICAgIC8vIGFicyhwMCAtIHEwKQorICBjb25zdCBfX20xMjhpIHQ1ID0gX21tX2FkZHNfZXB1OCh0NCwgdDQpOyAgIC8vIGFicyhwMCAtIHEwKSAqIDIKKyAgY29uc3QgX19tMTI4aSB0NiA9IF9tbV9hZGRzX2VwdTgodDUsIHQzKTsgICAvLyBhYnMocDAtcTApKjIgKyBhYnMocDEtcTEpLzIKKworICBjb25zdCBfX20xMjhpIHQ3ID0gX21tX3N1YnNfZXB1OCh0NiwgbV90aHJlc2gpOyAgLy8gbWFzayA8PSBtX3RocmVzaAorICAqbWFzayA9IF9tbV9jbXBlcV9lcGk4KHQ3LCBfbW1fc2V0emVyb19zaTEyOCgpKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworCisvLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXIyX1NTRTIoX19tMTI4aSogY29uc3QgcDEsIF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTAsIF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCkgeworICBfX20xMjhpIGEsIG1hc2s7CisgIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOworICAvLyBjb252ZXJ0IHAxL3ExIHRvIGludDhfdCAoZm9yIEdldEJhc2VEZWx0YV9TU0UyKQorICBjb25zdCBfX20xMjhpIHAxcyA9IF9tbV94b3Jfc2kxMjgoKnAxLCBzaWduX2JpdCk7CisgIGNvbnN0IF9fbTEyOGkgcTFzID0gX21tX3hvcl9zaTEyOCgqcTEsIHNpZ25fYml0KTsKKworICBOZWVkc0ZpbHRlcl9TU0UyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsICZtYXNrKTsKKworICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7CisgIEdldEJhc2VEZWx0YV9TU0UyKCZwMXMsIHAwLCBxMCwgJnExcywgJmEpOworICBhID0gX21tX2FuZF9zaTEyOChhLCBtYXNrKTsgICAgIC8vIG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisgIERvU2ltcGxlRmlsdGVyX1NTRTIocDAsIHEwLCAmYSk7CisgIEZMSVBfU0lHTl9CSVQyKCpwMCwgKnEwKTsKK30KKworLy8gQXBwbGllcyBmaWx0ZXIgb24gNCBwaXhlbHMgKHAxLCBwMCwgcTAgYW5kIHExKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI0X1NTRTIoX19tMTI4aSogY29uc3QgcDEsIF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTAsIF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOworICBjb25zdCBfX20xMjhpIGs2NCA9IF9tbV9zZXQxX2VwaTgoNjQpOworICBjb25zdCBfX20xMjhpIGszID0gX21tX3NldDFfZXBpOCgzKTsKKyAgY29uc3QgX19tMTI4aSBrNCA9IF9tbV9zZXQxX2VwaTgoNCk7CisgIF9fbTEyOGkgbm90X2hldjsKKyAgX19tMTI4aSB0MSwgdDIsIHQzOworCisgIC8vIGNvbXB1dGUgaGV2IG1hc2sKKyAgR2V0Tm90SEVWX1NTRTIocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gsICZub3RfaGV2KTsKKworICAvLyBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKKyAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKKworICB0MSA9IF9tbV9zdWJzX2VwaTgoKnAxLCAqcTEpOyAgICAgICAgLy8gcDEgLSBxMQorICB0MSA9IF9tbV9hbmRub3Rfc2kxMjgobm90X2hldiwgdDEpOyAgLy8gaGV2KHAxIC0gcTEpCisgIHQyID0gX21tX3N1YnNfZXBpOCgqcTAsICpwMCk7ICAgICAgICAvLyBxMCAtIHAwCisgIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAxICogKHEwIC0gcDApCisgIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAyICogKHEwIC0gcDApCisgIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAzICogKHEwIC0gcDApCisgIHQxID0gX21tX2FuZF9zaTEyOCh0MSwgKm1hc2spOyAgICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgIHQyID0gX21tX2FkZHNfZXBpOCh0MSwgazMpOyAgICAgICAgLy8gMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDMKKyAgdDMgPSBfbW1fYWRkc19lcGk4KHQxLCBrNCk7ICAgICAgICAvLyAzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgNAorICBTaWduZWRTaGlmdDhiX1NTRTIoJnQyKTsgICAgICAgICAgIC8vICgzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgMykgPj4gMworICBTaWduZWRTaGlmdDhiX1NTRTIoJnQzKTsgICAgICAgICAgIC8vICgzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgNCkgPj4gMworICAqcDAgPSBfbW1fYWRkc19lcGk4KCpwMCwgdDIpOyAgICAgIC8vIHAwICs9IHQyCisgICpxMCA9IF9tbV9zdWJzX2VwaTgoKnEwLCB0Myk7ICAgICAgLy8gcTAgLT0gdDMKKyAgRkxJUF9TSUdOX0JJVDIoKnAwLCAqcTApOworCisgIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0byBzaWduZWQgKGEgKyAxKSA+PiAxIGNhbGN1bGF0aW9uCisgIHQyID0gX21tX2FkZF9lcGk4KHQzLCBzaWduX2JpdCk7CisgIHQzID0gX21tX2F2Z19lcHU4KHQyLCB6ZXJvKTsKKyAgdDMgPSBfbW1fc3ViX2VwaTgodDMsIGs2NCk7CisKKyAgdDMgPSBfbW1fYW5kX3NpMTI4KG5vdF9oZXYsIHQzKTsgICAvLyBpZiAhaGV2CisgICpxMSA9IF9tbV9zdWJzX2VwaTgoKnExLCB0Myk7ICAgICAgLy8gcTEgLT0gdDMKKyAgKnAxID0gX21tX2FkZHNfZXBpOCgqcDEsIHQzKTsgICAgICAvLyBwMSArPSB0MworICBGTElQX1NJR05fQklUMigqcDEsICpxMSk7Cit9CisKKy8vIEFwcGxpZXMgZmlsdGVyIG9uIDYgcGl4ZWxzIChwMiwgcDEsIHAwLCBxMCwgcTEgYW5kIHEyKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI2X1NTRTIoX19tMTI4aSogY29uc3QgcDIsIF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcDAsIF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTEsIF9fbTEyOGkqIGNvbnN0IHEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOworICBfX20xMjhpIGEsIG5vdF9oZXY7CisKKyAgLy8gY29tcHV0ZSBoZXYgbWFzaworICBHZXROb3RIRVZfU1NFMihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCwgJm5vdF9oZXYpOworCisgIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7CisgIEZMSVBfU0lHTl9CSVQyKCpwMiwgKnEyKTsKKyAgR2V0QmFzZURlbHRhX1NTRTIocDEsIHAwLCBxMCwgcTEsICZhKTsKKworICB7IC8vIGRvIHNpbXBsZSBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggaGV2CisgICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCAqbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKKyAgICBEb1NpbXBsZUZpbHRlcl9TU0UyKHAwLCBxMCwgJmYpOworICB9CisKKyAgeyAvLyBkbyBzdHJvbmcgZmlsdGVyIG9uIHBpeGVscyB3aXRoIG5vdCBoZXYKKyAgICBjb25zdCBfX20xMjhpIGs5ID0gX21tX3NldDFfZXBpMTYoMHgwOTAwKTsKKyAgICBjb25zdCBfX20xMjhpIGs2MyA9IF9tbV9zZXQxX2VwaTE2KDYzKTsKKworICAgIGNvbnN0IF9fbTEyOGkgbSA9IF9tbV9hbmRfc2kxMjgobm90X2hldiwgKm1hc2spOworICAgIGNvbnN0IF9fbTEyOGkgZiA9IF9tbV9hbmRfc2kxMjgoYSwgbSk7CisKKyAgICBjb25zdCBfX20xMjhpIGZfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBmKTsKKyAgICBjb25zdCBfX20xMjhpIGZfaGkgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCBmKTsKKworICAgIGNvbnN0IF9fbTEyOGkgZjlfbG8gPSBfbW1fbXVsaGlfZXBpMTYoZl9sbywgazkpOyAgICAvLyBGaWx0ZXIgKGxvKSAqIDkKKyAgICBjb25zdCBfX20xMjhpIGY5X2hpID0gX21tX211bGhpX2VwaTE2KGZfaGksIGs5KTsgICAgLy8gRmlsdGVyIChoaSkgKiA5CisKKyAgICBjb25zdCBfX20xMjhpIGEyX2xvID0gX21tX2FkZF9lcGkxNihmOV9sbywgazYzKTsgICAgLy8gRmlsdGVyICogOSArIDYzCisgICAgY29uc3QgX19tMTI4aSBhMl9oaSA9IF9tbV9hZGRfZXBpMTYoZjlfaGksIGs2Myk7ICAgIC8vIEZpbHRlciAqIDkgKyA2MworCisgICAgY29uc3QgX19tMTI4aSBhMV9sbyA9IF9tbV9hZGRfZXBpMTYoYTJfbG8sIGY5X2xvKTsgIC8vIEZpbHRlciAqIDE4ICsgNjMKKyAgICBjb25zdCBfX20xMjhpIGExX2hpID0gX21tX2FkZF9lcGkxNihhMl9oaSwgZjlfaGkpOyAgLy8gRmlsdGVyICogMTggKyA2MworCisgICAgY29uc3QgX19tMTI4aSBhMF9sbyA9IF9tbV9hZGRfZXBpMTYoYTFfbG8sIGY5X2xvKTsgIC8vIEZpbHRlciAqIDI3ICsgNjMKKyAgICBjb25zdCBfX20xMjhpIGEwX2hpID0gX21tX2FkZF9lcGkxNihhMV9oaSwgZjlfaGkpOyAgLy8gRmlsdGVyICogMjcgKyA2MworCisgICAgVXBkYXRlMlBpeGVsc19TU0UyKHAyLCBxMiwgJmEyX2xvLCAmYTJfaGkpOworICAgIFVwZGF0ZTJQaXhlbHNfU1NFMihwMSwgcTEsICZhMV9sbywgJmExX2hpKTsKKyAgICBVcGRhdGUyUGl4ZWxzX1NTRTIocDAsIHEwLCAmYTBfbG8sICZhMF9oaSk7CisgIH0KK30KKworLy8gcmVhZHMgOCByb3dzIGFjcm9zcyBhIHZlcnRpY2FsIGVkZ2UuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkOHg0X1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBwLCBfX20xMjhpKiBjb25zdCBxKSB7CisgIC8vIEEwID0gNjMgNjIgNjEgNjAgMjMgMjIgMjEgMjAgNDMgNDIgNDEgNDAgMDMgMDIgMDEgMDAKKyAgLy8gQTEgPSA3MyA3MiA3MSA3MCAzMyAzMiAzMSAzMCA1MyA1MiA1MSA1MCAxMyAxMiAxMSAxMAorICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NldF9lcGkzMigKKyAgICAgIFdlYlBNZW1Ub1VpbnQzMigmYls2ICogc3RyaWRlXSksIFdlYlBNZW1Ub1VpbnQzMigmYlsyICogc3RyaWRlXSksCisgICAgICBXZWJQTWVtVG9VaW50MzIoJmJbNCAqIHN0cmlkZV0pLCBXZWJQTWVtVG9VaW50MzIoJmJbMCAqIHN0cmlkZV0pKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zZXRfZXBpMzIoCisgICAgICBXZWJQTWVtVG9VaW50MzIoJmJbNyAqIHN0cmlkZV0pLCBXZWJQTWVtVG9VaW50MzIoJmJbMyAqIHN0cmlkZV0pLAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzUgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzEgKiBzdHJpZGVdKSk7CisKKyAgLy8gQjAgPSA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MCAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAorICAvLyBCMSA9IDczIDYzIDcyIDYyIDcxIDYxIDcwIDYwIDMzIDIzIDMyIDIyIDMxIDIxIDMwIDIwCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpOChBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2hpX2VwaTgoQTAsIEExKTsKKworICAvLyBDMCA9IDMzIDIzIDEzIDAzIDMyIDIyIDEyIDAyIDMxIDIxIDExIDAxIDMwIDIwIDEwIDAwCisgIC8vIEMxID0gNzMgNjMgNTMgNDMgNzIgNjIgNTIgNDIgNzEgNjEgNTEgNDEgNzAgNjAgNTAgNDAKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGkxNihCMCwgQjEpOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTE2KEIwLCBCMSk7CisKKyAgLy8gKnAgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAvLyAqcSA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICpwID0gX21tX3VucGFja2xvX2VwaTMyKEMwLCBDMSk7CisgICpxID0gX21tX3VucGFja2hpX2VwaTMyKEMwLCBDMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQxNng0X1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBwMSwgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLCBfX20xMjhpKiBjb25zdCBxMSkgeworICAvLyBBc3N1bWUgdGhlIHBpeGVscyBhcm91bmQgdGhlIGVkZ2UgKHwpIGFyZSBudW1iZXJlZCBhcyBmb2xsb3dzCisgIC8vICAgICAgICAgICAgICAgIDAwIDAxIHwgMDIgMDMKKyAgLy8gICAgICAgICAgICAgICAgMTAgMTEgfCAxMiAxMworICAvLyAgICAgICAgICAgICAgICAgLi4uICB8ICAuLi4KKyAgLy8gICAgICAgICAgICAgICAgZTAgZTEgfCBlMiBlMworICAvLyAgICAgICAgICAgICAgICBmMCBmMSB8IGYyIGYzCisgIC8vCisgIC8vIHIwIGlzIHBvaW50aW5nIHRvIHRoZSAwdGggcm93ICgwMCkKKyAgLy8gcjggaXMgcG9pbnRpbmcgdG8gdGhlIDh0aCByb3cgKDgwKQorCisgIC8vIExvYWQKKyAgLy8gcDEgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAvLyBxMCA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKKyAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MgorICBMb2FkOHg0X1NTRTIocjAsIHN0cmlkZSwgcDEsIHEwKTsKKyAgTG9hZDh4NF9TU0UyKHI4LCBzdHJpZGUsIHAwLCBxMSk7CisKKyAgeworICAgIC8vIHAxID0gZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgICAvLyBwMCA9IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCisgICAgLy8gcTAgPSBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MiA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAgIC8vIHExID0gZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKKyAgICBjb25zdCBfX20xMjhpIHQxID0gKnAxOworICAgIGNvbnN0IF9fbTEyOGkgdDIgPSAqcTA7CisgICAgKnAxID0gX21tX3VucGFja2xvX2VwaTY0KHQxLCAqcDApOworICAgICpwMCA9IF9tbV91bnBhY2toaV9lcGk2NCh0MSwgKnAwKTsKKyAgICAqcTAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDIsICpxMSk7CisgICAgKnExID0gX21tX3VucGFja2hpX2VwaTY0KHQyLCAqcTEpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNHg0X1NTRTIoX19tMTI4aSogY29uc3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgc3RyaWRlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBkc3QgKz0gc3RyaWRlKSB7CisgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgX21tX2N2dHNpMTI4X3NpMzIoKngpKTsKKyAgICAqeCA9IF9tbV9zcmxpX3NpMTI4KCp4LCA0KTsKKyAgfQorfQorCisvLyBUcmFuc3Bvc2UgYmFjayBhbmQgc3RvcmUKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMTZ4NF9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcjAsIHVpbnQ4X3QqIHI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBfX20xMjhpIHQxLCBwMV9zLCBwMF9zLCBxMF9zLCBxMV9zOworCisgIC8vIHAwID0gNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAgMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKKyAgLy8gcDEgPSBmMSBmMCBlMSBlMCBkMSBkMCBjMSBjMCBiMSBiMCBhMSBhMCA5MSA5MCA4MSA4MAorICB0MSA9ICpwMDsKKyAgcDBfcyA9IF9tbV91bnBhY2tsb19lcGk4KCpwMSwgdDEpOworICBwMV9zID0gX21tX3VucGFja2hpX2VwaTgoKnAxLCB0MSk7CisKKyAgLy8gcTAgPSA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorICAvLyBxMSA9IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCisgIHQxID0gKnEwOworICBxMF9zID0gX21tX3VucGFja2xvX2VwaTgodDEsICpxMSk7CisgIHExX3MgPSBfbW1fdW5wYWNraGlfZXBpOCh0MSwgKnExKTsKKworICAvLyBwMCA9IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwIDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgIC8vIHEwID0gNzMgNzIgNzEgNzAgNjMgNjIgNjEgNjAgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKKyAgdDEgPSBwMF9zOworICBwMF9zID0gX21tX3VucGFja2xvX2VwaTE2KHQxLCBxMF9zKTsKKyAgcTBfcyA9IF9tbV91bnBhY2toaV9lcGkxNih0MSwgcTBfcyk7CisKKyAgLy8gcDEgPSBiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMCA5MyA5MiA5MSA5MCA4MyA4MiA4MSA4MAorICAvLyBxMSA9IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCisgIHQxID0gcDFfczsKKyAgcDFfcyA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgcTFfcyk7CisgIHExX3MgPSBfbW1fdW5wYWNraGlfZXBpMTYodDEsIHExX3MpOworCisgIFN0b3JlNHg0X1NTRTIoJnAwX3MsIHIwLCBzdHJpZGUpOworICByMCArPSA0ICogc3RyaWRlOworICBTdG9yZTR4NF9TU0UyKCZxMF9zLCByMCwgc3RyaWRlKTsKKworICBTdG9yZTR4NF9TU0UyKCZwMV9zLCByOCwgc3RyaWRlKTsKKyAgcjggKz0gNCAqIHN0cmlkZTsKKyAgU3RvcmU0eDRfU1NFMigmcTFfcywgcjgsIHN0cmlkZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIC8vIExvYWQKKyAgX19tMTI4aSBwMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLTIgKiBzdHJpZGVdKTsKKyAgX19tMTI4aSBwMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0pOworICBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFswXSk7CisgIF9fbTEyOGkgcTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwW3N0cmlkZV0pOworCisgIERvRmlsdGVyMl9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKKworICAvLyBTdG9yZQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSwgcDApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFswXSwgcTApOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIF9fbTEyOGkgcDEsIHAwLCBxMCwgcTE7CisKKyAgcCAtPSAyOyAgLy8gYmVnaW5uaW5nIG9mIHAxCisKKyAgTG9hZDE2eDRfU1NFMihwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOworICBEb0ZpbHRlcjJfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCk7CisgIFN0b3JlMTZ4NF9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgcCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmlfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNl9TU0UyKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpX1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTZfU1NFMihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQorCisjZGVmaW5lIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBNTV9BQlMocDEsIHAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMywgcDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDIsIHAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVhfRElGRjIocDMsIHAyLCBwMSwgcDAsIG0pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMSwgcDApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDMsIHAyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAyLCBwMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIGUxLCBlMiwgZTMsIGU0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChlMSkgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMCAqIChzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZTIpID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzEgKiAoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGUzKSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsyICogKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChlNCkgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMyAqIChzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIExPQURVVl9IX0VER0UocCwgdSwgdiwgc3RyaWRlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFUgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodSlbKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmKHYpWyhzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICBcCisgIChwKSA9IF9tbV91bnBhY2tsb19lcGk2NChVLCBWKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCBlMSwgZTIsIGUzLCBlNCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9BRFVWX0hfRURHRShlMSwgdSwgdiwgMCAqIChzdHJpZGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPQURVVl9IX0VER0UoZTIsIHUsIHYsIDEgKiAoc3RyaWRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGUzLCB1LCB2LCAyICogKHN0cmlkZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9BRFVWX0hfRURHRShlNCwgdSwgdiwgMyAqIChzdHJpZGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgU1RPUkVVVihwLCB1LCB2LCBzdHJpZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSYodSlbKHN0cmlkZSldLCBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocCkgPSBfbW1fc3JsaV9zaTEyOChwLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJih2KVsoc3RyaWRlKV0sIHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbXBsZXhNYXNrX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBtYXNrKSB7CisgIGNvbnN0IF9fbTEyOGkgaXQgPSBfbW1fc2V0MV9lcGk4KGl0aHJlc2gpOworICBjb25zdCBfX20xMjhpIGRpZmYgPSBfbW1fc3Vic19lcHU4KCptYXNrLCBpdCk7CisgIGNvbnN0IF9fbTEyOGkgdGhyZXNoX21hc2sgPSBfbW1fY21wZXFfZXBpOChkaWZmLCBfbW1fc2V0emVyb19zaTEyOCgpKTsKKyAgX19tMTI4aSBmaWx0ZXJfbWFzazsKKyAgTmVlZHNGaWx0ZXJfU1NFMihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCAmZmlsdGVyX21hc2spOworICAqbWFzayA9IF9tbV9hbmRfc2kxMjgodGhyZXNoX21hc2ssIGZpbHRlcl9tYXNrKTsKK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2X1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIHQxOworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKKworICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCisgIExPQURfSF9FREdFUzQocCAtIDQgKiBzdHJpZGUsIHN0cmlkZSwgdDEsIHAyLCBwMSwgcDApOworICBNQVhfRElGRjEodDEsIHAyLCBwMSwgcDAsIG1hc2spOworCisgIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKKyAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKKyAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNl9TU0UyKCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAvLyBTdG9yZQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMyAqIHN0cmlkZV0sIHAyKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTIgKiBzdHJpZGVdLCBwMSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0xICogc3RyaWRlXSwgcDApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsrMCAqIHN0cmlkZV0sIHEwKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbKzEgKiBzdHJpZGVdLCBxMSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWysyICogc3RyaWRlXSwgcTIpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisKKyAgdWludDhfdCogY29uc3QgYiA9IHAgLSA0OworICBMb2FkMTZ4NF9TU0UyKGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7CisgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgTG9hZDE2eDRfU1NFMihwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI2X1NTRTIoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIFN0b3JlMTZ4NF9TU0UyKCZwMywgJnAyLCAmcDEsICZwMCwgYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSk7CisgIFN0b3JlMTZ4NF9TU0UyKCZxMCwgJnExLCAmcTIsICZxMywgcCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSk7Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpX1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIF9fbTEyOGkgcDMsIHAyLCBwMSwgcDA7ICAgLy8gbG9vcCBpbnZhcmlhbnRzCisKKyAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHAzLCBwMiwgcDEsIHAwKTsgIC8vIHByb2xvZ3VlCisKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIF9fbTEyOGkgbWFzaywgdG1wMSwgdG1wMjsKKyAgICB1aW50OF90KiBjb25zdCBiID0gcCArIDIgKiBzdHJpZGU7ICAgLy8gYmVnaW5uaW5nIG9mIHAxCisgICAgcCArPSA0ICogc3RyaWRlOworCisgICAgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtYXNrKTsgICAvLyBjb21wdXRlIHBhcnRpYWwgbWFzaworICAgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBwMywgcDIsIHRtcDEsIHRtcDIpOworICAgIE1BWF9ESUZGMihwMywgcDIsIHRtcDEsIHRtcDIsIG1hc2spOworCisgICAgLy8gcDMgYW5kIHAyIGFyZSBub3QganVzdCB0ZW1wb3JhcnkgdmFyaWFibGVzIGhlcmU6IHRoZXkgd2lsbCBiZQorICAgIC8vIHJlLXVzZWQgZm9yIG5leHQgc3Bhbi4gQW5kIHEyL3EzIHdpbGwgYmVjb21lIHAxL3AwIGFjY29yZGluZ2x5LgorICAgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZwMywgJnAyLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgICBEb0ZpbHRlcjRfU1NFMigmcDEsICZwMCwgJnAzLCAmcDIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAgIC8vIFN0b3JlCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMCAqIHN0cmlkZV0sIHAxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYlsxICogc3RyaWRlXSwgcDApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZiWzIgKiBzdHJpZGVdLCBwMyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMyAqIHN0cmlkZV0sIHAyKTsKKworICAgIC8vIHJvdGF0ZSBzYW1wbGVzCisgICAgcDEgPSB0bXAxOworICAgIHAwID0gdG1wMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpX1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIF9fbTEyOGkgcDMsIHAyLCBwMSwgcDA7ICAgLy8gbG9vcCBpbnZhcmlhbnRzCisKKyAgTG9hZDE2eDRfU1NFMihwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOyAgLy8gcHJvbG9ndWUKKworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgX19tMTI4aSBtYXNrLCB0bXAxLCB0bXAyOworICAgIHVpbnQ4X3QqIGNvbnN0IGIgPSBwICsgMjsgICAvLyBiZWdpbm5pbmcgb2YgcDEKKworICAgIHAgKz0gNDsgIC8vIGJlZ2lubmluZyBvZiBxMCAoYW5kIG5leHQgc3BhbikKKworICAgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7ICAgLy8gY29tcHV0ZSBwYXJ0aWFsIG1hc2sKKyAgICBMb2FkMTZ4NF9TU0UyKHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmdG1wMSwgJnRtcDIpOworICAgIE1BWF9ESUZGMihwMywgcDIsIHRtcDEsIHRtcDIsIG1hc2spOworCisgICAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnAzLCAmcDIsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICAgIERvRmlsdGVyNF9TU0UyKCZwMSwgJnAwLCAmcDMsICZwMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgICAgU3RvcmUxNng0X1NTRTIoJnAxLCAmcDAsICZwMywgJnAyLCBiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKKworICAgIC8vIHJvdGF0ZSBzYW1wbGVzCisgICAgcDEgPSB0bXAxOworICAgIHAwID0gdG1wMjsKKyAgfQorfQorCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOF9TU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgdDEsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7CisKKyAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAorICBMT0FEVVZfSF9FREdFUzQodSAtIDQgKiBzdHJpZGUsIHYgLSA0ICogc3RyaWRlLCBzdHJpZGUsIHQxLCBwMiwgcDEsIHAwKTsKKyAgTUFYX0RJRkYxKHQxLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCisgIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKKyAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNl9TU0UyKCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAvLyBTdG9yZQorICBTVE9SRVVWKHAyLCB1LCB2LCAtMyAqIHN0cmlkZSk7CisgIFNUT1JFVVYocDEsIHUsIHYsIC0yICogc3RyaWRlKTsKKyAgU1RPUkVVVihwMCwgdSwgdiwgLTEgKiBzdHJpZGUpOworICBTVE9SRVVWKHEwLCB1LCB2LCAwICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMSwgdSwgdiwgMSAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTIsIHUsIHYsIDIgKiBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOF9TU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworCisgIHVpbnQ4X3QqIGNvbnN0IHR1ID0gdSAtIDQ7CisgIHVpbnQ4X3QqIGNvbnN0IHR2ID0gdiAtIDQ7CisgIExvYWQxNng0X1NTRTIodHUsIHR2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7CisgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgTG9hZDE2eDRfU1NFMih1LCB2LCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIE1BWF9ESUZGMihxMywgcTIsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjZfU1NFMigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgU3RvcmUxNng0X1NTRTIoJnAzLCAmcDIsICZwMSwgJnAwLCB0dSwgdHYsIHN0cmlkZSk7CisgIFN0b3JlMTZ4NF9TU0UyKCZxMCwgJnExLCAmcTIsICZxMywgdSwgdiwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpX1NTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKKworICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCisgIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHQyLCB0MSwgcDEsIHAwKTsKKyAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKKworICB1ICs9IDQgKiBzdHJpZGU7CisgIHYgKz0gNCAqIHN0cmlkZTsKKworICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCisgIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgdDEsIHQyKTsKKyAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNF9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIC8vIFN0b3JlCisgIFNUT1JFVVYocDEsIHUsIHYsIC0yICogc3RyaWRlKTsKKyAgU1RPUkVVVihwMCwgdSwgdiwgLTEgKiBzdHJpZGUpOworICBTVE9SRVVWKHEwLCB1LCB2LCAwICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMSwgdSwgdiwgMSAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aV9TU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHQxLCB0MiwgcDEsIHAwLCBxMCwgcTE7CisgIExvYWQxNng0X1NTRTIodSwgdiwgc3RyaWRlLCAmdDIsICZ0MSwgJnAxLCAmcDApOyAgIC8vIHAzLCBwMiwgcDEsIHAwCisgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7CisKKyAgdSArPSA0OyAgLy8gYmVnaW5uaW5nIG9mIHEwCisgIHYgKz0gNDsKKyAgTG9hZDE2eDRfU1NFMih1LCB2LCBzdHJpZGUsICZxMCwgJnExLCAmdDEsICZ0Mik7ICAvLyBxMCwgcTEsIHEyLCBxMworICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI0X1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgdSAtPSAyOyAgLy8gYmVnaW5uaW5nIG9mIHAxCisgIHYgLT0gMjsKKyAgU3RvcmUxNng0X1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB1LCB2LCBzdHJpZGUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gNHg0IHByZWRpY3Rpb25zCisKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKKworLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgOGItYXJpdGhtZXRpYyB0cmlja3M6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFDICsgYiArIDEpID4+IDEKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBjKSA+PiAxID0gWyhhICsgYyArIDEpID4+IDFdIC0gWyhhXmMpICYgMV0KKy8vIGFuZDoKKy8vICAgICAoYSArIDIgKiBiICsgYyArIDIpID4+IDIgPSAoQUIgKyBCQyArIDEpID4+IDEgLSAoYWJ8YmMpJmxzYgorLy8gICB3aGVyZTogQUMgPSAoYSArIGIgKyAxKSA+PiAxLCAgIEJDID0gKGIgKyBjICsgMSkgPj4gMQorLy8gICBhbmQgYWIgPSBhIF4gYiwgYmMgPSBiIF4gYywgbHNiID0gKEFDXkJDKSYxCisKK3N0YXRpYyB2b2lkIFZFNF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIMDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQ0RFRkdIMDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQ0RFRkdIMDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fc3Vic19lcHU4KGEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYXZnID0gX21tX2F2Z19lcHU4KGIsIEJDREVGR0gwKTsKKyAgY29uc3QgdWludDMyX3QgdmFscyA9IF9tbV9jdnRzaTEyOF9zaTMyKGF2Zyk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIGkgKiBCUFMsIHZhbHMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIExENF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0hIMCA9IF9tbV9pbnNlcnRfZXBpMTYoQ0RFRkdIMDAsIGRzdFstQlBTICsgN10sIDMpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSEgwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSEgwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgQkNERUZHSDApOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZGVmZyAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAyKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMykpKTsKK30KKworc3RhdGljIHZvaWQgVlI0X1NTRTIodWludDhfdCogZHN0KSB7ICAgLy8gVmVydGljYWwtUmlnaHQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IF9fbTEyOGkgWEFCQ0QgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDRDAgPSBfbW1fc3JsaV9zaTEyOChYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgYWJjZCA9IF9tbV9hdmdfZXB1OChYQUJDRCwgQUJDRDApOworICBjb25zdCBfX20xMjhpIF9YQUJDRCA9IF9tbV9zbGxpX3NpMTI4KFhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBJWEFCQ0QgPSBfbW1faW5zZXJ0X2VwaTE2KF9YQUJDRCwgSSB8IChYIDw8IDgpLCAwKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KElYQUJDRCwgQUJDRDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChJWEFCQ0QsIEFCQ0QwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGVmZ2ggPSBfbW1fYXZnX2VwdTgoYXZnMiwgWEFCQ0QpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGVmZ2ggICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2xsaV9zaTEyOChhYmNkLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NsbGlfc2kxMjgoZWZnaCwgMSkpKTsKKworICAvLyB0aGVzZSB0d28gYXJlIGhhcmQgdG8gaW1wbGVtZW50IGluIFNTRTIsIHNvIHdlIGtlZXAgdGhlIEMtdmVyc2lvbjoKKyAgRFNUKDAsIDIpID0gQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDAsIDMpID0gQVZHMyhLLCBKLCBJKTsKK30KKworc3RhdGljIHZvaWQgVkw0X1NTRTIodWludDhfdCogZHN0KSB7ICAgLy8gVmVydGljYWwtTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIXyA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0hfXyA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9hdmdfZXB1OChDREVGR0hfXywgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGF2ZzMgPSBfbW1fYXZnX2VwdTgoYXZnMSwgYXZnMik7CisgIGNvbnN0IF9fbTEyOGkgbHNiMSA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChhdmcxLCBhdmcyKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhYiA9IF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBiYyA9IF9tbV94b3Jfc2kxMjgoQ0RFRkdIX18sIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhYmJjID0gX21tX29yX3NpMTI4KGFiLCBiYyk7CisgIGNvbnN0IF9fbTEyOGkgbHNiMiA9IF9tbV9hbmRfc2kxMjgoYWJiYywgbHNiMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnNCA9IF9tbV9zdWJzX2VwdTgoYXZnMywgbHNiMik7CisgIGNvbnN0IHVpbnQzMl90IGV4dHJhX291dCA9IF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzQsIDQpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGF2ZzEgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhdmc0ICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnMSwgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzQsIDEpKSk7CisKKyAgLy8gdGhlc2UgdHdvIGFyZSBoYXJkIHRvIGdldCBhbmQgaXJyZWd1bGFyCisgIERTVCgzLCAyKSA9IChleHRyYV9vdXQgPj4gMCkgJiAweGZmOworICBEU1QoMywgMykgPSAoZXh0cmFfb3V0ID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgUkQ0X1NTRTIodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgWEFCQ0QgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgX19fX1hBQkNEID0gX21tX3NsbGlfc2kxMjgoWEFCQ0QsIDQpOworICBjb25zdCB1aW50MzJfdCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IF9fbTEyOGkgTEtKSV9fX19fID0KKyAgICAgIF9tbV9jdnRzaTMyX3NpMTI4KEwgfCAoSyA8PCA4KSB8IChKIDw8IDE2KSB8IChJIDw8IDI0KSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkNEID0gX21tX29yX3NpMTI4KExLSklfX19fXywgX19fX1hBQkNEKTsKKyAgY29uc3QgX19tMTI4aSBLSklYQUJDRF8gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIEpJWEFCQ0RfXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChKSVhBQkNEX18sIExLSklYQUJDRCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgS0pJWEFCQ0RfKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdW1hIDE2eDE2CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb25fU1NFMih1aW50OF90KiBkc3QsIGludCBzaXplKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IGRzdCAtIEJQUzsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgaW50IHk7CisgIGlmIChzaXplID09IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIodG9wKSk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBkc3RbLTFdIC0gdG9wWy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZSksIHplcm8pOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgX21tX2N2dHNpMTI4X3NpMzIob3V0KSk7CisgICAgfQorICB9IGVsc2UgaWYgKHNpemUgPT0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7ICsreSwgZHN0ICs9IEJQUykgeworICAgICAgY29uc3QgaW50IHZhbCA9IGRzdFstMV0gLSB0b3BbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlKSwgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlXzEgPSBfbW1fdW5wYWNraGlfZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTY7ICsreSwgZHN0ICs9IEJQUykgeworICAgICAgY29uc3QgaW50IHZhbCA9IGRzdFstMV0gLSB0b3BbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzAgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzApOworICAgICAgY29uc3QgX19tMTI4aSBvdXRfMSA9IF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2VfMSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYob3V0XzAsIG91dF8xKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgb3V0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgVE00X1NTRTIodWludDhfdCogZHN0KSAgIHsgVHJ1ZU1vdGlvbl9TU0UyKGRzdCwgNCk7IH0KK3N0YXRpYyB2b2lkIFRNOHV2X1NTRTIodWludDhfdCogZHN0KSB7IFRydWVNb3Rpb25fU1NFMihkc3QsIDgpOyB9CitzdGF0aWMgdm9pZCBUTTE2X1NTRTIodWludDhfdCogZHN0KSAgeyBUcnVlTW90aW9uX1NTRTIoZHN0LCAxNik7IH0KKworc3RhdGljIHZvaWQgVkUxNl9TU0UyKHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHRvcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEUxNl9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgoZHN0Wy0xXSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0MTZfU1NFMih1aW50OF90IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KHYpOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2X1NTRTIodWludDhfdCogZHN0KSB7ICAvLyBEQworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHNhZDh4MiA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICAvLyBzdW0gdGhlIHR3byBzYWRzOiBzYWQ4eDJbMDoxXSArIHNhZDh4Mls4OjldCisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihzYWQ4eDIsIF9tbV9zaHVmZmxlX2VwaTMyKHNhZDh4MiwgMikpOworICBpbnQgbGVmdCA9IDA7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGxlZnQgKz0gZHN0Wy0xICsgaiAqIEJQU107CisgIH0KKyAgeworICAgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyBsZWZ0ICsgMTY7CisgICAgUHV0MTZfU1NFMihEQyA+PiA1LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCB0b3Agc2FtcGxlcyB1bmF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICBQdXQxNl9TU0UyKERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb0xlZnRfU1NFMih1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbGVmdCBzYW1wbGVzIHVuYXZhaWxhYmxlCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgc2FkOHgyID0gX21tX3NhZF9lcHU4KHRvcCwgemVybyk7CisgIC8vIHN1bSB0aGUgdHdvIHNhZHM6IHNhZDh4MlswOjFdICsgc2FkOHgyWzg6OV0KKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KHNhZDh4MiwgX21tX3NodWZmbGVfZXBpMzIoc2FkOHgyLCAyKSk7CisgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyA4OworICBQdXQxNl9TU0UyKERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcExlZnRfU1NFMih1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wICYgbGVmdCBzYW1wbGVzCisgIFB1dDE2X1NTRTIoMHg4MCwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCitzdGF0aWMgdm9pZCBWRTh1dl9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wKTsKKyAgfQorfQorCisvLyBoZWxwZXIgZm9yIGNocm9tYS1EQyBwcmVkaWN0aW9ucworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0OHg4dXZfU1NFMih1aW50OF90IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KHYpOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB2YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2X1NTRTIodWludDhfdCogZHN0KSB7ICAgICAvLyBEQworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICBpbnQgbGVmdCA9IDA7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbGVmdCArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIGxlZnQgKyA4OworICAgIFB1dDh4OHV2X1NTRTIoREMgPj4gNCwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gbGVmdCBzYW1wbGVzCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX3NhZF9lcHU4KHRvcCwgemVybyk7CisgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyA0OworICBQdXQ4eDh1dl9TU0UyKERDID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BfU1NFMih1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKKyAgaW50IGRjMCA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMwICs9IGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIFB1dDh4OHV2X1NTRTIoZGMwID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0X1NTRTIodWludDhfdCogZHN0KSB7ICAgIC8vIERDIHdpdGggbm90aGluZworICBQdXQ4eDh1dl9TU0UyKDB4ODAsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtX1NTRTI7CisjaWYgKFVTRV9UUkFOU0ZPUk1fQUMzID09IDEpCisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDM19TU0UyOworI2VuZGlmCisKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2X1NTRTI7CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNl9TU0UyOworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4X1NTRTI7CisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjhfU1NFMjsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmlfU1NFMjsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmlfU1NFMjsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpX1NTRTI7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aV9TU0UyOworCisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNl9TU0UyOworICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTZfU1NFMjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlfU1NFMjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmlfU1NFMjsKKworICBWUDhQcmVkTHVtYTRbMV0gPSBUTTRfU1NFMjsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0X1NTRTI7CisgIFZQOFByZWRMdW1hNFs0XSA9IFJENF9TU0UyOworICBWUDhQcmVkTHVtYTRbNV0gPSBWUjRfU1NFMjsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0X1NTRTI7CisgIFZQOFByZWRMdW1hNFs3XSA9IFZMNF9TU0UyOworCisgIFZQOFByZWRMdW1hMTZbMF0gPSBEQzE2X1NTRTI7CisgIFZQOFByZWRMdW1hMTZbMV0gPSBUTTE2X1NTRTI7CisgIFZQOFByZWRMdW1hMTZbMl0gPSBWRTE2X1NTRTI7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2X1NTRTI7CisgIFZQOFByZWRMdW1hMTZbNF0gPSBEQzE2Tm9Ub3BfU1NFMjsKKyAgVlA4UHJlZEx1bWExNls1XSA9IERDMTZOb0xlZnRfU1NFMjsKKyAgVlA4UHJlZEx1bWExNls2XSA9IERDMTZOb1RvcExlZnRfU1NFMjsKKworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2X1NTRTI7CisgIFZQOFByZWRDaHJvbWE4WzFdID0gVE04dXZfU1NFMjsKKyAgVlA4UHJlZENocm9tYThbMl0gPSBWRTh1dl9TU0UyOworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3BfU1NFMjsKKyAgVlA4UHJlZENocm9tYThbNV0gPSBEQzh1dk5vTGVmdF9TU0UyOworICBWUDhQcmVkQ2hyb21hOFs2XSA9IERDOHV2Tm9Ub3BMZWZ0X1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxODUwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTQxLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQgdmVyc2lvbiBvZiBzb21lIGRlY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKK3N0YXRpYyB2b2lkIEhFMTZfU1NFNDEodWludDhfdCogZHN0KSB7ICAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBjb25zdCBfX20xMjhpIGtTaHVmZmxlMyA9IF9tbV9zZXQxX2VwaTgoMyk7CisgIGZvciAoaiA9IDE2OyBqID4gMDsgLS1qKSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgLSA0KSk7CisgICAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2h1ZmZsZV9lcGk4KGluLCBrU2h1ZmZsZTMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgdmFsdWVzKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0U1NFNDEodm9pZCkgeworICBWUDhQcmVkTHVtYTE2WzNdID0gSEUxNl9TU0U0MTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0U0MQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdFNTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RzcC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjliYjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kc3AuaApAQCAtMCwwICsxLDY5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgU3BlZWQtY3JpdGljYWwgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfRFNQX0hfCisjZGVmaW5lIFdFQlBfRFNQX0RTUF9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQlBTIDMyICAgLy8gdGhpcyBpcyB0aGUgY29tbW9uIHN0cmlkZSBmb3IgZW5jL2RlYworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ1BVIGRldGVjdGlvbgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgZGVmaW5lIExPQ0FMX0dDQ19WRVJTSU9OICgoX19HTlVDX18gPDwgOCkgfCBfX0dOVUNfTUlOT1JfXykKKyMgZGVmaW5lIExPQ0FMX0dDQ19QUkVSRVEobWFqLCBtaW4pIFwKKyAgICAoTE9DQUxfR0NDX1ZFUlNJT04gPj0gKCgobWFqKSA8PCA4KSB8IChtaW4pKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9HQ0NfVkVSU0lPTiAwCisjIGRlZmluZSBMT0NBTF9HQ0NfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorIyBkZWZpbmUgTE9DQUxfQ0xBTkdfVkVSU0lPTiAoKF9fY2xhbmdfbWFqb3JfXyA8PCA4KSB8IF9fY2xhbmdfbWlub3JfXykKKyMgZGVmaW5lIExPQ0FMX0NMQU5HX1BSRVJFUShtYWosIG1pbikgXAorICAgIChMT0NBTF9DTEFOR19WRVJTSU9OID49ICgoKG1haikgPDwgOCkgfCAobWluKSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfQ0xBTkdfVkVSU0lPTiAwCisjIGRlZmluZSBMT0NBTF9DTEFOR19QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyMgZGVmaW5lIF9faGFzX2J1aWx0aW4oeCkgMAorI2VuZGlmCisKKy8vIGZvciBub3csIG5vbmUgb2YgdGhlIG9wdGltaXphdGlvbnMgYmVsb3cgYXJlIGF2YWlsYWJsZSBpbiBlbXNjcmlwdGVuCisjaWYgIWRlZmluZWQoRU1TQ1JJUFRFTikKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID4gMTMxMCAmJiBcCisgICAgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2RlZmluZSBXRUJQX01TQ19TU0UyICAvLyBWaXN1YWwgQysrIFNTRTIgdGFyZ2V0cworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNTAwICYmIFwKKyAgICAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpCisjZGVmaW5lIFdFQlBfTVNDX1NTRTQxICAvLyBWaXN1YWwgQysrIFNTRTQuMSB0YXJnZXRzCisjZW5kaWYKKworLy8gV0VCUF9IQVZFXyogYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgaW4gZHNwCisvLyBmaWxlcyB3aXRob3V0IGludHJpbnNpY3MsIGFsbG93aW5nIHRoZSBjb3JyZXNwb25kaW5nIEluaXQoKSB0byBiZSBjYWxsZWQuCisvLyBGaWxlcyBjb250YWluaW5nIGludHJpbnNpY3Mgd2lsbCBuZWVkIHRvIGJlIGJ1aWx0IHRhcmdldGluZyB0aGUgaW5zdHJ1Y3Rpb24KKy8vIHNldCBzbyBzaG91bGQgc3VjY2VlZCBvbiBvbmUgb2YgdGhlIGVhcmxpZXIgdGVzdHMuCisjaWYgZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChXRUJQX01TQ19TU0UyKSB8fCBkZWZpbmVkKFdFQlBfSEFWRV9TU0UyKQorI2RlZmluZSBXRUJQX1VTRV9TU0UyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU0U0XzFfXykgfHwgZGVmaW5lZChXRUJQX01TQ19TU0U0MSkgfHwgZGVmaW5lZChXRUJQX0hBVkVfU1NFNDEpCisjZGVmaW5lIFdFQlBfVVNFX1NTRTQxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BVlgyX18pIHx8IGRlZmluZWQoV0VCUF9IQVZFX0FWWDIpCisjZGVmaW5lIFdFQlBfVVNFX0FWWDIKKyNlbmRpZgorCisvLyBUaGUgaW50cmluc2ljcyBjdXJyZW50bHkgY2F1c2UgY29tcGlsZXIgZXJyb3JzIHdpdGggYXJtLW5hY2wtZ2NjIGFuZCB0aGUKKy8vIGlubGluZSBhc3NlbWJseSB3b3VsZCBuZWVkIHRvIGJlIG1vZGlmaWVkIGZvciB1c2Ugd2l0aCBOYXRpdmUgQ2xpZW50LgorI2lmIChkZWZpbmVkKF9fQVJNX05FT05fXykgfHwgXAorICAgICBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKFdFQlBfSEFWRV9ORU9OKSkgJiYgXAorICAgICFkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQorI2RlZmluZSBXRUJQX1VTRV9ORU9OCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdFQlBfVVNFX05FT04pICYmIGRlZmluZWQoX19BTkRST0lEX18pICYmIFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykgJiYgZGVmaW5lZChIQVZFX0NQVV9GRUFUVVJFU19IKQorI2RlZmluZSBXRUJQX0FORFJPSURfTkVPTiAgLy8gQW5kcm9pZCB0YXJnZXRzIHRoYXQgbWF5IGhhdmUgTkVPTgorI2RlZmluZSBXRUJQX1VTRV9ORU9OCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE3MDAgJiYgZGVmaW5lZChfTV9BUk0pCisjZGVmaW5lIFdFQlBfVVNFX05FT04KKyNkZWZpbmUgV0VCUF9VU0VfSU5UUklOU0lDUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAhZGVmaW5lZChfX21pcHM2NCkgJiYgXAorICAgIGRlZmluZWQoX19taXBzX2lzYV9yZXYpICYmIChfX21pcHNfaXNhX3JldiA+PSAxKSAmJiAoX19taXBzX2lzYV9yZXYgPCA2KQorI2RlZmluZSBXRUJQX1VTRV9NSVBTMzIKKyNpZiAoX19taXBzX2lzYV9yZXYgPj0gMikKKyNkZWZpbmUgV0VCUF9VU0VfTUlQUzMyX1IyCisjaWYgZGVmaW5lZChfX21pcHNfZHNwcjIpIHx8IChkZWZpbmVkKF9fbWlwc19kc3BfcmV2KSAmJiBfX21pcHNfZHNwX3JldiA+PSAyKQorI2RlZmluZSBXRUJQX1VTRV9NSVBTX0RTUF9SMgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX21pcHNfbXNhKSAmJiBkZWZpbmVkKF9fbWlwc19pc2FfcmV2KSAmJiAoX19taXBzX2lzYV9yZXYgPj0gNSkKKyNkZWZpbmUgV0VCUF9VU0VfTVNBCisjZW5kaWYKKworI2VuZGlmICAvKiBFTVNDUklQVEVOICovCisKKyNpZm5kZWYgV0VCUF9EU1BfT01JVF9DX0NPREUKKyNkZWZpbmUgV0VCUF9EU1BfT01JVF9DX0NPREUgMQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChfX0FSTV9ORU9OX18pKSAmJiBXRUJQX0RTUF9PTUlUX0NfQ09ERQorI2RlZmluZSBXRUJQX05FT05fT01JVF9DX0NPREUgMQorI2Vsc2UKKyNkZWZpbmUgV0VCUF9ORU9OX09NSVRfQ19DT0RFIDAKKyNlbmRpZgorCisjaWYgIShMT0NBTF9DTEFOR19QUkVSRVEoMyw4KSB8fCBMT0NBTF9HQ0NfUFJFUkVRKDQsOCkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykpCisjZGVmaW5lIFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MgMQorI2Vsc2UKKyNkZWZpbmUgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQyAwCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBwcmV2ZW50cyB0aHJlYWRfc2FuaXRpemVyIGZyb20gcmVwb3J0aW5nIGtub3duIGNvbmN1cnJlbnQgd3JpdGVzLgorI2RlZmluZSBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OCisjaWYgZGVmaW5lZChfX2hhc19mZWF0dXJlKQorI2lmIF9faGFzX2ZlYXR1cmUodGhyZWFkX3Nhbml0aXplcikKKyN1bmRlZiBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OCisjZGVmaW5lIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfdGhyZWFkKSkKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1RIUkVBRCkgJiYgIWRlZmluZWQoX1dJTjMyKQorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKKy8vIFRPRE86IElmIG5vdCBpbmNsdWRpbmcgdGhpcyBpcyBhIHByb2JsZW0gb24gYSBTdGFyYm9hcmQgcGxhdGZvcm0sIHRoZW4KKy8vICAgICAgIHdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IHdpdGggU3RhcmJvYXJkIHRocmVhZGluZworLy8gICAgICAgcHJpbWl0aXZlcyBpbnN0ZWFkLgorI2luY2x1ZGUgPHB0aHJlYWQuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKyNkZWZpbmUgV0VCUF9EU1BfSU5JVChmdW5jKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9sYXRpbGUgVlA4Q1BVSW5mbyBmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCA9ICAgICAgICAgICBcCisgICAgICAoVlA4Q1BVSW5mbykmZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBmdW5jICMjIF9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsgXAorICBpZiAocHRocmVhZF9tdXRleF9sb2NrKCZmdW5jICMjIF9sb2NrKSkgYnJlYWs7ICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCAhPSBWUDhHZXRDUFVJbmZvKSBmdW5jKCk7ICAgICAgICAgIFwKKyAgZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgPSBWUDhHZXRDUFVJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmZnVuYyAjIyBfbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2Vsc2UgIC8vICEoZGVmaW5lZChXRUJQX1VTRV9USFJFQUQpICYmICFkZWZpbmVkKF9XSU4zMikpCisjZGVmaW5lIFdFQlBfRFNQX0lOSVQoZnVuYykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgPSAgICAgICAgICAgXAorICAgICAgKFZQOENQVUluZm8pJmZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSBicmVhazsgICAgICAgICAgIFwKKyAgZnVuYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmICAvLyBkZWZpbmVkKFdFQlBfVVNFX1RIUkVBRCkgJiYgIWRlZmluZWQoX1dJTjMyKQorCisvLyBEZWZpbmVzIGFuIEluaXQgKyBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjb250cm9sIG11bHRpcGxlIGluaXRpYWxpemF0aW9uIG9mCisvLyBmdW5jdGlvbiBwb2ludGVycyAvIHRhYmxlcy4KKy8qIFVzYWdlOgorICAgV0VCUF9EU1BfSU5JVF9GVU5DKEluaXRGdW5jKSB7CisgICAgIC4uLmZ1bmN0aW9uIGJvZHkKKyAgIH0KKyovCisjZGVmaW5lIFdFQlBfRFNQX0lOSVRfRlVOQyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIG5hbWUgIyMgX2JvZHkodm9pZCk7IFwKKyAgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIG5hbWUodm9pZCkgeyAgICAgICAgICAgICAgICBcCisgICAgV0VCUF9EU1BfSU5JVChuYW1lICMjIF9ib2R5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBuYW1lICMjIF9ib2R5KHZvaWQpCisKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX2hhc19hdHRyaWJ1dGUpCisjaWYgX19oYXNfYXR0cmlidXRlKG5vX3Nhbml0aXplKQorLy8gVGhpcyBtYWNybyBwcmV2ZW50cyB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIHNhbml0aXplciBmcm9tIHJlcG9ydGluZworLy8gZmFpbHVyZXMuIFRoaXMgaXMgb25seSBtZWFudCB0byBzaWxlbmNlIHVuYWxpZ25lZCBsb2FkcyBvbiBwbGF0Zm9ybXMgdGhhdAorLy8gYXJlIGtub3duIHRvIHN1cHBvcnQgdGhlbS4KKyN1bmRlZiBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRgorI2RlZmluZSBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRiBcCisgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJ1bmRlZmluZWQiKSkpCisKKy8vIFRoaXMgbWFjcm8gcHJldmVudHMgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBzYW5pdGl6ZXIgZnJvbSByZXBvcnRpbmcKKy8vIGZhaWx1cmVzIHJlbGF0ZWQgdG8gdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvd3MuIFRoaXMgaXMgb25seSBtZWFudCB0bworLy8gc2lsZW5jZSBjYXNlcyB3aGVyZSB0aGlzIHdlbGwgZGVmaW5lZCBiZWhhdmlvciBpcyBleHBlY3RlZC4KKyN1bmRlZiBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVworI2RlZmluZSBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVyBcCisgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQorI2VuZGlmCisjZW5kaWYKKworLy8gUmVndWxhcml6ZSB0aGUgZGVmaW5pdGlvbiBvZiBXRUJQX1NXQVBfMTZCSVRfQ1NQIChiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQorI2lmICFkZWZpbmVkKFdFQlBfU1dBUF8xNkJJVF9DU1ApCisjZGVmaW5lIFdFQlBfU1dBUF8xNkJJVF9DU1AgMAorI2VuZGlmCisKKy8vIHNvbWUgZW5kaWFuIGZpeCAoZS5nLjogbWlwcy1nY2MgZG9lc24ndCBkZWZpbmUgX19CSUdfRU5ESUFOX18pCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaWYgU0JfSVMoQklHX0VORElBTikKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbHNlCisjaWYgIWRlZmluZWQoV09SRFNfQklHRU5ESUFOKSAmJiBcCisgICAgKGRlZmluZWQoX19CSUdfRU5ESUFOX18pIHx8IGRlZmluZWQoX01fUFBDKSB8fCBcCisgICAgIChkZWZpbmVkKF9fQllURV9PUkRFUl9fKSAmJiAoX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9CSUdfRU5ESUFOX18pKSkKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisKK3R5cGVkZWYgZW51bSB7CisgIGtTU0UyLAorICBrU1NFMywKKyAga1Nsb3dTU1NFMywgIC8vIHNwZWNpYWwgZmVhdHVyZSBmb3Igc2xvdyBTU1NFMyBhcmNoaXRlY3R1cmVzCisgIGtTU0U0XzEsCisgIGtBVlgsCisgIGtBVlgyLAorICBrTkVPTiwKKyAga01JUFMzMiwKKyAga01JUFNkc3BSMiwKKyAga01TQQorfSBDUFVGZWF0dXJlOworLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBDUFUgc3VwcG9ydHMgdGhlIGZlYXR1cmUuCit0eXBlZGVmIGludCAoKlZQOENQVUluZm8pKENQVUZlYXR1cmUgZmVhdHVyZSk7CitXRUJQX0VYVEVSTiBWUDhDUFVJbmZvIFZQOEdldENQVUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0IHN0dWIgZ2VuZXJhdG9yCisKKy8vIERlZmluZXMgYW4gaW5pdCBmdW5jdGlvbiBzdHViIHRvIGVuc3VyZSBlYWNoIG1vZHVsZSBleHBvc2VzIGEgc3ltYm9sLAorLy8gYXZvaWRpbmcgYSBjb21waWxlciB3YXJuaW5nLgorI2RlZmluZSBXRUJQX0RTUF9JTklUX1NUVUIoZnVuYykgXAorICBleHRlcm4gdm9pZCBmdW5jKHZvaWQpOyBcCisgIHZvaWQgZnVuYyh2b2lkKSB7fQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW5jb2RpbmcKKworLy8gVHJhbnNmb3JtcworLy8gVlA4SWRjdDogRG9lcyBvbmUgb2YgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4gSWYgZG9fdHdvIGlzIHNldCwgdGhlIHRyYW5zZm9ybXMKKy8vICAgICAgICAgIHdpbGwgYmUgZG9uZSBmb3IgKHJlZiwgaW4sIGRzdCkgYW5kIChyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KS4KK3R5cGVkZWYgdm9pZCAoKlZQOElkY3QpKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pOwordHlwZWRlZiB2b2lkICgqVlA4RmRjdCkoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsIGludDE2X3QqIG91dCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhXSFQpKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpOworZXh0ZXJuIFZQOElkY3QgVlA4SVRyYW5zZm9ybTsKK2V4dGVybiBWUDhGZGN0IFZQOEZUcmFuc2Zvcm07CitleHRlcm4gVlA4RmRjdCBWUDhGVHJhbnNmb3JtMjsgICAvLyBwZXJmb3JtcyB0d28gdHJhbnNmb3JtcyBhdCBhIHRpbWUKK2V4dGVybiBWUDhXSFQgVlA4RlRyYW5zZm9ybVdIVDsKKy8vIFByZWRpY3Rpb25zCisvLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jay4gKnRvcCBhbmQgKmxlZnQgY2FuIGJlIE5VTEwuCit0eXBlZGVmIHZvaWQgKCpWUDhJbnRyYVByZWRzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApOwordHlwZWRlZiB2b2lkICgqVlA4SW50cmE0UHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogdG9wKTsKK2V4dGVybiBWUDhJbnRyYTRQcmVkcyBWUDhFbmNQcmVkTHVtYTQ7CitleHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkTHVtYTE2OworZXh0ZXJuIFZQOEludHJhUHJlZHMgVlA4RW5jUHJlZENocm9tYTg7CisKK3R5cGVkZWYgaW50ICgqVlA4TWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZik7CitleHRlcm4gVlA4TWV0cmljIFZQOFNTRTE2eDE2LCBWUDhTU0UxNng4LCBWUDhTU0U4eDgsIFZQOFNTRTR4NDsKK3R5cGVkZWYgaW50ICgqVlA4V01ldHJpYykoY29uc3QgdWludDhfdCogcGl4LCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3ZWlnaHRzKTsKKy8vIFRoZSB3ZWlnaHRzIGZvciBWUDhURGlzdG80eDQgYW5kIFZQOFREaXN0bzE2eDE2IGNvbnRhaW4gYSByb3ctbWFqb3IKKy8vIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4LgorZXh0ZXJuIFZQOFdNZXRyaWMgVlA4VERpc3RvNHg0LCBWUDhURGlzdG8xNngxNjsKKworLy8gQ29tcHV0ZSB0aGUgYXZlcmFnZSAoREMpIG9mIGZvdXIgNHg0IGJsb2Nrcy4KKy8vIEVhY2ggc3ViLTR4NCBibG9jayAjaSBzdW0gaXMgc3RvcmVkIGluIGRjW2ldLgordHlwZWRlZiB2b2lkICgqVlA4TWVhbk1ldHJpYykoY29uc3QgdWludDhfdCogcmVmLCB1aW50MzJfdCBkY1s0XSk7CitleHRlcm4gVlA4TWVhbk1ldHJpYyBWUDhNZWFuMTZ4NDsKKwordHlwZWRlZiB2b2lkICgqVlA4QmxvY2tDb3B5KShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCk7CitleHRlcm4gVlA4QmxvY2tDb3B5IFZQOENvcHk0eDQ7CitleHRlcm4gVlA4QmxvY2tDb3B5IFZQOENvcHkxNng4OworLy8gUXVhbnRpemF0aW9uCitzdHJ1Y3QgVlA4TWF0cml4OyAgIC8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3R5cGVkZWYgaW50ICgqVlA4UXVhbnRpemVCbG9jaykoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFZQOE1hdHJpeCogY29uc3QgbXR4KTsKKy8vIFNhbWUgYXMgVlA4UXVhbnRpemVCbG9jaywgYnV0IHF1YW50aXplcyB0d28gY29uc2VjdXRpdmUgYmxvY2tzLgordHlwZWRlZiBpbnQgKCpWUDhRdWFudGl6ZTJCbG9ja3MpKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFZQOE1hdHJpeCogY29uc3QgbXR4KTsKKworZXh0ZXJuIFZQOFF1YW50aXplQmxvY2sgVlA4RW5jUXVhbnRpemVCbG9jazsKK2V4dGVybiBWUDhRdWFudGl6ZTJCbG9ja3MgVlA4RW5jUXVhbnRpemUyQmxvY2tzOworCisvLyBzcGVjaWZpYyB0byAybmQgdHJhbnNmb3JtOgordHlwZWRlZiBpbnQgKCpWUDhRdWFudGl6ZUJsb2NrV0hUKShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4TWF0cml4KiBjb25zdCBtdHgpOworZXh0ZXJuIFZQOFF1YW50aXplQmxvY2tXSFQgVlA4RW5jUXVhbnRpemVCbG9ja1dIVDsKKworZXh0ZXJuIGNvbnN0IGludCBWUDhEc3BTY2FuWzE2ICsgNCArIDRdOworCisvLyBDb2xsZWN0IGhpc3RvZ3JhbSBmb3Igc3VzY2VwdGliaWxpdHkgY2FsY3VsYXRpb24uCisjZGVmaW5lIE1BWF9DT0VGRl9USFJFU0ggICAzMSAgIC8vIHNpemUgb2YgaGlzdG9ncmFtIHVzZWQgYnkgQ29sbGVjdEhpc3RvZ3JhbS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gV2Ugb25seSBuZWVkIHRvIHN0b3JlIG1heF92YWx1ZSBhbmQgbGFzdF9ub25femVybywgbm90IHRoZSBkaXN0cmlidXRpb24uCisgIGludCBtYXhfdmFsdWU7CisgIGludCBsYXN0X25vbl96ZXJvOworfSBWUDhIaXN0b2dyYW07Cit0eXBlZGVmIHZvaWQgKCpWUDhDSGlzdG8pKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKK2V4dGVybiBWUDhDSGlzdG8gVlA4Q29sbGVjdEhpc3RvZ3JhbTsKKy8vIEdlbmVyYWwtcHVycG9zZSB1dGlsIGZ1bmN0aW9uIHRvIGhlbHAgVlA4Q29sbGVjdEhpc3RvZ3JhbSgpLgordm9pZCBWUDhTZXRIaXN0b2dyYW1EYXRhKGNvbnN0IGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBhYm92ZQordm9pZCBWUDhFbmNEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29zdCBmdW5jdGlvbnMgKGVuY29kaW5nKQorCitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4RW50cm9weUNvc3RbMjU2XTsgICAgICAgIC8vIDhiaXQgZml4ZWQtcG9pbnQgbG9nKHApCisvLyBhcHByb3hpbWF0ZSBjb3N0IHBlciBsZXZlbDoKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhMZXZlbEZpeGVkQ29zdHNbMjA0NyAvKk1BWF9MRVZFTCovICsgMV07CitleHRlcm4gY29uc3QgdWludDhfdCBWUDhFbmNCYW5kc1sxNiArIDFdOworCitzdHJ1Y3QgVlA4UmVzaWR1YWw7Cit0eXBlZGVmIHZvaWQgKCpWUDhTZXRSZXNpZHVhbENvZWZmc0Z1bmMpKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpOworZXh0ZXJuIFZQOFNldFJlc2lkdWFsQ29lZmZzRnVuYyBWUDhTZXRSZXNpZHVhbENvZWZmczsKKworLy8gQ29zdCBjYWxjdWxhdGlvbiBmdW5jdGlvbi4KK3R5cGVkZWYgaW50ICgqVlA4R2V0UmVzaWR1YWxDb3N0RnVuYykoaW50IGN0eDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKK2V4dGVybiBWUDhHZXRSZXNpZHVhbENvc3RGdW5jIFZQOEdldFJlc2lkdWFsQ29zdDsKKworLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIHVzaW5nIHRoZSBhYm92ZQordm9pZCBWUDhFbmNEc3BDb3N0SW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTSU0gLyBQU05SIHV0aWxzCisKKy8vIHN0cnVjdCBmb3IgYWNjdW11bGF0aW5nIHN0YXRpc3RpY2FsIG1vbWVudHMKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgdzsgICAgICAgICAgICAgIC8vIHN1bSh3X2kpIDogc3VtIG9mIHdlaWdodHMKKyAgdWludDMyX3QgeG0sIHltOyAgICAgICAgIC8vIHN1bSh3X2kgKiB4X2kpLCBzdW0od19pICogeV9pKQorICB1aW50MzJfdCB4eG0sIHh5bSwgeXltOyAgLy8gc3VtKHdfaSAqIHhfaSAqIHhfaSksIGV0Yy4KK30gVlA4RGlzdG9TdGF0czsKKworLy8gQ29tcHV0ZSB0aGUgZmluYWwgU1NJTSB2YWx1ZQorLy8gVGhlIG5vbi1jbGlwcGVkIHZlcnNpb24gYXNzdW1lcyBzdGF0cy0+dyA9ICgyICogVlA4X1NTSU1fS0VSTkVMICsgMSleMi4KK2RvdWJsZSBWUDhTU0lNRnJvbVN0YXRzKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKK2RvdWJsZSBWUDhTU0lNRnJvbVN0YXRzQ2xpcHBlZChjb25zdCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7CisKKyNkZWZpbmUgVlA4X1NTSU1fS0VSTkVMIDMgICAvLyB0b3RhbCBzaXplIG9mIHRoZSBrZXJuZWw6IDIgKiBWUDhfU1NJTV9LRVJORUwgKyAxCit0eXBlZGVmIGRvdWJsZSAoKlZQOFNTSU1HZXRDbGlwcGVkRnVuYykoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sICAvLyBjZW50ZXIgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVywgaW50IEgpOyAgIC8vIHBsYW5lIGRpbWVuc2lvbgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKy8vIFRoaXMgdmVyc2lvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZ3VhcmFudGVlIHRoYXQgeW91IGNhbiBsb2FkIDggYnl0ZXMgYW5kCisvLyA4IHJvd3MgYXQgb2Zmc2V0IHNyYzEgYW5kIHNyYzIKK3R5cGVkZWYgZG91YmxlICgqVlA4U1NJTUdldEZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIpOworCitleHRlcm4gVlA4U1NJTUdldEZ1bmMgVlA4U1NJTUdldDsgICAgICAgICAvLyB1bmNsaXBwZWQgLyB1bmNoZWNrZWQKK2V4dGVybiBWUDhTU0lNR2V0Q2xpcHBlZEZ1bmMgVlA4U1NJTUdldENsaXBwZWQ7ICAgLy8gd2l0aCBjbGlwcGluZworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCit0eXBlZGVmIHVpbnQzMl90ICgqVlA4QWNjdW11bGF0ZVNTRUZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBsZW4pOworZXh0ZXJuIFZQOEFjY3VtdWxhdGVTU0VGdW5jIFZQOEFjY3VtdWxhdGVTU0U7CisjZW5kaWYKKworLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBvZiB0aGUgYWJvdmUgZGlyZWN0bHkKK3ZvaWQgVlA4U1NJTURzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGluZworCit0eXBlZGVmIHZvaWQgKCpWUDhEZWNJZGN0KShjb25zdCBpbnQxNl90KiBjb2VmZnMsIHVpbnQ4X3QqIGRzdCk7CisvLyB3aGVuIGRvaW5nIHR3byB0cmFuc2Zvcm1zLCBjb2VmZnMgaXMgYWN0dWFsbHkgaW50MTZfdFsyXVsxNl0uCit0eXBlZGVmIHZvaWQgKCpWUDhEZWNJZGN0MikoY29uc3QgaW50MTZfdCogY29lZmZzLCB1aW50OF90KiBkc3QsIGludCBkb190d28pOworZXh0ZXJuIFZQOERlY0lkY3QyIFZQOFRyYW5zZm9ybTsKK2V4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybUFDMzsKK2V4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybVVWOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtREM7CitleHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQ1VWOworZXh0ZXJuIFZQOFdIVCBWUDhUcmFuc2Zvcm1XSFQ7CisKKy8vICpkc3QgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLCB3aXRoIHN0cmlkZSBCUFMuIEJvdW5kYXJ5IHNhbXBsZXMgYXJlCisvLyBhc3N1bWVkIGFjY2Vzc2libGUgd2hlbiBuZWVkZWQuCit0eXBlZGVmIHZvaWQgKCpWUDhQcmVkRnVuYykodWludDhfdCogZHN0KTsKK2V4dGVybiBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTE2Wy8qIE5VTV9CX0RDX01PREVTICovXTsKK2V4dGVybiBWUDhQcmVkRnVuYyBWUDhQcmVkQ2hyb21hOFsvKiBOVU1fQl9EQ19NT0RFUyAqL107CitleHRlcm4gVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWE0Wy8qIE5VTV9CTU9ERVMgKi9dOworCisvLyBjbGlwcGluZyB0YWJsZXMgKGZvciBmaWx0ZXJpbmcpCitleHRlcm4gY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAxOyAgLy8gY2xpcHMgWy0xMDIwLCAxMDIwXSB0byBbLTEyOCwgMTI3XQorZXh0ZXJuIGNvbnN0IGludDhfdCogY29uc3QgVlA4a3NjbGlwMjsgIC8vIGNsaXBzIFstMTEyLCAxMTJdIHRvIFstMTYsIDE1XQorZXh0ZXJuIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IFZQOGtjbGlwMTsgIC8vIGNsaXBzIFstMjU1LDUxMV0gdG8gWzAsMjU1XQorZXh0ZXJuIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IFZQOGthYnMwOyAgIC8vIGFicyh4KSBmb3IgeCBpbiBbLTI1NSwyNTVdCisvLyBtdXN0IGJlIGNhbGxlZCBmaXJzdAordm9pZCBWUDhJbml0Q2xpcFRhYmxlcyh2b2lkKTsKKworLy8gc2ltcGxlIGZpbHRlciAob25seSBmb3IgbHVtYSkKK3R5cGVkZWYgdm9pZCAoKlZQOFNpbXBsZUZpbHRlckZ1bmMpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpOworZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2OworZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OworZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2aTsgIC8vIGZpbHRlciAzIGlubmVyIGVkZ2VzCitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOworCisvLyByZWd1bGFyIGZpbHRlciAob24gYm90aCBtYWNyb2Jsb2NrIGVkZ2VzIGFuZCBpbm5lciBlZGdlcykKK3R5cGVkZWYgdm9pZCAoKlZQOEx1bWFGaWx0ZXJGdW5jKSh1aW50OF90KiBsdW1hLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOwordHlwZWRlZiB2b2lkICgqVlA4Q2hyb21hRmlsdGVyRnVuYykodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOworLy8gb24gb3V0ZXIgZWRnZQorZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNjsKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTY7CitleHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKK2V4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4OworCisvLyBvbiBpbm5lciBlZGdlCitleHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2aTsgICAvLyBmaWx0ZXJpbmcgMyBpbm5lciBlZGdlcyBhbHRvZ2V0aGVyCitleHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKK2V4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4aTsgIC8vIGZpbHRlcmluZyB1IGFuZCB2IGFsdG9nZXRoZXIKK2V4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4aTsKKworLy8gRGl0aGVyaW5nLiBDb21iaW5lcyBkaXRoZXJpbmcgdmFsdWVzIChjZW50ZXJlZCBhcm91bmQgMTI4KSB3aXRoIGRzdFtdLAorLy8gYWNjb3JkaW5nIHRvOiBkc3RbXSA9IGNsaXAoZHN0W10gKyAoKChkaXRoZXJbXS0xMjgpICsgOCkgPj4gNCkKKyNkZWZpbmUgVlA4X0RJVEhFUl9ERVNDQUxFIDQKKyNkZWZpbmUgVlA4X0RJVEhFUl9ERVNDQUxFX1JPVU5ERVIgKDEgPDwgKFZQOF9ESVRIRVJfREVTQ0FMRSAtIDEpKQorI2RlZmluZSBWUDhfRElUSEVSX0FNUF9CSVRTIDcKKyNkZWZpbmUgVlA4X0RJVEhFUl9BTVBfQ0VOVEVSICgxIDw8IFZQOF9ESVRIRVJfQU1QX0JJVFMpCitleHRlcm4gdm9pZCAoKlZQOERpdGhlckNvbWJpbmU4eDgpKGNvbnN0IHVpbnQ4X3QqIGRpdGhlciwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSk7CisKKy8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyB1c2luZyB0aGUgYWJvdmUKK3ZvaWQgVlA4RHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlAgSS9PCisKKyNkZWZpbmUgRkFOQ1lfVVBTQU1QTElORyAgIC8vIHVuZGVmaW5lZCB0byByZW1vdmUgZmFuY3kgdXBzYW1wbGluZyBzdXBwb3J0CisKKy8vIENvbnZlcnQgYSBwYWlyIG9mIHkvdS92IGxpbmVzIHRvZ2V0aGVyIHRvIHRoZSBvdXRwdXQgcmdiL2EgY29sb3JzcGFjZS4KKy8vIGJvdHRvbV95IGNhbiBiZSBOVUxMIGlmIG9ubHkgb25lIGxpbmUgb2Ygb3V0cHV0IGlzIG5lZWRlZCAoYXQgdG9wL2JvdHRvbSkuCit0eXBlZGVmIHZvaWQgKCpXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMpKAorICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwKKyAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsCisgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LAorICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pOworCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBGYW5jeSB1cHNhbXBsaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IFlVViB0byBSR0IoQSkgbW9kZXMKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworI2VuZGlmICAgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8gUGVyLXJvdyBwb2ludC1zYW1wbGluZyBtZXRob2RzLgordHlwZWRlZiB2b2lkICgqV2ViUFNhbXBsZXJSb3dGdW5jKShjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOworLy8gR2VuZXJpYyBmdW5jdGlvbiB0byBhcHBseSAnV2ViUFNhbXBsZXJSb3dGdW5jJyB0byB0aGUgd2hvbGUgcGxhbmU6Cit2b2lkIFdlYlBTYW1wbGVyUHJvY2Vzc1BsYW5lKGNvbnN0IHVpbnQ4X3QqIHksIGludCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgaW50IHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBXZWJQU2FtcGxlclJvd0Z1bmMgZnVuYyk7CisKKy8vIFNhbXBsaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IHJvd3Mgb2YgWVVWIHRvIFJHQihBKQorZXh0ZXJuIFdlYlBTYW1wbGVyUm93RnVuYyBXZWJQU2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworLy8gR2VuZXJhbCBmdW5jdGlvbiBmb3IgY29udmVydGluZyB0d28gbGluZXMgb2YgQVJHQiBvciBSR0JBLgorLy8gJ2FscGhhX2lzX2xhc3QnIHNob3VsZCBiZSB0cnVlIGlmIDB4ZmYwMDAwMDAgaXMgc3RvcmVkIGluIG1lbW9yeSBhcworLy8gYXMgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiAobGl0dGxlIGVuZGlhbikuCitXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKGludCBhbHBoYV9pc19sYXN0KTsKKworLy8gWVVWNDQ0LT5SR0IgY29udmVydGVycwordHlwZWRlZiB2b2lkICgqV2ViUFlVVjQ0NENvbnZlcnRlcikoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOworCitleHRlcm4gV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1svKiBNT0RFX0xBU1QgKi9dOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgdGhlIFdlYlBVcHNhbXBsZXJzW10gKGFuZCBmb3IgcHJlbXVsdGlwbGllZAorLy8gY29sb3JzcGFjZXMgbGlrZSByZ2JBLCByZ2JBNDQ0NCwgZXRjKQordm9pZCBXZWJQSW5pdFVwc2FtcGxlcnModm9pZCk7CisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgV2ViUFNhbXBsZXJzW10KK3ZvaWQgV2ViUEluaXRTYW1wbGVycyh2b2lkKTsKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBXZWJQWVVWNDQ0Q29udmVydGVyc1tdCit2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVycyh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFSR0IgLT4gWVVWIGNvbnZlcnRlcnMKKworLy8gQ29udmVydCBBUkdCIHNhbXBsZXMgdG8gbHVtYSBZLgorZXh0ZXJuIHZvaWQgKCpXZWJQQ29udmVydEFSR0JUb1kpKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOworLy8gQ29udmVydCBBUkdCIHNhbXBsZXMgdG8gVS9WIHdpdGggZG93bnNhbXBsaW5nLiBkb19zdG9yZSBzaG91bGQgYmUgJzEnIGZvcgorLy8gZXZlbiBsaW5lcyBhbmQgJzAnIGZvciBvZGQgb25lcy4gJ3NyY193aWR0aCcgaXMgdGhlIG9yaWdpbmFsIHdpZHRoLCBub3QKKy8vIHRoZSBVL1Ygb25lLgorZXh0ZXJuIHZvaWQgKCpXZWJQQ29udmVydEFSR0JUb1VWKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKTsKKworLy8gQ29udmVydCBhIHJvdyBvZiBhY2N1bXVsYXRlZCAoZm91ci12YWx1ZXMpIG9mIHJnYmEzMiB0b3dhcmQgVS9WCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0UkdCQTMyVG9VVikoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpOworCisvLyBDb252ZXJ0IFJHQiBvciBCR1IgdG8gWQorZXh0ZXJuIHZvaWQgKCpXZWJQQ29udmVydFJHQjI0VG9ZKShjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7CitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0QkdSMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKKworLy8gdXNlZCBmb3IgcGxhaW4tQyBmYWxsYmFjay4KK2V4dGVybiB2b2lkIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpOworZXh0ZXJuIHZvaWQgV2ViUENvbnZlcnRSR0JBMzJUb1VWX0MoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCk7CisKKy8vIHV0aWxpdGllcyBmb3IgYWNjdXJhdGUgUkdCLT5ZVVYgY29udmVyc2lvbgorZXh0ZXJuIHVpbnQ2NF90ICgqV2ViUFNoYXJwWVVWVXBkYXRlWSkoY29uc3QgdWludDE2X3QqIHNyYywgY29uc3QgdWludDE2X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgKCpXZWJQU2hhcnBZVVZVcGRhdGVSR0IpKGNvbnN0IGludDE2X3QqIHNyYywgY29uc3QgaW50MTZfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGRzdCwgaW50IGxlbik7CitleHRlcm4gdm9pZCAoKldlYlBTaGFycFlVVkZpbHRlclJvdykoY29uc3QgaW50MTZfdCogQSwgY29uc3QgaW50MTZfdCogQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBiZXN0X3ksIHVpbnQxNl90KiBvdXQpOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXNjYWxlcgorCitzdHJ1Y3QgV2ViUFJlc2NhbGVyOworCisvLyBJbXBvcnQgYSByb3cgb2YgZGF0YSBhbmQgc2F2ZSBpdHMgY29udHJpYnV0aW9uIGluIHRoZSByZXNjYWxlci4KKy8vICdjaGFubmVsJyBkZW5vdGVzIHRoZSBjaGFubmVsIG51bWJlciB0byBiZSBpbXBvcnRlZC4gJ0V4cGFuZCcgY29ycmVzcG9uZHMgdG8KKy8vIHRoZSB3cmstPnhfZXhwYW5kIGNhc2UuIE90aGVyd2lzZSwgJ1NocmluaycgaXMgdG8gYmUgdXNlZC4KK3R5cGVkZWYgdm9pZCAoKldlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMpKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyk7CisKK2V4dGVybiBXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZDsKK2V4dGVybiBXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluazsKKworLy8gRXhwb3J0IG9uZSByb3cgKHN0YXJ0aW5nIGF0IHhfb3V0IHBvc2l0aW9uKSBmcm9tIHJlc2NhbGVyLgorLy8gJ0V4cGFuZCcgY29ycmVzcG9uZHMgdG8gdGhlIHdyay0+eV9leHBhbmQgY2FzZS4KKy8vIE90aGVyd2lzZSAnU2hyaW5rJyBpcyB0byBiZSB1c2VkCit0eXBlZGVmIHZvaWQgKCpXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jKShzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOworZXh0ZXJuIFdlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kOworZXh0ZXJuIFdlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rOworCisvLyBQbGFpbi1DIGltcGxlbWVudGF0aW9uLCBhcyBmYWxsLWJhY2suCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfQyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX0Moc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9DKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfQyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOworCisvLyBNYWluIGVudHJ5IGNhbGxzOgorZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93KHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpOworLy8gRXhwb3J0IG9uZSByb3cgKHN0YXJ0aW5nIGF0IHhfb3V0IHBvc2l0aW9uKSBmcm9tIHJlc2NhbGVyLgorZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7CisKKy8vIE11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB1c2luZyB0aGUgYWJvdmUuCit2b2lkIFdlYlBSZXNjYWxlckRzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbC4KKworLy8gQXBwbHkgYWxwaGEgcHJlLW11bHRpcGx5IG9uIGFuIHJnYmEsIGJncmEgb3IgYXJnYiBwbGFuZSBvZiBzaXplIHcgKiBoLgorLy8gYWxwaGFfZmlyc3Qgc2hvdWxkIGJlIDAgZm9yIGFyZ2IsIDEgZm9yIHJnYmEgb3IgYmdyYSAod2hlcmUgYWxwaGEgaXMgbGFzdCkuCitleHRlcm4gdm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHkpKAorICAgIHVpbnQ4X3QqIHJnYmEsIGludCBhbHBoYV9maXJzdCwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKTsKKworLy8gU2FtZSwgYnVmIHNwZWNpZmljYWxseSBmb3IgUkdCQTQ0NDQgZm9ybWF0CitleHRlcm4gdm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KSgKKyAgICB1aW50OF90KiByZ2JhNDQ0NCwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKTsKKworLy8gRGlzcGF0Y2ggdGhlIHZhbHVlcyBmcm9tIGFscGhhW10gcGxhbmUgdG8gdGhlIEFSR0IgZGVzdGluYXRpb24gJ2RzdCcuCisvLyBSZXR1cm5zIHRydWUgaWYgYWxwaGFbXSBwbGFuZSBoYXMgbm9uLXRyaXZpYWwgdmFsdWVzIGRpZmZlcmVudCBmcm9tIDB4ZmYuCitleHRlcm4gaW50ICgqV2ViUERpc3BhdGNoQWxwaGEpKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpOworCisvLyBUcmFuc2ZlciBwYWNrZWQgOGIgYWxwaGFbXSB2YWx1ZXMgdG8gZ3JlZW4gY2hhbm5lbCBpbiBkc3RbXSwgemVybydpbmcgdGhlCisvLyBBL1IvQiB2YWx1ZXMuICdkc3Rfc3RyaWRlJyBpcyB0aGUgc3RyaWRlIGZvciBkc3RbXSBpbiB1aW50MzJfdCB1bml0cy4KK2V4dGVybiB2b2lkICgqV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpOworCisvLyBFeHRyYWN0IHRoZSBhbHBoYSB2YWx1ZXMgZnJvbSAzMmIgdmFsdWVzIGluIGFyZ2JbXSBhbmQgcGFjayB0aGVtIGludG8gYWxwaGFbXQorLy8gKHRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIFdlYlBEaXNwYXRjaEFscGhhKS4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIG9ubHkgdHJpdmlhbCAweGZmIGFscGhhIHZhbHVlcy4KK2V4dGVybiBpbnQgKCpXZWJQRXh0cmFjdEFscGhhKShjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKTsKKworLy8gRXh0cmFjdCB0aGUgZ3JlZW4gdmFsdWVzIGZyb20gMzJiIHZhbHVlcyBpbiBhcmdiW10gYW5kIHBhY2sgdGhlbSBpbnRvIGFscGhhW10KKy8vICh0aGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4pLgorZXh0ZXJuIHZvaWQgKCpXZWJQRXh0cmFjdEdyZWVuKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogYWxwaGEsIGludCBzaXplKTsKKworLy8gUHJlLU11bHRpcGx5IG9wZXJhdGlvbiB0cmFuc2Zvcm1zIHggaW50byB4ICogQSAvIDI1NSAgKHdoZXJlIHg9WSxSLEcgb3IgQikuCisvLyBVbi1NdWx0aXBseSBvcGVyYXRpb24gdHJhbnNmb3JtcyB4IGludG8geCAqIDI1NSAvIEEuCisKKy8vIFByZS1NdWx0aXBseSBvciBVbi1NdWx0aXBseSAoaWYgJ2ludmVyc2UnIGlzIHRydWUpIGFyZ2IgdmFsdWVzIGluIGEgcm93LgorZXh0ZXJuIHZvaWQgKCpXZWJQTXVsdEFSR0JSb3cpKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpOworCisvLyBTYW1lIGEgV2ViUE11bHRBUkdCUm93KCksIGJ1dCBmb3Igc2V2ZXJhbCByb3dzLgordm9pZCBXZWJQTXVsdEFSR0JSb3dzKHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UpOworCisvLyBTYW1lIGZvciBhIHJvdyBvZiBzaW5nbGUgdmFsdWVzLCB3aXRoIHNpZGUgYWxwaGEgdmFsdWVzLgorZXh0ZXJuIHZvaWQgKCpXZWJQTXVsdFJvdykodWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGludmVyc2UpOworCisvLyBTYW1lIGEgV2ViUE11bHRSb3coKSwgYnV0IGZvciBzZXZlcmFsICdudW1fcm93cycgcm93cy4KK3ZvaWQgV2ViUE11bHRSb3dzKHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgbnVtX3Jvd3MsIGludCBpbnZlcnNlKTsKKworLy8gUGxhaW4tQyB2ZXJzaW9ucywgdXNlZCBhcyBmYWxsYmFjayBieSBzb21lIGltcGxlbWVudGF0aW9ucy4KK3ZvaWQgV2ViUE11bHRSb3dfQyh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGludmVyc2UpOwordm9pZCBXZWJQTXVsdEFSR0JSb3dfQyh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorLy8gQVJHQiBwYWNraW5nIGZ1bmN0aW9uOiBhL3IvZy9iIGlucHV0IGlzIHJnYmEgb3IgYmdyYSBvcmRlci4KK2V4dGVybiB2b2lkICgqV2ViUFBhY2tBUkdCKShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGcsIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCk7CisjZW5kaWYKKworLy8gUkdCIHBhY2tpbmcgZnVuY3Rpb24uICdzdGVwJyBjYW4gYmUgMyBvciA0LiByL2cvYiBpbnB1dCBpcyByZ2Igb3IgYmdyIG9yZGVyLgorZXh0ZXJuIHZvaWQgKCpXZWJQUGFja1JHQikoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBzdGVwLCB1aW50MzJfdCogb3V0KTsKKworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgc3JjW2ldIGNvbnRhaW5zIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gMHhmZi4KK2V4dGVybiBpbnQgKCpXZWJQSGFzQWxwaGE4YikoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKTsKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHNyY1s0KmldIGNvbnRhaW5zIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gMHhmZi4KK2V4dGVybiBpbnQgKCpXZWJQSGFzQWxwaGEzMmIpKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCk7CisKKy8vIFRvIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZyh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbHRlciBmdW5jdGlvbnMKKwordHlwZWRlZiBlbnVtIHsgICAgIC8vIEZpbHRlciB0eXBlcy4KKyAgV0VCUF9GSUxURVJfTk9ORSA9IDAsCisgIFdFQlBfRklMVEVSX0hPUklaT05UQUwsCisgIFdFQlBfRklMVEVSX1ZFUlRJQ0FMLAorICBXRUJQX0ZJTFRFUl9HUkFESUVOVCwKKyAgV0VCUF9GSUxURVJfTEFTVCA9IFdFQlBfRklMVEVSX0dSQURJRU5UICsgMSwgIC8vIGVuZCBtYXJrZXIKKyAgV0VCUF9GSUxURVJfQkVTVCwgICAgLy8gbWV0YS10eXBlcworICBXRUJQX0ZJTFRFUl9GQVNUCit9IFdFQlBfRklMVEVSX1RZUEU7CisKK3R5cGVkZWYgdm9pZCAoKldlYlBGaWx0ZXJGdW5jKShjb25zdCB1aW50OF90KiBpbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIG91dCk7CisvLyBJbi1wbGFjZSB1bi1maWx0ZXJpbmcuCisvLyBXYXJuaW5nISAncHJldl9saW5lJyBwb2ludGVyIGNhbiBiZSBlcXVhbCB0byAnY3VyX2xpbmUnIG9yICdwcmVkcycuCit0eXBlZGVmIHZvaWQgKCpXZWJQVW5maWx0ZXJGdW5jKShjb25zdCB1aW50OF90KiBwcmV2X2xpbmUsIGNvbnN0IHVpbnQ4X3QqIHByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY3VyX2xpbmUsIGludCB3aWR0aCk7CisKKy8vIEZpbHRlciB0aGUgZ2l2ZW4gZGF0YSB1c2luZyB0aGUgZ2l2ZW4gcHJlZGljdG9yLgorLy8gJ2luJyBjb3JyZXNwb25kcyB0byBhIDItZGltZW5zaW9uYWwgcGl4ZWwgYXJyYXkgb2Ygc2l6ZSAoc3RyaWRlICogaGVpZ2h0KQorLy8gaW4gcmFzdGVyIG9yZGVyLgorLy8gJ3N0cmlkZScgaXMgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FuIGxpbmUgKHdpdGggcG9zc2libGUgcGFkZGluZykuCisvLyAnb3V0JyBzaG91bGQgYmUgcHJlLWFsbG9jYXRlZC4KK2V4dGVybiBXZWJQRmlsdGVyRnVuYyBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKKworLy8gSW4tcGxhY2UgcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsdGVyZWQgZGF0YS4KKy8vIFRoZSByZWNvbnN0cnVjdGlvbiB3aWxsIGJlIGRvbmUgZm9yICdudW1fcm93cycgcm93cyBzdGFydGluZyBmcm9tICdyb3cnCisvLyAoYXNzdW1pbmcgcm93cyB1cHRvICdyb3cgLSAxJyBhcmUgYWxyZWFkeSByZWNvbnN0cnVjdGVkKS4KK2V4dGVybiBXZWJQVW5maWx0ZXJGdW5jIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07CisKKy8vIFRvIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBWUDhGaWx0ZXJzSW5pdCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfRFNQX0RTUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmMuYwpzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jLmMKaW5kZXggZmFlOGQ5My4uZjk2ZTE5YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuYy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jLmMKQEAgLTEyLDI2ICsxMiwyNiBAQAogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKICNlbmRpZgogCi0jaW5jbHVkZSAiLi9kc3AuaCIKLSNpbmNsdWRlICIuLi9lbmMvdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKIAogc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgewogICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7CiB9CiAKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXBfbWF4KGludCB2LCBpbnQgbWF4KSB7CiAgIHJldHVybiAodiA+IG1heCkgPyBtYXggOiB2OwogfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgpAQCAtNDgsMTAgKzQ4LDI4IEBACiAgIDggKyAwICogQlBTLCAgMTIgKyAwICogQlBTLCA4ICsgNCAqIEJQUywgMTIgKyA0ICogQlBTICAgICAvLyBWCiB9OwogCi1zdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisvLyBnZW5lcmFsLXB1cnBvc2UgdXRpbCBmdW5jdGlvbgordm9pZCBWUDhTZXRIaXN0b2dyYW1EYXRhKGNvbnN0IGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IG1heF92YWx1ZSA9IDAsIGxhc3Rfbm9uX3plcm8gPSAxOworICBpbnQgazsKKyAgZm9yIChrID0gMDsgayA8PSBNQVhfQ09FRkZfVEhSRVNIOyArK2spIHsKKyAgICBjb25zdCBpbnQgdmFsdWUgPSBkaXN0cmlidXRpb25ba107CisgICAgaWYgKHZhbHVlID4gMCkgeworICAgICAgaWYgKHZhbHVlID4gbWF4X3ZhbHVlKSBtYXhfdmFsdWUgPSB2YWx1ZTsKKyAgICAgIGxhc3Rfbm9uX3plcm8gPSBrOworICAgIH0KKyAgfQorICBoaXN0by0+bWF4X3ZhbHVlID0gbWF4X3ZhbHVlOworICBoaXN0by0+bGFzdF9ub25femVybyA9IGxhc3Rfbm9uX3plcm87Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX0MoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CiAgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OwogICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CiAgICAgaW50IGs7CiAgICAgaW50MTZfdCBvdXRbMTZdOwpAQCAtNjAsMTIgKzc4LDE0IEBACiAKICAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCiAgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKLSAgICAgIGNvbnN0IGludCB2ID0gYWJzKG91dFtrXSkgPj4gMzsgIC8vIFRPRE8oc2thbCk6IGFkZCByb3VuZGluZz8KKyAgICAgIGNvbnN0IGludCB2ID0gYWJzKG91dFtrXSkgPj4gMzsKICAgICAgIGNvbnN0IGludCBjbGlwcGVkX3ZhbHVlID0gY2xpcF9tYXgodiwgTUFYX0NPRUZGX1RIUkVTSCk7Ci0gICAgICBoaXN0by0+ZGlzdHJpYnV0aW9uW2NsaXBwZWRfdmFsdWVdKys7CisgICAgICArK2Rpc3RyaWJ1dGlvbltjbGlwcGVkX3ZhbHVlXTsKICAgICB9CiAgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKIH0KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcnVuLXRpbWUgdGFibGVzICh+NGspCkBAIC03Niw3ICs5Niw3IEBACiAvLyBhbmQgbWFrZSBzdXJlIGl0J3Mgc2V0IHRvIHRydWUgX2xhc3RfIChzbyBhcyB0byBiZSB0aHJlYWQtc2FmZSkKIHN0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX29rID0gMDsKIAotc3RhdGljIHZvaWQgSW5pdFRhYmxlcyh2b2lkKSB7CitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRUYWJsZXModm9pZCkgewogICBpZiAoIXRhYmxlc19vaykgewogICAgIGludCBpOwogICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKQEAgLTkwLDYgKzExMCw4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCiAKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKICNkZWZpbmUgU1RPUkUoeCwgeSwgdikgXAogICBkc3RbKHgpICsgKHkpICogQlBTXSA9IGNsaXBfOGIocmVmWyh4KSArICh5KSAqIEJQU10gKyAoKHYpID4+IDMpKQogCkBAIC0xMzAsMTUgKzE1MiwxNSBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIElUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKSB7CitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX0MoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKICAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOwogICBpZiAoZG9fdHdvKSB7CiAgICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKICAgfQogfQogCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpIHsKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fQyhjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KSB7CiAgIGludCBpOwogICBpbnQgdG1wWzE2XTsKICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgc3JjICs9IEJQUywgcmVmICs9IEJQUykgewpAQCAtMTY2LDM3ICsxODgsMTggQEAKICAgICBvdXRbMTIrIGldID0gKChhMyAqIDIyMTcgLSBhMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpOwogICB9CiB9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKIAotc3RhdGljIHZvaWQgSVRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGludCB0bXBbMTZdOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBhMCA9IGluWzAgKyBpXSArIGluWzEyICsgaV07Ci0gICAgY29uc3QgaW50IGExID0gaW5bNCArIGldICsgaW5bIDggKyBpXTsKLSAgICBjb25zdCBpbnQgYTIgPSBpbls0ICsgaV0gLSBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMyA9IGluWzAgKyBpXSAtIGluWzEyICsgaV07Ci0gICAgdG1wWzAgICsgaV0gPSBhMCArIGExOwotICAgIHRtcFs4ICArIGldID0gYTAgLSBhMTsKLSAgICB0bXBbNCAgKyBpXSA9IGEzICsgYTI7Ci0gICAgdG1wWzEyICsgaV0gPSBhMyAtIGEyOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBjb25zdCBpbnQgZGMgPSB0bXBbMCArIGkgKiA0XSArIDM7ICAgIC8vIHcvIHJvdW5kZXIKLSAgICBjb25zdCBpbnQgYTAgPSBkYyAgICAgICAgICAgICArIHRtcFszICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMSA9IHRtcFsxICsgaSAqIDRdICsgdG1wWzIgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGEyID0gdG1wWzEgKyBpICogNF0gLSB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTMgPSBkYyAgICAgICAgICAgICAtIHRtcFszICsgaSAqIDRdOwotICAgIG91dFsgMF0gPSAoYTAgKyBhMSkgPj4gMzsKLSAgICBvdXRbMTZdID0gKGEzICsgYTIpID4+IDM7Ci0gICAgb3V0WzMyXSA9IChhMCAtIGExKSA+PiAzOwotICAgIG91dFs0OF0gPSAoYTMgLSBhMikgPj4gMzsKLSAgICBvdXQgKz0gNjQ7Ci0gIH0KK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0yX0MoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBWUDhGVHJhbnNmb3JtKHNyYywgcmVmLCBvdXQpOworICBWUDhGVHJhbnNmb3JtKHNyYyArIDQsIHJlZiArIDQsIG91dCArIDE2KTsKIH0KIAotc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVF9DKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKICAgLy8gaW5wdXQgaXMgMTJiIHNpZ25lZAotICBpbnQxNl90IHRtcFsxNl07CisgIGludDMyX3QgdG1wWzE2XTsKICAgaW50IGk7CiAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IDY0KSB7CiAgICAgY29uc3QgaW50IGEwID0gKGluWzAgKiAxNl0gKyBpblsyICogMTZdKTsgIC8vIDEzYgpAQCAtMjIzLDYgKzIyNiw3IEBACiAgICAgb3V0WzEyICsgaV0gPSBiMyA+PiAxOwogICB9CiB9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKIAogI3VuZGVmIE1VTAogI3VuZGVmIFNUT1JFCkBAIC0yMzAsMjAgKzIzNCwxOCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEludHJhIHByZWRpY3Rpb25zCiAKLSNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCi0KIHN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbGwodWludDhfdCogZHN0LCBpbnQgdmFsdWUsIGludCBzaXplKSB7CiAgIGludCBqOwogICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSB7Ci0gICAgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIHNpemUpOworICAgIG1lbXNldChkc3QgKyBqICogQlBTLCB2YWx1ZSwgc2l6ZSk7CiAgIH0KIH0KIAogc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkKHVpbnQ4X3QqIGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CiAgIGludCBqOwotICBpZiAodG9wKSB7Ci0gICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgU2JNZW1vcnlDb3B5KGRzdCArIGogKiBCUFMsIHRvcCwgc2l6ZSk7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIG1lbWNweShkc3QgKyBqICogQlBTLCB0b3AsIHNpemUpOwogICB9IGVsc2UgewogICAgIEZpbGwoZHN0LCAxMjcsIHNpemUpOwogICB9CkBAIC0yNTEsMTAgKzI1MywxMCBAQAogCiBzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZCh1aW50OF90KiBkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBpbnQgc2l6ZSkgewotICBpZiAobGVmdCkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CiAgICAgaW50IGo7CiAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgewotICAgICAgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgbGVmdFtqXSwgc2l6ZSk7CisgICAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgbGVmdFtqXSwgc2l6ZSk7CiAgICAgfQogICB9IGVsc2UgewogICAgIEZpbGwoZHN0LCAxMjksIHNpemUpOwpAQCAtMjY0LDggKzI2Niw4IEBACiBzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgewogICBpbnQgeTsKLSAgaWYgKGxlZnQpIHsKLSAgICBpZiAodG9wKSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAgPSBjbGlwMSArIDI1NSAtIGxlZnRbLTFdOwogICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewogICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwX3RhYmxlID0gY2xpcCArIGxlZnRbeV07CkBAIC0yODMsNyArMjg1LDcgQEAKICAgICAvLyBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuCiAgICAgLy8gTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcwogICAgIC8vIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuCi0gICAgaWYgKHRvcCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgewogICAgICAgVmVydGljYWxQcmVkKGRzdCwgdG9wLCBzaXplKTsKICAgICB9IGVsc2UgewogICAgICAgRmlsbChkc3QsIDEyOSwgc2l6ZSk7CkBAIC0yOTYsMTUgKzI5OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgcm91bmQsIGludCBzaGlmdCkgewogICBpbnQgREMgPSAwOwogICBpbnQgajsKLSAgaWYgKHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSB0b3Bbal07Ci0gICAgaWYgKGxlZnQpIHsgICAvLyB0b3AgYW5kIGxlZnQgcHJlc2VudAorICAgIGlmIChsZWZ0ICE9IE5VTEwpIHsgICAvLyB0b3AgYW5kIGxlZnQgcHJlc2VudAogICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgREMgKz0gbGVmdFtqXTsKICAgICB9IGVsc2UgeyAgICAgIC8vIHRvcCwgYnV0IG5vIGxlZnQKICAgICAgIERDICs9IERDOwogICAgIH0KICAgICBEQyA9IChEQyArIHJvdW5kKSA+PiBzaGlmdDsKLSAgfSBlbHNlIGlmIChsZWZ0KSB7ICAgLy8gbGVmdCBidXQgbm8gdG9wCisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAgLy8gbGVmdCBidXQgbm8gdG9wCiAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgREMgKz0gbGVmdFtqXTsKICAgICBEQyArPSBEQzsKICAgICBEQyA9IChEQyArIHJvdW5kKSA+PiBzaGlmdDsKQEAgLTMxNyw4ICszMTksOCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIENocm9tYSA4eDggcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjIpCiAKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHNfQyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CiAgIC8vIFUgYmxvY2sKICAgRENNb2RlKEM4REM4ICsgZHN0LCBsZWZ0LCB0b3AsIDgsIDgsIDQpOwogICBWZXJ0aWNhbFByZWQoQzhWRTggKyBkc3QsIHRvcCwgOCk7CkBAIC0zMjYsOCArMzI4LDggQEAKICAgVHJ1ZU1vdGlvbihDOFRNOCArIGRzdCwgbGVmdCwgdG9wLCA4KTsKICAgLy8gViBibG9jawogICBkc3QgKz0gODsKLSAgaWYgKHRvcCkgdG9wICs9IDg7Ci0gIGlmIChsZWZ0KSBsZWZ0ICs9IDE2OworICBpZiAodG9wICE9IE5VTEwpIHRvcCArPSA4OworICBpZiAobGVmdCAhPSBOVUxMKSBsZWZ0ICs9IDE2OwogICBEQ01vZGUoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCwgOCwgOCwgNCk7CiAgIFZlcnRpY2FsUHJlZChDOFZFOCArIGRzdCwgdG9wLCA4KTsKICAgSG9yaXpvbnRhbFByZWQoQzhIRTggKyBkc3QsIGxlZnQsIDgpOwpAQCAtMzM3LDggKzMzOSw4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gbHVtYSAxNngxNiBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMykKIAotc3RhdGljIHZvaWQgSW50cmExNlByZWRzKHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKK3N0YXRpYyB2b2lkIEludHJhMTZQcmVkc19DKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewogICBEQ01vZGUoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wLCAxNiwgMTYsIDUpOwogICBWZXJ0aWNhbFByZWQoSTE2VkUxNiArIGRzdCwgdG9wLCAxNik7CiAgIEhvcml6b250YWxQcmVkKEkxNkhFMTYgKyBkc3QsIGxlZnQsIDE2KTsKQEAgLTM0OCw3ICszNTAsOCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIGx1bWEgNHg0IHByZWRpY3Rpb24KIAotI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorI2RlZmluZSBBVkczKGEsIGIsIGMpICgodWludDhfdCkoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKSkKICNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCiAKIHN0YXRpYyB2b2lkIFZFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgICAvLyB2ZXJ0aWNhbApAQCAtMzYwLDcgKzM2Myw3IEBACiAgIH07CiAgIGludCBpOwogICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCArIGkgKiBCUFMsIHZhbHMsIDQpOworICAgIG1lbWNweShkc3QgKyBpICogQlBTLCB2YWxzLCA0KTsKICAgfQogfQogCkBAIC0zNzAsMTAgKzM3MywxMCBAQAogICBjb25zdCBpbnQgSiA9IHRvcFstM107CiAgIGNvbnN0IGludCBLID0gdG9wWy00XTsKICAgY29uc3QgaW50IEwgPSB0b3BbLTVdOwotICAqKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSik7Ci0gICoodWludDMyX3QqKShkc3QgKyAxICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhJLCBKLCBLKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpOwotICAqKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSikpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEksIEosIEspKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhKLCBLLCBMKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCkpOwogfQogCiBzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKQEAgLTUyMCw3ICs1MjMsNyBAQAogCiAvLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKIC8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQotc3RhdGljIHZvaWQgSW50cmE0UHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKK3N0YXRpYyB2b2lkIEludHJhNFByZWRzX0ModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKICAgREM0KEk0REM0ICsgZHN0LCB0b3ApOwogICBUTTQoSTRUTTQgKyBkc3QsIHRvcCk7CiAgIFZFNChJNFZFNCArIGRzdCwgdG9wKTsKQEAgLTUzNiw2ICs1MzksNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE1ldHJpYwogCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRTU0UoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgewogICBpbnQgY291bnQgPSAwOwpAQCAtNTUxLDE4ICs1NTUsMzMgQEAKICAgcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaW50IFNTRTE2eDE2KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CiAgIHJldHVybiBHZXRTU0UoYSwgYiwgMTYsIDE2KTsKIH0KLXN0YXRpYyBpbnQgU1NFMTZ4OChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CitzdGF0aWMgaW50IFNTRTE2eDhfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CiAgIHJldHVybiBHZXRTU0UoYSwgYiwgMTYsIDgpOwogfQotc3RhdGljIGludCBTU0U4eDgoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworc3RhdGljIGludCBTU0U4eDhfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CiAgIHJldHVybiBHZXRTU0UoYSwgYiwgOCwgOCk7CiB9Ci1zdGF0aWMgaW50IFNTRTR4NChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CitzdGF0aWMgaW50IFNTRTR4NF9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKICAgcmV0dXJuIEdldFNTRShhLCBiLCA0LCA0KTsKIH0KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBNZWFuMTZ4NF9DKGNvbnN0IHVpbnQ4X3QqIHJlZiwgdWludDMyX3QgZGNbNF0pIHsKKyAgaW50IGssIHgsIHk7CisgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICB1aW50MzJfdCBhdmcgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgICAgYXZnICs9IHJlZlt4ICsgeSAqIEJQU107CisgICAgICB9CisgICAgfQorICAgIGRjW2tdID0gYXZnOworICAgIHJlZiArPSA0OyAgIC8vIGdvIHRvIG5leHQgNHg0IGJsb2NrLgorICB9Cit9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUZXh0dXJlIGRpc3RvcnRpb24KQEAgLTU3MCw4ICs1ODksMTAgQEAKIC8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAogLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgogCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogLy8gSGFkYW1hcmQgdHJhbnNmb3JtCiAvLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KKy8vIHdbXSBjb250YWlucyBhIHJvdy1tYWpvciA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KIHN0YXRpYyBpbnQgVFRyYW5zZm9ybShjb25zdCB1aW50OF90KiBpbiwgY29uc3QgdWludDE2X3QqIHcpIHsKICAgaW50IHN1bSA9IDA7CiAgIGludCB0bXBbMTZdOwpAQCAtNjA2LDI0ICs2MjcsMjUgQEAKICAgcmV0dXJuIHN1bTsKIH0KIAotc3RhdGljIGludCBEaXN0bzR4NChjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3Qgdykgeworc3RhdGljIGludCBEaXN0bzR4NF9DKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKICAgY29uc3QgaW50IHN1bTEgPSBUVHJhbnNmb3JtKGEsIHcpOwogICBjb25zdCBpbnQgc3VtMiA9IFRUcmFuc2Zvcm0oYiwgdyk7CiAgIHJldHVybiBhYnMoc3VtMiAtIHN1bTEpID4+IDU7CiB9CiAKLXN0YXRpYyBpbnQgRGlzdG8xNngxNihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CitzdGF0aWMgaW50IERpc3RvMTZ4MTZfQyhjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKICAgaW50IEQgPSAwOwogICBpbnQgeCwgeTsKICAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgewotICAgICAgRCArPSBEaXN0bzR4NChhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgICBEICs9IERpc3RvNHg0X0MoYSArIHggKyB5LCBiICsgeCArIHksIHcpOwogICAgIH0KICAgfQogICByZXR1cm4gRDsKIH0KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUXVhbnRpemF0aW9uCkBAIC02MzQsMjIgKzY1NiwyNCBAQAogfTsKIAogLy8gU2ltcGxlIHF1YW50aXphdGlvbgotc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfQyhpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKICAgaW50IGxhc3QgPSAtMTsKLSAgZm9yICg7IG4gPCAxNjsgKytuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgewogICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKICAgICBjb25zdCBpbnQgc2lnbiA9IChpbltqXSA8IDApOwotICAgIGNvbnN0IGludCBjb2VmZiA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKKyAgICBjb25zdCB1aW50MzJfdCBjb2VmZiA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKICAgICBpZiAoY29lZmYgPiBtdHgtPnp0aHJlc2hfW2pdKSB7Ci0gICAgICBjb25zdCBpbnQgUSA9IG10eC0+cV9bal07Ci0gICAgICBjb25zdCBpbnQgaVEgPSBtdHgtPmlxX1tqXTsKLSAgICAgIGNvbnN0IGludCBCID0gbXR4LT5iaWFzX1tqXTsKLSAgICAgIG91dFtuXSA9IFFVQU5URElWKGNvZWZmLCBpUSwgQik7Ci0gICAgICBpZiAob3V0W25dID4gTUFYX0xFVkVMKSBvdXRbbl0gPSBNQVhfTEVWRUw7Ci0gICAgICBpZiAoc2lnbikgb3V0W25dID0gLW91dFtuXTsKLSAgICAgIGluW2pdID0gb3V0W25dICogUTsKLSAgICAgIGlmIChvdXRbbl0pIGxhc3QgPSBuOworICAgICAgY29uc3QgdWludDMyX3QgUSA9IG10eC0+cV9bal07CisgICAgICBjb25zdCB1aW50MzJfdCBpUSA9IG10eC0+aXFfW2pdOworICAgICAgY29uc3QgdWludDMyX3QgQiA9IG10eC0+Ymlhc19bal07CisgICAgICBpbnQgbGV2ZWwgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIpOworICAgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKSBsZXZlbCA9IE1BWF9MRVZFTDsKKyAgICAgIGlmIChzaWduKSBsZXZlbCA9IC1sZXZlbDsKKyAgICAgIGluW2pdID0gbGV2ZWwgKiAoaW50KVE7CisgICAgICBvdXRbbl0gPSBsZXZlbDsKKyAgICAgIGlmIChsZXZlbCkgbGFzdCA9IG47CiAgICAgfSBlbHNlIHsKICAgICAgIG91dFtuXSA9IDA7CiAgICAgICBpbltqXSA9IDA7CkBAIC02NTgsMTkgKzY4MiwzNSBAQAogICByZXR1cm4gKGxhc3QgPj0gMCk7CiB9CiAKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX0MoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBueiAgPSBWUDhFbmNRdWFudGl6ZUJsb2NrKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIG10eCkgPDwgMDsKKyAgbnogfD0gVlA4RW5jUXVhbnRpemVCbG9jayhpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBCbG9jayBjb3B5CiAKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBzaXplKSB7CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5KGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgdywgaW50IGgpIHsKICAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHNpemUpOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsKICAgICBzcmMgKz0gQlBTOwogICAgIGRzdCArPSBCUFM7CiAgIH0KIH0KIAotc3RhdGljIHZvaWQgQ29weTR4NChjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCkgeyBDb3B5KHNyYywgZHN0LCA0KTsgfQorc3RhdGljIHZvaWQgQ29weTR4NF9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KSB7CisgIENvcHkoc3JjLCBkc3QsIDQsIDQpOworfQorCitzdGF0aWMgdm9pZCBDb3B5MTZ4OF9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KSB7CisgIENvcHkoc3JjLCBkc3QsIDE2LCA4KTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEluaXRpYWxpemF0aW9uCkBAIC02ODAsNyArNzIwLDcgQEAKIFZQOENIaXN0byBWUDhDb2xsZWN0SGlzdG9ncmFtOwogVlA4SWRjdCBWUDhJVHJhbnNmb3JtOwogVlA4RmRjdCBWUDhGVHJhbnNmb3JtOwotVlA4V0hUIFZQOElUcmFuc2Zvcm1XSFQ7CitWUDhGZGN0IFZQOEZUcmFuc2Zvcm0yOwogVlA4V0hUIFZQOEZUcmFuc2Zvcm1XSFQ7CiBWUDhJbnRyYTRQcmVkcyBWUDhFbmNQcmVkTHVtYTQ7CiBWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRMdW1hMTY7CkBAIC02OTEsNDcgKzczMSwxMTIgQEAKIFZQOE1ldHJpYyBWUDhTU0U0eDQ7CiBWUDhXTWV0cmljIFZQOFREaXN0bzR4NDsKIFZQOFdNZXRyaWMgVlA4VERpc3RvMTZ4MTY7CitWUDhNZWFuTWV0cmljIFZQOE1lYW4xNng0OwogVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOworVlA4UXVhbnRpemUyQmxvY2tzIFZQOEVuY1F1YW50aXplMkJsb2NrczsKK1ZQOFF1YW50aXplQmxvY2tXSFQgVlA4RW5jUXVhbnRpemVCbG9ja1dIVDsKIFZQOEJsb2NrQ29weSBWUDhDb3B5NHg0OworVlA4QmxvY2tDb3B5IFZQOENvcHkxNng4OwogCiBleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRBVlgyKHZvaWQpOwogZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNU0Eodm9pZCk7CiAKLXZvaWQgVlA4RW5jRHNwSW5pdCh2b2lkKSB7CitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4RW5jRHNwSW5pdCkgeworICBWUDhEc3BJbml0KCk7ICAvLyBjb21tb24gaW52ZXJzZSB0cmFuc2Zvcm1zCiAgIEluaXRUYWJsZXMoKTsKIAogICAvLyBkZWZhdWx0IEMgaW1wbGVtZW50YXRpb25zCi0gIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtOwotICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybTsKLSAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm07Ci0gIFZQOElUcmFuc2Zvcm1XSFQgPSBJVHJhbnNmb3JtV0hUOwotICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVDsKLSAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHM7Ci0gIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHM7Ci0gIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkczsKLSAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNjsKLSAgVlA4U1NFOHg4ID0gU1NFOHg4OwotICBWUDhTU0UxNng4ID0gU1NFMTZ4ODsKLSAgVlA4U1NFNHg0ID0gU1NFNHg0OwotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NDsKLSAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2OwotICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9jazsKLSAgVlA4Q29weTR4NCA9IENvcHk0eDQ7CisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9DOworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9DOworICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVF9DOworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9DOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfQzsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fQzsKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9DOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9DOworICBWUDhTU0U4eDggPSBTU0U4eDhfQzsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X0M7CisjZW5kaWYKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19DOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfQzsKKyNlbmRpZgorCisgIFZQOEZUcmFuc2Zvcm0yID0gRlRyYW5zZm9ybTJfQzsKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHNfQzsKKyAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkc19DOworICBWUDhFbmNQcmVkQ2hyb21hOCA9IEludHJhQ2hyb21hUHJlZHNfQzsKKyAgVlA4TWVhbjE2eDQgPSBNZWFuMTZ4NF9DOworICBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUID0gUXVhbnRpemVCbG9ja19DOworICBWUDhDb3B5NHg0ID0gQ29weTR4NF9DOworICBWUDhDb3B5MTZ4OCA9IENvcHkxNng4X0M7CiAKICAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KLSAgaWYgKFZQOEdldENQVUluZm8pIHsKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgewogI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKICAgICAgIFZQOEVuY0RzcEluaXRTU0UyKCk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICAgIFZQOEVuY0RzcEluaXRTU0U0MSgpOworICAgICAgfQorI2VuZGlmCiAgICAgfQotI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgewotICAgICAgVlA4RW5jRHNwSW5pdE5FT04oKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfQVZYMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrQVZYMikpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRBVlgyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhFbmNEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRNU0EoKTsKICAgICB9CiAjZW5kaWYKICAgfQotfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFZQOEVuY0RzcEluaXRORU9OKCk7CisgIH0KICNlbmRpZgorCisgIGFzc2VydChWUDhJVHJhbnNmb3JtICE9IE5VTEwpOworICBhc3NlcnQoVlA4RlRyYW5zZm9ybSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEZUcmFuc2Zvcm1XSFQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhURGlzdG80eDQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhURGlzdG8xNngxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOENvbGxlY3RIaXN0b2dyYW0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhTU0UxNngxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNTRTE2eDggIT0gTlVMTCk7CisgIGFzc2VydChWUDhTU0U4eDggIT0gTlVMTCk7CisgIGFzc2VydChWUDhTU0U0eDQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNRdWFudGl6ZUJsb2NrICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUXVhbnRpemUyQmxvY2tzICE9IE5VTEwpOworICBhc3NlcnQoVlA4RlRyYW5zZm9ybTIgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNQcmVkTHVtYTQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNQcmVkTHVtYTE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUHJlZENocm9tYTggIT0gTlVMTCk7CisgIGFzc2VydChWUDhNZWFuMTZ4NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1F1YW50aXplQmxvY2tXSFQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhDb3B5NHg0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4Q29weTE2eDggIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19hdngyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19hdngyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjNTc5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX2F2eDIuYwpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQVZYMiB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0FWWDIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfQVZYMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRBVlgyKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MThmMGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwczMyLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIFNsb2JvZGFuIFByaWppYyAgKHNsb2JvZGFuLnByaWppY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaW5jbHVkZSAic3JjL2RzcC9taXBzX21hY3JvLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBJVHJhbnNmb3JtT25lCisvLyBNVUwgbWFjcm8gaW5saW5lZAorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBpbiBidWZmZXIKKy8vIFRFTVAwLi5URU1QMyAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKy8vIFRFTVA0Li5URU1QNSAtIHRlbXBvcmFyeSByZWdpc3RlcnMKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBURU1QNCwgVEVNUDAsIFRFTVAxLCBURU1QMiwgVEVNUDMpICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE2XSwgICAgICAiICNBICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGggICAgICAlW3RlbXAxOF0sICAgICAgIiAjQiAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxoICAgICAgJVt0ZW1wMTddLCAgICAgICIgI0MgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE5XSwgICAgICAiICNEICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMThdICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDE3XSwgICAgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlW3RlbXAxOF0sICAgICAgJVt0ZW1wMTldLCAgICAgICVba0MxXSAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE3XSwgICAgICAlW2tDMV0gICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbdGVtcDE5XSwgICAgICAlW3RlbXAxOV0sICAgICAgJVtrQzJdICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAxNiAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInNyYSAgICAgJVt0ZW1wMThdLCAgICAgICVbdGVtcDE4XSwgICAgICAxNiAgICAgICAgICAgICAgICBcblxuIiAgICAgICAgICBcCisgICJzcmEgICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxN10sICAgICAgMTYgICAgICAgICAgICAgICAgXG5cbiIgICAgICAgICAgXAorICAic3JhICAgICAlW3RlbXAxOV0sICAgICAgJVt0ZW1wMTldLCAgICAgIDE2ICAgICAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QMiAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMThdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDMgIl0sICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxOV0gICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVAzICJdIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMSAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDIgIl0gICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDIgIl0sICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAyICJdICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAzICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVAzICJdIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIElUcmFuc2Zvcm1PbmUKKy8vIE1VTCBhbmQgU1RPUkUgbWFjcm9zIGlubGluZWQKKy8vIGEgPSBjbGlwXzhiKGEpIGlzIHJlcGxhY2VkIHdpdGg6IGEgPSBtYXgoYSwgMCk7IGEgPSBtaW4oYSwgMjU1KQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIHJlZiBhbmQgc3RvcmUgdG8gZHN0IGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVA0LCBURU1QOCBhbmQgVEVNUDEyIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1MoQSwgVEVNUDAsIFRFTVA0LCBURU1QOCwgVEVNUDEyKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICA0ICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVAxMiAiXSwgICAlW2tDMV0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlW2tDMV0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVA4ICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QMTIgIl0gICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibHcgICAgICAlW3RlbXAyMF0sICAgICAgMCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVA4ICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxNl0sICAgICAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxN10sICAgICAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxOF0sICAgICAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxOV0sICAgICAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0gICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0sICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVAwICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMTZdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVA0ICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMTddICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVA4ICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVAxMiAiXSwgICAkemVybywgICAgICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkaXUgICAlW3RlbXAyMF0sICAgICAgJHplcm8sICAgICAgICAgIDI1NSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0sICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTZdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTddICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibHcgICAgICAlW3RlbXAxNl0sICAgICAgOCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVAwICJdLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVA0ICJdLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVA4ICJdLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVAxMiAiXSwgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIKKworLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmVfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgaW50IHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMzsKKyAgaW50IHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTksIHRlbXAyMDsKKyAgY29uc3QgaW50KiBhcmdzWzNdID0geyhjb25zdCBpbnQqKXJlZiwgKGNvbnN0IGludCopaW4sIChjb25zdCBpbnQqKWRzdH07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibHcgICAgICAlW3RlbXAyMF0sICAgICAgNCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoMCwgMTYsICA4LCAyNCwgdGVtcDQsICB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBWRVJUSUNBTF9QQVNTKDIsIDE4LCAxMCwgMjYsIHRlbXA4LCAgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgVkVSVElDQUxfUEFTUyg0LCAyMCwgMTIsIDI4LCB0ZW1wMTIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBWRVJUSUNBTF9QQVNTKDYsIDIyLCAxNCwgMzAsIHRlbXAyMCwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsIHRlbXAwLCB0ZW1wNCwgdGVtcDgsICB0ZW1wMTIpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsIHRlbXAxLCB0ZW1wNSwgdGVtcDksICB0ZW1wMTMpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXAyLCB0ZW1wNiwgdGVtcDEwLCB0ZW1wMTQpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsIHRlbXAzLCB0ZW1wNywgdGVtcDExLCB0ZW1wMTUpCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLAorICAgICAgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwKKyAgICAgIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCBbdGVtcDE3XSI9JnIiKHRlbXAxNyksCisgICAgICBbdGVtcDE4XSI9JnIiKHRlbXAxOCksIFt0ZW1wMTldIj0mciIodGVtcDE5KSwgW3RlbXAyMF0iPSZyIih0ZW1wMjApCisgICAgOiBbYXJnc10iciIoYXJncyksIFtrQzFdInIiKGtDMSksIFtrQzJdInIiKGtDMikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgSVRyYW5zZm9ybU9uZV9NSVBTMzIocmVmLCBpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIElUcmFuc2Zvcm1PbmVfTUlQUzMyKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKKy8vIG1hY3JvIGZvciBvbmUgcGFzcyB0aHJvdWdoIGZvciBsb29wIGluIFF1YW50aXplQmxvY2sKKy8vIFFVQU5URElWIG1hY3JvIGlubGluZWQKKy8vIEogLSBvZmZzZXQgaW4gYnl0ZXMgKGtaaWd6YWdbbl0gKiAyKQorLy8gSyAtIG9mZnNldCBpbiBieXRlcyAoa1ppZ3phZ1tuXSAqIDQpCisvLyBOIC0gb2Zmc2V0IGluIGJ5dGVzIChuICogMikKKyNkZWZpbmUgUVVBTlRJWkVfT05FKEosIEssIE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgJVt0ZW1wMF0sICAgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibGh1ICAgICAgICAgICVbdGVtcDFdLCAgICAgICAiICNKICIoJVtwcHNoYXJwZW5dKSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImx3ICAgICAgICAgICAlW3RlbXAyXSwgICAgICAgIiAjSyAiKCVbcHB6dGhyZXNoXSkgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJzcmEgICAgICAgICAgJVtzaWduXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgMTUgICAgICAgICAgICAgIFxuXHQiICAgXAorICAieG9yICAgICAgICAgICVbY29lZmZdLCAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgInN1YnUgICAgICAgICAlW2NvZWZmXSwgICAgICAgJVtjb2VmZl0sICAgICAgICAgICAlW3NpZ25dICAgICAgICAgXG5cdCIgICBcCisgICJhZGR1ICAgICAgICAgJVtjb2VmZl0sICAgICAgICVbY29lZmZdLCAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgIFxuXHQiICAgXAorICAic2x0ICAgICAgICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXAyXSwgICAgICAgICAgICVbY29lZmZdICAgICAgICBcblx0IiAgIFwKKyAgImFkZGl1ICAgICAgICAlW3RlbXA1XSwgICAgICAgJHplcm8sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJhZGRpdSAgICAgICAgJVtsZXZlbF0sICAgICAgICR6ZXJvLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAiYmVxeiAgICAgICAgICVbdGVtcDRdLCAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImxodSAgICAgICAgICAlW3RlbXAxXSwgICAgICAgIiAjSiAiKCVbcHBpcV0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsdyAgICAgICAgICAgJVt0ZW1wMl0sICAgICAgICIgI0sgIiglW3BwYmlhc10pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibGh1ICAgICAgICAgICVbdGVtcDNdLCAgICAgICAiICNKICIoJVtwcHFdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgIm11bCAgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtjb2VmZl0sICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgXG5cdCIgICBcCisgICJhZGR1ICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiICAgXAorICAic3JhICAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgIDE3ICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNsdCAgICAgICAgICAlW3RlbXA0XSwgICAgICAgJVttYXhfbGV2ZWxdLCAgICAgICAlW2xldmVsXSAgICAgICAgXG5cdCIgICBcCisgICJtb3ZuICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbWF4X2xldmVsXSwgICAgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiICAgXAorICAieG9yICAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgInN1YnUgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3NpZ25dICAgICAgICAgXG5cdCIgICBcCisgICJtdWwgICAgICAgICAgJVt0ZW1wNV0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgXAorIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNoICAgICAgICAgICAlW3RlbXA1XSwgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJzaCAgICAgICAgICAgJVtsZXZlbF0sICAgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19NSVBTMzIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGludCBzaWduLCBjb2VmZiwgbGV2ZWwsIGk7CisgIGludCBtYXhfbGV2ZWwgPSBNQVhfTEVWRUw7CisKKyAgaW50MTZfdCogcHBpbiAgICAgICAgICAgICA9ICZpblswXTsKKyAgaW50MTZfdCogcG91dCAgICAgICAgICAgICA9ICZvdXRbMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHNoYXJwZW4gPSAmbXR4LT5zaGFycGVuX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwenRocmVzaCA9ICZtdHgtPnp0aHJlc2hfWzBdOworICBjb25zdCB1aW50MTZfdCogcHBxICAgICAgID0gJm10eC0+cV9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcGlxICAgICAgPSAmbXR4LT5pcV9bMF07CisgIGNvbnN0IHVpbnQzMl90KiBwcGJpYXMgICAgPSAmbXR4LT5iaWFzX1swXTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgIFFVQU5USVpFX09ORSggMCwgIDAsICAwKQorICAgIFFVQU5USVpFX09ORSggMiwgIDQsICAyKQorICAgIFFVQU5USVpFX09ORSggOCwgMTYsICA0KQorICAgIFFVQU5USVpFX09ORSgxNiwgMzIsICA2KQorICAgIFFVQU5USVpFX09ORSgxMCwgMjAsICA4KQorICAgIFFVQU5USVpFX09ORSggNCwgIDgsIDEwKQorICAgIFFVQU5USVpFX09ORSggNiwgMTIsIDEyKQorICAgIFFVQU5USVpFX09ORSgxMiwgMjQsIDE0KQorICAgIFFVQU5USVpFX09ORSgxOCwgMzYsIDE2KQorICAgIFFVQU5USVpFX09ORSgyNCwgNDgsIDE4KQorICAgIFFVQU5USVpFX09ORSgyNiwgNTIsIDIwKQorICAgIFFVQU5USVpFX09ORSgyMCwgNDAsIDIyKQorICAgIFFVQU5USVpFX09ORSgxNCwgMjgsIDI0KQorICAgIFFVQU5USVpFX09ORSgyMiwgNDQsIDI2KQorICAgIFFVQU5USVpFX09ORSgyOCwgNTYsIDI4KQorICAgIFFVQU5USVpFX09ORSgzMCwgNjAsIDMwKQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbc2lnbl0iPSZyIihzaWduKSwgW2NvZWZmXSI9JnIiKGNvZWZmKSwKKyAgICAgIFtsZXZlbF0iPSZyIihsZXZlbCkKKyAgICA6IFtwb3V0XSJyIihwb3V0KSwgW3BwaW5dInIiKHBwaW4pLAorICAgICAgW3BwaXFdInIiKHBwaXEpLCBbbWF4X2xldmVsXSJyIihtYXhfbGV2ZWwpLAorICAgICAgW3BwYmlhc10iciIocHBiaWFzKSwgW3BwenRocmVzaF0iciIocHB6dGhyZXNoKSwKKyAgICAgIFtwcHNoYXJwZW5dInIiKHBwc2hhcnBlbiksIFtwcHFdInIiKHBwcSkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgLy8gbW92ZWQgb3V0IGZyb20gbWFjcm8gdG8gaW5jcmVhc2UgcG9zc2liaWxpdHkgZm9yIGVhcmxpZXIgYnJlYWtpbmcKKyAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKG91dFtpXSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX01JUFMzMihpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gUXVhbnRpemVCbG9ja19NSVBTMzIoaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBRdWFudGl6ZUJsb2NrX01JUFMzMihpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworI3VuZGVmIFFVQU5USVpFX09ORQorCisvLyBtYWNybyBmb3Igb25lIGhvcml6b250YWwgcGFzcyBpbiBEaXN0bzR4NCAoVFRyYW5zZm9ybSkKKy8vIHR3byBjYWxscyBvZiBmdW5jdGlvbiBUVHJhbnNmb3JtIGFyZSBtZXJnZWQgaW50byBzaW5nbGUgb25lCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBhIGFuZCBiIGJ1ZmZlcnMKKy8vIEUuLkggLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIGZpcnN0IHJlc3VsdHMgdG8gdG1wIGJ1ZmZlcgorLy8gRTEuLkgxIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSBzZWNvbmQgcmVzdWx0cyB0byB0bXAgYnVmZmVyCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBFLCBGLCBHLCBILCBFMSwgRjEsIEcxLCBIMSkgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wMF0sICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYV0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wMV0sICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYV0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wMl0sICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYV0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wM10sICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYV0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wNF0sICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYl0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wNV0sICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYl0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wNl0sICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYl0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgJVt0ZW1wN10sICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbYl0pICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wOF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wMl0sICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wM10sICAlW3RlbXA0XSwgICAgJVt0ZW1wNl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgJVt0ZW1wNl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wNl0sICAlW3RlbXA1XSwgICAgJVt0ZW1wN10gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgJVt0ZW1wN10gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wN10sICAlW3RlbXA4XSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMl0sICAlW3RlbXA4XSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wOF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wMV0sICAlW3RlbXAzXSwgICAgJVt0ZW1wNl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVt0ZW1wNl0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wNl0sICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wN10sICAiICNFICIoJVt0bXBdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wMl0sICAiICNIICIoJVt0bXBdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wOF0sICAiICNGICIoJVt0bXBdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wMF0sICAiICNHICIoJVt0bXBdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wMV0sICAiICNFMSAiKCVbdG1wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wM10sICAiICNIMSAiKCVbdG1wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wNl0sICAiICNGMSAiKCVbdG1wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgJVt0ZW1wNF0sICAiICNHMSAiKCVbdG1wXSkgICAgICAgICAgICAgICBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gRGlzdG80eDQgKFRUcmFuc2Zvcm0pCisvLyB0d28gY2FsbHMgb2YgZnVuY3Rpb24gVFRyYW5zZm9ybSBhcmUgbWVyZ2VkIGludG8gc2luZ2xlIG9uZQorLy8gc2luY2Ugb25seSBvbmUgYWNjdSBpcyBhdmFpbGFibGUgaW4gbWlwczMycjEgaW5zdHJ1Y3Rpb24gc2V0CisvLyAgIGZpcnN0IGlzIGRvbmUgc2Vjb25kIGNhbGwgb2YgZnVuY3Rpb24gVFRyYW5zZm9ybSBhbmQgYWZ0ZXIKKy8vICAgdGhhdCBmaXJzdCBvbmUuCisvLyAgIGNvbnN0IGludCBzdW0xID0gVFRyYW5zZm9ybShhLCB3KTsKKy8vICAgY29uc3QgaW50IHN1bTIgPSBUVHJhbnNmb3JtKGIsIHcpOworLy8gICByZXR1cm4gYWJzKHN1bTIgLSBzdW0xKSA+PiA1OworLy8gICAoc3VtMiAtIHN1bTEpIGlzIGNhbGN1bGF0ZWQgd2l0aCBtYWRkcyAoc3ViMikgYW5kIG1zdWJzIChzdWIxKQorLy8gQS4uRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gbG9hZCBmaXJzdCByZXN1bHRzIGZyb20gdG1wIGJ1ZmZlcgorLy8gQTEuLkQxIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIHNlY29uZCByZXN1bHRzIGZyb20gdG1wIGJ1ZmZlcgorLy8gRS4uSCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIHcgYnVmZmVyCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1MoQSwgQiwgQywgRCwgQTEsIEIxLCBDMSwgRDEsIEUsIEYsIEcsIEgpICAgICBcCisgICJsdyAgICAgJVt0ZW1wMF0sICAiICNBMSAiKCVbdG1wXSkgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wMV0sICAiICNDMSAiKCVbdG1wXSkgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wMl0sICAiICNCMSAiKCVbdG1wXSkgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wM10sICAiICNEMSAiKCVbdG1wXSkgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wOF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wMV0sICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wM10sICAlW3RlbXA4XSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wNF0sICAlW3RlbXAzXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wNV0sICAlW3RlbXAxXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wNl0sICAlW3RlbXAwXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wN10sICAlW3RlbXA4XSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wNl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wNl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsaHUgICAgJVt0ZW1wNF0sICAiICNFICIoJVt3XSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsaHUgICAgJVt0ZW1wNV0sICAiICNGICIoJVt3XSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsaHUgICAgJVt0ZW1wNl0sICAiICNHICIoJVt3XSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsaHUgICAgJVt0ZW1wN10sICAiICNIICIoJVt3XSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtYWRkICAgJVt0ZW1wNF0sICAlW3RlbXAzXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtYWRkICAgJVt0ZW1wNV0sICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtYWRkICAgJVt0ZW1wNl0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtYWRkICAgJVt0ZW1wN10sICAlW3RlbXA4XSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wMF0sICAiICNBICIoJVt0bXBdKSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wMV0sICAiICNDICIoJVt0bXBdKSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wMl0sICAiICNCICIoJVt0bXBdKSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVt0ZW1wM10sICAiICNEICIoJVt0bXBdKSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wOF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wMV0sICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wM10sICAlW3RlbXA4XSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMV0sICAlW3RlbXA4XSwgICAgJVt0ZW1wMV0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgJVt0ZW1wOF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wMl0sICAlW3RlbXAzXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtc3ViICAgJVt0ZW1wNF0sICAlW3RlbXAzXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wMl0sICAlW3RlbXA4XSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wM10sICAlW3RlbXAwXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgJVt0ZW1wNF0sICAlW3RlbXAxXSwgICAgMzEgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJ4b3IgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVt0ZW1wNF0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgJVt0ZW1wMl0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVt0ZW1wM10gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVt0ZW1wNF0gICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtc3ViICAgJVt0ZW1wNV0sICAlW3RlbXA4XSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtc3ViICAgJVt0ZW1wNl0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICBcCisgICJtc3ViICAgJVt0ZW1wN10sICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgaW50IERpc3RvNHg0X01JUFMzMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IHRtcFszMl07CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsICAgMCwgIDQsICA4LCAxMiwgICAgNjQsICA2OCwgIDcyLCAgNzYpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsICAxNiwgMjAsIDI0LCAyOCwgICAgODAsICA4NCwgIDg4LCAgOTIpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsICAzMiwgMzYsIDQwLCA0NCwgICAgOTYsIDEwMCwgMTA0LCAxMDgpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsICA0OCwgNTIsIDU2LCA2MCwgICAxMTIsIDExNiwgMTIwLCAxMjQpCisgICAgIm10aGkgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibXRsbyAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoIDAsIDE2LCAzMiwgNDgsICAgICA2NCwgODAsICA5NiwgMTEyLCAgIDAsICA4LCAxNiwgMjQpCisgICAgVkVSVElDQUxfUEFTUyggNCwgMjAsIDM2LCA1MiwgICAgIDY4LCA4NCwgMTAwLCAxMTYsICAgMiwgMTAsIDE4LCAyNikKKyAgICBWRVJUSUNBTF9QQVNTKCA4LCAyNCwgNDAsIDU2LCAgICAgNzIsIDg4LCAxMDQsIDEyMCwgICA0LCAxMiwgMjAsIDI4KQorICAgIFZFUlRJQ0FMX1BBU1MoMTIsIDI4LCA0NCwgNjAsICAgICA3NiwgOTIsIDEwOCwgMTI0LCAgIDYsIDE0LCAyMiwgMzApCisgICAgIm1mbG8gICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAzMSAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAic3JhICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICA1ICAgICAgICAgICBcblx0IgorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpLCBbd10iciIodyksIFt0bXBdInIiKHRtcCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIHRlbXAwOworfQorCisjdW5kZWYgVkVSVElDQUxfUEFTUworI3VuZGVmIEhPUklaT05UQUxfUEFTUworCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfTUlQUzMyKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBzcmMgYW5kIHJlZiBidWZmZXJzCisvLyBURU1QMC4uVEVNUDMgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMykgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVsiICNURU1QMSAiXSwgIDAoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsdyAgICAgJVsiICNURU1QMiAiXSwgIDQoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTZdLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTddLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMThdLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTldLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMjBdLCAgICAlW3RlbXAxNl0sICAgICVbdGVtcDE3XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTZdLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTddLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMCAiXSwgICVbdGVtcDE4XSwgICAgJVt0ZW1wMTldICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMThdLCAgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTldLCAgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTddICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDE4XSwgICAgJVt0ZW1wMTldICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMyAiXSwgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMiAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMiAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMSAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxICJdICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTZdLCAgICAlWyIgI1RFTVAyICJdLCAgJVtjNTM1Ml0gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTddLCAgICAlWyIgI1RFTVAyICJdLCAgJVtjMjIxN10gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMThdLCAgICAlWyIgI1RFTVAwICJdLCAgJVtjNTM1Ml0gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTldLCAgICAlWyIgI1RFTVAwICJdLCAgJVtjMjIxN10gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDMgIl0sICAlW3RlbXAyMF0gICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAzICJdLCAgJVt0ZW1wMjBdICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzbGwgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEgIl0sICAzICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzbGwgICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDIwXSwgICAgMyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxNl0sICAgIDE4MTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTddLCAgICAlW3RlbXAxN10sICAgIDkzNyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxNl0sICAgICVbdGVtcDE5XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMTddLCAgICAlW3RlbXAxN10sICAgICVbdGVtcDE4XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDE2XSwgICAgOSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMyAiXSwgICVbdGVtcDE3XSwgICAgOSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gRlRyYW5zZm9ybQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHRvIG91dCBidWZmZXIKKy8vIFRFTVAwLCBURU1QNCwgVEVNUDggYW5kIFRFTVAxMiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBURU1QMCwgVEVNUDQsIFRFTVA4LCBURU1QMTIpICAgIFwKKyAgImFkZHUgICAlW3RlbXAxNl0sICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAxOV0sICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlW3RlbXAxN10sICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAxOF0sICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVA4ICJdLCAgJVt0ZW1wMTldLCAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVAxMiAiXSwgJVt0ZW1wMThdLCAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVA0ICJdLCAgJVt0ZW1wMTldLCAgICAlW2M1MzUyXSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxOF0sICAgICVbdGVtcDE4XSwgICAgJVtjNTM1Ml0gICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxNl0sICAgICVbdGVtcDE2XSwgICAgNyAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMCAiXSwgIDQgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sICVbIiAjVEVNUDQgIl0gIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVA0ICJdLCAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QNCAiXSwgIDQgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDMwMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sIDEyMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDIxMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgICVbdGVtcDE4XSAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sIDE2ICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDE2ICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxNl0sICAgICVbIiAjVEVNUDEyICJdLCAxICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgIm1vdm4gICAlWyIgI1RFTVAxMiAiXSwgJVt0ZW1wMTZdLCAgICAlW3RlbXAxOV0gICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVA0ICJdLCAgIiAjQyAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVA4ICJdLCAgIiAjRCAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVAxMiAiXSwgIiAjQiAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBpbnQgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNjsKKyAgaW50IHRlbXAxNywgdGVtcDE4LCB0ZW1wMTksIHRlbXAyMDsKKyAgY29uc3QgaW50IGMyMjE3ID0gMjIxNzsKKyAgY29uc3QgaW50IGM1MzUyID0gNTM1MjsKKyAgY29uc3QgaW50KiBjb25zdCBhcmdzWzNdID0KKyAgICAgIHsgKGNvbnN0IGludCopc3JjLCAoY29uc3QgaW50KilyZWYsIChjb25zdCBpbnQqKW91dCB9OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsIHRlbXAwLCAgdGVtcDEsICB0ZW1wMiwgIHRlbXAzKQorICAgIEhPUklaT05UQUxfUEFTUygxLCB0ZW1wNCwgIHRlbXA1LCAgdGVtcDYsICB0ZW1wNykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMiwgdGVtcDgsICB0ZW1wOSwgIHRlbXAxMCwgdGVtcDExKQorICAgIEhPUklaT05UQUxfUEFTUygzLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUpCisgICAgImx3ICAgJVt0ZW1wMjBdLCAgICA4KCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBWRVJUSUNBTF9QQVNTKDAsICA4LCAxNiwgMjQsIHRlbXAwLCB0ZW1wNCwgdGVtcDgsICB0ZW1wMTIpCisgICAgVkVSVElDQUxfUEFTUygyLCAxMCwgMTgsIDI2LCB0ZW1wMSwgdGVtcDUsIHRlbXA5LCAgdGVtcDEzKQorICAgIFZFUlRJQ0FMX1BBU1MoNCwgMTIsIDIwLCAyOCwgdGVtcDIsIHRlbXA2LCB0ZW1wMTAsIHRlbXAxNCkKKyAgICBWRVJUSUNBTF9QQVNTKDYsIDE0LCAyMiwgMzAsIHRlbXAzLCB0ZW1wNywgdGVtcDExLCB0ZW1wMTUpCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLAorICAgICAgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwKKyAgICAgIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCBbdGVtcDE3XSI9JnIiKHRlbXAxNyksCisgICAgICBbdGVtcDE4XSI9JnIiKHRlbXAxOCksIFt0ZW1wMTldIj0mciIodGVtcDE5KSwgW3RlbXAyMF0iPSZyIih0ZW1wMjApCisgICAgOiBbYXJnc10iciIoYXJncyksIFtjMjIxN10iciIoYzIyMTcpLCBbYzUzNTJdInIiKGM1MzUyKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1MKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1MKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworI2RlZmluZSBHRVRfU1NFX0lOTkVSKEEsIEIsIEMsIEQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMF0sICAgICIgI0EgIiglW2FdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDFdLCAgICAiICNBICIoJVtiXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAyXSwgICAgIiAjQiAiKCVbYV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wM10sICAgICIgI0IgIiglW2JdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDRdLCAgICAiICNDICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA1XSwgICAgIiAjQyAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wNl0sICAgICIgI0QgIiglW2FdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDddLCAgICAiICNEICIoJVtiXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAxXSAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wM10gICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICVbdGVtcDVdICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgICAlW3RlbXA3XSAgICAgICBcblx0IiAgICAgIFwKKyAgIm1hZGQgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibWFkZCAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIm1hZGQgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBHRVRfU1NFKEEsIEIsIEMsIEQpICAgICAgICAgICAgICAgXAorICBHRVRfU1NFX0lOTkVSKEEsIEEgKyAxLCBBICsgMiwgQSArIDMpICAgXAorICBHRVRfU1NFX0lOTkVSKEIsIEIgKyAxLCBCICsgMiwgQiArIDMpICAgXAorICBHRVRfU1NFX0lOTkVSKEMsIEMgKyAxLCBDICsgMiwgQyArIDMpICAgXAorICBHRVRfU1NFX0lOTkVSKEQsIEQgKyAxLCBEICsgMiwgRCArIDMpCisKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorICAgICBHRVRfU1NFKCA4ICogQlBTLCA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUykKKyAgICAgR0VUX1NTRSggOSAqIEJQUywgNCArICA5ICogQlBTLCA4ICsgIDkgKiBCUFMsIDEyICsgIDkgKiBCUFMpCisgICAgIEdFVF9TU0UoMTAgKiBCUFMsIDQgKyAxMCAqIEJQUywgOCArIDEwICogQlBTLCAxMiArIDEwICogQlBTKQorICAgICBHRVRfU1NFKDExICogQlBTLCA0ICsgMTEgKiBCUFMsIDggKyAxMSAqIEJQUywgMTIgKyAxMSAqIEJQUykKKyAgICAgR0VUX1NTRSgxMiAqIEJQUywgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMpCisgICAgIEdFVF9TU0UoMTMgKiBCUFMsIDQgKyAxMyAqIEJQUywgOCArIDEzICogQlBTLCAxMiArIDEzICogQlBTKQorICAgICBHRVRfU1NFKDE0ICogQlBTLCA0ICsgMTQgKiBCUFMsIDggKyAxNCAqIEJQUywgMTIgKyAxNCAqIEJQUykKKyAgICAgR0VUX1NTRSgxNSAqIEJQUywgNCArIDE1ICogQlBTLCA4ICsgMTUgKiBCUFMsIDEyICsgMTUgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0UxNng4X01JUFMzMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgIEdFVF9TU0UoIDAgKiBCUFMsIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTKQorICAgICBHRVRfU1NFKCAxICogQlBTLCA0ICsgIDEgKiBCUFMsIDggKyAgMSAqIEJQUywgMTIgKyAgMSAqIEJQUykKKyAgICAgR0VUX1NTRSggMiAqIEJQUywgNCArICAyICogQlBTLCA4ICsgIDIgKiBCUFMsIDEyICsgIDIgKiBCUFMpCisgICAgIEdFVF9TU0UoIDMgKiBCUFMsIDQgKyAgMyAqIEJQUywgOCArICAzICogQlBTLCAxMiArICAzICogQlBTKQorICAgICBHRVRfU1NFKCA0ICogQlBTLCA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUykKKyAgICAgR0VUX1NTRSggNSAqIEJQUywgNCArICA1ICogQlBTLCA4ICsgIDUgKiBCUFMsIDEyICsgIDUgKiBCUFMpCisgICAgIEdFVF9TU0UoIDYgKiBCUFMsIDQgKyAgNiAqIEJQUywgOCArICA2ICogQlBTLCAxMiArICA2ICogQlBTKQorICAgICBHRVRfU1NFKCA3ICogQlBTLCA0ICsgIDcgKiBCUFMsIDggKyAgNyAqIEJQUywgMTIgKyAgNyAqIEJQUykKKworICAgICJtZmxvICAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTh4OF9NSVBTMzIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICBHRVRfU1NFKDAgKiBCUFMsIDQgKyAwICogQlBTLCAxICogQlBTLCA0ICsgMSAqIEJQUykKKyAgICAgR0VUX1NTRSgyICogQlBTLCA0ICsgMiAqIEJQUywgMyAqIEJQUywgNCArIDMgKiBCUFMpCisgICAgIEdFVF9TU0UoNCAqIEJQUywgNCArIDQgKiBCUFMsIDUgKiBCUFMsIDQgKyA1ICogQlBTKQorICAgICBHRVRfU1NFKDYgKiBCUFMsIDQgKyA2ICogQlBTLCA3ICogQlBTLCA0ICsgNyAqIEJQUykKKworICAgICJtZmxvICAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTR4NF9NSVBTMzIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICBHRVRfU1NFKDAgKiBCUFMsIDEgKiBCUFMsIDIgKiBCUFMsIDMgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworI3VuZGVmIEdFVF9TU0UKKyN1bmRlZiBHRVRfU1NFX0lOTkVSCisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTMzIodm9pZCkgeworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9NSVBTMzI7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX01JUFMzMjsKKworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19NSVBTMzI7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19NSVBTMzI7CisKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfTUlQUzMyOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfTUlQUzMyOworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X01JUFMzMjsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4X01JUFMzMjsKKyAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhfTUlQUzMyOworICBWUDhTU0U0eDQgPSBTU0U0eDRfTUlQUzMyOworI2VuZGlmCit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyODc2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxNTIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6IERhcmtvIExhdXMgKGRhcmtvLmxhdXNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgTWlya28gUmF1cyAobWlya28ucmF1c0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvbWlwc19tYWNyby5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBBRERfU1VCX0hBTFZFU19YNChPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNiwgTzcsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3KSAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgICVbIiAjSTEgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0sICAlWyIgI0kxICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI0kyICJdLCAgJVsiICNJMyAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNJMiAiXSwgICVbIiAjSTMgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjSTQgIl0sICAlWyIgI0k1ICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI0k0ICJdLCAgJVsiICNJNSAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNJNiAiXSwgICVbIiAjSTcgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjSTYgIl0sICAlWyIgI0k3ICJdICAgICBcblx0IgorCisvLyBJTyAtIGlucHV0L291dHB1dAorI2RlZmluZSBBQlNfWDgoSU8wLCBJTzEsIElPMiwgSU8zLCBJTzQsIElPNSwgSU82LCBJTzcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzAgIl0sICAgJVsiICNJTzAgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU8xICJdLCAgICVbIiAjSU8xICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPMiAiXSwgICAlWyIgI0lPMiAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzMgIl0sICAgJVsiICNJTzMgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU80ICJdLCAgICVbIiAjSU80ICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPNSAiXSwgICAlWyIgI0lPNSAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzYgIl0sICAgJVsiICNJTzYgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU83ICJdLCAgICVbIiAjSU83ICJdICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIGRwYS53LnBoICRhYzAgdGVtcDAgLHRlbXAxCisvLyAgJGFjICs9IHRlbXAwWzMxLi4xNl0gKiB0ZW1wMVszMS4uMTZdICsgdGVtcDBbMTUuLjBdICogdGVtcDFbMTUuLjBdCisvLyBkcGF4LncucGggJGFjMCB0ZW1wMCAsdGVtcDEKKy8vICAkYWMgKz0gdGVtcDBbMzEuLjE2XSAqIHRlbXAxWzE1Li4wXSArIHRlbXAwWzE1Li4wXSAqIHRlbXAxWzMxLi4xNl0KKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIE1VTF9IQUxGKE8wLCBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBJOCwgSTksIEkxMCwgSTExLCBJMTIsIEkxMywgSTE0LCBJMTUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXVsdCAgICAgICAgICAgICRhYzAsICAgICAgJHplcm8sICAgICAkemVybyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTIgIl0sICAlWyIgI0kwICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0k1ICJdLCAgJVsiICNJNiAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBhLncucGggICAgICAgICRhYzAsICAgICAgJVsiICNJOCAiXSwgICVbIiAjSTkgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYXgudy5waCAgICAgICAkYWMwLCAgICAgICVbIiAjSTExICJdLCAlWyIgI0k0ICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGEudy5waCAgICAgICAgJGFjMCwgICAgICAlWyIgI0kxMiAiXSwgJVsiICNJNyAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBheC53LnBoICAgICAgICRhYzAsICAgICAgJVsiICNJMTMgIl0sICVbIiAjSTEgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTE0ICJdLCAlWyIgI0kzICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0kxNSAiXSwgJVsiICNJMTAgIl0gICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAibWZsbyAgICAgICAgICAgICVbIiAjTzAgIl0sICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE3KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xMCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksICAgICAgICAgXAorICBbdGVtcDE0XSI9JnIiKHRlbXAxNCksIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCAgICAgICAgIFwKKyAgW3RlbXAxN10iPSZyIih0ZW1wMTcpCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBzcmMgYW5kIHJlZiBidWZmZXJzCisvLyBURU1QMC4uVEVNUDMgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgMCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImx3ICAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgIDQoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJsdyAgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAwICJdKSBcblx0IiAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYmwgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDIgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJwcmVjZXUucGgucWJsICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAzICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAicHJlY2V1LnBoLnFiciAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMiAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYnIgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEgIl0gICAgICBcblx0IiAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAzICJdICAgICAgXG5cdCIgIFwKKyAgInJvdHIgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgMTYgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJhZGRxLnBoICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDAgIl0gICAgICBcblx0IiAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAwICJdICAgICAgXG5cdCIgIFwKKyAgInNlaCAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMSAiXSwgICAxNiAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic2VoICAgICAgICAgICAgICVbdGVtcDE5XSwgICAgICVbIiAjVEVNUDMgIl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0sICAgMTYgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAwICJdLCAgICVbdGVtcDE2XSAgICAgICAgICBcblx0IiAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxN10sICAgICAlW3RlbXAxOV0sICAgICAlW2MyMjE3XSAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJtdWwgICAgICAgICAgICAgJVt0ZW1wMThdLCAgICAgJVsiICNURU1QMyAiXSwgICAlW2M1MzUyXSAgICAgICAgICAgICBcblx0IiAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVt0ZW1wMTldLCAgICAgJVtjNTM1Ml0gICAgICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAzICJdLCAgICVbYzIyMTddICAgICAgICAgICAgIFxuXHQiICBcCisgICJzbGwgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAyICJdLCAgIDMgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic2xsICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAzICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInN1YnUgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbdGVtcDE3XSwgICAgICVbdGVtcDE4XSAgICAgICAgICAgIFxuXHQiICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAxICJdICAgICAgICBcblx0IiAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMyAiXSwgICA5MzcgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbIiAjVEVNUDEgIl0sICAgMTgxMiAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAzICJdLCAgIDkgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVsiICNURU1QMSAiXSwgICA5ICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSB0byBvdXQgYnVmZmVyCisvLyBURU1QMCwgVEVNUDQsIFRFTVA4IGFuZCBURU1QMTIgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1MoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVA0LCBURU1QOCwgVEVNUDEyKSAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMTIgIl0gICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAlW3RlbXAxOV0sICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEyICJdICAgXG5cdCIgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMTddLCAgICAgJVsiICNURU1QNCAiXSwgICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbdGVtcDE4XSwgICAgICVbIiAjVEVNUDQgIl0sICAgJVsiICNURU1QOCAiXSAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbdGVtcDE5XSwgICAgICVbYzIyMTddICAgICAgICAgXG5cdCIgICAgICBcCisgICJtdWwgICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlW3RlbXAxOF0sICAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgICAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgJVt0ZW1wMTldLCAgICAgJVtjNTM1Ml0gICAgICAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxOF0sICAgICAlW3RlbXAxOF0sICAgICAlW2M1MzUyXSAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTZdLCAgICAgNyAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgNCAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlWyIgI1RFTVAxMiAiXSwgICVbIiAjVEVNUDQgIl0gIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgICVbIiAjVEVNUDQgIl0sICAgNCAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgIDMwMDAwICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QMTIgIl0sICAxMjAwMCAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgMjEwMDAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgICVbdGVtcDE4XSAgICAgIFxuXHQiICAgICAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QMTIgIl0sICAxNiAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgMTYgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMTIgIl0sICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibW92biAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTldICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICIgI0EgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaCAgICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICAiICNDICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2ggICAgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgIiAjRCAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICIgI0IgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgaW50IGMyMjE3ID0gMjIxNzsKKyAgY29uc3QgaW50IGM1MzUyID0gNTM1MjsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIGludCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2OworICBpbnQgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxOSwgdGVtcDIwOworICBjb25zdCBpbnQqIGNvbnN0IGFyZ3NbM10gPQorICAgICAgeyAoY29uc3QgaW50KilzcmMsIChjb25zdCBpbnQqKXJlZiwgKGNvbnN0IGludCopb3V0IH07CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsIHRlbXAwLCAgdGVtcDEsICB0ZW1wMiwgIHRlbXAzKQorICAgIEhPUklaT05UQUxfUEFTUygxLCB0ZW1wNCwgIHRlbXA1LCAgdGVtcDYsICB0ZW1wNykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMiwgdGVtcDgsICB0ZW1wOSwgIHRlbXAxMCwgdGVtcDExKQorICAgIEhPUklaT05UQUxfUEFTUygzLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUpCisgICAgImx3ICAgICAgICAgICAgJVt0ZW1wMjBdLCAgICAgOCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgVkVSVElDQUxfUEFTUygwLCAgOCwgMTYsIDI0LCB0ZW1wMCwgdGVtcDQsIHRlbXA4LCAgdGVtcDEyKQorICAgIFZFUlRJQ0FMX1BBU1MoMiwgMTAsIDE4LCAyNiwgdGVtcDEsIHRlbXA1LCB0ZW1wOSwgIHRlbXAxMykKKyAgICBWRVJUSUNBTF9QQVNTKDQsIDEyLCAyMCwgMjgsIHRlbXAyLCB0ZW1wNiwgdGVtcDEwLCB0ZW1wMTQpCisgICAgVkVSVElDQUxfUEFTUyg2LCAxNCwgMjIsIDMwLCB0ZW1wMywgdGVtcDcsIHRlbXAxMSwgdGVtcDE1KQorICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTgoKSwKKyAgICAgIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMTldIj0mciIodGVtcDE5KSwgW3RlbXAyMF0iPSZyIih0ZW1wMjApCisgICAgOiBbYXJnc10iciIoYXJncyksIFtjMjIxN10iciIoYzIyMTcpLCBbYzUzNTJdInIiKGM1MzUyKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1MKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1MKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSVRyYW5zZm9ybU9uZShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIDAoJVtpbl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDJdLCAgIDE2KCVbaW5dKSAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfSU5fWDIodGVtcDUsIHRlbXA2LCAyNCwgMjYpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDMsIHRlbXA0LCB0ZW1wMSwgdGVtcDIpCisgICAgTE9BRF9JTl9YMih0ZW1wMSwgdGVtcDIsIDgsIDEwKQorICAgIE1VTF9TSElGVF9TVU0odGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsCisgICAgICAgICAgICAgICAgICB0ZW1wMTAsIHRlbXA4LCB0ZW1wOSwgdGVtcDcsIHRlbXAxLCB0ZW1wMiwgdGVtcDUsIHRlbXA2LAorICAgICAgICAgICAgICAgICAgdGVtcDEzLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDEyKQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXA4LCB0ZW1wNywgdGVtcDEwLCB0ZW1wOSkKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxN10sICA0KCVbaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxOF0sICAyMCglW2luXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wOCkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNSwgdGVtcDYsIHRlbXA0LCB0ZW1wNykKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4KQorICAgIExPQURfSU5fWDIodGVtcDE3LCB0ZW1wMTgsIDEyLCAxNCkKKyAgICBMT0FEX0lOX1gyKHRlbXA5LCB0ZW1wMTAsIDI4LCAzMCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXA0LCB0ZW1wMTcsCisgICAgICAgICAgICAgICAgICB0ZW1wMTIsIHRlbXAxNCwgdGVtcDExLCB0ZW1wMTMsIHRlbXAxNywgdGVtcDE4LCB0ZW1wOSwgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgdGVtcDE1LCB0ZW1wNCwgdGVtcDE2LCB0ZW1wMTcpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAxNywgdGVtcDgsIHRlbXA4LCB0ZW1wMTEpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDMsIHRlbXA0LCB0ZW1wNywgdGVtcDEyKQorCisgICAgLy8gaG9yaXpvbnRhbAorICAgIFNSQV8xNih0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wNSwgdGVtcDYpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDEsIHRlbXA2LCB0ZW1wNSwgdGVtcDIpCisgICAgU1JBXzE2KHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDMsIHRlbXA0LCB0ZW1wMTcsIHRlbXA4KQorICAgICJyZXBsLnBoICAgICAgICAgICVbdGVtcDJdLCAgIDB4NCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAzLCB0ZW1wOCwgdGVtcDE3LCB0ZW1wNCkKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMiwgdGVtcDQsIHRlbXAxLCB0ZW1wMykKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNSwgdGVtcDcsIHRlbXA2LCB0ZW1wOCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXAxLCB0ZW1wMywgdGVtcDYsIHRlbXA4LCB0ZW1wOSwgdGVtcDEzLCB0ZW1wMTcsIHRlbXAxOCwKKyAgICAgICAgICAgICAgICAgIHRlbXAzLCB0ZW1wMTMsIHRlbXAxLCB0ZW1wOSwgdGVtcDksIHRlbXAxMywgdGVtcDExLCB0ZW1wMTUsCisgICAgICAgICAgICAgICAgICB0ZW1wNiwgdGVtcDE3LCB0ZW1wOCwgdGVtcDE4KQorICAgIE1VTF9TSElGVF9TVU0odGVtcDYsIHRlbXA4LCB0ZW1wMTgsIHRlbXAxNywgdGVtcDExLCB0ZW1wMTUsIHRlbXAxMiwgdGVtcDE2LAorICAgICAgICAgICAgICAgICAgdGVtcDgsIHRlbXAxNSwgdGVtcDYsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTYsIHRlbXAxMCwgdGVtcDE0LAorICAgICAgICAgICAgICAgICAgdGVtcDE4LCB0ZW1wMTIsIHRlbXAxNywgdGVtcDE2KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxLCB0ZW1wMywgdGVtcDksIHRlbXAxMykKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wNiwgdGVtcDgsIHRlbXAxMSwgdGVtcDE1KQorICAgIFNISUZUX1JfU1VNX1gyKHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LAorICAgICAgICAgICAgICAgICAgIHRlbXAxNiwgdGVtcDIsIHRlbXA0LCB0ZW1wNSwgdGVtcDcsIHRlbXAzLCB0ZW1wMSwgdGVtcDgsCisgICAgICAgICAgICAgICAgICAgdGVtcDYpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wOSwgdGVtcDEyLCB0ZW1wMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiwgdGVtcDExLCB0ZW1wMTAsIHRlbXAxNSwgdGVtcDE0KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEwLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDE1LCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTEsIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTQsIHRlbXAxNSkKKyAgICBTVE9SRV9TQVRfU1VNX1gyKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDEwLCB0ZW1wMTEsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXAxMywgdGVtcDE2LCB0ZW1wMywgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgICBkc3QsIDAsIDEsIDIsIDMsIEJQUykKKworICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTgoKQorICAgIDogW2RzdF0iciIoZHN0KSwgW2luXSJyIihpbiksIFtrQzFdInIiKGtDMSksIFtrQzJdInIiKGtDMiksIFtyZWZdInIiKHJlZikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCitzdGF0aWMgaW50IERpc3RvNHg0X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNzsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMywgdGVtcDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA3LCB0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxLCB0ZW1wMywgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAxLCB0ZW1wOSwgdGVtcDMsIHRlbXAxMCwgdGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAxMikKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wNSwgdGVtcDExLCB0ZW1wNywgdGVtcDIsIHRlbXA5LCB0ZW1wMywgdGVtcDYsIHRlbXAxMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wOCwgdGVtcDEwKQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wNCwgdGVtcDEwLCB0ZW1wOCwgdGVtcDcsIHRlbXAxMSwgdGVtcDUsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNywgdGVtcDExLCB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDEyKQorICAgIEFCU19YOCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMikKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAzLCB0ZW1wNiwgdGVtcDksIHRlbXAxMiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxNikKKyAgICBNVUxfSEFMRih0ZW1wMTcsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNSx0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSx0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0KQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDMsIHRlbXA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNywgdGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMSwgdGVtcDMsIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSwgdGVtcDksIHRlbXAzLCB0ZW1wMTAsIHRlbXA1LCB0ZW1wMTEsIHRlbXA3LCB0ZW1wMTIpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAyLCB0ZW1wOSwgdGVtcDMsIHRlbXA2LCB0ZW1wMTIsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXA0LCB0ZW1wMSwgdGVtcDgsIHRlbXAxMCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDcsIHRlbXAxMSwgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXAxMikKKyAgICBBQlNfWDgodGVtcDEsIHRlbXA0LCB0ZW1wMTAsIHRlbXA4LCB0ZW1wNywgdGVtcDExLCB0ZW1wNSwgdGVtcDIpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMywgdGVtcDYsIHRlbXA5LCB0ZW1wMTIsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYpCisgICAgTVVMX0hBTEYodGVtcDMsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2KQorICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTcoKQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYiksIFt3XSJyIih3KQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGFicyh0ZW1wMyAtIHRlbXAxNykgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X01JUFNkc3BSMihhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworI2RlZmluZSBGSUxMX1BBUlQoSiwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgIDArIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sICA0KyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA9PSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgIDgrIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sIDEyKyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIEZJTExfOF9PUl8xNihEU1QsIFZBTFVFLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHZhbHVlID0gKFZBTFVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJlcGx2LnFiICAgJVt2YWx1ZV0sICAlW3ZhbHVlXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDAsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggMSwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCAyLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDMsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA1LCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDYsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNywgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuaWYgIiAjU0laRSAiID09IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDgsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggOSwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDEwLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTEsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxMiwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDEzLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTQsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxNSwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICA6IFt2YWx1ZV0iKyZyIih2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW2RzdF0iciIoKERTVCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBWRVJUSUNBTF9QUkVEKERTVCwgVE9QLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZCMjU0laRSh1aW50OF90KiAoRFNUKSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKFRPUCkpIHsgICAgICAgICAgICAgXAorICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChUT1ApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IChTSVpFKTsgKytqKSBtZW1jcHkoKERTVCkgKyBqICogQlBTLCAoVE9QKSwgKFNJWkUpKTsgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMXzhfT1JfMTYoKERTVCksIDEyNywgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitWRVJUSUNBTF9QUkVEKGRzdCwgdG9wLCA4KQorVkVSVElDQUxfUFJFRChkc3QsIHRvcCwgMTYpCisKKyN1bmRlZiBWRVJUSUNBTF9QUkVECisKKyNkZWZpbmUgSE9SSVpPTlRBTF9QUkVEKERTVCwgTEVGVCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZCMjU0laRSh1aW50OF90KiAoRFNUKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKExFRlQpKSB7ICAgICAgICAgIFwKKyAgaWYgKExFRlQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCAoU0laRSk7ICsraikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1lbXNldCgoRFNUKSArIGogKiBCUFMsIChMRUZUKVtqXSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMXzhfT1JfMTYoKERTVCksIDEyOSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitIT1JJWk9OVEFMX1BSRUQoZHN0LCBsZWZ0LCA4KQorSE9SSVpPTlRBTF9QUkVEKGRzdCwgbGVmdCwgMTYpCisKKyN1bmRlZiBIT1JJWk9OVEFMX1BSRUQKKworI2RlZmluZSBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbbGVmdFlfMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW2xlZnRZXzFdICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICBcblx0IgorCisjZGVmaW5lIENMSVBfOEJfVE9fRFNUKERTVCwgTEVGVCwgVE9QLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbGVmdFlfMSA9ICgoaW50KShMRUZUKVt5XSA8PCAxNikgKyAoTEVGVClbeV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyZXBsdi5waCAgICAgICAgJVtsZWZ0WV8xXSwgJVtsZWZ0WV8xXSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtsZWZ0WV8xXSwgJVtsZWZ0WV8xXSwgJVtsZWZ0XzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgOiBbbGVmdFlfMV0iKyZyIihsZWZ0WV8xKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgICAgICAgXAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtsZWZ0XzFdInIiKGxlZnRfMSksIFt0b3BdInIiKChUT1ApKSwgW2RzdF0iciIoKERTVCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9UT19EU1QoRFNULCBMRUZULCBUT1AsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGVmdF8xID0gKChpbnQpKExFRlQpWy0xXSA8PCAxNikgKyAoTEVGVClbLTFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0gMDsgeSA8IChTSVpFKTsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUF84Ql9UT19EU1QoKERTVCksIChMRUZUKSwgKFRPUCksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChEU1QpICs9IEJQUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSVUVfTU9USU9OKERTVCwgTEVGVCwgVE9QLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbiMjU0laRSh1aW50OF90KiAoRFNUKSwgY29uc3QgdWludDhfdCogKExFRlQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKFRPUCkpIHsgICAgICAgICAgICAgICBcCisgIGlmICgoTEVGVCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVE9QKSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENMSVBfVE9fRFNUKChEU1QpLCAoTEVGVCksIChUT1ApLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgSG9yaXpvbnRhbFByZWQjI1NJWkUoKERTVCksIChMRUZUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkgICAgKi8gIFwKKyAgICAvKiBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuICovICBcCisgICAgLyogTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAgICAqLyAgXAorICAgIC8qIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuICAgICAgICAgICAgICAgICAgKi8gIFwKKyAgICBpZiAoKFRPUCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWZXJ0aWNhbFByZWQjI1NJWkUoKERTVCksIChUT1ApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZJTExfOF9PUl8xNigoRFNUKSwgMTI5LCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVFJVRV9NT1RJT04oZHN0LCBsZWZ0LCB0b3AsIDgpCitUUlVFX01PVElPTihkc3QsIGxlZnQsIHRvcCwgMTYpCisKKyN1bmRlZiBUUlVFX01PVElPTgorI3VuZGVmIENMSVBfVE9fRFNUCisjdW5kZWYgQ0xJUF84Ql9UT19EU1QKKyN1bmRlZiBDTElQUElORworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGUxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IERDLCBEQzE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJiZXF6ICAgICAgICAlW3RvcF0sICAgMmYgICAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICAgIm1vdmUgICAgICAgICVbREMxXSwgICAlW0RDXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICAxZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbREMxXSwgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICVbRENdLCAgICAgJVtEQzFdICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICA0ZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQ10gICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICVbRENdLCAgICAlW0RDXSwgICAgNSAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAgICVbRENdLCAgICAweDgwICAgICAgICAgICAgICAgIFxuXHQiCisgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbRENdIj0mciIoREMpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW0RDMV0iPSZyIihEQzEpCisgICAgOiBbbGVmdF0iciIobGVmdCksIFt0b3BdInIiKHRvcCkKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgRklMTF84X09SXzE2KGRzdCwgREMsIDE2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlOCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgREMsIERDMTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgImJlcXogICAgICAgICVbdG9wXSwgICAyZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDBdLCAwKCVbdG9wXSkgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDFdLCA0KCVbdG9wXSkgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgIm1vdmUgICAgICAgICVbREMxXSwgICAlW0RDXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICAxZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDJdLCAwKCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDNdLCA0KCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbREMxXSwgICAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQzFdICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICA0ZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDJdLCAwKCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDNdLCA0KCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQ10gICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICVbRENdLCAlW0RDXSwgNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAgICVbRENdLCAweDgwICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbRENdIj0mciIoREMpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW0RDMV0iPSZyIihEQzEpCisgICAgOiBbbGVmdF0iciIobGVmdCksIFt0b3BdInIiKHRvcCkKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgRklMTF84X09SXzE2KGRzdCwgREMsIDgpOworfQorCitzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMTsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAlW3RlbXAxXSwgICAtNSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGRpdSAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICVbdGVtcDBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAlW3RlbXAwXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgYTEwLCBhMzIsIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGNvbnN0IGludCBjMzUgPSAweGZmMDBmZjsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMV0sICAwKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgICVbYTEwXSwgICAgMSglW3RvcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAyXSwgIDIoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAgJVthMzJdLCAgICAzKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW3RlbXA0XSwgIC0xKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVthMTBdLCAgICAlW3RlbXAxXSwgICAxNiAgICAgICAgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbYTMyXSwgICAgJVt0ZW1wMl0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmwucGggICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgICA4ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgICAgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgJVtjMzVdICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICVbdGVtcDRdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAlW3RlbXA0XSAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMV0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDBdLCAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wM10sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDNdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAyXSwgICAlW2ExMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgJVthMzJdICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMF0sICAlW3RlbXAxXSwgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDFdLCAgJVt0ZW1wMl0sICAgJVt0ZW1wM10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDVdLCAgICVbYTEwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXA1XSwgICAlW2EzMl0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNF0sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDJdLCAgJVt0ZW1wM10sICAgJVt0ZW1wMl0gICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAzXSwgICVbdGVtcDRdLCAgICVbdGVtcDVdICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDBdLCAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wMl0sICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbYTEwXSI9JnIiKGExMCksIFthMzJdIj0mciIoYTMyKQorICAgIDogW2MzNV0iciIoYzM1KSwgW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsaCAgICAgICAgICAgICAlW3RlbXAxXSwgICAzKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDRdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDRdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTQoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICVbdGVtcDFdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wM10sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBpbnQgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIC01KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAyICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDVdLCAgICAlW3RlbXA4XSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAyICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAyICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDMoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDIoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDEoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDEwXSwgICAlW3RlbXA5XSAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAyICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDExXSwgICAlW3RlbXAxMF0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDExXSwgICA4ICAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDBdLCAgICA4ICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFZSNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAtNCglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgIm1vdmUgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDddLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDldICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wOF0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA4XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDVdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wM10sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wNl0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBpbnQgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgMiAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyNCAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDEwXSwgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDEwXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDEwXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDExXSwgICA4ICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMV0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDldLCAgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVkw0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDJdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA4XSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDRdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAwXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDJdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDNdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wNl0sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDddLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA0XSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDVdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAxXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAzXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAlW3RlbXAyXSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNV0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAzXSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDddLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDJdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNykKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEgOHg4IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4yKQorCitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVByZWRzX01JUFNkc3BSMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgLy8gVSBibG9jaworICBEQ01vZGU4KEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQ4KEM4VkU4ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDgoQzhIRTggKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uOChDOFRNOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgLy8gViBibG9jaworICBkc3QgKz0gODsKKyAgaWYgKHRvcCkgdG9wICs9IDg7CisgIGlmIChsZWZ0KSBsZWZ0ICs9IDE2OworICBEQ01vZGU4KEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQ4KEM4VkU4ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDgoQzhIRTggKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uOChDOFRNOCArIGRzdCwgbGVmdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGx1bWEgMTZ4MTYgcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjMpCisKK3N0YXRpYyB2b2lkIEludHJhMTZQcmVkc19NSVBTZHNwUjIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgRENNb2RlMTYoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkMTYoSTE2VkUxNiArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQxNihJMTZIRTE2ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjE2KEkxNlRNMTYgKyBkc3QsIGxlZnQsIHRvcCk7Cit9CisKKy8vIExlZnQgc2FtcGxlcyBhcmUgdG9wWy01IC4uIC0yXSwgdG9wX2xlZnQgaXMgdG9wWy0xXSwgdG9wIGFyZQorLy8gbG9jYXRlZCBhdCB0b3BbMC4uM10sIGFuZCB0b3AgcmlnaHQgaXMgdG9wWzQuLjddCitzdGF0aWMgdm9pZCBJbnRyYTRQcmVkc19NSVBTZHNwUjIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREM0KEk0REM0ICsgZHN0LCB0b3ApOworICBUTTQoSTRUTTQgKyBkc3QsIHRvcCk7CisgIFZFNChJNFZFNCArIGRzdCwgdG9wKTsKKyAgSEU0KEk0SEU0ICsgZHN0LCB0b3ApOworICBSRDQoSTRSRDQgKyBkc3QsIHRvcCk7CisgIFZSNChJNFZSNCArIGRzdCwgdG9wKTsKKyAgTEQ0KEk0TEQ0ICsgZHN0LCB0b3ApOworICBWTDQoSTRWTDQgKyBkc3QsIHRvcCk7CisgIEhENChJNEhENCArIGRzdCwgdG9wKTsKKyAgSFU0KEk0SFU0ICsgZHN0LCB0b3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0cmljCisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKyNkZWZpbmUgR0VUX1NTRV9JTk5FUihBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAgICAgICAlW3RlbXAwXSwgICAgIiAjQSAiKCVbYV0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsdyAgICAgICAgICAgICAgICVbdGVtcDFdLCAgICAiICNBICIoJVtiXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICAgICBcblx0IiAgICAgIFwKKyAgImRwYS53LnBoICAgICAgICAgJGFjMCwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgXAorICAiZHBhLncucGggICAgICAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgXG5cdCIKKworI2RlZmluZSBHRVRfU1NFKEEsIEIsIEMsIEQpICAgICAgICAgICAgICAgXAorICBHRVRfU1NFX0lOTkVSKEEpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfU1NFX0lOTkVSKEIpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfU1NFX0lOTkVSKEMpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfU1NFX0lOTkVSKEQpCisKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgR0VUX1NTRSggMSAqIEJQUywgNCArICAxICogQlBTLCA4ICsgIDEgKiBCUFMsIDEyICsgIDEgKiBCUFMpCisgICAgR0VUX1NTRSggMiAqIEJQUywgNCArICAyICogQlBTLCA4ICsgIDIgKiBCUFMsIDEyICsgIDIgKiBCUFMpCisgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgR0VUX1NTRSggNCAqIEJQUywgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMpCisgICAgR0VUX1NTRSggNSAqIEJQUywgNCArICA1ICogQlBTLCA4ICsgIDUgKiBCUFMsIDEyICsgIDUgKiBCUFMpCisgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgR0VUX1NTRSggNyAqIEJQUywgNCArICA3ICogQlBTLCA4ICsgIDcgKiBCUFMsIDEyICsgIDcgKiBCUFMpCisgICAgR0VUX1NTRSggOCAqIEJQUywgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMpCisgICAgR0VUX1NTRSggOSAqIEJQUywgNCArICA5ICogQlBTLCA4ICsgIDkgKiBCUFMsIDEyICsgIDkgKiBCUFMpCisgICAgR0VUX1NTRSgxMCAqIEJQUywgNCArIDEwICogQlBTLCA4ICsgMTAgKiBCUFMsIDEyICsgMTAgKiBCUFMpCisgICAgR0VUX1NTRSgxMSAqIEJQUywgNCArIDExICogQlBTLCA4ICsgMTEgKiBCUFMsIDEyICsgMTEgKiBCUFMpCisgICAgR0VUX1NTRSgxMiAqIEJQUywgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMpCisgICAgR0VUX1NTRSgxMyAqIEJQUywgNCArIDEzICogQlBTLCA4ICsgMTMgKiBCUFMsIDEyICsgMTMgKiBCUFMpCisgICAgR0VUX1NTRSgxNCAqIEJQUywgNCArIDE0ICogQlBTLCA4ICsgMTQgKiBCUFMsIDEyICsgMTQgKiBCUFMpCisgICAgR0VUX1NTRSgxNSAqIEJQUywgNCArIDE1ICogQlBTLCA4ICsgMTUgKiBCUFMsIDEyICsgMTUgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTE2eDhfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgR0VUX1NTRSggMSAqIEJQUywgNCArICAxICogQlBTLCA4ICsgIDEgKiBCUFMsIDEyICsgIDEgKiBCUFMpCisgICAgR0VUX1NTRSggMiAqIEJQUywgNCArICAyICogQlBTLCA4ICsgIDIgKiBCUFMsIDEyICsgIDIgKiBCUFMpCisgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgR0VUX1NTRSggNCAqIEJQUywgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMpCisgICAgR0VUX1NTRSggNSAqIEJQUywgNCArICA1ICogQlBTLCA4ICsgIDUgKiBCUFMsIDEyICsgIDUgKiBCUFMpCisgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgR0VUX1NTRSggNyAqIEJQUywgNCArICA3ICogQlBTLCA4ICsgIDcgKiBCUFMsIDEyICsgIDcgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTh4OF9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBHRVRfU1NFKDAgKiBCUFMsIDQgKyAwICogQlBTLCAxICogQlBTLCA0ICsgMSAqIEJQUykKKyAgICBHRVRfU1NFKDIgKiBCUFMsIDQgKyAyICogQlBTLCAzICogQlBTLCA0ICsgMyAqIEJQUykKKyAgICBHRVRfU1NFKDQgKiBCUFMsIDQgKyA0ICogQlBTLCA1ICogQlBTLCA0ICsgNSAqIEJQUykKKyAgICBHRVRfU1NFKDYgKiBCUFMsIDQgKyA2ICogQlBTLCA3ICogQlBTLCA0ICsgNyAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFNHg0X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEdFVF9TU0UoMCAqIEJQUywgMSAqIEJQUywgMiAqIEJQUywgMyAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKKyN1bmRlZiBHRVRfU1NFCisjdW5kZWYgR0VUX1NTRV9JTk5FUgorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworI3VuZGVmIEZJTExfOF9PUl8xNgorI3VuZGVmIEZJTExfUEFSVAorI3VuZGVmIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTcKKyN1bmRlZiBNVUxfSEFMRgorI3VuZGVmIEFCU19YOAorI3VuZGVmIEFERF9TVUJfSEFMVkVTX1g0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6YXRpb24KKy8vCisKKy8vIG1hY3JvIGZvciBvbmUgcGFzcyB0aHJvdWdoIGZvciBsb29wIGluIFF1YW50aXplQmxvY2sgcmVhZGluZyAyIHZhbHVlcyBhdCB0aW1lCisvLyBRVUFOVERJViBtYWNybyBpbmxpbmVkCisvLyBKIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogMikKKy8vIEsgLSBvZmZzZXQgaW4gYnl0ZXMgKGtaaWd6YWdbbl0gKiA0KQorLy8gTiAtIG9mZnNldCBpbiBieXRlcyAobiAqIDIpCisvLyBOMSAtIG9mZnNldCBpbiBieXRlcyAoKG4gKyAxKSAqIDIpCisjZGVmaW5lIFFVQU5USVpFX09ORShKLCBLLCBOLCBOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgICVbdGVtcDFdLCAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidWx3ICAgICAgICAgJVt0ZW1wMl0sICAgICAiICNKICIoJVtwcHNoYXJwZW5dKSAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0sgIiglW3BwenRocmVzaF0pICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDZdLCAgICAgIiAjSyAiKzQoJVtwcHp0aHJlc2hdKSAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWJzcV9zLnBoICAgJVt0ZW1wNF0sICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDZdLCAgICAgICAgIDE2LCAgICAgICAxNiAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUucGggICAgICVbY29lZmZdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IiAgICAgICAgXAorICAic2hyYS5waCAgICAgJVtzaWduXSwgICAgICAlW3RlbXAxXSwgICAgICAgICAxNSAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaSAgICAgICAgICAlW2xldmVsXSwgICAgIDB4MTAwMDEgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImNtcC5sdC5waCAgICVbdGVtcDNdLCAgICAgJVtjb2VmZl0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwaWNrLnBoICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICQwICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImx3ICAgICAgICAgICVbdGVtcDJdLCAgICAgIiAjSyAiKCVbcHBiaWFzXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYmVxeiAgICAgICAgJVt0ZW1wNV0sICAgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIiglW3BwcV0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImJlcSAgICAgICAgICVbdGVtcDVdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMWYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgICAweDEgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA0XSwgICAgICVbY29lZmZdLCAgICAgICAgIDB4ZmZmZiAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImJlcXogICAgICAgICVbdGVtcDVdLCAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVtsZXZlbF0sICAgICAlW3RlbXA0XSwgICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI0ogIisyKCVbcHBpbl0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDE3ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNsdCAgICAgICAgICVbdGVtcDRdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAibW92biAgICAgICAgJVtsZXZlbF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW3RlbXA0XSAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA2XSwgICAgICVbc2lnbl0sICAgICAgICAgIDB4ZmZmZiAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInhvciAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAic3VidSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm9yICAgICAgICAgICVbcmV0XSwgICAgICAgJVtyZXRdLCAgICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW3RlbXA1XSwgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAxXSwgICAgICIgI0ogIisyKCVbcHBpcV0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbdGVtcDVdLCAgICAgJVtjb2VmZl0sICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVtsZXZlbF0sICAgICAlW3RlbXA1XSwgICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0sgIis0KCVbcHBiaWFzXSkgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKzIoJVtwcHFdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDE3ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbdGVtcDZdLCAgICAgJVtzaWduXSwgICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2x0ICAgICAgICAgJVt0ZW1wNF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJtb3ZuICAgICAgICAlW2xldmVsXSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbdGVtcDRdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInhvciAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAic3VidSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJvciAgICAgICAgICAlW3JldF0sICAgICAgICVbcmV0XSwgICAgICAgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbdGVtcDVdLCAgICAgIiAjSiAiKzIoJVtwcGluXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0sgIiglW3BwYmlhc10pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVsdyAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKCVbcHBxXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNV0sICAgICAlW2NvZWZmXSwgICAgICAgICAweGZmZmYgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmwgICAgICAgICAlW3RlbXAwXSwgICAgICVbY29lZmZdLCAgICAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDZdLCAgICAgIiAjSiAiKzIoJVtwcGlxXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibHcgICAgICAgICAgJVtjb2VmZl0sICAgICAiICNLICIrNCglW3BwYmlhc10pICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW2xldmVsXSwgICAgICVbdGVtcDVdLCAgICAgICAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wMF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJhZGR1ICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAgICVbY29lZmZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNycS5waC53ICVbbGV2ZWxdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2hyYS5waCAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAxICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJjbXAubHQucGggICAlW21heF9sZXZlbDFdLCVbbGV2ZWxdICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInBpY2sucGggICAgICVbbGV2ZWxdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAieG9yICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3NpZ25dICAgICAgIFxuXHQiICAgICAgICBcCisgICJzdWJ1LnBoICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbc2lnbl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bC5waCAgICAgICVbdGVtcDNdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wM10gICAgICBcblx0IiAgICAgICAgXAorICAib3IgICAgICAgICAgJVtyZXRdLCAgICAgICAlW3JldF0sICAgICAgICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW2xldmVsXSwgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgJDAsICAgICAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX01JUFNkc3BSMihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSx0ZW1wNjsKKyAgaW50IHNpZ24sIGNvZWZmLCBsZXZlbDsKKyAgaW50IG1heF9sZXZlbCA9IE1BWF9MRVZFTDsKKyAgaW50IG1heF9sZXZlbDEgPSBtYXhfbGV2ZWwgPDwgMTYgfCBtYXhfbGV2ZWw7CisgIGludCByZXQgPSAwOworCisgIGludDE2X3QqIHBwaW4gICAgICAgICAgICAgPSAmaW5bMF07CisgIGludDE2X3QqIHBvdXQgICAgICAgICAgICAgPSAmb3V0WzBdOworICBjb25zdCB1aW50MTZfdCogcHBzaGFycGVuID0gJm10eC0+c2hhcnBlbl9bMF07CisgIGNvbnN0IHVpbnQzMl90KiBwcHp0aHJlc2ggPSAmbXR4LT56dGhyZXNoX1swXTsKKyAgY29uc3QgdWludDE2X3QqIHBwcSAgICAgICA9ICZtdHgtPnFfWzBdOworICBjb25zdCB1aW50MTZfdCogcHBpcSAgICAgID0gJm10eC0+aXFfWzBdOworICBjb25zdCB1aW50MzJfdCogcHBiaWFzICAgID0gJm10eC0+Ymlhc19bMF07CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgUVVBTlRJWkVfT05FKCAwLCAgMCwgIDAsICAyKQorICAgIFFVQU5USVpFX09ORSggNCwgIDgsIDEwLCAxMikKKyAgICBRVUFOVElaRV9PTkUoIDgsIDE2LCAgNCwgIDgpCisgICAgUVVBTlRJWkVfT05FKDEyLCAyNCwgMTQsIDI0KQorICAgIFFVQU5USVpFX09ORSgxNiwgMzIsICA2LCAxNikKKyAgICBRVUFOVElaRV9PTkUoMjAsIDQwLCAyMiwgMjYpCisgICAgUVVBTlRJWkVfT05FKDI0LCA0OCwgMTgsIDIwKQorICAgIFFVQU5USVpFX09ORSgyOCwgNTYsIDI4LCAzMCkKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3NpZ25dIj0mciIoc2lnbiksIFtjb2VmZl0iPSZyIihjb2VmZiksCisgICAgICBbbGV2ZWxdIj0mciIobGV2ZWwpLCBbdGVtcDZdIj0mciIodGVtcDYpLCBbcmV0XSIrJnIiKHJldCkKKyAgICA6IFtwcGluXSJyIihwcGluKSwgW3BvdXRdInIiKHBvdXQpLCBbbWF4X2xldmVsMV0iciIobWF4X2xldmVsMSksCisgICAgICBbcHBpcV0iciIocHBpcSksIFttYXhfbGV2ZWxdInIiKG1heF9sZXZlbCksCisgICAgICBbcHBiaWFzXSJyIihwcGJpYXMpLCBbcHB6dGhyZXNoXSJyIihwcHp0aHJlc2gpLAorICAgICAgW3Bwc2hhcnBlbl0iciIocHBzaGFycGVuKSwgW3BwcV0iciIocHBxKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICByZXR1cm4gKHJldCAhPSAwKTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfTUlQU2RzcFIyKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBueiAgPSBRdWFudGl6ZUJsb2NrX01JUFNkc3BSMihpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFF1YW50aXplQmxvY2tfTUlQU2RzcFIyKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisjdW5kZWYgUVVBTlRJWkVfT05FCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm1XSFQKKy8vIHRlbXAwLi50ZW1wNyBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEsIEIsIEMsIEQgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIGluIGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVAxIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1NfV0hUKEEsIEIsIEMsIEQsIFRFTVAwLCBURU1QMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbaW5dKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICIgI0IgIiglW2luXSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICVbdGVtcDhdLCAgICAgIiAjQyAiKCVbaW5dKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlW3RlbXA5XSwgICAgICIgI0QgIiglW2luXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDAgIl0sICAxNiwgIDE2ICBcblx0IiAgICAgICAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICVbdGVtcDldLCAgICAgJVt0ZW1wOF0sICAgICAxNiwgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlW3RlbXA4XSwgICAgICVbIiAjVEVNUDEgIl0sICAlW3RlbXA5XSAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICAlWyIgI1RFTVAxICJdLCAgJVt0ZW1wOV0gICBcblx0IiAgICAgICAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImFwcGVuZCAgICAgICAgICAlW3RlbXA4XSwgICAgICVbdGVtcDldLCAgICAgMTYgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSBcblx0IiAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wOF0gXG5cdCIgICAgICAgICAgICAgIFwKKyAgInJvdHIgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgJVsiICNURU1QMSAiXSwgIDE2ICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBGVHJhbnNmb3JtV0hUCisvLyB0ZW1wMC4udGVtcDcgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLCBCLCBDLCBEIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSB0byBvdXQgYnVmZmVyCisvLyBURU1QMCwgVEVNUDIsIFRFTVA0IGFuZCBURU1QNiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgVkVSVElDQUxfUEFTU19XSFQoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVAyLCBURU1QNCwgVEVNUDYpICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QNCAiXSAgICBcblx0IiAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDYgIl0gICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDYgIl0gIFxuXHQiICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QNiAiXSwgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVA0ICJdICBcblx0IiAgICAgICAgXAorICAiYWRkcWgucGggICAgICAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnFoLnBoICAgICAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QNiAiXSwgICVbIiAjVEVNUDIgIl0gIFxuXHQiICAgICAgICBcCisgICJhZGRxaC5waCAgICAgICAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVA2ICJdICBcblx0IiAgICAgICAgXAorICAic3VicWgucGggICAgICAgICVbIiAjVEVNUDYgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICIgI0IgIiglW291dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAiICNDICIoJVtvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVA2ICJdLCAgIiAjRCAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRfTUlQU2RzcFIyKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBIT1JJWk9OVEFMX1BBU1NfV0hUKCAgMCwgIDMyLCAgNjQsICA5NiwgdGVtcDAsIHRlbXAxKQorICAgIEhPUklaT05UQUxfUEFTU19XSFQoMTI4LCAxNjAsIDE5MiwgMjI0LCB0ZW1wMiwgdGVtcDMpCisgICAgSE9SSVpPTlRBTF9QQVNTX1dIVCgyNTYsIDI4OCwgMzIwLCAzNTIsIHRlbXA0LCB0ZW1wNSkKKyAgICBIT1JJWk9OVEFMX1BBU1NfV0hUKDM4NCwgNDE2LCA0NDgsIDQ4MCwgdGVtcDYsIHRlbXA3KQorICAgIFZFUlRJQ0FMX1BBU1NfV0hUKDAsICA4LCAxNiwgMjQsIHRlbXAwLCB0ZW1wMiwgdGVtcDQsIHRlbXA2KQorICAgIFZFUlRJQ0FMX1BBU1NfV0hUKDQsIDEyLCAyMCwgMjgsIHRlbXAxLCB0ZW1wMywgdGVtcDUsIHRlbXA3KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW2luXSJyIihpbiksIFtvdXRdInIiKG91dCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTX1dIVAorI3VuZGVmIEhPUklaT05UQUxfUEFTU19XSFQKKworLy8gbWFjcm8gZm9yIGNvbnZlcnRpbmcgY29lZmZpY2llbnRzIHRvIGJpbgorLy8gY29udmVydCA4IGNvZWZmcyBhdCB0aW1lCisvLyBBLCBCLCBDLCBEIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZyb20gb3V0IGJ1ZmZlcgorI2RlZmluZSBDT05WRVJUX0NPRUZGU19UT19CSU4oQSwgQiwgQywgRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgJVt0ZW1wMF0sICAiICNBICIoJVtvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICVbdGVtcDFdLCAgIiAjQiAiKCVbb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAyXSwgICIgI0MgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgJVt0ZW1wM10sICAiICNEICIoJVtvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICVbdGVtcDBdLCAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAlW3RlbXAxXSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wMl0sICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAzICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAzICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJsLnBoICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hybC5waCAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJsLnBoICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbC5waCAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAyICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGwucGggICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMiAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbC5waCAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAyICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXAwXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDE2LCAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMV0sICAgIDAsICAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNF0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDRdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAwXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wNl0sICAlW3RlbXAyXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMF0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDVdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDE2LCAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA1XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDddLCAgJVt0ZW1wM10sICAgIDAsICAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDFdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA2XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAxNiwgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDJdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDJdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA3XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDddKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAzXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX01JUFNkc3BSMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBjb25zdCBpbnQgbWF4X2NvZWZmID0gKE1BWF9DT0VGRl9USFJFU0ggPDwgMTYpICsgTUFYX0NPRUZGX1RIUkVTSDsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKworICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICBDT05WRVJUX0NPRUZGU19UT19CSU4oIDAsICA0LCAgOCwgMTIpCisgICAgICBDT05WRVJUX0NPRUZGU19UT19CSU4oMTYsIDIwLCAyNCwgMjgpCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICAgIDogW2Rpc3RdInIiKGRpc3RyaWJ1dGlvbiksIFtvdXRdInIiKG91dCksIFttYXhfY29lZmZdInIiKG1heF9jb2VmZikKKyAgICAgIDogIm1lbW9yeSIKKyAgICApOworICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKyN1bmRlZiBDT05WRVJUX0NPRUZGU19UT19CSU4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm1fTUlQU2RzcFIyOworICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVF9NSVBTZHNwUjI7CisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX01JUFNkc3BSMjsKKworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9NSVBTZHNwUjI7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9NSVBTZHNwUjI7CisKKyAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkc19NSVBTZHNwUjI7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkc19NSVBTZHNwUjI7CisgIFZQOEVuY1ByZWRMdW1hNCA9IEludHJhNFByZWRzX01JUFNkc3BSMjsKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9NSVBTZHNwUjI7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9NSVBTZHNwUjI7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X01JUFNkc3BSMjsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X01JUFNkc3BSMjsKKyNlbmRpZgorCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX01JUFNkc3BSMjsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX01JUFNkc3BSMjsKKworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4NWFkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21zYS5jCkBAIC0wLDAgKzEsODk2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZlcnNpb24gb2YgZW5jb2RlciBkc3AgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogIFByYXNoYW50IFBhdGlsICAgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMKKworI2RlZmluZSBJRENUXzFEX1coaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIHY0aTMyIGExX20sIGIxX20sIGMxX20sIGQxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgY29zcGk4c3FydDJtaW51czEgPSBfX21zYV9maWxsX3coMjAwOTEpOyAgICAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBzaW5waThzcXJ0MiA9IF9fbXNhX2ZpbGxfdygzNTQ2OCk7ICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIGNfdG1wMV9tID0gaW4xICogc2lucGk4c3FydDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgY190bXAyX20gPSBpbjMgKiBjb3NwaThzcXJ0Mm1pbnVzMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBkX3RtcDFfbSA9IGluMSAqIGNvc3BpOHNxcnQybWludXMxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIGRfdG1wMl9tID0gaW4zICogc2lucGk4c3FydDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERTVUIyKGluMCwgaW4yLCBhMV9tLCBiMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfVzJfU1coY190bXAxX20sIGNfdG1wMl9tLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY190bXAyX20gPSBjX3RtcDJfbSArIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjMV9tID0gY190bXAxX20gLSBjX3RtcDJfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfVzJfU1coZF90bXAxX20sIGRfdG1wMl9tLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZF90bXAxX20gPSBkX3RtcDFfbSArIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkMV9tID0gZF90bXAxX20gKyBkX3RtcDJfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJVVFRFUkZMWV80KGExX20sIGIxX20sIGMxX20sIGQxX20sIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmUoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIHY4aTE2IGlucHV0MCwgaW5wdXQxOworICB2NGkzMiBpbjAsIGluMSwgaW4yLCBpbjMsIGh6MCwgaHoxLCBoejIsIGh6MywgdnQwLCB2dDEsIHZ0MiwgdnQzOworICB2NGkzMiByZXMwLCByZXMxLCByZXMyLCByZXMzOworICB2MTZpOCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0MzsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworCisgIExEX1NIMihpbiwgOCwgaW5wdXQwLCBpbnB1dDEpOworICBVTlBDS19TSF9TVyhpbnB1dDAsIGluMCwgaW4xKTsKKyAgVU5QQ0tfU0hfU1coaW5wdXQxLCBpbjIsIGluMyk7CisgIElEQ1RfMURfVyhpbjAsIGluMSwgaW4yLCBpbjMsIGh6MCwgaHoxLCBoejIsIGh6Myk7CisgIFRSQU5TUE9TRTR4NF9TV19TVyhoejAsIGh6MSwgaHoyLCBoejMsIGh6MCwgaHoxLCBoejIsIGh6Myk7CisgIElEQ1RfMURfVyhoejAsIGh6MSwgaHoyLCBoejMsIHZ0MCwgdnQxLCB2dDIsIHZ0Myk7CisgIFNSQVJJX1c0X1NXKHZ0MCwgdnQxLCB2dDIsIHZ0MywgMyk7CisgIFRSQU5TUE9TRTR4NF9TV19TVyh2dDAsIHZ0MSwgdnQyLCB2dDMsIHZ0MCwgdnQxLCB2dDIsIHZ0Myk7CisgIExEX1NCNChyZWYsIEJQUywgZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDMpOworICBJTFZSX0I0X1NXKHplcm8sIGRlc3QwLCB6ZXJvLCBkZXN0MSwgemVybywgZGVzdDIsIHplcm8sIGRlc3QzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBJTFZSX0g0X1NXKHplcm8sIHJlczAsIHplcm8sIHJlczEsIHplcm8sIHJlczIsIHplcm8sIHJlczMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIEFERDQocmVzMCwgdnQwLCByZXMxLCB2dDEsIHJlczIsIHZ0MiwgcmVzMywgdnQzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQ0xJUF9TVzRfMF8yNTUocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIFBDS0VWX0IyX1NXKHJlczAsIHJlczEsIHJlczIsIHJlczMsIHZ0MCwgdnQxKTsKKyAgcmVzMCA9ICh2NGkzMilfX21zYV9wY2tldl9iKCh2MTZpOCl2dDAsICh2MTZpOCl2dDEpOworICBTVDR4NF9VQihyZXMwLCByZXMwLCAzLCAyLCAxLCAwLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fTVNBKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKKyAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX01TQShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICB1aW50NjRfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICB1aW50MzJfdCBpbjAsIGluMSwgaW4yLCBpbjM7CisgIHY0aTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgIHY4aTE2IHQwLCB0MSwgdDIsIHQzOworICB2MTZ1OCBzcmNsMCwgc3JjbDEsIHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9OworICBjb25zdCB2OGkxNiBtYXNrMCA9IHsgMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzIH07CisgIGNvbnN0IHY4aTE2IG1hc2sxID0geyAzLCA3LCAxMSwgMTUsIDIsIDYsIDEwLCAxNCB9OworICBjb25zdCB2OGkxNiBtYXNrMiA9IHsgNCwgMCwgNSwgMSwgNiwgMiwgNywgMyB9OworICBjb25zdCB2OGkxNiBtYXNrMyA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworICBjb25zdCB2OGkxNiBjbnN0MCA9IHsgMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIgfTsKKyAgY29uc3QgdjhpMTYgY25zdDEgPSB7IDUzNTIsIDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIsIDIyMTcgfTsKKworICBMVzQoc3JjLCBCUFMsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgIElOU0VSVF9XNF9VQihpbjAsIGluMSwgaW4yLCBpbjMsIHNyYzApOworICBMVzQocmVmLCBCUFMsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgIElOU0VSVF9XNF9VQihpbjAsIGluMSwgaW4yLCBpbjMsIHNyYzEpOworICBJTFZSTF9CMl9VQihzcmMwLCBzcmMxLCBzcmNsMCwgc3JjbDEpOworICBIU1VCX1VCMl9TSChzcmNsMCwgc3JjbDEsIHQwLCB0MSk7CisgIFZTSEZfSDJfU0godDAsIHQxLCB0MCwgdDEsIG1hc2swLCBtYXNrMSwgdDIsIHQzKTsKKyAgQUREU1VCMih0MiwgdDMsIHQwLCB0MSk7CisgIHQwID0gU1JMSV9IKHQwLCAzKTsKKyAgVlNIRl9IMl9TSCh0MCwgdDAsIHQxLCB0MSwgbWFzazIsIG1hc2szLCB0MywgdDIpOworICB0bXAwID0gX19tc2FfaGFkZF9zX3codDMsIHQzKTsKKyAgdG1wMiA9IF9fbXNhX2hzdWJfc193KHQzLCB0Myk7CisgIEZJTExfVzJfU1coMTgxMiwgOTM3LCB0bXAxLCB0bXAzKTsKKyAgRFBBRERfU0gyX1NXKHQyLCB0MiwgY25zdDAsIGNuc3QxLCB0bXAzLCB0bXAxKTsKKyAgU1JBSV9XMl9TVyh0bXAxLCB0bXAzLCA5KTsKKyAgUENLRVZfSDJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdDAsIHQxKTsKKyAgVlNIRl9IMl9TSCh0MCwgdDEsIHQwLCB0MSwgbWFzazAsIG1hc2sxLCB0MiwgdDMpOworICBBRERTVUIyKHQyLCB0MywgdDAsIHQxKTsKKyAgVlNIRl9IMl9TSCh0MCwgdDAsIHQxLCB0MSwgbWFzazIsIG1hc2szLCB0MywgdDIpOworICB0bXAwID0gX19tc2FfaGFkZF9zX3codDMsIHQzKTsKKyAgdG1wMiA9IF9fbXNhX2hzdWJfc193KHQzLCB0Myk7CisgIEFERFZJX1cyX1NXKHRtcDAsIDcsIHRtcDIsIDcsIHRtcDAsIHRtcDIpOworICBTUkFJX1cyX1NXKHRtcDAsIHRtcDIsIDQpOworICBGSUxMX1cyX1NXKDEyMDAwLCA1MTAwMCwgdG1wMSwgdG1wMyk7CisgIERQQUREX1NIMl9TVyh0MiwgdDIsIGNuc3QwLCBjbnN0MSwgdG1wMywgdG1wMSk7CisgIFNSQUlfVzJfU1codG1wMSwgdG1wMywgMTYpOworICBVTlBDS19SX1NIX1NXKHQxLCB0bXA0KTsKKyAgdG1wNSA9IF9fbXNhX2NlcWlfdyh0bXA0LCAwKTsKKyAgdG1wNCA9ICh2NGkzMilfX21zYV9ub3JfdigodjE2dTgpdG1wNSwgKHYxNnU4KXRtcDUpOworICB0bXA1ID0gX19tc2FfZmlsbF93KDEpOworICB0bXA1ID0gKHY0aTMyKV9fbXNhX2FuZF92KCh2MTZ1OCl0bXA1LCAodjE2dTgpdG1wNCk7CisgIHRtcDEgKz0gdG1wNTsKKyAgUENLRVZfSDJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdDAsIHQxKTsKKyAgb3V0MCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MCwgMCk7CisgIG91dDEgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDAsIDEpOworICBvdXQyID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQxLCAwKTsKKyAgb3V0MyA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MSwgMSk7CisgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQsIDgpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX01TQShjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIHY4aTE2IGluMCA9IHsgMCB9OworICB2OGkxNiBpbjEgPSB7IDAgfTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgdjhpMTYgb3V0MCwgb3V0MTsKKyAgY29uc3QgdjhpMTYgbWFzazAgPSB7IDAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSB9OworICBjb25zdCB2OGkxNiBtYXNrMSA9IHsgNCwgNSwgNiwgNywgMTIsIDEzLCAxNCwgMTUgfTsKKyAgY29uc3QgdjhpMTYgbWFzazIgPSB7IDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMyB9OworICBjb25zdCB2OGkxNiBtYXNrMyA9IHsgMywgNywgMTEsIDE1LCAyLCA2LCAxMCwgMTQgfTsKKworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDAsIGluWyAgMF0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDEsIGluWyA2NF0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDIsIGluWzEyOF0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDMsIGluWzE5Ml0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDQsIGluWyAxNl0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDUsIGluWyA4MF0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDYsIGluWzE0NF0pOworICBpbjAgPSBfX21zYV9pbnNlcnRfaChpbjAsIDcsIGluWzIwOF0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDAsIGluWyA0OF0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDEsIGluWzExMl0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDIsIGluWzE3Nl0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDMsIGluWzI0MF0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDQsIGluWyAzMl0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDUsIGluWyA5Nl0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDYsIGluWzE2MF0pOworICBpbjEgPSBfX21zYV9pbnNlcnRfaChpbjEsIDcsIGluWzIyNF0pOworICBBRERTVUIyKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICBBRERTVUIyKHRtcDIsIHRtcDMsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2syLCBtYXNrMywgaW4wLCBpbjEpOworICBBRERTVUIyKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICBBRERTVUIyKHRtcDIsIHRtcDMsIG91dDAsIG91dDEpOworICBTUkFJX0gyX1NIKG91dDAsIG91dDEsIDEpOworICBTVF9TSDIob3V0MCwgb3V0MSwgb3V0LCA4KTsKK30KKworc3RhdGljIGludCBUVHJhbnNmb3JtX01TQShjb25zdCB1aW50OF90KiBpbiwgY29uc3QgdWludDE2X3QqIHcpIHsKKyAgaW50IHN1bTsKKyAgdWludDMyX3QgaW4wX20sIGluMV9tLCBpbjJfbSwgaW4zX207CisgIHYxNmk4IHNyYzAgPSB7IDAgfTsKKyAgdjhpMTYgaW4wLCBpbjEsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIHY0aTMyIGRzdDAsIGRzdDE7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgbWFzazAgPSB7IDAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSB9OworICBjb25zdCB2OGkxNiBtYXNrMSA9IHsgNCwgNSwgNiwgNywgMTIsIDEzLCAxNCwgMTUgfTsKKyAgY29uc3QgdjhpMTYgbWFzazIgPSB7IDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMyB9OworICBjb25zdCB2OGkxNiBtYXNrMyA9IHsgMywgNywgMTEsIDE1LCAyLCA2LCAxMCwgMTQgfTsKKworICBMVzQoaW4sIEJQUywgaW4wX20sIGluMV9tLCBpbjJfbSwgaW4zX20pOworICBJTlNFUlRfVzRfU0IoaW4wX20sIGluMV9tLCBpbjJfbSwgaW4zX20sIHNyYzApOworICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMiwgbWFzazMsIGluMCwgaW4xKTsKKyAgQUREU1VCMihpbjAsIGluMSwgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgQUREU1VCMih0bXAyLCB0bXAzLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMiwgbWFzazMsIGluMCwgaW4xKTsKKyAgQUREU1VCMihpbjAsIGluMSwgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgQUREU1VCMih0bXAyLCB0bXAzLCB0bXAwLCB0bXAxKTsKKyAgdG1wMCA9IF9fbXNhX2FkZF9hX2godG1wMCwgKHY4aTE2KXplcm8pOworICB0bXAxID0gX19tc2FfYWRkX2FfaCh0bXAxLCAodjhpMTYpemVybyk7CisgIExEX1NIMih3LCA4LCB0bXAyLCB0bXAzKTsKKyAgRE9UUF9TSDJfU1codG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZHN0MCwgZHN0MSk7CisgIGRzdDAgPSBkc3QwICsgZHN0MTsKKyAgc3VtID0gSEFERF9TV19TMzIoZHN0MCk7CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDRfTVNBKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBjb25zdCBpbnQgc3VtMSA9IFRUcmFuc2Zvcm1fTVNBKGEsIHcpOworICBjb25zdCBpbnQgc3VtMiA9IFRUcmFuc2Zvcm1fTVNBKGIsIHcpOworICByZXR1cm4gYWJzKHN1bTIgLSBzdW0xKSA+PiA1OworfQorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfTVNBKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfTVNBKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaXN0b2dyYW0KKworc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbV9NU0EoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworICAgIHsKKyAgICAgIGludCBrOworICAgICAgdjhpMTYgY29lZmYwLCBjb2VmZjE7CisgICAgICBjb25zdCB2OGkxNiB6ZXJvID0geyAwIH07CisgICAgICBjb25zdCB2OGkxNiBtYXhfY29lZmZfdGhyID0gX19tc2FfbGRpX2goTUFYX0NPRUZGX1RIUkVTSCk7CisgICAgICBMRF9TSDIoJm91dFswXSwgOCwgY29lZmYwLCBjb2VmZjEpOworICAgICAgY29lZmYwID0gX19tc2FfYWRkX2FfaChjb2VmZjAsIHplcm8pOworICAgICAgY29lZmYxID0gX19tc2FfYWRkX2FfaChjb2VmZjEsIHplcm8pOworICAgICAgU1JBSV9IMl9TSChjb2VmZjAsIGNvZWZmMSwgMyk7CisgICAgICBjb2VmZjAgPSBfX21zYV9taW5fc19oKGNvZWZmMCwgbWF4X2NvZWZmX3Rocik7CisgICAgICBjb2VmZjEgPSBfX21zYV9taW5fc19oKGNvZWZmMSwgbWF4X2NvZWZmX3Rocik7CisgICAgICBTVF9TSDIoY29lZmYwLCBjb2VmZjEsICZvdXRbMF0sIDgpOworICAgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKKyAgICAgICAgKytkaXN0cmlidXRpb25bb3V0W2tdXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhIHByZWRpY3Rpb25zCisKKy8vIGx1bWEgNHg0IHByZWRpY3Rpb24KKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHYxNnU4IEExID0geyAwIH07CisgIGNvbnN0IHVpbnQ2NF90IHZhbF9tID0gTEQodG9wIC0gMSk7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2QoKHYyaTY0KUExLCAwLCB2YWxfbSk7CisgIGNvbnN0IHYxNnU4IEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBjb25zdCB2MTZ1OCBDID0gU0xESV9VQihBLCBBLCAyKTsKKyAgY29uc3QgdjE2dTggQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBjb25zdCB2MTZ1OCBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIGNvbnN0IHYxNnU4IFIgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICBjb25zdCB1aW50MzJfdCBvdXQgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFNXNChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAgIC8vIGhvcml6b250YWwKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSikpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEksIEosIEspKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhKLCBLLCBMKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gdG9wW2ldICsgdG9wWy01ICsgaV07CisgIGRjID4+PSAzOworICBkYyA9IGRjIHwgKGRjIDw8IDgpIHwgKGRjIDw8IDE2KSB8IChkYyA8PCAyNCk7CisgIFNXNChkYywgZGMsIGRjLCBkYywgZHN0LCBCUFMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgdjE2dTggQTIgPSB7IDAgfTsKKyAgY29uc3QgdWludDY0X3QgdmFsX20gPSBMRCh0b3AgLSA1KTsKKyAgY29uc3QgdjE2dTggQTEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2QoKHYyaTY0KUEyLCAwLCB2YWxfbSk7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUExLCA4LCB0b3BbM10pOworICBjb25zdCB2MTZ1OCBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgY29uc3QgdjE2dTggQyA9IFNMRElfVUIoQSwgQSwgMik7CisgIGNvbnN0IHYxNnU4IEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgY29uc3QgdjE2dTggQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBjb25zdCB2MTZ1OCBSMCA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIGNvbnN0IHYxNnU4IFIxID0gU0xESV9VQihSMCwgUjAsIDEpOworICBjb25zdCB2MTZ1OCBSMiA9IFNMRElfVUIoUjEsIFIxLCAxKTsKKyAgY29uc3QgdjE2dTggUjMgPSBTTERJX1VCKFIyLCBSMiwgMSk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDAgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjAsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwxID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIxLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMiA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMiwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDMgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjMsIDApOworICBTVzQodmFsMywgdmFsMiwgdmFsMSwgdmFsMCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgdjE2dTggQTEgPSB7IDAgfTsKKyAgY29uc3QgdWludDY0X3QgdmFsX20gPSBMRCh0b3ApOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9kKCh2Mmk2NClBMSwgMCwgdmFsX20pOworICBjb25zdCB2MTZ1OCBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgY29uc3QgdjE2dTggQzEgPSBTTERJX1VCKEEsIEEsIDIpOworICBjb25zdCB2MTZ1OCBDID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClDMSwgNiwgdG9wWzddKTsKKyAgY29uc3QgdjE2dTggQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBjb25zdCB2MTZ1OCBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIGNvbnN0IHYxNnU4IFIwID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgY29uc3QgdjE2dTggUjEgPSBTTERJX1VCKFIwLCBSMCwgMSk7CisgIGNvbnN0IHYxNnU4IFIyID0gU0xESV9VQihSMSwgUjEsIDEpOworICBjb25zdCB2MTZ1OCBSMyA9IFNMRElfVUIoUjIsIFIyLCAxKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMCwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDEgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjEsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwyID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIyLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMywgMCk7CisgIFNXNCh2YWwwLCB2YWwxLCB2YWwyLCB2YWwzLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZSNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisgIGNvbnN0IGludCBEID0gdG9wWzNdOworICBEU1QoMCwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKFgsIEEpOworICBEU1QoMSwgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEEsIEIpOworICBEU1QoMiwgMCkgPSBEU1QoMywgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkcyKEMsIEQpOworICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOworICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWTDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIGNvbnN0IGludCBFID0gdG9wWzRdOworICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKKyAgY29uc3QgaW50IEcgPSB0b3BbNl07CisgIGNvbnN0IGludCBIID0gdG9wWzddOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOworICBEU1QoMCwgMSkgPSAgICAgICAgICAgICBBVkczKEEsIEIsIEMpOworICBEU1QoMSwgMSkgPSBEU1QoMCwgMykgPSBBVkczKEIsIEMsIEQpOworICBEU1QoMiwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEMsIEQsIEUpOworICBEU1QoMywgMSkgPSBEU1QoMiwgMykgPSBBVkczKEQsIEUsIEYpOworICAgICAgICAgICAgICBEU1QoMywgMikgPSBBVkczKEUsIEYsIEcpOworICAgICAgICAgICAgICBEU1QoMywgMykgPSBBVkczKEYsIEcsIEgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIVTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEksIEopOworICBEU1QoMiwgMCkgPSBEU1QoMCwgMSkgPSBBVkcyKEosIEspOworICBEU1QoMiwgMSkgPSBEU1QoMCwgMikgPSBBVkcyKEssIEwpOworICBEU1QoMSwgMCkgPSAgICAgICAgICAgICBBVkczKEksIEosIEspOworICBEU1QoMywgMCkgPSBEU1QoMSwgMSkgPSBBVkczKEosIEssIEwpOworICBEU1QoMywgMSkgPSBEU1QoMSwgMikgPSBBVkczKEssIEwsIEwpOworICBEU1QoMywgMikgPSBEU1QoMiwgMikgPQorICBEU1QoMCwgMykgPSBEU1QoMSwgMykgPSBEU1QoMiwgMykgPSBEU1QoMywgMykgPSBMOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisgIERTVCgwLCAwKSA9IERTVCgyLCAxKSA9IEFWRzIoSSwgWCk7CisgIERTVCgwLCAxKSA9IERTVCgyLCAyKSA9IEFWRzIoSiwgSSk7CisgIERTVCgwLCAyKSA9IERTVCgyLCAzKSA9IEFWRzIoSywgSik7CisgIERTVCgwLCAzKSAgICAgICAgICAgICA9IEFWRzIoTCwgSyk7CisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCh0b3BbLTFdKTsKKyAgY29uc3QgdjhpMTYgTDAgPSAodjhpMTYpX19tc2FfZmlsbF9oKHRvcFstMl0pOworICBjb25zdCB2OGkxNiBMMSA9ICh2OGkxNilfX21zYV9maWxsX2godG9wWy0zXSk7CisgIGNvbnN0IHY4aTE2IEwyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCh0b3BbLTRdKTsKKyAgY29uc3QgdjhpMTYgTDMgPSAodjhpMTYpX19tc2FfZmlsbF9oKHRvcFstNV0pOworICBjb25zdCB2MTZ1OCBUMSA9IExEX1VCKHRvcCk7CisgIGNvbnN0IHY4aTE2IFQgID0gKHY4aTE2KV9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpVDEpOworICBjb25zdCB2OGkxNiBkID0gVCAtIFRMOworICB2OGkxNiByMCwgcjEsIHIyLCByMzsKKyAgQURENChkLCBMMCwgZCwgTDEsIGQsIEwyLCBkLCBMMywgcjAsIHIxLCByMiwgcjMpOworICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgIFBDS0VWX1NUNHg0X1VCKHIwLCByMSwgcjIsIHIzLCBkc3QsIEJQUyk7Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCitzdGF0aWMgdm9pZCBJbnRyYTRQcmVkc19NU0EodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREM0KEk0REM0ICsgZHN0LCB0b3ApOworICBUTTQoSTRUTTQgKyBkc3QsIHRvcCk7CisgIFZFNChJNFZFNCArIGRzdCwgdG9wKTsKKyAgSEU0KEk0SEU0ICsgZHN0LCB0b3ApOworICBSRDQoSTRSRDQgKyBkc3QsIHRvcCk7CisgIFZSNChJNFZSNCArIGRzdCwgdG9wKTsKKyAgTEQ0KEk0TEQ0ICsgZHN0LCB0b3ApOworICBWTDQoSTRWTDQgKyBkc3QsIHRvcCk7CisgIEhENChJNEhENCArIGRzdCwgdG9wKTsKKyAgSFU0KEk0SFU0ICsgZHN0LCB0b3ApOworfQorCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24KKworI2RlZmluZSBTVE9SRTE2eDE2KG91dCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDAgKiBCUFMsIEJQUyk7ICBcCisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA4ICogQlBTLCBCUFMpOyAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkMTZ4MTYodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgY29uc3QgdjE2dTggb3V0ID0gTERfVUIodG9wKTsKKyAgICBTVE9SRTE2eDE2KG91dCwgZHN0KTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB2MTZ1OCBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKDB4N2YpOworICAgIFNUT1JFMTZ4MTYob3V0LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkMTZ4MTYodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gNCkgeworICAgICAgY29uc3QgdjE2dTggTDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMF0pOworICAgICAgY29uc3QgdjE2dTggTDEgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMV0pOworICAgICAgY29uc3QgdjE2dTggTDIgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMl0pOworICAgICAgY29uc3QgdjE2dTggTDMgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbM10pOworICAgICAgU1RfVUI0KEwwLCBMMSwgTDIsIEwzLCBkc3QsIEJQUyk7CisgICAgICBkc3QgKz0gNCAqIEJQUzsKKyAgICAgIGxlZnQgKz0gNDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdjE2dTggb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigweDgxKTsKKyAgICBTVE9SRTE2eDE2KG91dCwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uMTZ4MTYodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBpbnQgajsKKyAgICAgIHY4aTE2IGQxLCBkMjsKKyAgICAgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICAgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0Wy0xXSk7CisgICAgICBjb25zdCB2MTZ1OCBUID0gTERfVUIodG9wKTsKKyAgICAgIElMVlJMX0IyX1NIKHplcm8sIFQsIGQxLCBkMik7CisgICAgICBTVUIyKGQxLCBUTCwgZDIsIFRMLCBkMSwgZDIpOworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKKyAgICAgICAgdjE2aTggdDAsIHQxLCB0MiwgdDM7CisgICAgICAgIHY4aTE2IHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNzsKKyAgICAgICAgY29uc3QgdjhpMTYgTDAgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDBdKTsKKyAgICAgICAgY29uc3QgdjhpMTYgTDEgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDFdKTsKKyAgICAgICAgY29uc3QgdjhpMTYgTDIgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDJdKTsKKyAgICAgICAgY29uc3QgdjhpMTYgTDMgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDNdKTsKKyAgICAgICAgQURENChkMSwgTDAsIGQxLCBMMSwgZDEsIEwyLCBkMSwgTDMsIHIwLCByMSwgcjIsIHIzKTsKKyAgICAgICAgQURENChkMiwgTDAsIGQyLCBMMSwgZDIsIEwyLCBkMiwgTDMsIHI0LCByNSwgcjYsIHI3KTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICAgICAgICBDTElQX1NINF8wXzI1NShyNCwgcjUsIHI2LCByNyk7CisgICAgICAgIFBDS0VWX0I0X1NCKHI0LCByMCwgcjUsIHIxLCByNiwgcjIsIHI3LCByMywgdDAsIHQxLCB0MiwgdDMpOworICAgICAgICBTVF9TQjQodDAsIHQxLCB0MiwgdDMsIGRzdCwgQlBTKTsKKyAgICAgICAgZHN0ICs9IDQgKiBCUFM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEhvcml6b250YWxQcmVkMTZ4MTYoZHN0LCBsZWZ0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBWZXJ0aWNhbFByZWQxNngxNihkc3QsIHRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHYxNnU4IG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoMHg4MSk7CisgICAgICBTVE9SRTE2eDE2KG91dCwgZHN0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlMTZ4MTYodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCBEQzsKKyAgdjE2dTggb3V0OworICBpZiAodG9wICE9IE5VTEwgJiYgbGVmdCAhPSBOVUxMKSB7CisgICAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKHRvcCk7CisgICAgY29uc3Qgdjh1MTYgZGN0b3AgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgICBjb25zdCB2MTZ1OCBybGVmdCA9IExEX1VCKGxlZnQpOworICAgIGNvbnN0IHY4dTE2IGRjbGVmdCA9IF9fbXNhX2hhZGRfdV9oKHJsZWZ0LCBybGVmdCk7CisgICAgY29uc3Qgdjh1MTYgZGN0ZW1wID0gZGN0b3AgKyBkY2xlZnQ7CisgICAgREMgPSBIQUREX1VIX1UzMihkY3RlbXApOworICAgIERDID0gKERDICsgMTYpID4+IDU7CisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgY29uc3QgdjE2dTggcmxlZnQgPSBMRF9VQihsZWZ0KTsKKyAgICBjb25zdCB2OHUxNiBkY2xlZnQgPSBfX21zYV9oYWRkX3VfaChybGVmdCwgcmxlZnQpOworICAgIERDID0gSEFERF9VSF9VMzIoZGNsZWZ0KTsKKyAgICBEQyA9IChEQyArIERDICsgMTYpID4+IDU7CisgIH0gZWxzZSBpZiAodG9wICE9IE5VTEwpIHsgICAvLyB0b3AgYnV0IG5vIGxlZnQKKyAgICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIodG9wKTsKKyAgICBjb25zdCB2OHUxNiBkY3RvcCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICAgIERDID0gSEFERF9VSF9VMzIoZGN0b3ApOworICAgIERDID0gKERDICsgREMgKyAxNikgPj4gNTsKKyAgfSBlbHNlIHsgICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgREMgPSAweDgwOworICB9CisgIG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoREMpOworICBTVE9SRTE2eDE2KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgSW50cmExNlByZWRzX01TQSh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQ01vZGUxNngxNihJMTZEQzE2ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQxNngxNihJMTZWRTE2ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDE2eDE2KEkxNkhFMTYgKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uMTZ4MTYoSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wKTsKK30KKworLy8gQ2hyb21hIDh4OCBwcmVkaWN0aW9uCisKKyNkZWZpbmUgQ0FMQ19EQzgoaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3Qgdjh1MTYgdGVtcDAgPSBfX21zYV9oYWRkX3VfaChpbiwgaW4pOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjR1MzIgdGVtcDEgPSBfX21zYV9oYWRkX3Vfdyh0ZW1wMCwgdGVtcDApOyAgICAgICAgIFwKKyAgY29uc3QgdjJpNjQgdGVtcDIgPSAodjJpNjQpX19tc2FfaGFkZF91X2QodGVtcDEsIHRlbXAxKTsgIFwKKyAgY29uc3QgdjJpNjQgdGVtcDMgPSBfX21zYV9zcGxhdGlfZCh0ZW1wMiwgMSk7ICAgICAgICAgICAgIFwKKyAgY29uc3QgdjJpNjQgdGVtcDQgPSB0ZW1wMyArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggdGVtcDUgPSAodjE2aTgpX19tc2Ffc3JhcmlfZCh0ZW1wNCwgNCk7ICAgICAgIFwKKyAgY29uc3QgdjJpNjQgdGVtcDYgPSAodjJpNjQpX19tc2Ffc3BsYXRpX2IodGVtcDUsIDApOyAgICAgIFwKKyAgb3V0ID0gX19tc2FfY29weV9zX2QodGVtcDYsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkU4eDgob3V0LCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgIFwKKyAgU0Q0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgMCAqIEJQUywgQlBTKTsgIFwKKyAgU0Q0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgNCAqIEJQUywgQlBTKTsgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZDh4OCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQgPSBMRCh0b3ApOworICAgIFNUT1JFOHg4KG91dCwgZHN0KTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQgPSAweDdmN2Y3ZjdmN2Y3ZjdmN2ZVTEw7CisgICAgU1RPUkU4eDgob3V0LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkOHg4KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gNCkgeworICAgICAgY29uc3QgdjE2dTggTDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMF0pOworICAgICAgY29uc3QgdjE2dTggTDEgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMV0pOworICAgICAgY29uc3QgdjE2dTggTDIgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbMl0pOworICAgICAgY29uc3QgdjE2dTggTDMgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxlZnRbM10pOworICAgICAgY29uc3QgdWludDY0X3Qgb3V0MCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMCwgMCk7CisgICAgICBjb25zdCB1aW50NjRfdCBvdXQxID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwxLCAwKTsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IG91dDIgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDIsIDApOworICAgICAgY29uc3QgdWludDY0X3Qgb3V0MyA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMywgMCk7CisgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBCUFMpOworICAgICAgZHN0ICs9IDQgKiBCUFM7CisgICAgICBsZWZ0ICs9IDQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ2NF90IG91dCA9IDB4ODE4MTgxODE4MTgxODE4MVVMTDsKKyAgICBTVE9SRTh4OChvdXQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbjh4OCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBpbnQgajsKKyAgICAgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0Wy0xXSk7CisgICAgICBjb25zdCB2MTZ1OCBUMSA9IExEX1VCKHRvcCk7CisgICAgICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgICBjb25zdCB2OGkxNiBUICA9ICh2OGkxNilfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KVQxKTsKKyAgICAgIGNvbnN0IHY4aTE2IGQgPSBUIC0gVEw7CisgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaiArPSA0KSB7CisgICAgICAgIHVpbnQ2NF90IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgICAgIHYxNmk4IHQwLCB0MTsKKyAgICAgICAgdjhpMTYgcjAgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDBdKTsKKyAgICAgICAgdjhpMTYgcjEgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDFdKTsKKyAgICAgICAgdjhpMTYgcjIgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDJdKTsKKyAgICAgICAgdjhpMTYgcjMgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbaiArIDNdKTsKKyAgICAgICAgQURENChkLCByMCwgZCwgcjEsIGQsIHIyLCBkLCByMywgcjAsIHIxLCByMiwgcjMpOworICAgICAgICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgICAgICAgIFBDS0VWX0IyX1NCKHIxLCByMCwgcjMsIHIyLCB0MCwgdDEpOworICAgICAgICBvdXQwID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQwLCAwKTsKKyAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MCwgMSk7CisgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDEsIDApOworICAgICAgICBvdXQzID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQxLCAxKTsKKyAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgQlBTKTsKKyAgICAgICAgZHN0ICs9IDQgKiBCUFM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEhvcml6b250YWxQcmVkOHg4KGRzdCwgbGVmdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgVmVydGljYWxQcmVkOHg4KGRzdCwgdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgdWludDY0X3Qgb3V0ID0gMHg4MTgxODE4MTgxODE4MTgxVUxMOworICAgICAgU1RPUkU4eDgob3V0LCBkc3QpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGU4eDgodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICB1aW50NjRfdCBvdXQ7CisgIHYxNnU4IHNyYyA9IHsgMCB9OworICBpZiAodG9wICE9IE5VTEwgJiYgbGVmdCAhPSBOVUxMKSB7CisgICAgY29uc3QgdWludDY0X3QgbGVmdF9tID0gTEQobGVmdCk7CisgICAgY29uc3QgdWludDY0X3QgdG9wX20gPSBMRCh0b3ApOworICAgIElOU0VSVF9EMl9VQihsZWZ0X20sIHRvcF9tLCBzcmMpOworICAgIENBTENfREM4KHNyYywgb3V0KTsKKyAgfSBlbHNlIGlmIChsZWZ0ICE9IE5VTEwpIHsgICAvLyBsZWZ0IGJ1dCBubyB0b3AKKyAgICBjb25zdCB1aW50NjRfdCBsZWZ0X20gPSBMRChsZWZ0KTsKKyAgICBJTlNFUlRfRDJfVUIobGVmdF9tLCBsZWZ0X20sIHNyYyk7CisgICAgQ0FMQ19EQzgoc3JjLCBvdXQpOworICB9IGVsc2UgaWYgKHRvcCAhPSBOVUxMKSB7ICAgLy8gdG9wIGJ1dCBubyBsZWZ0CisgICAgY29uc3QgdWludDY0X3QgdG9wX20gPSBMRCh0b3ApOworICAgIElOU0VSVF9EMl9VQih0b3BfbSwgdG9wX20sIHNyYyk7CisgICAgQ0FMQ19EQzgoc3JjLCBvdXQpOworICB9IGVsc2UgeyAgIC8vIG5vIHRvcCwgbm8gbGVmdCwgbm90aGluZy4KKyAgICBzcmMgPSAodjE2dTgpX19tc2FfZmlsbF9iKDB4ODApOworICAgIG91dCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClzcmMsIDApOworICB9CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkc19NU0EodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIC8vIFUgYmxvY2sKKyAgRENNb2RlOHg4KEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQ4eDgoQzhWRTggKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkOHg4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjh4OChDOFRNOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgLy8gViBibG9jaworICBkc3QgKz0gODsKKyAgaWYgKHRvcCAhPSBOVUxMKSB0b3AgKz0gODsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgbGVmdCArPSAxNjsKKyAgRENNb2RlOHg4KEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQ4eDgoQzhWRTggKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkOHg4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjh4OChDOFRNOCArIGRzdCwgbGVmdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldHJpYworCisjZGVmaW5lIFBBQ0tfRE9UUF9VQjRfU1coaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIHYxNnU4IHRtcDAsIHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHRtcDIsIHRtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhTVUJfVUIyX1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfU0gyX1NXKHRtcDIsIHRtcDMsIHRtcDIsIHRtcDMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGluMiwgaW4zLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhTVUJfVUIyX1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfU0gyX1NXKHRtcDIsIHRtcDMsIHRtcDIsIHRtcDMsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBBQ0tfRFBBRERfVUI0X1NXKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICB2MTZ1OCB0bXAwLCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdG1wMiwgdG1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIU1VCX1VCMl9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRFBBRERfU0gyX1NXKHRtcDIsIHRtcDMsIHRtcDIsIHRtcDMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGluMiwgaW4zLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIU1VCX1VCMl9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRFBBRERfU0gyX1NXKHRtcDIsIHRtcDMsIHRtcDIsIHRtcDMsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IFNTRTE2eDE2X01TQShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMl90IHN1bTsKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgdjE2dTggcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNzsKKyAgdjRpMzIgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKworICBMRF9VQjgoYSwgQlBTLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgTERfVUI4KGIsIEJQUywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNyk7CisgIFBBQ0tfRE9UUF9VQjRfU1coc3JjMCwgcmVmMCwgc3JjMSwgcmVmMSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzIsIHJlZjIsIHNyYzMsIHJlZjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM0LCByZWY0LCBzcmM1LCByZWY1LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNiwgcmVmNiwgc3JjNywgcmVmNywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIGEgKz0gOCAqIEJQUzsKKyAgYiArPSA4ICogQlBTOworICBMRF9VQjgoYSwgQlBTLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgTERfVUI4KGIsIEJQUywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNyk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzAsIHJlZjAsIHNyYzEsIHJlZjEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmMyLCByZWYyLCBzcmMzLCByZWYzLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNCwgcmVmNCwgc3JjNSwgcmVmNSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzYsIHJlZjYsIHNyYzcsIHJlZjcsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBvdXQwICs9IG91dDE7CisgIG91dDIgKz0gb3V0MzsKKyAgb3V0MCArPSBvdXQyOworICBzdW0gPSBIQUREX1NXX1MzMihvdXQwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBTU0UxNng4X01TQShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMl90IHN1bTsKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgdjE2dTggcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNzsKKyAgdjRpMzIgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKworICBMRF9VQjgoYSwgQlBTLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgTERfVUI4KGIsIEJQUywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNyk7CisgIFBBQ0tfRE9UUF9VQjRfU1coc3JjMCwgcmVmMCwgc3JjMSwgcmVmMSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzIsIHJlZjIsIHNyYzMsIHJlZjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM0LCByZWY0LCBzcmM1LCByZWY1LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNiwgcmVmNiwgc3JjNywgcmVmNywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIG91dDAgKz0gb3V0MTsKKyAgb3V0MiArPSBvdXQzOworICBvdXQwICs9IG91dDI7CisgIHN1bSA9IEhBRERfU1dfUzMyKG91dDApOworICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IFNTRTh4OF9NU0EoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJfdCBzdW07CisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgIHYxNnU4IHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjc7CisgIHYxNnU4IHQwLCB0MSwgdDIsIHQzOworICB2NGkzMiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworCisgIExEX1VCOChhLCBCUFMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICBMRF9VQjgoYiwgQlBTLCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3KTsKKyAgSUxWUl9CNF9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCByZWYwLCByZWYxLCByZWYyLCByZWYzLCB0MCwgdDEsIHQyLCB0Myk7CisgIFBBQ0tfRE9UUF9VQjRfU1codDAsIHQyLCB0MSwgdDMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBJTFZSX0I0X1VCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcsIHQwLCB0MSwgdDIsIHQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1codDAsIHQyLCB0MSwgdDMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBvdXQwICs9IG91dDE7CisgIG91dDIgKz0gb3V0MzsKKyAgb3V0MCArPSBvdXQyOworICBzdW0gPSBIQUREX1NXX1MzMihvdXQwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBTU0U0eDRfTVNBKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyX3Qgc3VtID0gMDsKKyAgdWludDMyX3Qgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMzsKKyAgdjE2dTggc3JjID0geyAwIH0sIHJlZiA9IHsgMCB9LCB0bXAwLCB0bXAxOworICB2OGkxNiBkaWZmMCwgZGlmZjE7CisgIHY0aTMyIG91dDAsIG91dDE7CisKKyAgTFc0KGEsIEJQUywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgIExXNChiLCBCUFMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMpOworICBJTlNFUlRfVzRfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjKTsKKyAgSU5TRVJUX1c0X1VCKHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZik7CisgIElMVlJMX0IyX1VCKHNyYywgcmVmLCB0bXAwLCB0bXAxKTsKKyAgSFNVQl9VQjJfU0godG1wMCwgdG1wMSwgZGlmZjAsIGRpZmYxKTsKKyAgRE9UUF9TSDJfU1coZGlmZjAsIGRpZmYxLCBkaWZmMCwgZGlmZjEsIG91dDAsIG91dDEpOworICBvdXQwICs9IG91dDE7CisgIHN1bSA9IEhBRERfU1dfUzMyKG91dDApOworICByZXR1cm4gc3VtOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19NU0EoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IHN1bTsKKyAgdjhpMTYgaW4wLCBpbjEsIHNoMCwgc2gxLCBvdXQwLCBvdXQxOworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCBzaWduMCwgc2lnbjE7CisgIHY0aTMyIHMwLCBzMSwgczIsIHMzLCBiMCwgYjEsIGIyLCBiMywgdDAsIHQxLCB0MiwgdDM7CisgIGNvbnN0IHY4aTE2IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgemlnemFnMCA9IHsgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiB9OworICBjb25zdCB2OGkxNiB6aWd6YWcxID0geyA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1IH07CisgIGNvbnN0IHY4aTE2IG1heGxldmVsID0gX19tc2FfZmlsbF9oKE1BWF9MRVZFTCk7CisKKyAgTERfU0gyKCZpblswXSwgOCwgaW4wLCBpbjEpOworICBMRF9TSDIoJm10eC0+c2hhcnBlbl9bMF0sIDgsIHNoMCwgc2gxKTsKKyAgdG1wNCA9IF9fbXNhX2FkZF9hX2goaW4wLCB6ZXJvKTsKKyAgdG1wNSA9IF9fbXNhX2FkZF9hX2goaW4xLCB6ZXJvKTsKKyAgSUxWUkxfSDJfU0goc2gwLCB0bXA0LCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0goc2gxLCB0bXA1LCB0bXAyLCB0bXAzKTsKKyAgSEFERF9TSDRfU1codG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgczAsIHMxLCBzMiwgczMpOworICBzaWduMCA9IChpbjAgPCB6ZXJvKTsKKyAgc2lnbjEgPSAoaW4xIDwgemVybyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbgorICBMRF9TSDIoJm10eC0+aXFfWzBdLCA4LCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAvLyBpcQorICBJTFZSTF9IMl9TVyh6ZXJvLCB0bXAwLCB0MCwgdDEpOworICBJTFZSTF9IMl9TVyh6ZXJvLCB0bXAxLCB0MiwgdDMpOworICBMRF9TVzQoJm10eC0+Ymlhc19bMF0sIDQsIGIwLCBiMSwgYjIsIGIzKTsgICAgICAvLyBiaWFzCisgIE1VTDQodDAsIHMwLCB0MSwgczEsIHQyLCBzMiwgdDMsIHMzLCB0MCwgdDEsIHQyLCB0Myk7CisgIEFERDQoYjAsIHQwLCBiMSwgdDEsIGIyLCB0MiwgYjMsIHQzLCBiMCwgYjEsIGIyLCBiMyk7CisgIFNSQUlfVzRfU1coYjAsIGIxLCBiMiwgYjMsIDE3KTsKKyAgUENLRVZfSDJfU0goYjEsIGIwLCBiMywgYjIsIHRtcDIsIHRtcDMpOworICB0bXAwID0gKHRtcDIgPiBtYXhsZXZlbCk7CisgIHRtcDEgPSAodG1wMyA+IG1heGxldmVsKTsKKyAgdG1wMiA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXRtcDIsICh2MTZ1OCltYXhsZXZlbCwgKHYxNnU4KXRtcDApOworICB0bXAzID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpdG1wMywgKHYxNnU4KW1heGxldmVsLCAodjE2dTgpdG1wMSk7CisgIFNVQjIoemVybywgdG1wMiwgemVybywgdG1wMywgdG1wMCwgdG1wMSk7CisgIHRtcDIgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl0bXAyLCAodjE2dTgpdG1wMCwgKHYxNnU4KXNpZ24wKTsKKyAgdG1wMyA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXRtcDMsICh2MTZ1OCl0bXAxLCAodjE2dTgpc2lnbjEpOworICBMRF9TVzQoJm10eC0+enRocmVzaF9bMF0sIDQsIHQwLCB0MSwgdDIsIHQzKTsgICAvLyB6dGhyZXNoCisgIHQwID0gKHMwID4gdDApOworICB0MSA9IChzMSA+IHQxKTsKKyAgdDIgPSAoczIgPiB0Mik7CisgIHQzID0gKHMzID4gdDMpOworICBQQ0tFVl9IMl9TSCh0MSwgdDAsIHQzLCB0MiwgdG1wMCwgdG1wMSk7CisgIHRtcDQgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl6ZXJvLCAodjE2dTgpdG1wMiwgKHYxNnU4KXRtcDApOworICB0bXA1ID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpemVybywgKHYxNnU4KXRtcDMsICh2MTZ1OCl0bXAxKTsKKyAgTERfU0gyKCZtdHgtPnFfWzBdLCA4LCB0bXAwLCB0bXAxKTsKKyAgTVVMMih0bXA0LCB0bXAwLCB0bXA1LCB0bXAxLCBpbjAsIGluMSk7CisgIFZTSEZfSDJfU0godG1wNCwgdG1wNSwgdG1wNCwgdG1wNSwgemlnemFnMCwgemlnemFnMSwgb3V0MCwgb3V0MSk7CisgIFNUX1NIMihpbjAsIGluMSwgJmluWzBdLCA4KTsKKyAgU1RfU0gyKG91dDAsIG91dDEsICZvdXRbMF0sIDgpOworICBvdXQwID0gX19tc2FfYWRkX2FfaChvdXQwLCBvdXQxKTsKKyAgc3VtID0gSEFERF9TSF9TMzIob3V0MCk7CisgIHJldHVybiAoc3VtID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX01TQShpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gVlA4RW5jUXVhbnRpemVCbG9jayhpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2soaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdE1TQSh2b2lkKSB7CisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX01TQTsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm1fTVNBOworICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVF9NU0E7CisKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfTVNBOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfTVNBOworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9NU0E7CisKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHNfTVNBOworICBWUDhFbmNQcmVkTHVtYTE2ID0gSW50cmExNlByZWRzX01TQTsKKyAgVlA4RW5jUHJlZENocm9tYTggPSBJbnRyYUNocm9tYVByZWRzX01TQTsKKworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X01TQTsKKyAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhfTVNBOworICBWUDhTU0U4eDggPSBTU0U4eDhfTVNBOworICBWUDhTU0U0eDQgPSBTU0U0eDRfTVNBOworCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX01TQTsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX01TQTsKKyAgVlA4RW5jUXVhbnRpemVCbG9ja1dIVCA9IFF1YW50aXplQmxvY2tfTVNBOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdE1TQSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JmMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbmVvbi5jCkBAIC0wLDAgKzEsOTM4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQVJNIE5FT04gdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gYWRhcHRlZCBmcm9tIGxpYnZweCAoaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS8pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworLy8gSW52ZXJzZSB0cmFuc2Zvcm0uCisvLyBUaGlzIGNvZGUgaXMgcHJldHR5IG11Y2ggdGhlIHNhbWUgYXMgVHJhbnNmb3JtT25lIGluIHRoZSBkZWNfbmVvbi5jLCBleGNlcHQKKy8vIGZvciBzdWJ0cmFjdGlvbiB0byAqcmVmLiBTZWUgdGhlIGNvbW1lbnRzIHRoZXJlIGZvciBhbGdvcml0aG1pYyBleHBsYW5hdGlvbnMuCisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDMSA9IDIwMDkxOworc3RhdGljIGNvbnN0IGludDE2X3Qga0MyID0gMTc3MzQ7ICAvLyBoYWxmIG9mIGtDMiwgYWN0dWFsbHkuIFNlZSBjb21tZW50IGFib3ZlLgorCisvLyBUaGlzIGNvZGUgd29ya3MgYnV0IGlzICpzbG93ZXIqIHRoYW4gdGhlIGlubGluZWQtYXNtIHZlcnNpb24gYmVsb3cKKy8vICh3aXRoIGdjYy00LjYpLiBTbyB3ZSBkaXNhYmxlIGl0IGZvciBub3cuIExhdGVyLCBpdCdsbCBiZSBjb25kaXRpb25hbCB0bworLy8gV0VCUF9VU0VfSU5UUklOU0lDUyBkZWZpbmUuCisvLyBXaXRoIGdjYy00LjgsIGl0J3MgYSBsaXR0bGUgZmFzdGVyIHNwZWVkIHRoYW4gaW5saW5lZC1hc3NlbWJseS4KKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0lOVFJJTlNJQ1MpCisKKy8vIFRyZWF0cyAndicgYXMgYW4gdWludDh4OF90IGFuZCB6ZXJvIGV4dGVuZHMgdG8gYW4gaW50MTZ4OF90Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDhfdCBDb252ZXJ0VThUb1MxNl9ORU9OKHVpbnQzMngyX3QgdikgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZtb3ZsX3U4KHZyZWludGVycHJldF91OF91MzIodikpKTsKK30KKworLy8gUGVyZm9ybXMgdW5zaWduZWQgOGIgc2F0dXJhdGlvbiBvbiAnZHN0MDEnIGFuZCAnZHN0MjMnIHN0b3JpbmcgdGhlIHJlc3VsdAorLy8gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm93cyBvZiAnZHN0Jy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNhdHVyYXRlQW5kU3RvcmU0eDRfTkVPTih1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGRzdDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBkc3QyMykgeworICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgY29uc3QgdWludDh4OF90IGRzdDAxX3U4ID0gdnFtb3Z1bl9zMTYoZHN0MDEpOworICBjb25zdCB1aW50OHg4X3QgZHN0MjNfdTggPSB2cW1vdnVuX3MxNihkc3QyMyk7CisKKyAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MDFfdTgpLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QwMV91OCksIDEpOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDIzX3U4KSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MjNfdTgpLCAxKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkNHg0X05FT04oY29uc3QgaW50MTZ4OF90IHJvdzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IHJvdzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIHVpbnQzMngyX3QgZHN0MDEgPSB2ZHVwX25fdTMyKDApOworICB1aW50MzJ4Ml90IGRzdDIzID0gdmR1cF9uX3UzMigwKTsKKworICAvLyBMb2FkIHRoZSBzb3VyY2UgcGl4ZWxzLgorICBkc3QwMSA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikocmVmICsgMCAqIEJQUyksIGRzdDAxLCAwKTsKKyAgZHN0MjMgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKHJlZiArIDIgKiBCUFMpLCBkc3QyMywgMCk7CisgIGRzdDAxID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShyZWYgKyAxICogQlBTKSwgZHN0MDEsIDEpOworICBkc3QyMyA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikocmVmICsgMyAqIEJQUyksIGRzdDIzLCAxKTsKKworICB7CisgICAgLy8gQ29udmVydCB0byAxNmIuCisgICAgY29uc3QgaW50MTZ4OF90IGRzdDAxX3MxNiA9IENvbnZlcnRVOFRvUzE2X05FT04oZHN0MDEpOworICAgIGNvbnN0IGludDE2eDhfdCBkc3QyM19zMTYgPSBDb252ZXJ0VThUb1MxNl9ORU9OKGRzdDIzKTsKKworICAgIC8vIERlc2NhbGUgd2l0aCByb3VuZGluZy4KKyAgICBjb25zdCBpbnQxNng4X3Qgb3V0MDEgPSB2cnNyYXFfbl9zMTYoZHN0MDFfczE2LCByb3cwMSwgMyk7CisgICAgY29uc3QgaW50MTZ4OF90IG91dDIzID0gdnJzcmFxX25fczE2KGRzdDIzX3MxNiwgcm93MjMsIDMpOworICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0uCisgICAgU2F0dXJhdGVBbmRTdG9yZTR4NF9ORU9OKGRzdCwgb3V0MDEsIG91dDIzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcmFuc3Bvc2U4eDJfTkVPTihjb25zdCBpbnQxNng4X3QgaW4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2eDh4Ml90KiBjb25zdCBvdXQpIHsKKyAgLy8gYTAgYTEgYTIgYTMgfCBiMCBiMSBiMiBiMyAgID0+IGEwIGIwIGMwIGQwIHwgYTEgYjEgYzEgZDEKKyAgLy8gYzAgYzEgYzIgYzMgfCBkMCBkMSBkMiBkMyAgICAgIGEyIGIyIGMyIGQyIHwgYTMgYjMgYzMgZDMKKyAgY29uc3QgaW50MTZ4OHgyX3QgdG1wMCA9IHZ6aXBxX3MxNihpbjAsIGluMSk7ICAgLy8gYTAgYzAgYTEgYzEgYTIgYzIgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIwIGQwIGIxIGQxIGIyIGQyIC4uLgorICAqb3V0ID0gdnppcHFfczE2KHRtcDAudmFsWzBdLCB0bXAwLnZhbFsxXSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRyYW5zZm9ybVBhc3NfTkVPTihpbnQxNng4eDJfdCogY29uc3Qgcm93cykgeworICAvLyB7cm93c30gPSBpbjAgfCBpbjQKKyAgLy8gICAgICAgICAgaW44IHwgaW4xMgorICAvLyBCMSA9IGluNCB8IGluMTIKKyAgY29uc3QgaW50MTZ4OF90IEIxID0KKyAgICAgIHZjb21iaW5lX3MxNih2Z2V0X2hpZ2hfczE2KHJvd3MtPnZhbFswXSksIHZnZXRfaGlnaF9zMTYocm93cy0+dmFsWzFdKSk7CisgIC8vIEMwID0ga0MxICogaW40IHwga0MxICogaW4xMgorICAvLyBDMSA9IGtDMiAqIGluNCB8IGtDMiAqIGluMTIKKyAgY29uc3QgaW50MTZ4OF90IEMwID0gdnNyYXFfbl9zMTYoQjEsIHZxZG11bGhxX25fczE2KEIxLCBrQzEpLCAxKTsKKyAgY29uc3QgaW50MTZ4OF90IEMxID0gdnFkbXVsaHFfbl9zMTYoQjEsIGtDMik7CisgIGNvbnN0IGludDE2eDRfdCBhID0gdnFhZGRfczE2KHZnZXRfbG93X3MxNihyb3dzLT52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYocm93cy0+dmFsWzFdKSk7ICAgLy8gaW4wICsgaW44CisgIGNvbnN0IGludDE2eDRfdCBiID0gdnFzdWJfczE2KHZnZXRfbG93X3MxNihyb3dzLT52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYocm93cy0+dmFsWzFdKSk7ICAgLy8gaW4wIC0gaW44CisgIC8vIGMgPSBrQzIgKiBpbjQgLSBrQzEgKiBpbjEyCisgIC8vIGQgPSBrQzEgKiBpbjQgKyBrQzIgKiBpbjEyCisgIGNvbnN0IGludDE2eDRfdCBjID0gdnFzdWJfczE2KHZnZXRfbG93X3MxNihDMSksIHZnZXRfaGlnaF9zMTYoQzApKTsKKyAgY29uc3QgaW50MTZ4NF90IGQgPSB2cWFkZF9zMTYodmdldF9sb3dfczE2KEMwKSwgdmdldF9oaWdoX3MxNihDMSkpOworICBjb25zdCBpbnQxNng4X3QgRDAgPSB2Y29tYmluZV9zMTYoYSwgYik7ICAgICAgLy8gRDAgPSBhIHwgYgorICBjb25zdCBpbnQxNng4X3QgRDEgPSB2Y29tYmluZV9zMTYoZCwgYyk7ICAgICAgLy8gRDEgPSBkIHwgYworICBjb25zdCBpbnQxNng4X3QgRTAgPSB2cWFkZHFfczE2KEQwLCBEMSk7ICAgICAgLy8gYStkIHwgYitjCisgIGNvbnN0IGludDE2eDhfdCBFX3RtcCA9IHZxc3VicV9zMTYoRDAsIEQxKTsgICAvLyBhLWQgfCBiLWMKKyAgY29uc3QgaW50MTZ4OF90IEUxID0gdmNvbWJpbmVfczE2KHZnZXRfaGlnaF9zMTYoRV90bXApLCB2Z2V0X2xvd19zMTYoRV90bXApKTsKKyAgVHJhbnNwb3NlOHgyX05FT04oRTAsIEUxLCByb3dzKTsKK30KKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybU9uZV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludDE2eDh4Ml90IHJvd3M7CisgIElOSVRfVkVDVE9SMihyb3dzLCB2bGQxcV9zMTYoaW4gKyAwKSwgdmxkMXFfczE2KGluICsgOCkpOworICBUcmFuc2Zvcm1QYXNzX05FT04oJnJvd3MpOworICBUcmFuc2Zvcm1QYXNzX05FT04oJnJvd3MpOworICBBZGQ0eDRfTkVPTihyb3dzLnZhbFswXSwgcm93cy52YWxbMV0sIHJlZiwgZHN0KTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybU9uZV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBrQlBTID0gQlBTOworICBjb25zdCBpbnQxNl90IGtDMUMyW10gPSB7IGtDMSwga0MyLCAwLCAwIH07CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInZsZDEuMTYgICAgICAgICB7cTEsIHEyfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCisgICAgInZsZDEuMTYgICAgICAgICB7ZDB9LCBbJVtrQzFDMl1dICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMjogaW5bMF0KKyAgICAvLyBkMzogaW5bOF0KKyAgICAvLyBkNDogaW5bNF0KKyAgICAvLyBkNTogaW5bMTJdCisgICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBxOCA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMSAqIDIgPj4gMTYKKyAgICAvLyBxOSA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMiA+PiAxNgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIyID0gYSA9IGluWzBdICsgaW5bOF0KKyAgICAvLyBkMjMgPSBiID0gaW5bMF0gLSBpbls4XQorICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gIHE4ID0gaW5bNF0vWzEyXSAqIGtDMSA+PiAxNgorICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gQWRkIHtpbls0XSwgaW5bMTJdfSBiYWNrIGFmdGVyIHRoZSBtdWx0aXBsaWNhdGlvbi4KKyAgICAidnFhZGQuczE2ICAgICAgIHE4LCBxMiwgcTggICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyMCA9IGMgPSBpbls0XSprQzIgLSBpblsxMl0qa0MxCisgICAgLy8gZDIxID0gZCA9IGluWzRdKmtDMSArIGluWzEyXSprQzIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMCwgZDE4LCBkMTcgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQyMSwgZDE5LCBkMTYgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyID0gdG1wWzBdID0gYSArIGQKKyAgICAvLyBkMyA9IHRtcFsxXSA9IGIgKyBjCisgICAgLy8gZDQgPSB0bXBbMl0gPSBiIC0gYworICAgIC8vIGQ1ID0gdG1wWzNdID0gYSAtIGQKKyAgICAidnFhZGQuczE2ICAgICAgIGQyLCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQzLCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ0LCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ1LCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBxOCA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MxICogMiA+PiAxNgorICAgIC8vIHE5ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzIgPj4gMTYKKyAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKKyAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyMiA9IGEgPSB0bXBbMF0gKyB0bXBbOF0KKyAgICAvLyBkMjMgPSBiID0gdG1wWzBdIC0gdG1wWzhdCisgICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIHE4LCBxMiwgcTggICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyMCA9IGMgPSBpbls0XSprQzIgLSBpblsxMl0qa0MxCisgICAgLy8gZDIxID0gZCA9IGluWzRdKmtDMSArIGluWzEyXSprQzIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMCwgZDE4LCBkMTcgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQyMSwgZDE5LCBkMTYgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyID0gdG1wWzBdID0gYSArIGQKKyAgICAvLyBkMyA9IHRtcFsxXSA9IGIgKyBjCisgICAgLy8gZDQgPSB0bXBbMl0gPSBiIC0gYworICAgIC8vIGQ1ID0gdG1wWzNdID0gYSAtIGQKKyAgICAidnFhZGQuczE2ICAgICAgIGQyLCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQzLCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ0LCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ1LCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2bGQxLjMyICAgICAgICAgZDZbMF0sIFslW3JlZl1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDZbMV0sIFslW3JlZl1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDdbMF0sIFslW3JlZl1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDdbMV0sIFslW3JlZl1dLCAlW2tCUFNdICAgIFxuIgorCisgICAgInN1YiAgICAgICAgICVbcmVmXSwgJVtyZWZdLCAlW2tCUFNdLCBsc2wgIzIgXG4iCisKKyAgICAvLyAodmFsKSArIDQgPj4gMworICAgICJ2cnNoci5zMTYgICAgICAgZDIsIGQyLCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDMsIGQzLCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDQsIGQ0LCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDUsIGQ1LCAjMyAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBNdXN0IGFjY3VtdWxhdGUgYmVmb3JlIHNhdHVyYXRpbmcKKyAgICAidm1vdmwudTggICAgICAgIHE4LCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1vdmwudTggICAgICAgIHE5LCBkNyAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2cWFkZC5zMTYgICAgICAgcTEsIHExLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgcTIsIHEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZxbW92dW4uczE2ICAgICBkMCwgcTEgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxbW92dW4uczE2ICAgICBkMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnN0MS4zMiAgICAgICAgIGQwWzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQwWzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQxWzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQxWzFdLCBbJVtkc3RdXSAgICAgICAgICAgICBcbiIKKworICAgIDogW2luXSAiK3IiKGluKSwgW2RzdF0gIityIihkc3QpICAgICAgICAgICAgICAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCisgICAgOiBba0JQU10gInIiKGtCUFMpLCBba0MxQzJdICJyIihrQzFDMiksIFtyZWZdICJyIihyZWYpICAvLyBjb25zdGFudHMKKyAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTgiLCAicTkiLCAicTEwIiwgInExMSIgIC8vIGNsb2JiZXJlZAorICApOworfQorCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfSU5UUklOU0lDUworCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX05FT04oY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgSVRyYW5zZm9ybU9uZV9ORU9OKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lX05FT04ocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworLy8gTG9hZCBhbGwgNHg0IHBpeGVscyBpbnRvIGEgc2luZ2xlIHVpbnQ4eDE2X3QgdmFyaWFibGUuCitzdGF0aWMgdWludDh4MTZfdCBMb2FkNHg0X05FT04oY29uc3QgdWludDhfdCogc3JjKSB7CisgIHVpbnQzMng0X3Qgb3V0ID0gdmR1cHFfbl91MzIoMCk7CisgIG91dCA9IHZsZDFxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopKHNyYyArIDAgKiBCUFMpLCBvdXQsIDApOworICBvdXQgPSB2bGQxcV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKShzcmMgKyAxICogQlBTKSwgb3V0LCAxKTsKKyAgb3V0ID0gdmxkMXFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90Kikoc3JjICsgMiAqIEJQUyksIG91dCwgMik7CisgIG91dCA9IHZsZDFxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopKHNyYyArIDMgKiBCUFMpLCBvdXQsIDMpOworICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF91MzIob3V0KTsKK30KKworLy8gRm9yd2FyZCB0cmFuc2Zvcm0uCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0lOVFJJTlNJQ1MpCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRyYW5zcG9zZTR4NF9TMTZfTkVPTihjb25zdCBpbnQxNng0X3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng0X3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng0X3QgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng0X3QgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNng4X3QqIGNvbnN0IG91dDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2eDhfdCogY29uc3Qgb3V0MzIpIHsKKyAgY29uc3QgaW50MTZ4NHgyX3QgQUIgPSB2dHJuX3MxNihBLCBCKTsKKyAgY29uc3QgaW50MTZ4NHgyX3QgQ0QgPSB2dHJuX3MxNihDLCBEKTsKKyAgY29uc3QgaW50MzJ4MngyX3QgdG1wMDIgPSB2dHJuX3MzMih2cmVpbnRlcnByZXRfczMyX3MxNihBQi52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldF9zMzJfczE2KENELnZhbFswXSkpOworICBjb25zdCBpbnQzMngyeDJfdCB0bXAxMyA9IHZ0cm5fczMyKHZyZWludGVycHJldF9zMzJfczE2KEFCLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3MzMl9zMTYoQ0QudmFsWzFdKSk7CisgICpvdXQwMSA9IHZyZWludGVycHJldHFfczE2X3M2NCgKKyAgICAgIHZjb21iaW5lX3M2NCh2cmVpbnRlcnByZXRfczY0X3MzMih0bXAwMi52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldF9zNjRfczMyKHRtcDEzLnZhbFswXSkpKTsKKyAgKm91dDMyID0gdnJlaW50ZXJwcmV0cV9zMTZfczY0KAorICAgICAgdmNvbWJpbmVfczY0KHZyZWludGVycHJldF9zNjRfczMyKHRtcDEzLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3M2NF9zMzIodG1wMDIudmFsWzFdKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OF90IERpZmZVOFRvUzE2X05FT04oY29uc3QgdWludDh4OF90IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4OF90IGIpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OChhLCBiKSk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fTkVPTihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgaW50MTZ4OF90IGQwZDEsIGQzZDI7ICAgLy8gd29ya2luZyA0eDQgaW50MTYgdmFyaWFibGVzCisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IFMwID0gTG9hZDR4NF9ORU9OKHNyYyk7CisgICAgY29uc3QgdWludDh4MTZfdCBSMCA9IExvYWQ0eDRfTkVPTihyZWYpOworICAgIGNvbnN0IGludDE2eDhfdCBEMEQxID0gRGlmZlU4VG9TMTZfTkVPTih2Z2V0X2xvd191OChTMCksIHZnZXRfbG93X3U4KFIwKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEQyRDMgPSBEaWZmVThUb1MxNl9ORU9OKHZnZXRfaGlnaF91OChTMCksIHZnZXRfaGlnaF91OChSMCkpOworICAgIGNvbnN0IGludDE2eDRfdCBEMCA9IHZnZXRfbG93X3MxNihEMEQxKTsKKyAgICBjb25zdCBpbnQxNng0X3QgRDEgPSB2Z2V0X2hpZ2hfczE2KEQwRDEpOworICAgIGNvbnN0IGludDE2eDRfdCBEMiA9IHZnZXRfbG93X3MxNihEMkQzKTsKKyAgICBjb25zdCBpbnQxNng0X3QgRDMgPSB2Z2V0X2hpZ2hfczE2KEQyRDMpOworICAgIFRyYW5zcG9zZTR4NF9TMTZfTkVPTihEMCwgRDEsIEQyLCBEMywgJmQwZDEsICZkM2QyKTsKKyAgfQorICB7ICAgIC8vIDFyc3QgcGFzcworICAgIGNvbnN0IGludDMyeDRfdCBrQ3N0OTM3ID0gdmR1cHFfbl9zMzIoOTM3KTsKKyAgICBjb25zdCBpbnQzMng0X3Qga0NzdDE4MTIgPSB2ZHVwcV9uX3MzMigxODEyKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTBhMSA9IHZhZGRxX3MxNihkMGQxLCBkM2QyKTsgICAvLyBkMCtkMyB8IGQxK2QyICAgKD1hMHxhMSkKKyAgICBjb25zdCBpbnQxNng4X3QgYTNhMiA9IHZzdWJxX3MxNihkMGQxLCBkM2QyKTsgICAvLyBkMC1kMyB8IGQxLWQyICAgKD1hM3xhMikKKyAgICBjb25zdCBpbnQxNng4X3QgYTBhMV8yID0gdnNobHFfbl9zMTYoYTBhMSwgMyk7CisgICAgY29uc3QgaW50MTZ4NF90IHRtcDAgPSB2YWRkX3MxNih2Z2V0X2xvd19zMTYoYTBhMV8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYoYTBhMV8yKSk7CisgICAgY29uc3QgaW50MTZ4NF90IHRtcDIgPSB2c3ViX3MxNih2Z2V0X2xvd19zMTYoYTBhMV8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYoYTBhMV8yKSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEzXzIyMTcgPSB2bXVsbF9uX3MxNih2Z2V0X2xvd19zMTYoYTNhMiksIDIyMTcpOworICAgIGNvbnN0IGludDMyeDRfdCBhMl8yMjE3ID0gdm11bGxfbl9zMTYodmdldF9oaWdoX3MxNihhM2EyKSwgMjIxNyk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyX3BfYTMgPSB2bWxhbF9uX3MxNihhMl8yMjE3LCB2Z2V0X2xvd19zMTYoYTNhMiksIDUzNTIpOworICAgIGNvbnN0IGludDMyeDRfdCBhM19tX2EyID0gdm1sc2xfbl9zMTYoYTNfMjIxNywgdmdldF9oaWdoX3MxNihhM2EyKSwgNTM1Mik7CisgICAgY29uc3QgaW50MTZ4NF90IHRtcDEgPSB2c2hybl9uX3MzMih2YWRkcV9zMzIoYTJfcF9hMywga0NzdDE4MTIpLCA5KTsKKyAgICBjb25zdCBpbnQxNng0X3QgdG1wMyA9IHZzaHJuX25fczMyKHZhZGRxX3MzMihhM19tX2EyLCBrQ3N0OTM3KSwgOSk7CisgICAgVHJhbnNwb3NlNHg0X1MxNl9ORU9OKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsICZkMGQxLCAmZDNkMik7CisgIH0KKyAgeyAgICAvLyAybmQgcGFzcworICAgIC8vIHRoZSAoMTw8MTYpIGFkZGl0aW9uIGlzIGZvciB0aGUgcmVwbGFjZW1lbnQ6IGEzIT0wICA8LT4gMS0oYTM9PTApCisgICAgY29uc3QgaW50MzJ4NF90IGtDc3QxMjAwMCA9IHZkdXBxX25fczMyKDEyMDAwICsgKDEgPDwgMTYpKTsKKyAgICBjb25zdCBpbnQzMng0X3Qga0NzdDUxMDAwID0gdmR1cHFfbl9zMzIoNTEwMDApOworICAgIGNvbnN0IGludDE2eDhfdCBhMGExID0gdmFkZHFfczE2KGQwZDEsIGQzZDIpOyAgIC8vIGQwK2QzIHwgZDErZDIgICAoPWEwfGExKQorICAgIGNvbnN0IGludDE2eDhfdCBhM2EyID0gdnN1YnFfczE2KGQwZDEsIGQzZDIpOyAgIC8vIGQwLWQzIHwgZDEtZDIgICAoPWEzfGEyKQorICAgIGNvbnN0IGludDE2eDRfdCBhMF9rNyA9IHZhZGRfczE2KHZnZXRfbG93X3MxNihhMGExKSwgdmR1cF9uX3MxNig3KSk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDAgPSB2c2hyX25fczE2KHZhZGRfczE2KGEwX2s3LCB2Z2V0X2hpZ2hfczE2KGEwYTEpKSwgNCk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDIgPSB2c2hyX25fczE2KHZzdWJfczE2KGEwX2s3LCB2Z2V0X2hpZ2hfczE2KGEwYTEpKSwgNCk7CisgICAgY29uc3QgaW50MzJ4NF90IGEzXzIyMTcgPSB2bXVsbF9uX3MxNih2Z2V0X2xvd19zMTYoYTNhMiksIDIyMTcpOworICAgIGNvbnN0IGludDMyeDRfdCBhMl8yMjE3ID0gdm11bGxfbl9zMTYodmdldF9oaWdoX3MxNihhM2EyKSwgMjIxNyk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyX3BfYTMgPSB2bWxhbF9uX3MxNihhMl8yMjE3LCB2Z2V0X2xvd19zMTYoYTNhMiksIDUzNTIpOworICAgIGNvbnN0IGludDMyeDRfdCBhM19tX2EyID0gdm1sc2xfbl9zMTYoYTNfMjIxNywgdmdldF9oaWdoX3MxNihhM2EyKSwgNTM1Mik7CisgICAgY29uc3QgaW50MTZ4NF90IHRtcDEgPSB2YWRkaG5fczMyKGEyX3BfYTMsIGtDc3QxMjAwMCk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDMgPSB2YWRkaG5fczMyKGEzX21fYTIsIGtDc3Q1MTAwMCk7CisgICAgY29uc3QgaW50MTZ4NF90IGEzX2VxXzAgPQorICAgICAgICB2cmVpbnRlcnByZXRfczE2X3UxNih2Y2VxX3MxNih2Z2V0X2xvd19zMTYoYTNhMiksIHZkdXBfbl9zMTYoMCkpKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MSA9IHZhZGRfczE2KHRtcDEsIGEzX2VxXzApOworICAgIHZzdDFfczE2KG91dCArICAwLCBvdXQwKTsKKyAgICB2c3QxX3MxNihvdXQgKyAgNCwgb3V0MSk7CisgICAgdnN0MV9zMTYob3V0ICsgIDgsIG91dDIpOworICAgIHZzdDFfczE2KG91dCArIDEyLCBvdXQzKTsKKyAgfQorfQorCisjZWxzZQorCisvLyBhZGFwdGVkIGZyb20gdnA4L2VuY29kZXIvYXJtL25lb24vc2hvcnRmZGN0X25lb24uYXNtCitzdGF0aWMgY29uc3QgaW50MTZfdCBrQ29lZmYxNltdID0geworICA1MzUyLCAgNTM1MiwgIDUzNTIsIDUzNTIsIDIyMTcsICAyMjE3LCAgMjIxNywgMjIxNworfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtDb2VmZjMyW10gPSB7CisgICAxODEyLCAgMTgxMiwgIDE4MTIsICAxODEyLAorICAgIDkzNywgICA5MzcsICAgOTM3LCAgIDkzNywKKyAgMTIwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsCisgIDUxMDAwLCA1MTAwMCwgNTEwMDAsIDUxMDAwCit9OworCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX05FT04oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IGludCBrQlBTID0gQlBTOworICBjb25zdCB1aW50OF90KiBzcmNfcHRyID0gc3JjOworICBjb25zdCB1aW50OF90KiByZWZfcHRyID0gcmVmOworICBjb25zdCBpbnQxNl90KiBjb2VmZjE2ID0ga0NvZWZmMTY7CisgIGNvbnN0IGludDMyX3QqIGNvZWZmMzIgPSBrQ29lZmYzMjsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAvLyBsb2FkIHNyYyBpbnRvIHE0LCBxNSBpbiBoaWdoIGhhbGYKKyAgICAidmxkMS44IHtkOH0sICBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkMTB9LCBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkOX0sICBbJVtzcmNfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkMTF9LCBbJVtzcmNfcHRyXV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGxvYWQgcmVmIGludG8gcTYsIHE3IGluIGhpZ2ggaGFsZgorICAgICJ2bGQxLjgge2QxMn0sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2QxNH0sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2QxM30sIFslW3JlZl9wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2QxNX0sIFslW3JlZl9wdHJdXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gUGFjayB0aGUgaGlnaCB2YWx1ZXMgaW4gdG8gcTQgYW5kIHE2CisgICAgInZ0cm4uMzIgICAgIHE0LCBxNSAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMzIgICAgIHE2LCBxNyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkWzAtM10gPSBzcmMgLSByZWYKKyAgICAidnN1YmwudTggICAgcTAsIGQ4LCBkMTIgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnN1YmwudTggICAgcTEsIGQ5LCBkMTMgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGxvYWQgY29lZmYxNiBpbnRvIHE4KGQxNj01MzUyLCBkMTc9MjIxNykKKyAgICAidmxkMS4xNiAgICAge3E4fSwgWyVbY29lZmYxNl1dICAgICAgICAgICBcbiIKKworICAgIC8vIGxvYWQgY29lZmYzMiBoaWdoIGhhbGYgaW50byBxOSA9IDE4MTIsIHExMCA9IDkzNworICAgICJ2bGQxLjMyICAgICB7cTksIHExMH0sIFslW2NvZWZmMzJdXSEgICAgIFxuIgorCisgICAgLy8gbG9hZCBjb2VmZjMyIGxvdyBoYWxmIGludG8gcTExPTEyMDAwLCBxMTI9NTEwMDAKKyAgICAidmxkMS4zMiAgICAge3ExMSxxMTJ9LCBbJVtjb2VmZjMyXV0gICAgICBcbiIKKworICAgIC8vIHBhcnQgMQorICAgIC8vIFRyYW5zcG9zZS4gUmVnaXN0ZXIgZE4gaXMgdGhlIHNhbWUgYXMgZE4gaW4gQworICAgICJ2dHJuLjMyICAgICAgICAgZDAsIGQyICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjMyICAgICAgICAgZDEsIGQzICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjE2ICAgICAgICAgZDAsIGQxICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjE2ICAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZhZGQuczE2ICAgICAgICBkNCwgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGEwID0gZDAgKyBkMworICAgICJ2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGQxICsgZDIKKyAgICAidnN1Yi5zMTYgICAgICAgIGQ2LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSBkMSAtIGQyCisgICAgInZzdWIuczE2ICAgICAgICBkNywgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gZDAgLSBkMworCisgICAgInZhZGQuczE2ICAgICAgICBkMCwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIGEwICsgYTEKKyAgICAidnNobC5zMTYgICAgICAgIGQwLCBkMCwgIzMgICAgICAgICAgICAgICBcbiIgLy8gdGVtcFswK2kqNF0gPSAoYTArYTEpIDw8IDMKKyAgICAidnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gYTAgLSBhMQorICAgICJ2c2hsLnMxNiAgICAgICAgZDIsIGQyLCAjMyAgICAgICAgICAgICAgIFxuIiAvLyAodGVtcFsyK2kqNF0gPSAoYTAtYTEpIDw8IDMKKworICAgICJ2bWxhbC5zMTYgICAgICAgcTksIGQ3LCBkMTYgICAgICAgICAgICAgIFxuIiAvLyBhMyo1MzUyICsgMTgxMgorICAgICJ2bWxhbC5zMTYgICAgICAgcTEwLCBkNywgZDE3ICAgICAgICAgICAgIFxuIiAvLyBhMyoyMjE3ICsgOTM3CisgICAgInZtbGFsLnMxNiAgICAgICBxOSwgZDYsIGQxNyAgICAgICAgICAgICAgXG4iIC8vIGEyKjIyMTcgKyBhMyo1MzUyICsgMTgxMgorICAgICJ2bWxzbC5zMTYgICAgICAgcTEwLCBkNiwgZDE2ICAgICAgICAgICAgIFxuIiAvLyBhMyoyMjE3ICsgOTM3IC0gYTIqNTM1MgorCisgICAgLy8gdGVtcFsxK2kqNF0gPSAoZDIqMjIxNyArIGQzKjUzNTIgKyAxODEyKSA+PiA5CisgICAgLy8gdGVtcFszK2kqNF0gPSAoZDMqMjIxNyArIDkzNyAtIGQyKjUzNTIpID4+IDkKKyAgICAidnNocm4uczMyICAgICAgIGQxLCBxOSwgIzkgICAgICAgICAgICAgICBcbiIKKyAgICAidnNocm4uczMyICAgICAgIGQzLCBxMTAsICM5ICAgICAgICAgICAgICBcbiIKKworICAgIC8vIHBhcnQgMgorICAgIC8vIHRyYW5zcG9zZSBkMD1pcFswXSwgZDE9aXBbNF0sIGQyPWlwWzhdLCBkMz1pcFsxMl0KKyAgICAidnRybi4zMiAgICAgICAgIGQwLCBkMiAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4zMiAgICAgICAgIGQxLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4xNiAgICAgICAgIGQwLCBkMSAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4xNiAgICAgICAgIGQyLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2bW92LnMxNiAgICAgICAgZDI2LCAjNyAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZhZGQuczE2ICAgICAgICBkNCwgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGExID0gaXBbMF0gKyBpcFsxMl0KKyAgICAidmFkZC5zMTYgICAgICAgIGQ1LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYjEgPSBpcFs0XSArIGlwWzhdCisgICAgInZzdWIuczE2ICAgICAgICBkNiwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGMxID0gaXBbNF0gLSBpcFs4XQorICAgICJ2YWRkLnMxNiAgICAgICAgZDQsIGQ0LCBkMjYgICAgICAgICAgICAgIFxuIiAvLyBhMSArIDcKKyAgICAidnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gZDEgPSBpcFswXSAtIGlwWzEyXQorCisgICAgInZhZGQuczE2ICAgICAgICBkMCwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIG9wWzBdID0gYTEgKyBiMSArIDcKKyAgICAidnN1Yi5zMTYgICAgICAgIGQyLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gb3BbOF0gPSBhMSAtIGIxICsgNworCisgICAgInZtbGFsLnMxNiAgICAgICBxMTEsIGQ3LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGQxKjUzNTIgKyAxMjAwMAorICAgICJ2bWxhbC5zMTYgICAgICAgcTEyLCBkNywgZDE3ICAgICAgICAgICAgIFxuIiAvLyBkMSoyMjE3ICsgNTEwMDAKKworICAgICJ2Y2VxLnMxNiAgICAgICAgZDQsIGQ3LCAjMCAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzaHIuczE2ICAgICAgICBkMCwgZDAsICM0ICAgICAgICAgICAgICAgXG4iCisgICAgInZzaHIuczE2ICAgICAgICBkMiwgZDIsICM0ICAgICAgICAgICAgICAgXG4iCisKKyAgICAidm1sYWwuczE2ICAgICAgIHExMSwgZDYsIGQxNyAgICAgICAgICAgICBcbiIgLy8gYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMAorICAgICJ2bWxzbC5zMTYgICAgICAgcTEyLCBkNiwgZDE2ICAgICAgICAgICAgIFxuIiAvLyBkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwCisKKyAgICAidm12biAgICAgICAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIgLy8gIShkMSA9PSAwKQorICAgIC8vIG9wWzRdID0gKGMxKjIyMTcgKyBkMSo1MzUyICsgMTIwMDApPj4xNgorICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHExMSwgIzE2ICAgICAgICAgICAgIFxuIgorICAgIC8vIG9wWzRdICs9IChkMSE9MCkKKyAgICAidnN1Yi5zMTYgICAgICAgIGQxLCBkMSwgZDQgICAgICAgICAgICAgICBcbiIKKyAgICAvLyBvcFsxMl09IChkMSoyMjE3IC0gYzEqNTM1MiArIDUxMDAwKT4+MTYKKyAgICAidnNocm4uczMyICAgICAgIGQzLCBxMTIsICMxNiAgICAgICAgICAgICBcbiIKKworICAgIC8vIHNldCByZXN1bHQgdG8gb3V0IGFycmF5CisgICAgInZzdDEuMTYgICAgICAgICB7cTAsIHExfSwgWyVbb3V0XV0gICBcbiIKKyAgICA6IFtzcmNfcHRyXSAiK3IiKHNyY19wdHIpLCBbcmVmX3B0cl0gIityIihyZWZfcHRyKSwKKyAgICAgIFtjb2VmZjMyXSAiK3IiKGNvZWZmMzIpICAgICAgICAgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycworICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2NvZWZmMTZdICJyIihjb2VmZjE2KSwKKyAgICAgIFtvdXRdICJyIihvdXQpICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0YW50cworICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsICJxNSIsICJxNiIsICJxNyIsICJxOCIsICJxOSIsCisgICAgICAicTEwIiwgInExMSIsICJxMTIiLCAicTEzIiAgICAgICAvLyBjbG9iYmVyZWQKKyAgKTsKK30KKworI2VuZGlmCisKKyNkZWZpbmUgTE9BRF9MQU5FXzE2YihWQUxVRSwgTEFORSkgZG8geyAgICAgICAgICAgICBcCisgIChWQUxVRSkgPSB2bGQxX2xhbmVfczE2KHNyYywgKFZBTFVFKSwgKExBTkUpKTsgICAgXAorICBzcmMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRfTkVPTihjb25zdCBpbnQxNl90KiBzcmMsIGludDE2X3QqIG91dCkgeworICBjb25zdCBpbnQgc3RyaWRlID0gMTY7CisgIGNvbnN0IGludDE2eDRfdCB6ZXJvID0gdmR1cF9uX3MxNigwKTsKKyAgaW50MzJ4NHg0X3QgdG1wMDsKKyAgaW50MTZ4NHg0X3QgaW47CisgIElOSVRfVkVDVE9SNChpbiwgemVybywgemVybywgemVybywgemVybyk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzBdLCAwKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMV0sIDApOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsyXSwgMCk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzNdLCAwKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMF0sIDEpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsxXSwgMSk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzJdLCAxKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbM10sIDEpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFswXSwgMik7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzFdLCAyKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMl0sIDIpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFszXSwgMik7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzBdLCAzKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMV0sIDMpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsyXSwgMyk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzNdLCAzKTsKKworICB7CisgICAgLy8gYTAgPSBpblswICogMTZdICsgaW5bMiAqIDE2XQorICAgIC8vIGExID0gaW5bMSAqIDE2XSArIGluWzMgKiAxNl0KKyAgICAvLyBhMiA9IGluWzEgKiAxNl0gLSBpblszICogMTZdCisgICAgLy8gYTMgPSBpblswICogMTZdIC0gaW5bMiAqIDE2XQorICAgIGNvbnN0IGludDMyeDRfdCBhMCA9IHZhZGRsX3MxNihpbi52YWxbMF0sIGluLnZhbFsyXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGExID0gdmFkZGxfczE2KGluLnZhbFsxXSwgaW4udmFsWzNdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTIgPSB2c3VibF9zMTYoaW4udmFsWzFdLCBpbi52YWxbM10pOworICAgIGNvbnN0IGludDMyeDRfdCBhMyA9IHZzdWJsX3MxNihpbi52YWxbMF0sIGluLnZhbFsyXSk7CisgICAgdG1wMC52YWxbMF0gPSB2YWRkcV9zMzIoYTAsIGExKTsKKyAgICB0bXAwLnZhbFsxXSA9IHZhZGRxX3MzMihhMywgYTIpOworICAgIHRtcDAudmFsWzJdID0gdnN1YnFfczMyKGEzLCBhMik7CisgICAgdG1wMC52YWxbM10gPSB2c3VicV9zMzIoYTAsIGExKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50MzJ4NHg0X3QgdG1wMSA9IFRyYW5zcG9zZTR4NF9ORU9OKHRtcDApOworICAgIC8vIGEwID0gdG1wWzAgKyBpXSArIHRtcFsgOCArIGldCisgICAgLy8gYTEgPSB0bXBbNCArIGldICsgdG1wWzEyICsgaV0KKyAgICAvLyBhMiA9IHRtcFs0ICsgaV0gLSB0bXBbMTIgKyBpXQorICAgIC8vIGEzID0gdG1wWzAgKyBpXSAtIHRtcFsgOCArIGldCisgICAgY29uc3QgaW50MzJ4NF90IGEwID0gdmFkZHFfczMyKHRtcDEudmFsWzBdLCB0bXAxLnZhbFsyXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGExID0gdmFkZHFfczMyKHRtcDEudmFsWzFdLCB0bXAxLnZhbFszXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyID0gdnN1YnFfczMyKHRtcDEudmFsWzFdLCB0bXAxLnZhbFszXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEzID0gdnN1YnFfczMyKHRtcDEudmFsWzBdLCB0bXAxLnZhbFsyXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGIwID0gdmhhZGRxX3MzMihhMCwgYTEpOyAgLy8gKGEwICsgYTEpID4+IDEKKyAgICBjb25zdCBpbnQzMng0X3QgYjEgPSB2aGFkZHFfczMyKGEzLCBhMik7ICAvLyAoYTMgKyBhMikgPj4gMQorICAgIGNvbnN0IGludDMyeDRfdCBiMiA9IHZoc3VicV9zMzIoYTMsIGEyKTsgIC8vIChhMyAtIGEyKSA+PiAxCisgICAgY29uc3QgaW50MzJ4NF90IGIzID0gdmhzdWJxX3MzMihhMCwgYTEpOyAgLy8gKGEwIC0gYTEpID4+IDEKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MCA9IHZtb3ZuX3MzMihiMCk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDEgPSB2bW92bl9zMzIoYjEpOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQyID0gdm1vdm5fczMyKGIyKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MyA9IHZtb3ZuX3MzMihiMyk7CisKKyAgICB2c3QxX3MxNihvdXQgKyAgMCwgb3V0MCk7CisgICAgdnN0MV9zMTYob3V0ICsgIDQsIG91dDEpOworICAgIHZzdDFfczE2KG91dCArICA4LCBvdXQyKTsKKyAgICB2c3QxX3MxNihvdXQgKyAxMiwgb3V0Myk7CisgIH0KK30KKyN1bmRlZiBMT0FEX0xBTkVfMTZiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0dXJlIGRpc3RvcnRpb24KKy8vCisvLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKKy8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KKworLy8gYSAwMTIzLCBiIDAxMjMKKy8vIGEgNDU2NywgYiA0NTY3CisvLyBhIDg5YWIsIGIgODlhYgorLy8gYSBjZGVmLCBiIGNkZWYKKy8vCisvLyB0cmFuc3Bvc2UKKy8vCisvLyBhIDA0OGMsIGIgMDQ4YworLy8gYSAxNTlkLCBiIDE1OWQKKy8vIGEgMjZhZSwgYiAyNmFlCisvLyBhIDM3YmYsIGIgMzdiZgorLy8KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4eDRfdCBEaXN0b1RyYW5zcG9zZTR4NFMxNl9ORU9OKGludDE2eDh4NF90IHE0X2luKSB7CisgIGNvbnN0IGludDE2eDh4Ml90IHEyX3RtcDAgPSB2dHJucV9zMTYocTRfaW4udmFsWzBdLCBxNF9pbi52YWxbMV0pOworICBjb25zdCBpbnQxNng4eDJfdCBxMl90bXAxID0gdnRybnFfczE2KHE0X2luLnZhbFsyXSwgcTRfaW4udmFsWzNdKTsKKyAgY29uc3QgaW50MzJ4NHgyX3QgcTJfdG1wMiA9IHZ0cm5xX3MzMih2cmVpbnRlcnByZXRxX3MzMl9zMTYocTJfdG1wMC52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczMyX3MxNihxMl90bXAxLnZhbFswXSkpOworICBjb25zdCBpbnQzMng0eDJfdCBxMl90bXAzID0gdnRybnFfczMyKHZyZWludGVycHJldHFfczMyX3MxNihxMl90bXAwLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zMzJfczE2KHEyX3RtcDEudmFsWzFdKSk7CisgIHE0X2luLnZhbFswXSA9IHZyZWludGVycHJldHFfczE2X3MzMihxMl90bXAyLnZhbFswXSk7CisgIHE0X2luLnZhbFsyXSA9IHZyZWludGVycHJldHFfczE2X3MzMihxMl90bXAyLnZhbFsxXSk7CisgIHE0X2luLnZhbFsxXSA9IHZyZWludGVycHJldHFfczE2X3MzMihxMl90bXAzLnZhbFswXSk7CisgIHE0X2luLnZhbFszXSA9IHZyZWludGVycHJldHFfczE2X3MzMihxMl90bXAzLnZhbFsxXSk7CisgIHJldHVybiBxNF9pbjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDh4NF90IERpc3RvSG9yaXpvbnRhbFBhc3NfTkVPTigKKyAgICBjb25zdCBpbnQxNng4eDRfdCBxNF9pbikgeworICAvLyB7YTAsIGExfSA9IHtpblswXSArIGluWzJdLCBpblsxXSArIGluWzNdfQorICAvLyB7YTMsIGEyfSA9IHtpblswXSAtIGluWzJdLCBpblsxXSAtIGluWzNdfQorICBjb25zdCBpbnQxNng4X3QgcV9hMCA9IHZhZGRxX3MxNihxNF9pbi52YWxbMF0sIHE0X2luLnZhbFsyXSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2ExID0gdmFkZHFfczE2KHE0X2luLnZhbFsxXSwgcTRfaW4udmFsWzNdKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTMgPSB2c3VicV9zMTYocTRfaW4udmFsWzBdLCBxNF9pbi52YWxbMl0pOworICBjb25zdCBpbnQxNng4X3QgcV9hMiA9IHZzdWJxX3MxNihxNF9pbi52YWxbMV0sIHE0X2luLnZhbFszXSk7CisgIGludDE2eDh4NF90IHE0X291dDsKKyAgLy8gdG1wWzBdID0gYTAgKyBhMQorICAvLyB0bXBbMV0gPSBhMyArIGEyCisgIC8vIHRtcFsyXSA9IGEzIC0gYTIKKyAgLy8gdG1wWzNdID0gYTAgLSBhMQorICBJTklUX1ZFQ1RPUjQocTRfb3V0LAorICAgICAgICAgICAgICAgdmFic3FfczE2KHZhZGRxX3MxNihxX2EwLCBxX2ExKSksCisgICAgICAgICAgICAgICB2YWJzcV9zMTYodmFkZHFfczE2KHFfYTMsIHFfYTIpKSwKKyAgICAgICAgICAgICAgIHZhYmRxX3MxNihxX2EzLCBxX2EyKSwgdmFiZHFfczE2KHFfYTAsIHFfYTEpKTsKKyAgcmV0dXJuIHE0X291dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDh4NF90IERpc3RvVmVydGljYWxQYXNzX05FT04oY29uc3QgdWludDh4OHg0X3QgcTRfaW4pIHsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTAgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmFkZGxfdTgocTRfaW4udmFsWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxNF9pbi52YWxbMl0pKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTEgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmFkZGxfdTgocTRfaW4udmFsWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxNF9pbi52YWxbM10pKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTIgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgocTRfaW4udmFsWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxNF9pbi52YWxbM10pKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTMgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgocTRfaW4udmFsWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxNF9pbi52YWxbMl0pKTsKKyAgaW50MTZ4OHg0X3QgcTRfb3V0OworCisgIElOSVRfVkVDVE9SNChxNF9vdXQsCisgICAgICAgICAgICAgICB2YWRkcV9zMTYocV9hMCwgcV9hMSksIHZhZGRxX3MxNihxX2EzLCBxX2EyKSwKKyAgICAgICAgICAgICAgIHZzdWJxX3MxNihxX2EzLCBxX2EyKSwgdnN1YnFfczE2KHFfYTAsIHFfYTEpKTsKKyAgcmV0dXJuIHE0X291dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDR4NF90IERpc3RvTG9hZFdfTkVPTihjb25zdCB1aW50MTZfdCogdykgeworICBjb25zdCB1aW50MTZ4OF90IHFfdzA3ID0gdmxkMXFfdTE2KCZ3WzBdKTsKKyAgY29uc3QgdWludDE2eDhfdCBxX3c4ZiA9IHZsZDFxX3UxNigmd1s4XSk7CisgIGludDE2eDR4NF90IGQ0X3c7CisgIElOSVRfVkVDVE9SNChkNF93LAorICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHZyZWludGVycHJldHFfczE2X3UxNihxX3cwNykpLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYocV93MDcpKSwKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYocV93OGYpKSwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KHFfdzhmKSkpOworICByZXR1cm4gZDRfdzsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludDMyeDJfdCBEaXN0b1N1bV9ORU9OKGNvbnN0IGludDE2eDh4NF90IHE0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDR4NF90IGQ0X3cpIHsKKyAgaW50MzJ4Ml90IGRfc3VtOworICAvLyBzdW0gKz0gd1sgMF0gKiBhYnMoYjApOworICAvLyBzdW0gKz0gd1sgNF0gKiBhYnMoYjEpOworICAvLyBzdW0gKz0gd1sgOF0gKiBhYnMoYjIpOworICAvLyBzdW0gKz0gd1sxMl0gKiBhYnMoYjMpOworICBpbnQzMng0X3QgcV9zdW0wID0gdm11bGxfczE2KGQ0X3cudmFsWzBdLCB2Z2V0X2xvd19zMTYocTRfaW4udmFsWzBdKSk7CisgIGludDMyeDRfdCBxX3N1bTEgPSB2bXVsbF9zMTYoZDRfdy52YWxbMV0sIHZnZXRfbG93X3MxNihxNF9pbi52YWxbMV0pKTsKKyAgaW50MzJ4NF90IHFfc3VtMiA9IHZtdWxsX3MxNihkNF93LnZhbFsyXSwgdmdldF9sb3dfczE2KHE0X2luLnZhbFsyXSkpOworICBpbnQzMng0X3QgcV9zdW0zID0gdm11bGxfczE2KGQ0X3cudmFsWzNdLCB2Z2V0X2xvd19zMTYocTRfaW4udmFsWzNdKSk7CisgIHFfc3VtMCA9IHZtbHNsX3MxNihxX3N1bTAsIGQ0X3cudmFsWzBdLCB2Z2V0X2hpZ2hfczE2KHE0X2luLnZhbFswXSkpOworICBxX3N1bTEgPSB2bWxzbF9zMTYocV9zdW0xLCBkNF93LnZhbFsxXSwgdmdldF9oaWdoX3MxNihxNF9pbi52YWxbMV0pKTsKKyAgcV9zdW0yID0gdm1sc2xfczE2KHFfc3VtMiwgZDRfdy52YWxbMl0sIHZnZXRfaGlnaF9zMTYocTRfaW4udmFsWzJdKSk7CisgIHFfc3VtMyA9IHZtbHNsX3MxNihxX3N1bTMsIGQ0X3cudmFsWzNdLCB2Z2V0X2hpZ2hfczE2KHE0X2luLnZhbFszXSkpOworCisgIHFfc3VtMCA9IHZhZGRxX3MzMihxX3N1bTAsIHFfc3VtMSk7CisgIHFfc3VtMiA9IHZhZGRxX3MzMihxX3N1bTIsIHFfc3VtMyk7CisgIHFfc3VtMiA9IHZhZGRxX3MzMihxX3N1bTAsIHFfc3VtMik7CisgIGRfc3VtID0gdnBhZGRfczMyKHZnZXRfbG93X3MzMihxX3N1bTIpLCB2Z2V0X2hpZ2hfczMyKHFfc3VtMikpOworICBkX3N1bSA9IHZwYWRkX3MzMihkX3N1bSwgZF9zdW0pOworICByZXR1cm4gZF9zdW07Cit9CisKKyNkZWZpbmUgTE9BRF9MQU5FXzMyYihzcmMsIFZBTFVFLCBMQU5FKSBcCisgICAgKFZBTFVFKSA9IHZsZDFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90Kikoc3JjKSwgKFZBTFVFKSwgKExBTkUpKQorCisvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KKy8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgorc3RhdGljIGludCBEaXN0bzR4NF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgdWludDMyeDJfdCBkX2luX2FiXzAxMjMgPSB2ZHVwX25fdTMyKDApOworICB1aW50MzJ4Ml90IGRfaW5fYWJfNDU2NyA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQzMngyX3QgZF9pbl9hYl84OWFiID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDMyeDJfdCBkX2luX2FiX2NkZWYgPSB2ZHVwX25fdTMyKDApOworICB1aW50OHg4eDRfdCBkNF9pbjsKKworICAvLyBsb2FkIGRhdGEgYSwgYgorICBMT0FEX0xBTkVfMzJiKGEgKyAwICogQlBTLCBkX2luX2FiXzAxMjMsIDApOworICBMT0FEX0xBTkVfMzJiKGEgKyAxICogQlBTLCBkX2luX2FiXzQ1NjcsIDApOworICBMT0FEX0xBTkVfMzJiKGEgKyAyICogQlBTLCBkX2luX2FiXzg5YWIsIDApOworICBMT0FEX0xBTkVfMzJiKGEgKyAzICogQlBTLCBkX2luX2FiX2NkZWYsIDApOworICBMT0FEX0xBTkVfMzJiKGIgKyAwICogQlBTLCBkX2luX2FiXzAxMjMsIDEpOworICBMT0FEX0xBTkVfMzJiKGIgKyAxICogQlBTLCBkX2luX2FiXzQ1NjcsIDEpOworICBMT0FEX0xBTkVfMzJiKGIgKyAyICogQlBTLCBkX2luX2FiXzg5YWIsIDEpOworICBMT0FEX0xBTkVfMzJiKGIgKyAzICogQlBTLCBkX2luX2FiX2NkZWYsIDEpOworICBJTklUX1ZFQ1RPUjQoZDRfaW4sCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfdTMyKGRfaW5fYWJfMDEyMyksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfdTMyKGRfaW5fYWJfNDU2NyksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfdTMyKGRfaW5fYWJfODlhYiksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfdTMyKGRfaW5fYWJfY2RlZikpOworCisgIHsKKyAgICAvLyBWZXJ0aWNhbCBwYXNzIGZpcnN0IHRvIGF2b2lkIGEgdHJhbnNwb3NlICh2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwYXNzZXMKKyAgICAvLyBhcmUgY29tbXV0YXRpdmUgYmVjYXVzZSB3L2tXZWlnaHRZIGlzIHN5bW1ldHJpYykgYW5kIHN1YnNlcXVlbnQKKyAgICAvLyB0cmFuc3Bvc2UuCisgICAgY29uc3QgaW50MTZ4OHg0X3QgcTRfdiA9IERpc3RvVmVydGljYWxQYXNzX05FT04oZDRfaW4pOworICAgIGNvbnN0IGludDE2eDR4NF90IGQ0X3cgPSBEaXN0b0xvYWRXX05FT04odyk7CisgICAgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgY29uc3QgaW50MTZ4OHg0X3QgcTRfdCA9IERpc3RvVHJhbnNwb3NlNHg0UzE2X05FT04ocTRfdik7CisgICAgY29uc3QgaW50MTZ4OHg0X3QgcTRfaCA9IERpc3RvSG9yaXpvbnRhbFBhc3NfTkVPTihxNF90KTsKKyAgICBpbnQzMngyX3QgZF9zdW0gPSBEaXN0b1N1bV9ORU9OKHE0X2gsIGQ0X3cpOworCisgICAgLy8gYWJzKHN1bTIgLSBzdW0xKSA+PiA1CisgICAgZF9zdW0gPSB2YWJzX3MzMihkX3N1bSk7CisgICAgZF9zdW0gPSB2c2hyX25fczMyKGRfc3VtLCA1KTsKKyAgICByZXR1cm4gdmdldF9sYW5lX3MzMihkX3N1bSwgMCk7CisgIH0KK30KKyN1bmRlZiBMT0FEX0xBTkVfMzJiCisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X05FT04oYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBjb25zdCB1aW50MTZ4OF90IG1heF9jb2VmZl90aHJlc2ggPSB2ZHVwcV9uX3UxNihNQVhfQ09FRkZfVEhSRVNIKTsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQxNl90IG91dFsxNl07CisgICAgRlRyYW5zZm9ybV9ORU9OKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworICAgIHsKKyAgICAgIGludCBrOworICAgICAgY29uc3QgaW50MTZ4OF90IGEwID0gdmxkMXFfczE2KG91dCArIDApOworICAgICAgY29uc3QgaW50MTZ4OF90IGIwID0gdmxkMXFfczE2KG91dCArIDgpOworICAgICAgY29uc3QgdWludDE2eDhfdCBhMSA9IHZyZWludGVycHJldHFfdTE2X3MxNih2YWJzcV9zMTYoYTApKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYjEgPSB2cmVpbnRlcnByZXRxX3UxNl9zMTYodmFic3FfczE2KGIwKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGEyID0gdnNocnFfbl91MTYoYTEsIDMpOworICAgICAgY29uc3QgdWludDE2eDhfdCBiMiA9IHZzaHJxX25fdTE2KGIxLCAzKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYTMgPSB2bWlucV91MTYoYTIsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgY29uc3QgdWludDE2eDhfdCBiMyA9IHZtaW5xX3UxNihiMiwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICB2c3QxcV9zMTYob3V0ICsgMCwgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KGEzKSk7CisgICAgICB2c3QxcV9zMTYob3V0ICsgOCwgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KGIzKSk7CisgICAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCisgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgICAgICArK2Rpc3RyaWJ1dGlvbltvdXRba11dOworICAgICAgfQorICAgIH0KKyAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlU1NFMTZfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMng0X3QqIGNvbnN0IHN1bSkgeworICBjb25zdCB1aW50OHgxNl90IGEwID0gdmxkMXFfdTgoYSk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYjAgPSB2bGQxcV91OChiKTsKKyAgY29uc3QgdWludDh4MTZfdCBhYnNfZGlmZiA9IHZhYmRxX3U4KGEwLCBiMCk7CisgIGNvbnN0IHVpbnQxNng4X3QgcHJvZDEgPSB2bXVsbF91OCh2Z2V0X2xvd191OChhYnNfZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd191OChhYnNfZGlmZikpOworICBjb25zdCB1aW50MTZ4OF90IHByb2QyID0gdm11bGxfdTgodmdldF9oaWdoX3U4KGFic19kaWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChhYnNfZGlmZikpOworICAvKiBwYWlyLXdpc2UgYWRkcyBhbmQgd2lkZW4gKi8KKyAgY29uc3QgdWludDMyeDRfdCBzdW0xID0gdnBhZGRscV91MTYocHJvZDEpOworICBjb25zdCB1aW50MzJ4NF90IHN1bTIgPSB2cGFkZGxxX3UxNihwcm9kMik7CisgICpzdW0gPSB2YWRkcV91MzIoKnN1bSwgdmFkZHFfdTMyKHN1bTEsIHN1bTIpKTsKK30KKworLy8gSG9yaXpvbnRhbCBzdW0gb2YgYWxsIGZvdXIgdWludDMyX3QgdmFsdWVzIGluICdzdW0nLgorc3RhdGljIGludCBTdW1Ub0ludF9ORU9OKHVpbnQzMng0X3Qgc3VtKSB7CisgIGNvbnN0IHVpbnQ2NHgyX3Qgc3VtMiA9IHZwYWRkbHFfdTMyKHN1bSk7CisgIGNvbnN0IHVpbnQ2NF90IHN1bTMgPSB2Z2V0cV9sYW5lX3U2NChzdW0yLCAwKSArIHZnZXRxX2xhbmVfdTY0KHN1bTIsIDEpOworICByZXR1cm4gKGludClzdW0zOworfQorCitzdGF0aWMgaW50IFNTRTE2eDE2X05FT04oY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJ4NF90IHN1bSA9IHZkdXBxX25fdTMyKDApOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2OyArK3kpIHsKKyAgICBBY2N1bXVsYXRlU1NFMTZfTkVPTihhICsgeSAqIEJQUywgYiArIHkgKiBCUFMsICZzdW0pOworICB9CisgIHJldHVybiBTdW1Ub0ludF9ORU9OKHN1bSk7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4OF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyeDRfdCBzdW0gPSB2ZHVwcV9uX3UzMigwKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCA4OyArK3kpIHsKKyAgICBBY2N1bXVsYXRlU1NFMTZfTkVPTihhICsgeSAqIEJQUywgYiArIHkgKiBCUFMsICZzdW0pOworICB9CisgIHJldHVybiBTdW1Ub0ludF9ORU9OKHN1bSk7Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4X05FT04oY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJ4NF90IHN1bSA9IHZkdXBxX25fdTMyKDApOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDg7ICsreSkgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBhMCA9IHZsZDFfdTgoYSArIHkgKiBCUFMpOworICAgIGNvbnN0IHVpbnQ4eDhfdCBiMCA9IHZsZDFfdTgoYiArIHkgKiBCUFMpOworICAgIGNvbnN0IHVpbnQ4eDhfdCBhYnNfZGlmZiA9IHZhYmRfdTgoYTAsIGIwKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHByb2QgPSB2bXVsbF91OChhYnNfZGlmZiwgYWJzX2RpZmYpOworICAgIHN1bSA9IHZwYWRhbHFfdTE2KHN1bSwgcHJvZCk7CisgIH0KKyAgcmV0dXJuIFN1bVRvSW50X05FT04oc3VtKTsKK30KKworc3RhdGljIGludCBTU0U0eDRfTkVPTihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYTAgPSBMb2FkNHg0X05FT04oYSk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYjAgPSBMb2FkNHg0X05FT04oYik7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYWJzX2RpZmYgPSB2YWJkcV91OChhMCwgYjApOworICBjb25zdCB1aW50MTZ4OF90IHByb2QxID0gdm11bGxfdTgodmdldF9sb3dfdTgoYWJzX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfdTgoYWJzX2RpZmYpKTsKKyAgY29uc3QgdWludDE2eDhfdCBwcm9kMiA9IHZtdWxsX3U4KHZnZXRfaGlnaF91OChhYnNfZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgoYWJzX2RpZmYpKTsKKyAgLyogcGFpci13aXNlIGFkZHMgYW5kIHdpZGVuICovCisgIGNvbnN0IHVpbnQzMng0X3Qgc3VtMSA9IHZwYWRkbHFfdTE2KHByb2QxKTsKKyAgY29uc3QgdWludDMyeDRfdCBzdW0yID0gdnBhZGRscV91MTYocHJvZDIpOworICByZXR1cm4gU3VtVG9JbnRfTkVPTih2YWRkcV91MzIoc3VtMSwgc3VtMikpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDb21waWxhdGlvbiB3aXRoIGdjYy00LjYueCBpcyBwcm9ibGVtYXRpYyBmb3Igbm93LgorI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworc3RhdGljIGludDE2eDhfdCBRdWFudGl6ZV9ORU9OKGludDE2X3QqIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4LCBpbnQgb2Zmc2V0KSB7CisgIGNvbnN0IHVpbnQxNng4X3Qgc2hhcnAgPSB2bGQxcV91MTYoJm10eC0+c2hhcnBlbl9bb2Zmc2V0XSk7CisgIGNvbnN0IHVpbnQxNng4X3QgcSA9IHZsZDFxX3UxNigmbXR4LT5xX1tvZmZzZXRdKTsKKyAgY29uc3QgdWludDE2eDhfdCBpcSA9IHZsZDFxX3UxNigmbXR4LT5pcV9bb2Zmc2V0XSk7CisgIGNvbnN0IHVpbnQzMng0X3QgYmlhczAgPSB2bGQxcV91MzIoJm10eC0+Ymlhc19bb2Zmc2V0ICsgMF0pOworICBjb25zdCB1aW50MzJ4NF90IGJpYXMxID0gdmxkMXFfdTMyKCZtdHgtPmJpYXNfW29mZnNldCArIDRdKTsKKworICBjb25zdCBpbnQxNng4X3QgYSA9IHZsZDFxX3MxNihpbiArIG9mZnNldCk7ICAgICAgICAgICAgICAgIC8vIGluCisgIGNvbnN0IHVpbnQxNng4X3QgYiA9IHZyZWludGVycHJldHFfdTE2X3MxNih2YWJzcV9zMTYoYSkpOyAgLy8gY29lZmYgPSBhYnMoaW4pCisgIGNvbnN0IGludDE2eDhfdCBzaWduID0gdnNocnFfbl9zMTYoYSwgMTUpOyAgICAgICAgICAgICAgICAgLy8gc2lnbgorICBjb25zdCB1aW50MTZ4OF90IGMgPSB2YWRkcV91MTYoYiwgc2hhcnApOyAgICAgICAgICAgICAgICAgIC8vICsgc2hhcnBlbgorICBjb25zdCB1aW50MzJ4NF90IG0wID0gdm11bGxfdTE2KHZnZXRfbG93X3UxNihjKSwgdmdldF9sb3dfdTE2KGlxKSk7CisgIGNvbnN0IHVpbnQzMng0X3QgbTEgPSB2bXVsbF91MTYodmdldF9oaWdoX3UxNihjKSwgdmdldF9oaWdoX3UxNihpcSkpOworICBjb25zdCB1aW50MzJ4NF90IG0yID0gdmhhZGRxX3UzMihtMCwgYmlhczApOworICBjb25zdCB1aW50MzJ4NF90IG0zID0gdmhhZGRxX3UzMihtMSwgYmlhczEpOyAgICAgLy8gKGNvZWZmICogaVEgKyBiaWFzKSA+PiAxCisgIGNvbnN0IHVpbnQxNng4X3QgYzAgPSB2Y29tYmluZV91MTYodnNocm5fbl91MzIobTIsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2hybl9uX3UzMihtMywgMTYpKTsgICAvLyBRRklYPTE3ID0gMTYrMQorICBjb25zdCB1aW50MTZ4OF90IGMxID0gdm1pbnFfdTE2KGMwLCB2ZHVwcV9uX3UxNihNQVhfTEVWRUwpKTsKKyAgY29uc3QgaW50MTZ4OF90IGMyID0gdmVvcnFfczE2KHZyZWludGVycHJldHFfczE2X3UxNihjMSksIHNpZ24pOworICBjb25zdCBpbnQxNng4X3QgYzMgPSB2c3VicV9zMTYoYzIsIHNpZ24pOyAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgc2lnbgorICBjb25zdCBpbnQxNng4X3QgYzQgPSB2bXVscV9zMTYoYzMsIHZyZWludGVycHJldHFfczE2X3UxNihxKSk7CisgIHZzdDFxX3MxNihpbiArIG9mZnNldCwgYzQpOworICBhc3NlcnQoUUZJWCA9PSAxNyk7ICAvLyB0aGlzIGZ1bmN0aW9uIGNhbid0IHdvcmsgYXMgaXMgaWYgUUZJWCAhPSAxNisxCisgIHJldHVybiBjMzsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1NodWZmbGVzWzRdWzhdID0geworICB7IDAsICAgMSwgIDIsICAzLCAgOCwgIDksIDE2LCAxNyB9LAorICB7IDEwLCAxMSwgIDQsICA1LCAgNiwgIDcsIDEyLCAxMyB9LAorICB7IDE4LCAxOSwgMjQsIDI1LCAyNiwgMjcsIDIwLCAyMSB9LAorICB7IDE0LCAxNSwgMjIsIDIzLCAyOCwgMjksIDMwLCAzMSB9Cit9OworCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfTkVPTihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgY29uc3QgaW50MTZ4OF90IG91dDAgPSBRdWFudGl6ZV9ORU9OKGluLCBtdHgsIDApOworICBjb25zdCBpbnQxNng4X3Qgb3V0MSA9IFF1YW50aXplX05FT04oaW4sIG10eCwgOCk7CisgIHVpbnQ4eDh4NF90IHNodWZmbGVzOworICAvLyB2dGJsP191OCBhcmUgbWFya2VkIHVuYXZhaWxhYmxlIGZvciBpT1MgYXJtNjQgd2l0aCBYY29kZSA8IDYuMywgdXNlCisgIC8vIG5vbi1zdGFuZGFyZCB2ZXJzaW9ucyB0aGVyZS4KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgXAorICAgIGRlZmluZWQoX19hcHBsZV9idWlsZF92ZXJzaW9uX18pICYmIChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXzwgNjAyMDAzNykKKyAgdWludDh4MTZ4Ml90IGFsbF9vdXQ7CisgIElOSVRfVkVDVE9SMihhbGxfb3V0LCB2cmVpbnRlcnByZXRxX3U4X3MxNihvdXQwKSwgdnJlaW50ZXJwcmV0cV91OF9zMTYob3V0MSkpOworICBJTklUX1ZFQ1RPUjQoc2h1ZmZsZXMsCisgICAgICAgICAgICAgICB2dGJsMnFfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMF0pKSwKKyAgICAgICAgICAgICAgIHZ0YmwycV91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1sxXSkpLAorICAgICAgICAgICAgICAgdnRibDJxX3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzJdKSksCisgICAgICAgICAgICAgICB2dGJsMnFfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbM10pKSk7CisjZWxzZQorICB1aW50OHg4eDRfdCBhbGxfb3V0OworICBJTklUX1ZFQ1RPUjQoYWxsX291dCwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF9zMTYodmdldF9sb3dfczE2KG91dDApKSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF9zMTYodmdldF9oaWdoX3MxNihvdXQwKSksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfczE2KHZnZXRfbG93X3MxNihvdXQxKSksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfczE2KHZnZXRfaGlnaF9zMTYob3V0MSkpKTsKKyAgSU5JVF9WRUNUT1I0KHNodWZmbGVzLAorICAgICAgICAgICAgICAgdnRibDRfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMF0pKSwKKyAgICAgICAgICAgICAgIHZ0Ymw0X3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzFdKSksCisgICAgICAgICAgICAgICB2dGJsNF91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1syXSkpLAorICAgICAgICAgICAgICAgdnRibDRfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbM10pKSk7CisjZW5kaWYKKyAgLy8gWmlnemFnIHJlb3JkZXJpbmcKKyAgdnN0MV91OCgodWludDhfdCopKG91dCArICAwKSwgc2h1ZmZsZXMudmFsWzBdKTsKKyAgdnN0MV91OCgodWludDhfdCopKG91dCArICA0KSwgc2h1ZmZsZXMudmFsWzFdKTsKKyAgdnN0MV91OCgodWludDhfdCopKG91dCArICA4KSwgc2h1ZmZsZXMudmFsWzJdKTsKKyAgdnN0MV91OCgodWludDhfdCopKG91dCArIDEyKSwgc2h1ZmZsZXMudmFsWzNdKTsKKyAgLy8gdGVzdCB6ZXJvcworICBpZiAoKih1aW50NjRfdCopKG91dCArICAwKSAhPSAwKSByZXR1cm4gMTsKKyAgaWYgKCoodWludDY0X3QqKShvdXQgKyAgNCkgIT0gMCkgcmV0dXJuIDE7CisgIGlmICgqKHVpbnQ2NF90Kikob3V0ICsgIDgpICE9IDApIHJldHVybiAxOworICBpZiAoKih1aW50NjRfdCopKG91dCArIDEyKSAhPSAwKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX05FT04oaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBueiAgPSBRdWFudGl6ZUJsb2NrX05FT04oaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBRdWFudGl6ZUJsb2NrX05FT04oaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKyNlbmRpZiAgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCkgeworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9ORU9OOworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9ORU9OOworCisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX05FT047CisKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfTkVPTjsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X05FT047CisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtX05FT047CisKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9ORU9OOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9ORU9OOworICBWUDhTU0U4eDggPSBTU0U4eDhfTkVPTjsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X05FT047CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX05FT047CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19ORU9OOworI2VuZGlmCit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdE5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTRmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2UyLmMKQEAgLTAsMCArMSwxMzg3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IENocmlzdGlhbiBEdXZpdmllciAoY2R1dml2aWVyQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCisvLyBEb2VzIG9uZSBvciB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLgorc3RhdGljIHZvaWQgSVRyYW5zZm9ybV9TU0UyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKSB7CisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2LWJpdCBmaXhlZCBwb2ludCB2ZXJzaW9ucyBvZiB0d28KKyAgLy8gbXVsdGlwbHkgY29uc3RhbnRzOgorICAvLyAgICBLMSA9IHNxcnQoMikgKiBjb3MgKHBpLzgpIH49IDg1NjI3IC8gMl4xNgorICAvLyAgICBLMiA9IHNxcnQoMikgKiBzaW4gKHBpLzgpIH49IDM1NDY4IC8gMl4xNgorICAvLworICAvLyBUbyBiZSBhYmxlIHRvIHVzZSBzaWduZWQgMTYtYml0IGludGVnZXJzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayB0bworICAvLyBoYXZlIGNvbnN0YW50cyB3aXRoaW4gcmFuZ2U6CisgIC8vIC0gQXNzb2NpYXRlZCBjb25zdGFudHMgYXJlIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nIHRoZSAxNi1iaXQgZml4ZWQgcG9pbnQKKyAgLy8gICB2ZXJzaW9uIG9mIG9uZToKKyAgLy8gICAgICBrID0gSyAtICgxIDw8IDE2KSAgPT4gIEsgPSBrICsgKDEgPDwgMTYpCisgIC8vICAgICAgSzEgPSA4NTI2NyAgPT4gIGsxID0gIDIwMDkxCisgIC8vICAgICAgSzIgPSAzNTQ2OCAgPT4gIGsyID0gLTMwMDY4CisgIC8vIC0gVGhlIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFyaWFibGUgYnkgYSBjb25zdGFudCBiZWNvbWUgdGhlIHN1bSBvZiB0aGUKKyAgLy8gICB2YXJpYWJsZSBhbmQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoYXQgdmFyaWFibGUgYnkgdGhlIGFzc29jaWF0ZWQKKyAgLy8gICBjb25zdGFudDoKKyAgLy8gICAgICAoeCAqIEspID4+IDE2ID0gKHggKiAoayArICgxIDw8IDE2KSkpID4+IDE2ID0gKCh4ICogayApID4+IDE2KSArIHgKKyAgY29uc3QgX19tMTI4aSBrMSA9IF9tbV9zZXQxX2VwaTE2KDIwMDkxKTsKKyAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KC0zMDA2OCk7CisgIF9fbTEyOGkgVDAsIFQxLCBUMiwgVDM7CisKKyAgLy8gTG9hZCBhbmQgY29uY2F0ZW5hdGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgKHdlJ2xsIGRvIHR3byBpbnZlcnNlCisgIC8vIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwpLiBJbiB0aGUgY2FzZSBvZiBvbmx5IG9uZSBpbnZlcnNlIHRyYW5zZm9ybSwgdGhlCisgIC8vIHNlY29uZCBoYWxmIG9mIHRoZSB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlcgorICAvLyB1c2Ugbm9yIHN0b3JlLgorICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKKyAgeworICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzBdKTsKKyAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls0XSk7CisgICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bOF0pOworICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzEyXSk7CisgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAorICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKKyAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4CisgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAorICAgIGlmIChkb190d28pIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjRdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI4XSk7CisgICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKKyAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOworICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7CisgICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKKyAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCisgICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKKyAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworICAgIH0KKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOworICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZ0bXAwLCAmdG1wMSwgJnRtcDIsICZ0bXAzLCAmVDAsICZUMSwgJlQyLCAmVDMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKKyAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7CisgICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOworICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnNoaWZ0ZWQwLCAmc2hpZnRlZDEsICZzaGlmdGVkMiwgJnNoaWZ0ZWQzLCAmVDAsICZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEFkZCBpbnZlcnNlIHRyYW5zZm9ybSB0byAncmVmJyBhbmQgc3RvcmUuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIC8vIExvYWQgdGhlIHJlZmVyZW5jZShzKS4KKyAgICBfX20xMjhpIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjM7CisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gTG9hZCBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICByZWYwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKKyAgICAgIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOworICAgICAgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsyICogQlBTXSk7CisgICAgICByZWYzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTG9hZCBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIHJlZjAgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlswICogQlBTXSkpOworICAgICAgcmVmMSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMigmcmVmWzEgKiBCUFNdKSk7CisgICAgICByZWYyID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKCZyZWZbMiAqIEJQU10pKTsKKyAgICAgIHJlZjMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlszICogQlBTXSkpOworICAgIH0KKyAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgICByZWYwID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7CisgICAgcmVmMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOworICAgIHJlZjIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKKyAgICByZWYzID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7CisgICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KKyAgICByZWYwID0gX21tX2FkZF9lcGkxNihyZWYwLCBUMCk7CisgICAgcmVmMSA9IF9tbV9hZGRfZXBpMTYocmVmMSwgVDEpOworICAgIHJlZjIgPSBfbW1fYWRkX2VwaTE2KHJlZjIsIFQyKTsKKyAgICByZWYzID0gX21tX2FkZF9lcGkxNihyZWYzLCBUMyk7CisgICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgICAgcmVmMCA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMCwgcmVmMCk7CisgICAgcmVmMSA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMSwgcmVmMSk7CisgICAgcmVmMiA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMiwgcmVmMik7CisgICAgcmVmMyA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMywgcmVmMyk7CisgICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSwgcmVmMCk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdLCByZWYxKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10sIHJlZjIpOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSwgcmVmMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMCAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjApKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbSgmZHN0WzEgKiBCUFNdLCBfbW1fY3Z0c2kxMjhfc2kzMihyZWYxKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oJmRzdFsyICogQlBTXSwgX21tX2N2dHNpMTI4X3NpMzIocmVmMikpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMyAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjMpKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVBhc3MxX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgaW4wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDMyKSB7CisgIGNvbnN0IF9fbTEyOGkgazkzNyA9IF9tbV9zZXQxX2VwaTMyKDkzNyk7CisgIGNvbnN0IF9fbTEyOGkgazE4MTIgPSBfbW1fc2V0MV9lcGkzMigxODEyKTsKKworICBjb25zdCBfX20xMjhpIGs4OHAgPSBfbW1fc2V0X2VwaTE2KDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgpOworICBjb25zdCBfX20xMjhpIGs4OG0gPSBfbW1fc2V0X2VwaTE2KC04LCA4LCAtOCwgOCwgLTgsIDgsIC04LCA4KTsKKyAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3cCA9IF9tbV9zZXRfZXBpMTYoMjIxNywgNTM1MiwgMjIxNywgNTM1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNywgNTM1MiwgMjIxNywgNTM1Mik7CisgIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxN20gPSBfbW1fc2V0X2VwaTE2KC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3KTsKKworICAvLyAqaW4wMSA9IDAwIDAxIDEwIDExIDAyIDAzIDEyIDEzCisgIC8vICppbjIzID0gMjAgMjEgMzAgMzEgMjIgMjMgMzIgMzMKKyAgY29uc3QgX19tMTI4aSBzaHVmMDFfcCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoKmluMDEsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmMjNfcCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoKmluMjMsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgLy8gMDAgMDEgMTAgMTEgMDMgMDIgMTMgMTIKKyAgLy8gMjAgMjEgMzAgMzEgMjMgMjIgMzMgMzIKKyAgY29uc3QgX19tMTI4aSBzMDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoc2h1ZjAxX3AsIHNodWYyM19wKTsKKyAgY29uc3QgX19tMTI4aSBzMzIgPSBfbW1fdW5wYWNraGlfZXBpNjQoc2h1ZjAxX3AsIHNodWYyM19wKTsKKyAgLy8gMDAgMDEgMTAgMTEgMjAgMjEgMzAgMzEKKyAgLy8gMDMgMDIgMTMgMTIgMjMgMjIgMzMgMzIKKyAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KHMwMSwgczMyKTsKKyAgY29uc3QgX19tMTI4aSBhMzIgPSBfbW1fc3ViX2VwaTE2KHMwMSwgczMyKTsKKyAgLy8gW2QwICsgZDMgfCBkMSArIGQyIHwgLi4uXSA9IFthMCBhMSB8IGEwJyBhMScgfCAuLi4gXQorICAvLyBbZDAgLSBkMyB8IGQxIC0gZDIgfCAuLi5dID0gW2EzIGEyIHwgYTMnIGEyJyB8IC4uLiBdCisKKyAgY29uc3QgX19tMTI4aSB0bXAwICAgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OHApOyAgLy8gWyAoYTAgKyBhMSkgPDwgMywgLi4uIF0KKyAgY29uc3QgX19tMTI4aSB0bXAyICAgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OG0pOyAgLy8gWyAoYTAgLSBhMSkgPDwgMywgLi4uIF0KKyAgY29uc3QgX19tMTI4aSB0bXAxXzEgPSBfbW1fbWFkZF9lcGkxNihhMzIsIGs1MzUyXzIyMTdwKTsKKyAgY29uc3QgX19tMTI4aSB0bXAzXzEgPSBfbW1fbWFkZF9lcGkxNihhMzIsIGs1MzUyXzIyMTdtKTsKKyAgY29uc3QgX19tMTI4aSB0bXAxXzIgPSBfbW1fYWRkX2VwaTMyKHRtcDFfMSwgazE4MTIpOworICBjb25zdCBfX20xMjhpIHRtcDNfMiA9IF9tbV9hZGRfZXBpMzIodG1wM18xLCBrOTM3KTsKKyAgY29uc3QgX19tMTI4aSB0bXAxICAgPSBfbW1fc3JhaV9lcGkzMih0bXAxXzIsIDkpOworICBjb25zdCBfX20xMjhpIHRtcDMgICA9IF9tbV9zcmFpX2VwaTMyKHRtcDNfMiwgOSk7CisgIGNvbnN0IF9fbTEyOGkgczAzICAgID0gX21tX3BhY2tzX2VwaTMyKHRtcDAsIHRtcDIpOworICBjb25zdCBfX20xMjhpIHMxMiAgICA9IF9tbV9wYWNrc19lcGkzMih0bXAxLCB0bXAzKTsKKyAgY29uc3QgX19tMTI4aSBzX2xvICAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoczAzLCBzMTIpOyAgIC8vIDAgMSAwIDEgMCAxLi4uCisgIGNvbnN0IF9fbTEyOGkgc19oaSAgID0gX21tX3VucGFja2hpX2VwaTE2KHMwMywgczEyKTsgICAvLyAyIDMgMiAzIDIgMworICBjb25zdCBfX20xMjhpIHYyMyAgICA9IF9tbV91bnBhY2toaV9lcGkzMihzX2xvLCBzX2hpKTsKKyAgKm91dDAxID0gX21tX3VucGFja2xvX2VwaTMyKHNfbG8sIHNfaGkpOworICAqb3V0MzIgPSBfbW1fc2h1ZmZsZV9lcGkzMih2MjMsIF9NTV9TSFVGRkxFKDEsIDAsIDMsIDIpKTsgIC8vIDMgMiAzIDIgMyAyLi4KK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVBhc3MyX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgdjAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgdjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgc2V2ZW4gPSBfbW1fc2V0MV9lcGkxNig3KTsKKyAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3ID0gX21tX3NldF9lcGkxNig1MzUyLCAgMjIxNywgNTM1MiwgIDIyMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM1MiwgIDIyMTcsIDUzNTIsICAyMjE3KTsKKyAgY29uc3QgX19tMTI4aSBrMjIxN181MzUyID0gX21tX3NldF9lcGkxNigyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyKTsKKyAgY29uc3QgX19tMTI4aSBrMTIwMDBfcGx1c19vbmUgPSBfbW1fc2V0MV9lcGkzMigxMjAwMCArICgxIDw8IDE2KSk7CisgIGNvbnN0IF9fbTEyOGkgazUxMDAwID0gX21tX3NldDFfZXBpMzIoNTEwMDApOworCisgIC8vIFNhbWUgb3BlcmF0aW9ucyBhcmUgZG9uZSBvbiB0aGUgKDAsMykgYW5kICgxLDIpIHBhaXJzLgorICAvLyBhMyA9IHYwIC0gdjMKKyAgLy8gYTIgPSB2MSAtIHYyCisgIGNvbnN0IF9fbTEyOGkgYTMyID0gX21tX3N1Yl9lcGkxNigqdjAxLCAqdjMyKTsKKyAgY29uc3QgX19tMTI4aSBhMjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTMyLCBhMzIpOworCisgIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTE2KGEyMiwgYTMyKTsKKyAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tYWRkX2VwaTE2KGIyMywgazUzNTJfMjIxNyk7CisgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGsyMjE3XzUzNTIpOworICBjb25zdCBfX20xMjhpIGQxID0gX21tX2FkZF9lcGkzMihjMSwgazEyMDAwX3BsdXNfb25lKTsKKyAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMzIoYzMsIGs1MTAwMCk7CisgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fc3JhaV9lcGkzMihkMSwgMTYpOworICBjb25zdCBfX20xMjhpIGUzID0gX21tX3NyYWlfZXBpMzIoZDMsIDE2KTsKKyAgLy8gZjEgPSAoKGIzICogNTM1MiArIGIyICogMjIxNyArIDEyMDAwKSA+PiAxNikKKyAgLy8gZjMgPSAoKGIzICogMjIxNyAtIGIyICogNTM1MiArIDUxMDAwKSA+PiAxNikKKyAgY29uc3QgX19tMTI4aSBmMSA9IF9tbV9wYWNrc19lcGkzMihlMSwgZTEpOworICBjb25zdCBfX20xMjhpIGYzID0gX21tX3BhY2tzX2VwaTMyKGUzLCBlMyk7CisgIC8vIGcxID0gZjEgKyAoYTMgIT0gMCk7CisgIC8vIFRoZSBjb21wYXJlIHdpbGwgcmV0dXJuICgweGZmZmYsIDApIGZvciAoPT0wLCAhPTApLiBUbyB0dXJuIHRoYXQgaW50byB0aGUKKyAgLy8gZGVzaXJlZCAoMCwgMSksIHdlIGFkZCBvbmUgZWFybGllciB0aHJvdWdoIGsxMjAwMF9wbHVzX29uZS4KKyAgLy8gLT4gZzEgPSBmMSArIDEgLSAoYTMgPT0gMCkKKyAgY29uc3QgX19tMTI4aSBnMSA9IF9tbV9hZGRfZXBpMTYoZjEsIF9tbV9jbXBlcV9lcGkxNihhMzIsIHplcm8pKTsKKworICAvLyBhMCA9IHYwICsgdjMKKyAgLy8gYTEgPSB2MSArIHYyCisgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX2FkZF9lcGkxNigqdjAxLCAqdjMyKTsKKyAgY29uc3QgX19tMTI4aSBhMDFfcGx1c183ID0gX21tX2FkZF9lcGkxNihhMDEsIHNldmVuKTsKKyAgY29uc3QgX19tMTI4aSBhMTEgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTAxLCBhMDEpOworICBjb25zdCBfX20xMjhpIGMwID0gX21tX2FkZF9lcGkxNihhMDFfcGx1c183LCBhMTEpOworICBjb25zdCBfX20xMjhpIGMyID0gX21tX3N1Yl9lcGkxNihhMDFfcGx1c183LCBhMTEpOworICAvLyBkMCA9IChhMCArIGExICsgNykgPj4gNDsKKyAgLy8gZDIgPSAoYTAgLSBhMSArIDcpID4+IDQ7CisgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3JhaV9lcGkxNihjMCwgNCk7CisgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fc3JhaV9lcGkxNihjMiwgNCk7CisKKyAgY29uc3QgX19tMTI4aSBkMF9nMSA9IF9tbV91bnBhY2tsb19lcGk2NChkMCwgZzEpOworICBjb25zdCBfX20xMjhpIGQyX2YzID0gX21tX3VucGFja2xvX2VwaTY0KGQyLCBmMyk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIGQwX2cxKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgZDJfZjMpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX1NTRTIoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIC8vIExvYWQgc3JjLgorICBjb25zdCBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMCAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMSAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMiAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMyAqIEJQU10pOworICAvLyAwMCAwMSAwMiAwMyAqCisgIC8vIDEwIDExIDEyIDEzICoKKyAgLy8gMjAgMjEgMjIgMjMgKgorICAvLyAzMCAzMSAzMiAzMyAqCisgIC8vIFNodWZmbGUuCisgIGNvbnN0IF9fbTEyOGkgc3JjXzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc3JjMCwgc3JjMSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc3JjMiwgc3JjMyk7CisgIC8vIDAwIDAxIDEwIDExIDAyIDAzIDEyIDEzICogKiAuLi4KKyAgLy8gMjAgMjEgMzAgMzEgMjIgMjIgMzIgMzMgKiAqIC4uLgorCisgIC8vIExvYWQgcmVmLgorICBjb25zdCBfX20xMjhpIHJlZjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMCAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMyAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZl8wID0gX21tX3VucGFja2xvX2VwaTE2KHJlZjAsIHJlZjEpOworICBjb25zdCBfX20xMjhpIHJlZl8xID0gX21tX3VucGFja2xvX2VwaTE2KHJlZjIsIHJlZjMpOworCisgIC8vIENvbnZlcnQgYm90aCB0byAxNiBiaXQuCisgIGNvbnN0IF9fbTEyOGkgc3JjXzBfMTZiID0gX21tX3VucGFja2xvX2VwaTgoc3JjXzAsIHplcm8pOworICBjb25zdCBfX20xMjhpIHNyY18xXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHNyY18xLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMF8xNmIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWZfMCwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzFfMTZiID0gX21tX3VucGFja2xvX2VwaTgocmVmXzEsIHplcm8pOworCisgIC8vIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UuCisgIGNvbnN0IF9fbTEyOGkgcm93MDEgPSBfbW1fc3ViX2VwaTE2KHNyY18wXzE2YiwgcmVmXzBfMTZiKTsKKyAgY29uc3QgX19tMTI4aSByb3cyMyA9IF9tbV9zdWJfZXBpMTYoc3JjXzFfMTZiLCByZWZfMV8xNmIpOworICBfX20xMjhpIHYwMSwgdjMyOworCisgIC8vIEZpcnN0IHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MxX1NTRTIoJnJvdzAxLCAmcm93MjMsICZ2MDEsICZ2MzIpOworCisgIC8vIFNlY29uZCBwYXNzCisgIEZUcmFuc2Zvcm1QYXNzMl9TU0UyKCZ2MDEsICZ2MzIsIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0yX1NTRTIoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworCisgIC8vIExvYWQgc3JjIGFuZCBjb252ZXJ0IHRvIDE2Yi4KKyAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzMgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMCA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzAsIHplcm8pOworICBjb25zdCBfX20xMjhpIHNyY18xID0gX21tX3VucGFja2xvX2VwaTgoc3JjMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMyLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMyA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzMsIHplcm8pOworICAvLyBMb2FkIHJlZiBhbmQgY29udmVydCB0byAxNmIuCisgIGNvbnN0IF9fbTEyOGkgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlswICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsxICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsyICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlszICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYwLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8yID0gX21tX3VucGFja2xvX2VwaTgocmVmMiwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYzLCB6ZXJvKTsKKyAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlLiAtPiAwMCAwMSAwMiAwMyAgMDAnIDAxJyAwMicgMDMnCisgIGNvbnN0IF9fbTEyOGkgZGlmZjAgPSBfbW1fc3ViX2VwaTE2KHNyY18wLCByZWZfMCk7CisgIGNvbnN0IF9fbTEyOGkgZGlmZjEgPSBfbW1fc3ViX2VwaTE2KHNyY18xLCByZWZfMSk7CisgIGNvbnN0IF9fbTEyOGkgZGlmZjIgPSBfbW1fc3ViX2VwaTE2KHNyY18yLCByZWZfMik7CisgIGNvbnN0IF9fbTEyOGkgZGlmZjMgPSBfbW1fc3ViX2VwaTE2KHNyY18zLCByZWZfMyk7CisKKyAgLy8gVW5wYWNrIGFuZCBzaHVmZmxlCisgIC8vIDAwIDAxIDAyIDAzICAgMCAwIDAgMAorICAvLyAxMCAxMSAxMiAxMyAgIDAgMCAwIDAKKyAgLy8gMjAgMjEgMjIgMjMgICAwIDAgMCAwCisgIC8vIDMwIDMxIDMyIDMzICAgMCAwIDAgMAorICBjb25zdCBfX20xMjhpIHNodWYwMWwgPSBfbW1fdW5wYWNrbG9fZXBpMzIoZGlmZjAsIGRpZmYxKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmMjNsID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYyLCBkaWZmMyk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxaCA9IF9tbV91bnBhY2toaV9lcGkzMihkaWZmMCwgZGlmZjEpOworICBjb25zdCBfX20xMjhpIHNodWYyM2ggPSBfbW1fdW5wYWNraGlfZXBpMzIoZGlmZjIsIGRpZmYzKTsKKyAgX19tMTI4aSB2MDFsLCB2MzJsOworICBfX20xMjhpIHYwMWgsIHYzMmg7CisKKyAgLy8gRmlyc3QgcGFzcworICBGVHJhbnNmb3JtUGFzczFfU1NFMigmc2h1ZjAxbCwgJnNodWYyM2wsICZ2MDFsLCAmdjMybCk7CisgIEZUcmFuc2Zvcm1QYXNzMV9TU0UyKCZzaHVmMDFoLCAmc2h1ZjIzaCwgJnYwMWgsICZ2MzJoKTsKKworICAvLyBTZWNvbmQgcGFzcworICBGVHJhbnNmb3JtUGFzczJfU1NFMigmdjAxbCwgJnYzMmwsIG91dCArIDApOworICBGVHJhbnNmb3JtUGFzczJfU1NFMigmdjAxaCwgJnYzMmgsIG91dCArIDE2KTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVFJvd19TU0UyKGNvbnN0IGludDE2X3QqIGNvbnN0IGluLCBfX20xMjhpKiBjb25zdCBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSBrTXVsdCA9IF9tbV9zZXRfZXBpMTYoLTEsIDEsIC0xLCAxLCAxLCAxLCAxLCAxKTsKKyAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMCAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzEgKiAxNl0pOworICBjb25zdCBfX20xMjhpIHNyYzIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyICogMTZdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMyAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgQTAxID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzAsIHNyYzEpOyAgLy8gQTAgQTEgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBBMjMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc3JjMiwgc3JjMyk7ICAvLyBBMiBBMyB8IC4uLgorICBjb25zdCBfX20xMjhpIEIwID0gX21tX2FkZHNfZXBpMTYoQTAxLCBBMjMpOyAgICAvLyBhMCB8IGExIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fc3Vic19lcGkxNihBMDEsIEEyMyk7ICAgIC8vIGEzIHwgYTIgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGkzMihCMCwgQjEpOyAgLy8gYTAgfCBhMSB8IGEzIHwgYTIgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGkzMihCMSwgQjApOyAgLy8gYTMgfCBhMiB8IGEwIHwgYTEgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBEID0gX21tX3VucGFja2xvX2VwaTY0KEMwLCBDMSk7ICAgLy8gYTAgYTEgYTMgYTIgYTMgYTIgYTAgYTEKKyAgKm91dCA9IF9tbV9tYWRkX2VwaTE2KEQsIGtNdWx0KTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVF9TU0UyKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgLy8gSW5wdXQgaXMgMTJiIHNpZ25lZC4KKyAgX19tMTI4aSByb3cwLCByb3cxLCByb3cyLCByb3czOworICAvLyBSb3dzIGFyZSAxNGIgc2lnbmVkLgorICBGVHJhbnNmb3JtV0hUUm93X1NTRTIoaW4gKyAwICogNjQsICZyb3cwKTsKKyAgRlRyYW5zZm9ybVdIVFJvd19TU0UyKGluICsgMSAqIDY0LCAmcm93MSk7CisgIEZUcmFuc2Zvcm1XSFRSb3dfU1NFMihpbiArIDIgKiA2NCwgJnJvdzIpOworICBGVHJhbnNmb3JtV0hUUm93X1NTRTIoaW4gKyAzICogNjQsICZyb3czKTsKKworICB7CisgICAgLy8gVGhlIGEqIGFyZSAxNWIgc2lnbmVkLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTMyKHJvdzAsIHJvdzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTMyKHJvdzEsIHJvdzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTMyKHJvdzEsIHJvdzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTMyKHJvdzAsIHJvdzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTBhMyA9IF9tbV9wYWNrc19lcGkzMihhMCwgYTMpOworICAgIGNvbnN0IF9fbTEyOGkgYTFhMiA9IF9tbV9wYWNrc19lcGkzMihhMSwgYTIpOworCisgICAgLy8gVGhlIGIqIGFyZSAxNmIgc2lnbmVkLgorICAgIGNvbnN0IF9fbTEyOGkgYjBiMSA9IF9tbV9hZGRfZXBpMTYoYTBhMywgYTFhMik7CisgICAgY29uc3QgX19tMTI4aSBiM2IyID0gX21tX3N1Yl9lcGkxNihhMGEzLCBhMWEyKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF9iMmIzID0gX21tX3VucGFja2hpX2VwaTY0KGIzYjIsIGIzYjIpOworICAgIGNvbnN0IF9fbTEyOGkgYjJiMyA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXBfYjJiMywgYjNiMik7CisKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBfbW1fc3JhaV9lcGkxNihiMGIxLCAxKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgX21tX3NyYWlfZXBpMTYoYjJiMywgMSkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgorLy8gdGhlIGhpZ2hlciwgdGhlICJlYXNpZXIiIHRoZSBtYWNyb2Jsb2NrIGlzIHRvIGNvbXByZXNzLgorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX1NTRTIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmX3RocmVzaCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9DT0VGRl9USFJFU0gpOworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBpbnQgazsKKworICAgIEZUcmFuc2Zvcm1fU1NFMihyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbiAod2l0aGluIG91dFtdKS4KKyAgICB7CisgICAgICAvLyBMb2FkLgorICAgICAgY29uc3QgX19tMTI4aSBvdXQwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSk7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBvdXQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3ViX2VwaTE2KHplcm8sIG91dDEpOworICAgICAgY29uc3QgX19tMTI4aSBhYnMwID0gX21tX21heF9lcGkxNihvdXQwLCBkMCk7ICAgLy8gYWJzKHYpLCAxNmIKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMSA9IF9tbV9tYXhfZXBpMTYob3V0MSwgZDEpOworICAgICAgLy8gdiA9IGFicyhvdXQpID4+IDMKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjAgPSBfbW1fc3JhaV9lcGkxNihhYnMwLCAzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fc3JhaV9lcGkxNihhYnMxLCAzKTsKKyAgICAgIC8vIGJpbiA9IG1pbih2LCBNQVhfQ09FRkZfVEhSRVNIKQorICAgICAgY29uc3QgX19tMTI4aSBiaW4wID0gX21tX21pbl9lcGkxNih2MCwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICBjb25zdCBfX20xMjhpIGJpbjEgPSBfbW1fbWluX2VwaTE2KHYxLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIC8vIFN0b3JlLgorICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgYmluMCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBiaW4xKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCisgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKKyAgICAgICsrZGlzdHJpYnV0aW9uW291dFtrXV07CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisvLyBoZWxwZXIgZm9yIGNocm9tYS1EQyBwcmVkaWN0aW9ucworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0OHg4dXZfU1NFMih1aW50OF90IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KHYpOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB2YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDE2X1NTRTIodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWxsX1NTRTIodWludDhfdCogZHN0LCBpbnQgdmFsdWUsIGludCBzaXplKSB7CisgIGlmIChzaXplID09IDQpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIDQpOworICAgIH0KKyAgfSBlbHNlIGlmIChzaXplID09IDgpIHsKKyAgICBQdXQ4eDh1dl9TU0UyKHZhbHVlLCBkc3QpOworICB9IGVsc2UgeworICAgIFB1dDE2X1NTRTIodmFsdWUsIGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkU4dXZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB0b3BfdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTE2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB0b3BfdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWZXJ0aWNhbFByZWRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgIFZFOHV2X1NTRTIoZHN0LCB0b3ApOworICAgIH0gZWxzZSB7CisgICAgICBWRTE2X1NTRTIoZHN0LCB0b3ApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGaWxsX1NTRTIoZHN0LCAxMjcsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhFOHV2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KGxlZnRbal0pOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKWRzdCwgdmFsdWVzKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhFMTZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KGxlZnRbal0pOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSG9yaXpvbnRhbFByZWRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGludCBzaXplKSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICBIRTh1dl9TU0UyKGRzdCwgbGVmdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEhFMTZfU1NFMihkc3QsIGxlZnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGaWxsX1NTRTIoZHN0LCAxMjksIHNpemUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRNX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCB5OworICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gbGVmdFt5XSAtIGxlZnRbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlKSwgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMCA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMSA9IF9tbV91bnBhY2toaV9lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gbGVmdFt5XSAtIGxlZnRbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzAgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzApOworICAgICAgY29uc3QgX19tMTI4aSBvdXRfMSA9IF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2VfMSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYob3V0XzAsIG91dF8xKTsKKyAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwgaW50IHNpemUpIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgVE1fU1NFMihkc3QsIGxlZnQsIHRvcCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEhvcml6b250YWxQcmVkX1NTRTIoZHN0LCBsZWZ0LCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gdHJ1ZSBtb3Rpb24gd2l0aG91dCBsZWZ0IHNhbXBsZXMgKGhlbmNlOiB3aXRoIGRlZmF1bHQgMTI5IHZhbHVlKQorICAgIC8vIGlzIGVxdWl2YWxlbnQgdG8gVkUgcHJlZGljdGlvbiB3aGVyZSB5b3UganVzdCBjb3B5IHRoZSB0b3Agc2FtcGxlcy4KKyAgICAvLyBOb3RlIHRoYXQgaWYgdG9wIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgLy8gdGhlbiAxMjksIGFuZCBub3QgMTI3IGFzIGluIHRoZSBWZXJ0aWNhbFByZWQgY2FzZS4KKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIFZlcnRpY2FsUHJlZF9TU0UyKGRzdCwgdG9wLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgRmlsbF9TU0UyKGRzdCwgMTI5LCBzaXplKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgbGVmdF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKWxlZnQpOworICBjb25zdCBfX20xMjhpIGNvbWJpbmVkID0gX21tX3VucGFja2xvX2VwaTY0KHRvcF92YWx1ZXMsIGxlZnRfdmFsdWVzKTsKKyAgY29uc3QgaW50IERDID0gVlA4SG9yaXpvbnRhbEFkZDhiKCZjb21iaW5lZCkgKyA4OworICBQdXQ4eDh1dl9TU0UyKERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2Tm9MZWZ0X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9zYWRfZXB1OCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIDQ7CisgIFB1dDh4OHV2X1NTRTIoREMgPj4gMywgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXZOb1RvcF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICAvLyAnbGVmdCcgaXMgY29udGlndW91cyBzbyB3ZSBjYW4gcmV1c2UgdGhlIHRvcCBzdW1tYXRpb24uCisgIERDOHV2Tm9MZWZ0X1NTRTIoZHN0LCBsZWZ0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXZOb1RvcExlZnRfU1NFMih1aW50OF90KiBkc3QpIHsKKyAgUHV0OHg4dXZfU1NFMigweDgwLCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk1vZGVfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gdG9wIGFuZCBsZWZ0IHByZXNlbnQKKyAgICAgIERDOHV2X1NTRTIoZHN0LCBsZWZ0LCB0b3ApOworICAgIH0gZWxzZSB7ICAvLyB0b3AsIGJ1dCBubyBsZWZ0CisgICAgICBEQzh1dk5vTGVmdF9TU0UyKGRzdCwgdG9wKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAvLyBsZWZ0IGJ1dCBubyB0b3AKKyAgICBEQzh1dk5vVG9wX1NTRTIoZHN0LCBsZWZ0KTsKKyAgfSBlbHNlIHsgIC8vIG5vIHRvcCwgbm8gbGVmdCwgbm90aGluZy4KKyAgICBEQzh1dk5vVG9wTGVmdF9TU0UyKGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB0b3Bfcm93ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgbGVmdF9yb3cgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopbGVmdCk7CisgIGNvbnN0IGludCBEQyA9CisgICAgICBWUDhIb3Jpem9udGFsQWRkOGIoJnRvcF9yb3cpICsgVlA4SG9yaXpvbnRhbEFkZDhiKCZsZWZ0X3JvdykgKyAxNjsKKyAgUHV0MTZfU1NFMihEQyA+PiA1LCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2Tm9MZWZ0X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB0b3Bfcm93ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IGludCBEQyA9IFZQOEhvcml6b250YWxBZGQ4YigmdG9wX3JvdykgKyA4OworICBQdXQxNl9TU0UyKERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZOb1RvcF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICAvLyAnbGVmdCcgaXMgY29udGlndW91cyBzbyB3ZSBjYW4gcmV1c2UgdGhlIHRvcCBzdW1tYXRpb24uCisgIERDMTZOb0xlZnRfU1NFMihkc3QsIGxlZnQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2Tm9Ub3BMZWZ0X1NTRTIodWludDhfdCogZHN0KSB7CisgIFB1dDE2X1NTRTIoMHg4MCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk1vZGVfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBpZiAobGVmdCAhPSBOVUxMKSB7ICAvLyB0b3AgYW5kIGxlZnQgcHJlc2VudAorICAgICAgREMxNl9TU0UyKGRzdCwgbGVmdCwgdG9wKTsKKyAgICB9IGVsc2UgeyAgLy8gdG9wLCBidXQgbm8gbGVmdAorICAgICAgREMxNk5vTGVmdF9TU0UyKGRzdCwgdG9wKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAvLyBsZWZ0IGJ1dCBubyB0b3AKKyAgICBEQzE2Tm9Ub3BfU1NFMihkc3QsIGxlZnQpOworICB9IGVsc2UgeyAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIERDMTZOb1RvcExlZnRfU1NFMihkc3QpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQgcHJlZGljdGlvbnMKKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgOGItYXJpdGhtZXRpYyB0cmlja3M6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFDICsgYiArIDEpID4+IDEKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBjKSA+PiAxID0gWyhhICsgYyArIDEpID4+IDFdIC0gWyhhXmMpICYgMV0KKy8vIGFuZDoKKy8vICAgICAoYSArIDIgKiBiICsgYyArIDIpID4+IDIgPSAoQUIgKyBCQyArIDEpID4+IDEgLSAoYWJ8YmMpJmxzYgorLy8gICB3aGVyZTogQUMgPSAoYSArIGIgKyAxKSA+PiAxLCAgIEJDID0gKGIgKyBjICsgMSkgPj4gMQorLy8gICBhbmQgYWIgPSBhIF4gYiwgYmMgPSBiIF4gYywgbHNiID0gKEFDXkJDKSYxCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZFNF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gdmVydGljYWwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikodG9wIC0gMSkpOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSDAwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSDAwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1YnNfZXB1OChhLCBsc2IpOworICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9hdmdfZXB1OChiLCBCQ0RFRkdIMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbHMgPSBfbW1fY3Z0c2kxMjhfc2kzMihhdmcpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyBpICogQlBTLCB2YWxzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIGhvcml6b250YWwKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSikpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEksIEosIEspKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhKLCBLLCBMKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSB0b3BbaV0gKyB0b3BbLTUgKyBpXTsKKyAgRmlsbF9TU0UyKGRzdCwgZGMgPj4gMywgNCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExENF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gRG93bi1MZWZ0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0hIMCA9IF9tbV9pbnNlcnRfZXBpMTYoQ0RFRkdIMDAsIHRvcFs3XSwgMyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQ0RFRkdISDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQ0RFRkdISDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYWJjZGVmZyA9IF9tbV9hdmdfZXB1OChhdmcyLCBCQ0RFRkdIMCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkZWZnICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDIpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAzKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUjRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIFZlcnRpY2FsLVJpZ2h0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBfX20xMjhpIFhBQkNEID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikodG9wIC0gMSkpOworICBjb25zdCBfX20xMjhpIEFCQ0QwID0gX21tX3NybGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIGFiY2QgPSBfbW1fYXZnX2VwdTgoWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBfWEFCQ0QgPSBfbW1fc2xsaV9zaTEyOChYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgSVhBQkNEID0gX21tX2luc2VydF9lcGkxNihfWEFCQ0QsIEkgfCAoWCA8PCA4KSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChJWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoSVhBQkNELCBBQkNEMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBlZmdoID0gX21tX2F2Z19lcHU4KGF2ZzIsIFhBQkNEKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2QgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBlZmdoICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NsbGlfc2kxMjgoYWJjZCwgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGVmZ2gsIDEpKSk7CisKKyAgLy8gdGhlc2UgdHdvIGFyZSBoYXJkIHRvIGltcGxlbWVudCBpbiBTU0UyLCBzbyB3ZSBrZWVwIHRoZSBDLXZlcnNpb246CisgIERTVCgwLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgwLCAzKSA9IEFWRzMoSywgSiwgSSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZMNF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gVmVydGljYWwtTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSF8gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIX18gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fYXZnX2VwdTgoQ0RFRkdIX18sIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmczID0gX21tX2F2Z19lcHU4KGF2ZzEsIGF2ZzIpOworICBjb25zdCBfX20xMjhpIGxzYjEgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoYXZnMSwgYXZnMiksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYWIgPSBfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYWJiYyA9IF9tbV9vcl9zaTEyOChhYiwgYmMpOworICBjb25zdCBfX20xMjhpIGxzYjIgPSBfbW1fYW5kX3NpMTI4KGFiYmMsIGxzYjEpOworICBjb25zdCBfX20xMjhpIGF2ZzQgPSBfbW1fc3Vic19lcHU4KGF2ZzMsIGxzYjIpOworICBjb25zdCB1aW50MzJfdCBleHRyYV9vdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCA0KSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhdmcxICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnNCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzEsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBnZXQgYW5kIGlycmVndWxhcgorICBEU1QoMywgMikgPSAoZXh0cmFfb3V0ID4+IDApICYgMHhmZjsKKyAgRFNUKDMsIDMpID0gKGV4dHJhX291dCA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJENF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gRG93bi1yaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSh0b3AgLSA1KSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkNEID0gX21tX2luc2VydF9lcGkxNihMS0pJWEFCQywgdG9wWzNdLCA0KTsKKyAgY29uc3QgX19tMTI4aSBLSklYQUJDRF8gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIEpJWEFCQ0RfXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChKSVhBQkNEX18sIExLSklYQUJDRCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgS0pJWEFCQ0RfKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhVNF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihJLCBKKTsKKyAgRFNUKDIsIDApID0gRFNUKDAsIDEpID0gQVZHMihKLCBLKTsKKyAgRFNUKDIsIDEpID0gRFNUKDAsIDIpID0gQVZHMihLLCBMKTsKKyAgRFNUKDEsIDApID0gICAgICAgICAgICAgQVZHMyhJLCBKLCBLKTsKKyAgRFNUKDMsIDApID0gRFNUKDEsIDEpID0gQVZHMyhKLCBLLCBMKTsKKyAgRFNUKDMsIDEpID0gRFNUKDEsIDIpID0gQVZHMyhLLCBMLCBMKTsKKyAgRFNUKDMsIDIpID0gRFNUKDIsIDIpID0KKyAgRFNUKDAsIDMpID0gRFNUKDEsIDMpID0gRFNUKDIsIDMpID0gRFNUKDMsIDMpID0gTDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEQ0X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisKKyAgRFNUKDAsIDApID0gRFNUKDIsIDEpID0gQVZHMihJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDIsIDIpID0gQVZHMihKLCBJKTsKKyAgRFNUKDAsIDIpID0gRFNUKDIsIDMpID0gQVZHMihLLCBKKTsKKyAgRFNUKDAsIDMpICAgICAgICAgICAgID0gQVZHMihMLCBLKTsKKworICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMiwgMCkgICAgICAgICAgICAgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMywgMSkgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMywgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMSwgMikgPSBEU1QoMywgMykgPSBBVkczKEssIEosIEkpOworICBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEwsIEssIEopOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUTTRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIodG9wKSk7CisgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICBjb25zdCBpbnQgdmFsID0gdG9wWy0yIC0geV0gLSB0b3BbLTFdOworICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0LCBfbW1fY3Z0c2kxMjhfc2kzMihvdXQpKTsKKyAgfQorfQorCisjdW5kZWYgRFNUCisjdW5kZWYgQVZHMworI3VuZGVmIEFWRzIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGx1bWEgNHg0IHByZWRpY3Rpb24KKworLy8gTGVmdCBzYW1wbGVzIGFyZSB0b3BbLTUgLi4gLTJdLCB0b3BfbGVmdCBpcyB0b3BbLTFdLCB0b3AgYXJlCisvLyBsb2NhdGVkIGF0IHRvcFswLi4zXSwgYW5kIHRvcCByaWdodCBpcyB0b3BbNC4uN10KK3N0YXRpYyB2b2lkIEludHJhNFByZWRzX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREM0X1NTRTIoSTREQzQgKyBkc3QsIHRvcCk7CisgIFRNNF9TU0UyKEk0VE00ICsgZHN0LCB0b3ApOworICBWRTRfU1NFMihJNFZFNCArIGRzdCwgdG9wKTsKKyAgSEU0X1NTRTIoSTRIRTQgKyBkc3QsIHRvcCk7CisgIFJENF9TU0UyKEk0UkQ0ICsgZHN0LCB0b3ApOworICBWUjRfU1NFMihJNFZSNCArIGRzdCwgdG9wKTsKKyAgTEQ0X1NTRTIoSTRMRDQgKyBkc3QsIHRvcCk7CisgIFZMNF9TU0UyKEk0Vkw0ICsgZHN0LCB0b3ApOworICBIRDRfU1NFMihJNEhENCArIGRzdCwgdG9wKTsKKyAgSFU0X1NTRTIoSTRIVTQgKyBkc3QsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEgOHg4IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4yKQorCitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVByZWRzX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICAvLyBVIGJsb2NrCisgIERDOHV2TW9kZV9TU0UyKEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWRfU1NFMihDOFZFOCArIGRzdCwgdG9wLCA4KTsKKyAgSG9yaXpvbnRhbFByZWRfU1NFMihDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb25fU1NFMihDOFRNOCArIGRzdCwgbGVmdCwgdG9wLCA4KTsKKyAgLy8gViBibG9jaworICBkc3QgKz0gODsKKyAgaWYgKHRvcCAhPSBOVUxMKSB0b3AgKz0gODsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgbGVmdCArPSAxNjsKKyAgREM4dXZNb2RlX1NTRTIoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZF9TU0UyKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZF9TU0UyKEM4SEU4ICsgZHN0LCBsZWZ0LCA4KTsKKyAgVHJ1ZU1vdGlvbl9TU0UyKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbHVtYSAxNngxNiBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMykKKworc3RhdGljIHZvaWQgSW50cmExNlByZWRzX1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDMTZNb2RlX1NTRTIoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkX1NTRTIoSTE2VkUxNiArIGRzdCwgdG9wLCAxNik7CisgIEhvcml6b250YWxQcmVkX1NTRTIoSTE2SEUxNiArIGRzdCwgbGVmdCwgMTYpOworICBUcnVlTW90aW9uX1NTRTIoSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wLCAxNik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRyaWMKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3VidHJhY3RBbmRBY2N1bXVsYXRlX1NTRTIoY29uc3QgX19tMTI4aSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgc3VtKSB7CisgIC8vIHRha2UgYWJzKGEtYikgaW4gOGIKKyAgY29uc3QgX19tMTI4aSBhX2IgPSBfbW1fc3Vic19lcHU4KGEsIGIpOworICBjb25zdCBfX20xMjhpIGJfYSA9IF9tbV9zdWJzX2VwdTgoYiwgYSk7CisgIGNvbnN0IF9fbTEyOGkgYWJzX2FfYiA9IF9tbV9vcl9zaTEyOChhX2IsIGJfYSk7CisgIC8vIHplcm8tZXh0ZW5kIHRvIDE2YgorICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoYWJzX2FfYiwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNraGlfZXBpOChhYnNfYV9iLCB6ZXJvKTsKKyAgLy8gbXVsdGlwbHkgd2l0aCBzZWxmCisgIGNvbnN0IF9fbTEyOGkgc3VtMSA9IF9tbV9tYWRkX2VwaTE2KEMwLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgc3VtMiA9IF9tbV9tYWRkX2VwaTE2KEMxLCBDMSk7CisgICpzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bTEsIHN1bTIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFNTRV8xNnhOX1NTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhaXJzKSB7CisgIF9fbTEyOGkgc3VtID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgaW50MzJfdCB0bXBbNF07CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFpcnM7ICsraSkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDFdKTsKKyAgICBfX20xMjhpIHN1bTEsIHN1bTI7CisgICAgU3VidHJhY3RBbmRBY2N1bXVsYXRlX1NTRTIoYTAsIGIwLCAmc3VtMSk7CisgICAgU3VidHJhY3RBbmRBY2N1bXVsYXRlX1NTRTIoYTEsIGIxLCAmc3VtMik7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIF9tbV9hZGRfZXBpMzIoc3VtMSwgc3VtMikpOworICAgIGEgKz0gMiAqIEJQUzsKKyAgICBiICs9IDIgKiBCUFM7CisgIH0KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICByZXR1cm4gKHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXSk7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfU1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBTU0VfMTZ4Tl9TU0UyKGEsIGIsIDgpOworfQorCitzdGF0aWMgaW50IFNTRTE2eDhfU1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBTU0VfMTZ4Tl9TU0UyKGEsIGIsIDQpOworfQorCisjZGVmaW5lIExPQURfOHgxNmIocHRyKSBcCisgIF9tbV91bnBhY2tsb19lcGk4KF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHB0cikpLCB6ZXJvKQorCitzdGF0aWMgaW50IFNTRTh4OF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgaW50IG51bV9wYWlycyA9IDQ7CisgIF9fbTEyOGkgc3VtID0gemVybzsKKyAgaW50MzJfdCB0bXBbNF07CisgIHdoaWxlIChudW1fcGFpcnMtLSA+IDApIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gTE9BRF84eDE2YigmYVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IExPQURfOHgxNmIoJmFbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBMT0FEXzh4MTZiKCZiW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gTE9BRF84eDE2YigmYltCUFMgKiAxXSk7CisgICAgLy8gc3VidHJhY3QKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX3N1YnNfZXBpMTYoYTAsIGIwKTsKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX3N1YnNfZXBpMTYoYTEsIGIxKTsKKyAgICAvLyBtdWx0aXBseS9hY2N1bXVsYXRlIHdpdGggc2VsZgorICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fbWFkZF9lcGkxNihjMCwgYzApOworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbWFkZF9lcGkxNihjMSwgYzEpOworICAgIC8vIGNvbGxlY3QKKyAgICBjb25zdCBfX20xMjhpIHN1bTAxID0gX21tX2FkZF9lcGkzMihkMCwgZDEpOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBzdW0wMSk7CisgICAgYSArPSAyICogQlBTOworICAgIGIgKz0gMiAqIEJQUzsKKyAgfQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKK30KKyN1bmRlZiBMT0FEXzh4MTZiCisKK3N0YXRpYyBpbnQgU1NFNHg0X1NTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworCisgIC8vIExvYWQgdmFsdWVzLiBOb3RlIHRoYXQgd2UgcmVhZCA4IHBpeGVscyBpbnN0ZWFkIG9mIDQsCisgIC8vIGJ1dCB0aGUgYS9iIGJ1ZmZlcnMgYXJlIG92ZXItYWxsb2NhdGVkIHRvIHRoYXQgZWZmZWN0LgorICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAwXSk7CisgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDFdKTsKKyAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMl0pOworICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAzXSk7CisgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDBdKTsKKyAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMV0pOworICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAyXSk7CisgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDNdKTsKKyAgLy8gQ29tYmluZSBwYWlyIG9mIGxpbmVzLgorICBjb25zdCBfX20xMjhpIGEwMSA9IF9tbV91bnBhY2tsb19lcGkzMihhMCwgYTEpOworICBjb25zdCBfX20xMjhpIGEyMyA9IF9tbV91bnBhY2tsb19lcGkzMihhMiwgYTMpOworICBjb25zdCBfX20xMjhpIGIwMSA9IF9tbV91bnBhY2tsb19lcGkzMihiMCwgYjEpOworICBjb25zdCBfX20xMjhpIGIyMyA9IF9tbV91bnBhY2tsb19lcGkzMihiMiwgYjMpOworICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgY29uc3QgX19tMTI4aSBhMDFzID0gX21tX3VucGFja2xvX2VwaTgoYTAxLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBhMjNzID0gX21tX3VucGFja2xvX2VwaTgoYTIzLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBiMDFzID0gX21tX3VucGFja2xvX2VwaTgoYjAxLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBiMjNzID0gX21tX3VucGFja2xvX2VwaTgoYjIzLCB6ZXJvKTsKKyAgLy8gc3VidHJhY3QsIHNxdWFyZSBhbmQgYWNjdW11bGF0ZQorICBjb25zdCBfX20xMjhpIGQwID0gX21tX3N1YnNfZXBpMTYoYTAxcywgYjAxcyk7CisgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3Vic19lcGkxNihhMjNzLCBiMjNzKTsKKyAgY29uc3QgX19tMTI4aSBlMCA9IF9tbV9tYWRkX2VwaTE2KGQwLCBkMCk7CisgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fbWFkZF9lcGkxNihkMSwgZDEpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMzIoZTAsIGUxKTsKKworICBpbnQzMl90IHRtcFs0XTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICByZXR1cm4gKHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIE1lYW4xNng0X1NTRTIoY29uc3QgdWludDhfdCogcmVmLCB1aW50MzJfdCBkY1s0XSkgeworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweDAwZmYpOworICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVmW0JQUyAqIDBdKTsKKyAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlZltCUFMgKiAxXSk7CisgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZWZbQlBTICogMl0pOworICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVmW0JQUyAqIDNdKTsKKyAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9zcmxpX2VwaTE2KGEwLCA4KTsgICAgIC8vIGhpIGJ5dGUKKyAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9zcmxpX2VwaTE2KGExLCA4KTsKKyAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zcmxpX2VwaTE2KGEyLCA4KTsKKyAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zcmxpX2VwaTE2KGEzLCA4KTsKKyAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9hbmRfc2kxMjgoYTAsIG1hc2spOyAgIC8vIGxvIGJ5dGUKKyAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9hbmRfc2kxMjgoYTEsIG1hc2spOworICBjb25zdCBfX20xMjhpIGMyID0gX21tX2FuZF9zaTEyOChhMiwgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fYW5kX3NpMTI4KGEzLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9hZGRfZXBpMzIoYjAsIGMwKTsKKyAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9hZGRfZXBpMzIoYjEsIGMxKTsKKyAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9hZGRfZXBpMzIoYjIsIGMyKTsKKyAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMzIoYjMsIGMzKTsKKyAgY29uc3QgX19tMTI4aSBlMCA9IF9tbV9hZGRfZXBpMzIoZDAsIGQxKTsKKyAgY29uc3QgX19tMTI4aSBlMSA9IF9tbV9hZGRfZXBpMzIoZDIsIGQzKTsKKyAgY29uc3QgX19tMTI4aSBmMCA9IF9tbV9hZGRfZXBpMzIoZTAsIGUxKTsKKyAgdWludDE2X3QgdG1wWzhdOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIGYwKTsKKyAgZGNbMF0gPSB0bXBbMF0gKyB0bXBbMV07CisgIGRjWzFdID0gdG1wWzJdICsgdG1wWzNdOworICBkY1syXSA9IHRtcFs0XSArIHRtcFs1XTsKKyAgZGNbM10gPSB0bXBbNl0gKyB0bXBbN107Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0dXJlIGRpc3RvcnRpb24KKy8vCisvLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKKy8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KKworLy8gSGFkYW1hcmQgdHJhbnNmb3JtCisvLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KKy8vIHdbXSBjb250YWlucyBhIHJvdy1tYWpvciA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KK3N0YXRpYyBpbnQgVFRyYW5zZm9ybV9TU0UyKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50MzJfdCBzdW1bNF07CisgIF9fbTEyOGkgdG1wXzAsIHRtcF8xLCB0bXBfMiwgdG1wXzM7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisKKyAgLy8gTG9hZCBhbmQgY29tYmluZSBpbnB1dHMuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIGluQV8wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQV8xID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQV8yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDJdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQV8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDNdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8xID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDJdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDNdKTsKKworICAgIC8vIENvbWJpbmUgaW5BIGFuZCBpbkIgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4KKyAgICBjb25zdCBfX20xMjhpIGluQUJfMCA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMCwgaW5CXzApOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8xID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8xLCBpbkJfMSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzIsIGluQl8yKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMyA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMywgaW5CXzMpOworICAgIHRtcF8wID0gX21tX3VucGFja2xvX2VwaTgoaW5BQl8wLCB6ZXJvKTsKKyAgICB0bXBfMSA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMSwgemVybyk7CisgICAgdG1wXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzIsIHplcm8pOworICAgIHRtcF8zID0gX21tX3VucGFja2xvX2VwaTgoaW5BQl8zLCB6ZXJvKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgZmlyc3QgdG8gYXZvaWQgYSB0cmFuc3Bvc2UgKHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcworICAvLyBhcmUgY29tbXV0YXRpdmUgYmVjYXVzZSB3L2tXZWlnaHRZIGlzIHN5bW1ldHJpYykgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJmIwLCAmYjEsICZiMiwgJmIzLCAmdG1wXzAsICZ0bXBfMSwgJnRtcF8yLCAmdG1wXzMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMuCisgIHsKKyAgICAvLyBMb2FkIGFsbCBpbnB1dHMuCisgICAgY29uc3QgX19tMTI4aSB3XzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzBdKTsKKyAgICBjb25zdCBfX20xMjhpIHdfOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJndbOF0pOworCisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworCisgICAgLy8gU2VwYXJhdGUgdGhlIHRyYW5zZm9ybXMgb2YgaW5BIGFuZCBpbkIuCisgICAgX19tMTI4aSBBX2IwID0gX21tX3VucGFja2xvX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBBX2IyID0gX21tX3VucGFja2xvX2VwaTY0KGIyLCBiMyk7CisgICAgX19tMTI4aSBCX2IwID0gX21tX3VucGFja2hpX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBCX2IyID0gX21tX3VucGFja2hpX2VwaTY0KGIyLCBiMyk7CisKKyAgICB7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBBX2IwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3ViX2VwaTE2KHplcm8sIEFfYjIpOworICAgICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9zdWJfZXBpMTYoemVybywgQl9iMCk7CisgICAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBCX2IyKTsKKyAgICAgIEFfYjAgPSBfbW1fbWF4X2VwaTE2KEFfYjAsIGQwKTsgICAvLyBhYnModiksIDE2YgorICAgICAgQV9iMiA9IF9tbV9tYXhfZXBpMTYoQV9iMiwgZDEpOworICAgICAgQl9iMCA9IF9tbV9tYXhfZXBpMTYoQl9iMCwgZDIpOworICAgICAgQl9iMiA9IF9tbV9tYXhfZXBpMTYoQl9iMiwgZDMpOworICAgIH0KKworICAgIC8vIHdlaWdodGVkIHN1bXMKKyAgICBBX2IwID0gX21tX21hZGRfZXBpMTYoQV9iMCwgd18wKTsKKyAgICBBX2IyID0gX21tX21hZGRfZXBpMTYoQV9iMiwgd184KTsKKyAgICBCX2IwID0gX21tX21hZGRfZXBpMTYoQl9iMCwgd18wKTsKKyAgICBCX2IyID0gX21tX21hZGRfZXBpMTYoQl9iMiwgd184KTsKKyAgICBBX2IwID0gX21tX2FkZF9lcGkzMihBX2IwLCBBX2IyKTsKKyAgICBCX2IwID0gX21tX2FkZF9lcGkzMihCX2IwLCBCX2IyKTsKKworICAgIC8vIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3VtcworICAgIEFfYjAgPSBfbW1fc3ViX2VwaTMyKEFfYjAsIEJfYjApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZzdW1bMF0sIEFfYjApOworICB9CisgIHJldHVybiBzdW1bMF0gKyBzdW1bMV0gKyBzdW1bMl0gKyBzdW1bM107Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDRfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGNvbnN0IGludCBkaWZmX3N1bSA9IFRUcmFuc2Zvcm1fU1NFMihhLCBiLCB3KTsKKyAgcmV0dXJuIGFicyhkaWZmX3N1bSkgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2X1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfU1NFMihhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisvLworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IERvUXVhbnRpemVCbG9ja19TU0UyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl8yMDQ3ID0gX21tX3NldDFfZXBpMTYoTUFYX0xFVkVMKTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgX19tMTI4aSBjb2VmZjAsIGNvZWZmODsKKyAgX19tMTI4aSBvdXQwLCBvdXQ4OworICBfX20xMjhpIHBhY2tlZF9vdXQ7CisKKyAgLy8gTG9hZCBhbGwgaW5wdXRzLgorICBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzBdKTsKKyAgX19tMTI4aSBpbjggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSk7CisgIGNvbnN0IF9fbTEyOGkgaXEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5pcV9bMF0pOworICBjb25zdCBfX20xMjhpIGlxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzhdKTsKKyAgY29uc3QgX19tMTI4aSBxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bMF0pOworICBjb25zdCBfX20xMjhpIHE4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5xX1s4XSk7CisKKyAgLy8gZXh0cmFjdCBzaWduKGluKSAgKDB4MDAwMCBpZiBwb3NpdGl2ZSwgMHhmZmZmIGlmIG5lZ2F0aXZlKQorICBjb25zdCBfX20xMjhpIHNpZ24wID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIGluMCk7CisgIGNvbnN0IF9fbTEyOGkgc2lnbjggPSBfbW1fY21wZ3RfZXBpMTYoemVybywgaW44KTsKKworICAvLyBjb2VmZiA9IGFicyhpbikgPSAoaW4gXiBzaWduKSAtIHNpZ24KKyAgY29lZmYwID0gX21tX3hvcl9zaTEyOChpbjAsIHNpZ24wKTsKKyAgY29lZmY4ID0gX21tX3hvcl9zaTEyOChpbjgsIHNpZ244KTsKKyAgY29lZmYwID0gX21tX3N1Yl9lcGkxNihjb2VmZjAsIHNpZ24wKTsKKyAgY29lZmY4ID0gX21tX3N1Yl9lcGkxNihjb2VmZjgsIHNpZ244KTsKKworICAvLyBjb2VmZiA9IGFicyhpbikgKyBzaGFycGVuCisgIGlmIChzaGFycGVuICE9IE5VTEwpIHsKKyAgICBjb25zdCBfX20xMjhpIHNoYXJwZW4wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc2hhcnBlblswXSk7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bOF0pOworICAgIGNvZWZmMCA9IF9tbV9hZGRfZXBpMTYoY29lZmYwLCBzaGFycGVuMCk7CisgICAgY29lZmY4ID0gX21tX2FkZF9lcGkxNihjb2VmZjgsIHNoYXJwZW44KTsKKyAgfQorCisgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikgPj4gUUZJWAorICB7CisgICAgLy8gZG9pbmcgY2FsY3VsYXRpb25zIHdpdGggMzJiIHByZWNpc2lvbiAoUUZJWD0xNykKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSkKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVEwTCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjAsIGlxMCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThIID0gX21tX211bGhpX2VwdTE2KGNvZWZmOCwgaXE4KTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lROEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmY4LCBpcTgpOworICAgIF9fbTEyOGkgb3V0XzAwID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOworICAgIF9fbTEyOGkgb3V0XzA0ID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOworICAgIF9fbTEyOGkgb3V0XzA4ID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOworICAgIF9fbTEyOGkgb3V0XzEyID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOworICAgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzBdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzRdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzhdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzEyXSk7CisgICAgb3V0XzAwID0gX21tX2FkZF9lcGkzMihvdXRfMDAsIGJpYXNfMDApOworICAgIG91dF8wNCA9IF9tbV9hZGRfZXBpMzIob3V0XzA0LCBiaWFzXzA0KTsKKyAgICBvdXRfMDggPSBfbW1fYWRkX2VwaTMyKG91dF8wOCwgYmlhc18wOCk7CisgICAgb3V0XzEyID0gX21tX2FkZF9lcGkzMihvdXRfMTIsIGJpYXNfMTIpOworICAgIC8vIG91dCA9IFFVQU5URElWKGNvZWZmLCBpUSwgQiwgUUZJWCkKKyAgICBvdXRfMDAgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDAsIFFGSVgpOworICAgIG91dF8wNCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wNCwgUUZJWCk7CisgICAgb3V0XzA4ID0gX21tX3NyYWlfZXBpMzIob3V0XzA4LCBRRklYKTsKKyAgICBvdXRfMTIgPSBfbW1fc3JhaV9lcGkzMihvdXRfMTIsIFFGSVgpOworCisgICAgLy8gcGFjayByZXN1bHQgYXMgMTZiCisgICAgb3V0MCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDAsIG91dF8wNCk7CisgICAgb3V0OCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDgsIG91dF8xMik7CisKKyAgICAvLyBpZiAoY29lZmYgPiAyMDQ3KSBjb2VmZiA9IDIwNDcKKyAgICBvdXQwID0gX21tX21pbl9lcGkxNihvdXQwLCBtYXhfY29lZmZfMjA0Nyk7CisgICAgb3V0OCA9IF9tbV9taW5fZXBpMTYob3V0OCwgbWF4X2NvZWZmXzIwNDcpOworICB9CisKKyAgLy8gZ2V0IHNpZ24gYmFjayAoaWYgKHNpZ25bal0pIG91dF9uID0gLW91dF9uKQorICBvdXQwID0gX21tX3hvcl9zaTEyOChvdXQwLCBzaWduMCk7CisgIG91dDggPSBfbW1feG9yX3NpMTI4KG91dDgsIHNpZ244KTsKKyAgb3V0MCA9IF9tbV9zdWJfZXBpMTYob3V0MCwgc2lnbjApOworICBvdXQ4ID0gX21tX3N1Yl9lcGkxNihvdXQ4LCBzaWduOCk7CisKKyAgLy8gaW4gPSBvdXQgKiBRCisgIGluMCA9IF9tbV9tdWxsb19lcGkxNihvdXQwLCBxMCk7CisgIGluOCA9IF9tbV9tdWxsb19lcGkxNihvdXQ4LCBxOCk7CisKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzBdLCBpbjApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmaW5bOF0sIGluOCk7CisKKyAgLy8gemlnemFnIHRoZSBvdXRwdXQgYmVmb3JlIHN0b3JpbmcgaXQuCisgIC8vCisgIC8vIFRoZSB6aWd6YWcgcGF0dGVybiBjYW4gYWxtb3N0IGJlIHJlcHJvZHVjZWQgd2l0aCBhIHNtYWxsIHNlcXVlbmNlIG9mCisgIC8vIHNodWZmbGVzLiBBZnRlciBpdCwgd2Ugb25seSBuZWVkIHRvIHN3YXAgdGhlIDd0aCAoZW5kaW5nIHVwIGluIHRoaXJkCisgIC8vIHBvc2l0aW9uIGluc3RlYWQgb2YgdHdlbGZ0aCkgYW5kIDh0aCB2YWx1ZXMuCisgIHsKKyAgICBfX20xMjhpIG91dFowLCBvdXRaODsKKyAgICBvdXRaMCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYob3V0MCwgIF9NTV9TSFVGRkxFKDIsIDEsIDMsIDApKTsKKyAgICBvdXRaMCA9IF9tbV9zaHVmZmxlX2VwaTMyICAob3V0WjAsIF9NTV9TSFVGRkxFKDMsIDEsIDIsIDApKTsKKyAgICBvdXRaMCA9IF9tbV9zaHVmZmxlaGlfZXBpMTYob3V0WjAsIF9NTV9TSFVGRkxFKDMsIDEsIDAsIDIpKTsKKyAgICBvdXRaOCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYob3V0OCwgIF9NTV9TSFVGRkxFKDMsIDAsIDIsIDEpKTsKKyAgICBvdXRaOCA9IF9tbV9zaHVmZmxlX2VwaTMyICAob3V0WjgsIF9NTV9TSFVGRkxFKDMsIDEsIDIsIDApKTsKKyAgICBvdXRaOCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYob3V0WjgsIF9NTV9TSFVGRkxFKDEsIDMsIDIsIDApKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBvdXRaMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgb3V0WjgpOworICAgIHBhY2tlZF9vdXQgPSBfbW1fcGFja3NfZXBpMTYob3V0WjAsIG91dFo4KTsKKyAgfQorICB7CisgICAgY29uc3QgaW50MTZfdCBvdXRaXzEyID0gb3V0WzEyXTsKKyAgICBjb25zdCBpbnQxNl90IG91dFpfMyA9IG91dFszXTsKKyAgICBvdXRbM10gPSBvdXRaXzEyOworICAgIG91dFsxMl0gPSBvdXRaXzM7CisgIH0KKworICAvLyBkZXRlY3QgaWYgYWxsICdvdXQnIHZhbHVlcyBhcmUgemVyb2VzIG9yIG5vdAorICByZXR1cm4gKF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KHBhY2tlZF9vdXQsIHplcm8pKSAhPSAweGZmZmYpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfU1NFMihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9ja19TU0UyKGluLCBvdXQsICZtdHgtPnNoYXJwZW5fWzBdLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tXSFRfU1NFMihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9ja19TU0UyKGluLCBvdXQsIE5VTEwsIG10eCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX1NTRTIoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBueiAgPSBEb1F1YW50aXplQmxvY2tfU1NFMihpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBzaGFycGVuLCBtdHgpIDw8IDA7CisgIG56IHw9IERvUXVhbnRpemVCbG9ja19TU0UyKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIHNoYXJwZW4sIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtX1NTRTI7CisgIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHNfU1NFMjsKKyAgVlA4RW5jUHJlZENocm9tYTggPSBJbnRyYUNocm9tYVByZWRzX1NTRTI7CisgIFZQOEVuY1ByZWRMdW1hNCA9IEludHJhNFByZWRzX1NTRTI7CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX1NTRTI7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19TU0UyOworICBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUID0gUXVhbnRpemVCbG9ja1dIVF9TU0UyOworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9TU0UyOworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9TU0UyOworICBWUDhGVHJhbnNmb3JtMiA9IEZUcmFuc2Zvcm0yX1NTRTI7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX1NTRTI7CisgIFZQOFNTRTE2eDE2ID0gU1NFMTZ4MTZfU1NFMjsKKyAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhfU1NFMjsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4X1NTRTI7CisgIFZQOFNTRTR4NCA9IFNTRTR4NF9TU0UyOworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9TU0UyOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfU1NFMjsKKyAgVlA4TWVhbjE2eDQgPSBNZWFuMTZ4NF9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGUyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2U0MS5jCkBAIC0wLDAgKzEsMzQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNCB2ZXJzaW9uIG9mIHNvbWUgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zLgorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmX3RocmVzaCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9DT0VGRl9USFJFU0gpOworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBpbnQgazsKKworICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4gKHdpdGhpbiBvdXRbXSkuCisgICAgeworICAgICAgLy8gTG9hZC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFswXSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0pOworICAgICAgLy8gdiA9IGFicyhvdXQpID4+IDMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMCA9IF9tbV9hYnNfZXBpMTYob3V0MCk7CisgICAgICBjb25zdCBfX20xMjhpIGFiczEgPSBfbW1fYWJzX2VwaTE2KG91dDEpOworICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9zcmFpX2VwaTE2KGFiczAsIDMpOworICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV9zcmFpX2VwaTE2KGFiczEsIDMpOworICAgICAgLy8gYmluID0gbWluKHYsIE1BWF9DT0VGRl9USFJFU0gpCisgICAgICBjb25zdCBfX20xMjhpIGJpbjAgPSBfbW1fbWluX2VwaTE2KHYwLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmluMSA9IF9tbV9taW5fZXBpMTYodjEsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgLy8gU3RvcmUuCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBiaW4wKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGJpbjEpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgICAgKytkaXN0cmlidXRpb25bb3V0W2tdXTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHR1cmUgZGlzdG9ydGlvbgorLy8KKy8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAorLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgorCisvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KKy8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgorc3RhdGljIGludCBUVHJhbnNmb3JtX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludDMyX3Qgc3VtWzRdOworICBfX20xMjhpIHRtcF8wLCB0bXBfMSwgdG1wXzIsIHRtcF8zOworCisgIC8vIExvYWQgYW5kIGNvbWJpbmUgaW5wdXRzLgorICB7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAyXSk7CisgICAgLy8gSW4gU1NFNC4xLCB3aXRoIGdjYyA0LjggYXQgbGVhc3QgKG1heWJlIG90aGVyIHZlcnNpb25zKSwKKyAgICAvLyBfbW1fbG9hZHVfc2kxMjggaXMgZmFzdGVyIHRoYW4gX21tX2xvYWRsX2VwaTY0LiBCdXQgZm9yIHRoZSBsYXN0IGx1bXAKKyAgICAvLyBvZiBpbkEgYW5kIGluQiwgX21tX2xvYWRsX2VwaTY0IGlzIHN0aWxsIHVzZWQgbm90IHRvIGhhdmUgYW4gb3V0IG9mCisgICAgLy8gYm91bmQgcmVhZC4KKyAgICBjb25zdCBfX20xMjhpIGluQV8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDNdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8xID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8yID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDJdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDNdKTsKKworICAgIC8vIENvbWJpbmUgaW5BIGFuZCBpbkIgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4KKyAgICBjb25zdCBfX20xMjhpIGluQUJfMCA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMCwgaW5CXzApOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8xID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8xLCBpbkJfMSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzIsIGluQl8yKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMyA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMywgaW5CXzMpOworICAgIHRtcF8wID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8wKTsKKyAgICB0bXBfMSA9IF9tbV9jdnRlcHU4X2VwaTE2KGluQUJfMSk7CisgICAgdG1wXzIgPSBfbW1fY3Z0ZXB1OF9lcGkxNihpbkFCXzIpOworICAgIHRtcF8zID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8zKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgZmlyc3QgdG8gYXZvaWQgYSB0cmFuc3Bvc2UgKHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcworICAvLyBhcmUgY29tbXV0YXRpdmUgYmVjYXVzZSB3L2tXZWlnaHRZIGlzIHN5bW1ldHJpYykgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJmIwLCAmYjEsICZiMiwgJmIzLCAmdG1wXzAsICZ0bXBfMSwgJnRtcF8yLCAmdG1wXzMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMuCisgIHsKKyAgICAvLyBMb2FkIGFsbCBpbnB1dHMuCisgICAgY29uc3QgX19tMTI4aSB3XzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzBdKTsKKyAgICBjb25zdCBfX20xMjhpIHdfOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJndbOF0pOworCisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworCisgICAgLy8gU2VwYXJhdGUgdGhlIHRyYW5zZm9ybXMgb2YgaW5BIGFuZCBpbkIuCisgICAgX19tMTI4aSBBX2IwID0gX21tX3VucGFja2xvX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBBX2IyID0gX21tX3VucGFja2xvX2VwaTY0KGIyLCBiMyk7CisgICAgX19tMTI4aSBCX2IwID0gX21tX3VucGFja2hpX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBCX2IyID0gX21tX3VucGFja2hpX2VwaTY0KGIyLCBiMyk7CisKKyAgICBBX2IwID0gX21tX2Fic19lcGkxNihBX2IwKTsKKyAgICBBX2IyID0gX21tX2Fic19lcGkxNihBX2IyKTsKKyAgICBCX2IwID0gX21tX2Fic19lcGkxNihCX2IwKTsKKyAgICBCX2IyID0gX21tX2Fic19lcGkxNihCX2IyKTsKKworICAgIC8vIHdlaWdodGVkIHN1bXMKKyAgICBBX2IwID0gX21tX21hZGRfZXBpMTYoQV9iMCwgd18wKTsKKyAgICBBX2IyID0gX21tX21hZGRfZXBpMTYoQV9iMiwgd184KTsKKyAgICBCX2IwID0gX21tX21hZGRfZXBpMTYoQl9iMCwgd18wKTsKKyAgICBCX2IyID0gX21tX21hZGRfZXBpMTYoQl9iMiwgd184KTsKKyAgICBBX2IwID0gX21tX2FkZF9lcGkzMihBX2IwLCBBX2IyKTsKKyAgICBCX2IwID0gX21tX2FkZF9lcGkzMihCX2IwLCBCX2IyKTsKKworICAgIC8vIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3VtcworICAgIEFfYjIgPSBfbW1fc3ViX2VwaTMyKEFfYjAsIEJfYjApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZzdW1bMF0sIEFfYjIpOworICB9CisgIHJldHVybiBzdW1bMF0gKyBzdW1bMV0gKyBzdW1bMl0gKyBzdW1bM107Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDRfU1NFNDEoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgY29uc3QgaW50IGRpZmZfc3VtID0gVFRyYW5zZm9ybV9TU0U0MShhLCBiLCB3KTsKKyAgcmV0dXJuIGFicyhkaWZmX3N1bSkgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9TU0U0MShhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisvLworCisvLyBHZW5lcmF0ZXMgYSBwc2h1ZmIgY29uc3RhbnQgZm9yIHNodWZmbGluZyAxNmIgd29yZHMuCisjZGVmaW5lIFBTSFVGQl9DU1QoQSxCLEMsRCxFLEYsRyxIKSBcCisgIF9tbV9zZXRfZXBpOCgyICogKEgpICsgMSwgMiAqIChIKSArIDAsIDIgKiAoRykgKyAxLCAyICogKEcpICsgMCwgXAorICAgICAgICAgICAgICAgMiAqIChGKSArIDEsIDIgKiAoRikgKyAwLCAyICogKEUpICsgMSwgMiAqIChFKSArIDAsIFwKKyAgICAgICAgICAgICAgIDIgKiAoRCkgKyAxLCAyICogKEQpICsgMCwgMiAqIChDKSArIDEsIDIgKiAoQykgKyAwLCBcCisgICAgICAgICAgICAgICAyICogKEIpICsgMSwgMiAqIChCKSArIDAsIDIgKiAoQSkgKyAxLCAyICogKEEpICsgMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBEb1F1YW50aXplQmxvY2tfU1NFNDEoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfMjA0NyA9IF9tbV9zZXQxX2VwaTE2KE1BWF9MRVZFTCk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgb3V0MCwgb3V0ODsKKyAgX19tMTI4aSBwYWNrZWRfb3V0OworCisgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSk7CisgIF9fbTEyOGkgaW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bOF0pOworICBjb25zdCBfX20xMjhpIGlxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBpcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1s4XSk7CisgIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bOF0pOworCisgIC8vIGNvZWZmID0gYWJzKGluKQorICBfX20xMjhpIGNvZWZmMCA9IF9tbV9hYnNfZXBpMTYoaW4wKTsKKyAgX19tMTI4aSBjb2VmZjggPSBfbW1fYWJzX2VwaTE2KGluOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pICsgc2hhcnBlbgorICBpZiAoc2hhcnBlbiAhPSBOVUxMKSB7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzhdKTsKKyAgICBjb2VmZjAgPSBfbW1fYWRkX2VwaTE2KGNvZWZmMCwgc2hhcnBlbjApOworICAgIGNvZWZmOCA9IF9tbV9hZGRfZXBpMTYoY29lZmY4LCBzaGFycGVuOCk7CisgIH0KKworICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVgKKyAgeworICAgIC8vIGRvaW5nIGNhbGN1bGF0aW9ucyB3aXRoIDMyYiBwcmVjaXNpb24gKFFGSVg9MTcpCisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEpCisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBIID0gX21tX211bGhpX2VwdTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4SCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjgsIGlxOCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThMID0gX21tX211bGxvX2VwaTE2KGNvZWZmOCwgaXE4KTsKKyAgICBfX20xMjhpIG91dF8wMCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wNCA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wOCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICBfX20xMjhpIG91dF8xMiA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCisgICAgY29uc3QgX19tMTI4aSBiaWFzXzAwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1swXSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA0ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s0XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1sxMl0pOworICAgIG91dF8wMCA9IF9tbV9hZGRfZXBpMzIob3V0XzAwLCBiaWFzXzAwKTsKKyAgICBvdXRfMDQgPSBfbW1fYWRkX2VwaTMyKG91dF8wNCwgYmlhc18wNCk7CisgICAgb3V0XzA4ID0gX21tX2FkZF9lcGkzMihvdXRfMDgsIGJpYXNfMDgpOworICAgIG91dF8xMiA9IF9tbV9hZGRfZXBpMzIob3V0XzEyLCBiaWFzXzEyKTsKKyAgICAvLyBvdXQgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIsIFFGSVgpCisgICAgb3V0XzAwID0gX21tX3NyYWlfZXBpMzIob3V0XzAwLCBRRklYKTsKKyAgICBvdXRfMDQgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDQsIFFGSVgpOworICAgIG91dF8wOCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wOCwgUUZJWCk7CisgICAgb3V0XzEyID0gX21tX3NyYWlfZXBpMzIob3V0XzEyLCBRRklYKTsKKworICAgIC8vIHBhY2sgcmVzdWx0IGFzIDE2YgorICAgIG91dDAgPSBfbW1fcGFja3NfZXBpMzIob3V0XzAwLCBvdXRfMDQpOworICAgIG91dDggPSBfbW1fcGFja3NfZXBpMzIob3V0XzA4LCBvdXRfMTIpOworCisgICAgLy8gaWYgKGNvZWZmID4gMjA0NykgY29lZmYgPSAyMDQ3CisgICAgb3V0MCA9IF9tbV9taW5fZXBpMTYob3V0MCwgbWF4X2NvZWZmXzIwNDcpOworICAgIG91dDggPSBfbW1fbWluX2VwaTE2KG91dDgsIG1heF9jb2VmZl8yMDQ3KTsKKyAgfQorCisgIC8vIHB1dCBzaWduIGJhY2sKKyAgb3V0MCA9IF9tbV9zaWduX2VwaTE2KG91dDAsIGluMCk7CisgIG91dDggPSBfbW1fc2lnbl9lcGkxNihvdXQ4LCBpbjgpOworCisgIC8vIGluID0gb3V0ICogUQorICBpbjAgPSBfbW1fbXVsbG9fZXBpMTYob3V0MCwgcTApOworICBpbjggPSBfbW1fbXVsbG9fZXBpMTYob3V0OCwgcTgpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSwgaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzhdLCBpbjgpOworCisgIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LiBUaGUgcmUtb3JkZXJpbmcgaXM6CisgIC8vICAgIDAgMSAyIDMgNCA1IDYgNyB8IDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgLy8gLT4gMCAxIDRbOF01IDIgMyA2IHwgOSAxMiAxMyAxMCBbN10xMSAxNCAxNQorICAvLyBUaGVyZSdzIG9ubHkgdHdvIG1pc3BsYWNlZCBlbnRyaWVzIChbOF0gYW5kIFs3XSkgdGhhdCBhcmUgY3Jvc3NpbmcgdGhlCisgIC8vIHJlZydzIGJvdW5kYXJpZXMuCisgIC8vIFdlIHVzZSBwc2h1ZmIgaW5zdGVhZCBvZiBwc2h1ZmxvL3BzaHVmaGkuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfbG8gPSBQU0hVRkJfQ1NUKDAsIDEsIDQsIC0xLCA1LCAyLCAzLCA2KTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfNyA9IFBTSFVGQl9DU1QoLTEsIC0xLCAtMSwgLTEsIDcsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wX2xvID0gX21tX3NodWZmbGVfZXBpOChvdXQwLCBrQ3N0X2xvKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF83ID0gX21tX3NodWZmbGVfZXBpOChvdXQwLCBrQ3N0XzcpOyAgLy8gZXh0cmFjdCAjNworICAgIGNvbnN0IF9fbTEyOGkga0NzdF9oaSA9IFBTSFVGQl9DU1QoMSwgNCwgNSwgMiwgLTEsIDMsIDYsIDcpOworICAgIGNvbnN0IF9fbTEyOGkga0NzdF84ID0gUFNIVUZCX0NTVCgtMSwgLTEsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSB0bXBfaGkgPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDgsIGtDc3RfaGkpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wXzggPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDgsIGtDc3RfOCk7ICAvLyBleHRyYWN0ICM4CisgICAgY29uc3QgX19tMTI4aSBvdXRfejAgPSBfbW1fb3Jfc2kxMjgodG1wX2xvLCB0bXBfOCk7CisgICAgY29uc3QgX19tMTI4aSBvdXRfejggPSBfbW1fb3Jfc2kxMjgodG1wX2hpLCB0bXBfNyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0X3owKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBvdXRfejgpOworICAgIHBhY2tlZF9vdXQgPSBfbW1fcGFja3NfZXBpMTYob3V0X3owLCBvdXRfejgpOworICB9CisKKyAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKKyAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChwYWNrZWRfb3V0LCB6ZXJvKSkgIT0gMHhmZmZmKTsKK30KKworI3VuZGVmIFBTSFVGQl9DU1QKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX1NTRTQxKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9ja19TU0U0MShpbiwgb3V0LCAmbXR4LT5zaGFycGVuX1swXSwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrV0hUX1NTRTQxKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9ja19TU0U0MShpbiwgb3V0LCBOVUxMLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19TU0U0MShpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBueiAgPSBEb1F1YW50aXplQmxvY2tfU1NFNDEoaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAwOworICBueiB8PSBEb1F1YW50aXplQmxvY2tfU1NFNDEoaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFNDEodm9pZCk7CitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTQxKHZvaWQpIHsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fU1NFNDE7CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX1NTRTQxOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfU1NFNDE7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrV0hUX1NTRTQxOworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9TU0U0MTsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X1NTRTQxOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0U1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVycy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YTIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVycy5jCkBAIC0wLDAgKzEsMjg3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycworLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3JvLgorCisjIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoKGluKSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KChvdXQpICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChyb3cgPj0gMCAmJiBudW1fcm93cyA+IDAgJiYgcm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsgICAgICAgICAgICAgICAgXAorICAodm9pZCloZWlnaHQ7ICAvLyBTaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmVfQyhjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IGk7CisgIGlmIChpbnZlcnNlKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gKyBwcmVkW2ldOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSG9yaXpvbnRhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvSG9yaXpvbnRhbEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGludmVyc2UgPyBvdXQgOiBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZV9DKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7CisgICAgcm93ID0gMTsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyBwcmVkaWN0ZWQgZnJvbSBhYm92ZS4KKyAgICBQcmVkaWN0TGluZV9DKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0LCAxLCBpbnZlcnNlKTsKKyAgICBQcmVkaWN0TGluZV9DKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbnZlcnNlID8gb3V0IDogaW47CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgorICAgIFByZWRpY3RMaW5lX0MoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9IGVsc2UgeworICAgIC8vIFdlIGFyZSBzdGFydGluZyBmcm9tIGluLWJldHdlZW4uIE1ha2Ugc3VyZSAncHJlZHMnIHBvaW50cyB0byBwcmV2IHJvdy4KKyAgICBwcmVkcyAtPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBQcmVkaWN0TGluZV9DKGluLCBwcmVkcywgb3V0LCB3aWR0aCwgaW52ZXJzZSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHcmFkaWVudFByZWRpY3Rvcl9DKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgY29uc3QgaW50IGcgPSBhICsgYiAtIGM7CisgIHJldHVybiAoKGcgJiB+MHhmZikgPT0gMCkgPyBnIDogKGcgPCAwKSA/IDAgOiAyNTU7ICAvLyBjbGlwIHRvIDhiaXQKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvR3JhZGllbnRGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbnZlcnNlID8gb3V0IDogaW47CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lX0MoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIGludCB3OworICAgIC8vIGxlZnRtb3N0IHBpeGVsOiBwcmVkaWN0IGZyb20gYWJvdmUuCisgICAgUHJlZGljdExpbmVfQyhpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCwgMSwgaW52ZXJzZSk7CisgICAgZm9yICh3ID0gMTsgdyA8IHdpZHRoOyArK3cpIHsKKyAgICAgIGNvbnN0IGludCBwcmVkID0gR3JhZGllbnRQcmVkaWN0b3JfQyhwcmVkc1t3IC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHNbdyAtIHN0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHNbdyAtIHN0cmlkZSAtIDFdKTsKKyAgICAgIG91dFt3XSA9IGluW3ddICsgKGludmVyc2UgPyBwcmVkIDogLXByZWQpOworICAgIH0KKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjdW5kZWYgU0FOSVRZX0NIRUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyX0MoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyX0MoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyX0MoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIDAsIGZpbHRlcmVkX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyX0MoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIDAsIGZpbHRlcmVkX2RhdGEpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgdWludDhfdCBwcmVkID0gKHByZXYgPT0gTlVMTCkgPyAwIDogcHJldlswXTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgb3V0W2ldID0gcHJlZCArIGluW2ldOworICAgIHByZWQgPSBvdXRbaV07CisgIH0KK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXJfQyhjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX0MoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSBvdXRbaV0gPSBwcmV2W2ldICsgaW5baV07CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFVuZmlsdGVyX0MoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9DKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90IHRvcCA9IHByZXZbMF0sIHRvcF9sZWZ0ID0gdG9wLCBsZWZ0ID0gdG9wOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICB0b3AgPSBwcmV2W2ldOyAgLy8gbmVlZCB0byByZWFkIHRoaXMgZmlyc3QsIGluIGNhc2UgcHJldj09b3V0CisgICAgICBsZWZ0ID0gaW5baV0gKyBHcmFkaWVudFByZWRpY3Rvcl9DKGxlZnQsIHRvcCwgdG9wX2xlZnQpOworICAgICAgdG9wX2xlZnQgPSB0b3A7CisgICAgICBvdXRbaV0gPSBsZWZ0OworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdCBmdW5jdGlvbgorCitXZWJQRmlsdGVyRnVuYyBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKK1dlYlBVbmZpbHRlckZ1bmMgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE1TQSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0U1NFMih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOEZpbHRlcnNJbml0KSB7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfTk9ORV0gPSBOVUxMOworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxVbmZpbHRlcl9DOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsVW5maWx0ZXJfQzsKKyNlbmRpZgorICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50VW5maWx0ZXJfQzsKKworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9OT05FXSA9IE5VTEw7CisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXJfQzsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxGaWx0ZXJfQzsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXJfQzsKKyNlbmRpZgorCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhGaWx0ZXJzSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhGaWx0ZXJzSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBWUDhGaWx0ZXJzSW5pdE1TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgVlA4RmlsdGVyc0luaXRORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzgyYjEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCisvLworLy8gQXV0aG9yKHMpOiBCcmFuaW1pciBWYXNpYyAoYnJhbmltaXIudmFzaWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyby4KKworIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGluICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChvdXQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQocm93ID49IDAgJiYgbnVtX3Jvd3MgPiAwICYmIHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpaGVpZ2h0OyAgLy8gU2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKworI2RlZmluZSBET19QUkVESUNUX0xJTkUoU1JDLCBEU1QsIExFTkdUSCwgSU5WRVJTRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90KiBwc3JjID0gKHVpbnQ4X3QqKShTUkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogcGRzdCA9ICh1aW50OF90KikoRFNUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBpbGVuZ3RoID0gKGludCkoTEVOR1RIKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3JsICAgICAgICVbdGVtcDBdLCAgICAlW2xlbmd0aF0sICAgIDIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJlcXogICAgICAlW3RlbXAwXSwgICAgNGYgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYW5kaSAgICAgJVt0ZW1wNl0sICAgICVbbGVuZ3RoXSwgICAgMyAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5pZiAiICNJTlZFUlNFICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAzXSwgICAgMSglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wNF0sICAgIDIoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDVdLCAgICAzKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wM10gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICVbdGVtcDRdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wM10sICAgICAlW3RlbXA1XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDJdLCAgICAxKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wNF0sICAgIDMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDQgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDQgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDFdLCAgICAtMSglW3NyY10pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAyXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUucWIgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAxXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1c3cgICAgICAgJVt0ZW1wM10sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICA0ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJlcXogICAgICAlW3RlbXA2XSwgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAyXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDFdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDFdLCAgICAtMSglW3NyY10pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDZdLCAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgICAgICAgICBcCisgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFtkc3RdIismciIocGRzdCksIFtzcmNdIismciIocHNyYykgICAgICAgICAgICAgICAgXAorICAgICAgOiBbbGVuZ3RoXSJyIihpbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0TGluZV9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICBET19QUkVESUNUX0xJTkUoc3JjLCBkc3QsIGxlbmd0aCwgMCk7Cit9CisKKyNkZWZpbmUgRE9fUFJFRElDVF9MSU5FX1ZFUlRJQ0FMKFNSQywgUFJFRCwgRFNULCBMRU5HVEgsIElOVkVSU0UpIGRvIHsgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCogcHNyYyA9ICh1aW50OF90KikoU1JDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIHBwcmVkID0gKHVpbnQ4X3QqKShQUkVEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBwZHN0ID0gKHVpbnQ4X3QqKShEU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGlsZW5ndGggPSAoaW50KShMRU5HVEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7ICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzcmwgICAgICAgJVt0ZW1wMF0sICAgICVbbGVuZ3RoXSwgICAgMHgzICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDBdLCAgICA0ZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhbmRpICAgICAlW3RlbXA3XSwgICAgJVtsZW5ndGhdLCAgICAweDcgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDFdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAyXSwgICAgMCglW3ByZWRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wM10sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDRdLCAgICA0KCVbcHJlZF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICA4ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdS5xYiAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUucWIgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10sICAgICAlW3RlbXA0XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidS5xYiAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUucWIgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10sICAgICAlW3RlbXA0XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbcHJlZF0sICAgICAlW3ByZWRdLCAgICAgIDggICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVzdyAgICAgICAlW3RlbXA1XSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1c3cgICAgICAgJVt0ZW1wNl0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgOCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJlcXogICAgICAlW3RlbXA3XSwgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtwcmVkXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3ByZWRdLCAgICAgJVtwcmVkXSwgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDddLCAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgICAgICAgICBcCisgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtwcmVkXSIrJnIiKHBwcmVkKSwgICAgICAgICAgXAorICAgICAgICBbZHN0XSIrJnIiKHBkc3QpLCBbc3JjXSIrJnIiKHBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW2xlbmd0aF0iciIoaWxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQUkVESUNUX0xJTkVfT05FX1BBU1MoU1JDLCBQUkVELCBEU1QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAwKCVbc3JjXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgMCglW3ByZWRdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSAgICAgICAgICBcCisgICAgICA6IFtwcmVkXSJyIigoUFJFRCkpLCBbZHN0XSJyIigoRFNUKSksIFtzcmNdInIiKChTUkMpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworI2RlZmluZSBGSUxURVJfTElORV9CWV9MSU5FIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQUkVESUNUX0xJTkVfT05FX1BBU1MoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRE9fUFJFRElDVF9MSU5FKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrcm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwcmVkcyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW4gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG91dCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW47CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgdGhlIHNhbWUgYXMgaW5wdXQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVfTUlQU2RzcFIyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIEZJTFRFUl9MSU5FX0JZX0xJTkU7Cit9CisjdW5kZWYgRklMVEVSX0xJTkVfQllfTElORQorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0hvcml6b250YWxGaWx0ZXJfTUlQU2RzcFIyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyLgorCisjZGVmaW5lIEZJTFRFUl9MSU5FX0JZX0xJTkUgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERPX1BSRURJQ1RfTElORV9WRVJUSUNBTChpbiwgcHJlZHMsIG91dCwgd2lkdGgsIDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJlZHMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGluICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvdXQgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9WZXJ0aWNhbEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW47CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgorICAgIFByZWRpY3RMaW5lX01JUFNkc3BSMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBhcmUgc3RhcnRpbmcgZnJvbSBpbi1iZXR3ZWVuLiBNYWtlIHN1cmUgJ3ByZWRzJyBwb2ludHMgdG8gcHJldiByb3cuCisgICAgcHJlZHMgLT0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgRklMVEVSX0xJTkVfQllfTElORTsKK30KKyN1bmRlZiBGSUxURVJfTElORV9CWV9MSU5FCisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyX01JUFNkc3BSMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIuCisKK3N0YXRpYyBpbnQgR3JhZGllbnRQcmVkaWN0b3JfTUlQU2RzcFIyKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgaW50IHRlbXAwOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiYWRkdSAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW2FdLCAgICAgICAlW2JdICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbY10gICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgMjMgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAkemVybyAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApCisgICAgOiBbYV0iciIoYSksW2JdInIiKGIpLFtjXSJyIihjKQorICApOworICByZXR1cm4gdGVtcDA7Cit9CisKKyNkZWZpbmUgRklMVEVSX0xJTkVfQllfTElORShQUkVEUywgT1BFUkFUSU9OKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBSRURJQ1RfTElORV9PTkVfUEFTUyhpbiwgUFJFRFMgLSBzdHJpZGUsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKHcgPSAxOyB3IDwgd2lkdGg7ICsrdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgcHJlZCA9IEdyYWRpZW50UHJlZGljdG9yX01JUFNkc3BSMihQUkVEU1t3IC0gMV0sICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRFNbdyAtIHN0cmlkZV0sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURTW3cgLSBzdHJpZGUgLSAxXSk7ICAgXAorICAgICAgICBvdXRbd10gPSBpblt3XSBPUEVSQVRJT04gcHJlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW4gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG91dCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBEb0dyYWRpZW50RmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW47CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lX01JUFNkc3BSMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICBGSUxURVJfTElORV9CWV9MSU5FKGluLCAtKTsKK30KKyN1bmRlZiBGSUxURVJfTElORV9CWV9MSU5FCisKK3N0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyX01JUFNkc3BSMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7Cisgb3V0WzBdID0gaW5bMF0gKyAocHJldiA9PSBOVUxMID8gMCA6IHByZXZbMF0pOworIERPX1BSRURJQ1RfTElORShpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9NSVBTZHNwUjIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIERPX1BSRURJQ1RfTElORV9WRVJUSUNBTChpbiwgcHJldiwgb3V0LCB3aWR0aCwgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX01JUFNkc3BSMihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCB0b3AgPSBwcmV2WzBdLCB0b3BfbGVmdCA9IHRvcCwgbGVmdCA9IHRvcDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgdG9wID0gcHJldltpXTsgIC8vIG5lZWQgdG8gcmVhZCB0aGlzIGZpcnN0LCBpbiBjYXNlIHByZXY9PWRzdAorICAgICAgbGVmdCA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3JfTUlQU2RzcFIyKGxlZnQsIHRvcCwgdG9wX2xlZnQpOworICAgICAgdG9wX2xlZnQgPSB0b3A7CisgICAgICBvdXRbaV0gPSBsZWZ0OworICAgIH0KKyAgfQorfQorCisjdW5kZWYgRE9fUFJFRElDVF9MSU5FX1ZFUlRJQ0FMCisjdW5kZWYgUFJFRElDVF9MSU5FX09ORV9QQVNTCisjdW5kZWYgRE9fUFJFRElDVF9MSU5FCisjdW5kZWYgU0FOSVRZX0NIRUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxVbmZpbHRlcl9NSVBTZHNwUjI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxVbmZpbHRlcl9NSVBTZHNwUjI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRVbmZpbHRlcl9NSVBTZHNwUjI7CisKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyX01JUFNkc3BSMjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxGaWx0ZXJfTUlQU2RzcFIyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcl9NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjNDM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19tc2EuYwpAQCAtMCwwICsxLDIwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2YXJpYW50IG9mIGFscGhhIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFByYXNoYW50IFBhdGlsIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0TGluZUludmVyc2UwKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IHNyYzAsIHByZWQwLCBkc3QwOworICBhc3NlcnQobGVuZ3RoID49IDApOworICB3aGlsZSAobGVuZ3RoID49IDMyKSB7CisgICAgdjE2dTggc3JjMSwgcHJlZDEsIGRzdDE7CisgICAgTERfVUIyKHNyYywgMTYsIHNyYzAsIHNyYzEpOworICAgIExEX1VCMihwcmVkLCAxNiwgcHJlZDAsIHByZWQxKTsKKyAgICBTVUIyKHNyYzAsIHByZWQwLCBzcmMxLCBwcmVkMSwgZHN0MCwgZHN0MSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIGRzdCwgMTYpOworICAgIHNyYyArPSAzMjsKKyAgICBwcmVkICs9IDMyOworICAgIGRzdCArPSAzMjsKKyAgICBsZW5ndGggLT0gMzI7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgaTsKKyAgICBpZiAobGVuZ3RoID49IDE2KSB7CisgICAgICBzcmMwID0gTERfVUIoc3JjKTsKKyAgICAgIHByZWQwID0gTERfVUIocHJlZCk7CisgICAgICBkc3QwID0gc3JjMCAtIHByZWQwOworICAgICAgU1RfVUIoZHN0MCwgZHN0KTsKKyAgICAgIHNyYyArPSAxNjsKKyAgICAgIHByZWQgKz0gMTY7CisgICAgICBkc3QgKz0gMTY7CisgICAgICBsZW5ndGggLT0gMTY7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm8uCisKKyNkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICBcCisgIGFzc2VydChpbiAhPSBOVUxMKTsgICAgICAgICAgXAorICBhc3NlcnQob3V0ICE9IE5VTEwpOyAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcnJpem9udGFsIGZpbHRlcgorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyX01TQShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gZGF0YTsKKyAgY29uc3QgdWludDhfdCogaW4gPSBkYXRhOworICB1aW50OF90KiBvdXQgPSBmaWx0ZXJlZF9kYXRhOworICBpbnQgcm93ID0gMTsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworCisgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICBvdXRbMF0gPSBpblswXTsKKyAgUHJlZGljdExpbmVJbnZlcnNlMChpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICBwcmVkcyArPSBzdHJpZGU7CisgIGluICs9IHN0cmlkZTsKKyAgb3V0ICs9IHN0cmlkZTsKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGhlaWdodCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlLgorICAgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEpOworICAgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGZpbHRlcgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0TGluZUdyYWRpZW50KGNvbnN0IHVpbnQ4X3QqIHBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBvdXRwdXQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGludCB3OworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIHdoaWxlIChzaXplID49IDE2KSB7CisgICAgdjE2dTggcHJlZDAsIGRzdDA7CisgICAgdjhpMTYgYTAsIGExLCBiMCwgYjEsIGMwLCBjMTsKKyAgICBjb25zdCB2MTZ1OCB0bXAwID0gTERfVUIocHByZWQgLSAxKTsKKyAgICBjb25zdCB2MTZ1OCB0bXAxID0gTERfVUIocHByZWQgLSBzdHJpZGUpOworICAgIGNvbnN0IHYxNnU4IHRtcDIgPSBMRF9VQihwcHJlZCAtIHN0cmlkZSAtIDEpOworICAgIGNvbnN0IHYxNnU4IHNyYzAgPSBMRF9VQihwaW5wdXQpOworICAgIElMVlJMX0IyX1NIKHplcm8sIHRtcDAsIGEwLCBhMSk7CisgICAgSUxWUkxfQjJfU0goemVybywgdG1wMSwgYjAsIGIxKTsKKyAgICBJTFZSTF9CMl9TSCh6ZXJvLCB0bXAyLCBjMCwgYzEpOworICAgIEFERDIoYTAsIGIwLCBhMSwgYjEsIGEwLCBhMSk7CisgICAgU1VCMihhMCwgYzAsIGExLCBjMSwgYTAsIGExKTsKKyAgICBDTElQX1NIMl8wXzI1NShhMCwgYTEpOworICAgIHByZWQwID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWExLCAodjE2aTgpYTApOworICAgIGRzdDAgPSBzcmMwIC0gcHJlZDA7CisgICAgU1RfVUIoZHN0MCwgcG91dHB1dCk7CisgICAgcHByZWQgKz0gMTY7CisgICAgcGlucHV0ICs9IDE2OworICAgIHBvdXRwdXQgKz0gMTY7CisgICAgc2l6ZSAtPSAxNjsKKyAgfQorICBmb3IgKHcgPSAwOyB3IDwgc2l6ZTsgKyt3KSB7CisgICAgY29uc3QgaW50IHByZWQgPSBwcHJlZFt3IC0gMV0gKyBwcHJlZFt3IC0gc3RyaWRlXSAtIHBwcmVkW3cgLSBzdHJpZGUgLSAxXTsKKyAgICBwb3V0cHV0W3ddID0gcGlucHV0W3ddIC0gKHByZWQgPCAwID8gMCA6IHByZWQgPiAyNTUgPyAyNTUgOiBwcmVkKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyX01TQShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBjb25zdCB1aW50OF90KiBpbiA9IGRhdGE7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gZGF0YTsKKyAgdWludDhfdCogb3V0ID0gZmlsdGVyZWRfZGF0YTsKKyAgaW50IHJvdyA9IDE7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgb3V0WzBdID0gaW5bMF07CisgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgcHJlZHMgKz0gc3RyaWRlOworICBpbiArPSBzdHJpZGU7CisgIG91dCArPSBzdHJpZGU7CisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBoZWlnaHQpIHsKKyAgICBvdXRbMF0gPSBpblswXSAtIHByZWRzWy0gc3RyaWRlXTsKKyAgICBQcmVkaWN0TGluZUdyYWRpZW50KHByZWRzICsgMSwgaW4gKyAxLCBvdXQgKyAxLCBzdHJpZGUsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIKKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXJfTVNBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGluID0gZGF0YTsKKyAgY29uc3QgdWludDhfdCogcHJlZHMgPSBkYXRhOworICB1aW50OF90KiBvdXQgPSBmaWx0ZXJlZF9kYXRhOworICBpbnQgcm93ID0gMTsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworCisgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICBvdXRbMF0gPSBpblswXTsKKyAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgorICBQcmVkaWN0TGluZUludmVyc2UwKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgIGluICs9IHN0cmlkZTsKKyAgb3V0ICs9IHN0cmlkZTsKKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgaGVpZ2h0KSB7CisgICAgUHJlZGljdExpbmVJbnZlcnNlMChpbiwgcHJlZHMsIG91dCwgd2lkdGgpOworICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisjdW5kZWYgU0FOSVRZX0NIRUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEZpbHRlcnNJbml0TVNBKHZvaWQpIHsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyX01TQTsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxGaWx0ZXJfTVNBOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcl9NU0E7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhGaWx0ZXJzSW5pdE1TQSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmE1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbmVvbi5jCkBAIC0wLDAgKzEsMzI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTkVPTiB2YXJpYW50IG9mIGFscGhhIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyb3MuCisKKyMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChpbiAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQob3V0ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHJvdyA+PSAwICYmIG51bV9yb3dzID4gMCAmJiByb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOyAgICAgICAgICAgICAgICBcCisgICh2b2lkKWhlaWdodDsgIC8vIFNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisKKy8vIGxvYWQgZWlnaHQgdTggYW5kIHdpZGVuIHRvIHMxNgorI2RlZmluZSBVOF9UT19TMTYoQSkgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZtb3ZsX3U4KEEpKQorI2RlZmluZSBMT0FEX1U4X1RPX1MxNihBKSBVOF9UT19TMTYodmxkMV91OChBKSkKKworLy8gc2hpZnQgbGVmdCBvciByaWdodCBieSBOIGJ5dGUsIGluc2VydGluZyB6ZXJvcworI2RlZmluZSBTSElGVF9SSUdIVF9OX1EoQSwgTikgdmV4dHFfdTgoKEEpLCB6ZXJvLCAoTikpCisjZGVmaW5lIFNISUZUX0xFRlRfTl9RKEEsIE4pIHZleHRxX3U4KHplcm8sIChBKSwgKDE2IC0gKE4pKSAlIDE2KQorCisvLyByb3RhdGUgbGVmdCBieSBOIGJ5dGVzCisjZGVmaW5lIFJPVEFURV9MRUZUX04oQSwgTikgICB2ZXh0X3U4KChBKSwgKEEpLCAoTikpCisvLyByb3RhdGUgcmlnaHQgYnkgTiBieXRlcworI2RlZmluZSBST1RBVEVfUklHSFRfTihBLCBOKSAgIHZleHRfdTgoKEEpLCAoQSksICg4IC0gKE4pKSAlIDgpCisKK3N0YXRpYyB2b2lkIFByZWRpY3RMaW5lX05FT04oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGFzc2VydChsZW5ndGggPj0gMCk7CisgIGZvciAoaSA9IDA7IGkgKyAxNiA8PSBsZW5ndGg7IGkgKz0gMTYpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IEEgPSB2bGQxcV91OCgmc3JjW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEIgPSB2bGQxcV91OCgmcHJlZFtpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBDID0gdnN1YnFfdTgoQSwgQik7CisgICAgdnN0MXFfdTgoJmRzdFtpXSwgQyk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKK30KKworLy8gU3BlY2lhbCBjYXNlIGZvciBsZWZ0LWJhc2VkIHByZWRpY3Rpb24gKHdoZW4gcHJlZHM9PWRzdC0xIG9yIHByZWRzPT1zcmMtMSkuCitzdGF0aWMgdm9pZCBQcmVkaWN0TGluZUxlZnRfTkVPTihjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICBQcmVkaWN0TGluZV9ORU9OKHNyYywgc3JjIC0gMSwgZHN0LCBsZW5ndGgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSG9yaXpvbnRhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvSG9yaXpvbnRhbEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgdGhlIHNhbWUgYXMgaW5wdXQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVMZWZ0X05FT04oaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyBwcmVkaWN0ZWQgZnJvbSBhYm92ZS4KKyAgICBvdXRbMF0gPSBpblswXSAtIGluWy1zdHJpZGVdOworICAgIFByZWRpY3RMaW5lTGVmdF9ORU9OKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyX05FT04oY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyX05FT04oZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyX05FT04oY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICAgIG91dFswXSA9IGluWzBdOworICAgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgICBQcmVkaWN0TGluZUxlZnRfTkVPTihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIFByZWRpY3RMaW5lX05FT04oaW4sIGluIC0gc3RyaWRlLCBvdXQsIHdpZHRoKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyX05FT04oZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHcmFkaWVudFByZWRpY3Rvcl9DKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgY29uc3QgaW50IGcgPSBhICsgYiAtIGM7CisgIHJldHVybiAoKGcgJiB+MHhmZikgPT0gMCkgPyBnIDogKGcgPCAwKSA/IDAgOiAyNTU7ICAvLyBjbGlwIHRvIDhiaXQKK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRQcmVkaWN0RGlyZWN0X05FT04oY29uc3QgdWludDhfdCogY29uc3Qgcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW5ndGg7IGkgKz0gOCkgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBBID0gdmxkMV91OCgmcm93W2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4OF90IEIgPSB2bGQxX3U4KCZ0b3BbaSArIDBdKTsKKyAgICBjb25zdCBpbnQxNng4X3QgQyA9IHZyZWludGVycHJldHFfczE2X3UxNih2YWRkbF91OChBLCBCKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEQgPSBMT0FEX1U4X1RPX1MxNigmdG9wW2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4OF90IEUgPSB2cW1vdnVuX3MxNih2c3VicV9zMTYoQywgRCkpOworICAgIGNvbnN0IHVpbnQ4eDhfdCBGID0gdmxkMV91OCgmcm93W2kgKyAwXSk7CisgICAgdnN0MV91OCgmb3V0W2ldLCB2c3ViX3U4KEYsIEUpKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgb3V0W2ldID0gcm93W2ldIC0gR3JhZGllbnRQcmVkaWN0b3JfQyhyb3dbaSAtIDFdLCB0b3BbaV0sIHRvcFtpIC0gMV0pOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvR3JhZGllbnRGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVMZWZ0X05FT04oaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBvdXRbMF0gPSBpblswXSAtIGluWy1zdHJpZGVdOworICAgIEdyYWRpZW50UHJlZGljdERpcmVjdF9ORU9OKGluICsgMSwgaW4gKyAxIC0gc3RyaWRlLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyX05FT04oY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvR3JhZGllbnRGaWx0ZXJfTkVPTihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisjdW5kZWYgU0FOSVRZX0NIRUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnZlcnNlIHRyYW5zZm9ybXMKKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyX05FT04oY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgY29uc3QgdWludDh4MTZfdCB6ZXJvID0gdmR1cHFfbl91OCgwKTsKKyAgdWludDh4MTZfdCBsYXN0OworICBvdXRbMF0gPSBpblswXSArIChwcmV2ID09IE5VTEwgPyAwIDogcHJldlswXSk7CisgIGlmICh3aWR0aCA8PSAxKSByZXR1cm47CisgIGxhc3QgPSB2c2V0cV9sYW5lX3U4KG91dFswXSwgemVybywgMCk7CisgIGZvciAoaSA9IDE7IGkgKyAxNiA8PSB3aWR0aDsgaSArPSAxNikgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTAgPSB2bGQxcV91OCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTEgPSB2YWRkcV91OChBMCwgbGFzdCk7CisgICAgY29uc3QgdWludDh4MTZfdCBBMiA9IFNISUZUX0xFRlRfTl9RKEExLCAxKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEEzID0gdmFkZHFfdTgoQTEsIEEyKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE0ID0gU0hJRlRfTEVGVF9OX1EoQTMsIDIpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTUgPSB2YWRkcV91OChBMywgQTQpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTYgPSBTSElGVF9MRUZUX05fUShBNSwgNCk7CisgICAgY29uc3QgdWludDh4MTZfdCBBNyA9IHZhZGRxX3U4KEE1LCBBNik7CisgICAgY29uc3QgdWludDh4MTZfdCBBOCA9IFNISUZUX0xFRlRfTl9RKEE3LCA4KTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE5ID0gdmFkZHFfdTgoQTcsIEE4KTsKKyAgICB2c3QxcV91OCgmb3V0W2ldLCBBOSk7CisgICAgbGFzdCA9IFNISUZUX1JJR0hUX05fUShBOSwgMTUpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBvdXRbaSAtIDFdOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyX05FT04oY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9ORU9OKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQod2lkdGggPj0gMCk7CisgICAgZm9yIChpID0gMDsgaSArIDE2IDw9IHdpZHRoOyBpICs9IDE2KSB7CisgICAgICBjb25zdCB1aW50OHgxNl90IEEgPSB2bGQxcV91OCgmaW5baV0pOworICAgICAgY29uc3QgdWludDh4MTZfdCBCID0gdmxkMXFfdTgoJnByZXZbaV0pOworICAgICAgY29uc3QgdWludDh4MTZfdCBDID0gdmFkZHFfdTgoQSwgQik7CisgICAgICB2c3QxcV91OCgmb3V0W2ldLCBDKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBvdXRbaV0gPSBpbltpXSArIHByZXZbaV07CisgIH0KK30KKworLy8gR3JhZGllbnRVbmZpbHRlcl9ORU9OIGlzIGNvcnJlY3QgYnV0IHNsb3dlciB0aGFuIHRoZSBDLXZlcnNpb24sCisvLyBhdCBsZWFzdCBvbiBBUk02NC4gRm9yIGFybXY3LCBpdCdzIGEgd2FzaC4KKy8vIFNvIGJlc3QgaXMgdG8gZGlzYWJsZSBpdCBmb3Igbm93LCBidXQga2VlcCB0aGUgaWRlYSBhcm91bmQuLi4KKyNpZiAhZGVmaW5lZChVU0VfR1JBRElFTlRfVU5GSUxURVIpCisjZGVmaW5lIFVTRV9HUkFESUVOVF9VTkZJTFRFUiAwICAgLy8gQUxURVJOQVRFX0NPREUKKyNlbmRpZgorCisjaWYgKFVTRV9HUkFESUVOVF9VTkZJTFRFUiA9PSAxKQorI2RlZmluZSBHUkFEX1BST0NFU1NfTEFORShMKSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHRtcDEgPSBST1RBVEVfUklHSFRfTihwcmVkLCAxKTsgIC8qIHJvdGF0ZSBwcmVkaWN0b3IgaW4gKi8gICBcCisgIGNvbnN0IGludDE2eDhfdCB0bXAyID0gdmFkZHFfczE2KEJDLCBVOF9UT19TMTYodG1wMSkpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgZGVsdGEgPSB2cW1vdnVuX3MxNih0bXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJlZCA9IHZhZGRfdTgoRCwgZGVsdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dCA9IHZleHRfdTgob3V0LCBST1RBVEVfTEVGVF9OKHByZWQsIChMKSksIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgR3JhZGllbnRQcmVkaWN0SW52ZXJzZV9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByb3csIGludCBsZW5ndGgpIHsKKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgaTsKKyAgICB1aW50OHg4X3QgcHJlZCA9IHZkdXBfbl91OChyb3dbLTFdKTsgICAvLyBsZWZ0IHNhbXBsZQorICAgIHVpbnQ4eDhfdCBvdXQgPSB2ZHVwX25fdTgoMCk7CisgICAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuZ3RoOyBpICs9IDgpIHsKKyAgICAgIGNvbnN0IGludDE2eDhfdCBCID0gTE9BRF9VOF9UT19TMTYoJnRvcFtpICsgMF0pOworICAgICAgY29uc3QgaW50MTZ4OF90IEMgPSBMT0FEX1U4X1RPX1MxNigmdG9wW2kgLSAxXSk7CisgICAgICBjb25zdCBpbnQxNng4X3QgQkMgPSB2c3VicV9zMTYoQiwgQyk7ICAvLyB1bmNsaXBwZWQgZ3JhZGllbnQgYmFzaXMgQiAtIEMKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBEID0gdmxkMV91OCgmaW5baV0pOyAgIC8vIGJhc2UgaW5wdXQKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDApOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoMSk7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSgyKTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDMpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoNCk7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSg1KTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDYpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoNyk7CisgICAgICB2c3QxX3U4KCZyb3dbaV0sIG91dCk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHJvd1tpXSA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3JfQyhyb3dbaSAtIDFdLCB0b3BbaV0sIHRvcFtpIC0gMV0pOworICAgIH0KKyAgfQorfQorI3VuZGVmIEdSQURfUFJPQ0VTU19MQU5FCisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX05FT04oTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIG91dFswXSA9IGluWzBdICsgcHJldlswXTsgIC8vIHByZWRpY3QgZnJvbSBhYm92ZQorICAgIEdyYWRpZW50UHJlZGljdEludmVyc2VfTkVPTihpbiArIDEsIHByZXYgKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICB9Cit9CisKKyNlbmRpZiAgIC8vIFVTRV9HUkFESUVOVF9VTkZJTFRFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRORU9OKHZvaWQpIHsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxVbmZpbHRlcl9ORU9OOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsVW5maWx0ZXJfTkVPTjsKKyNpZiAoVVNFX0dSQURJRU5UX1VORklMVEVSID09IDEpCisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRVbmZpbHRlcl9ORU9OOworI2VuZGlmCisKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyX05FT047CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyX05FT047CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50RmlsdGVyX05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTg4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfc3NlMi5jCkBAIC0wLDAgKzEsMzMzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2YXJpYW50IG9mIGFscGhhIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyby4KKworIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KChpbikgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCgob3V0KSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQocm93ID49IDAgJiYgbnVtX3Jvd3MgPiAwICYmIHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpaGVpZ2h0OyAgLy8gU2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKworc3RhdGljIHZvaWQgUHJlZGljdExpbmVUb3BfU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+MzE7CisgIGFzc2VydChsZW5ndGggPj0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDMyKSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyY1tpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjW2kgKyAxNl0pOworICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmVkW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmVkW2kgKyAxNl0pOworICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fc3ViX2VwaTgoQTAsIEIwKTsKKyAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX3N1Yl9lcGk4KEExLCBCMSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDBdLCBDMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgMTZdLCBDMSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKK30KKworLy8gU3BlY2lhbCBjYXNlIGZvciBsZWZ0LWJhc2VkIHByZWRpY3Rpb24gKHdoZW4gcHJlZHM9PWRzdC0xIG9yIHByZWRzPT1zcmMtMSkuCitzdGF0aWMgdm9pZCBQcmVkaWN0TGluZUxlZnRfU1NFMihjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+MzE7CisgIGFzc2VydChsZW5ndGggPj0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDMyKSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAgMCAgICApKTsKKyAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArICAwIC0gMSkpOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMTYgICAgKSk7CisgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAxNiAtIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX3N1Yl9lcGk4KEEwLCBCMCk7CisgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9zdWJfZXBpOChBMSwgQjEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBpICsgIDApLCBDMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGkgKyAxNiksIEMxKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBzcmNbaSAtIDFdOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSG9yaXpvbnRhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvSG9yaXpvbnRhbEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgdGhlIHNhbWUgYXMgaW5wdXQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVMZWZ0X1NTRTIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyBwcmVkaWN0ZWQgZnJvbSBhYm92ZS4KKyAgICBvdXRbMF0gPSBpblswXSAtIGluWy1zdHJpZGVdOworICAgIFByZWRpY3RMaW5lTGVmdF9TU0UyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICAgIG91dFswXSA9IGluWzBdOworICAgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgICBQcmVkaWN0TGluZUxlZnRfU1NFMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIFByZWRpY3RMaW5lVG9wX1NTRTIoaW4sIGluIC0gc3RyaWRlLCBvdXQsIHdpZHRoKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yX1NTRTIodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFByZWRpY3REaXJlY3RfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+NzsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcm93W2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnRvcFtpXSk7CisgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnRvcFtpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJvd1tpXSk7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2tsb19lcGk4KEEwLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2xvX2VwaTgoQjAsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpOChDMCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2FkZF9lcGkxNihBMSwgQjEpOworICAgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9zdWJfZXBpMTYoRSwgQzEpOworICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9wYWNrdXNfZXBpMTYoRiwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBIID0gX21tX3N1Yl9lcGk4KEQsIEcpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShvdXQgKyBpKSwgSCk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIG91dFtpXSA9IHJvd1tpXSAtIEdyYWRpZW50UHJlZGljdG9yX1NTRTIocm93W2kgLSAxXSwgdG9wW2ldLCB0b3BbaSAtIDFdKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0dyYWRpZW50RmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQorICBpZiAocm93ID09IDApIHsKKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfU1NFMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgR3JhZGllbnRQcmVkaWN0RGlyZWN0X1NTRTIoaW4gKyAxLCBpbiArIDEgLSBzdHJpZGUsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworI3VuZGVmIFNBTklUWV9DSEVDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyX1NTRTIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyX1NTRTIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIGZpbHRlcmVkX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyX1NTRTIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW52ZXJzZSB0cmFuc2Zvcm1zCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIF9fbTEyOGkgbGFzdDsKKyAgb3V0WzBdID0gaW5bMF0gKyAocHJldiA9PSBOVUxMID8gMCA6IHByZXZbMF0pOworICBpZiAod2lkdGggPD0gMSkgcmV0dXJuOworICBsYXN0ID0gX21tX3NldF9lcGkzMigwLCAwLCAwLCBvdXRbMF0pOworICBmb3IgKGkgPSAxOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGluICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fYWRkX2VwaTgoQTAsIGxhc3QpOworICAgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc2xsaV9zaTEyOChBMSwgMSk7CisgICAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9hZGRfZXBpOChBMSwgQTIpOworICAgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fc2xsaV9zaTEyOChBMywgMik7CisgICAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9hZGRfZXBpOChBMywgQTQpOworICAgIGNvbnN0IF9fbTEyOGkgQTYgPSBfbW1fc2xsaV9zaTEyOChBNSwgNCk7CisgICAgY29uc3QgX19tMTI4aSBBNyA9IF9tbV9hZGRfZXBpOChBNSwgQTYpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShvdXQgKyBpKSwgQTcpOworICAgIGxhc3QgPSBfbW1fc3JsaV9lcGk2NChBNywgNTYpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBvdXRbaSAtIDFdOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9TU0UyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQgbWF4X3BvcyA9IHdpZHRoICYgfjMxOworICAgIGFzc2VydCh3aWR0aCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSAzMikgeworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgKyAgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgKyAxNl0pOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnByZXZbaSArICAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcHJldltpICsgMTZdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTgoQTAsIEIwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTgoQTEsIEIxKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICAwXSwgQzApOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgMTZdLCBDMSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBwcmV2W2ldOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdEludmVyc2VfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgcm93LCBpbnQgbGVuZ3RoKSB7CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+NzsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIF9fbTEyOGkgQSA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgMCwgcm93Wy0xXSk7ICAgLy8gbGVmdCBzYW1wbGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSA4KSB7CisgICAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ0b3BbaV0pOworICAgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2kgLSAxXSk7CisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fdW5wYWNrbG9fZXBpOCh0bXAwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBEID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgLy8gYmFzZSBpbnB1dAorICAgICAgY29uc3QgX19tMTI4aSBFID0gX21tX3N1Yl9lcGkxNihCLCBDKTsgIC8vIHVuY2xpcHBlZCBncmFkaWVudCBiYXNpcyBCIC0gQworICAgICAgX19tMTI4aSBvdXQgPSB6ZXJvOyAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdG9yIGZvciBvdXRwdXQKKyAgICAgIF9fbTEyOGkgbWFza19oaSA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgMCwgMHhmZik7CisgICAgICBpbnQgayA9IDg7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fYWRkX2VwaTE2KEEsIEUpOyAgICAgICAgICAgLy8gZGVsdGEgPSBBICsgQiAtIEMKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX3BhY2t1c19lcGkxNih0bXAzLCB6ZXJvKTsgIC8vIHNhdHVyYXRlIGRlbHRhCisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wNSA9IF9tbV9hZGRfZXBpOCh0bXA0LCBEKTsgICAgICAgICAvLyBhZGQgdG8gaW5bXQorICAgICAgICBBID0gX21tX2FuZF9zaTEyOCh0bXA1LCBtYXNrX2hpKTsgICAgICAgICAgICAgICAgICAgLy8gMS1jb21wbGVtZW50IGNsaXAKKyAgICAgICAgb3V0ID0gX21tX29yX3NpMTI4KG91dCwgQSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgb3V0cHV0CisgICAgICAgIGlmICgtLWsgPT0gMCkgYnJlYWs7CisgICAgICAgIEEgPSBfbW1fc2xsaV9zaTEyOChBLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3RhdGUgbGVmdCBzYW1wbGUKKyAgICAgICAgbWFza19oaSA9IF9tbV9zbGxpX3NpMTI4KG1hc2tfaGksIDEpOyAgICAgICAgICAgIC8vIHJvdGF0ZSBtYXNrCisgICAgICAgIEEgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IDhiLT4xNmIKKyAgICAgIH0KKyAgICAgIEEgPSBfbW1fc3JsaV9zaTEyOChBLCA3KTsgICAgICAgLy8gcHJlcGFyZSBsZWZ0IHNhbXBsZSBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZyb3dbaV0sIG91dCk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHJvd1tpXSA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3JfU1NFMihyb3dbaSAtIDFdLCB0b3BbaV0sIHRvcFtpIC0gMV0pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFVuZmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9TU0UyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRbMF0gPSBpblswXSArIHByZXZbMF07ICAvLyBwcmVkaWN0IGZyb20gYWJvdmUKKyAgICBHcmFkaWVudFByZWRpY3RJbnZlcnNlX1NTRTIoaW4gKyAxLCBwcmV2ICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRTU0UyKHZvaWQpIHsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxVbmZpbHRlcl9TU0UyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsVW5maWx0ZXJfU1NFMjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudFVuZmlsdGVyX1NTRTI7CisKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyX1NTRTI7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyX1NTRTI7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50RmlsdGVyX1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUzZWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5jCkBAIC0wLDAgKzEsNjY2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKworI2RlZmluZSBNQVhfRElGRl9DT1NUICgxZTMwZikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltYWdlIHRyYW5zZm9ybXMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgcmV0dXJuICgoKGEwIF4gYTEpICYgMHhmZWZlZmVmZXUpID4+IDEpICsgKGEwICYgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGlwMjU1KHVpbnQzMl90IGEpIHsKKyAgaWYgKGEgPCAyNTYpIHsKKyAgICByZXR1cm4gYTsKKyAgfQorICAvLyByZXR1cm4gMCwgd2hlbiBhIGlzIGEgbmVnYXRpdmUgaW50ZWdlci4KKyAgLy8gcmV0dXJuIDI1NSwgd2hlbiBhIGlzIHBvc2l0aXZlLgorICByZXR1cm4gfmEgPj4gMjQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgcmV0dXJuIENsaXAyNTUoYSArIGIgLSBjKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgPj4gMjQsIGMxID4+IDI0LCBjMiA+PiAyNCk7CisgIGNvbnN0IGludCByID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDE2KSAmIDB4ZmYpOworICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbCgoYzAgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gOCkgJiAweGZmKTsKKyAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgJiAweGZmLCBjMSAmIDB4ZmYsIGMyICYgMHhmZik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihpbnQgYSwgaW50IGIpIHsKKyAgcmV0dXJuIENsaXAyNTUoYSArIChhIC0gYikgLyAyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgdWludDMyX3QgYXZlID0gQXZlcmFnZTIoYzAsIGMxKTsKKyAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoYXZlID4+IDI0LCBjMiA+PiAyNCk7CisgIGNvbnN0IGludCByID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gMTYpICYgMHhmZiwgKGMyID4+IDE2KSAmIDB4ZmYpOworICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDgpICYgMHhmZiwgKGMyID4+IDgpICYgMHhmZik7CisgIGNvbnN0IGludCBiID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gMCkgJiAweGZmLCAoYzIgPj4gMCkgJiAweGZmKTsKKyAgcmV0dXJuICgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Cit9CisKKy8vIGdjYyA8PSA0Ljkgb24gQVJNIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBpbiBTZWxlY3QoKSB3aGVuIFN1YjMoKSBpcworLy8gaW5saW5lZC4KKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmIExPQ0FMX0dDQ19WRVJTSU9OIDw9IDB4NDA5CisjIGRlZmluZSBMT0NBTF9JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9JTkxJTkUgV0VCUF9JTkxJTkUKKyNlbmRpZgorCitzdGF0aWMgTE9DQUxfSU5MSU5FIGludCBTdWIzKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgY29uc3QgaW50IHBiID0gYiAtIGM7CisgIGNvbnN0IGludCBwYSA9IGEgLSBjOworICByZXR1cm4gYWJzKHBiKSAtIGFicyhwYSk7Cit9CisKKyN1bmRlZiBMT0NBTF9JTkxJTkUKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGNvbnN0IGludCBwYV9taW51c19wYiA9CisgICAgICBTdWIzKChhID4+IDI0KSAgICAgICAsIChiID4+IDI0KSAgICAgICAsIChjID4+IDI0KSAgICAgICApICsKKyAgICAgIFN1YjMoKGEgPj4gMTYpICYgMHhmZiwgKGIgPj4gMTYpICYgMHhmZiwgKGMgPj4gMTYpICYgMHhmZikgKworICAgICAgU3ViMygoYSA+PiAgOCkgJiAweGZmLCAoYiA+PiAgOCkgJiAweGZmLCAoYyA+PiAgOCkgJiAweGZmKSArCisgICAgICBTdWIzKChhICAgICAgKSAmIDB4ZmYsIChiICAgICAgKSAmIDB4ZmYsIChjICAgICAgKSAmIDB4ZmYpOworICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVkaWN0b3JzCisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IwX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZCl0b3A7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBBUkdCX0JMQUNLOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjFfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKXRvcDsKKyAgcmV0dXJuIGxlZnQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMl9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFswXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IzX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWzFdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjRfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbLTFdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjVfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMyhsZWZ0LCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjZfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yN19DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjhfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbLTFdLCB0b3BbMF0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I5X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWzBdLCB0b3BbMV0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMF9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTFfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBTZWxlY3QodG9wWzBdLCBsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTJfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KKworR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IwX0MsIFByZWRpY3RvckFkZDBfQykKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDFfQyhjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDMyX3QgbGVmdCA9IG91dFstMV07CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBvdXRbaV0gPSBsZWZ0ID0gVlA4TEFkZFBpeGVscyhpbltpXSwgbGVmdCk7CisgIH0KKyAgKHZvaWQpdXBwZXI7Cit9CitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjJfQywgUHJlZGljdG9yQWRkMl9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IzX0MsIFByZWRpY3RvckFkZDNfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yNF9DLCBQcmVkaWN0b3JBZGQ0X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjVfQywgUHJlZGljdG9yQWRkNV9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I2X0MsIFByZWRpY3RvckFkZDZfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yN19DLCBQcmVkaWN0b3JBZGQ3X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjhfQywgUHJlZGljdG9yQWRkOF9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I5X0MsIFByZWRpY3RvckFkZDlfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMTBfQywgUHJlZGljdG9yQWRkMTBfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMTFfQywgUHJlZGljdG9yQWRkMTFfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMTJfQywgUHJlZGljdG9yQWRkMTJfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMTNfQywgUHJlZGljdG9yQWRkMTNfQykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW52ZXJzZSBwcmVkaWN0aW9uLgorc3RhdGljIHZvaWQgUHJlZGljdG9ySW52ZXJzZVRyYW5zZm9ybV9DKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBpbiwgdWludDMyX3QqIG91dCkgeworICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKKyAgaWYgKHlfc3RhcnQgPT0gMCkgeyAgLy8gRmlyc3QgUm93IGZvbGxvd3MgdGhlIEwgKG1vZGU9MSkgbW9kZS4KKyAgICBQcmVkaWN0b3JBZGQwX0MoaW4sIE5VTEwsIDEsIG91dCk7CisgICAgUHJlZGljdG9yQWRkMV9DKGluICsgMSwgTlVMTCwgd2lkdGggLSAxLCBvdXQgKyAxKTsKKyAgICBpbiArPSB3aWR0aDsKKyAgICBvdXQgKz0gd2lkdGg7CisgICAgKyt5X3N0YXJ0OworICB9CisKKyAgeworICAgIGludCB5ID0geV9zdGFydDsKKyAgICBjb25zdCBpbnQgdGlsZV93aWR0aCA9IDEgPDwgdHJhbnNmb3JtLT5iaXRzXzsKKyAgICBjb25zdCBpbnQgbWFzayA9IHRpbGVfd2lkdGggLSAxOworICAgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybS0+Yml0c18pOworICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkX21vZGVfYmFzZSA9CisgICAgICAgIHRyYW5zZm9ybS0+ZGF0YV8gKyAoeSA+PiB0cmFuc2Zvcm0tPmJpdHNfKSAqIHRpbGVzX3Blcl9yb3c7CisKKyAgICB3aGlsZSAoeSA8IHlfZW5kKSB7CisgICAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX3NyYyA9IHByZWRfbW9kZV9iYXNlOworICAgICAgaW50IHggPSAxOworICAgICAgLy8gRmlyc3QgcGl4ZWwgZm9sbG93cyB0aGUgVCAobW9kZT0yKSBtb2RlLgorICAgICAgUHJlZGljdG9yQWRkMl9DKGluLCBvdXQgLSB3aWR0aCwgMSwgb3V0KTsKKyAgICAgIC8vIC4uIHRoZSByZXN0OgorICAgICAgd2hpbGUgKHggPCB3aWR0aCkgeworICAgICAgICBjb25zdCBWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBwcmVkX2Z1bmMgPQorICAgICAgICAgICAgVlA4TFByZWRpY3RvcnNBZGRbKCgqcHJlZF9tb2RlX3NyYysrKSA+PiA4KSAmIDB4Zl07CisgICAgICAgIGludCB4X2VuZCA9ICh4ICYgfm1hc2spICsgdGlsZV93aWR0aDsKKyAgICAgICAgaWYgKHhfZW5kID4gd2lkdGgpIHhfZW5kID0gd2lkdGg7CisgICAgICAgIHByZWRfZnVuYyhpbiArIHgsIG91dCArIHggLSB3aWR0aCwgeF9lbmQgLSB4LCBvdXQgKyB4KTsKKyAgICAgICAgeCA9IHhfZW5kOworICAgICAgfQorICAgICAgaW4gKz0gd2lkdGg7CisgICAgICBvdXQgKz0gd2lkdGg7CisgICAgICArK3k7CisgICAgICBpZiAoKHkgJiBtYXNrKSA9PSAwKSB7ICAgLy8gVXNlIHRoZSBzYW1lIG1hc2ssIHNpbmNlIHRpbGVzIGFyZSBzcXVhcmVzLgorICAgICAgICBwcmVkX21vZGVfYmFzZSArPSB0aWxlc19wZXJfcm93OworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCisvLyAnc3VidHJhY3QgZ3JlZW4nKS4KK3ZvaWQgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gc3JjW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKChhcmdiID4+IDgpICYgMHhmZik7CisgICAgdWludDMyX3QgcmVkX2JsdWUgPSAoYXJnYiAmIDB4MDBmZjAwZmZ1KTsKKyAgICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47CisgICAgcmVkX2JsdWUgJj0gMHgwMGZmMDBmZnU7CisgICAgZHN0W2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCByZWRfYmx1ZTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OF90IGNvbG9yX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IGNvbG9yKSB7CisgIHJldHVybiAoKGludCljb2xvcl9wcmVkICogY29sb3IpID4+IDU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbG9yQ29kZVRvTXVsdGlwbGllcnModWludDMyX3QgY29sb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIG0tPmdyZWVuX3RvX3JlZF8gID0gKGNvbG9yX2NvZGUgPj4gIDApICYgMHhmZjsKKyAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAoY29sb3JfY29kZSA+PiAgOCkgJiAweGZmOworICBtLT5yZWRfdG9fYmx1ZV8gICA9IChjb2xvcl9jb2RlID4+IDE2KSAmIDB4ZmY7Cit9CisKK3ZvaWQgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBzcmNbaV07CisgICAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgICAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKKyAgICBpbnQgbmV3X3JlZCA9IHJlZCAmIDB4ZmY7CisgICAgaW50IG5ld19ibHVlID0gYXJnYiAmIDB4ZmY7CisgICAgbmV3X3JlZCArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKKyAgICBuZXdfcmVkICY9IDB4ZmY7CisgICAgbmV3X2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOworICAgIG5ld19ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCBuZXdfcmVkKTsKKyAgICBuZXdfYmx1ZSAmPSAweGZmOworICAgIGRzdFtpXSA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKKyAgfQorfQorCisvLyBDb2xvciBzcGFjZSBpbnZlcnNlIHRyYW5zZm9ybS4KK3N0YXRpYyB2b2lkIENvbG9yU3BhY2VJbnZlcnNlVHJhbnNmb3JtX0MoY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLCB1aW50MzJfdCogZHN0KSB7CisgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOworICBjb25zdCBpbnQgdGlsZV93aWR0aCA9IDEgPDwgdHJhbnNmb3JtLT5iaXRzXzsKKyAgY29uc3QgaW50IG1hc2sgPSB0aWxlX3dpZHRoIC0gMTsKKyAgY29uc3QgaW50IHNhZmVfd2lkdGggPSB3aWR0aCAmIH5tYXNrOworICBjb25zdCBpbnQgcmVtYWluaW5nX3dpZHRoID0gd2lkdGggLSBzYWZlX3dpZHRoOworICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB0cmFuc2Zvcm0tPmJpdHNfKTsKKyAgaW50IHkgPSB5X3N0YXJ0OworICBjb25zdCB1aW50MzJfdCogcHJlZF9yb3cgPQorICAgICAgdHJhbnNmb3JtLT5kYXRhXyArICh5ID4+IHRyYW5zZm9ybS0+Yml0c18pICogdGlsZXNfcGVyX3JvdzsKKworICB3aGlsZSAoeSA8IHlfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QqIHByZWQgPSBwcmVkX3JvdzsKKyAgICBWUDhMTXVsdGlwbGllcnMgbSA9IHsgMCwgMCwgMCB9OworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfc2FmZV9lbmQgPSBzcmMgKyBzYWZlX3dpZHRoOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgd2lkdGg7CisgICAgd2hpbGUgKHNyYyA8IHNyY19zYWZlX2VuZCkgeworICAgICAgQ29sb3JDb2RlVG9NdWx0aXBsaWVycygqcHJlZCsrLCAmbSk7CisgICAgICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlKCZtLCBzcmMsIHRpbGVfd2lkdGgsIGRzdCk7CisgICAgICBzcmMgKz0gdGlsZV93aWR0aDsKKyAgICAgIGRzdCArPSB0aWxlX3dpZHRoOworICAgIH0KKyAgICBpZiAoc3JjIDwgc3JjX2VuZCkgeyAgLy8gTGVmdC1vdmVycyB1c2luZyBDLXZlcnNpb24uCisgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKCpwcmVkKyssICZtKTsKKyAgICAgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UoJm0sIHNyYywgcmVtYWluaW5nX3dpZHRoLCBkc3QpOworICAgICAgc3JjICs9IHJlbWFpbmluZ193aWR0aDsKKyAgICAgIGRzdCArPSByZW1haW5pbmdfd2lkdGg7CisgICAgfQorICAgICsreTsKKyAgICBpZiAoKHkgJiBtYXNrKSA9PSAwKSBwcmVkX3JvdyArPSB0aWxlc19wZXJfcm93OworICB9Cit9CisKKy8vIFNlcGFyYXRlIG91dCBwaXhlbHMgcGFja2VkIHRvZ2V0aGVyIHVzaW5nIHBpeGVsLWJ1bmRsaW5nLgorLy8gV2UgZGVmaW5lIHR3byBtZXRob2RzIGZvciBBUkdCIGRhdGEgKHVpbnQzMl90KSBhbmQgYWxwaGEtb25seSBkYXRhICh1aW50OF90KS4KKyNkZWZpbmUgQ09MT1JfSU5ERVhfSU5WRVJTRShGVU5DX05BTUUsIEZfTkFNRSwgU1RBVElDX0RFQ0wsIFRZUEUsIEJJVF9TVUZGSVgsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0lOREVYLCBHRVRfVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRl9OQU1FKGNvbnN0IFRZUEUqIHNyYywgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBUWVBFKiBkc3QsIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIGludCB3aWR0aCkgeyAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtHRVRfSU5ERVgoKnNyYysrKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1NUQVRJQ19ERUNMIHZvaWQgRlVOQ19OQU1FKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCBjb25zdCBUWVBFKiBzcmMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSogZHN0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBiaXRzX3Blcl9waXhlbCA9IDggPj4gdHJhbnNmb3JtLT5iaXRzXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCA9IHRyYW5zZm9ybS0+ZGF0YV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChiaXRzX3Blcl9waXhlbCA8IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBwaXhlbHNfcGVyX2J5dGUgPSAxIDw8IHRyYW5zZm9ybS0+Yml0c187ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgY291bnRfbWFzayA9IHBpeGVsc19wZXJfYnl0ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgYml0X21hc2sgPSAoMSA8PCBiaXRzX3Blcl9waXhlbCkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeSA9IHlfc3RhcnQ7IHkgPCB5X2VuZDsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVpbnQzMl90IHBhY2tlZF9waXhlbHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogV2UgbmVlZCB0byBsb2FkIGZyZXNoICdwYWNrZWRfcGl4ZWxzJyBvbmNlIGV2ZXJ5ICAgICAgICAgICAgICAgICovICBcCisgICAgICAgIC8qICdwaXhlbHNfcGVyX2J5dGUnIGluY3JlbWVudHMgb2YgeC4gRm9ydHVuYXRlbHksIHBpeGVsc19wZXJfYnl0ZSAqLyAgXAorICAgICAgICAvKiBpcyBhIHBvd2VyIG9mIDIsIHNvIGNhbiBqdXN0IHVzZSBhIG1hc2sgZm9yIHRoYXQsIGluc3RlYWQgb2YgICAgKi8gIFwKKyAgICAgICAgLyogZGVjcmVtZW50aW5nIGEgY291bnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICBcCisgICAgICAgIGlmICgoeCAmIGNvdW50X21hc2spID09IDApIHBhY2tlZF9waXhlbHMgPSBHRVRfSU5ERVgoKnNyYysrKTsgICAgICAgICAgXAorICAgICAgICAqZHN0KysgPSBHRVRfVkFMVUUoY29sb3JfbWFwW3BhY2tlZF9waXhlbHMgJiBiaXRfbWFza10pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGFja2VkX3BpeGVscyA+Pj0gYml0c19wZXJfcGl4ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TE1hcENvbG9yIyNCSVRfU1VGRklYKHNyYywgY29sb3JfbWFwLCBkc3QsIHlfc3RhcnQsIHlfZW5kLCB3aWR0aCk7ICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQ09MT1JfSU5ERVhfSU5WRVJTRShDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybV9DLCBNYXBBUkdCX0MsIHN0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIDMyYiwgVlA4R2V0QVJHQkluZGV4LCBWUDhHZXRBUkdCVmFsdWUpCitDT0xPUl9JTkRFWF9JTlZFUlNFKFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhLCBNYXBBbHBoYV9DLCAsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QsIDhiLCBWUDhHZXRBbHBoYUluZGV4LCBWUDhHZXRBbHBoYVZhbHVlKQorCisjdW5kZWYgQ09MT1JfSU5ERVhfSU5WRVJTRQorCit2b2lkIFZQOExJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiwgdWludDMyX3QqIGNvbnN0IG91dCkgeworICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKKyAgYXNzZXJ0KHJvd19zdGFydCA8IHJvd19lbmQpOworICBhc3NlcnQocm93X2VuZCA8PSB0cmFuc2Zvcm0tPnlzaXplXyk7CisgIHN3aXRjaCAodHJhbnNmb3JtLT50eXBlXykgeworICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46CisgICAgICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQoaW4sIChyb3dfZW5kIC0gcm93X3N0YXJ0KSAqIHdpZHRoLCBvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVESUNUT1JfVFJBTlNGT1JNOgorICAgICAgUHJlZGljdG9ySW52ZXJzZVRyYW5zZm9ybV9DKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBpbiwgb3V0KTsKKyAgICAgIGlmIChyb3dfZW5kICE9IHRyYW5zZm9ybS0+eXNpemVfKSB7CisgICAgICAgIC8vIFRoZSBsYXN0IHByZWRpY3RlZCByb3cgaW4gdGhpcyBpdGVyYXRpb24gd2lsbCBiZSB0aGUgdG9wLXByZWQgcm93CisgICAgICAgIC8vIGZvciB0aGUgZmlyc3Qgcm93IGluIG5leHQgaXRlcmF0aW9uLgorICAgICAgICBtZW1jcHkob3V0IC0gd2lkdGgsIG91dCArIChyb3dfZW5kIC0gcm93X3N0YXJ0IC0gMSkgKiB3aWR0aCwKKyAgICAgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCpvdXQpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgorICAgICAgQ29sb3JTcGFjZUludmVyc2VUcmFuc2Zvcm1fQyh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgaW4sIG91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STToKKyAgICAgIGlmIChpbiA9PSBvdXQgJiYgdHJhbnNmb3JtLT5iaXRzXyA+IDApIHsKKyAgICAgICAgLy8gTW92ZSBwYWNrZWQgcGl4ZWxzIHRvIHRoZSBlbmQgb2YgdW5wYWNrZWQgcmVnaW9uLCBzbyB0aGF0IHVucGFja2luZworICAgICAgICAvLyBjYW4gb2NjdXIgc2VhbWxlc3NseS4KKyAgICAgICAgLy8gQWxzbywgbm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdHJhbnNmb3JtIHRoYXQgYXBwbGllcyBvbgorICAgICAgICAvLyB0aGUgZWZmZWN0aXZlIHdpZHRoIG9mIFZQOExTdWJTYW1wbGVTaXplKHhzaXplXywgYml0c18pLiBBbGwgb3RoZXIKKyAgICAgICAgLy8gdHJhbnNmb3JtcyB3b3JrIG9uIGVmZmVjdGl2ZSB3aWR0aCBvZiB4c2l6ZV8uCisgICAgICAgIGNvbnN0IGludCBvdXRfc3RyaWRlID0gKHJvd19lbmQgLSByb3dfc3RhcnQpICogd2lkdGg7CisgICAgICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKgorICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIHRyYW5zZm9ybS0+Yml0c18pOworICAgICAgICB1aW50MzJfdCogY29uc3Qgc3JjID0gb3V0ICsgb3V0X3N0cmlkZSAtIGluX3N0cmlkZTsKKyAgICAgICAgbWVtbW92ZShzcmMsIG91dCwgaW5fc3RyaWRlICogc2l6ZW9mKCpzcmMpKTsKKyAgICAgICAgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1fQyh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgc3JjLCBvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1fQyh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgaW4sIG91dCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KKworc3RhdGljIGludCBpc19iaWdfZW5kaWFuKHZvaWQpIHsKKyAgc3RhdGljIGNvbnN0IHVuaW9uIHsKKyAgICB1aW50MTZfdCB3OworICAgIHVpbnQ4X3QgYlsyXTsKKyAgfSB0bXAgPSB7IDEgfTsKKyAgcmV0dXJuICh0bXAuYlswXSAhPSAxKTsKK30KKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgfQorfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKKyAgfQorfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICBjb25zdCB1aW50OF90IHJnID0gKChhcmdiID4+IDE2KSAmIDB4ZjApIHwgKChhcmdiID4+IDEyKSAmIDB4Zik7CisgICAgY29uc3QgdWludDhfdCBiYSA9ICgoYXJnYiA+PiAgMCkgJiAweGYwKSB8ICgoYXJnYiA+PiAyOCkgJiAweGYpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgKmRzdCsrID0gYmE7CisgICAgKmRzdCsrID0gcmc7CisjZWxzZQorICAgICpkc3QrKyA9IHJnOworICAgICpkc3QrKyA9IGJhOworI2VuZGlmCisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQjU2NV9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICBjb25zdCB1aW50OF90IHJnID0gKChhcmdiID4+IDE2KSAmIDB4ZjgpIHwgKChhcmdiID4+IDEzKSAmIDB4Nyk7CisgICAgY29uc3QgdWludDhfdCBnYiA9ICgoYXJnYiA+PiAgNSkgJiAweGUwKSB8ICgoYXJnYiA+PiAgMykgJiAweDFmKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICpkc3QrKyA9IGdiOworICAgICpkc3QrKyA9IHJnOworI2Vsc2UKKyAgICAqZHN0KysgPSByZzsKKyAgICAqZHN0KysgPSBnYjsKKyNlbmRpZgorICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9CR1JfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29weU9yU3dhcChjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3dhcF9vbl9iaWdfZW5kaWFuKSB7CisgIGlmIChpc19iaWdfZW5kaWFuKCkgPT0gc3dhcF9vbl9iaWdfZW5kaWFuKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICAgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgQlN3YXAzMihhcmdiKSk7CisgICAgICBkc3QgKz0gc2l6ZW9mKGFyZ2IpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIG51bV9waXhlbHMgKiBzaXplb2YoKnNyYykpOworICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRGcm9tQkdSQShjb25zdCB1aW50MzJfdCogY29uc3QgaW5fZGF0YSwgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DU1BfTU9ERSBvdXRfY29sb3JzcGFjZSwgdWludDhfdCogY29uc3QgcmdiYSkgeworICBzd2l0Y2ggKG91dF9jb2xvcnNwYWNlKSB7CisgICAgY2FzZSBNT0RFX1JHQjoKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1JHQkE6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkEoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfcmdiQToKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMCwgbnVtX3BpeGVscywgMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQkdSOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9CR1IoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQkdSQToKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfYmdyQToKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMSk7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KHJnYmEsIDAsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX0FSR0I6CisgICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX0FyZ2I6CisgICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDApOworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAxLCBudW1fcGl4ZWxzLCAxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9SR0JBXzQ0NDQ6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX3JnYkFfNDQ0NDoKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NChyZ2JhLCBudW1fcGl4ZWxzLCAxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9SR0JfNTY1OgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjUoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KDApOyAgICAgICAgICAvLyBDb2RlIGZsb3cgc2hvdWxkIG5vdCByZWFjaCBoZXJlLgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQOExQcm9jZXNzRGVjQmx1ZUFuZFJlZEZ1bmMgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkOworVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNBZGRbMTZdOworVlA4TFByZWRpY3RvckZ1bmMgVlA4TFByZWRpY3RvcnNbMTZdOworCisvLyBleHBvc2VkIHBsYWluLUMgaW1wbGVtZW50YXRpb25zCitWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc0FkZF9DWzE2XTsKK1ZQOExQcmVkaWN0b3JGdW5jIFZQOExQcmVkaWN0b3JzX0NbMTZdOworCitWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlRnVuYyBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlOworCitWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0I7CitWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0JBOworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQ7CitWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjU7CitWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9CR1I7CisKK1ZQOExNYXBBUkdCRnVuYyBWUDhMTWFwQ29sb3IzMmI7CitWUDhMTWFwQWxwaGFGdW5jIFZQOExNYXBDb2xvcjhiOworCitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TVNBKHZvaWQpOworCisjZGVmaW5lIENPUFlfUFJFRElDVE9SX0FSUkFZKElOLCBPVVQpIGRvIHsgICAgICAgICAgICAgICAgXAorICAoT1VUKVswXSA9IElOIyMwX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMV0gPSBJTiMjMV9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzJdID0gSU4jIzJfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVszXSA9IElOIyMzX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbNF0gPSBJTiMjNF9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzVdID0gSU4jIzVfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs2XSA9IElOIyM2X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbN10gPSBJTiMjN19DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzhdID0gSU4jIzhfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs5XSA9IElOIyM5X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMTBdID0gSU4jIzEwX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzExXSA9IElOIyMxMV9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxMl0gPSBJTiMjMTJfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMTNdID0gSU4jIzEzX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzE0XSA9IElOIyMwX0M7IC8qIDwtIHBhZGRpbmcgc2VjdXJpdHkgc2VudGluZWxzKi8gXAorICAoT1VUKVsxNV0gPSBJTiMjMF9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApOworCitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4TERzcEluaXQpIHsKKyAgQ09QWV9QUkVESUNUT1JfQVJSQVkoUHJlZGljdG9yLCBWUDhMUHJlZGljdG9ycykKKyAgQ09QWV9QUkVESUNUT1JfQVJSQVkoUHJlZGljdG9yLCBWUDhMUHJlZGljdG9yc19DKQorICBDT1BZX1BSRURJQ1RPUl9BUlJBWShQcmVkaWN0b3JBZGQsIFZQOExQcmVkaWN0b3JzQWRkKQorICBDT1BZX1BSRURJQ1RPUl9BUlJBWShQcmVkaWN0b3JBZGQsIFZQOExQcmVkaWN0b3JzQWRkX0MpCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DOworCisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0M7CisKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gVlA4TENvbnZlcnRCR1JBVG9SR0JBX0M7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gVlA4TENvbnZlcnRCR1JBVG9SR0JfQzsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBWUDhMQ29udmVydEJHUkFUb0JHUl9DOworI2VuZGlmCisKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NCA9IFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfQzsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjUgPSBWUDhMQ29udmVydEJHUkFUb1JHQjU2NV9DOworCisgIFZQOExNYXBDb2xvcjMyYiA9IE1hcEFSR0JfQzsKKyAgVlA4TE1hcENvbG9yOGIgPSBNYXBBbHBoYV9DOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhMRHNwSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhMRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBWUDhMRHNwSW5pdE1TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgVlA4TERzcEluaXRORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbnZlcnRCR1JBVG9SR0JBICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbnZlcnRCR1JBVG9SR0IgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29udmVydEJHUkFUb0JHUiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29udmVydEJHUkFUb1JHQjU2NSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExNYXBDb2xvcjMyYiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExNYXBDb2xvcjhiICE9IE5VTEwpOworfQorI3VuZGVmIENPUFlfUFJFRElDVE9SX0FSUkFZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiYmRmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuaApAQCAtMCwwICsxLDIyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfTE9TU0xFU1NfSF8KKyNkZWZpbmUgV0VCUF9EU1BfTE9TU0xFU1NfSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCisKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjb2RpbmcKKwordHlwZWRlZiB1aW50MzJfdCAoKlZQOExQcmVkaWN0b3JGdW5jKSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKTsKK2V4dGVybiBWUDhMUHJlZGljdG9yRnVuYyBWUDhMUHJlZGljdG9yc1sxNl07CitleHRlcm4gVlA4TFByZWRpY3RvckZ1bmMgVlA4TFByZWRpY3RvcnNfQ1sxNl07CisvLyBUaGVzZSBBZGQvU3ViIGZ1bmN0aW9uIGV4cGVjdHMgdXBwZXJbLTFdIGFuZCBvdXRbLTFdIHRvIGJlIHJlYWRhYmxlLgordHlwZWRlZiB2b2lkICgqVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMpKGNvbnN0IHVpbnQzMl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdXBwZXIsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpOworZXh0ZXJuIFZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzQWRkWzE2XTsKK2V4dGVybiBWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc0FkZF9DWzE2XTsKKwordHlwZWRlZiB2b2lkICgqVlA4TFByb2Nlc3NEZWNCbHVlQW5kUmVkRnVuYykoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogZHN0KTsKK2V4dGVybiBWUDhMUHJvY2Vzc0RlY0JsdWVBbmRSZWRGdW5jIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBOb3RlOiB0aGUgbWVtYmVycyBhcmUgdWludDhfdCwgc28gdGhhdCBhbnkgbmVnYXRpdmUgdmFsdWVzIGFyZQorICAvLyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byAibW9kIDI1NiIgdmFsdWVzLgorICB1aW50OF90IGdyZWVuX3RvX3JlZF87CisgIHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZV87CisgIHVpbnQ4X3QgcmVkX3RvX2JsdWVfOworfSBWUDhMTXVsdGlwbGllcnM7Cit0eXBlZGVmIHZvaWQgKCpWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlRnVuYykoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBkc3QpOworZXh0ZXJuIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VGdW5jIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2U7CisKK3N0cnVjdCBWUDhMVHJhbnNmb3JtOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KKworLy8gUGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gb2YgZGF0YSBnaXZlbiB0cmFuc2Zvcm0gaW5mb3JtYXRpb24sIHN0YXJ0IGFuZCBlbmQKKy8vIHJvd3MuIFRyYW5zZm9ybSB3aWxsIGJlIGFwcGxpZWQgdG8gcm93cyBbcm93X3N0YXJ0LCByb3dfZW5kWy4KKy8vIFRoZSAqaW4gYW5kICpvdXQgcG9pbnRlcnMgcmVmZXIgdG8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkYXRhIHJlc3BlY3RpdmVseQorLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJtZWRpYXRlIHJvdyAocm93X3N0YXJ0KS4KK3ZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiwgdWludDMyX3QqIGNvbnN0IG91dCk7CisKKy8vIENvbG9yIHNwYWNlIGNvbnZlcnNpb24uCit0eXBlZGVmIHZvaWQgKCpWUDhMQ29udmVydEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0JBOworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0OworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjU2NTsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9CR1I7CisKKy8vIENvbnZlcnRzIGZyb20gQkdSQSB0byBvdGhlciBjb2xvciBzcGFjZXMuCit2b2lkIFZQOExDb252ZXJ0RnJvbUJHUkEoY29uc3QgdWludDMyX3QqIGNvbnN0IGluX2RhdGEsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ1NQX01PREUgb3V0X2NvbG9yc3BhY2UsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpOworCit0eXBlZGVmIHZvaWQgKCpWUDhMTWFwQVJHQkZ1bmMpKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCB5X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9lbmQsIGludCB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhMTWFwQWxwaGFGdW5jKShjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgeV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X2VuZCwgaW50IHdpZHRoKTsKKworZXh0ZXJuIFZQOExNYXBBUkdCRnVuYyBWUDhMTWFwQ29sb3IzMmI7CitleHRlcm4gVlA4TE1hcEFscGhhRnVuYyBWUDhMTWFwQ29sb3I4YjsKKworLy8gU2ltaWxhciB0byB0aGUgc3RhdGljIG1ldGhvZCBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSgpIHRoYXQgaXMgcGFydCBvZgorLy8gbG9zc2xlc3MuYywgYnV0IHVzZWQgb25seSBmb3IgYWxwaGEgZGVjb2RpbmcuIEl0IHRha2VzIHVpbnQ4X3QgKHJhdGhlciB0aGFuCisvLyB1aW50MzJfdCkgYXJndW1lbnRzIGZvciAnc3JjJyBhbmQgJ2RzdCcuCit2b2lkIFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhKAorICAgIGNvbnN0IHN0cnVjdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsCisgICAgY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpOworCisvLyBFeHBvc2Ugc29tZSBDLW9ubHkgZmFsbGJhY2sgZnVuY3Rpb25zCit2b2lkIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpOworCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCX0MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0X0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQjU2NV9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOExDb252ZXJ0QkdSQVRvQkdSX0MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBhYm92ZSBtZXRob2RzLgordm9pZCBWUDhMRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kaW5nCisKK3R5cGVkZWYgdm9pZCAoKlZQOExQcm9jZXNzRW5jQmx1ZUFuZFJlZEZ1bmMpKHVpbnQzMl90KiBkc3QsIGludCBudW1fcGl4ZWxzKTsKK2V4dGVybiBWUDhMUHJvY2Vzc0VuY0JsdWVBbmRSZWRGdW5jIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQ7Cit0eXBlZGVmIHZvaWQgKCpWUDhMVHJhbnNmb3JtQ29sb3JGdW5jKShjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgbnVtX3BpeGVscyk7CitleHRlcm4gVlA4TFRyYW5zZm9ybUNvbG9yRnVuYyBWUDhMVHJhbnNmb3JtQ29sb3I7Cit0eXBlZGVmIHZvaWQgKCpWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNGdW5jKSgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsIGludCBoaXN0b1tdKTsKK2V4dGVybiBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNGdW5jIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtczsKKwordHlwZWRlZiB2b2lkICgqVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNGdW5jKSgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIGludCBncmVlbl90b19yZWQsIGludCBoaXN0b1tdKTsKK2V4dGVybiBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXM7CisKKy8vIEV4cG9zZSBzb21lIEMtb25seSBmYWxsYmFjayBmdW5jdGlvbnMKK3ZvaWQgVlA4TFRyYW5zZm9ybUNvbG9yX0MoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGF0YSwgaW50IG51bV9waXhlbHMpOwordm9pZCBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0ModWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpOwordm9pZCBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pOwordm9pZCBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pOworCitleHRlcm4gVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNTdWJbMTZdOworZXh0ZXJuIFZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzU3ViX0NbMTZdOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSHVmZm1hbi1jb3N0IHJlbGF0ZWQgZnVuY3Rpb25zLgorCit0eXBlZGVmIGRvdWJsZSAoKlZQOExDb3N0RnVuYykoY29uc3QgdWludDMyX3QqIHBvcHVsYXRpb24sIGludCBsZW5ndGgpOwordHlwZWRlZiBkb3VibGUgKCpWUDhMQ29zdENvbWJpbmVkRnVuYykoY29uc3QgdWludDMyX3QqIFgsIGNvbnN0IHVpbnQzMl90KiBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7Cit0eXBlZGVmIGZsb2F0ICgqVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHlGdW5jKShjb25zdCBpbnQgWFsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IFlbMjU2XSk7CisKK2V4dGVybiBWUDhMQ29zdEZ1bmMgVlA4TEV4dHJhQ29zdDsKK2V4dGVybiBWUDhMQ29zdENvbWJpbmVkRnVuYyBWUDhMRXh0cmFDb3N0Q29tYmluZWQ7CitleHRlcm4gVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHlGdW5jIFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5OworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAvLyBzbWFsbCBzdHJ1Y3QgdG8gaG9sZCBjb3VudGVycworICBpbnQgY291bnRzWzJdOyAgICAgICAgLy8gaW5kZXg6IDA9emVybyBzdGVhaywgMT1ub24temVybyBzdHJlYWsKKyAgaW50IHN0cmVha3NbMl1bMl07ICAgIC8vIFt6ZXJvL25vbi16ZXJvXVtzdHJlYWs8MyAvIHN0cmVhaz49M10KK30gVlA4TFN0cmVha3M7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAvLyBzbWFsbCBzdHJ1Y3QgdG8gaG9sZCBiaXQgZW50cm9weSByZXN1bHRzCisgIGRvdWJsZSBlbnRyb3B5OyAgICAgICAgICAgLy8gZW50cm9weQorICB1aW50MzJfdCBzdW07ICAgICAgICAgICAgIC8vIHN1bSBvZiB0aGUgcG9wdWxhdGlvbgorICBpbnQgbm9uemVyb3M7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBub24temVybyBlbGVtZW50cyBpbiB0aGUgcG9wdWxhdGlvbgorICB1aW50MzJfdCBtYXhfdmFsOyAgICAgICAgIC8vIG1heGltdW0gdmFsdWUgaW4gdGhlIHBvcHVsYXRpb24KKyAgdWludDMyX3Qgbm9uemVyb19jb2RlOyAgICAvLyBpbmRleCBvZiB0aGUgbGFzdCBub24temVybyBpbiB0aGUgcG9wdWxhdGlvbgorfSBWUDhMQml0RW50cm9weTsKKwordm9pZCBWUDhMQml0RW50cm9weUluaXQoVlA4TEJpdEVudHJvcHkqIGNvbnN0IGVudHJvcHkpOworCisvLyBHZXQgdGhlIGNvbWJpbmVkIHN5bWJvbCBiaXQgZW50cm9weSBhbmQgSHVmZm1hbiBjb3N0IHN0YXRzIGZvciB0aGUKKy8vIGRpc3RyaWJ1dGlvbnMgJ1gnIGFuZCAnWScuIFRob3NlIHJlc3VsdHMgY2FuIHRoZW4gYmUgcmVmaW5lZCBhY2NvcmRpbmcgdG8KKy8vIGNvZGVjIHNwZWNpZmljIGhldXJpc3RpY3MuCit0eXBlZGVmIHZvaWQgKCpWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkRnVuYykoCisgICAgY29uc3QgdWludDMyX3QgWFtdLCBjb25zdCB1aW50MzJfdCBZW10sIGludCBsZW5ndGgsCisgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LCBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpOworZXh0ZXJuIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRGdW5jIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQ7CisKKy8vIEdldCB0aGUgZW50cm9weSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAnWCcuCit0eXBlZGVmIHZvaWQgKCpWUDhMR2V0RW50cm9weVVucmVmaW5lZEZ1bmMpKGNvbnN0IHVpbnQzMl90IFhbXSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpOworZXh0ZXJuIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkRnVuYyBWUDhMR2V0RW50cm9weVVucmVmaW5lZDsKKwordm9pZCBWUDhMQml0c0VudHJvcHlVbnJlZmluZWQoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5KTsKKwordHlwZWRlZiB2b2lkICgqVlA4TEhpc3RvZ3JhbUFkZEZ1bmMpKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQpOworZXh0ZXJuIFZQOExIaXN0b2dyYW1BZGRGdW5jIFZQOExIaXN0b2dyYW1BZGQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVmaXhFbmNvZGUoKQorCit0eXBlZGVmIGludCAoKlZQOExWZWN0b3JNaXNtYXRjaEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsIGludCBsZW5ndGgpOworLy8gUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggd2hlcmUgYXJyYXkxIGFuZCBhcnJheTIgYXJlIGRpZmZlcmVudC4KK2V4dGVybiBWUDhMVmVjdG9yTWlzbWF0Y2hGdW5jIFZQOExWZWN0b3JNaXNtYXRjaDsKKwordHlwZWRlZiB2b2lkICgqVlA4TEJ1bmRsZUNvbG9yTWFwRnVuYykoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBkc3QpOworZXh0ZXJuIFZQOExCdW5kbGVDb2xvck1hcEZ1bmMgVlA4TEJ1bmRsZUNvbG9yTWFwOwordm9pZCBWUDhMQnVuZGxlQ29sb3JNYXBfQyhjb25zdCB1aW50OF90KiBjb25zdCByb3csIGludCB3aWR0aCwgaW50IHhiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBhYm92ZSBtZXRob2RzLgordm9pZCBWUDhMRW5jRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRFNQX0xPU1NMRVNTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY0OGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19jb21tb24uaApAQCAtMCwwICsxLDIwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX0xPU1NMRVNTX0NPTU1PTl9IXworI2RlZmluZSBXRUJQX0RTUF9MT1NTTEVTU19DT01NT05fSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjb2RpbmcKKworLy8gY29sb3IgbWFwcGluZyByZWxhdGVkIGZ1bmN0aW9ucy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXRBUkdCSW5kZXgodWludDMyX3QgaWR4KSB7CisgIHJldHVybiAoaWR4ID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVlA4R2V0QWxwaGFJbmRleCh1aW50OF90IGlkeCkgeworICByZXR1cm4gaWR4OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4R2V0QVJHQlZhbHVlKHVpbnQzMl90IHZhbCkgeworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBWUDhHZXRBbHBoYVZhbHVlKHVpbnQzMl90IHZhbCkgeworICByZXR1cm4gKHZhbCA+PiA4KSAmIDB4ZmY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNaXNjIG1ldGhvZHMuCisKKy8vIENvbXB1dGVzIHNhbXBsZWQgc2l6ZSBvZiAnc2l6ZScgd2hlbiBzYW1wbGluZyB1c2luZyAnc2FtcGxpbmcgYml0cycuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlNhbXBsZVNpemUodWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ19iaXRzKSB7CisgIHJldHVybiAoc2l6ZSArICgxIDw8IHNhbXBsaW5nX2JpdHMpIC0gMSkgPj4gc2FtcGxpbmdfYml0czsKK30KKworLy8gQ29udmVydHMgbmVhciBsb3NzbGVzcyBxdWFsaXR5IGludG8gbWF4IG51bWJlciBvZiBiaXRzIHNoYXZlZCBvZmYuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExOZWFyTG9zc2xlc3NCaXRzKGludCBuZWFyX2xvc3NsZXNzX3F1YWxpdHkpIHsKKyAgLy8gICAgMTAwIC0+IDAKKyAgLy8gODAuLjk5IC0+IDEKKyAgLy8gNjAuLjc5IC0+IDIKKyAgLy8gNDAuLjU5IC0+IDMKKyAgLy8gMjAuLjM5IC0+IDQKKyAgLy8gIDAuLjE5IC0+IDUKKyAgcmV0dXJuIDUgLSBuZWFyX2xvc3NsZXNzX3F1YWxpdHkgLyAyMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhc3RlciBsb2dhcml0aG0gZm9yIGludGVnZXJzLiBTbWFsbCB2YWx1ZXMgdXNlIGEgbG9vay11cCB0YWJsZS4KKworLy8gVGhlIHRocmVzaG9sZCB0aWxsIGFwcHJveGltYXRlIHZlcnNpb24gb2YgbG9nXzIgY2FuIGJlIHVzZWQuCisvLyBQcmFjdGljYWxseSwgd2UgY2FuIGdldCByaWQgb2YgdGhlIGNhbGwgdG8gbG9nKCkgYXMgdGhlIHR3byB2YWx1ZXMgbWF0Y2ggdG8KKy8vIHZlcnkgaGlnaCBkZWdyZWUgKHRoZSByYXRpbyBvZiB0aGVzZSB0d28gaXMgMC45OTk5OXgpLgorLy8gS2VlcGluZyBhIGhpZ2ggdGhyZXNob2xkIGZvciBub3cuCisjZGVmaW5lIEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCAgNjU1MzYKKyNkZWZpbmUgQVBQUk9YX0xPR19NQVggICAgICAgICAgICAgICAgICAgNDA5NgorI2RlZmluZSBMT0dfMl9SRUNJUFJPQ0FMIDEuNDQyNjk1MDQwODg4OTYzMzg3MDA0NjUwOTQwMDcwODYKKyNkZWZpbmUgTE9HX0xPT0tVUF9JRFhfTUFYIDI1NgorZXh0ZXJuIGNvbnN0IGZsb2F0IGtMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXTsKK2V4dGVybiBjb25zdCBmbG9hdCBrU0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdOwordHlwZWRlZiBmbG9hdCAoKlZQOExGYXN0TG9nMlNsb3dGdW5jKSh1aW50MzJfdCB2KTsKKworZXh0ZXJuIFZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0TG9nMlNsb3c7CitleHRlcm4gVlA4TEZhc3RMb2cyU2xvd0Z1bmMgVlA4TEZhc3RTTG9nMlNsb3c7CisKK3N0YXRpYyBXRUJQX0lOTElORSBmbG9hdCBWUDhMRmFzdExvZzIodWludDMyX3QgdikgeworICByZXR1cm4gKHYgPCBMT0dfTE9PS1VQX0lEWF9NQVgpID8ga0xvZzJUYWJsZVt2XSA6IFZQOExGYXN0TG9nMlNsb3codik7Cit9CisvLyBGYXN0IGNhbGN1bGF0aW9uIG9mIHYgKiBsb2cyKHYpIGZvciBpbnRlZ2VyIGlucHV0Lgorc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0U0xvZzIodWludDMyX3QgdikgeworICByZXR1cm4gKHYgPCBMT0dfTE9PS1VQX0lEWF9NQVgpID8ga1NMb2cyVGFibGVbdl0gOiBWUDhMRmFzdFNMb2cyU2xvdyh2KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWZpeEVuY29kZSgpCisKKy8vIFNwbGl0dGluZyBvZiBkaXN0YW5jZSBhbmQgbGVuZ3RoIGNvZGVzIGludG8gcHJlZml4ZXMgYW5kCisvLyBleHRyYSBiaXRzLiBUaGUgcHJlZml4ZXMgYXJlIGVuY29kZWQgd2l0aCBhbiBlbnRyb3B5IGNvZGUKKy8vIHdoaWxlIHRoZSBleHRyYSBiaXRzIGFyZSBzdG9yZWQganVzdCBhcyBub3JtYWwgYml0cy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQcmVmaXhFbmNvZGVCaXRzTm9MVVQoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0cykgeworICBjb25zdCBpbnQgaGlnaGVzdF9iaXQgPSBCaXRzTG9nMkZsb29yKC0tZGlzdGFuY2UpOworICBjb25zdCBpbnQgc2Vjb25kX2hpZ2hlc3RfYml0ID0gKGRpc3RhbmNlID4+IChoaWdoZXN0X2JpdCAtIDEpKSAmIDE7CisgICpleHRyYV9iaXRzID0gaGlnaGVzdF9iaXQgLSAxOworICAqY29kZSA9IDIgKiBoaWdoZXN0X2JpdCArIHNlY29uZF9oaWdoZXN0X2JpdDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFByZWZpeEVuY29kZU5vTFVUKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHNfdmFsdWUpIHsKKyAgY29uc3QgaW50IGhpZ2hlc3RfYml0ID0gQml0c0xvZzJGbG9vcigtLWRpc3RhbmNlKTsKKyAgY29uc3QgaW50IHNlY29uZF9oaWdoZXN0X2JpdCA9IChkaXN0YW5jZSA+PiAoaGlnaGVzdF9iaXQgLSAxKSkgJiAxOworICAqZXh0cmFfYml0cyA9IGhpZ2hlc3RfYml0IC0gMTsKKyAgKmV4dHJhX2JpdHNfdmFsdWUgPSBkaXN0YW5jZSAmICgoMSA8PCAqZXh0cmFfYml0cykgLSAxKTsKKyAgKmNvZGUgPSAyICogaGlnaGVzdF9iaXQgKyBzZWNvbmRfaGlnaGVzdF9iaXQ7Cit9CisKKyNkZWZpbmUgUFJFRklYX0xPT0tVUF9JRFhfTUFYICAgNTEyCit0eXBlZGVmIHN0cnVjdCB7CisgIGludDhfdCBjb2RlXzsKKyAgaW50OF90IGV4dHJhX2JpdHNfOworfSBWUDhMUHJlZml4Q29kZTsKKworLy8gVGhlc2UgdGFibGVzIGFyZSBkZXJpdmVkIHVzaW5nIFZQOExQcmVmaXhFbmNvZGVOb0xVVC4KK2V4dGVybiBjb25zdCBWUDhMUHJlZml4Q29kZSBrUHJlZml4RW5jb2RlQ29kZVtQUkVGSVhfTE9PS1VQX0lEWF9NQVhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3Qga1ByZWZpeEVuY29kZUV4dHJhQml0c1ZhbHVlW1BSRUZJWF9MT09LVVBfSURYX01BWF07CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlQml0cyhpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0cykgeworICBpZiAoZGlzdGFuY2UgPCBQUkVGSVhfTE9PS1VQX0lEWF9NQVgpIHsKKyAgICBjb25zdCBWUDhMUHJlZml4Q29kZSBwcmVmaXhfY29kZSA9IGtQcmVmaXhFbmNvZGVDb2RlW2Rpc3RhbmNlXTsKKyAgICAqY29kZSA9IHByZWZpeF9jb2RlLmNvZGVfOworICAgICpleHRyYV9iaXRzID0gcHJlZml4X2NvZGUuZXh0cmFfYml0c187CisgIH0gZWxzZSB7CisgICAgVlA4TFByZWZpeEVuY29kZUJpdHNOb0xVVChkaXN0YW5jZSwgY29kZSwgZXh0cmFfYml0cyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFByZWZpeEVuY29kZShpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHNfdmFsdWUpIHsKKyAgaWYgKGRpc3RhbmNlIDwgUFJFRklYX0xPT0tVUF9JRFhfTUFYKSB7CisgICAgY29uc3QgVlA4TFByZWZpeENvZGUgcHJlZml4X2NvZGUgPSBrUHJlZml4RW5jb2RlQ29kZVtkaXN0YW5jZV07CisgICAgKmNvZGUgPSBwcmVmaXhfY29kZS5jb2RlXzsKKyAgICAqZXh0cmFfYml0cyA9IHByZWZpeF9jb2RlLmV4dHJhX2JpdHNfOworICAgICpleHRyYV9iaXRzX3ZhbHVlID0ga1ByZWZpeEVuY29kZUV4dHJhQml0c1ZhbHVlW2Rpc3RhbmNlXTsKKyAgfSBlbHNlIHsKKyAgICBWUDhMUHJlZml4RW5jb2RlTm9MVVQoZGlzdGFuY2UsIGNvZGUsIGV4dHJhX2JpdHMsIGV4dHJhX2JpdHNfdmFsdWUpOworICB9Cit9CisKKy8vIFN1bSBvZiBlYWNoIGNvbXBvbmVudCwgbW9kIDI1Ni4KK3N0YXRpYyBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVyBXRUJQX0lOTElORQordWludDMyX3QgVlA4TEFkZFBpeGVscyh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIGNvbnN0IHVpbnQzMl90IGFscGhhX2FuZF9ncmVlbiA9IChhICYgMHhmZjAwZmYwMHUpICsgKGIgJiAweGZmMDBmZjAwdSk7CisgIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9IChhICYgMHgwMGZmMDBmZnUpICsgKGIgJiAweDAwZmYwMGZmdSk7CisgIHJldHVybiAoYWxwaGFfYW5kX2dyZWVuICYgMHhmZjAwZmYwMHUpIHwgKHJlZF9hbmRfYmx1ZSAmIDB4MDBmZjAwZmZ1KTsKK30KKworLy8gRGlmZmVyZW5jZSBvZiBlYWNoIGNvbXBvbmVudCwgbW9kIDI1Ni4KK3N0YXRpYyBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVyBXRUJQX0lOTElORQordWludDMyX3QgVlA4TFN1YlBpeGVscyh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIGNvbnN0IHVpbnQzMl90IGFscGhhX2FuZF9ncmVlbiA9CisgICAgICAweDAwZmYwMGZmdSArIChhICYgMHhmZjAwZmYwMHUpIC0gKGIgJiAweGZmMDBmZjAwdSk7CisgIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9CisgICAgICAweGZmMDBmZjAwdSArIChhICYgMHgwMGZmMDBmZnUpIC0gKGIgJiAweDAwZmYwMGZmdSk7CisgIHJldHVybiAoYWxwaGFfYW5kX2dyZWVuICYgMHhmZjAwZmYwMHUpIHwgKHJlZF9hbmRfYmx1ZSAmIDB4MDBmZjAwZmZ1KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybS1yZWxhdGVkIGZ1bmN0aW9ucyB1c2UgZGluIGJvdGggZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorCisvLyBNYWNyb3MgdXNlZCB0byBjcmVhdGUgYSBiYXRjaCBwcmVkaWN0b3IgdGhhdCBpdGVyYXRpdmVseSB1c2VzIGEKKy8vIG9uZS1waXhlbCBwcmVkaWN0b3IuCisKKy8vIFRoZSBwcmVkaWN0b3IgaXMgYWRkZWQgdG8gdGhlIG91dHB1dCBwaXhlbCAod2hpY2gKKy8vIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkIGFzIGEgcmVzaWR1YWwpIHRvIGdldCB0aGUgZmluYWwgcHJlZGljdGlvbi4KKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SX0FERChQUkVESUNUT1IsIFBSRURJQ1RPUl9BREQpICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFBSRURJQ1RPUl9BREQoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh4ID0gMDsgeCA8IG51bV9waXhlbHM7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBwcmVkID0gKFBSRURJQ1RPUikob3V0W3ggLSAxXSwgdXBwZXIgKyB4KTsgICAgICAgIFwKKyAgICBvdXRbeF0gPSBWUDhMQWRkUGl4ZWxzKGluW3hdLCBwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gSXQgc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIGZyb20gdGhlIGlucHV0IHBpeGVsIGFuZCBzdG9yZXMgdGhlIHJlc2lkdWFsCisvLyBpbiB0aGUgb3V0cHV0IHBpeGVsLgorI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfU1VCKFBSRURJQ1RPUiwgUFJFRElDVE9SX1NVQikgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUFJFRElDVE9SX1NVQihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgXAorICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHggPSAwOyB4IDwgbnVtX3BpeGVsczsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHByZWQgPSAoUFJFRElDVE9SKShpblt4IC0gMV0sIHVwcGVyICsgeCk7ICAgICAgICAgXAorICAgIG91dFt4XSA9IFZQOExTdWJQaXhlbHMoaW5beF0sIHByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfTE9TU0xFU1NfQ09NTU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA4MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmMuYwpAQCAtMCwwICsxLDEwMTEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm0gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGxpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworLy8gbG9va3VwIHRhYmxlIGZvciBzbWFsbCB2YWx1ZXMgb2YgbG9nMihpbnQpCitjb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7CisgIDAuMDAwMDAwMDAwMDAwMDAwMGYsIDAuMDAwMDAwMDAwMDAwMDAwMGYsCisgIDEuMDAwMDAwMDAwMDAwMDAwMGYsIDEuNTg0OTYyNTAwNzIxMTU2MGYsCisgIDIuMDAwMDAwMDAwMDAwMDAwMGYsIDIuMzIxOTI4MDk0ODg3MzYyMWYsCisgIDIuNTg0OTYyNTAwNzIxMTU2MGYsIDIuODA3MzU0OTIyMDU3NjA0MWYsCisgIDMuMDAwMDAwMDAwMDAwMDAwMGYsIDMuMTY5OTI1MDAxNDQyMzEyMWYsCisgIDMuMzIxOTI4MDk0ODg3MzYyMWYsIDMuNDU5NDMxNjE4NjM3Mjk3M2YsCisgIDMuNTg0OTYyNTAwNzIxMTU2MGYsIDMuNzAwNDM5NzE4MTQxMDkyMWYsCisgIDMuODA3MzU0OTIyMDU3NjA0MWYsIDMuOTA2ODkwNTk1NjA4NTE4N2YsCisgIDQuMDAwMDAwMDAwMDAwMDAwMGYsIDQuMDg3NDYyODQxMjUwMzM5MGYsCisgIDQuMTY5OTI1MDAxNDQyMzEyMWYsIDQuMjQ3OTI3NTEzNDQzNTg1MmYsCisgIDQuMzIxOTI4MDk0ODg3MzYyNmYsIDQuMzkyMzE3NDIyNzc4NzYwNmYsCisgIDQuNDU5NDMxNjE4NjM3Mjk3M2YsIDQuNTIzNTYxOTU2MDU3MDEzMGYsCisgIDQuNTg0OTYyNTAwNzIxMTU2MGYsIDQuNjQzODU2MTg5Nzc0NzI0M2YsCisgIDQuNzAwNDM5NzE4MTQxMDkxN2YsIDQuNzU0ODg3NTAyMTYzNDY4MmYsCisgIDQuODA3MzU0OTIyMDU3NjAzN2YsIDQuODU3OTgwOTk1MTI3NTcxOGYsCisgIDQuOTA2ODkwNTk1NjA4NTE4N2YsIDQuOTU0MTk2MzEwMzg2ODc0OWYsCisgIDUuMDAwMDAwMDAwMDAwMDAwMGYsIDUuMDQ0Mzk0MTE5MzU4NDUzM2YsCisgIDUuMDg3NDYyODQxMjUwMzM5MGYsIDUuMTI5MjgzMDE2OTQ0OTY2M2YsCisgIDUuMTY5OTI1MDAxNDQyMzEyMWYsIDUuMjA5NDUzMzY1NjI4OTUwMWYsCisgIDUuMjQ3OTI3NTEzNDQzNTg1MmYsIDUuMjg1NDAyMjE4ODYyMjQ4N2YsCisgIDUuMzIxOTI4MDk0ODg3MzYyNmYsIDUuMzU3NTUyMDA0NjE4MDgzN2YsCisgIDUuMzkyMzE3NDIyNzc4NzYwNmYsIDUuNDI2MjY0NzU0NzAyMDk3OWYsCisgIDUuNDU5NDMxNjE4NjM3Mjk3M2YsIDUuNDkxODUzMDk2MzI5Njc0N2YsCisgIDUuNTIzNTYxOTU2MDU3MDEzMGYsIDUuNTU0NTg4ODUxNjc3NjM3NmYsCisgIDUuNTg0OTYyNTAwNzIxMTU2MGYsIDUuNjE0NzA5ODQ0MTE1MjA4M2YsCisgIDUuNjQzODU2MTg5Nzc0NzI0M2YsIDUuNjcyNDI1MzQxOTcxNDk1MWYsCisgIDUuNzAwNDM5NzE4MTQxMDkxN2YsIDUuNzI3OTIwNDU0NTYzMTk4N2YsCisgIDUuNzU0ODg3NTAyMTYzNDY4MmYsIDUuNzgxMzU5NzEzNTI0NjU5OWYsCisgIDUuODA3MzU0OTIyMDU3NjAzN2YsIDUuODMyODkwMDE0MTY0NzQxMmYsCisgIDUuODU3OTgwOTk1MTI3NTcxOGYsIDUuODgyNjQzMDQ5MzYxODQxNWYsCisgIDUuOTA2ODkwNTk1NjA4NTE4N2YsIDUuOTMwNzM3MzM3NTYyODg2NmYsCisgIDUuOTU0MTk2MzEwMzg2ODc0OWYsIDUuOTc3Mjc5OTIzNDk5OTE2N2YsCisgIDYuMDAwMDAwMDAwMDAwMDAwMGYsIDYuMDIyMzY3ODEzMDI4NDU0M2YsCisgIDYuMDQ0Mzk0MTE5MzU4NDUzM2YsIDYuMDY2MDg5MTkwNDU3NzcyMGYsCisgIDYuMDg3NDYyODQxMjUwMzM5MGYsIDYuMTA4NTI0NDU2Nzc4MTY5MWYsCisgIDYuMTI5MjgzMDE2OTQ0OTY2M2YsIDYuMTQ5NzQ3MTE5NTA0NjgyMmYsCisgIDYuMTY5OTI1MDAxNDQyMzEyMWYsIDYuMTg5ODI0NTU4ODgwMDE3NWYsCisgIDYuMjA5NDUzMzY1NjI4OTUwMWYsIDYuMjI4ODE4NjkwNDk1ODgwNGYsCisgIDYuMjQ3OTI3NTEzNDQzNTg1MmYsIDYuMjY2Nzg2NTQwNjk0OTAxMGYsCisgIDYuMjg1NDAyMjE4ODYyMjQ4N2YsIDYuMzAzNzgwNzQ4MTc3MTAzMGYsCisgIDYuMzIxOTI4MDk0ODg3MzYyNmYsIDYuMzM5ODUwMDAyODg0NjI0M2YsCisgIDYuMzU3NTUyMDA0NjE4MDgzN2YsIDYuMzc1MDM5NDMxMzQ2OTI0NWYsCisgIDYuMzkyMzE3NDIyNzc4NzYwNmYsIDYuNDA5MzkwOTM2MTM3NzAxN2YsCisgIDYuNDI2MjY0NzU0NzAyMDk3OWYsIDYuNDQyOTQzNDk1ODQ4NzI3OWYsCisgIDYuNDU5NDMxNjE4NjM3Mjk3M2YsIDYuNDc1NzMzNDMwOTY2Mzk3NmYsCisgIDYuNDkxODUzMDk2MzI5Njc0N2YsIDYuNTA3Nzk0NjQwMTk4Njk2M2YsCisgIDYuNTIzNTYxOTU2MDU3MDEzMGYsIDYuNTM5MTU4ODExMTA4MDMwOWYsCisgIDYuNTU0NTg4ODUxNjc3NjM3NmYsIDYuNTY5ODU1NjA4MzMwOTQ3OGYsCisgIDYuNTg0OTYyNTAwNzIxMTU2MGYsIDYuNTk5OTEyODQyMTg3MTI3OGYsCisgIDYuNjE0NzA5ODQ0MTE1MjA4M2YsIDYuNjI5MzU2NjIwMDc5NjA5NGYsCisgIDYuNjQzODU2MTg5Nzc0NzI0M2YsIDYuNjU4MjExNDgyNzUxNzk0NmYsCisgIDYuNjcyNDI1MzQxOTcxNDk1MWYsIDYuNjg2NTAwNTI3MTgzMjE4NWYsCisgIDYuNzAwNDM5NzE4MTQxMDkxN2YsIDYuNzE0MjQ1NTE3NjY2MTIyNGYsCisgIDYuNzI3OTIwNDU0NTYzMTk4N2YsIDYuNzQxNDY2OTg2NDAxMTQ2NGYsCisgIDYuNzU0ODg3NTAyMTYzNDY4MmYsIDYuNzY4MTg0MzI0Nzc2OTI1OWYsCisgIDYuNzgxMzU5NzEzNTI0NjU5OWYsIDYuNzk0NDE1ODY2MzUwMTA2MWYsCisgIDYuODA3MzU0OTIyMDU3NjAzN2YsIDYuODIwMTc4OTYyNDE1MTg3OGYsCisgIDYuODMyODkwMDE0MTY0NzQxMmYsIDYuODQ1NDkwMDUwOTQ0Mzc0N2YsCisgIDYuODU3OTgwOTk1MTI3NTcxOGYsIDYuODcwMzY0NzE5NTgzNDA0N2YsCisgIDYuODgyNjQzMDQ5MzYxODQxNWYsIDYuODk0ODE3NzYzMzA3OTQzN2YsCisgIDYuOTA2ODkwNTk1NjA4NTE4N2YsIDYuOTE4ODYzMjM3Mjc0NTk0NmYsCisgIDYuOTMwNzM3MzM3NTYyODg2NmYsIDYuOTQyNTE0NTA1MzM5MjM5OGYsCisgIDYuOTU0MTk2MzEwMzg2ODc0OWYsIDYuOTY1Nzg0Mjg0NjYyMDg2OWYsCisgIDYuOTc3Mjc5OTIzNDk5OTE2N2YsIDYuOTg4Njg0Njg2NzcyMTY1NGYsCisgIDcuMDAwMDAwMDAwMDAwMDAwMGYsIDcuMDExMjI3MjU1NDIzMjUzOWYsCisgIDcuMDIyMzY3ODEzMDI4NDU0M2YsIDcuMDMzNDIzMDAxNTM3NDUwMWYsCisgIDcuMDQ0Mzk0MTE5MzU4NDUzM2YsIDcuMDU1MjgyNDM1NTAxMTg5OGYsCisgIDcuMDY2MDg5MTkwNDU3NzcyMGYsIDcuMDc2ODE1NTk3MDUwODMwOGYsCisgIDcuMDg3NDYyODQxMjUwMzM5MGYsIDcuMDk4MDMyMDgyOTYwNTI2M2YsCisgIDcuMTA4NTI0NDU2Nzc4MTY5MWYsIDcuMTE4OTQxMDcyNzIzNTA3NmYsCisgIDcuMTI5MjgzMDE2OTQ0OTY2M2YsIDcuMTM5NTUxMzUyMzk4NzkzNmYsCisgIDcuMTQ5NzQ3MTE5NTA0NjgyMmYsIDcuMTU5ODcxMzM2Nzc4Mzg5MGYsCisgIDcuMTY5OTI1MDAxNDQyMzEyMWYsIDcuMTc5OTA5MDkwMDE0OTM0NGYsCisgIDcuMTg5ODI0NTU4ODgwMDE3NWYsIDcuMTk5NjcyMzQ0ODM2MzY0NGYsCisgIDcuMjA5NDUzMzY1NjI4OTUwMWYsIDcuMjE5MTY4NTIwNDYyMTYxMWYsCisgIDcuMjI4ODE4NjkwNDk1ODgwNGYsIDcuMjM4NDA0NzM5MzI1MDc4NWYsCisgIDcuMjQ3OTI3NTEzNDQzNTg1MmYsIDcuMjU3Mzg3ODQyNjkyNjUyMWYsCisgIDcuMjY2Nzg2NTQwNjk0OTAxMGYsIDcuMjc2MTI0NDA1Mjc0MjM3NWYsCisgIDcuMjg1NDAyMjE4ODYyMjQ4N2YsIDcuMjk0NjIwNzQ4ODkxNjI3MGYsCisgIDcuMzAzNzgwNzQ4MTc3MTAzMGYsIDcuMzEyODgyOTU1Mjg0MzU1N2YsCisgIDcuMzIxOTI4MDk0ODg3MzYyNmYsIDcuMzMwOTE2ODc4MTE0NjE2N2YsCisgIDcuMzM5ODUwMDAyODg0NjI0M2YsIDcuMzQ4NzI4MTU0MjMxMDc3MWYsCisgIDcuMzU3NTUyMDA0NjE4MDgzN2YsIDcuMzY2MzIyMjE0MjQ1ODE2MGYsCisgIDcuMzc1MDM5NDMxMzQ2OTI0NWYsIDcuMzgzNzA0MjkyNDc0MDUxOWYsCisgIDcuMzkyMzE3NDIyNzc4NzYwNmYsIDcuNDAwODc5NDM2MjgyMTg0M2YsCisgIDcuNDA5MzkwOTM2MTM3NzAxN2YsIDcuNDE3ODUyNTE0ODg1ODk4MmYsCisgIDcuNDI2MjY0NzU0NzAyMDk3OWYsIDcuNDM0NjI4MjI3NjM2NzI0NWYsCisgIDcuNDQyOTQzNDk1ODQ4NzI3OWYsIDcuNDUxMjExMTExODMyMzI4OWYsCisgIDcuNDU5NDMxNjE4NjM3Mjk3M2YsIDcuNDY3NjA1NTUwMDgyOTk3NmYsCisgIDcuNDc1NzMzNDMwOTY2Mzk3NmYsIDcuNDgzODE1Nzc3MjY0MjU2M2YsCisgIDcuNDkxODUzMDk2MzI5Njc0N2YsIDcuNDk5ODQ1ODg3MDgzMjA1NmYsCisgIDcuNTA3Nzk0NjQwMTk4Njk2M2YsIDcuNTE1Njk5ODM4Mjg0MDQyN2YsCisgIDcuNTIzNTYxOTU2MDU3MDEzMGYsIDcuNTMxMzgxNDYwNTE2MzExOGYsCisgIDcuNTM5MTU4ODExMTA4MDMwOWYsIDcuNTQ2ODk0NDU5ODg3NjM2NGYsCisgIDcuNTU0NTg4ODUxNjc3NjM3NmYsIDcuNTYyMjQyNDI0MjIxMDcyOGYsCisgIDcuNTY5ODU1NjA4MzMwOTQ3OGYsIDcuNTc3NDI4ODI4MDM1NzQ4NmYsCisgIDcuNTg0OTYyNTAwNzIxMTU2MGYsIDcuNTkyNDU3MDM3MjY4MDgwNmYsCisgIDcuNTk5OTEyODQyMTg3MTI3OGYsIDcuNjA3MzMwMzEzNzQ5NjEwNGYsCisgIDcuNjE0NzA5ODQ0MTE1MjA4M2YsIDcuNjIyMDUxODE5NDU2Mzc2NGYsCisgIDcuNjI5MzU2NjIwMDc5NjA5NGYsIDcuNjM2NjI0NjIwNTQzNjQ4N2YsCisgIDcuNjQzODU2MTg5Nzc0NzI0M2YsIDcuNjUxMDUxNjkxMTc4OTI4MWYsCisgIDcuNjU4MjExNDgyNzUxNzk0NmYsIDcuNjY1MzM1OTE3MTg1MTc2NGYsCisgIDcuNjcyNDI1MzQxOTcxNDk1MWYsIDcuNjc5NDgwMDk5NTA1NDQ2NGYsCisgIDcuNjg2NTAwNTI3MTgzMjE4NWYsIDcuNjkzNDg2OTU3NDk5MzI1MmYsCisgIDcuNzAwNDM5NzE4MTQxMDkxN2YsIDcuNzA3MzU5MTMyMDgwODgyNWYsCisgIDcuNzE0MjQ1NTE3NjY2MTIyNGYsIDcuNzIxMDk5MTg4NzA3MTg1NWYsCisgIDcuNzI3OTIwNDU0NTYzMTk4N2YsIDcuNzM0NzA5NjIwMjI1ODM4M2YsCisgIDcuNzQxNDY2OTg2NDAxMTQ2NGYsIDcuNzQ4MTkyODQ5NTg5NDYwNWYsCisgIDcuNzU0ODg3NTAyMTYzNDY4MmYsIDcuNzYxNTUxMjMyNDQ0NDc5NWYsCisgIDcuNzY4MTg0MzI0Nzc2OTI1OWYsIDcuNzc0Nzg3MDU5NjAxMTczNmYsCisgIDcuNzgxMzU5NzEzNTI0NjU5OWYsIDcuNzg3OTAyNTU5MzkxNDMxN2YsCisgIDcuNzk0NDE1ODY2MzUwMTA2MWYsIDcuODAwODk5ODk5OTIwMzA0N2YsCisgIDcuODA3MzU0OTIyMDU3NjAzN2YsIDcuODEzNzgxMTkxMjE3MDM3NGYsCisgIDcuODIwMTc4OTYyNDE1MTg3OGYsIDcuODI2NTQ4NDg3MjkwOTE1MGYsCisgIDcuODMyODkwMDE0MTY0NzQxMmYsIDcuODM5MjAzNzg4MDk2OTQzNmYsCisgIDcuODQ1NDkwMDUwOTQ0Mzc0N2YsIDcuODUxNzQ5MDQxNDE2MDU3MWYsCisgIDcuODU3OTgwOTk1MTI3NTcxOGYsIDcuODY0MTg2MTQ0NjU0Mjc5N2YsCisgIDcuODcwMzY0NzE5NTgzNDA0N2YsIDcuODc2NTE2OTQ2NTY0OTk5M2YsCisgIDcuODgyNjQzMDQ5MzYxODQxNWYsIDcuODg4NzQzMjQ4ODk4MjU5MWYsCisgIDcuODk0ODE3NzYzMzA3OTQzN2YsIDcuOTAwODY2ODA3OTgwNzQ4NmYsCisgIDcuOTA2ODkwNTk1NjA4NTE4N2YsIDcuOTEyODg5MzM2MjI5OTYxOWYsCisgIDcuOTE4ODYzMjM3Mjc0NTk0NmYsIDcuOTI0ODEyNTAzNjA1NzgxMmYsCisgIDcuOTMwNzM3MzM3NTYyODg2NmYsIDcuOTM2NjM3OTM5MDAyNTcwOWYsCisgIDcuOTQyNTE0NTA1MzM5MjM5OGYsIDcuOTQ4MzY3MjMxNTg0Njc3OGYsCisgIDcuOTU0MTk2MzEwMzg2ODc0OWYsIDcuOTYwMDAxOTMyMDY4MDgwNWYsCisgIDcuOTY1Nzg0Mjg0NjYyMDg2OWYsIDcuOTcxNTQzNTUzOTUwNzcxOWYsCisgIDcuOTc3Mjc5OTIzNDk5OTE2N2YsIDcuOTgyOTkzNTc0Njk0MzEwM2YsCisgIDcuOTg4Njg0Njg2NzcyMTY1NGYsIDcuOTk0MzUzNDM2ODU4ODU3N2YKK307CisKK2NvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7CisgIDAuMDAwMDAwMDBmLCAgICAwLjAwMDAwMDAwZiwgIDIuMDAwMDAwMDBmLCAgIDQuNzU0ODg3NTBmLAorICA4LjAwMDAwMDAwZiwgICAxMS42MDk2NDA0N2YsICAxNS41MDk3NzUwMGYsICAxOS42NTE0ODQ0NWYsCisgIDI0LjAwMDAwMDAwZiwgIDI4LjUyOTMyNTAxZiwgIDMzLjIxOTI4MDk1ZiwgIDM4LjA1Mzc0NzgxZiwKKyAgNDMuMDE5NTUwMDFmLCAgNDguMTA1NzE2MzRmLCAgNTMuMzAyOTY4OTFmLCAgNTguNjAzMzU4OTNmLAorICA2NC4wMDAwMDAwMGYsICA2OS40ODY4NjgzMGYsICA3NS4wNTg2NTAwM2YsICA4MC43MTA2MjI3NmYsCisgIDg2LjQzODU2MTkwZiwgIDkyLjIzODY2NTg4ZiwgIDk4LjEwNzQ5NTYxZiwgIDEwNC4wNDE5MjQ5OWYsCisgIDExMC4wMzkxMDAwMmYsIDExNi4wOTY0MDQ3NGYsIDEyMi4yMTE0MzI2N2YsIDEyOC4zODE5NjI1NmYsCisgIDEzNC42MDU5Mzc4MmYsIDE0MC44ODE0NDg4NmYsIDE0Ny4yMDY3MTc4N2YsIDE1My41ODAwODU2MmYsCisgIDE2MC4wMDAwMDAwMGYsIDE2Ni40NjUwMDU5NGYsIDE3Mi45NzM3MzY2MGYsIDE3OS41MjQ5MDU1OWYsCisgIDE4Ni4xMTczMDAwNWYsIDE5Mi43NDk3NzQ1M2YsIDE5OS40MjEyNDU1MWYsIDIwNi4xMzA2ODY1NGYsCisgIDIxMi44NzcxMjM4MGYsIDIxOS42NTk2MzIxOWYsIDIyNi40NzczMzE3NmYsIDIzMy4zMjkzODQ0NWYsCisgIDI0MC4yMTQ5OTEyMmYsIDI0Ny4xMzMzODkzM2YsIDI1NC4wODM4NDk5OGYsIDI2MS4wNjU2NzYwM2YsCisgIDI2OC4wNzgyMDAwM2YsIDI3NS4xMjA3ODIzNmYsIDI4Mi4xOTI4MDk0OWYsIDI4OS4yOTM2OTI0NGYsCisgIDI5Ni40MjI4NjUzNGYsIDMwMy41Nzk3ODQwOWYsIDMxMC43NjM5MjUxMmYsIDMxNy45NzQ3ODQyNGYsCisgIDMyNS4yMTE4NzU2NGYsIDMzMi40NzQ3MzA4MWYsIDMzOS43NjI4OTc3MmYsIDM0Ny4wNzU5Mzk5MWYsCisgIDM1NC40MTM0MzU3NGYsIDM2MS43NzQ5Nzc1OWYsIDM2OS4xNjAxNzEyNGYsIDM3Ni41Njg2MzUxOGYsCisgIDM4NC4wMDAwMDAwMGYsIDM5MS40NTM5MDc4NWYsIDM5OC45MzAwMTE4OGYsIDQwNi40Mjc5NzU3NmYsCisgIDQxMy45NDc0NzMyMWYsIDQyMS40ODgxODc1MmYsIDQyOS4wNDk4MTExOWYsIDQzNi42MzIwNDU0OGYsCisgIDQ0NC4yMzQ2MDAxMGYsIDQ1MS44NTcxOTI4MGYsIDQ1OS40OTk1NDkwNmYsIDQ2Ny4xNjE0MDE3OWYsCisgIDQ3NC44NDI0OTEwMmYsIDQ4Mi41NDI1NjM2M2YsIDQ5MC4yNjEzNzMwN2YsIDQ5Ny45OTg2NzkxMWYsCisgIDUwNS43NTQyNDc1OWYsIDUxMy41Mjc4NTAyM2YsIDUyMS4zMTkyNjQzOGYsIDUyOS4xMjgyNzI4MGYsCisgIDUzNi45NTQ2NjM1MWYsIDU0NC43OTgyMjk1N2YsIDU1Mi42NTg3Njg5MGYsIDU2MC41MzYwODQxNGYsCisgIDU2OC40Mjk5ODI0NGYsIDU3Ni4zNDAyNzUzNmYsIDU4NC4yNjY3Nzg2N2YsIDU5Mi4yMDkzMTIyNmYsCisgIDYwMC4xNjc2OTk5NmYsIDYwOC4xNDE3Njk0M2YsIDYxNi4xMzEzNTIwNmYsIDYyNC4xMzYyODI3OWYsCisgIDYzMi4xNTY0MDAwN2YsIDY0MC4xOTE1NDU2OWYsIDY0OC4yNDE1NjQ3MmYsIDY1Ni4zMDYzMDUzOWYsCisgIDY2NC4zODU2MTg5OGYsIDY3Mi40NzkzNTk3NmYsIDY4MC41ODczODQ4OGYsIDY4OC43MDk1NTQzMGYsCisgIDY5Ni44NDU3MzA2OWYsIDcwNC45OTU3NzkzNWYsIDcxMy4xNTk1NjgxOGYsIDcyMS4zMzY5Njc1NGYsCisgIDcyOS41Mjc4NTAyM2YsIDczNy43MzIwOTE0MGYsIDc0NS45NDk1Njg0OWYsIDc1NC4xODAxNjExNmYsCisgIDc2Mi40MjM3NTEyN2YsIDc3MC42ODAyMjI3NWYsIDc3OC45NDk0NjE2MWYsIDc4Ny4yMzEzNTU4NmYsCisgIDc5NS41MjU3OTU0M2YsIDgwMy44MzI2NzIxOWYsIDgxMi4xNTE4Nzk4MmYsIDgyMC40ODMzMTM4M2YsCisgIDgyOC44MjY4NzE0N2YsIDgzNy4xODI0NTE3MWYsIDg0NS41NDk5NTUxOGYsIDg1My45MjkyODQxNmYsCisgIDg2Mi4zMjAzNDI0OWYsIDg3MC43MjMwMzU1OGYsIDg3OS4xMzcyNzAzNmYsIDg4Ny41NjI5NTUyMmYsCisgIDg5Ni4wMDAwMDAwMGYsIDkwNC40NDgzMTU5NWYsIDkxMi45MDc4MTU2OWYsIDkyMS4zNzg0MTMyMGYsCisgIDkyOS44NjAwMjM3NmYsIDkzOC4zNTI1NjM5MmYsIDk0Ni44NTU5NTE1MmYsIDk1NS4zNzAxMDU2MGYsCisgIDk2My44OTQ5NDY0MWYsIDk3Mi40MzAzOTUzN2YsIDk4MC45NzYzNzUwNGYsIDk4OS41MzI4MDkxMWYsCisgIDk5OC4wOTk2MjIzN2YsIDEwMDYuNjc2NzQwNjlmLCAxMDE1LjI2NDA5MDk3ZiwgMTAyMy44NjE2MDExNmYsCisgIDEwMzIuNDY5MjAwMjFmLCAxMDQxLjA4NjgxODA1ZiwgMTA0OS43MTQzODU2MGYsIDEwNTguMzUxODM0NjlmLAorICAxMDY2Ljk5OTA5ODExZiwgMTA3NS42NTYxMDk1NWYsIDEwODQuMzIyODAzNTdmLCAxMDkyLjk5OTExNTY0ZiwKKyAgMTEwMS42ODQ5ODIwNGYsIDExMTAuMzgwMzM5OTNmLCAxMTE5LjA4NTEyNzI3ZiwgMTEyNy43OTkyODI4MmYsCisgIDExMzYuNTIyNzQ2MTRmLCAxMTQ1LjI1NTQ1NzU4ZiwgMTE1My45OTczNTgyMWYsIDExNjIuNzQ4Mzg5ODlmLAorICAxMTcxLjUwODQ5NTE4ZiwgMTE4MC4yNzc2MTczOGYsIDExODkuMDU1NzAwNDdmLCAxMTk3Ljg0MjY4OTE0ZiwKKyAgMTIwNi42Mzg1Mjg3NmYsIDEyMTUuNDQzMTY1MzVmLCAxMjI0LjI1NjU0NTYwZiwgMTIzMy4wNzg2MTY4NGYsCisgIDEyNDEuOTA5MzI3MDNmLCAxMjUwLjc0ODYyNDczZiwgMTI1OS41OTY0NTkxNGYsIDEyNjguNDUyNzgwMDVmLAorICAxMjc3LjMxNzUzNzgxZiwgMTI4Ni4xOTA2ODMzOGYsIDEyOTUuMDcyMTY4MjhmLCAxMzAzLjk2MTk0NDU3ZiwKKyAgMTMxMi44NTk5NjQ4OGYsIDEzMjEuNzY2MTgyMzZmLCAxMzMwLjY4MDU1MDcxZiwgMTMzOS42MDMwMjQxM2YsCisgIDEzNDguNTMzNTU3MzRmLCAxMzU3LjQ3MjEwNTU2ZiwgMTM2Ni40MTg2MjQ1MmYsIDEzNzUuMzczMDcwNDFmLAorICAxMzg0LjMzNTM5OTkxZiwgMTM5My4zMDU1NzAyMGYsIDE0MDIuMjgzNTM4ODdmLCAxNDExLjI2OTI2NDAwZiwKKyAgMTQyMC4yNjI3MDQxMmYsIDE0MjkuMjYzODE4MThmLCAxNDM4LjI3MjU2NTU4ZiwgMTQ0Ny4yODg5MDYxNWYsCisgIDE0NTYuMzEyODAwMTRmLCAxNDY1LjM0NDIwODE5ZiwgMTQ3NC4zODMwOTEzOGYsIDE0ODMuNDI5NDExMThmLAorICAxNDkyLjQ4MzEyOTQ1ZiwgMTUwMS41NDQyMDg0M2YsIDE1MTAuNjEyNjEwNzhmLCAxNTE5LjY4ODI5OTQ5ZiwKKyAgMTUyOC43NzEyMzc5NWYsIDE1MzcuODYxMzg5OTNmLCAxNTQ2Ljk1ODcxOTUyZiwgMTU1Ni4wNjMxOTExOWYsCisgIDE1NjUuMTc0NzY5NzZmLCAxNTc0LjI5MzQyMDQwZiwgMTU4My40MTkxMDg2MGYsIDE1OTIuNTUxODAwMjBmLAorICAxNjAxLjY5MTQ2MTM3ZiwgMTYxMC44MzgwNTg2MGYsIDE2MTkuOTkxNTU4NzFmLCAxNjI5LjE1MTkyODgyZiwKKyAgMTYzOC4zMTkxMzYzN2YsIDE2NDcuNDkzMTQ5MTFmLCAxNjU2LjY3MzkzNTA5ZiwgMTY2NS44NjE0NjI2NmYsCisgIDE2NzUuMDU1NzAwNDdmLCAxNjg0LjI1NjYxNzQ0ZiwgMTY5My40NjQxODI4MGYsIDE3MDIuNjc4MzY2MDVmLAorICAxNzExLjg5OTEzNjk4ZiwgMTcyMS4xMjY0NjU2M2YsIDE3MzAuMzYwMzIyMzNmLCAxNzM5LjYwMDY3NzY4ZiwKKyAgMTc0OC44NDc1MDI1NGYsIDE3NTguMTAwNzY4MDJmLCAxNzY3LjM2MDQ0NTUxZiwgMTc3Ni42MjY1MDY2MmYsCisgIDE3ODUuODk4OTIzMjNmLCAxNzk1LjE3NzY2NzQ3ZiwgMTgwNC40NjI3MTE3MmYsIDE4MTMuNzU0MDI4NTdmLAorICAxODIzLjA1MTU5MDg3ZiwgMTgzMi4zNTUzNzE3MGYsIDE4NDEuNjY1MzQ0MzhmLCAxODUwLjk4MTQ4MjQ0ZiwKKyAgMTg2MC4zMDM3NTk2NWYsIDE4NjkuNjMyMTQ5OTlmLCAxODc4Ljk2NjYyNzY3ZiwgMTg4OC4zMDcxNjcxMWYsCisgIDE4OTcuNjUzNzQyOTVmLCAxOTA3LjAwNjMzMDAzZiwgMTkxNi4zNjQ5MDM0MmYsIDE5MjUuNzI5NDM4MzhmLAorICAxOTM1LjA5OTkxMDM3ZiwgMTk0NC40NzYyOTUwNmYsIDE5NTMuODU4NTY4MzFmLCAxOTYzLjI0NjcwNjIwZiwKKyAgMTk3Mi42NDA2ODQ5OGYsIDE5ODIuMDQwNDgxMDhmLCAxOTkxLjQ0NjA3MTE3ZiwgMjAwMC44NTc0MzIwNGYsCisgIDIwMTAuMjc0NTQwNzJmLCAyMDE5LjY5NzM3NDQwZiwgMjAyOS4xMjU5MTA0NGYsIDIwMzguNTYwMTI2NDBmCit9OworCitjb25zdCBWUDhMUHJlZml4Q29kZSBrUHJlZml4RW5jb2RlQ29kZVtQUkVGSVhfTE9PS1VQX0lEWF9NQVhdID0geworICB7IDAsIDB9LCB7IDAsIDB9LCB7IDEsIDB9LCB7IDIsIDB9LCB7IDMsIDB9LCB7IDQsIDF9LCB7IDQsIDF9LCB7IDUsIDF9LAorICB7IDUsIDF9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDcsIDJ9LCB7IDcsIDJ9LCB7IDcsIDJ9LAorICB7IDcsIDJ9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LAorICB7IDgsIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LAorICB7IDksIDN9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LAorICB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LAorICB7MTAsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LAorICB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LAorICB7MTEsIDR9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorfTsKKworY29uc3QgdWludDhfdCBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXSA9IHsKKyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMiwgIDMsICAwLCAgMSwgIDIsICAzLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksCisgIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAorICA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwKKyAgMTI3LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksCisgIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAorICA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNgorfTsKKworc3RhdGljIGZsb2F0IEZhc3RTTG9nMlNsb3dfQyh1aW50MzJfdCB2KSB7CisgIGFzc2VydCh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgIGlmICh2IDwgQVBQUk9YX0xPR19XSVRIX0NPUlJFQ1RJT05fTUFYKSB7CisgICAgaW50IGxvZ19jbnQgPSAwOworICAgIHVpbnQzMl90IHkgPSAxOworICAgIGludCBjb3JyZWN0aW9uID0gMDsKKyAgICBjb25zdCBmbG9hdCB2X2YgPSAoZmxvYXQpdjsKKyAgICBjb25zdCB1aW50MzJfdCBvcmlnX3YgPSB2OworICAgIGRvIHsKKyAgICAgICsrbG9nX2NudDsKKyAgICAgIHYgPSB2ID4+IDE7CisgICAgICB5ID0geSA8PCAxOworICAgIH0gd2hpbGUgKHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgICAvLyB2ZiA9ICgyXmxvZ19jbnQpICogWGY7IHdoZXJlIHkgPSAyXmxvZ19jbnQgYW5kIFhmIDwgMjU2CisgICAgLy8gWGYgPSBmbG9vcihYZikgKiAoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIGxvZzIoWGYpID0gbG9nMihmbG9vcihYZikpICsgbG9nMigxICsgKHYgJSB5KSAvIHYpCisgICAgLy8gVGhlIGNvcnJlY3Rpb24gZmFjdG9yOiBsb2coMSArIGQpIH4gZDsgZm9yIHZlcnkgc21hbGwgZCB2YWx1ZXMsIHNvCisgICAgLy8gbG9nMigxICsgKHYgJSB5KSAvIHYpIH4gTE9HXzJfUkVDSVBST0NBTCAqICh2ICUgeSkvdgorICAgIC8vIExPR18yX1JFQ0lQUk9DQUwgfiAyMy8xNgorICAgIGNvcnJlY3Rpb24gPSAoMjMgKiAob3JpZ192ICYgKHkgLSAxKSkpID4+IDQ7CisgICAgcmV0dXJuIHZfZiAqIChrTG9nMlRhYmxlW3ZdICsgbG9nX2NudCkgKyBjb3JyZWN0aW9uOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiB2ICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKK3N0YXRpYyBmbG9hdCBGYXN0TG9nMlNsb3dfQyh1aW50MzJfdCB2KSB7CisgIGFzc2VydCh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgIGlmICh2IDwgQVBQUk9YX0xPR19XSVRIX0NPUlJFQ1RJT05fTUFYKSB7CisgICAgaW50IGxvZ19jbnQgPSAwOworICAgIHVpbnQzMl90IHkgPSAxOworICAgIGNvbnN0IHVpbnQzMl90IG9yaWdfdiA9IHY7CisgICAgZG91YmxlIGxvZ18yOworICAgIGRvIHsKKyAgICAgICsrbG9nX2NudDsKKyAgICAgIHYgPSB2ID4+IDE7CisgICAgICB5ID0geSA8PCAxOworICAgIH0gd2hpbGUgKHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgICBsb2dfMiA9IGtMb2cyVGFibGVbdl0gKyBsb2dfY250OworICAgIGlmIChvcmlnX3YgPj0gQVBQUk9YX0xPR19NQVgpIHsKKyAgICAgIC8vIFNpbmNlIHRoZSBkaXZpc2lvbiBpcyBzdGlsbCBleHBlbnNpdmUsIGFkZCB0aGlzIGNvcnJlY3Rpb24gZmFjdG9yIG9ubHkKKyAgICAgIC8vIGZvciBsYXJnZSB2YWx1ZXMgb2YgJ3YnLgorICAgICAgY29uc3QgaW50IGNvcnJlY3Rpb24gPSAoMjMgKiAob3JpZ192ICYgKHkgLSAxKSkpID4+IDQ7CisgICAgICBsb2dfMiArPSAoZG91YmxlKWNvcnJlY3Rpb24gLyBvcmlnX3Y7CisgICAgfQorICAgIHJldHVybiAoZmxvYXQpbG9nXzI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0aG9kcyB0byBjYWxjdWxhdGUgRW50cm9weSAoU2hhbm5vbikuCisKKy8vIENvbXB1dGUgdGhlIGNvbWJpbmVkIFNoYW5vbidzIGVudHJvcHkgZm9yIGRpc3RyaWJ1dGlvbiB7WH0gYW5kIHtYK1l9CitzdGF0aWMgZmxvYXQgQ29tYmluZWRTaGFubm9uRW50cm9weV9DKGNvbnN0IGludCBYWzI1Nl0sIGNvbnN0IGludCBZWzI1Nl0pIHsKKyAgaW50IGk7CisgIGRvdWJsZSByZXR2YWwgPSAwLjsKKyAgaW50IHN1bVggPSAwLCBzdW1YWSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIGNvbnN0IGludCB4ID0gWFtpXTsKKyAgICBpZiAoeCAhPSAwKSB7CisgICAgICBjb25zdCBpbnQgeHkgPSB4ICsgWVtpXTsKKyAgICAgIHN1bVggKz0geDsKKyAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHgpOworICAgICAgc3VtWFkgKz0geHk7CisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih4eSk7CisgICAgfSBlbHNlIGlmIChZW2ldICE9IDApIHsKKyAgICAgIHN1bVhZICs9IFlbaV07CisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMihZW2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dmFsICs9IFZQOExGYXN0U0xvZzIoc3VtWCkgKyBWUDhMRmFzdFNMb2cyKHN1bVhZKTsKKyAgcmV0dXJuIChmbG9hdClyZXR2YWw7Cit9CisKK3ZvaWQgVlA4TEJpdEVudHJvcHlJbml0KFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5KSB7CisgIGVudHJvcHktPmVudHJvcHkgPSAwLjsKKyAgZW50cm9weS0+c3VtID0gMDsKKyAgZW50cm9weS0+bm9uemVyb3MgPSAwOworICBlbnRyb3B5LT5tYXhfdmFsID0gMDsKKyAgZW50cm9weS0+bm9uemVyb19jb2RlID0gVlA4TF9OT05fVFJJVklBTF9TWU07Cit9CisKK3ZvaWQgVlA4TEJpdHNFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSkgeworICBpbnQgaTsKKworICBWUDhMQml0RW50cm9weUluaXQoZW50cm9weSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgIGlmIChhcnJheVtpXSAhPSAwKSB7CisgICAgICBlbnRyb3B5LT5zdW0gKz0gYXJyYXlbaV07CisgICAgICBlbnRyb3B5LT5ub256ZXJvX2NvZGUgPSBpOworICAgICAgKytlbnRyb3B5LT5ub256ZXJvczsKKyAgICAgIGVudHJvcHktPmVudHJvcHkgLT0gVlA4TEZhc3RTTG9nMihhcnJheVtpXSk7CisgICAgICBpZiAoZW50cm9weS0+bWF4X3ZhbCA8IGFycmF5W2ldKSB7CisgICAgICAgIGVudHJvcHktPm1heF92YWwgPSBhcnJheVtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGVudHJvcHktPnN1bSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoCisgICAgdWludDMyX3QgdmFsLCBpbnQgaSwgdWludDMyX3QqIGNvbnN0IHZhbF9wcmV2LCBpbnQqIGNvbnN0IGlfcHJldiwKKyAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBjb25zdCBpbnQgc3RyZWFrID0gaSAtICppX3ByZXY7CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBiaXQgZW50cm9weS4KKyAgaWYgKCp2YWxfcHJldiAhPSAwKSB7CisgICAgYml0X2VudHJvcHktPnN1bSArPSAoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBiaXRfZW50cm9weS0+bm9uemVyb3MgKz0gc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvX2NvZGUgPSAqaV9wcmV2OworICAgIGJpdF9lbnRyb3B5LT5lbnRyb3B5IC09IFZQOExGYXN0U0xvZzIoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBpZiAoYml0X2VudHJvcHktPm1heF92YWwgPCAqdmFsX3ByZXYpIHsKKyAgICAgIGJpdF9lbnRyb3B5LT5tYXhfdmFsID0gKnZhbF9wcmV2OworICAgIH0KKyAgfQorCisgIC8vIEdhdGhlciBpbmZvIGZvciB0aGUgSHVmZm1hbiBjb3N0LgorICBzdGF0cy0+Y291bnRzWyp2YWxfcHJldiAhPSAwXSArPSAoc3RyZWFrID4gMyk7CisgIHN0YXRzLT5zdHJlYWtzWyp2YWxfcHJldiAhPSAwXVsoc3RyZWFrID4gMyldICs9IHN0cmVhazsKKworICAqdmFsX3ByZXYgPSB2YWw7CisgICppX3ByZXYgPSBpOworfQorCitzdGF0aWMgdm9pZCBHZXRFbnRyb3B5VW5yZWZpbmVkX0MoY29uc3QgdWludDMyX3QgWFtdLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IGk7CisgIGludCBpX3ByZXYgPSAwOworICB1aW50MzJfdCB4X3ByZXYgPSBYWzBdOworCisgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICBWUDhMQml0RW50cm9weUluaXQoYml0X2VudHJvcHkpOworCisgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHggPSBYW2ldOworICAgIGlmICh4ICE9IHhfcHJldikgeworICAgICAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4LCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworICAgIH0KKyAgfQorICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKDAsIGksICZ4X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisKKyAgYml0X2VudHJvcHktPmVudHJvcHkgKz0gVlA4TEZhc3RTTG9nMihiaXRfZW50cm9weS0+c3VtKTsKK30KKworc3RhdGljIHZvaWQgR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkX0MoY29uc3QgdWludDMyX3QgWFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgWVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQgaSA9IDE7CisgIGludCBpX3ByZXYgPSAwOworICB1aW50MzJfdCB4eV9wcmV2ID0gWFswXSArIFlbMF07CisKKyAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgIFZQOExCaXRFbnRyb3B5SW5pdChiaXRfZW50cm9weSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgeHkgPSBYW2ldICsgWVtpXTsKKyAgICBpZiAoeHkgIT0geHlfcHJldikgeworICAgICAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4eSwgaSwgJnh5X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisgICAgfQorICB9CisgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoMCwgaSwgJnh5X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisKKyAgYml0X2VudHJvcHktPmVudHJvcHkgKz0gVlA4TEZhc3RTTG9nMihiaXRfZW50cm9weS0+c3VtKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0ModWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCBpbnQgYXJnYiA9IGFyZ2JfZGF0YVtpXTsKKyAgICBjb25zdCBpbnQgZ3JlZW4gPSAoYXJnYiA+PiA4KSAmIDB4ZmY7CisgICAgY29uc3QgdWludDMyX3QgbmV3X3IgPSAoKChhcmdiID4+IDE2KSAmIDB4ZmYpIC0gZ3JlZW4pICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBuZXdfYiA9ICgoKGFyZ2IgPj4gIDApICYgMHhmZikgLSBncmVlbikgJiAweGZmOworICAgIGFyZ2JfZGF0YVtpXSA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yIDw8IDE2KSB8IG5ld19iOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwgaW50OF90IGNvbG9yKSB7CisgIHJldHVybiAoKGludCljb2xvcl9wcmVkICogY29sb3IpID4+IDU7Cit9CisKK3ZvaWQgVlA4TFRyYW5zZm9ybUNvbG9yX0MoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLCB1aW50MzJfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gZGF0YVtpXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICAgIGludCBuZXdfcmVkID0gcmVkICYgMHhmZjsKKyAgICBpbnQgbmV3X2JsdWUgPSBhcmdiICYgMHhmZjsKKyAgICBuZXdfcmVkIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fcmVkXywgZ3JlZW4pOworICAgIG5ld19yZWQgJj0gMHhmZjsKKyAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7CisgICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5yZWRfdG9fYmx1ZV8sIHJlZCk7CisgICAgbmV3X2JsdWUgJj0gMHhmZjsKKyAgICBkYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCAobmV3X3JlZCA8PCAxNikgfCAobmV3X2JsdWUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yUmVkKHVpbnQ4X3QgZ3JlZW5fdG9fcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgaW50IG5ld19yZWQgPSBhcmdiID4+IDE2OworICBuZXdfcmVkIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fcmVkLCBncmVlbik7CisgIHJldHVybiAobmV3X3JlZCAmIDB4ZmYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvckJsdWUodWludDhfdCBncmVlbl90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKKyAgdWludDhfdCBuZXdfYmx1ZSA9IGFyZ2I7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fYmx1ZSwgZ3JlZW4pOworICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHJlZF90b19ibHVlLCByZWQpOworICByZXR1cm4gKG5ld19ibHVlICYgMHhmZik7Cit9CisKK3ZvaWQgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19yZWQsIGludCBoaXN0b1tdKSB7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGZvciAoeCA9IDA7IHggPCB0aWxlX3dpZHRoOyArK3gpIHsKKyAgICAgICsraGlzdG9bVHJhbnNmb3JtQ29sb3JSZWQoZ3JlZW5fdG9fcmVkLCBhcmdiW3hdKV07CisgICAgfQorICAgIGFyZ2IgKz0gc3RyaWRlOworICB9Cit9CisKK3ZvaWQgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGZvciAoeCA9IDA7IHggPCB0aWxlX3dpZHRoOyArK3gpIHsKKyAgICAgICsraGlzdG9bVHJhbnNmb3JtQ29sb3JCbHVlKGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBhcmdiW3hdKV07CisgICAgfQorICAgIGFyZ2IgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgVmVjdG9yTWlzbWF0Y2hfQyhjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsIGludCBsZW5ndGgpIHsKKyAgaW50IG1hdGNoX2xlbiA9IDA7CisKKyAgd2hpbGUgKG1hdGNoX2xlbiA8IGxlbmd0aCAmJiBhcnJheTFbbWF0Y2hfbGVuXSA9PSBhcnJheTJbbWF0Y2hfbGVuXSkgeworICAgICsrbWF0Y2hfbGVuOworICB9CisgIHJldHVybiBtYXRjaF9sZW47Cit9CisKKy8vIEJ1bmRsZXMgbXVsdGlwbGUgKDEsIDIsIDQgb3IgOCkgcGl4ZWxzIGludG8gYSBzaW5nbGUgcGl4ZWwuCit2b2lkIFZQOExCdW5kbGVDb2xvck1hcF9DKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLCBpbnQgeGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IHg7CisgIGlmICh4Yml0cyA+IDApIHsKKyAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gMSA8PCAoMyAtIHhiaXRzKTsKKyAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHhiaXRzKSAtIDE7CisgICAgdWludDMyX3QgY29kZSA9IDB4ZmYwMDAwMDA7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgIGNvbnN0IGludCB4c3ViID0geCAmIG1hc2s7CisgICAgICBpZiAoeHN1YiA9PSAwKSB7CisgICAgICAgIGNvZGUgPSAweGZmMDAwMDAwOworICAgICAgfQorICAgICAgY29kZSB8PSByb3dbeF0gPDwgKDggKyBiaXRfZGVwdGggKiB4c3ViKTsKKyAgICAgIGRzdFt4ID4+IHhiaXRzXSA9IGNvZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSBkc3RbeF0gPSAweGZmMDAwMDAwIHwgKHJvd1t4XSA8PCA4KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlIEV4dHJhQ29zdF9DKGNvbnN0IHVpbnQzMl90KiBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBkb3VibGUgY29zdCA9IDAuOworICBmb3IgKGkgPSAyOyBpIDwgbGVuZ3RoIC0gMjsgKytpKSBjb3N0ICs9IChpID4+IDEpICogcG9wdWxhdGlvbltpICsgMl07CisgIHJldHVybiBjb3N0OworfQorCitzdGF0aWMgZG91YmxlIEV4dHJhQ29zdENvbWJpbmVkX0MoY29uc3QgdWludDMyX3QqIFgsIGNvbnN0IHVpbnQzMl90KiBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGRvdWJsZSBjb3N0ID0gMC47CisgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGggLSAyOyArK2kpIHsKKyAgICBjb25zdCBpbnQgeHkgPSBYW2kgKyAyXSArIFlbaSArIDJdOworICAgIGNvc3QgKz0gKGkgPj4gMSkgKiB4eTsKKyAgfQorICByZXR1cm4gY29zdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSGlzdG9ncmFtQWRkX0MoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBsaXRlcmFsX3NpemUgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgYXNzZXJ0KGEtPnBhbGV0dGVfY29kZV9iaXRzXyA9PSBiLT5wYWxldHRlX2NvZGVfYml0c18pOworICBpZiAoYiAhPSBvdXQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGl0ZXJhbF9zaXplOyArK2kpIHsKKyAgICAgIG91dC0+bGl0ZXJhbF9baV0gPSBhLT5saXRlcmFsX1tpXSArIGItPmxpdGVyYWxfW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+ZGlzdGFuY2VfW2ldID0gYS0+ZGlzdGFuY2VfW2ldICsgYi0+ZGlzdGFuY2VfW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xJVEVSQUxfQ09ERVM7ICsraSkgeworICAgICAgb3V0LT5yZWRfW2ldID0gYS0+cmVkX1tpXSArIGItPnJlZF9baV07CisgICAgICBvdXQtPmJsdWVfW2ldID0gYS0+Ymx1ZV9baV0gKyBiLT5ibHVlX1tpXTsKKyAgICAgIG91dC0+YWxwaGFfW2ldID0gYS0+YWxwaGFfW2ldICsgYi0+YWxwaGFfW2ldOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGl0ZXJhbF9zaXplOyArK2kpIHsKKyAgICAgIG91dC0+bGl0ZXJhbF9baV0gKz0gYS0+bGl0ZXJhbF9baV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgeworICAgICAgb3V0LT5kaXN0YW5jZV9baV0gKz0gYS0+ZGlzdGFuY2VfW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xJVEVSQUxfQ09ERVM7ICsraSkgeworICAgICAgb3V0LT5yZWRfW2ldICs9IGEtPnJlZF9baV07CisgICAgICBvdXQtPmJsdWVfW2ldICs9IGEtPmJsdWVfW2ldOworICAgICAgb3V0LT5hbHBoYV9baV0gKz0gYS0+YWxwaGFfW2ldOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1hZ2UgdHJhbnNmb3Jtcy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICByZXR1cm4gKCgoYTAgXiBhMSkgJiAweGZlZmVmZWZldSkgPj4gMSkgKyAoYTAgJiBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMyh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsIHVpbnQzMl90IGEyKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTIpLCBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNCh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTEpLCBBdmVyYWdlMihhMiwgYTMpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsaXAyNTUodWludDMyX3QgYSkgeworICBpZiAoYSA8IDI1NikgeworICAgIHJldHVybiBhOworICB9CisgIC8vIHJldHVybiAwLCB3aGVuIGEgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLgorICAvLyByZXR1cm4gMjU1LCB3aGVuIGEgaXMgcG9zaXRpdmUuCisgIHJldHVybiB+YSA+PiAyNDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgeworICByZXR1cm4gQ2xpcDI1NShhICsgYiAtIGMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiA4KSAmIDB4ZmYpOworICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCAmIDB4ZmYsIGMxICYgMHhmZiwgYzIgJiAweGZmKTsKKyAgcmV0dXJuICgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGludCBhLCBpbnQgYikgeworICByZXR1cm4gQ2xpcDI1NShhICsgKGEgLSBiKSAvIDIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCB1aW50MzJfdCBhdmUgPSBBdmVyYWdlMihjMCwgYzEpOworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihhdmUgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAxNikgJiAweGZmLCAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gOCkgJiAweGZmLCAoYzIgPj4gOCkgJiAweGZmKTsKKyAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAwKSAmIDB4ZmYsIChjMiA+PiAwKSAmIDB4ZmYpOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK30KKworLy8gZ2NjLTQuOSBvbiBBUk0gZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGluIFNlbGVjdCgpIHdoZW4gU3ViMygpIGlzIGlubGluZWQuCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiBcCisgICAgKExPQ0FMX0dDQ19WRVJTSU9OID09IDB4NDA5IHx8IExPQ0FMX0dDQ19WRVJTSU9OID09IDB4NDA4KQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIFdFQlBfSU5MSU5FCisjZW5kaWYKKworc3RhdGljIExPQ0FMX0lOTElORSBpbnQgU3ViMyhpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIGNvbnN0IGludCBwYiA9IGIgLSBjOworICBjb25zdCBpbnQgcGEgPSBhIC0gYzsKKyAgcmV0dXJuIGFicyhwYikgLSBhYnMocGEpOworfQorCisjdW5kZWYgTE9DQUxfSU5MSU5FCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWxlY3QodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYykgeworICBjb25zdCBpbnQgcGFfbWludXNfcGIgPQorICAgICAgU3ViMygoYSA+PiAyNCkgICAgICAgLCAoYiA+PiAyNCkgICAgICAgLCAoYyA+PiAyNCkgICAgICAgKSArCisgICAgICBTdWIzKChhID4+IDE2KSAmIDB4ZmYsIChiID4+IDE2KSAmIDB4ZmYsIChjID4+IDE2KSAmIDB4ZmYpICsKKyAgICAgIFN1YjMoKGEgPj4gIDgpICYgMHhmZiwgKGIgPj4gIDgpICYgMHhmZiwgKGMgPj4gIDgpICYgMHhmZikgKworICAgICAgU3ViMygoYSAgICAgICkgJiAweGZmLCAoYiAgICAgICkgJiAweGZmLCAoYyAgICAgICkgJiAweGZmKTsKKyAgcmV0dXJuIChwYV9taW51c19wYiA8PSAwKSA/IGEgOiBiOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9ycworCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMF07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMV07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbLTFdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjUodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjgodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTEodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMF9DKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSBvdXRbaV0gPSBWUDhMU3ViUGl4ZWxzKGluW2ldLCBBUkdCX0JMQUNLKTsKKyAgKHZvaWQpdXBwZXI7Cit9CisKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjFfQyhjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgb3V0W2ldID0gVlA4TFN1YlBpeGVscyhpbltpXSwgaW5baSAtIDFdKTsKKyAgKHZvaWQpdXBwZXI7Cit9CisKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMiwgUHJlZGljdG9yU3ViMl9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IzLCBQcmVkaWN0b3JTdWIzX0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjQsIFByZWRpY3RvclN1YjRfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yNSwgUHJlZGljdG9yU3ViNV9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I2LCBQcmVkaWN0b3JTdWI2X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjcsIFByZWRpY3RvclN1YjdfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yOCwgUHJlZGljdG9yU3ViOF9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I5LCBQcmVkaWN0b3JTdWI5X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjEwLCBQcmVkaWN0b3JTdWIxMF9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IxMSwgUHJlZGljdG9yU3ViMTFfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMTIsIFByZWRpY3RvclN1YjEyX0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjEzLCBQcmVkaWN0b3JTdWIxM19DKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUDhMUHJvY2Vzc0VuY0JsdWVBbmRSZWRGdW5jIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQ7CisKK1ZQOExUcmFuc2Zvcm1Db2xvckZ1bmMgVlA4TFRyYW5zZm9ybUNvbG9yOworCitWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNGdW5jIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtczsKK1ZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtczsKKworVlA4TEZhc3RMb2cyU2xvd0Z1bmMgVlA4TEZhc3RMb2cyU2xvdzsKK1ZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0U0xvZzJTbG93OworCitWUDhMQ29zdEZ1bmMgVlA4TEV4dHJhQ29zdDsKK1ZQOExDb3N0Q29tYmluZWRGdW5jIFZQOExFeHRyYUNvc3RDb21iaW5lZDsKK1ZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5RnVuYyBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weTsKKworVlA4TEdldEVudHJvcHlVbnJlZmluZWRGdW5jIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkOworVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZEZ1bmMgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZDsKKworVlA4TEhpc3RvZ3JhbUFkZEZ1bmMgVlA4TEhpc3RvZ3JhbUFkZDsKKworVlA4TFZlY3Rvck1pc21hdGNoRnVuYyBWUDhMVmVjdG9yTWlzbWF0Y2g7CitWUDhMQnVuZGxlQ29sb3JNYXBGdW5jIFZQOExCdW5kbGVDb2xvck1hcDsKKworVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNTdWJbMTZdOworVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNTdWJfQ1sxNl07CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0U1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhMRW5jRHNwSW5pdCkgeworICBWUDhMRHNwSW5pdCgpOworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DOworCisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFZQOExUcmFuc2Zvcm1Db2xvcl9DOworI2VuZGlmCisKKyAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zID0gVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0M7CisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zID0gVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfQzsKKworICBWUDhMRmFzdExvZzJTbG93ID0gRmFzdExvZzJTbG93X0M7CisgIFZQOExGYXN0U0xvZzJTbG93ID0gRmFzdFNMb2cyU2xvd19DOworCisgIFZQOExFeHRyYUNvc3QgPSBFeHRyYUNvc3RfQzsKKyAgVlA4TEV4dHJhQ29zdENvbWJpbmVkID0gRXh0cmFDb3N0Q29tYmluZWRfQzsKKyAgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHkgPSBDb21iaW5lZFNoYW5ub25FbnRyb3B5X0M7CisKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWQgPSBHZXRFbnRyb3B5VW5yZWZpbmVkX0M7CisgIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQgPSBHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRfQzsKKworICBWUDhMSGlzdG9ncmFtQWRkID0gSGlzdG9ncmFtQWRkX0M7CisKKyAgVlA4TFZlY3Rvck1pc21hdGNoID0gVmVjdG9yTWlzbWF0Y2hfQzsKKyAgVlA4TEJ1bmRsZUNvbG9yTWFwID0gVlA4TEJ1bmRsZUNvbG9yTWFwX0M7CisKKyAgVlA4TFByZWRpY3RvcnNTdWJbMF0gPSBQcmVkaWN0b3JTdWIwX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzFdID0gUHJlZGljdG9yU3ViMV9DOworICBWUDhMUHJlZGljdG9yc1N1YlsyXSA9IFByZWRpY3RvclN1YjJfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbM10gPSBQcmVkaWN0b3JTdWIzX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzRdID0gUHJlZGljdG9yU3ViNF9DOworICBWUDhMUHJlZGljdG9yc1N1Yls1XSA9IFByZWRpY3RvclN1YjVfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNl0gPSBQcmVkaWN0b3JTdWI2X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzddID0gUHJlZGljdG9yU3ViN19DOworICBWUDhMUHJlZGljdG9yc1N1Yls4XSA9IFByZWRpY3RvclN1YjhfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbOV0gPSBQcmVkaWN0b3JTdWI5X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEwXSA9IFByZWRpY3RvclN1YjEwX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzExXSA9IFByZWRpY3RvclN1YjExX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEyXSA9IFByZWRpY3RvclN1YjEyX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEzXSA9IFByZWRpY3RvclN1YjEzX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzE0XSA9IFByZWRpY3RvclN1YjBfQzsgIC8vIDwtIHBhZGRpbmcgc2VjdXJpdHkgc2VudGluZWxzCisgIFZQOExQcmVkaWN0b3JzU3ViWzE1XSA9IFByZWRpY3RvclN1YjBfQzsKKworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzBdID0gUHJlZGljdG9yU3ViMF9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzFdID0gUHJlZGljdG9yU3ViMV9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzJdID0gUHJlZGljdG9yU3ViMl9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzNdID0gUHJlZGljdG9yU3ViM19DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzRdID0gUHJlZGljdG9yU3ViNF9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzVdID0gUHJlZGljdG9yU3ViNV9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzZdID0gUHJlZGljdG9yU3ViNl9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzddID0gUHJlZGljdG9yU3ViN19DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzhdID0gUHJlZGljdG9yU3ViOF9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzldID0gUHJlZGljdG9yU3ViOV9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEwXSA9IFByZWRpY3RvclN1YjEwX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTFdID0gUHJlZGljdG9yU3ViMTFfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMl0gPSBQcmVkaWN0b3JTdWIxMl9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEzXSA9IFByZWRpY3RvclN1YjEzX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTRdID0gUHJlZGljdG9yU3ViMF9DOyAgLy8gPC0gcGFkZGluZyBzZWN1cml0eSBzZW50aW5lbHMKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxNV0gPSBQcmVkaWN0b3JTdWIwX0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOExFbmNEc3BJbml0U1NFMigpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgICBWUDhMRW5jRHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgVlA4TEVuY0RzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdE1TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgVlA4TEVuY0RzcEluaXRORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFRyYW5zZm9ybUNvbG9yICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMRmFzdExvZzJTbG93ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEZhc3RTTG9nMlNsb3cgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMRXh0cmFDb3N0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEV4dHJhQ29zdENvbWJpbmVkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMR2V0RW50cm9weVVucmVmaW5lZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMSGlzdG9ncmFtQWRkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFZlY3Rvck1pc21hdGNoICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEJ1bmRsZUNvbG9yTWFwICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbNl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls3XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzhdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbOV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsxNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzZdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s3XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbOF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzldICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzExXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzE0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTVdICE9IE5VTEwpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTgzYWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgbG9zc2xlc3MgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCitzdGF0aWMgZmxvYXQgRmFzdFNMb2cyU2xvd19NSVBTMzIodWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIHVpbnQzMl90IGxvZ19jbnQsIHksIGNvcnJlY3Rpb247CisgICAgY29uc3QgaW50IGMyNCA9IDI0OworICAgIGNvbnN0IGZsb2F0IHZfZiA9IChmbG9hdCl2OworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICAvLyBYZiA9IDI1NiA9IDJeOAorICAgIC8vIGxvZ19jbnQgaXMgaW5kZXggb2YgbGVhZGluZyBvbmUgaW4gdXBwZXIgMjQgYml0cworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAiY2x6ICAgICAgJVtsb2dfY250XSwgJVt2XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbeV0sICAgICAgICR6ZXJvLCAgICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgICAlW2xvZ19jbnRdLCAlW2MyNF0sICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICAic2xsdiAgICAgJVt5XSwgICAgICAgJVt5XSwgICAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgInNybHYgICAgICVbdGVtcF0sICAgICVbdl0sICAgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgIDogW2xvZ19jbnRdIj0mciIobG9nX2NudCksIFt5XSI9JnIiKHkpLAorICAgICAgICBbdGVtcF0iPXIiKHRlbXApCisgICAgICA6IFtjMjRdInIiKGMyNCksIFt2XSJyIih2KQorICAgICk7CisKKyAgICAvLyB2ZiA9ICgyXmxvZ19jbnQpICogWGY7IHdoZXJlIHkgPSAyXmxvZ19jbnQgYW5kIFhmIDwgMjU2CisgICAgLy8gWGYgPSBmbG9vcihYZikgKiAoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIGxvZzIoWGYpID0gbG9nMihmbG9vcihYZikpICsgbG9nMigxICsgKHYgJSB5KSAvIHYpCisgICAgLy8gVGhlIGNvcnJlY3Rpb24gZmFjdG9yOiBsb2coMSArIGQpIH4gZDsgZm9yIHZlcnkgc21hbGwgZCB2YWx1ZXMsIHNvCisgICAgLy8gbG9nMigxICsgKHYgJSB5KSAvIHYpIH4gTE9HXzJfUkVDSVBST0NBTCAqICh2ICUgeSkvdgorICAgIC8vIExPR18yX1JFQ0lQUk9DQUwgfiAyMy8xNgorCisgICAgLy8gKHYgJSB5KSA9ICh2ICUgMl5sb2dfY250KSA9IHYgJiAoMl5sb2dfY250IC0gMSkKKyAgICBjb3JyZWN0aW9uID0gKDIzICogKHYgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICByZXR1cm4gdl9mICogKGtMb2cyVGFibGVbdGVtcF0gKyBsb2dfY250KSArIGNvcnJlY3Rpb247CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIHYgKiBsb2coKGRvdWJsZSl2KSk7CisgIH0KK30KKworc3RhdGljIGZsb2F0IEZhc3RMb2cyU2xvd19NSVBTMzIodWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIHVpbnQzMl90IGxvZ19jbnQsIHk7CisgICAgY29uc3QgaW50IGMyNCA9IDI0OworICAgIGRvdWJsZSBsb2dfMjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICJjbHogICAgICAlW2xvZ19jbnRdLCAlW3ZdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVt5XSwgICAgICAgJHplcm8sICAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAgICVbbG9nX2NudF0sICVbYzI0XSwgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzbGx2ICAgICAlW3ldLCAgICAgICAlW3ldLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICAic3JsdiAgICAgJVt0ZW1wXSwgICAgJVt2XSwgICAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgOiBbbG9nX2NudF0iPSZyIihsb2dfY250KSwgW3ldIj0mciIoeSksCisgICAgICAgIFt0ZW1wXSI9ciIodGVtcCkKKyAgICAgIDogW2MyNF0iciIoYzI0KSwgW3ZdInIiKHYpCisgICAgKTsKKworICAgIGxvZ18yID0ga0xvZzJUYWJsZVt0ZW1wXSArIGxvZ19jbnQ7CisgICAgaWYgKHYgPj0gQVBQUk9YX0xPR19NQVgpIHsKKyAgICAgIC8vIFNpbmNlIHRoZSBkaXZpc2lvbiBpcyBzdGlsbCBleHBlbnNpdmUsIGFkZCB0aGlzIGNvcnJlY3Rpb24gZmFjdG9yIG9ubHkKKyAgICAgIC8vIGZvciBsYXJnZSB2YWx1ZXMgb2YgJ3YnLgorCisgICAgICBjb25zdCB1aW50MzJfdCBjb3JyZWN0aW9uID0gKDIzICogKHYgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICAgIGxvZ18yICs9IChkb3VibGUpY29ycmVjdGlvbiAvIHY7CisgICAgfQorICAgIHJldHVybiAoZmxvYXQpbG9nXzI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCisvLyBDIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbjoKKy8vICAgaW50IGkgPSAwOworLy8gICBpbnQ2NF90IGNvc3QgPSAwOworLy8gICBjb25zdCB1aW50MzJfdCogcG9wID0gJnBvcHVsYXRpb25bNF07CisvLyAgIGNvbnN0IHVpbnQzMl90KiBMb29wRW5kID0gJnBvcHVsYXRpb25bbGVuZ3RoXTsKKy8vICAgd2hpbGUgKHBvcCAhPSBMb29wRW5kKSB7CisvLyAgICAgKytpOworLy8gICAgIGNvc3QgKz0gaSAqICpwb3A7CisvLyAgICAgY29zdCArPSBpICogKihwb3AgKyAxKTsKKy8vICAgICBwb3AgKz0gMjsKKy8vICAgfQorLy8gICByZXR1cm4gKGRvdWJsZSljb3N0Oworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3RfTUlQUzMyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoKSB7CisgIGludCBpLCB0ZW1wMCwgdGVtcDE7CisgIGNvbnN0IHVpbnQzMl90KiBwb3AgPSAmcG9wdWxhdGlvbls0XTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IExvb3BFbmQgPSAmcG9wdWxhdGlvbltsZW5ndGhdOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgJVtpXSwgICAgICVbaV0sICAgICAgICVbaV0gICAgICAgXG5cdCIKKyAgICAiYmVxICAgICVbcG9wXSwgICAlW0xvb3BFbmRdLCAyZiAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMF0sIDAoJVtwb3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDFdLCA0KCVbcG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAlW2ldLCAgICAgJVtpXSwgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgJVtwb3BdLCAgICVbcG9wXSwgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAibWFkZCAgICVbaV0sICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1hZGQgICAlW2ldLCAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgJVtwb3BdLCAgICVbTG9vcEVuZF0sIDFiICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1maGkgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtZmxvICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbaV0iPSZyIihpKSwgW3BvcF0iK3IiKHBvcCkKKyAgICA6IFtMb29wRW5kXSJyIihMb29wRW5kKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICByZXR1cm4gKGRvdWJsZSkoKGludDY0X3QpdGVtcDAgPDwgMzIgfCB0ZW1wMSk7Cit9CisKKy8vIEMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uOgorLy8gICBpbnQgaSA9IDA7CisvLyAgIGludDY0X3QgY29zdCA9IDA7CisvLyAgIGNvbnN0IHVpbnQzMl90KiBwWCA9ICZYWzRdOworLy8gICBjb25zdCB1aW50MzJfdCogcFkgPSAmWVs0XTsKKy8vICAgY29uc3QgdWludDMyX3QqIExvb3BFbmQgPSAmWFtsZW5ndGhdOworLy8gICB3aGlsZSAocFggIT0gTG9vcEVuZCkgeworLy8gICAgIGNvbnN0IHVpbnQzMl90IHh5MCA9ICpwWCArICpwWTsKKy8vICAgICBjb25zdCB1aW50MzJfdCB4eTEgPSAqKHBYICsgMSkgKyAqKHBZICsgMSk7CisvLyAgICAgKytpOworLy8gICAgIGNvc3QgKz0gaSAqIHh5MDsKKy8vICAgICBjb3N0ICs9IGkgKiB4eTE7CisvLyAgICAgcFggKz0gMjsKKy8vICAgICBwWSArPSAyOworLy8gICB9CisvLyAgIHJldHVybiAoZG91YmxlKWNvc3Q7CitzdGF0aWMgZG91YmxlIEV4dHJhQ29zdENvbWJpbmVkX01JUFMzMihjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBZLCBpbnQgbGVuZ3RoKSB7CisgIGludCBpLCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgdWludDMyX3QqIHBYID0gJlhbNF07CisgIGNvbnN0IHVpbnQzMl90KiBwWSA9ICZZWzRdOworICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9ICZYW2xlbmd0aF07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAlW2ldLCAgICAgJVtpXSwgICAgICAgJVtpXSAgICAgICBcblx0IgorICAgICJiZXEgICAgJVtwWF0sICAgICVbTG9vcEVuZF0sIDJmICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAwXSwgMCglW3BYXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMV0sIDAoJVtwWV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDJdLCA0KCVbcFhdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAzXSwgNCglW3BZXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgJVtpXSwgICAgICVbaV0sICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICVbdGVtcDBdLCAlW3RlbXAwXSwgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFkZHUgICAlW3RlbXAyXSwgJVt0ZW1wMl0sICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGRpdSAgJVtwWF0sICAgICVbcFhdLCAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbcFldLCAgICAlW3BZXSwgICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgIm1hZGQgICAlW2ldLCAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICVbcFhdLCAgICAlW0xvb3BFbmRdLCAxYiAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtZmhpICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZsbyAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFtpXSI9JnIiKGkpLCBbcFhdIityIihwWCksIFtwWV0iK3IiKHBZKQorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiAoZG91YmxlKSgoaW50NjRfdCl0ZW1wMCA8PCAzMiB8IHRlbXAxKTsKK30KKworI2RlZmluZSBIVUZGTUFOX0NPU1RfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNsbCAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGRpdSAlW3RlbXAzXSwgICVbc3RyZWFrXSwgICAtMyAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wMl0sICAlW3BzdHJlYWtzXSwgJVt0ZW1wMV0gICAgXG5cdCIgICAgICBcCisgICAgImJsZXogICVbdGVtcDNdLCAgMWYgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJzcmwgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wM10sICAlW3BjbnRzXSwgICAgJVt0ZW1wMV0gICAgXG5cdCIgICAgICBcCisgICAgImx3ICAgICVbdGVtcDBdLCAgNCglW3RlbXAyXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJsdyAgICAlW3RlbXAxXSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVtzdHJlYWtdICAgXG5cdCIgICAgICBcCisgICAgImFkZGl1ICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJzdyAgICAlW3RlbXAwXSwgIDQoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAic3cgICAgJVt0ZW1wMV0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImIgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAibHcgICAgJVt0ZW1wMF0sICAwKCVbdGVtcDJdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZHUgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbc3RyZWFrXSAgIFxuXHQiICAgICAgXAorICAgICJzdyAgICAlW3RlbXAwXSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgICAgXAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXAwXSIrciIodGVtcDApICAgICAgICAgICAgIFwKKyAgICA6IFtwc3RyZWFrc10iciIocHN0cmVha3MpLCBbcGNudHNdInIiKHBjbnRzKSwgICAgICAgICBcCisgICAgICBbc3RyZWFrXSJyIihzdHJlYWspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsKKworLy8gUmV0dXJucyB0aGUgdmFyaW91cyBSTEUgY291bnRzCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKAorICAgIHVpbnQzMl90IHZhbCwgaW50IGksIHVpbnQzMl90KiBjb25zdCB2YWxfcHJldiwgaW50KiBjb25zdCBpX3ByZXYsCisgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LCBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50KiBjb25zdCBwc3RyZWFrcyA9ICZzdGF0cy0+c3RyZWFrc1swXVswXTsKKyAgaW50KiBjb25zdCBwY250cyA9ICZzdGF0cy0+Y291bnRzWzBdOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IGludCBzdHJlYWsgPSBpIC0gKmlfcHJldjsKKworICAvLyBHYXRoZXIgaW5mbyBmb3IgdGhlIGJpdCBlbnRyb3B5LgorICBpZiAoKnZhbF9wcmV2ICE9IDApIHsKKyAgICBiaXRfZW50cm9weS0+c3VtICs9ICgqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvcyArPSBzdHJlYWs7CisgICAgYml0X2VudHJvcHktPm5vbnplcm9fY29kZSA9ICppX3ByZXY7CisgICAgYml0X2VudHJvcHktPmVudHJvcHkgLT0gVlA4TEZhc3RTTG9nMigqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGlmIChiaXRfZW50cm9weS0+bWF4X3ZhbCA8ICp2YWxfcHJldikgeworICAgICAgYml0X2VudHJvcHktPm1heF92YWwgPSAqdmFsX3ByZXY7CisgICAgfQorICB9CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBIdWZmbWFuIGNvc3QuCisgIHRlbXAwID0gKCp2YWxfcHJldiAhPSAwKTsKKyAgSFVGRk1BTl9DT1NUX1BBU1MKKworICAqdmFsX3ByZXYgPSB2YWw7CisgICppX3ByZXYgPSBpOworfQorCitzdGF0aWMgdm9pZCBHZXRFbnRyb3B5VW5yZWZpbmVkX01JUFMzMihjb25zdCB1aW50MzJfdCBYW10sIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IGk7CisgIGludCBpX3ByZXYgPSAwOworICB1aW50MzJfdCB4X3ByZXYgPSBYWzBdOworCisgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICBWUDhMQml0RW50cm9weUluaXQoYml0X2VudHJvcHkpOworCisgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHggPSBYW2ldOworICAgIGlmICh4ICE9IHhfcHJldikgeworICAgICAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4LCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworICAgIH0KKyAgfQorICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKDAsIGksICZ4X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisKKyAgYml0X2VudHJvcHktPmVudHJvcHkgKz0gVlA4TEZhc3RTTG9nMihiaXRfZW50cm9weS0+c3VtKTsKK30KKworc3RhdGljIHZvaWQgR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkX01JUFMzMihjb25zdCB1aW50MzJfdCBYW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IFlbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGVudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQgaSA9IDE7CisgIGludCBpX3ByZXYgPSAwOworICB1aW50MzJfdCB4eV9wcmV2ID0gWFswXSArIFlbMF07CisKKyAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgIFZQOExCaXRFbnRyb3B5SW5pdChlbnRyb3B5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4eSA9IFhbaV0gKyBZW2ldOworICAgIGlmICh4eSAhPSB4eV9wcmV2KSB7CisgICAgICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKHh5LCBpLCAmeHlfcHJldiwgJmlfcHJldiwgZW50cm9weSwgc3RhdHMpOworICAgIH0KKyAgfQorICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKDAsIGksICZ4eV9wcmV2LCAmaV9wcmV2LCBlbnRyb3B5LCBzdGF0cyk7CisKKyAgZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGVudHJvcHktPnN1bSk7Cit9CisKKyNkZWZpbmUgQVNNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIi5zZXQgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiLnNldCAgIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAgICIuc2V0ICAgbWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIFAyID0gUDAgKyBQMQorLy8gQS4uRCAtIG9mZnNldHMKKy8vIEUgLSB0ZW1wIHZhcmlhYmxlIHRvIHRlbGwgbWFjcm8KKy8vICAgICBpZiBwb2ludGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZAorLy8gbGl0ZXJhbF8gYW5kIHN1Y2Nlc3NpdmUgaGlzdG9ncmFtcyBjb3VsZCBiZSB1bmFsaWduZWQKKy8vIHNvIHdlIG11c3QgdXNlIHVsdyBhbmQgdXN3CisjZGVmaW5lIEFERF9UT19PVVQoQSwgQiwgQywgRCwgRSwgUDAsIFAxLCBQMikgICAgICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDBdLCAiICNBICIoJVsiICNQMCAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wMV0sICIgI0IgIiglWyIgI1AwICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAyXSwgIiAjQyAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDNdLCAiICNEICIoJVsiICNQMCAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wNF0sICIgI0EgIiglWyIgI1AxICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXA1XSwgIiAjQiAiKCVbIiAjUDEgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDZdLCAiICNDICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wN10sICIgI0QgIiglWyIgI1AxICJdKSAgICBcblx0IiAgICAgICBcCisgICAgImFkZHUgICAlW3RlbXA0XSwgJVt0ZW1wNF0sICAgJVt0ZW1wMF0gIFxuXHQiICAgICAgIFwKKyAgICAiYWRkdSAgICVbdGVtcDVdLCAlW3RlbXA1XSwgICAlW3RlbXAxXSAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wNl0sICVbdGVtcDZdLCAgICVbdGVtcDJdICBcblx0IiAgICAgICBcCisgICAgImFkZHUgICAlW3RlbXA3XSwgJVt0ZW1wN10sICAgJVt0ZW1wM10gIFxuXHQiICAgICAgIFwKKyAgICAiYWRkaXUgICVbIiAjUDAgIl0sICAlWyIgI1AwICJdLCAgMTYgICAgXG5cdCIgICAgICAgXAorICAiLmlmICIgI0UgIiA9PSAxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICAgImFkZGl1ICAlWyIgI1AxICJdLCAgJVsiICNQMSAiXSwgIDE2ICAgIFxuXHQiICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAgICJ1c3cgICAgJVt0ZW1wNF0sICIgI0EgIiglWyIgI1AyICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVzdyAgICAlW3RlbXA1XSwgIiAjQiAiKCVbIiAjUDIgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDZdLCAiICNDICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1c3cgICAgJVt0ZW1wN10sICIgI0QgIiglWyIgI1AyICJdKSAgICBcblx0IiAgICAgICBcCisgICAgImFkZGl1ICAlWyIgI1AyICJdLCAlWyIgI1AyICJdLCAgIDE2ICAgIFxuXHQiICAgICAgIFwKKyAgICAiYm5lICAgICVbIiAjUDAgIl0sICVbTG9vcEVuZF0sIDFiICAgICAgXG5cdCIgICAgICAgXAorICAgICIuc2V0ICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisKKyNkZWZpbmUgQVNNX0VORF9DT01NT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgICAgICAgICBcCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCAgICAgICAgIFwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksICAgICAgICAgXAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgICAgICAgICBcCisgICAgICBbcGFdIityIihwYSksIFtwb3V0XSIrciIocG91dCkKKworI2RlZmluZSBBU01fRU5EX0NPTU1PTl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbTG9vcEVuZF0iciIoTG9vcEVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6ICJtZW1vcnkiLCAiYXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOworCisjZGVmaW5lIEFTTV9FTkRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU01fRU5EX0NPTU1PTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgLCBbcGJdIityIihwYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMQorCisjZGVmaW5lIEFTTV9FTkRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU01fRU5EX0NPTU1PTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTTV9FTkRfQ09NTU9OXzEKKworI2RlZmluZSBBRERfVkVDVE9SKEEsIEIsIE9VVCwgU0laRSwgRVhUUkFfU0laRSkgIGRvIHsgICBcCisgIGNvbnN0IHVpbnQzMl90KiBwYSA9IChjb25zdCB1aW50MzJfdCopKEEpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QqIHBiID0gKGNvbnN0IHVpbnQzMl90KikoQik7ICAgICAgICAgICAgXAorICB1aW50MzJfdCogcG91dCA9ICh1aW50MzJfdCopKE9VVCk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBMb29wRW5kID0gcGEgKyAoU0laRSk7ICAgICAgICAgIFwKKyAgYXNzZXJ0KChTSVpFKSAlIDQgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBU01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFERF9UT19PVVQoMCwgNCwgOCwgMTIsIDEsIHBhLCBwYiwgcG91dCkgICAgICAgICAgICAgIFwKKyAgQVNNX0VORF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEVYVFJBX1NJWkUpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxhc3QgPSAoRVhUUkFfU0laRSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBsYXN0OyArK2kpIHBvdXRbaV0gPSBwYVtpXSArIHBiW2ldOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUREX1ZFQ1RPUl9FUShBLCBPVVQsIFNJWkUsIEVYVFJBX1NJWkUpICBkbyB7ICAgXAorICBjb25zdCB1aW50MzJfdCogcGEgPSAoY29uc3QgdWludDMyX3QqKShBKTsgICAgICAgICAgICBcCisgIHVpbnQzMl90KiBwb3V0ID0gKHVpbnQzMl90KikoT1VUKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IExvb3BFbmQgPSBwYSArIChTSVpFKTsgICAgICAgICAgXAorICBhc3NlcnQoKFNJWkUpICUgNCA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RPX09VVCgwLCA0LCA4LCAxMiwgMCwgcGEsIHBvdXQsIHBvdXQpICAgICAgICAgICAgXAorICBBU01fRU5EXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRVhUUkFfU0laRSkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGFzdCA9IChFWFRSQV9TSVpFKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGxhc3Q7ICsraSkgcG91dFtpXSArPSBwYVtpXTsgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgSGlzdG9ncmFtQWRkX01JUFMzMihjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKKyAgdWludDMyX3QgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICBjb25zdCBpbnQgZXh0cmFfY2FjaGVfc2l6ZSA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhhLT5wYWxldHRlX2NvZGVfYml0c18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyk7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKworICBpZiAoYiAhPSBvdXQpIHsKKyAgICBBRERfVkVDVE9SKGEtPmxpdGVyYWxfLCBiLT5saXRlcmFsXywgb3V0LT5saXRlcmFsXywKKyAgICAgICAgICAgICAgIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUywgZXh0cmFfY2FjaGVfc2l6ZSk7CisgICAgQUREX1ZFQ1RPUihhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgb3V0LT5kaXN0YW5jZV8sCisgICAgICAgICAgICAgICBOVU1fRElTVEFOQ0VfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1IoYS0+cmVkXywgYi0+cmVkXywgb3V0LT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUihhLT5ibHVlXywgYi0+Ymx1ZV8sIG91dC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SKGEtPmFscGhhXywgYi0+YWxwaGFfLCBvdXQtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICB9IGVsc2UgeworICAgIEFERF9WRUNUT1JfRVEoYS0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sCisgICAgICAgICAgICAgICAgICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsIGV4dHJhX2NhY2hlX3NpemUpOworICAgIEFERF9WRUNUT1JfRVEoYS0+ZGlzdGFuY2VfLCBvdXQtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1JfRVEoYS0+Ymx1ZV8sIG91dC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgfQorfQorCisjdW5kZWYgQUREX1ZFQ1RPUl9FUQorI3VuZGVmIEFERF9WRUNUT1IKKyN1bmRlZiBBU01fRU5EXzEKKyN1bmRlZiBBU01fRU5EXzAKKyN1bmRlZiBBU01fRU5EX0NPTU1PTl8xCisjdW5kZWYgQVNNX0VORF9DT01NT05fMAorI3VuZGVmIEFERF9UT19PVVQKKyN1bmRlZiBBU01fU1RBUlQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTMzIodm9pZCkgeworICBWUDhMRmFzdFNMb2cyU2xvdyA9IEZhc3RTTG9nMlNsb3dfTUlQUzMyOworICBWUDhMRmFzdExvZzJTbG93ID0gRmFzdExvZzJTbG93X01JUFMzMjsKKyAgVlA4TEV4dHJhQ29zdCA9IEV4dHJhQ29zdF9NSVBTMzI7CisgIFZQOExFeHRyYUNvc3RDb21iaW5lZCA9IEV4dHJhQ29zdENvbWJpbmVkX01JUFMzMjsKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWQgPSBHZXRFbnRyb3B5VW5yZWZpbmVkX01JUFMzMjsKKyAgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZCA9IEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZF9NSVBTMzI7CisgIFZQOExIaXN0b2dyYW1BZGQgPSBIaXN0b2dyYW1BZGRfTUlQUzMyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU1ZTZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDI4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTUlQU2RzcFIyKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gYXJnYl9kYXRhICsgKG51bV9waXhlbHMgJiB+Myk7CisgIHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHBfbG9vcDFfZW5kICsgKG51bV9waXhlbHMgJiAzKTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVthcmdiX2RhdGFdLCAgICAlW3BfbG9vcDFfZW5kXSwgICAgIDNmICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAwKCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMV0sICAgICAgICA0KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMl0sICAgICAgICA4KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgICAgICAxMiglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNV0sICAgICAgICAlW3RlbXAxXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNl0sICAgICAgICAlW3RlbXAyXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wN10sICAgICAgICAlW3RlbXAzXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVthcmdiX2RhdGFdLCAgICAlW2FyZ2JfZGF0YV0sICAgICAgIDE2ICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNV0sICAgICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNl0sICAgICAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wN10sICAgICAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucWIgICAgJVt0ZW1wMF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDRdIFxuXHQiCisgICAgInN1YnUucWIgICAgJVt0ZW1wMV0sICAgICAgICAlW3RlbXAxXSwgICAgICAgICAgICVbdGVtcDVdIFxuXHQiCisgICAgInN1YnUucWIgICAgJVt0ZW1wMl0sICAgICAgICAlW3RlbXAyXSwgICAgICAgICAgICVbdGVtcDZdIFxuXHQiCisgICAgInN1YnUucWIgICAgJVt0ZW1wM10sICAgICAgICAlW3RlbXAzXSwgICAgICAgICAgICVbdGVtcDddIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAtMTYoJVthcmdiX2RhdGFdKSAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMV0sICAgICAgICAtMTIoJVthcmdiX2RhdGFdKSAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMl0sICAgICAgICAtOCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVthcmdiX2RhdGFdLCAgICAlW3BfbG9vcDFfZW5kXSwgICAgIDBiICAgICAgIFxuXHQiCisgICAgIiBzdyAgICAgICAgJVt0ZW1wM10sICAgICAgICAtNCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVthcmdiX2RhdGFdLCAgICAlW3BfbG9vcDJfZW5kXSwgICAgIDJmICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAwKCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVthcmdiX2RhdGFdLCAgICAlW2FyZ2JfZGF0YV0sICAgICAgIDQgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucWIgICAgJVt0ZW1wMF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDRdIFxuXHQiCisgICAgImJuZSAgICAgICAgJVthcmdiX2RhdGFdLCAgICAlW3BfbG9vcDJfZW5kXSwgICAgIDFiICAgICAgIFxuXHQiCisgICAgIiBzdyAgICAgICAgJVt0ZW1wMF0sICAgICAgICAtNCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbYXJnYl9kYXRhXSIrJnIiKGFyZ2JfZGF0YSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwKKyAgICAgIFt0ZW1wN10iPSZyIih0ZW1wNykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OF90IGNvbG9yX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgY29sb3IpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoKGludCkoY29sb3JfcHJlZCkgKiBjb2xvcikgPj4gNTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JfTUlQU2RzcFIyKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIHVpbnQzMl90IGFyZ2IsIGFyZ2IxLCBuZXdfcmVkLCBuZXdfcmVkMTsKKyAgY29uc3QgdWludDMyX3QgR190b19SID0gbS0+Z3JlZW5fdG9fcmVkXzsKKyAgY29uc3QgdWludDMyX3QgR190b19CID0gbS0+Z3JlZW5fdG9fYmx1ZV87CisgIGNvbnN0IHVpbnQzMl90IFJfdG9fQiA9IG0tPnJlZF90b19ibHVlXzsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcF9lbmQgPSBkYXRhICsgKG51bV9waXhlbHMgJiB+MSk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgICVbZGF0YV0sICAgICAgJVtwX2xvb3BfZW5kXSwgIDFmICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAwXSwgICAgICVbR190b19SXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDFdLCAgICAgJVtHX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMl0sICAgICAlW1JfdG9fQl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYl0sICAgICAgMCglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAgJVthcmdiMV0sICAgICA0KCVbZGF0YV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxodSAgICAgICAgICAgICAlW25ld19yZWRdLCAgIDIoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh1ICAgICAgICAgICAgICVbbmV3X3JlZDFdLCAgNiglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucWIucGggICAgJVt0ZW1wM10sICAgICAlW2FyZ2JdLCAgICAgICAgJVthcmdiMV0gIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA0XSwgICAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDBdICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXAyXSAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgICVbZGF0YV0sICAgICAgJVtkYXRhXSwgICAgICAgIDggICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAgJVtuZXdfcmVkMV0sICAlW25ld19yZWRdLCAgICAgMTYsICAgMTYgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYl0sICAgICAgICAxNiwgICAxNiAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICVbbmV3X3JlZDFdLCAgJVtuZXdfcmVkMV0sICAgICVbdGVtcDVdICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wM10gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXA1XSwgICAgICVbbmV3X3JlZDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDRdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW2FyZ2IxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC0yKCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTQoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICAxNiAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTYoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgICAgJVtkYXRhXSwgICAgICAlW3BfbG9vcF9lbmRdLCAgMGIgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAgICAgICAlW3RlbXAzXSwgICAgIC04KCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtuZXdfcmVkMV0iPSZyIihuZXdfcmVkMSksIFtuZXdfcmVkXSI9JnIiKG5ld19yZWQpLAorICAgICAgW2FyZ2JdIj0mciIoYXJnYiksIFthcmdiMV0iPSZyIihhcmdiMSksIFtkYXRhXSIrJnIiKGRhdGEpCisgICAgOiBbR190b19SXSJyIihHX3RvX1IpLCBbUl90b19CXSJyIihSX3RvX0IpLAorICAgICAgW0dfdG9fQl0iciIoR190b19CKSwgW3BfbG9vcF9lbmRdInIiKHBfbG9vcF9lbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIGlmIChudW1fcGl4ZWxzICYgMSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2JfID0gZGF0YVswXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2JfID4+IDg7CisgICAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYl8gPj4gMTY7CisgICAgdWludDMyX3QgbmV3X2JsdWUgPSBhcmdiXzsKKyAgICBuZXdfcmVkID0gcmVkOworICAgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7CisgICAgbmV3X3JlZCAmPSAweGZmOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgcmVkKTsKKyAgICBuZXdfYmx1ZSAmPSAweGZmOworICAgIGRhdGFbMF0gPSAoYXJnYl8gJiAweGZmMDBmZjAwdSkgfCAobmV3X3JlZCA8PCAxNikgfCAobmV3X2JsdWUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yQmx1ZSh1aW50OF90IGdyZWVuX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICB1aW50OF90IG5ld19ibHVlID0gYXJnYjsKKyAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19ibHVlLCBncmVlbik7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocmVkX3RvX2JsdWUsIHJlZCk7CisgIHJldHVybiAobmV3X2JsdWUgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICBjb25zdCBpbnQgcnRiID0gKHJlZF90b19ibHVlIDw8IDE2KSB8IChyZWRfdG9fYmx1ZSAmIDB4ZmZmZik7CisgIGNvbnN0IGludCBndGIgPSAoZ3JlZW5fdG9fYmx1ZSA8PCAxNikgfCAoZ3JlZW5fdG9fYmx1ZSAmIDB4ZmZmZik7CisgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAweGZmMDBmZnU7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGNvbnN0IHVpbnQzMl90KiBwX2FyZ2IgPSBhcmdiOworICAgIGFyZ2IgKz0gc3RyaWRlOworICAgIGZvciAoeCA9IDA7IHggPCAodGlsZV93aWR0aCA+PiAxKTsgKyt4KSB7CisgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImx3ICAgICAgICAgICAlW3RlbXAwXSwgIDAoJVtwX2FyZ2JdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgICAgICVbdGVtcDFdLCAgNCglW3BfYXJnYl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMl0sICAlW3RlbXAwXSwgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgMTYsICAgIDE2ICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wM10sICAlW3RlbXAxXSwgIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5waCAgICAgICAlW3RlbXA1XSwgICVbdGVtcDJdLCAgJVtydGJdICAgICAgICBcblx0IgorICAgICAgICAibXVsLnBoICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wM10sICAlW2d0Yl0gICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXAxXSwgICVbbWFza10gICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICAgICAlW3BfYXJnYl0sICVbcF9hcmdiXSwgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICA1ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgIDUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUucWIgICAgICAlW3RlbXAyXSwgICVbdGVtcDRdLCAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAic3VidS5xYiAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAgIDogW3BfYXJnYl0iKyZyIihwX2FyZ2IpLCBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksCisgICAgICAgICAgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgICAgICA6IFtydGJdInIiKHJ0YiksIFtndGJdInIiKGd0YiksIFttYXNrXSJyIihtYXNrKQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgICApOworICAgICAgKytoaXN0b1sodWludDhfdCkodGVtcDIgPj4gMTYpXTsKKyAgICAgICsraGlzdG9bKHVpbnQ4X3QpdGVtcDJdOworICAgIH0KKyAgICBpZiAodGlsZV93aWR0aCAmIDEpIHsKKyAgICAgICsraGlzdG9bVHJhbnNmb3JtQ29sb3JCbHVlKGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCAqcF9hcmdiKV07CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yUmVkKHVpbnQ4X3QgZ3JlZW5fdG9fcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgdWludDMyX3QgbmV3X3JlZCA9IGFyZ2IgPj4gMTY7CisgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19yZWQsIGdyZWVuKTsKKyAgcmV0dXJuIChuZXdfcmVkICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IGludCBndHIgPSAoZ3JlZW5fdG9fcmVkIDw8IDE2KSB8IChncmVlbl90b19yZWQgJiAweGZmZmYpOworICB3aGlsZSAodGlsZV9oZWlnaHQtLSA+IDApIHsKKyAgICBpbnQgeDsKKyAgICBjb25zdCB1aW50MzJfdCogcF9hcmdiID0gYXJnYjsKKyAgICBhcmdiICs9IHN0cmlkZTsKKyAgICBmb3IgKHggPSAwOyB4IDwgKHRpbGVfd2lkdGggPj4gMSk7ICsreCkgeworICAgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHcgICAgICAgICAgICVbdGVtcDBdLCAgMCglW3BfYXJnYl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMV0sICA0KCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInByZWNycS5waC53ICAlW3RlbXA0XSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAxNiwgICAgMTYgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wM10sICAlW3RlbXAxXSwgIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5waCAgICAgICAlW3RlbXAyXSwgICVbdGVtcDNdLCAgJVtndHJdICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgICAgICVbcF9hcmdiXSwgJVtwX2FyZ2JdLCA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUucWIgICAgICAlW3RlbXAyXSwgICVbdGVtcDRdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICAgICA6IFtwX2FyZ2JdIismciIocF9hcmdiKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpCisgICAgICAgIDogW2d0cl0iciIoZ3RyKQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgICApOworICAgICAgKytoaXN0b1sodWludDhfdCkodGVtcDIgPj4gMTYpXTsKKyAgICAgICsraGlzdG9bKHVpbnQ4X3QpdGVtcDJdOworICAgIH0KKyAgICBpZiAodGlsZV93aWR0aCAmIDEpIHsKKyAgICAgICsraGlzdG9bVHJhbnNmb3JtQ29sb3JSZWQoZ3JlZW5fdG9fcmVkLCAqcF9hcmdiKV07CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9NSVBTZHNwUjI7CisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFRyYW5zZm9ybUNvbG9yX01JUFNkc3BSMjsKKyAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfTUlQU2RzcFIyOworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDBkZGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLmMKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmFyaWFudCBvZiBJbWFnZSB0cmFuc2Zvcm0gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3JzOiBQcmFzaGFudCBQYXRpbCAoUHJhc2hhbnQuUGF0aWxAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorCisjZGVmaW5lIFRSQU5TRk9STV9DT0xPUl84KHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEsIGMwLCBjMSwgbWFzazAsIG1hc2sxKSBkbyB7ICBcCisgIHY4aTE2IGcwLCBnMSwgdDAsIHQxLCB0MiwgdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHQ0LCB0NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfU0goc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCBnMCwgZzEpOyAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfU0IyX1NIKGcwLCBnMSwgYzAsIGMwLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0godDAsIHQxLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2Ffc3Vidl9oKCh2OGkxNilzcmMwLCB0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2Ffc3Vidl9oKCh2OGkxNilzcmMxLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQ0ID0gX19tc2Ffc3JsaV93KCh2NGkzMilzcmMwLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQ1ID0gX19tc2Ffc3JsaV93KCh2NGkzMilzcmMxLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfU0IyX1NIKHQ0LCB0NSwgYzEsIGMxLCB0MiwgdDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0godDIsIHQzLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNVQjIodDAsIHQyLCB0MSwgdDMsIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIoc3JjMCwgdDAsIHNyYzEsIHQxLCBtYXNrMSwgbWFzazEsIGRzdDAsIGRzdDEpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQU5TRk9STV9DT0xPUl80KHNyYywgZHN0LCBjMCwgYzEsIG1hc2swLCBtYXNrMSkgZG8geyAgXAorICBjb25zdCB2MTZpOCBnMCA9IFZTSEZfU0Ioc3JjLCBzcmMsIG1hc2swKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdDAgPSBfX21zYV9kb3RwX3NfaChjMCwgZzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBTUkFJX0godDAsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2Ffc3Vidl9oKCh2OGkxNilzcmMsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IF9fbXNhX3NybGlfdygodjRpMzIpc3JjLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9kb3RwX3NfaChjMSwgKHYxNmk4KXQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gU1JBSV9IKHQxLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IHQwIC0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gVlNIRl9VQihzcmMsIHQwLCBtYXNrMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvcl9NU0EoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLCB1aW50MzJfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICB2MTZ1OCBzcmMwLCBkc3QwOworICBjb25zdCB2MTZpOCBnMmJyID0gKHYxNmk4KV9fbXNhX2ZpbGxfdyhtLT5ncmVlbl90b19ibHVlXyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtLT5ncmVlbl90b19yZWRfIDw8IDE2KSk7CisgIGNvbnN0IHYxNmk4IHIyYiA9ICh2MTZpOClfX21zYV9maWxsX3cobS0+cmVkX3RvX2JsdWVfKTsKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMywgMjU1LCAxMywgMjU1IH07CisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyAxNiwgMSwgMTgsIDMsIDIwLCA1LCAyMiwgNywgMjQsIDksIDI2LCAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDI4LCAxMywgMzAsIDE1IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIHYxNnU4IHNyYzEsIGRzdDE7CisgICAgTERfVUIyKGRhdGEsIDQsIHNyYzAsIHNyYzEpOworICAgIFRSQU5TRk9STV9DT0xPUl84KHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgZGF0YSwgNCk7CisgICAgZGF0YSArPSA4OworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBzcmMwID0gTERfVUIoZGF0YSk7CisgICAgICBUUkFOU0ZPUk1fQ09MT1JfNChzcmMwLCBkc3QwLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgICBTVF9VQihkc3QwLCBkYXRhKTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgICBzcmMwID0gTERfVUIoZGF0YSk7CisgICAgICBUUkFOU0ZPUk1fQ09MT1JfNChzcmMwLCBkc3QwLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgICBpZiAobnVtX3BpeGVscyA9PSAzKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDAsIDApOworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QwLCAyKTsKKyAgICAgICAgU0QocGl4X2QsIGRhdGEgKyAwKTsKKyAgICAgICAgU1cocGl4X3csIGRhdGEgKyAyKTsKKyAgICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAyKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDAsIDApOworICAgICAgICBTRChwaXhfZCwgZGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QwLCAwKTsKKyAgICAgICAgU1cocGl4X3csIGRhdGEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTVNBKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICB1aW50OF90KiBwdGVtcF9kYXRhID0gKHVpbnQ4X3QqKWFyZ2JfZGF0YTsKKyAgdjE2dTggc3JjMCwgZHN0MCwgdG1wMDsKKyAgY29uc3QgdjE2dTggbWFzayA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgMTMsIDI1NSwgMTMsIDI1NSB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICB2MTZ1OCBzcmMxLCBkc3QxLCB0bXAxOworICAgIExEX1VCMihwdGVtcF9kYXRhLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMwLCBtYXNrLCBtYXNrLCB0bXAwLCB0bXAxKTsKKyAgICBTVUIyKHNyYzAsIHRtcDAsIHNyYzEsIHRtcDEsIGRzdDAsIGRzdDEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBwdGVtcF9kYXRhLCAxNik7CisgICAgcHRlbXBfZGF0YSArPSA4ICogNDsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgc3JjMCA9IExEX1VCKHB0ZW1wX2RhdGEpOworICAgICAgdG1wMCA9IFZTSEZfVUIoc3JjMCwgc3JjMCwgbWFzayk7CisgICAgICBkc3QwID0gc3JjMCAtIHRtcDA7CisgICAgICBTVF9VQihkc3QwLCBwdGVtcF9kYXRhKTsKKyAgICAgIHB0ZW1wX2RhdGEgKz0gNCAqIDQ7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IHB0ZW1wX2RhdGFbMF07CisgICAgICBjb25zdCB1aW50OF90IGcgPSBwdGVtcF9kYXRhWzFdOworICAgICAgY29uc3QgdWludDhfdCByID0gcHRlbXBfZGF0YVsyXTsKKyAgICAgIHB0ZW1wX2RhdGFbMF0gPSAoYiAtIGcpICYgMHhmZjsKKyAgICAgIHB0ZW1wX2RhdGFbMl0gPSAociAtIGcpICYgMHhmZjsKKyAgICAgIHB0ZW1wX2RhdGEgKz0gNDsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRNU0Eodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX01TQTsKKyAgVlA4TFRyYW5zZm9ybUNvbG9yID0gVHJhbnNmb3JtQ29sb3JfTVNBOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRNU0EpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3YjczZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24uYwpAQCAtMCwwICsxLDE0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE5FT04gdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKKy8vIHZ0Ymw/X3U4IGFyZSBtYXJrZWQgdW5hdmFpbGFibGUgZm9yIGlPUyBhcm02NCB3aXRoIFhjb2RlIDwgNi4zLCB1c2UKKy8vIG5vbi1zdGFuZGFyZCB2ZXJzaW9ucyB0aGVyZS4KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgXAorICAgIGRlZmluZWQoX19hcHBsZV9idWlsZF92ZXJzaW9uX18pICYmIChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXzwgNjAyMDAzNykKKyNkZWZpbmUgVVNFX1ZUQkxRCisjZW5kaWYKKworI2lmZGVmIFVTRV9WVEJMUQorLy8gMjU1ID0gYnl0ZSB3aWxsIGJlIHplcm9lZAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0dyZWVuU2h1ZmZsZVsxNl0gPSB7CisgIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsIDEzLCAyNTUsIDEzLCAyNTUKK307CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHgxNl90IERvR3JlZW5TaHVmZmxlX05FT04oY29uc3QgdWludDh4MTZfdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUpIHsKKyAgcmV0dXJuIHZjb21iaW5lX3U4KHZ0YmwxcV91OChhcmdiLCB2Z2V0X2xvd191OChzaHVmZmxlKSksCisgICAgICAgICAgICAgICAgICAgICB2dGJsMXFfdTgoYXJnYiwgdmdldF9oaWdoX3U4KHNodWZmbGUpKSk7Cit9CisjZWxzZSAgLy8gIVVTRV9WVEJMUQorLy8gMjU1ID0gYnl0ZSB3aWxsIGJlIHplcm9lZAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0dyZWVuU2h1ZmZsZVs4XSA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1ICB9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4MTZfdCBEb0dyZWVuU2h1ZmZsZV9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4OF90IHNodWZmbGUpIHsKKyAgcmV0dXJuIHZjb21iaW5lX3U4KHZ0YmwxX3U4KHZnZXRfbG93X3U4KGFyZ2IpLCBzaHVmZmxlKSwKKyAgICAgICAgICAgICAgICAgICAgIHZ0YmwxX3U4KHZnZXRfaGlnaF91OChhcmdiKSwgc2h1ZmZsZSkpOworfQorI2VuZGlmICAvLyBVU0VfVlRCTFEKKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX05FT04odWludDMyX3QqIGFyZ2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBhcmdiX2RhdGEgKyAobnVtX3BpeGVscyAmIH4zKTsKKyNpZmRlZiBVU0VfVlRCTFEKKyAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlID0gdmxkMXFfdTgoa0dyZWVuU2h1ZmZsZSk7CisjZWxzZQorICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSA9IHZsZDFfdTgoa0dyZWVuU2h1ZmZsZSk7CisjZW5kaWYKKyAgZm9yICg7IGFyZ2JfZGF0YSA8IGVuZDsgYXJnYl9kYXRhICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGFyZ2IgPSB2bGQxcV91OCgodWludDhfdCopYXJnYl9kYXRhKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGdyZWVucyA9IERvR3JlZW5TaHVmZmxlX05FT04oYXJnYiwgc2h1ZmZsZSk7CisgICAgdnN0MXFfdTgoKHVpbnQ4X3QqKWFyZ2JfZGF0YSwgdnN1YnFfdTgoYXJnYiwgZ3JlZW5zKSk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyhhcmdiX2RhdGEsIG51bV9waXhlbHMgJiAzKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvcl9ORU9OKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgLy8gc2lnbi1leHRlbmRlZCBtdWx0aXBseWluZyBjb25zdGFudHMsIHByZS1zaGlmdGVkIGJ5IDYuCisjZGVmaW5lIENTVChYKSAgKCgoaW50MTZfdCkobS0+WCA8PCA4KSkgPj4gNikKKyAgY29uc3QgaW50MTZfdCByYls4XSA9IHsKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXykKKyAgfTsKKyAgY29uc3QgaW50MTZ4OF90IG11bHRzX3JiID0gdmxkMXFfczE2KHJiKTsKKyAgY29uc3QgaW50MTZfdCBiMls4XSA9IHsKKyAgICAwLCBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksCisgICAgMCwgQ1NUKHJlZF90b19ibHVlXyksIDAsIENTVChyZWRfdG9fYmx1ZV8pLAorICB9OworICBjb25zdCBpbnQxNng4X3QgbXVsdHNfYjIgPSB2bGQxcV9zMTYoYjIpOworI3VuZGVmIENTVAorI2lmZGVmIFVTRV9WVEJMUQorICBzdGF0aWMgY29uc3QgdWludDhfdCBrZzBnMFsxNl0gPSB7CisgICAgMjU1LCAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LCAxMywgMjU1LCAxMworICB9OworICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUgPSB2bGQxcV91OChrZzBnMCk7CisjZWxzZQorICBzdGF0aWMgY29uc3QgdWludDhfdCBrMGcwZ1s4XSA9IHsgMjU1LCAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1IH07CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlID0gdmxkMV91OChrMGcwZyk7CisjZW5kaWYKKyAgY29uc3QgdWludDMyeDRfdCBtYXNrX3JiID0gdmR1cHFfbl91MzIoMHgwMGZmMDBmZnUpOyAgLy8gcmVkLWJsdWUgbWFza3MKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaW4gPSB2bGQxcV91OCgodWludDhfdCopKGFyZ2JfZGF0YSArIGkpKTsKKyAgICAvLyAwIGcgMCBnCisgICAgY29uc3QgdWludDh4MTZfdCBncmVlbnMgPSBEb0dyZWVuU2h1ZmZsZV9ORU9OKGluLCBzaHVmZmxlKTsKKyAgICAvLyB4IGRyICB4IGRiMQorICAgIGNvbnN0IGludDE2eDhfdCBBID0gdnFkbXVsaHFfczE2KHZyZWludGVycHJldHFfczE2X3U4KGdyZWVucyksIG11bHRzX3JiKTsKKyAgICAvLyByIDAgICBiICAgMAorICAgIGNvbnN0IGludDE2eDhfdCBCID0gdnNobHFfbl9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTgoaW4pLCA4KTsKKyAgICAvLyB4IGRiMiAwICAgMAorICAgIGNvbnN0IGludDE2eDhfdCBDID0gdnFkbXVsaHFfczE2KEIsIG11bHRzX2IyKTsKKyAgICAvLyAwIDAgICB4IGRiMgorICAgIGNvbnN0IHVpbnQzMng0X3QgRCA9IHZzaHJxX25fdTMyKHZyZWludGVycHJldHFfdTMyX3MxNihDKSwgMTYpOworICAgIC8vIHggZHIgIHggIGRiCisgICAgY29uc3QgaW50OHgxNl90IEUgPSB2YWRkcV9zOCh2cmVpbnRlcnByZXRxX3M4X3UzMihEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczhfczE2KEEpKTsKKyAgICAvLyAwIGRyICAwICBkYgorICAgIGNvbnN0IHVpbnQzMng0X3QgRiA9IHZhbmRxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9zOChFKSwgbWFza19yYik7CisgICAgY29uc3QgaW50OHgxNl90IG91dCA9IHZzdWJxX3M4KHZyZWludGVycHJldHFfczhfdTgoaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3M4X3UzMihGKSk7CisgICAgdnN0MXFfczgoKGludDhfdCopKGFyZ2JfZGF0YSArIGkpLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBWUDhMVHJhbnNmb3JtQ29sb3JfQyhtLCBhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7Cit9CisKKyN1bmRlZiBVU0VfVlRCTFEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0TkVPTih2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTkVPTjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9yID0gVHJhbnNmb3JtQ29sb3JfTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdE5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGE5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMKQEAgLTAsMCArMSw3MDUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKworLy8gRm9yIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA1OgorI2RlZmluZSBDU1RfNWIoWCkgICgoKGludDE2X3QpKCh1aW50MTZfdCkoWCkgPDwgOCkpID4+IDUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX1NTRTIodWludDMyX3QqIGFyZ2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldKTsgLy8gYXJnYgorICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9zcmxpX2VwaTE2KGluLCA4KTsgICAgIC8vIDAgYSAwIGcKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEIsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsgIC8vIDBnMGcKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgQyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyhhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIFRyYW5zZm9ybQorCisjZGVmaW5lIE1LX0NTVF8xNihISSwgTE8pIFwKKyAgX21tX3NldDFfZXBpMzIoKGludCkoKCh1aW50MzJfdCkoSEkpIDw8IDE2KSB8ICgoTE8pICYgMHhmZmZmKSkpCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9yX1NTRTIoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscykgeworICBjb25zdCBfX20xMjhpIG11bHRzX3JiID0gTUtfQ1NUXzE2KENTVF81YihtLT5ncmVlbl90b19yZWRfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RfNWIobS0+Z3JlZW5fdG9fYmx1ZV8pKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19iMiA9IE1LX0NTVF8xNihDU1RfNWIobS0+cmVkX3RvX2JsdWVfKSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19hZyA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYwMGZmMDApOyAgLy8gYWxwaGEtZ3JlZW4gbWFza3MKKyAgY29uc3QgX19tMTI4aSBtYXNrX3JiID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDBmZik7ICAvLyByZWQtYmx1ZSBtYXNrcworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fYW5kX3NpMTI4KGluLCBtYXNrX2FnKTsgICAgIC8vIGEgICAwICAgZyAgIDAKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEIsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsgIC8vIGcwZzAKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbXVsaGlfZXBpMTYoQywgbXVsdHNfcmIpOyAgICAvLyB4IGRyICB4IGRiMQorICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9zbGxpX2VwaTE2KGluLCA4KTsgICAgICAgICAgIC8vIHIgMCAgIGIgICAwCisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX211bGhpX2VwaTE2KEUsIG11bHRzX2IyKTsgICAgLy8geCBkYjIgMCAgIDAKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fc3JsaV9lcGkzMihGLCAxNik7ICAgICAgICAgICAvLyAwIDAgICB4IGRiMgorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9hZGRfZXBpOChHLCBEKTsgICAgICAgICAgICAgIC8vIHggZHIgIHggIGRiCisgICAgY29uc3QgX19tMTI4aSBJID0gX21tX2FuZF9zaTEyOChILCBtYXNrX3JiKTsgICAgICAgLy8gMCBkciAgMCAgZGIKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgSSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExUcmFuc2Zvcm1Db2xvcl9DKG0sIGFyZ2JfZGF0YSArIGksIG51bV9waXhlbHMgLSBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTUEFOIDgKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX1NTRTIoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfciA9IE1LX0NTVF8xNihDU1RfNWIocmVkX3RvX2JsdWUpLCAwKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19nID0gTUtfQ1NUXzE2KDAsIENTVF81YihncmVlbl90b19ibHVlKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDApOyAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2tfYiA9IF9tbV9zZXQxX2VwaTMyKDB4MDAwMGZmKTsgIC8vIGJsdWUgbWFzaworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgICAgICAgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zbGxpX2VwaTE2KGluMCwgOCk7ICAgICAgICAvLyByIDAgIHwgYiAwCisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3NsbGlfZXBpMTYoaW4xLCA4KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fYW5kX3NpMTI4KGluMCwgbWFza19nKTsgICAgLy8gMCAwICB8IGcgMAorICAgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hbmRfc2kxMjgoaW4xLCBtYXNrX2cpOworICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9tdWxoaV9lcGkxNihBMCwgbXVsdHNfcik7ICAvLyB4IGRiIHwgMCAwCisgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX211bGhpX2VwaTE2KEExLCBtdWx0c19yKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fbXVsaGlfZXBpMTYoQjAsIG11bHRzX2cpOyAgLy8gMCAwICB8IHggZGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fbXVsaGlfZXBpMTYoQjEsIG11bHRzX2cpOworICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zdWJfZXBpOChpbjAsIEQwKTsgICAgICAgICAvLyB4IHggIHwgeCBiJworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zdWJfZXBpOChpbjEsIEQxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjAgPSBfbW1fc3JsaV9lcGkzMihDMCwgMTYpOyAgICAgICAgLy8gMCAwICB8IHggZGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjEgPSBfbW1fc3JsaV9lcGkzMihDMSwgMTYpOworICAgICAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9zdWJfZXBpOChFMCwgRjApOyAgICAgICAgICAvLyAwIDAgIHwgeCBiJworICAgICAgY29uc3QgX19tMTI4aSBHMSA9IF9tbV9zdWJfZXBpOChFMSwgRjEpOworICAgICAgY29uc3QgX19tMTI4aSBIMCA9IF9tbV9hbmRfc2kxMjgoRzAsIG1hc2tfYik7ICAgICAvLyAwIDAgIHwgMCBiCisgICAgICBjb25zdCBfX20xMjhpIEgxID0gX21tX2FuZF9zaTEyOChHMSwgbWFza19iKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9wYWNrc19lcGkzMihIMCwgSDEpOyAgICAgICAgLy8gMCBiJyB8IDAgYicKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXZhbHVlcywgSSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU1BBTjsgKytpKSArK2hpc3RvW3ZhbHVlc1tpXV07CisgICAgfQorICB9CisgIHsKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gdGlsZV93aWR0aCAmIChTUEFOIC0gMSk7CisgICAgaWYgKGxlZnRfb3ZlciA+IDApIHsKKyAgICAgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X292ZXIsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGhpc3RvKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19TU0UyKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19nID0gTUtfQ1NUXzE2KDAsIENTVF81YihncmVlbl90b19yZWQpKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2cgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMCk7ICAvLyBncmVlbiBtYXNrCisgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYpOworCisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgdGlsZV9oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBhcmdiICsgeSAqIHN0cmlkZTsKKyAgICBpbnQgaSwgeDsKKyAgICBmb3IgKHggPSAwOyB4ICsgU1BBTiA8PSB0aWxlX3dpZHRoOyB4ICs9IFNQQU4pIHsKKyAgICAgIHVpbnQxNl90IHZhbHVlc1tTUEFOXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyAgICAgICAgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIFNQQU4gLyAyXSk7CisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2FuZF9zaTEyOChpbjAsIG1hc2tfZyk7ICAgIC8vIDAgMCAgfCBnIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fYW5kX3NpMTI4KGluMSwgbWFza19nKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fc3JsaV9lcGkzMihpbjAsIDE2KTsgICAgICAgLy8gMCAwICB8IHggcgorICAgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9zcmxpX2VwaTMyKGluMSwgMTYpOworICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9tdWxoaV9lcGkxNihBMCwgbXVsdHNfZyk7ICAvLyAwIDAgIHwgeCBkcgorICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9tdWxoaV9lcGkxNihBMSwgbXVsdHNfZyk7CisgICAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX3N1Yl9lcGk4KEIwLCBDMCk7ICAgICAgICAgIC8vIHggeCAgfCB4IHInCisgICAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX3N1Yl9lcGk4KEIxLCBDMSk7CisgICAgICBjb25zdCBfX20xMjhpIEYwID0gX21tX2FuZF9zaTEyOChFMCwgbWFzayk7ICAgICAgIC8vIDAgMCAgfCAwIHInCisgICAgICBjb25zdCBfX20xMjhpIEYxID0gX21tX2FuZF9zaTEyOChFMSwgbWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIEkgPSBfbW1fcGFja3NfZXBpMzIoRjAsIEYxKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXZhbHVlcywgSSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU1BBTjsgKytpKSArK2hpc3RvW3ZhbHVlc1tpXV07CisgICAgfQorICB9CisgIHsKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gdGlsZV93aWR0aCAmIChTUEFOIC0gMSk7CisgICAgaWYgKGxlZnRfb3ZlciA+IDApIHsKKyAgICAgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0MoYXJnYiArIHRpbGVfd2lkdGggLSBsZWZ0X292ZXIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9vdmVyLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fcmVkLCBoaXN0byk7CisgICAgfQorICB9Cit9CisjdW5kZWYgU1BBTgorI3VuZGVmIE1LX0NTVF8xNgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIExJTkVfU0laRSAxNiAgICAvLyA4IG9yIDE2CitzdGF0aWMgdm9pZCBBZGRWZWN0b3JfU1NFMihjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIsIHVpbnQzMl90KiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgYXNzZXJ0KHNpemUgJSBMSU5FX1NJWkUgPT0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IExJTkVfU0laRSkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICA4XSk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArIDEyXSk7CisjZW5kaWYKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAxMl0pOworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDBdLCBfbW1fYWRkX2VwaTMyKGEwLCBiMCkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA0XSwgX21tX2FkZF9lcGkzMihhMSwgYjEpKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA4XSwgX21tX2FkZF9lcGkzMihhMiwgYjIpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAxMl0sIF9tbV9hZGRfZXBpMzIoYTMsIGIzKSk7CisjZW5kaWYKKyAgfQorfQorCitzdGF0aWMgdm9pZCBBZGRWZWN0b3JFcV9TU0UyKGNvbnN0IHVpbnQzMl90KiBhLCB1aW50MzJfdCogb3V0LCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgYXNzZXJ0KHNpemUgJSBMSU5FX1NJWkUgPT0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IExJTkVfU0laRSkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICA4XSk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArIDEyXSk7CisjZW5kaWYKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZvdXRbaSArICA0XSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZvdXRbaSArIDEyXSk7CisjZW5kaWYKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgMF0sIF9tbV9hZGRfZXBpMzIoYTAsIGIwKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDRdLCBfbW1fYWRkX2VwaTMyKGExLCBiMSkpOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDhdLCBfbW1fYWRkX2VwaTMyKGEyLCBiMikpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArIDEyXSwgX21tX2FkZF9lcGkzMihhMywgYjMpKTsKKyNlbmRpZgorICB9Cit9CisjdW5kZWYgTElORV9TSVpFCisKKy8vIE5vdGUgd2UgYXJlIGFkZGluZyB1aW50MzJfdCdzIGFzICpzaWduZWQqIGludDMyJ3MgKHVzaW5nIF9tbV9hZGRfZXBpMzIpLiBCdXQKKy8vIHRoYXQncyBvayBzaW5jZSB0aGUgaGlzdG9ncmFtIHZhbHVlcyBhcmUgbGVzcyB0aGFuIDE8PDI4IChtYXggcGljdHVyZSBzaXplKS4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZF9TU0UyKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgbGl0ZXJhbF9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEtPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgaWYgKGIgIT0gb3V0KSB7CisgICAgQWRkVmVjdG9yX1NTRTIoYS0+bGl0ZXJhbF8sIGItPmxpdGVyYWxfLCBvdXQtPmxpdGVyYWxfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yX1NTRTIoYS0+cmVkXywgYi0+cmVkXywgb3V0LT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yX1NTRTIoYS0+Ymx1ZV8sIGItPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yX1NTRTIoYS0+YWxwaGFfLCBiLT5hbHBoYV8sIG91dC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgIH0gZWxzZSB7CisgICAgQWRkVmVjdG9yRXFfU1NFMihhLT5saXRlcmFsXywgb3V0LT5saXRlcmFsXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvckVxX1NTRTIoYS0+cmVkXywgb3V0LT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yRXFfU1NFMihhLT5ibHVlXywgb3V0LT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvckVxX1NTRTIoYS0+YWxwaGFfLCBvdXQtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICB9CisgIGZvciAoaSA9IE5VTV9MSVRFUkFMX0NPREVTOyBpIDwgbGl0ZXJhbF9zaXplOyArK2kpIHsKKyAgICBvdXQtPmxpdGVyYWxfW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cm9weQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgWCBvciBZIGNvbnRyaWJ1dGlvbiBpcyB3b3J0aCBjb21wdXRpbmcgYW5kIGFkZGluZy4KKy8vIFVzZWQgaW4gbG9vcCB1bnJvbGxpbmcuCisjZGVmaW5lIEFOQUxZWkVfWF9PUl9ZKHhfb3JfeSwgaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHhfb3JfeSlbaSArIChqKV0gIT0gMCkgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoKHhfb3JfeSlbaSArIChqKV0pOyBcCisgIH0gd2hpbGUgKDApCisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBYICsgWSBjb250cmlidXRpb24gaXMgd29ydGggY29tcHV0aW5nIGFuZCBhZGRpbmcuCisvLyBVc2VkIGluIGxvb3AgdW5yb2xsaW5nLgorI2RlZmluZSBBTkFMWVpFX1hZKGopICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh0bXBbal0gIT0gMCkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIodG1wW2pdKTsgXAorICAgICAgQU5BTFlaRV9YX09SX1koWCwgaik7ICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgZmxvYXQgQ29tYmluZWRTaGFubm9uRW50cm9weV9TU0UyKGNvbnN0IGludCBYWzI1Nl0sIGNvbnN0IGludCBZWzI1Nl0pIHsKKyAgaW50IGk7CisgIGRvdWJsZSByZXR2YWwgPSAwLjsKKyAgaW50IHN1bVgsIHN1bVhZOworICBpbnQzMl90IHRtcFs0XTsKKyAgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgLy8gU3VtcyB1cCBYICsgWSwgNCBpbnRzIGF0IGEgdGltZSAoYW5kIHdpbGwgbWVyZ2UgaXQgYXQgdGhlIGVuZCBmb3Igc3VtWFkpLgorICBfX20xMjhpIHN1bVhZXzEyOCA9IHplcm87CisgIF9fbTEyOGkgc3VtWF8xMjggPSB6ZXJvOworCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgeCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKFggKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSB5ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoWSArIGkpKTsKKworICAgIC8vIENoZWNrIGlmIGFueSBYIGlzIG5vbi16ZXJvOiB0aGlzIGFjdHVhbGx5IHByb3ZpZGVzIGEgc3BlZWR1cCBhcyBYIGlzCisgICAgLy8gdXN1YWxseSBzcGFyc2UuCisgICAgaWYgKF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGkzMih4LCB6ZXJvKSkgIT0gMHhGRkZGKSB7CisgICAgICBjb25zdCBfX20xMjhpIHh5XzEyOCA9IF9tbV9hZGRfZXBpMzIoeCwgeSk7CisgICAgICBzdW1YWV8xMjggPSBfbW1fYWRkX2VwaTMyKHN1bVhZXzEyOCwgeHlfMTI4KTsKKworICAgICAgc3VtWF8xMjggPSBfbW1fYWRkX2VwaTMyKHN1bVhfMTI4LCB4KTsKKworICAgICAgLy8gQW5hbHl6ZSB0aGUgZGlmZmVyZW50IFggKyBZLgorICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCB4eV8xMjgpOworCisgICAgICBBTkFMWVpFX1hZKDApOworICAgICAgQU5BTFlaRV9YWSgxKTsKKyAgICAgIEFOQUxZWkVfWFkoMik7CisgICAgICBBTkFMWVpFX1hZKDMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBYIGlzIGZ1bGx5IDAsIHNvIG9ubHkgZGVhbCB3aXRoIFkuCisgICAgICBzdW1YWV8xMjggPSBfbW1fYWRkX2VwaTMyKHN1bVhZXzEyOCwgeSk7CisKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFksIDApOworICAgICAgQU5BTFlaRV9YX09SX1koWSwgMSk7CisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAyKTsKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFksIDMpOworICAgIH0KKyAgfQorCisgIC8vIFN1bSB1cCBzdW1YXzEyOCB0byBnZXQgc3VtWC4KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW1YXzEyOCk7CisgIHN1bVggPSB0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF07CisKKyAgLy8gU3VtIHVwIHN1bVhZXzEyOCB0byBnZXQgc3VtWFkuCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtWFlfMTI4KTsKKyAgc3VtWFkgPSB0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF07CisKKyAgcmV0dmFsICs9IFZQOExGYXN0U0xvZzIoc3VtWCkgKyBWUDhMRmFzdFNMb2cyKHN1bVhZKTsKKyAgcmV0dXJuIChmbG9hdClyZXR2YWw7Cit9CisjdW5kZWYgQU5BTFlaRV9YX09SX1kKKyN1bmRlZiBBTkFMWVpFX1hZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgVmVjdG9yTWlzbWF0Y2hfU1NFMihjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsIGludCBsZW5ndGgpIHsKKyAgaW50IG1hdGNoX2xlbjsKKworICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVswXSk7CisgICAgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MlswXSk7CisgICAgbWF0Y2hfbGVuID0gMDsKKyAgICBkbyB7CisgICAgICAvLyBMb29wIHVucm9sbGluZyBhbmQgZWFybHkgbG9hZCBib3RoIHByb3ZpZGUgYSBzcGVlZHVwIG9mIDEwJSBmb3IgdGhlCisgICAgICAvLyBjdXJyZW50IGZ1bmN0aW9uLiBBbHNvLCBtYXhfbGltaXQgY2FuIGJlIE1BWF9MRU5HVEg9NDA5NiBhdCBtb3N0LgorICAgICAgY29uc3QgX19tMTI4aSBjbXBBID0gX21tX2NtcGVxX2VwaTMyKEEwLCBBMSk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0KKyAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbbWF0Y2hfbGVuICsgNF0pOworICAgICAgY29uc3QgX19tMTI4aSBCMSA9CisgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyW21hdGNoX2xlbiArIDRdKTsKKyAgICAgIGlmIChfbW1fbW92ZW1hc2tfZXBpOChjbXBBKSAhPSAweGZmZmYpIGJyZWFrOworICAgICAgbWF0Y2hfbGVuICs9IDQ7CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSBjbXBCID0gX21tX2NtcGVxX2VwaTMyKEIwLCBCMSk7CisgICAgICAgIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxW21hdGNoX2xlbiArIDRdKTsKKyAgICAgICAgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbbWF0Y2hfbGVuICsgNF0pOworICAgICAgICBpZiAoX21tX21vdmVtYXNrX2VwaTgoY21wQikgIT0gMHhmZmZmKSBicmVhazsKKyAgICAgICAgbWF0Y2hfbGVuICs9IDQ7CisgICAgICB9CisgICAgfSB3aGlsZSAobWF0Y2hfbGVuICsgMTIgPCBsZW5ndGgpOworICB9IGVsc2UgeworICAgIG1hdGNoX2xlbiA9IDA7CisgICAgLy8gVW5yb2xsIHRoZSBwb3RlbnRpYWwgZmlyc3QgdHdvIGxvb3BzLgorICAgIGlmIChsZW5ndGggPj0gNCAmJgorICAgICAgICBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpMzIoCisgICAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbMF0pLAorICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyWzBdKSkpID09IDB4ZmZmZikgeworICAgICAgbWF0Y2hfbGVuID0gNDsKKyAgICAgIGlmIChsZW5ndGggPj0gOCAmJgorICAgICAgICAgIF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGkzMigKKyAgICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxWzRdKSwKKyAgICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyWzRdKSkpID09IDB4ZmZmZikgeworICAgICAgICBtYXRjaF9sZW4gPSA4OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHdoaWxlIChtYXRjaF9sZW4gPCBsZW5ndGggJiYgYXJyYXkxW21hdGNoX2xlbl0gPT0gYXJyYXkyW21hdGNoX2xlbl0pIHsKKyAgICArK21hdGNoX2xlbjsKKyAgfQorICByZXR1cm4gbWF0Y2hfbGVuOworfQorCisvLyBCdW5kbGVzIG11bHRpcGxlICgxLCAyLCA0IG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLgorc3RhdGljIHZvaWQgQnVuZGxlQ29sb3JNYXBfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCByb3csIGludCB3aWR0aCwgaW50IHhiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCB4OworICBhc3NlcnQoeGJpdHMgPj0gMCk7CisgIGFzc2VydCh4Yml0cyA8PSAzKTsKKyAgc3dpdGNoICh4Yml0cykgeworICAgIGNhc2UgMDogeworICAgICAgY29uc3QgX19tMTI4aSBmZiA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYwMCk7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgLy8gU3RvcmUgMHhmZjAwMDAwMCB8IChyb3dbeF0gPDwgOCkuCisgICAgICBmb3IgKHggPSAwOyB4ICsgMTYgPD0gd2lkdGg7IHggKz0gMTYsIGRzdCArPSAxNikgeworICAgICAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcm93W3hdKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBpbl9sbyA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIGluKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QwID0gX21tX3VucGFja2xvX2VwaTE2KGluX2xvLCBmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MSA9IF9tbV91bnBhY2toaV9lcGkxNihpbl9sbywgZmYpOworICAgICAgICBjb25zdCBfX20xMjhpIGluX2hpID0gX21tX3VucGFja2hpX2VwaTgoemVybywgaW4pOworICAgICAgICBjb25zdCBfX20xMjhpIGRzdDIgPSBfbW1fdW5wYWNrbG9fZXBpMTYoaW5faGksIGZmKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QzID0gX21tX3VucGFja2hpX2VwaTE2KGluX2hpLCBmZik7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbMF0sIGRzdDApOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzRdLCBkc3QxKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFs4XSwgZHN0Mik7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbMTJdLCBkc3QzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDE6IHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZmYgPSBfbW1fc2V0MV9lcGkxNigweGZmMDApOworICAgICAgY29uc3QgX19tMTI4aSBtdWwgPSBfbW1fc2V0MV9lcGkxNigweDExMCk7CisgICAgICBmb3IgKHggPSAwOyB4ICsgMTYgPD0gd2lkdGg7IHggKz0gMTYsIGRzdCArPSA4KSB7CisgICAgICAgIC8vIDBhMGIgfCAod2hlcmUgYS9iIGFyZSA0IGJpdHMpLgorICAgICAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcm93W3hdKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXAgPSBfbW1fbXVsbG9fZXBpMTYoaW4sIG11bCk7ICAvLyBhYmEwCisgICAgICAgIGNvbnN0IF9fbTEyOGkgcGFjayA9IF9tbV9hbmRfc2kxMjgodG1wLCBmZik7ICAgLy8gYWIwMAorICAgICAgICBjb25zdCBfX20xMjhpIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYocGFjaywgZmYpOworICAgICAgICBjb25zdCBfX20xMjhpIGRzdDEgPSBfbW1fdW5wYWNraGlfZXBpMTYocGFjaywgZmYpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzBdLCBkc3QwKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFs0XSwgZHN0MSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiB7CisgICAgICBjb25zdCBfX20xMjhpIG1hc2tfb3IgPSBfbW1fc2V0MV9lcGkzMigweGZmMDAwMDAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsX2NzdCA9IF9tbV9zZXQxX2VwaTE2KDB4MDEwNCk7CisgICAgICBjb25zdCBfX20xMjhpIG1hc2tfbXVsID0gX21tX3NldDFfZXBpMTYoMHgwZjAwKTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyAxNiA8PSB3aWR0aDsgeCArPSAxNiwgZHN0ICs9IDQpIHsKKyAgICAgICAgLy8gMDAwYTAwMGIwMDBjMDAwZCB8ICh3aGVyZSBhL2IvYy9kIGFyZSAyIGJpdHMpLgorICAgICAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcm93W3hdKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBtdWwgPSBfbW1fbXVsbG9fZXBpMTYoaW4sIG11bF9jc3QpOyAgLy8gMDBhYjAwYjAwMGNkMDBkMAorICAgICAgICBjb25zdCBfX20xMjhpIHRtcCA9IF9tbV9hbmRfc2kxMjgobXVsLCBtYXNrX211bCk7ICAvLyAwMGFiMDAwMDAwY2QwMDAwCisgICAgICAgIGNvbnN0IF9fbTEyOGkgc2hpZnQgPSBfbW1fc3JsaV9lcGkzMih0bXAsIDEyKTsgICAgIC8vIDAwMDAwMDAwYWIwMDAwMDAKKyAgICAgICAgY29uc3QgX19tMTI4aSBwYWNrID0gX21tX29yX3NpMTI4KHNoaWZ0LCB0bXApOyAgICAgLy8gMDAwMDAwMDBhYmNkMDAwMAorICAgICAgICAvLyBDb252ZXJ0IHRvIDB4ZmYwMCoqMDAuCisgICAgICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX29yX3NpMTI4KHBhY2ssIG1hc2tfb3IpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHJlcyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgYXNzZXJ0KHhiaXRzID09IDMpOworICAgICAgZm9yICh4ID0gMDsgeCArIDE2IDw9IHdpZHRoOyB4ICs9IDE2LCBkc3QgKz0gMikgeworICAgICAgICAvLyAwMDAwMDAwYTAwMDAwMDAwYi4uLiB8ICh3aGVyZSBhL2IgYXJlIDEgYml0KS4KKyAgICAgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJvd1t4XSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgc2hpZnQgPSBfbW1fc2xsaV9lcGk2NChpbiwgNyk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1vdmUgPSBfbW1fbW92ZW1hc2tfZXBpOChzaGlmdCk7CisgICAgICAgIGRzdFswXSA9IDB4ZmYwMDAwMDAgfCAoKG1vdmUgJiAweGZmKSA8PCA4KTsKKyAgICAgICAgZHN0WzFdID0gMHhmZjAwMDAwMCB8IChtb3ZlICYgMHhmZjAwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoeCAhPSB3aWR0aCkgeworICAgIFZQOExCdW5kbGVDb2xvck1hcF9DKHJvdyArIHgsIHdpZHRoIC0geCwgeGJpdHMsIGRzdCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhdGNoIHZlcnNpb24gb2YgUHJlZGljdG9yIFRyYW5zZm9ybSBzdWJ0cmFjdGlvbgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBdmVyYWdlMl9tMTI4aShjb25zdCBfX20xMjhpKiBjb25zdCBhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgYXZnKSB7CisgIC8vIChhICsgYikgPj4gMSA9ICgoYSArIGIgKyAxKSA+PiAxKSAtICgoYSBeIGIpICYgMSkKKyAgY29uc3QgX19tMTI4aSBvbmVzID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KCphMCwgKmExKTsKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoKmEwLCAqYTEpLCBvbmVzKTsKKyAgKmF2ZyA9IF9tbV9zdWJfZXBpOChhdmcxLCBvbmUpOworfQorCisvLyBQcmVkaWN0b3IwOiBBUkdCX0JMQUNLLgorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMF9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIGJsYWNrID0gX21tX3NldDFfZXBpMzIoQVJHQl9CTEFDSyk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgYmxhY2spOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8xKFgsIElOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIjI1gjI19TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBwcmVkID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKElOKSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDEsIGluW2kgLSAxXSkgICAgICAgLy8gUHJlZGljdG9yMTogTAorR0VORVJBVEVfUFJFRElDVE9SXzEoMiwgdXBwZXJbaV0pICAgICAgICAvLyBQcmVkaWN0b3IyOiBUCitHRU5FUkFURV9QUkVESUNUT1JfMSgzLCB1cHBlcltpICsgMV0pICAgIC8vIFByZWRpY3RvcjM6IFRSCitHRU5FUkFURV9QUkVESUNUT1JfMSg0LCB1cHBlcltpIC0gMV0pICAgIC8vIFByZWRpY3RvcjQ6IFRMCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzEKKworLy8gUHJlZGljdG9yNTogYXZnMihhdmcyKEwsIFRSKSwgVCkKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjVfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUUiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgKyAxXSk7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgX19tMTI4aSBhdmcsIHByZWQsIHJlczsKKyAgICBBdmVyYWdlMl9tMTI4aSgmTCwgJlRSLCAmYXZnKTsKKyAgICBBdmVyYWdlMl9tMTI4aSgmYXZnLCAmVCwgJnByZWQpOworICAgIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbNV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8yKFgsIEEsIEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIjI1gjI19TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSB0QSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihBKSk7ICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSB0QiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihCKSk7ICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7ICAgICAgICAgICAgICBcCisgICAgX19tMTI4aSBwcmVkLCByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQXZlcmFnZTJfbTEyOGkoJnRBLCAmdEIsICZwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDYsIGluW2kgLSAxXSwgdXBwZXJbaSAtIDFdKSAgIC8vIFByZWRpY3RvcjY6IGF2ZyhMLCBUTCkKK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDcsIGluW2kgLSAxXSwgdXBwZXJbaV0pICAgICAgIC8vIFByZWRpY3Rvcjc6IGF2ZyhMLCBUKQorR0VORVJBVEVfUFJFRElDVE9SXzIoOCwgdXBwZXJbaSAtIDFdLCB1cHBlcltpXSkgICAgLy8gUHJlZGljdG9yODogYXZnKFRMLCBUKQorR0VORVJBVEVfUFJFRElDVE9SXzIoOSwgdXBwZXJbaV0sIHVwcGVyW2kgKyAxXSkgICAgLy8gUHJlZGljdG9yOTogYXZlcmFnZShULCBUUikKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMgorCisvLyBQcmVkaWN0b3IxMDogYXZnKGF2ZyhMLFRMKSwgYXZnKFQsIFRSKSkuCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIxMF9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUUiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgKyAxXSk7CisgICAgX19tMTI4aSBhdmdUVFIsIGF2Z0xUTCwgYXZnLCByZXM7CisgICAgQXZlcmFnZTJfbTEyOGkoJlQsICZUUiwgJmF2Z1RUUik7CisgICAgQXZlcmFnZTJfbTEyOGkoJkwsICZUTCwgJmF2Z0xUTCk7CisgICAgQXZlcmFnZTJfbTEyOGkoJmF2Z1RUUiwgJmF2Z0xUTCwgJmF2Zyk7CisgICAgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgYXZnKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEwXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vIFByZWRpY3RvcjExOiBzZWxlY3QuCitzdGF0aWMgdm9pZCBHZXRTdW1BYnNEaWZmMzJfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBBLCBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0KSB7CisgIC8vIFdlIGNhbiB1bnBhY2sgd2l0aCBhbnkgdmFsdWUgb24gdGhlIHVwcGVyIDMyIGJpdHMsIHByb3ZpZGVkIGl0J3MgdGhlIHNhbWUKKyAgLy8gb24gYm90aCBvcGVyYW5kcyAodG8gdGhhdCB0aGVpciBzdW0gb2YgYWJzIGRpZmYgaXMgemVybykuIEhlcmUgd2UgdXNlICpBLgorICBjb25zdCBfX20xMjhpIEFfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoKkEsICpBKTsKKyAgY29uc3QgX19tMTI4aSBCX2xvID0gX21tX3VucGFja2xvX2VwaTMyKCpCLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgQV9oaSA9IF9tbV91bnBhY2toaV9lcGkzMigqQSwgKkEpOworICBjb25zdCBfX20xMjhpIEJfaGkgPSBfbW1fdW5wYWNraGlfZXBpMzIoKkIsICpBKTsKKyAgY29uc3QgX19tMTI4aSBzX2xvID0gX21tX3NhZF9lcHU4KEFfbG8sIEJfbG8pOworICBjb25zdCBfX20xMjhpIHNfaGkgPSBfbW1fc2FkX2VwdTgoQV9oaSwgQl9oaSk7CisgICpvdXQgPSBfbW1fcGFja3NfZXBpMzIoc19sbywgc19oaSk7Cit9CisKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjExX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBfX20xMjhpIHBhLCBwYjsKKyAgICBHZXRTdW1BYnNEaWZmMzJfU1NFMigmVCwgJlRMLCAmcGEpOyAgIC8vIHBhID0gc3VtIHxULVRMfAorICAgIEdldFN1bUFic0RpZmYzMl9TU0UyKCZMLCAmVEwsICZwYik7ICAgLy8gcGIgPSBzdW0gfEwtVEx8CisgICAgeworICAgICAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX2NtcGd0X2VwaTMyKHBiLCBwYSk7CisgICAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fYW5kX3NpMTI4KG1hc2ssIEwpOworICAgICAgY29uc3QgX19tMTI4aSBCID0gX21tX2FuZG5vdF9zaTEyOChtYXNrLCBUKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcHJlZCA9IF9tbV9vcl9zaTEyOChBLCBCKTsgICAgLy8gcHJlZCA9IChMID4gVCk/IEwgOiBUCisgICAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgICB9CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTFdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8gUHJlZGljdG9yMTI6IENsYW1wZWRTdWJTdWJ0cmFjdEZ1bGwuCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIxMl9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSBMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIExfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUX2xvID0gX21tX3VucGFja2xvX2VwaTgoVCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUX2hpID0gX21tX3VucGFja2hpX2VwaTgoVCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUTF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFRMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRMX2hpID0gX21tX3VucGFja2hpX2VwaTgoVEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgZGlmZl9sbyA9IF9tbV9zdWJfZXBpMTYoVF9sbywgVExfbG8pOworICAgIGNvbnN0IF9fbTEyOGkgZGlmZl9oaSA9IF9tbV9zdWJfZXBpMTYoVF9oaSwgVExfaGkpOworICAgIGNvbnN0IF9fbTEyOGkgcHJlZF9sbyA9IF9tbV9hZGRfZXBpMTYoTF9sbywgZGlmZl9sbyk7CisgICAgY29uc3QgX19tMTI4aSBwcmVkX2hpID0gX21tX2FkZF9lcGkxNihMX2hpLCBkaWZmX2hpKTsKKyAgICBjb25zdCBfX20xMjhpIHByZWQgPSBfbW1fcGFja3VzX2VwaTE2KHByZWRfbG8sIHByZWRfaGkpOworICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMl0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLyBQcmVkaWN0b3JzMTM6IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjEzX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBmb3IgKGkgPSAwOyBpICsgMiA8PSBudW1fcGl4ZWxzOyBpICs9IDIpIHsKKyAgICAvLyB3ZSBjYW4gb25seSBwcm9jZXNzIHR3byBwaXhlbHMgYXQgYSB0aW1lCisgICAgY29uc3QgX19tMTI4aSBMID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5baSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUTCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBMX2xvID0gX21tX3VucGFja2xvX2VwaTgoTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUX2xvID0gX21tX3VucGFja2xvX2VwaTgoVCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUTF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFRMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoVF9sbywgTF9sbyk7CisgICAgY29uc3QgX19tMTI4aSBhdmcgPSBfbW1fc3JsaV9lcGkxNihzdW0sIDEpOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc3ViX2VwaTE2KGF2ZywgVExfbG8pOworICAgIGNvbnN0IF9fbTEyOGkgYml0X2ZpeCA9IF9tbV9jbXBndF9lcGkxNihUTF9sbywgYXZnKTsKKyAgICBjb25zdCBfX20xMjhpIEEyID0gX21tX3N1Yl9lcGkxNihBMSwgYml0X2ZpeCk7CisgICAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmFpX2VwaTE2KEEyLCAxKTsKKyAgICBjb25zdCBfX20xMjhpIEE0ID0gX21tX2FkZF9lcGkxNihhdmcsIEEzKTsKKyAgICBjb25zdCBfX20xMjhpIHByZWQgPSBfbW1fcGFja3VzX2VwaTE2KEE0LCBBNCk7CisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEzXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTIodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX1NTRTI7CisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFRyYW5zZm9ybUNvbG9yX1NTRTI7CisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX1NTRTI7CisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19TU0UyOworICBWUDhMSGlzdG9ncmFtQWRkID0gSGlzdG9ncmFtQWRkX1NTRTI7CisgIFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5ID0gQ29tYmluZWRTaGFubm9uRW50cm9weV9TU0UyOworICBWUDhMVmVjdG9yTWlzbWF0Y2ggPSBWZWN0b3JNaXNtYXRjaF9TU0UyOworICBWUDhMQnVuZGxlQ29sb3JNYXAgPSBCdW5kbGVDb2xvck1hcF9TU0UyOworCisgIFZQOExQcmVkaWN0b3JzU3ViWzBdID0gUHJlZGljdG9yU3ViMF9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxXSA9IFByZWRpY3RvclN1YjFfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMl0gPSBQcmVkaWN0b3JTdWIyX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzNdID0gUHJlZGljdG9yU3ViM19TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls0XSA9IFByZWRpY3RvclN1YjRfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNV0gPSBQcmVkaWN0b3JTdWI1X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzZdID0gUHJlZGljdG9yU3ViNl9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls3XSA9IFByZWRpY3RvclN1YjdfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbOF0gPSBQcmVkaWN0b3JTdWI4X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzldID0gUHJlZGljdG9yU3ViOV9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxMF0gPSBQcmVkaWN0b3JTdWIxMF9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxMV0gPSBQcmVkaWN0b3JTdWIxMV9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxMl0gPSBQcmVkaWN0b3JTdWIxMl9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxM10gPSBQcmVkaWN0b3JTdWIxM19TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsxNF0gPSBQcmVkaWN0b3JTdWIwX1NTRTI7ICAvLyA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscworICBWUDhMUHJlZGljdG9yc1N1YlsxNV0gPSBQcmVkaWN0b3JTdWIwX1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTJhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNC4xIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisKKy8vIEZvciBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNToKKyNkZWZpbmUgQ1NUXzViKFgpICAoKChpbnQxNl90KSgodWludDE2X3QpKFgpIDw8IDgpKSA+PiA1KQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9TU0U0MSh1aW50MzJfdCogYXJnYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIGtDc3RTaHVmZmxlID0gX21tX3NldF9lcGk4KC0xLCAxMywgLTEsIDEzLCAtMSwgOSwgLTEsIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICA1LCAtMSwgIDUsIC0xLCAxLCAtMSwgMSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwZyA9IF9tbV9zaHVmZmxlX2VwaTgoaW4sIGtDc3RTaHVmZmxlKTsKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgaW5fMGcwZyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyhhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIFRyYW5zZm9ybQorCisjZGVmaW5lIFNQQU4gOAorc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfU1NFNDEoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfciA9IF9tbV9zZXQxX2VwaTE2KENTVF81YihyZWRfdG9fYmx1ZSkpOworICBjb25zdCBfX20xMjhpIG11bHRzX2cgPSBfbW1fc2V0MV9lcGkxNihDU1RfNWIoZ3JlZW5fdG9fYmx1ZSkpOworICBjb25zdCBfX20xMjhpIG1hc2tfZyA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYwMCk7ICAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2tfZ2IgPSBfbW1fc2V0MV9lcGkzMigweGZmZmYpOyAgLy8gZ3JlZW4vYmx1ZSBtYXNrCisgIGNvbnN0IF9fbTEyOGkgbWFza19iID0gX21tX3NldDFfZXBpMTYoMHgwMGZmKTsgICAvLyBibHVlIG1hc2sKKyAgY29uc3QgX19tMTI4aSBzaHVmZmxlcl9sbyA9IF9tbV9zZXRyX2VwaTgoLTEsIDIsIC0xLCA2LCAtMSwgMTAsIC0xLCAxNCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmZmxlcl9oaSA9IF9tbV9zZXRyX2VwaTgoLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgLTEsIDYsIC0xLCAxMCwgLTEsIDE0KTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCB0aWxlX2hlaWdodDsgKyt5KSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGFyZ2IgKyB5ICogc3RyaWRlOworICAgIGludCBpLCB4OworICAgIGZvciAoeCA9IDA7IHggKyBTUEFOIDw9IHRpbGVfd2lkdGg7IHggKz0gU1BBTikgeworICAgICAgdWludDE2X3QgdmFsdWVzW1NQQU5dOworICAgICAgY29uc3QgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSByMCA9IF9tbV9zaHVmZmxlX2VwaTgoaW4wLCBzaHVmZmxlcl9sbyk7CisgICAgICBjb25zdCBfX20xMjhpIHIxID0gX21tX3NodWZmbGVfZXBpOChpbjEsIHNodWZmbGVyX2hpKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgciA9IF9tbV9vcl9zaTEyOChyMCwgcjEpOyAgICAgICAgIC8vIHIgMAorICAgICAgY29uc3QgX19tMTI4aSBnYjAgPSBfbW1fYW5kX3NpMTI4KGluMCwgbWFza19nYik7CisgICAgICBjb25zdCBfX20xMjhpIGdiMSA9IF9tbV9hbmRfc2kxMjgoaW4xLCBtYXNrX2diKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZ2IgPSBfbW1fcGFja3VzX2VwaTMyKGdiMCwgZ2IxKTsgIC8vIGcgYgorICAgICAgY29uc3QgX19tMTI4aSBnID0gX21tX2FuZF9zaTEyOChnYiwgbWFza19nKTsgICAgLy8gZyAwCisgICAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fbXVsaGlfZXBpMTYociwgbXVsdHNfcik7ICAvLyB4IGRicgorICAgICAgY29uc3QgX19tMTI4aSBCID0gX21tX211bGhpX2VwaTE2KGcsIG11bHRzX2cpOyAgLy8geCBkYmcKKyAgICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zdWJfZXBpOChnYiwgQik7ICAgICAgICAgIC8vIHggYicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9zdWJfZXBpOChDLCBBKTsgICAgICAgICAgIC8vIHggYicnCisgICAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fYW5kX3NpMTI4KEQsIG1hc2tfYik7ICAgICAvLyAwIGInJworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdmFsdWVzLCBFKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTUEFOOyArK2kpICsraGlzdG9bdmFsdWVzW2ldXTsKKyAgICB9CisgIH0KKyAgeworICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSB0aWxlX3dpZHRoICYgKFNQQU4gLSAxKTsKKyAgICBpZiAobGVmdF9vdmVyID4gMCkgeworICAgICAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0MoYXJnYiArIHRpbGVfd2lkdGggLSBsZWZ0X292ZXIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfb3ZlciwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgaGlzdG8pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX1NTRTQxKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSkgeworICBjb25zdCBfX20xMjhpIG11bHRzX2cgPSBfbW1fc2V0MV9lcGkxNihDU1RfNWIoZ3JlZW5fdG9fcmVkKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDApOyAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIFNQQU4gLyAyXSk7CisgICAgICBjb25zdCBfX20xMjhpIGcwID0gX21tX2FuZF9zaTEyOChpbjAsIG1hc2tfZyk7ICAvLyAwIDAgIHwgZyAwCisgICAgICBjb25zdCBfX20xMjhpIGcxID0gX21tX2FuZF9zaTEyOChpbjEsIG1hc2tfZyk7CisgICAgICBjb25zdCBfX20xMjhpIGcgPSBfbW1fcGFja3VzX2VwaTMyKGcwLCBnMSk7ICAgICAvLyBnIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc3JsaV9lcGkzMihpbjAsIDE2KTsgICAgIC8vIDAgMCAgfCB4IHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc3JsaV9lcGkzMihpbjEsIDE2KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9wYWNrdXNfZXBpMzIoQTAsIEExKTsgICAgIC8vIHggcgorICAgICAgY29uc3QgX19tMTI4aSBCID0gX21tX211bGhpX2VwaTE2KGcsIG11bHRzX2cpOyAgLy8geCBkcgorICAgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3N1Yl9lcGk4KEEsIEIpOyAgICAgICAgICAgLy8geCByJworICAgICAgY29uc3QgX19tMTI4aSBEID0gX21tX2FuZF9zaTEyOChDLCBtYXNrKTsgICAgICAgLy8gMCByJworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdmFsdWVzLCBEKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTUEFOOyArK2kpICsraGlzdG9bdmFsdWVzW2ldXTsKKyAgICB9CisgIH0KKyAgeworICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSB0aWxlX3dpZHRoICYgKFNQQU4gLSAxKTsKKyAgICBpZiAobGVmdF9vdmVyID4gMCkgeworICAgICAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfQyhhcmdiICsgdGlsZV93aWR0aCAtIGxlZnRfb3Zlciwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X292ZXIsIHRpbGVfaGVpZ2h0LCBncmVlbl90b19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvKTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0U1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTQxKHZvaWQpIHsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9TU0U0MTsKKyAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfU1NFNDE7CisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19TU0U0MTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0U0MQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODg4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSw2OTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKworI2RlZmluZSBNQVBfQ09MT1JfRlVOQ1MoRlVOQ19OQU1FLCBUWVBFLCBHRVRfSU5ERVgsIEdFVF9WQUxVRSkgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCBUWVBFKiBzcmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIFRZUEUqIGRzdCwgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8ICh3aWR0aCA+PiAyKTsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmlmYyAgICAgICAgIiAjVFlQRSAiLCAgdWludDhfdCAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGJ1ICAgICAgICVbdG1wMV0sICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDJdLCAgMSglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsYnUgICAgICAgJVt0bXAzXSwgIDIoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGJ1ICAgICAgICVbdG1wNF0sICAzKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgJVtzcmNdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5pZmMgICAgICAgICIgI1RZUEUgIiwgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3ICAgICAgICAlW3RtcDFdLCAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXAyXSwgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHcgICAgICAgICVbdG1wM10sICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3ICAgICAgICAlW3RtcDRdLCAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAxXSwgICVbdG1wMV0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMl0sICAlW3RtcDJdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDNdLCAgJVt0bXAzXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXA0XSwgICVbdG1wNF0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAlW3NyY10sICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzbGwgICAgICAgJVt0bXAxXSwgICVbdG1wMV0sICAgICAyICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wMl0sICAlW3RtcDJdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNsbCAgICAgICAlW3RtcDNdLCAgJVt0bXAzXSwgICAgIDIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzbGwgICAgICAgJVt0bXA0XSwgICVbdG1wNF0sICAgICAyICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHd4ICAgICAgICVbdG1wMV0sICAlW3RtcDFdKCVbY29sb3JfbWFwXSkgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsd3ggICAgICAgJVt0bXAzXSwgICVbdG1wM10oJVtjb2xvcl9tYXBdKSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHd4ICAgICAgICVbdG1wNF0sICAlW3RtcDRdKCVbY29sb3JfbWFwXSkgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50OF90ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAxXSwgICVbdG1wMV0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMl0sICAlW3RtcDJdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDNdLCAgJVt0bXAzXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXA0XSwgICVbdG1wNF0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2IgICAgICAgICVbdG1wMV0sICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDJdLCAgMSglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzYiAgICAgICAgJVt0bXAzXSwgIDIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2IgICAgICAgICVbdG1wNF0sICAzKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAlW2RzdF0sICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5pZmMgICAgICAgICIgI1RZUEUgIiwgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInN3ICAgICAgICAlW3RtcDFdLCAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXAyXSwgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic3cgICAgICAgICVbdG1wM10sICA4KCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInN3ICAgICAgICAlW3RtcDRdLCAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtkc3RdLCAgICVbZHN0XSwgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBbdG1wMV0iPSZyIih0bXAxKSwgW3RtcDJdIj0mciIodG1wMiksIFt0bXAzXSI9JnIiKHRtcDMpLCAgICAgICAgICAgICBcCisgICAgICAgICAgW3RtcDRdIj0mciIodG1wNCksIFtzcmNdIismciIoc3JjKSwgW2RzdF0iK3IiKGRzdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFtjb2xvcl9tYXBdInIiKGNvbG9yX21hcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoICYgMyk7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqZHN0KysgPSBHRVRfVkFMVUUoY29sb3JfbWFwW0dFVF9JTkRFWCgqc3JjKyspXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01BUF9DT0xPUl9GVU5DUyhNYXBBUkdCX01JUFNkc3BSMiwgdWludDMyX3QsIFZQOEdldEFSR0JJbmRleCwgVlA4R2V0QVJHQlZhbHVlKQorTUFQX0NPTE9SX0ZVTkNTKE1hcEFscGhhX01JUFNkc3BSMiwgdWludDhfdCwgVlA4R2V0QWxwaGFJbmRleCwgVlA4R2V0QWxwaGFWYWx1ZSkKKworI3VuZGVmIE1BUF9DT0xPUl9GVU5DUworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAxXSwgICAlW2MwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICVbYzBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgJVtjMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXA0XSwgICAlW2MxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDVdLCAgICVbYzJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMF0sICAgJVtjMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnEucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXA1XSAgXG5cdCIKKyAgICAic3VicS5waCAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICVbdGVtcDBdICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXA0XSAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgIDcgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgNyAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxXSAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPXIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSkKKyAgICA6IFtjMF0iciIoYzApLCBbYzFdInIiKGMxKSwgW2MyXSJyIihjMikKKyAgICA6ICJtZW1vcnkiCisgICk7CisgIHJldHVybiB0ZW1wMjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJhZGR1aC5xYiAgICAgICAgICVbdGVtcDVdLCAgICVbYzBdLCAgICAgICVbYzFdICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wM10sICAgJVtjMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAxXSwgICAlW3RlbXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDJdLCAgICVbdGVtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wNF0sICAgJVtjMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VicS5waCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDJdLCAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNocmwucGggICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgMTUgICAgICAgICAgXG5cdCIKKyAgICAic2hybC5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAxNSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDVdICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAxICAgICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgIDcgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgNyAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAlW3RlbXAxXSAgICBcblx0IgorICAgIDogW3RlbXAwXSI9ciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9ciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpCisgICAgOiBbYzBdInIiKGMwKSwgW2MxXSJyIihjMSksIFtjMl0iciIoYzIpCisgICAgOiAibWVtb3J5IgorICApOworICByZXR1cm4gdGVtcDE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWxlY3QodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYykgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImNtcGdkdS5sdC5xYiAlW3RlbXAxXSwgJVtjXSwgICAgICVbYl0gICAgICAgICAgICAgXG5cdCIKKyAgICAicGljay5xYiAgICAgICVbdGVtcDFdLCAlW2JdLCAgICAgJVtjXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wMl0sICVbY10sICAgICAlW2JdICAgICAgICAgICAgIFxuXHQiCisgICAgImNtcGdkdS5sdC5xYiAlW3RlbXA0XSwgJVtjXSwgICAgICVbYV0gICAgICAgICAgICAgXG5cdCIKKyAgICAicGljay5xYiAgICAgICVbdGVtcDRdLCAlW2FdLCAgICAgJVtjXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wNV0sICVbY10sICAgICAlW2FdICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucWIgICAgICAlW3RlbXAzXSwgJVt0ZW1wMV0sICVbdGVtcDJdICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAgICVbdGVtcDBdLCAlW3RlbXA0XSwgJVt0ZW1wNV0gICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICAgICVbdGVtcDNdLCAlW3RlbXAzXSwgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgICJzbHRpICAgICAgICAgJVt0ZW1wMF0sICVbdGVtcDNdLCAweDEgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICAgICAlW2FdLCAgICAgJVtiXSwgICAgICVbdGVtcDBdICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW2FdIismciIoYSkKKyAgICA6IFtiXSJyIihiKSwgW2NdInIiKGMpCisgICk7CisgIHJldHVybiBhOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJhZGR1aC5xYiAgICAlW2EwXSwgJVthMF0sICVbYTFdICAgICAgIFxuXHQiCisgICAgOiBbYTBdIityIihhMCkKKyAgICA6IFthMV0iciIoYTEpCisgICk7CisgIHJldHVybiBhMDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwgdWludDMyX3QgYTIpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMiksIGExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2U0KHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMiwgdWludDMyX3QgYTMpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMSksIEF2ZXJhZ2UyKGEyLCBhMykpOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNV9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNl9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTIobGVmdCwgdG9wWy0xXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3X01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlMihsZWZ0LCB0b3BbMF0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOF9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjlfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEF2ZXJhZ2UyKHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwX01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlNChsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMV9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMl9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbChsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTNfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKK30KKworLy8gQWRkIGdyZWVuIHRvIGJsdWUgYW5kIHJlZCBjaGFubmVscyAoaS5lLiBwZXJmb3JtIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBvZgorLy8gJ3N1YnRyYWN0IGdyZWVuJykuCitzdGF0aWMgdm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZF9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICB1aW50MzJfdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgICAgICVbcF9sb29wMV9lbmRdLCAgICAgM2YgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgICAgICVbc3JjXSwgICAgICAgICAgICAgMTYgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICAgICAgICVbZHN0XSwgICAgICAgICAgICAgMTYgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAiYWRkdS5xYiAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgJVt0ZW1wNV0gXG5cdCIKKyAgICAiYWRkdS5xYiAgICAlW3RlbXAyXSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgJVt0ZW1wNl0gXG5cdCIKKyAgICAiYWRkdS5xYiAgICAlW3RlbXAzXSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgJVt0ZW1wN10gXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAwXSwgICAgICAgIC0xNiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAxXSwgICAgICAgIC0xMiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAyXSwgICAgICAgIC04KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgICAgICVbcF9sb29wMV9lbmRdLCAgICAgMGIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAzXSwgICAgICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgICAgICVbcF9sb29wMl9lbmRdLCAgICAgMmYgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgICAgICVbc3JjXSwgICAgICAgICAgICAgNCAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICAgICAgICVbZHN0XSwgICAgICAgICAgICAgNCAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgICAgICVbcF9sb29wMl9lbmRdLCAgICAgMWIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAwXSwgICAgICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNiksCisgICAgICBbdGVtcDddIj0mciIodGVtcDcpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9NSVBTZHNwUjIoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgdWludDMyX3QgYXJnYiwgYXJnYjEsIG5ld19yZWQ7CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fUiA9IG0tPmdyZWVuX3RvX3JlZF87CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fQiA9IG0tPmdyZWVuX3RvX2JsdWVfOworICBjb25zdCB1aW50MzJfdCBSX3RvX0IgPSBtLT5yZWRfdG9fYmx1ZV87CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3BfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+MSk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgICVbc3JjXSwgICAgICAgJVtwX2xvb3BfZW5kXSwgIDFmICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAwXSwgICAgICVbR190b19SXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDFdLCAgICAgJVtHX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMl0sICAgICAlW1JfdG9fQl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYl0sICAgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAgJVthcmdiMV0sICAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAgICAlW2FyZ2JdLCAgICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAgJVtzcmNdLCAgICAgICAlW3NyY10sICAgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICAlW2RzdF0sICAgICAgICVbZHN0XSwgICAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnFiLnBoICAgICVbdGVtcDNdLCAgICAgJVthcmdiXSwgICAgICAgICVbYXJnYjFdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMF0gIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXAxXSAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICVbbmV3X3JlZF0sICAgJVthcmdiXSwgICAgICAgICVbYXJnYjFdICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2JdLCAgICAgICAgMTYsICAgMTYgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDVdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVtuZXdfcmVkXSwgICAlW25ld19yZWRdLCAgICAgJVt0ZW1wNV0gIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYjFdLCAgICAgICAlW3RlbXAzXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDVdLCAgICAgJVtuZXdfcmVkXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA1XSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDJdICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDVdLCAgICAgICAxNiAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wNF0gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXAzXSwgICAgICVbYXJnYjFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTYoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICAxNiAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAgICAgICVbc3JjXSwgICAgICAgJVtwX2xvb3BfZW5kXSwgIDBiICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAtOCglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbbmV3X3JlZF0iPSZyIihuZXdfcmVkKSwgW2FyZ2JdIj0mciIoYXJnYiksCisgICAgICBbYXJnYjFdIj0mciIoYXJnYjEpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW0dfdG9fUl0iciIoR190b19SKSwgW1JfdG9fQl0iciIoUl90b19CKSwKKyAgICAgIFtHX3RvX0JdInIiKEdfdG9fQiksIFtwX2xvb3BfZW5kXSJyIihwX2xvb3BfZW5kKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICAvLyBGYWxsLWJhY2sgdG8gQy12ZXJzaW9uIGZvciBsZWZ0LW92ZXJzLgorICBpZiAobnVtX3BpeGVscyAmIDEpIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhtLCBzcmMsIDEsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgM2YgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMjQsICAgOCAgICBcblx0IgorICAgICJzbGwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgICAgOCAgICAgICAgICBcblx0IgorICAgICJyb3RyICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMCwgICAgMTYgICBcblx0IgorICAgICJzbGwgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgOCAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDNdLCAgICA4KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyb3RyICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDJdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMTIgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMyAgICAgICAgICBcblx0IgorICAgICJ1c2ggICAgICAgICVbdGVtcDFdLCAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMWIgICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgICVbdGVtcDBdLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkE0NDQ0X01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDNdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wM10sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgICAgJVt0ZW1wMl0gICBcblx0IgorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDFdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAzXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDNdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImJuZSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDBdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgJVt0ZW1wMF0gICBcblx0IgorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgInVzaCAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzaCAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImJuZSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMWIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDIgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCNTY1X01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgM2YgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDBdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAzXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdLCAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDFdLCAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDJdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgOCAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMiAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1JfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMjQsICAgIDggICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgICAgICA4ICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDE2LCAgICAxNiAgICBcblx0IgorICAgICJzbGwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAzXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAxMiAgICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDMgICAgICAgICAgICBcblx0IgorICAgICJ1c2ggICAgICAgICVbdGVtcDBdLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAxNiAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgICVbdGVtcDBdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4TE1hcENvbG9yMzJiID0gTWFwQVJHQl9NSVBTZHNwUjI7CisgIFZQOExNYXBDb2xvcjhiID0gTWFwQWxwaGFfTUlQU2RzcFIyOworCisgIFZQOExQcmVkaWN0b3JzWzVdID0gUHJlZGljdG9yNV9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzZdID0gUHJlZGljdG9yNl9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzddID0gUHJlZGljdG9yN19NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzhdID0gUHJlZGljdG9yOF9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzldID0gUHJlZGljdG9yOV9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzEwXSA9IFByZWRpY3RvcjEwX01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbMTFdID0gUHJlZGljdG9yMTFfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1sxMl0gPSBQcmVkaWN0b3IxMl9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzEzXSA9IFByZWRpY3RvcjEzX01JUFNkc3BSMjsKKworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZF9NSVBTZHNwUjI7CisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBUcmFuc2Zvcm1Db2xvckludmVyc2VfTUlQU2RzcFIyOworCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gQ29udmVydEJHUkFUb1JHQl9NSVBTZHNwUjI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IENvbnZlcnRCR1JBVG9SR0JBX01JUFNkc3BSMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NCA9IENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9NSVBTZHNwUjI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1ID0gQ29udmVydEJHUkFUb1JHQjU2NV9NSVBTZHNwUjI7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gQ29udmVydEJHUkFUb0JHUl9NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU0NzIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19tc2EuYwpAQCAtMCwwICsxLDM1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFByYXNoYW50IFBhdGlsIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKKyNkZWZpbmUgQ09OVkVSVDE2X0JHUkFfWFhYKHBzcmMsIHBkc3QsIG0wLCBtMSwgbTIpIGRvIHsgICAgXAorICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QwLCBkc3QxLCBkc3QyOyAgICAgICAgICBcCisgIExEX1VCNChwc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7ICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBtMCwgbTEsIGRzdDAsIGRzdDEpOyAgXAorICBkc3QyID0gVlNIRl9VQihzcmMyLCBzcmMzLCBtMik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCMihkc3QwLCBkc3QxLCBwZHN0LCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIoZHN0MiwgcGRzdCArIDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUMTJfQkdSQV9YWFgocHNyYywgcGRzdCwgbTAsIG0xLCBtMikgZG8geyAgICBcCisgIHVpbnQzMl90IHBpeF93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgZHN0MCwgZHN0MSwgZHN0MjsgICAgICAgICAgICAgICAgXAorICBMRF9VQjMocHNyYywgMTYsIHNyYzAsIHNyYzEsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbTAsIG0xLCBkc3QwLCBkc3QxKTsgIFwKKyAgZHN0MiA9IFZTSEZfVUIoc3JjMiwgc3JjMiwgbTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQjIoZHN0MCwgZHN0MSwgcGRzdCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDIsIDApOyAgICAgICAgICAgICAgICAgIFwKKyAgU1cocGl4X3csIHBkc3QgKyAzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUOF9CR1JBX1hYWChwc3JjLCBwZHN0LCBtMCwgbTEpIGRvIHsgICAgICAgICBcCisgIHVpbnQ2NF90IHBpeF9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiA9IHsgMCB9LCBkc3QwLCBkc3QxOyAgICAgICAgICAgICAgXAorICBMRF9VQjIocHNyYywgMTYsIHNyYzAsIHNyYzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbTAsIG0xLCBkc3QwLCBkc3QxKTsgIFwKKyAgU1RfVUIoZHN0MCwgcGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QxLCAwKTsgICAgICAgICAgICAgICAgICBcCisgIFNEKHBpeF9kLCBwZHN0ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDRfQkdSQV9YWFgocHNyYywgcGRzdCwgbSkgZG8geyAgICAgICBcCisgIGNvbnN0IHYxNnU4IHNyYzAgPSBMRF9VQihwc3JjKTsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBkc3QwID0gVlNIRl9VQihzcmMwLCBzcmMwLCBtKTsgICAgICAgIFwKKyAgdWludDY0X3QgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MCwgMCk7ICBcCisgIHVpbnQzMl90IHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDAsIDIpOyAgXAorICBTRChwaXhfZCwgcGRzdCArIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1cocGl4X3csIHBkc3QgKyA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQxX0JHUkFfQkdSKHBzcmMsIHBkc3QpIGRvIHsgIFwKKyAgY29uc3QgaW50MzJfdCBiID0gKHBzcmMpWzBdOyAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQzMl90IGcgPSAocHNyYylbMV07ICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDMyX3QgciA9IChwc3JjKVsyXTsgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzBdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocGRzdClbMV0gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwZHN0KVsyXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDFfQkdSQV9SR0IocHNyYywgcGRzdCkgZG8geyAgXAorICBjb25zdCBpbnQzMl90IGIgPSAocHNyYylbMF07ICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDMyX3QgZyA9IChwc3JjKVsxXTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MzJfdCByID0gKHBzcmMpWzJdOyAgICAgICAgICAgICAgXAorICAocGRzdClbMF0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwZHN0KVsxXSA9IGc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzJdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFOU0ZPUk1fQ09MT1JfSU5WRVJTRV84KHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAsIGMxLCBtYXNrMCwgbWFzazEpIGRvIHsgIFwKKyAgdjhpMTYgZzAsIGcxLCB0MCwgdDEsIHQyLCB0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiB0NCwgdDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfU0goc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCBnMCwgZzEpOyAgIFwKKyAgRE9UUF9TQjJfU0goZzAsIGcxLCBjMCwgYzAsIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKHQwLCB0MSwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfYWRkdl9oKHQwLCAodjhpMTYpc3JjMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9hZGR2X2godDEsICh2OGkxNilzcmMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0NCA9IF9fbXNhX3NybGlfdygodjRpMzIpdDAsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQ1ID0gX19tc2Ffc3JsaV93KCh2NGkzMil0MSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9TQjJfU0godDQsIHQ1LCBjMSwgYzEsIHQyLCB0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKHQyLCB0MywgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFERDIodDAsIHQyLCB0MSwgdDMsIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQihzcmMwLCB0MCwgc3JjMSwgdDEsIG1hc2sxLCBtYXNrMSwgZHN0MCwgZHN0MSk7ICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFOU0ZPUk1fQ09MT1JfSU5WRVJTRV80KHNyYywgZHN0LCBjMCwgYzEsIG1hc2swLCBtYXNrMSkgZG8geyAgXAorICBjb25zdCB2MTZpOCBnMCA9IFZTSEZfU0Ioc3JjLCBzcmMsIG1hc2swKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0MCA9IF9fbXNhX2RvdHBfc19oKGMwLCBnMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IFNSQUlfSCh0MCwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX2FkZHZfaCh0MCwgKHY4aTE2KXNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IF9fbXNhX3NybGlfdygodjRpMzIpdDAsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX2RvdHBfc19oKGMxLCAodjE2aTgpdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IFNSQUlfSCh0MSwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IHQwICsgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSBWU0hGX1VCKHNyYywgdDAsIG1hc2sxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkFfTVNBKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgaTsKKyAgY29uc3QgdWludDhfdCogcHRlbXBfc3JjID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgdWludDhfdCogcHRlbXBfZHN0ID0gKHVpbnQ4X3QqKWRzdDsKKyAgdjE2dTggc3JjMCwgZHN0MDsKKyAgY29uc3QgdjE2dTggbWFzayA9IHsgMiwgMSwgMCwgMywgNiwgNSwgNCwgNywgMTAsIDksIDgsIDExLCAxNCwgMTMsIDEyLCAxNSB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICB2MTZ1OCBzcmMxLCBkc3QxOworICAgIExEX1VCMihwdGVtcF9zcmMsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIGRzdDAsIGRzdDEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBwdGVtcF9kc3QsIDE2KTsKKyAgICBwdGVtcF9zcmMgKz0gMzI7CisgICAgcHRlbXBfZHN0ICs9IDMyOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBzcmMwID0gTERfVUIocHRlbXBfc3JjKTsKKyAgICAgIGRzdDAgPSBWU0hGX1VCKHNyYzAsIHNyYzAsIG1hc2spOworICAgICAgU1RfVUIoZHN0MCwgcHRlbXBfZHN0KTsKKyAgICAgIHB0ZW1wX3NyYyArPSAxNjsKKyAgICAgIHB0ZW1wX2RzdCArPSAxNjsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeworICAgICAgY29uc3QgdWludDhfdCBiID0gcHRlbXBfc3JjWzJdOworICAgICAgY29uc3QgdWludDhfdCBnID0gcHRlbXBfc3JjWzFdOworICAgICAgY29uc3QgdWludDhfdCByID0gcHRlbXBfc3JjWzBdOworICAgICAgY29uc3QgdWludDhfdCBhID0gcHRlbXBfc3JjWzNdOworICAgICAgcHRlbXBfZHN0WzBdID0gYjsKKyAgICAgIHB0ZW1wX2RzdFsxXSA9IGc7CisgICAgICBwdGVtcF9kc3RbMl0gPSByOworICAgICAgcHRlbXBfZHN0WzNdID0gYTsKKyAgICAgIHB0ZW1wX3NyYyArPSA0OworICAgICAgcHRlbXBfZHN0ICs9IDQ7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1JfTVNBKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHB0ZW1wX3NyYyA9IChjb25zdCB1aW50OF90KilzcmM7CisgIHVpbnQ4X3QqIHB0ZW1wX2RzdCA9ICh1aW50OF90Kilkc3Q7CisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAwLCAxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNywgMTgsIDIwIH07CisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAyMSwgMjIsIDI0LCAyNSB9OworICBjb25zdCB2MTZ1OCBtYXNrMiA9IHsgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTgsIDIwLCAyMSwgMjIsIDI0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAyOCwgMjksIDMwIH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gMTYpIHsKKyAgICBDT05WRVJUMTZfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIHB0ZW1wX3NyYyArPSA2NDsKKyAgICBwdGVtcF9kc3QgKz0gNDg7CisgICAgbnVtX3BpeGVscyAtPSAxNjsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSAxMikgeworICAgICAgQ09OVkVSVDEyX0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgIHB0ZW1wX3NyYyArPSA0ODsKKyAgICAgIHB0ZW1wX2RzdCArPSAzNjsKKyAgICAgIG51bV9waXhlbHMgLT0gMTI7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICAgIENPTlZFUlQ4X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEpOworICAgICAgcHRlbXBfc3JjICs9IDMyOworICAgICAgcHRlbXBfZHN0ICs9IDI0OworICAgICAgbnVtX3BpeGVscyAtPSA4OworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBDT05WRVJUNF9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazApOworICAgICAgcHRlbXBfc3JjICs9IDE2OworICAgICAgcHRlbXBfZHN0ICs9IDEyOworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBpZiAobnVtX3BpeGVscyA9PSAzKSB7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMgKyAwLCBwdGVtcF9kc3QgKyAwKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYyArIDQsIHB0ZW1wX2RzdCArIDMpOworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjICsgOCwgcHRlbXBfZHN0ICsgNik7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDIpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYyArIDAsIHB0ZW1wX2RzdCArIDApOworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjICsgNCwgcHRlbXBfZHN0ICsgMyk7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDEpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYywgcHRlbXBfZHN0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQl9NU0EoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDhfdCogcHRlbXBfc3JjID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgdWludDhfdCogcHRlbXBfZHN0ID0gKHVpbnQ4X3QqKWRzdDsKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDIsIDEsIDAsIDYsIDUsIDQsIDEwLCA5LCA4LCAxNCwgMTMsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMTgsIDE3LCAxNiwgMjIgfTsKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDUsIDQsIDEwLCA5LCA4LCAxNCwgMTMsIDEyLCAxOCwgMTcsIDE2LCAyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAyMCwgMjYsIDI1IH07CisgIGNvbnN0IHYxNnU4IG1hc2syID0geyA4LCAxNCwgMTMsIDEyLCAxOCwgMTcsIDE2LCAyMiwgMjEsIDIwLCAyNiwgMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAyNCwgMzAsIDI5LCAyOCB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDE2KSB7CisgICAgQ09OVkVSVDE2X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBwdGVtcF9zcmMgKz0gNjQ7CisgICAgcHRlbXBfZHN0ICs9IDQ4OworICAgIG51bV9waXhlbHMgLT0gMTY7CisgIH0KKyAgaWYgKG51bV9waXhlbHMpIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSAxMikgeworICAgICAgQ09OVkVSVDEyX0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgIHB0ZW1wX3NyYyArPSA0ODsKKyAgICAgIHB0ZW1wX2RzdCArPSAzNjsKKyAgICAgIG51bV9waXhlbHMgLT0gMTI7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICAgIENPTlZFUlQ4X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEpOworICAgICAgcHRlbXBfc3JjICs9IDMyOworICAgICAgcHRlbXBfZHN0ICs9IDI0OworICAgICAgbnVtX3BpeGVscyAtPSA4OworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBDT05WRVJUNF9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazApOworICAgICAgcHRlbXBfc3JjICs9IDE2OworICAgICAgcHRlbXBfZHN0ICs9IDEyOworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBpZiAobnVtX3BpeGVscyA9PSAzKSB7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMgKyAwLCBwdGVtcF9kc3QgKyAwKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYyArIDQsIHB0ZW1wX2RzdCArIDMpOworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjICsgOCwgcHRlbXBfZHN0ICsgNik7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDIpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYyArIDAsIHB0ZW1wX2RzdCArIDApOworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjICsgNCwgcHRlbXBfZHN0ICsgMyk7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDEpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYywgcHRlbXBfZHN0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTVNBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IGk7CisgIGNvbnN0IHVpbnQ4X3QqIGluID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgdWludDhfdCogb3V0ID0gKHVpbnQ4X3QqKWRzdDsKKyAgdjE2dTggc3JjMCwgZHN0MCwgdG1wMDsKKyAgY29uc3QgdjE2dTggbWFzayA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgMTMsIDI1NSwgMTMsIDI1NSB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICB2MTZ1OCBzcmMxLCBkc3QxLCB0bXAxOworICAgIExEX1VCMihpbiwgMTYsIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMCwgbWFzaywgbWFzaywgdG1wMCwgdG1wMSk7CisgICAgQUREMihzcmMwLCB0bXAwLCBzcmMxLCB0bXAxLCBkc3QwLCBkc3QxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgb3V0LCAxNik7CisgICAgaW4gKz0gMzI7CisgICAgb3V0ICs9IDMyOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBzcmMwID0gTERfVUIoaW4pOworICAgICAgdG1wMCA9IFZTSEZfVUIoc3JjMCwgc3JjMCwgbWFzayk7CisgICAgICBkc3QwID0gc3JjMCArIHRtcDA7CisgICAgICBTVF9VQihkc3QwLCBvdXQpOworICAgICAgaW4gKz0gMTY7CisgICAgICBvdXQgKz0gMTY7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IGluWzBdOworICAgICAgY29uc3QgdWludDhfdCBnID0gaW5bMV07CisgICAgICBjb25zdCB1aW50OF90IHIgPSBpblsyXTsKKyAgICAgIG91dFswXSA9IChiICsgZykgJiAweGZmOworICAgICAgb3V0WzFdID0gZzsKKyAgICAgIG91dFsyXSA9IChyICsgZykgJiAweGZmOworICAgICAgb3V0WzRdID0gaW5bNF07CisgICAgICBvdXQgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JJbnZlcnNlX01TQShjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIHYxNnU4IHNyYzAsIGRzdDA7CisgIGNvbnN0IHYxNmk4IGcyYnIgPSAodjE2aTgpX19tc2FfZmlsbF93KG0tPmdyZWVuX3RvX2JsdWVfIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0tPmdyZWVuX3RvX3JlZF8gPDwgMTYpKTsKKyAgY29uc3QgdjE2aTggcjJiID0gKHYxNmk4KV9fbXNhX2ZpbGxfdyhtLT5yZWRfdG9fYmx1ZV8pOworICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEzLCAyNTUsIDEzLCAyNTUgfTsKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDE2LCAxLCAxOCwgMywgMjAsIDUsIDIyLCA3LCAyNCwgOSwgMjYsIDExLAorICAgICAgICAgICAgICAgICAgICAgICAgMjgsIDEzLCAzMCwgMTUgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgdjE2dTggc3JjMSwgZHN0MTsKKyAgICBMRF9VQjIoc3JjLCA0LCBzcmMwLCBzcmMxKTsKKyAgICBUUkFOU0ZPUk1fQ09MT1JfSU5WRVJTRV84KHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgZHN0LCA0KTsKKyAgICBzcmMgKz0gODsKKyAgICBkc3QgKz0gODsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgc3JjMCA9IExEX1VCKHNyYyk7CisgICAgICBUUkFOU0ZPUk1fQ09MT1JfSU5WRVJTRV80KHNyYzAsIGRzdDAsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICAgIFNUX1VCKGRzdDAsIGRzdCk7CisgICAgICBzcmMgKz0gNDsKKyAgICAgIGRzdCArPSA0OworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICAgIHNyYzAgPSBMRF9VQihzcmMpOworICAgICAgVFJBTlNGT1JNX0NPTE9SX0lOVkVSU0VfNChzcmMwLCBkc3QwLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgICBpZiAobnVtX3BpeGVscyA9PSAzKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDAsIDApOworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QwLCAyKTsKKyAgICAgICAgU0QocGl4X2QsIGRzdCArIDApOworICAgICAgICBTVyhwaXhfdywgZHN0ICsgMik7CisgICAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMikgeworICAgICAgICBjb25zdCB1aW50NjRfdCBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QwLCAwKTsKKyAgICAgICAgU0QocGl4X2QsIGRzdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QwLCAwKTsKKyAgICAgICAgU1cocGl4X3csIGRzdCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExEc3BJbml0TVNBKHZvaWQpIHsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gQ29udmVydEJHUkFUb1JHQkFfTVNBOworICBWUDhMQ29udmVydEJHUkFUb0JHUiA9IENvbnZlcnRCR1JBVG9CR1JfTVNBOworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IENvbnZlcnRCR1JBVG9SR0JfTVNBOworCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkX01TQTsKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9NU0E7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdE1TQSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhMWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbmVvbi5jCkBAIC0wLDAgKzEsNjQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTkVPTiB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisvLyBnY2MgNC42LjAgaGFkIHNvbWUgdHJvdWJsZSAoTkRLLXI5KSB3aXRoIHRoaXMgY29kZS4gV2Ugb25seSB1c2UgaXQgZm9yCisvLyBnY2MtNC44LnggYXQgbGVhc3QuCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQV9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjE1KTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDE2KSB7CisgICAgdWludDh4MTZ4NF90IHBpeGVsID0gdmxkNHFfdTgoKHVpbnQ4X3QqKXNyYyk7CisgICAgLy8gc3dhcCBCIGFuZCBSLiAoVlNXUCBkMCxkMiBoYXMgbm8gaW50cmluc2ljcyBlcXVpdmFsZW50ISkKKyAgICBjb25zdCB1aW50OHgxNl90IHRtcCA9IHBpeGVsLnZhbFswXTsKKyAgICBwaXhlbC52YWxbMF0gPSBwaXhlbC52YWxbMl07CisgICAgcGl4ZWwudmFsWzJdID0gdG1wOworICAgIHZzdDRxX3U4KGRzdCwgcGl4ZWwpOworICAgIGRzdCArPSA2NDsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb1JHQkFfQyhzcmMsIG51bV9waXhlbHMgJiAxNSwgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUl9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+MTUpOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gMTYpIHsKKyAgICBjb25zdCB1aW50OHgxNng0X3QgcGl4ZWwgPSB2bGQ0cV91OCgodWludDhfdCopc3JjKTsKKyAgICBjb25zdCB1aW50OHgxNngzX3QgdG1wID0geyB7IHBpeGVsLnZhbFswXSwgcGl4ZWwudmFsWzFdLCBwaXhlbC52YWxbMl0gfSB9OworICAgIHZzdDNxX3U4KGRzdCwgdG1wKTsKKyAgICBkc3QgKz0gNDg7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9CR1JfQyhzcmMsIG51bV9waXhlbHMgJiAxNSwgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQl9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+MTUpOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gMTYpIHsKKyAgICBjb25zdCB1aW50OHgxNng0X3QgcGl4ZWwgPSB2bGQ0cV91OCgodWludDhfdCopc3JjKTsKKyAgICBjb25zdCB1aW50OHgxNngzX3QgdG1wID0geyB7IHBpeGVsLnZhbFsyXSwgcGl4ZWwudmFsWzFdLCBwaXhlbC52YWxbMF0gfSB9OworICAgIHZzdDNxX3U4KGRzdCwgdG1wKTsKKyAgICBkc3QgKz0gNDg7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JfQyhzcmMsIG51bV9waXhlbHMgJiAxNSwgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworI2Vsc2UgIC8vIFdPUktfQVJPVU5EX0dDQworCisvLyBnY2MtNC42LjAgZmFsbGJhY2sKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1JHQkFTaHVmZmxlWzhdID0geyAyLCAxLCAwLCAzLCA2LCA1LCA0LCA3IH07CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+MSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlID0gdmxkMV91OChrUkdCQVNodWZmbGUpOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gMikgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBwaXhlbHMgPSB2bGQxX3U4KCh1aW50OF90KilzcmMpOworICAgIHZzdDFfdTgoZHN0LCB2dGJsMV91OChwaXhlbHMsIHNodWZmbGUpKTsKKyAgICBkc3QgKz0gODsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb1JHQkFfQyhzcmMsIG51bV9waXhlbHMgJiAxLCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrQkdSU2h1ZmZsZVszXVs4XSA9IHsKKyAgeyAgMCwgIDEsICAyLCAgNCwgIDUsICA2LCAgOCwgIDkgfSwKKyAgeyAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOCwgMjAgfSwKKyAgeyAyMSwgMjIsIDI0LCAyNSwgMjYsIDI4LCAyOSwgMzAgfQorfTsKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUl9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Nyk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMCA9IHZsZDFfdTgoa0JHUlNodWZmbGVbMF0pOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTEgPSB2bGQxX3U4KGtCR1JTaHVmZmxlWzFdKTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUyID0gdmxkMV91OChrQkdSU2h1ZmZsZVsyXSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSA4KSB7CisgICAgdWludDh4OHg0X3QgcGl4ZWxzOworICAgIElOSVRfVkVDVE9SNChwaXhlbHMsCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyAwKSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyAyKSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyA0KSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyA2KSkpOworICAgIHZzdDFfdTgoZHN0ICsgIDAsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTApKTsKKyAgICB2c3QxX3U4KGRzdCArICA4LCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUxKSk7CisgICAgdnN0MV91OChkc3QgKyAxNiwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMikpOworICAgIGRzdCArPSA4ICogMzsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb0JHUl9DKHNyYywgbnVtX3BpeGVscyAmIDcsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtSR0JTaHVmZmxlWzNdWzhdID0geworICB7ICAyLCAgMSwgIDAsICA2LCAgNSwgIDQsIDEwLCAgOSB9LAorICB7ICA4LCAxNCwgMTMsIDEyLCAxOCwgMTcsIDE2LCAyMiB9LAorICB7IDIxLCAyMCwgMjYsIDI1LCAyNCwgMzAsIDI5LCAyOCB9Cit9OworCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH43KTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUwID0gdmxkMV91OChrUkdCU2h1ZmZsZVswXSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMSA9IHZsZDFfdTgoa1JHQlNodWZmbGVbMV0pOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTIgPSB2bGQxX3U4KGtSR0JTaHVmZmxlWzJdKTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDgpIHsKKyAgICB1aW50OHg4eDRfdCBwaXhlbHM7CisgICAgSU5JVF9WRUNUT1I0KHBpeGVscywKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDApKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDIpKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDQpKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDYpKSk7CisgICAgdnN0MV91OChkc3QgKyAgMCwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMCkpOworICAgIHZzdDFfdTgoZHN0ICsgIDgsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTEpKTsKKyAgICB2c3QxX3U4KGRzdCArIDE2LCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUyKSk7CisgICAgZHN0ICs9IDggKiAzOworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCX0Moc3JjLCBudW1fcGl4ZWxzICYgNywgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworI2VuZGlmICAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9yIFRyYW5zZm9ybQorCisjZGVmaW5lIExPQURfVTMyX0FTX1U4KElOKSB2cmVpbnRlcnByZXRfdThfdTMyKHZkdXBfbl91MzIoKElOKSkpCisjZGVmaW5lIExPQURfVTMyUF9BU19VOChJTikgdnJlaW50ZXJwcmV0X3U4X3UzMih2bGQxX3UzMigoSU4pKSkKKyNkZWZpbmUgTE9BRFFfVTMyX0FTX1U4KElOKSB2cmVpbnRlcnByZXRxX3U4X3UzMih2ZHVwcV9uX3UzMigoSU4pKSkKKyNkZWZpbmUgTE9BRFFfVTMyUF9BU19VOChJTikgdnJlaW50ZXJwcmV0cV91OF91MzIodmxkMXFfdTMyKChJTikpKQorI2RlZmluZSBHRVRfVThfQVNfVTMyKElOKSB2Z2V0X2xhbmVfdTMyKHZyZWludGVycHJldF91MzJfdTgoKElOKSksIDApOworI2RlZmluZSBHRVRRX1U4X0FTX1UzMihJTikgdmdldHFfbGFuZV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTgoKElOKSksIDApOworI2RlZmluZSBTVE9SRVFfVThfQVNfVTMyUChPVVQsIElOKSB2c3QxcV91MzIoKE9VVCksIHZyZWludGVycHJldHFfdTMyX3U4KChJTikpKTsKKyNkZWZpbmUgUk9UQVRFMzJfTEVGVChMKSB2ZXh0cV91OCgoTCksIChMKSwgMTIpICAgIC8vIER8Q3xCfEEgLT4gQ3xCfEF8RAorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4OF90IEF2ZXJhZ2UyX3U4X05FT04odWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBBMCA9IExPQURfVTMyX0FTX1U4KGEwKTsKKyAgY29uc3QgdWludDh4OF90IEExID0gTE9BRF9VMzJfQVNfVTgoYTEpOworICByZXR1cm4gdmhhZGRfdTgoQTAsIEExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGZfTkVPTih1aW50MzJfdCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcgPSBBdmVyYWdlMl91OF9ORU9OKGMwLCBjMSk7CisgIC8vIFJlbW92ZSBvbmUgdG8gYzIgd2hlbiBiaWdnZXIgdGhhbiBhdmcuCisgIGNvbnN0IHVpbnQ4eDhfdCBDMiA9IExPQURfVTMyX0FTX1U4KGMyKTsKKyAgY29uc3QgdWludDh4OF90IGNtcCA9IHZjZ3RfdTgoQzIsIGF2Zyk7CisgIGNvbnN0IHVpbnQ4eDhfdCBDMl8xID0gdmFkZF91OChDMiwgY21wKTsKKyAgLy8gQ29tcHV0ZSBoYWxmIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXZnIGFuZCBjMi4KKyAgY29uc3QgaW50OHg4X3QgZGlmZl9hdmcgPSB2cmVpbnRlcnByZXRfczhfdTgodmhzdWJfdTgoYXZnLCBDMl8xKSk7CisgIC8vIENvbXB1dGUgdGhlIHN1bSB3aXRoIGF2ZyBhbmQgc2F0dXJhdGUuCisgIGNvbnN0IGludDE2eDhfdCBhdmdfMTYgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodm1vdmxfdTgoYXZnKSk7CisgIGNvbnN0IHVpbnQ4eDhfdCByZXMgPSB2cW1vdnVuX3MxNih2YWRkd19zOChhdmdfMTYsIGRpZmZfYXZnKSk7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IEdFVF9VOF9BU19VMzIocmVzKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyX05FT04odWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmdfdTh4OCA9IEF2ZXJhZ2UyX3U4X05FT04oYTAsIGExKTsKKyAgY29uc3QgdWludDMyX3QgYXZnID0gR0VUX1U4X0FTX1UzMihhdmdfdTh4OCk7CisgIHJldHVybiBhdmc7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlM19ORU9OKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcwID0gQXZlcmFnZTJfdThfTkVPTihhMCwgYTIpOworICBjb25zdCB1aW50OHg4X3QgQTEgPSBMT0FEX1UzMl9BU19VOChhMSk7CisgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IEdFVF9VOF9BU19VMzIodmhhZGRfdTgoYXZnMCwgQTEpKTsKKyAgcmV0dXJuIGF2ZzsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjVfTkVPTih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlM19ORU9OKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2X05FT04odWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTJfTkVPTihsZWZ0LCB0b3BbLTFdKTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3X05FT04odWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTJfTkVPTihsZWZ0LCB0b3BbMF0pOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzX05FT04odWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZl9ORU9OKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7Cit9CisKKy8vIEJhdGNoIHZlcnNpb25zIG9mIHRob3NlIGZ1bmN0aW9ucy4KKworLy8gUHJlZGljdG9yMDogQVJHQl9CTEFDSy4KK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDBfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgdWludDh4MTZfdCBibGFjayA9IHZyZWludGVycHJldHFfdThfdTMyKHZkdXBxX25fdTMyKEFSR0JfQkxBQ0spKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChzcmMsIGJsYWNrKTsKKyAgICBTVE9SRVFfVThfQVNfVTMyUCgmb3V0W2ldLCByZXMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKworLy8gUHJlZGljdG9yMTogbGVmdC4KK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDFfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgdWludDh4MTZfdCB6ZXJvID0gTE9BRFFfVTMyX0FTX1U4KDApOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICAvLyBhIHwgYiB8IGMgfCBkCisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgLy8gMCB8IGEgfCBiIHwgYworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc2hpZnQwID0gdmV4dHFfdTgoemVybywgc3JjLCAxMik7CisgICAgLy8gYSB8IGEgKyBiIHwgYiArIGMgfCBjICsgZAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3VtMCA9IHZhZGRxX3U4KHNyYywgc2hpZnQwKTsKKyAgICAvLyAwIHwgMCB8IGEgfCBhICsgYgorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc2hpZnQxID0gdmV4dHFfdTgoemVybywgc3VtMCwgOCk7CisgICAgLy8gYSB8IGEgKyBiIHwgYSArIGIgKyBjIHwgYSArIGIgKyBjICsgZAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3VtMSA9IHZhZGRxX3U4KHN1bTAsIHNoaWZ0MSk7CisgICAgY29uc3QgdWludDh4MTZfdCBwcmV2ID0gTE9BRFFfVTMyX0FTX1U4KG91dFtpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoc3VtMSwgcHJldik7CisgICAgU1RPUkVRX1U4X0FTX1UzMlAoJm91dFtpXSwgcmVzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzFdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisKKy8vIE1hY3JvIHRoYXQgYWRkcyAzMi1iaXQgaW50ZWdlcnMgZnJvbSBJTiB1c2luZyBtb2QgMjU2IGFyaXRobWV0aWMKKy8vIHBlciA4IGJpdCBjaGFubmVsLgorI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMShYLCBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQjI1gjI19ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHVwcGVyLCBpbnQgbnVtX3BpeGVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBvdGhlciA9IExPQURRX1UzMlBfQVNfVTgoJihJTikpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KHNyYywgb3RoZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUT1JFUV9VOF9BU19VMzJQKCZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgXAorfQorLy8gUHJlZGljdG9yMjogVG9wLgorR0VORVJBVEVfUFJFRElDVE9SXzEoMiwgdXBwZXJbaV0pCisvLyBQcmVkaWN0b3IzOiBUb3AtcmlnaHQuCitHRU5FUkFURV9QUkVESUNUT1JfMSgzLCB1cHBlcltpICsgMV0pCisvLyBQcmVkaWN0b3I0OiBUb3AtbGVmdC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDQsIHVwcGVyW2kgLSAxXSkKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMQorCisvLyBQcmVkaWN0b3I1OiBhdmVyYWdlKGF2ZXJhZ2UobGVmdCwgVFIpLCBUKQorI2RlZmluZSBET19QUkVENShMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmdMVFIgPSB2aGFkZHFfdTgoTCwgVFIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnID0gdmhhZGRxX3U4KGF2Z0xUUiwgVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KGF2Zywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MXFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0cV91MzJfdTgocmVzKSwgKExBTkUpKTsgICBcCisgIEwgPSBST1RBVEUzMl9MRUZUKHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkNV9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgKyAwXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUUiA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgKyAxXSk7CisgICAgRE9fUFJFRDUoMCk7CisgICAgRE9fUFJFRDUoMSk7CisgICAgRE9fUFJFRDUoMik7CisgICAgRE9fUFJFRDUoMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1s1XShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQ1CisKKyNkZWZpbmUgRE9fUFJFRDY3KExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnID0gdmhhZGRxX3U4KEwsIHRvcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KGF2Zywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MXFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0cV91MzJfdTgocmVzKSwgKExBTkUpKTsgICBcCisgIEwgPSBST1RBVEUzMl9MRUZUKHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gUHJlZGljdG9yNjogYXZlcmFnZShsZWZ0LCBUTCkKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDZfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHRvcCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgLSAxXSk7CisgICAgRE9fUFJFRDY3KDApOworICAgIERPX1BSRUQ2NygxKTsKKyAgICBET19QUkVENjcoMik7CisgICAgRE9fUFJFRDY3KDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbNl0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKworLy8gUHJlZGljdG9yNzogYXZlcmFnZShsZWZ0LCBUKQorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkN19ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgdG9wID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOworICAgIERPX1BSRUQ2NygwKTsKKyAgICBET19QUkVENjcoMSk7CisgICAgRE9fUFJFRDY3KDIpOworICAgIERPX1BSRUQ2NygzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzddKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDY3CisKKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzIoWCwgSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkIyNYIyNfTkVPTihjb25zdCB1aW50MzJfdCogaW4sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgaW50IG51bV9waXhlbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgVG90aGVyID0gTE9BRFFfVTMyUF9BU19VOCgmKElOKSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IGF2ZyA9IHZoYWRkcV91OChULCBUb3RoZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoYXZnLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RPUkVRX1U4X0FTX1UzMlAoJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWUDhMUHJlZGljdG9yc0FkZF9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICBcCit9CisvLyBQcmVkaWN0b3I4OiBhdmVyYWdlIFRMIFQuCitHRU5FUkFURV9QUkVESUNUT1JfMig4LCB1cHBlcltpIC0gMV0pCisvLyBQcmVkaWN0b3I5OiBhdmVyYWdlIFQgVFIuCitHRU5FUkFURV9QUkVESUNUT1JfMig5LCB1cHBlcltpICsgMV0pCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzIKKworLy8gUHJlZGljdG9yMTA6IGF2ZXJhZ2Ugb2YgKGF2ZXJhZ2Ugb2YgKEwsVEwpLCBhdmVyYWdlIG9mIChULCBUUikpLgorI2RlZmluZSBET19QUkVEMTAoTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmdMVEwgPSB2aGFkZHFfdTgoTCwgVEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnID0gdmhhZGRxX3U4KGF2Z1RUUiwgYXZnTFRMKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KGF2Zywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MXFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0cV91MzJfdTgocmVzKSwgKExBTkUpKTsgICBcCisgIEwgPSBST1RBVEUzMl9MRUZUKHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTBfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUTCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVFIgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpICsgMV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnVFRSID0gdmhhZGRxX3U4KFQsIFRSKTsKKyAgICBET19QUkVEMTAoMCk7CisgICAgRE9fUFJFRDEwKDEpOworICAgIERPX1BSRUQxMCgyKTsKKyAgICBET19QUkVEMTAoMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVEMTAKKworLy8gUHJlZGljdG9yMTE6IHNlbGVjdC4KKyNkZWZpbmUgRE9fUFJFRDExKExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3Qgc3VtTGluID0gdmFkZHFfdTgoTCwgc3JjKTsgIC8qIGluICsgTCAqLyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHBMVEwgPSB2YWJkcV91OChMLCBUTCk7ICAvKiB8TCAtIFRMfCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBzdW1fTFRMID0gdnBhZGRscV91OChwTFRMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMng0X3QgcGEgPSB2cGFkZGxxX3UxNihzdW1fTFRMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJ4NF90IG1hc2sgPSB2Y2xlcV91MzIocGEsIHBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YnNscV91OCh2cmVpbnRlcnByZXRxX3U4X3UzMihtYXNrKSwgc3VtVGluLCBzdW1MaW4pOyBcCisgIHZzdDFxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldHFfdTMyX3U4KHJlcyksIChMQU5FKSk7ICAgICAgICAgXAorICBMID0gUk9UQVRFMzJfTEVGVChyZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDExX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFRMID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHBUVEwgPSB2YWJkcV91OChULCBUTCk7ICAgLy8gfFQgLSBUTHwKKyAgICBjb25zdCB1aW50MTZ4OF90IHN1bV9UVEwgPSB2cGFkZGxxX3U4KHBUVEwpOworICAgIGNvbnN0IHVpbnQzMng0X3QgcGIgPSB2cGFkZGxxX3UxNihzdW1fVFRMKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHN1bVRpbiA9IHZhZGRxX3U4KFQsIHNyYyk7ICAgLy8gaW4gKyBUCisgICAgRE9fUFJFRDExKDApOworICAgIERPX1BSRUQxMSgxKTsKKyAgICBET19QUkVEMTEoMik7CisgICAgRE9fUFJFRDExKDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTFdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDExCisKKy8vIFByZWRpY3RvcjEyOiBDbGFtcGVkQWRkU3VidHJhY3RGdWxsLgorI2RlZmluZSBET19QUkVEMTIoRElGRiwgTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHByZWQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2cW1vdnVuX3MxNih2YWRkcV9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KEwpLCAoRElGRikpKTsgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgcmVzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZhZGRfdTgocHJlZCwgKExBTkUgPD0gMSkgPyB2Z2V0X2xvd191OChzcmMpIDogdmdldF9oaWdoX3U4KHNyYykpOyBcCisgIGNvbnN0IHVpbnQxNng4X3QgcmVzMTYgPSB2bW92bF91OChyZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldF91MzJfdTgocmVzKSwgKExBTkUpICYgMSk7IFwKKyAgLyogcm90YXRlIGluIHRoZSBsZWZ0IHByZWRpY3RvciBmb3IgbmV4dCBpdGVyYXRpb24gKi8gICAgICAgICAgICAgICAgICBcCisgIEwgPSB2ZXh0cV91MTYocmVzMTYsIHJlczE2LCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTJfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQxNng4X3QgTCA9IHZtb3ZsX3U4KExPQURfVTMyX0FTX1U4KG91dFstMV0pKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgLy8gbG9hZCBmb3VyIHBpeGVscyBvZiBzb3VyY2UKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICAvLyBwcmVjb21wdXRlIHRoZSBkaWZmZXJlbmNlIFQgLSBUTCBvbmNlIGZvciBhbGwsIHN0b3JlZCBhcyBzMTYKKyAgICBjb25zdCB1aW50OHgxNl90IFRMID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7CisgICAgY29uc3QgaW50MTZ4OF90IGRpZmZfbG8gPQorICAgICAgICB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgodmdldF9sb3dfdTgoVCksIHZnZXRfbG93X3U4KFRMKSkpOworICAgIGNvbnN0IGludDE2eDhfdCBkaWZmX2hpID0KKyAgICAgICAgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHZnZXRfaGlnaF91OChUKSwgdmdldF9oaWdoX3U4KFRMKSkpOworICAgIC8vIGxvb3Agb3ZlciB0aGUgZm91ciByZWNvbnN0cnVjdGVkIHBpeGVscworICAgIERPX1BSRUQxMihkaWZmX2xvLCAwKTsKKyAgICBET19QUkVEMTIoZGlmZl9sbywgMSk7CisgICAgRE9fUFJFRDEyKGRpZmZfaGksIDIpOworICAgIERPX1BSRUQxMihkaWZmX2hpLCAzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzEyXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQxMgorCisvLyBQcmVkaWN0b3IxMzogQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZgorI2RlZmluZSBET19QUkVEMTMoTEFORSwgTE9XX09SX0hJKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmcgPSB2aGFkZHFfdTgoTCwgVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgY21wID0gdmNndHFfdTgoVEwsIGF2Zyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IFRMXzEgPSB2YWRkcV91OChUTCwgY21wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogQ29tcHV0ZSBoYWxmIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXZnIGFuZCBUTCcuICovICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDh4OF90IGRpZmZfYXZnID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdnJlaW50ZXJwcmV0X3M4X3U4KExPV19PUl9ISSh2aHN1YnFfdTgoYXZnLCBUTF8xKSkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogQ29tcHV0ZSB0aGUgc3VtIHdpdGggYXZnIGFuZCBzYXR1cmF0ZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDhfdCBhdmdfMTYgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodm1vdmxfdTgoTE9XX09SX0hJKGF2ZykpKTsgICAgXAorICBjb25zdCB1aW50OHg4X3QgZGVsdGEgPSB2cW1vdnVuX3MxNih2YWRkd19zOChhdmdfMTYsIGRpZmZfYXZnKSk7ICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHJlcyA9IHZhZGRfdTgoTE9XX09SX0hJKHNyYyksIGRlbHRhKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzMiA9IHZjb21iaW5lX3U4KHJlcywgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldF91MzJfdTgocmVzKSwgKExBTkUpICYgMSk7ICAgICAgIFwKKyAgTCA9IFJPVEFURTMyX0xFRlQocmVzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxM19ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUTCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgLSAxXSk7CisgICAgRE9fUFJFRDEzKDAsIHZnZXRfbG93X3U4KTsKKyAgICBET19QUkVEMTMoMSwgdmdldF9sb3dfdTgpOworICAgIERPX1BSRUQxMygyLCB2Z2V0X2hpZ2hfdTgpOworICAgIERPX1BSRUQxMygzLCB2Z2V0X2hpZ2hfdTgpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTNdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDEzCisKKyN1bmRlZiBMT0FEX1UzMl9BU19VOAorI3VuZGVmIExPQURfVTMyUF9BU19VOAorI3VuZGVmIExPQURRX1UzMl9BU19VOAorI3VuZGVmIExPQURRX1UzMlBfQVNfVTgKKyN1bmRlZiBHRVRfVThfQVNfVTMyCisjdW5kZWYgR0VUUV9VOF9BU19VMzIKKyN1bmRlZiBTVE9SRVFfVThfQVNfVTMyUAorI3VuZGVmIFJPVEFURTMyX0xFRlQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCisvLyB2dGJsP191OCBhcmUgbWFya2VkIHVuYXZhaWxhYmxlIGZvciBpT1MgYXJtNjQgd2l0aCBYY29kZSA8IDYuMywgdXNlCisvLyBub24tc3RhbmRhcmQgdmVyc2lvbnMgdGhlcmUuCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hYXJjaDY0X18pICYmIFwKKyAgICBkZWZpbmVkKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fKSAmJiAoX19hcHBsZV9idWlsZF92ZXJzaW9uX188IDYwMjAwMzcpCisjZGVmaW5lIFVTRV9WVEJMUQorI2VuZGlmCisKKyNpZmRlZiBVU0VfVlRCTFEKKy8vIDI1NSA9IGJ5dGUgd2lsbCBiZSB6ZXJvZWQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtHcmVlblNodWZmbGVbMTZdID0geworICAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LCAxMywgMjU1LCAxMywgMjU1Cit9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4MTZfdCBEb0dyZWVuU2h1ZmZsZV9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlKSB7CisgIHJldHVybiB2Y29tYmluZV91OCh2dGJsMXFfdTgoYXJnYiwgdmdldF9sb3dfdTgoc2h1ZmZsZSkpLAorICAgICAgICAgICAgICAgICAgICAgdnRibDFxX3U4KGFyZ2IsIHZnZXRfaGlnaF91OChzaHVmZmxlKSkpOworfQorI2Vsc2UgIC8vICFVU0VfVlRCTFEKKy8vIDI1NSA9IGJ5dGUgd2lsbCBiZSB6ZXJvZWQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtHcmVlblNodWZmbGVbOF0gPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSAgfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDE2X3QgRG9HcmVlblNodWZmbGVfTkVPTihjb25zdCB1aW50OHgxNl90IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlKSB7CisgIHJldHVybiB2Y29tYmluZV91OCh2dGJsMV91OCh2Z2V0X2xvd191OChhcmdiKSwgc2h1ZmZsZSksCisgICAgICAgICAgICAgICAgICAgICB2dGJsMV91OCh2Z2V0X2hpZ2hfdTgoYXJnYiksIHNodWZmbGUpKTsKK30KKyNlbmRpZiAgLy8gVVNFX1ZUQkxRCisKK3N0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkX05FT04oY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworI2lmZGVmIFVTRV9WVEJMUQorICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUgPSB2bGQxcV91OChrR3JlZW5TaHVmZmxlKTsKKyNlbHNlCisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlID0gdmxkMV91OChrR3JlZW5TaHVmZmxlKTsKKyNlbmRpZgorICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gNCwgZHN0ICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGFyZ2IgPSB2bGQxcV91OCgoY29uc3QgdWludDhfdCopc3JjKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGdyZWVucyA9IERvR3JlZW5TaHVmZmxlX05FT04oYXJnYiwgc2h1ZmZsZSk7CisgICAgdnN0MXFfdTgoKHVpbnQ4X3QqKWRzdCwgdmFkZHFfdTgoYXJnYiwgZ3JlZW5zKSk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DKHNyYywgbnVtX3BpeGVscyAmIDMsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JJbnZlcnNlX05FT04oY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogZHN0KSB7CisvLyBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNi4KKyNkZWZpbmUgQ1NUKFgpICAoKChpbnQxNl90KShtLT5YIDw8IDgpKSA+PiA2KQorICBjb25zdCBpbnQxNl90IHJiWzhdID0geworICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKQorICB9OworICBjb25zdCBpbnQxNng4X3QgbXVsdHNfcmIgPSB2bGQxcV9zMTYocmIpOworICBjb25zdCBpbnQxNl90IGIyWzhdID0geworICAgIDAsIENTVChyZWRfdG9fYmx1ZV8pLCAwLCBDU1QocmVkX3RvX2JsdWVfKSwKKyAgICAwLCBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksCisgIH07CisgIGNvbnN0IGludDE2eDhfdCBtdWx0c19iMiA9IHZsZDFxX3MxNihiMik7CisjdW5kZWYgQ1NUCisjaWZkZWYgVVNFX1ZUQkxRCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtnMGcwWzE2XSA9IHsKKyAgICAyNTUsIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsIDEzLCAyNTUsIDEzCisgIH07CisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSA9IHZsZDFxX3U4KGtnMGcwKTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGswZzBnWzhdID0geyAyNTUsIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUgfTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUgPSB2bGQxX3U4KGswZzBnKTsKKyNlbmRpZgorICBjb25zdCB1aW50MzJ4NF90IG1hc2tfYWcgPSB2ZHVwcV9uX3UzMigweGZmMDBmZjAwdSk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGluID0gdmxkMXFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyBpKSk7CisgICAgY29uc3QgdWludDMyeDRfdCBhMGcwID0gdmFuZHFfdTMyKHZyZWludGVycHJldHFfdTMyX3U4KGluKSwgbWFza19hZyk7CisgICAgLy8gMCBnIDAgZworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZ3JlZW5zID0gRG9HcmVlblNodWZmbGVfTkVPTihpbiwgc2h1ZmZsZSk7CisgICAgLy8geCBkciAgeCBkYjEKKyAgICBjb25zdCBpbnQxNng4X3QgQSA9IHZxZG11bGhxX3MxNih2cmVpbnRlcnByZXRxX3MxNl91OChncmVlbnMpLCBtdWx0c19yYik7CisgICAgLy8geCByJyAgeCAgIGInCisgICAgY29uc3QgaW50OHgxNl90IEIgPSB2YWRkcV9zOCh2cmVpbnRlcnByZXRxX3M4X3U4KGluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczhfczE2KEEpKTsKKyAgICAvLyByJyAwICAgYicgMAorICAgIGNvbnN0IGludDE2eDhfdCBDID0gdnNobHFfbl9zMTYodnJlaW50ZXJwcmV0cV9zMTZfczgoQiksIDgpOworICAgIC8vIHggZGIyICAwICAwCisgICAgY29uc3QgaW50MTZ4OF90IEQgPSB2cWRtdWxocV9zMTYoQywgbXVsdHNfYjIpOworICAgIC8vIDAgIHggZGIyICAwCisgICAgY29uc3QgdWludDMyeDRfdCBFID0gdnNocnFfbl91MzIodnJlaW50ZXJwcmV0cV91MzJfczE2KEQpLCA4KTsKKyAgICAvLyByJyB4ICBiJycgMAorICAgIGNvbnN0IGludDh4MTZfdCBGID0gdmFkZHFfczgodnJlaW50ZXJwcmV0cV9zOF91MzIoRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3M4X3MxNihDKSk7CisgICAgLy8gMCAgcicgIDAgIGInJworICAgIGNvbnN0IHVpbnQxNng4X3QgRyA9IHZzaHJxX25fdTE2KHZyZWludGVycHJldHFfdTE2X3M4KEYpLCA4KTsKKyAgICBjb25zdCB1aW50MzJ4NF90IG91dCA9IHZvcnJxX3UzMih2cmVpbnRlcnByZXRxX3UzMl91MTYoRyksIGEwZzApOworICAgIHZzdDFxX3UzMihkc3QgKyBpLCBvdXQpOworICB9CisgIC8vIEZhbGwtYmFjayB0byBDLXZlcnNpb24gZm9yIGxlZnQtb3ZlcnMuCisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhtLCBzcmMgKyBpLCBudW1fcGl4ZWxzIC0gaSwgZHN0ICsgaSk7Cit9CisKKyN1bmRlZiBVU0VfVlRCTFEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExEc3BJbml0TkVPTih2b2lkKSB7CisgIFZQOExQcmVkaWN0b3JzWzVdID0gUHJlZGljdG9yNV9ORU9OOworICBWUDhMUHJlZGljdG9yc1s2XSA9IFByZWRpY3RvcjZfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNbN10gPSBQcmVkaWN0b3I3X05FT047CisgIFZQOExQcmVkaWN0b3JzWzEzXSA9IFByZWRpY3RvcjEzX05FT047CisKKyAgVlA4TFByZWRpY3RvcnNBZGRbMF0gPSBQcmVkaWN0b3JBZGQwX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzFdID0gUHJlZGljdG9yQWRkMV9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsyXSA9IFByZWRpY3RvckFkZDJfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbM10gPSBQcmVkaWN0b3JBZGQzX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzRdID0gUHJlZGljdG9yQWRkNF9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs1XSA9IFByZWRpY3RvckFkZDVfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNl0gPSBQcmVkaWN0b3JBZGQ2X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzddID0gUHJlZGljdG9yQWRkN19ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs4XSA9IFByZWRpY3RvckFkZDhfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbOV0gPSBQcmVkaWN0b3JBZGQ5X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzEwXSA9IFByZWRpY3RvckFkZDEwX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzExXSA9IFByZWRpY3RvckFkZDExX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzEyXSA9IFByZWRpY3RvckFkZDEyX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzEzXSA9IFByZWRpY3RvckFkZDEzX05FT047CisKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gQ29udmVydEJHUkFUb1JHQkFfTkVPTjsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBDb252ZXJ0QkdSQVRvQkdSX05FT047CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gQ29udmVydEJHUkFUb1JHQl9ORU9OOworCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkX05FT047CisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBUcmFuc2Zvcm1Db2xvckludmVyc2VfTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdE5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q3NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19zc2UyLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9yIFRyYW5zZm9ybQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbF9TU0UyKHVpbnQzMl90IGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMwKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMSksIHplcm8pOworICBjb25zdCBfX20xMjhpIEMyID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBWMSA9IF9tbV9hZGRfZXBpMTYoQzAsIEMxKTsKKyAgY29uc3QgX19tMTI4aSBWMiA9IF9tbV9zdWJfZXBpMTYoVjEsIEMyKTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX3BhY2t1c19lcGkxNihWMiwgVjIpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihiKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGZfU1NFMih1aW50MzJfdCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMCksIHplcm8pOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzEpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMyKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnID0gX21tX2FkZF9lcGkxNihDMSwgQzApOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NybGlfZXBpMTYoYXZnLCAxKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zdWJfZXBpMTYoQTAsIEIwKTsKKyAgY29uc3QgX19tMTI4aSBCZ3RBID0gX21tX2NtcGd0X2VwaTE2KEIwLCBBMCk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc3ViX2VwaTE2KEExLCBCZ3RBKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmFpX2VwaTE2KEEyLCAxKTsKKyAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9hZGRfZXBpMTYoQTAsIEEzKTsKKyAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9wYWNrdXNfZXBpMTYoQTQsIEE0KTsKKyAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoQTUpOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0X1NTRTIodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYykgeworICBpbnQgcGFfbWludXNfcGI7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fY3Z0c2kzMl9zaTEyOChhKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGIpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX2N2dHNpMzJfc2kxMjgoYyk7CisgIGNvbnN0IF9fbTEyOGkgQUMwID0gX21tX3N1YnNfZXB1OChBMCwgQzApOworICBjb25zdCBfX20xMjhpIENBMCA9IF9tbV9zdWJzX2VwdTgoQzAsIEEwKTsKKyAgY29uc3QgX19tMTI4aSBCQzAgPSBfbW1fc3Vic19lcHU4KEIwLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgQ0IwID0gX21tX3N1YnNfZXB1OChDMCwgQjApOworICBjb25zdCBfX20xMjhpIEFDID0gX21tX29yX3NpMTI4KEFDMCwgQ0EwKTsKKyAgY29uc3QgX19tMTI4aSBCQyA9IF9tbV9vcl9zaTEyOChCQzAsIENCMCk7CisgIGNvbnN0IF9fbTEyOGkgcGEgPSBfbW1fdW5wYWNrbG9fZXBpOChBQywgemVybyk7ICAvLyB8YSAtIGN8CisgIGNvbnN0IF9fbTEyOGkgcGIgPSBfbW1fdW5wYWNrbG9fZXBpOChCQywgemVybyk7ICAvLyB8YiAtIGN8CisgIGNvbnN0IF9fbTEyOGkgZGlmZiA9IF9tbV9zdWJfZXBpMTYocGIsIHBhKTsKKyAgeworICAgIGludDE2X3Qgb3V0WzhdOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKW91dCwgZGlmZik7CisgICAgcGFfbWludXNfcGIgPSBvdXRbMF0gKyBvdXRbMV0gKyBvdXRbMl0gKyBvdXRbM107CisgIH0KKyAgcmV0dXJuIChwYV9taW51c19wYiA8PSAwKSA/IGEgOiBiOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBdmVyYWdlMl9tMTI4aShjb25zdCBfX20xMjhpKiBjb25zdCBhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgYXZnKSB7CisgIC8vIChhICsgYikgPj4gMSA9ICgoYSArIGIgKyAxKSA+PiAxKSAtICgoYSBeIGIpICYgMSkKKyAgY29uc3QgX19tMTI4aSBvbmVzID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KCphMCwgKmExKTsKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoKmEwLCAqYTEpLCBvbmVzKTsKKyAgKmF2ZyA9IF9tbV9zdWJfZXBpOChhdmcxLCBvbmUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBdmVyYWdlMl91aW50MzJfU1NFMihjb25zdCB1aW50MzJfdCBhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgYXZnKSB7CisgIC8vIChhICsgYikgPj4gMSA9ICgoYSArIGIgKyAxKSA+PiAxKSAtICgoYSBeIGIpICYgMSkKKyAgY29uc3QgX19tMTI4aSBvbmVzID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGEwKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9jdnRzaTMyX3NpMTI4KGExKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEEwLCBBMSksIG9uZXMpOworICAqYXZnID0gX21tX3N1Yl9lcGk4KGF2ZzEsIG9uZSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIEF2ZXJhZ2UyX3VpbnQzMl8xNl9TU0UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYTApLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGExKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihBMSwgQTApOworICByZXR1cm4gX21tX3NybGlfZXBpMTYoc3VtLCAxKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyX1NTRTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIF9fbTEyOGkgb3V0cHV0OworICBBdmVyYWdlMl91aW50MzJfU1NFMihhMCwgYTEsICZvdXRwdXQpOworICByZXR1cm4gX21tX2N2dHNpMTI4X3NpMzIob3V0cHV0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzX1NTRTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gQXZlcmFnZTJfdWludDMyXzE2X1NTRTIoYTAsIGEyKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGExKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihhdmcxLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fcGFja3VzX2VwaTE2KGF2ZzIsIGF2ZzIpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBMik7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNF9TU0UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgeworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBBdmVyYWdlMl91aW50MzJfMTZfU1NFMihhMCwgYTEpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBBdmVyYWdlMl91aW50MzJfMTZfU1NFMihhMiwgYTMpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoYXZnMiwgYXZnMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMyA9IF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fcGFja3VzX2VwaTE2KGF2ZzMsIGF2ZzMpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBMCk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1X1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTNfU1NFMihsZWZ0LCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjZfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMl9TU0UyKGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3X1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTJfU1NFMihsZWZ0LCB0b3BbMF0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4X1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTJfU1NFMih0b3BbLTFdLCB0b3BbMF0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I5X1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTJfU1NFMih0b3BbMF0sIHRvcFsxXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwX1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTRfU1NFMihsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExX1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0X1NTRTIodG9wWzBdLCBsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTJfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsX1NTRTIobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTNfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RIYWxmX1NTRTIobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CisKKy8vIEJhdGNoIHZlcnNpb25zIG9mIHRob3NlIGZ1bmN0aW9ucy4KKworLy8gUHJlZGljdG9yMDogQVJHQl9CTEFDSy4KK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDBfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSBibGFjayA9IF9tbV9zZXQxX2VwaTMyKEFSR0JfQkxBQ0spOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9hZGRfZXBpOChzcmMsIGJsYWNrKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWzBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8gUHJlZGljdG9yMTogbGVmdC4KK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDFfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgX19tMTI4aSBwcmV2ID0gX21tX3NldDFfZXBpMzIob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIC8vIGEgfCBiIHwgYyB8IGQKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICAvLyAwIHwgYSB8IGIgfCBjCisgICAgY29uc3QgX19tMTI4aSBzaGlmdDAgPSBfbW1fc2xsaV9zaTEyOChzcmMsIDQpOworICAgIC8vIGEgfCBhICsgYiB8IGIgKyBjIHwgYyArIGQKKyAgICBjb25zdCBfX20xMjhpIHN1bTAgPSBfbW1fYWRkX2VwaTgoc3JjLCBzaGlmdDApOworICAgIC8vIDAgfCAwIHwgYSB8IGEgKyBiCisgICAgY29uc3QgX19tMTI4aSBzaGlmdDEgPSBfbW1fc2xsaV9zaTEyOChzdW0wLCA4KTsKKyAgICAvLyBhIHwgYSArIGIgfCBhICsgYiArIGMgfCBhICsgYiArIGMgKyBkCisgICAgY29uc3QgX19tMTI4aSBzdW0xID0gX21tX2FkZF9lcGk4KHN1bTAsIHNoaWZ0MSk7CisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fYWRkX2VwaTgoc3VtMSwgcHJldik7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgICAvLyByZXBsaWNhdGUgcHJldiBvdXRwdXQgb24gdGhlIGZvdXIgbGFuZXMKKyAgICBwcmV2ID0gX21tX3NodWZmbGVfZXBpMzIocmVzLCAoMyA8PCAwKSB8ICgzIDw8IDIpIHwgKDMgPDwgNCkgfCAoMyA8PCA2KSk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbMV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLyBNYWNybyB0aGF0IGFkZHMgMzItYml0IGludGVnZXJzIGZyb20gSU4gdXNpbmcgbW9kIDI1NiBhcml0aG1ldGljCisvLyBwZXIgOCBiaXQgY2hhbm5lbC4KKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzEoWCwgSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZCMjWCMjX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIG90aGVyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKElOKSk7ICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9hZGRfZXBpOChzcmMsIG90aGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gUHJlZGljdG9yMjogVG9wLgorR0VORVJBVEVfUFJFRElDVE9SXzEoMiwgdXBwZXJbaV0pCisvLyBQcmVkaWN0b3IzOiBUb3AtcmlnaHQuCitHRU5FUkFURV9QUkVESUNUT1JfMSgzLCB1cHBlcltpICsgMV0pCisvLyBQcmVkaWN0b3I0OiBUb3AtbGVmdC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDQsIHVwcGVyW2kgLSAxXSkKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMQorCisvLyBEdWUgdG8gYXZlcmFnZXMgd2l0aCBpbnRlZ2VycywgdmFsdWVzIGNhbm5vdCBiZSBhY2N1bXVsYXRlZCBpbiBwYXJhbGxlbCBmb3IKKy8vIHByZWRpY3RvcnMgNSB0byA3LgorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I1X1NTRTIsIFByZWRpY3RvckFkZDVfU1NFMikKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yNl9TU0UyLCBQcmVkaWN0b3JBZGQ2X1NTRTIpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjdfU1NFMiwgUHJlZGljdG9yQWRkN19TU0UyKQorCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8yKFgsIElOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQjI1gjI19TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBUb3RoZXIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoSU4pKTsgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOyAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7ICAgICAgICAgICAgICBcCisgICAgX19tMTI4aSBhdmcsIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQXZlcmFnZTJfbTEyOGkoJlQsICZUb3RoZXIsICZhdmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzID0gX21tX2FkZF9lcGk4KGF2Zywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBQcmVkaWN0b3I4OiBhdmVyYWdlIFRMIFQuCitHRU5FUkFURV9QUkVESUNUT1JfMig4LCB1cHBlcltpIC0gMV0pCisvLyBQcmVkaWN0b3I5OiBhdmVyYWdlIFQgVFIuCitHRU5FUkFURV9QUkVESUNUT1JfMig5LCB1cHBlcltpICsgMV0pCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzIKKworLy8gUHJlZGljdG9yMTA6IGF2ZXJhZ2Ugb2YgKGF2ZXJhZ2Ugb2YgKEwsVEwpLCBhdmVyYWdlIG9mIChULCBUUikpLgorI2RlZmluZSBET19QUkVEMTAoT1VUKSBkbyB7ICAgICAgICAgICAgICAgXAorICBfX20xMjhpIGF2Z0xUTCwgYXZnOyAgICAgICAgICAgICAgICAgICAgXAorICBBdmVyYWdlMl9tMTI4aSgmTCwgJlRMLCAmYXZnTFRMKTsgICAgICAgXAorICBBdmVyYWdlMl9tMTI4aSgmYXZnVFRSLCAmYXZnTFRMLCAmYXZnKTsgXAorICBMID0gX21tX2FkZF9lcGk4KGF2Zywgc3JjKTsgICAgICAgICAgICAgXAorICBvdXRbaSArIChPVVQpXSA9IF9tbV9jdnRzaTEyOF9zaTMyKEwpOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBET19QUkVEMTBfU0hJRlQgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIFJvdGF0ZSB0aGUgcHJlLWNvbXB1dGVkIHZhbHVlcyBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLiovIFwKKyAgYXZnVFRSID0gX21tX3NybGlfc2kxMjgoYXZnVFRSLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUTCA9IF9tbV9zcmxpX3NpMTI4KFRMLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNyYyA9IF9tbV9zcmxpX3NpMTI4KHNyYywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDEwX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBfX20xMjhpIEwgPSBfbW1fY3Z0c2kzMl9zaTEyOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVFIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpICsgMV0pOworICAgIF9fbTEyOGkgYXZnVFRSOworICAgIEF2ZXJhZ2UyX20xMjhpKCZULCAmVFIsICZhdmdUVFIpOworICAgIERPX1BSRUQxMCgwKTsKKyAgICBET19QUkVEMTBfU0hJRlQ7CisgICAgRE9fUFJFRDEwKDEpOworICAgIERPX1BSRUQxMF9TSElGVDsKKyAgICBET19QUkVEMTAoMik7CisgICAgRE9fUFJFRDEwX1NISUZUOworICAgIERPX1BSRUQxMCgzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorI3VuZGVmIERPX1BSRUQxMAorI3VuZGVmIERPX1BSRUQxMF9TSElGVAorCisvLyBQcmVkaWN0b3IxMTogc2VsZWN0LgorI2RlZmluZSBET19QUkVEMTEoT1VUKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgTF9sbyA9IF9tbV91bnBhY2tsb19lcGkzMihMLCBUKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBUTF9sbyA9IF9tbV91bnBhY2tsb19lcGkzMihUTCwgVCk7ICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHBiID0gX21tX3NhZF9lcHU4KExfbG8sIFRMX2xvKTsgLyogcGIgPSBzdW0gfEwtVEx8Ki8gICBcCisgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9jbXBndF9lcGkzMihwYiwgcGEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX2FuZF9zaTEyOChtYXNrLCBMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEIgPSBfbW1fYW5kbm90X3NpMTI4KG1hc2ssIFQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgcHJlZCA9IF9tbV9vcl9zaTEyOChBLCBCKTsgLyogcHJlZCA9IChwYSA+IGIpPyBMIDogVCovIFwKKyAgTCA9IF9tbV9hZGRfZXBpOChzcmMsIHByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXRbaSArIChPVVQpXSA9IF9tbV9jdnRzaTEyOF9zaTMyKEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERPX1BSRUQxMV9TSElGVCBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIFNoaWZ0IHRoZSBwcmUtY29tcHV0ZWQgdmFsdWUgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4qLyBcCisgIFQgPSBfbW1fc3JsaV9zaTEyOChULCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRMID0gX21tX3NybGlfc2kxMjgoVEwsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNyYyA9IF9tbV9zcmxpX3NpMTI4KHNyYywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBhID0gX21tX3NybGlfc2kxMjgocGEsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMV9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgX19tMTI4aSBwYTsKKyAgX19tMTI4aSBMID0gX21tX2N2dHNpMzJfc2kxMjgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICB7CisgICAgICAvLyBXZSBjYW4gdW5wYWNrIHdpdGggYW55IHZhbHVlIG9uIHRoZSB1cHBlciAzMiBiaXRzLCBwcm92aWRlZCBpdCdzIHRoZQorICAgICAgLy8gc2FtZSBvbiBib3RoIG9wZXJhbmRzIChzbyB0aGF0IHRoZWlyIHN1bSBvZiBhYnMgZGlmZiBpcyB6ZXJvKS4gSGVyZSB3ZQorICAgICAgLy8gdXNlIFQuCisgICAgICBjb25zdCBfX20xMjhpIFRfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoVCwgVCk7CisgICAgICBjb25zdCBfX20xMjhpIFRMX2xvID0gX21tX3VucGFja2xvX2VwaTMyKFRMLCBUKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgVF9oaSA9IF9tbV91bnBhY2toaV9lcGkzMihULCBUKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgVExfaGkgPSBfbW1fdW5wYWNraGlfZXBpMzIoVEwsIFQpOworICAgICAgY29uc3QgX19tMTI4aSBzX2xvID0gX21tX3NhZF9lcHU4KFRfbG8sIFRMX2xvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgc19oaSA9IF9tbV9zYWRfZXB1OChUX2hpLCBUTF9oaSk7CisgICAgICBwYSA9IF9tbV9wYWNrc19lcGkzMihzX2xvLCBzX2hpKTsgIC8vIHBhID0gc3VtIHxULVRMfAorICAgIH0KKyAgICBET19QUkVEMTEoMCk7CisgICAgRE9fUFJFRDExX1NISUZUOworICAgIERPX1BSRUQxMSgxKTsKKyAgICBET19QUkVEMTFfU0hJRlQ7CisgICAgRE9fUFJFRDExKDIpOworICAgIERPX1BSRUQxMV9TSElGVDsKKyAgICBET19QUkVEMTEoMyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTFdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKyN1bmRlZiBET19QUkVEMTEKKyN1bmRlZiBET19QUkVEMTFfU0hJRlQKKworLy8gUHJlZGljdG9yMTI6IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwuCisjZGVmaW5lIERPX1BSRUQxMihESUZGLCBMQU5FLCBPVVQpIGRvIHsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxsID0gX21tX2FkZF9lcGkxNihMLCAoRElGRikpOyAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxscyA9IF9tbV9wYWNrdXNfZXBpMTYoYWxsLCBhbGwpOyBcCisgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX2FkZF9lcGk4KHNyYywgYWxscyk7ICAgICBcCisgIG91dFtpICsgKE9VVCldID0gX21tX2N2dHNpMTI4X3NpMzIocmVzKTsgICAgICAgICBcCisgIEwgPSBfbW1fdW5wYWNrbG9fZXBpOChyZXMsIHplcm8pOyAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERPX1BSRUQxMl9TSElGVChESUZGLCBMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIC8qIFNoaWZ0IHRoZSBwcmUtY29tcHV0ZWQgdmFsdWUgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4qLyBcCisgIGlmICgoTEFORSkgPT0gMCkgKERJRkYpID0gX21tX3NybGlfc2kxMjgoKERJRkYpLCA4KTsgICAgICBcCisgIHNyYyA9IF9tbV9zcmxpX3NpMTI4KHNyYywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMl9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBMOCA9IF9tbV9jdnRzaTMyX3NpMTI4KG91dFstMV0pOworICBfX20xMjhpIEwgPSBfbW1fdW5wYWNrbG9fZXBpOChMOCwgemVybyk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIC8vIExvYWQgNCBwaXhlbHMgYXQgYSB0aW1lLgorICAgIF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChULCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChULCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFRMX2xvID0gX21tX3VucGFja2xvX2VwaTgoVEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVExfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChUTCwgemVybyk7CisgICAgX19tMTI4aSBkaWZmX2xvID0gX21tX3N1Yl9lcGkxNihUX2xvLCBUTF9sbyk7CisgICAgX19tMTI4aSBkaWZmX2hpID0gX21tX3N1Yl9lcGkxNihUX2hpLCBUTF9oaSk7CisgICAgRE9fUFJFRDEyKGRpZmZfbG8sIDAsIDApOworICAgIERPX1BSRUQxMl9TSElGVChkaWZmX2xvLCAwKTsKKyAgICBET19QUkVEMTIoZGlmZl9sbywgMSwgMSk7CisgICAgRE9fUFJFRDEyX1NISUZUKGRpZmZfbG8sIDEpOworICAgIERPX1BSRUQxMihkaWZmX2hpLCAwLCAyKTsKKyAgICBET19QUkVEMTJfU0hJRlQoZGlmZl9oaSwgMCk7CisgICAgRE9fUFJFRDEyKGRpZmZfaGksIDEsIDMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWzEyXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisjdW5kZWYgRE9fUFJFRDEyCisjdW5kZWYgRE9fUFJFRDEyX1NISUZUCisKKy8vIER1ZSB0byBhdmVyYWdlcyB3aXRoIGludGVnZXJzLCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VtdWxhdGVkIGluIHBhcmFsbGVsIGZvcgorLy8gcHJlZGljdG9ycyAxMy4KK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMTNfU1NFMiwgUHJlZGljdG9yQWRkMTNfU1NFMikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZF9TU0UyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjW2ldKTsgLy8gYXJnYgorICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9zcmxpX2VwaTE2KGluLCA4KTsgICAgIC8vIDAgYSAwIGcKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEIsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsgIC8vIDBnMGcKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9hZGRfZXBpOChpbiwgQyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpXSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DKHNyYyArIGksIG51bV9waXhlbHMgLSBpLCBkc3QgKyBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9TU0UyKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIGRzdCkgeworLy8gc2lnbi1leHRlbmRlZCBtdWx0aXBseWluZyBjb25zdGFudHMsIHByZS1zaGlmdGVkIGJ5IDUuCisjZGVmaW5lIENTVChYKSAgKCgoaW50MTZfdCkobS0+WCA8PCA4KSkgPj4gNSkgICAvLyBzaWduLWV4dGVuZAorI2RlZmluZSBNS19DU1RfMTYoSEksIExPKSBcCisgIF9tbV9zZXQxX2VwaTMyKChpbnQpKCgodWludDMyX3QpKEhJKSA8PCAxNikgfCAoKExPKSAmIDB4ZmZmZikpKQorICBjb25zdCBfX20xMjhpIG11bHRzX3JiID0gTUtfQ1NUXzE2KENTVChncmVlbl90b19yZWRfKSwgQ1NUKGdyZWVuX3RvX2JsdWVfKSk7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfYjIgPSBNS19DU1RfMTYoQ1NUKHJlZF90b19ibHVlXyksIDApOworI3VuZGVmIE1LX0NTVF8xNgorI3VuZGVmIENTVAorICBjb25zdCBfX20xMjhpIG1hc2tfYWcgPSBfbW1fc2V0MV9lcGkzMigweGZmMDBmZjAwKTsgIC8vIGFscGhhLWdyZWVuIG1hc2tzCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjW2ldKTsgLy8gYXJnYgorICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2tfYWcpOyAgICAgLy8gYSAgIDAgICBnICAgMAorICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gZzBnMAorICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tdWxoaV9lcGkxNihDLCBtdWx0c19yYik7ICAgIC8vIHggZHIgIHggZGIxCisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2FkZF9lcGk4KGluLCBEKTsgICAgICAgICAgICAgLy8geCByJyAgeCAgIGInCisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX3NsbGlfZXBpMTYoRSwgOCk7ICAgICAgICAgICAgLy8gcicgMCAgIGInIDAKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fbXVsaGlfZXBpMTYoRiwgbXVsdHNfYjIpOyAgICAvLyB4IGRiMiAgMCAgMAorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9zcmxpX2VwaTMyKEcsIDgpOyAgICAgICAgICAgIC8vIDAgIHggZGIyICAwCisgICAgY29uc3QgX19tMTI4aSBJID0gX21tX2FkZF9lcGk4KEgsIEYpOyAgICAgICAgICAgICAgLy8gcicgeCAgYicnIDAKKyAgICBjb25zdCBfX20xMjhpIEogPSBfbW1fc3JsaV9lcGkxNihJLCA4KTsgICAgICAgICAgICAvLyAwICByJyAgMCAgYicnCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fb3Jfc2kxMjgoSiwgQSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpXSwgb3V0KTsKKyAgfQorICAvLyBGYWxsLWJhY2sgdG8gQy12ZXJzaW9uIGZvciBsZWZ0LW92ZXJzLgorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DKG0sIHNyYyArIGksIG51bV9waXhlbHMgLSBpLCBkc3QgKyBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3Itc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQl9TU0UyKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gMzIpIHsKKyAgICAvLyBMb2FkIHRoZSBCR1JBIGJ1ZmZlcnMuCisgICAgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyAwKTsKKyAgICBfX20xMjhpIGluMSA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDEpOworICAgIF9fbTEyOGkgaW4yID0gX21tX2xvYWR1X3NpMTI4KGluICsgMik7CisgICAgX19tMTI4aSBpbjMgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyAzKTsKKyAgICBfX20xMjhpIGluNCA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDQpOworICAgIF9fbTEyOGkgaW41ID0gX21tX2xvYWR1X3NpMTI4KGluICsgNSk7CisgICAgX19tMTI4aSBpbjYgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyA2KTsKKyAgICBfX20xMjhpIGluNyA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDcpOworICAgIFZQOEwzMmJUb1BsYW5hcl9TU0UyKCZpbjAsICZpbjEsICZpbjIsICZpbjMpOworICAgIFZQOEwzMmJUb1BsYW5hcl9TU0UyKCZpbjQsICZpbjUsICZpbjYsICZpbjcpOworICAgIC8vIEF0IHRoaXMgcG9pbnRzLCBpbjEvaW41IGNvbnRhaW5zIHJlZCBvbmx5LCBpbjIvaW42IGdyZWVuIG9ubHkgLi4uCisgICAgLy8gUGFjayB0aGUgY29sb3JzIGluIDI0YiBSR0IuCisgICAgVlA4UGxhbmFyVG8yNGJfU1NFMigmaW4xLCAmaW41LCAmaW4yLCAmaW42LCAmaW4zLCAmaW43KTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDAsIGluMSk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAxLCBpbjUpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMiwgaW4yKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDMsIGluNik7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyA0LCBpbjMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgNSwgaW43KTsKKyAgICBpbiArPSA4OworICAgIG91dCArPSA2OworICAgIG51bV9waXhlbHMgLT0gMzI7CisgIH0KKyAgLy8gbGVmdC1vdmVycworICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBWUDhMQ29udmVydEJHUkFUb1JHQl9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsICh1aW50OF90KilvdXQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBX1NTRTIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIHJlZF9ibHVlX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMGZmdSk7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7CisgICAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsKKyAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2FuZF9zaTEyOChBMSwgcmVkX2JsdWVfbWFzayk7ICAgICAvLyBSIDAgQiAwCisgICAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV9hbmRfc2kxMjgoQTIsIHJlZF9ibHVlX21hc2spOyAgICAgLy8gUiAwIEIgMAorICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYW5kbm90X3NpMTI4KHJlZF9ibHVlX21hc2ssIEExKTsgIC8vIDAgRyAwIEEKKyAgICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FuZG5vdF9zaTEyOChyZWRfYmx1ZV9tYXNrLCBBMik7ICAvLyAwIEcgMCBBCisgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQjEsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEQyID0gX21tX3NodWZmbGVsb19lcGkxNihCMiwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEQxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgICAgY29uc3QgX19tMTI4aSBFMiA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoRDIsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEYxID0gX21tX29yX3NpMTI4KEUxLCBDMSk7CisgICAgY29uc3QgX19tMTI4aSBGMiA9IF9tbV9vcl9zaTEyOChFMiwgQzIpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0KyssIEYxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCsrLCBGMik7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0MoKGNvbnN0IHVpbnQzMl90KilpbiwgbnVtX3BpeGVscywgKHVpbnQ4X3QqKW91dCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkE0NDQ0X1NTRTIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4MGYgPSBfbW1fc2V0MV9lcGk4KDB4MGYpOworICBjb25zdCBfX20xMjhpIG1hc2tfMHhmMCA9IF9tbV9zZXQxX2VwaTgoMHhmMCk7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTAgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhMHxiZ3JhMXxiZ3JhMnxiZ3JhMworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTQgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhNHxiZ3JhNXxiZ3JhNnxiZ3JhNworICAgIGNvbnN0IF9fbTEyOGkgdjBsID0gX21tX3VucGFja2xvX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIwYjRnMGc0cjByNGEwYTQuLi4KKyAgICBjb25zdCBfX20xMjhpIHYwaCA9IF9tbV91bnBhY2toaV9lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMmI2ZzJnNnIycjZhMmE2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWwgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MGwsIHYwaCk7ICAgIC8vIGIwYjJiNGI2ZzBnMmc0ZzYuLi4KKyAgICBjb25zdCBfX20xMjhpIHYxaCA9IF9tbV91bnBhY2toaV9lcGk4KHYwbCwgdjBoKTsgICAgLy8gYjFiM2I1YjdnMWczZzVnNy4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjJsID0gX21tX3VucGFja2xvX2VwaTgodjFsLCB2MWgpOyAgICAvLyBiMC4uLmI3IHwgZzAuLi5nNworICAgIGNvbnN0IF9fbTEyOGkgdjJoID0gX21tX3VucGFja2hpX2VwaTgodjFsLCB2MWgpOyAgICAvLyByMC4uLnI3IHwgYTAuLi5hNworICAgIGNvbnN0IF9fbTEyOGkgZ2EwID0gX21tX3VucGFja2hpX2VwaTY0KHYybCwgdjJoKTsgICAvLyBnMC4uLmc3IHwgYTAuLi5hNworICAgIGNvbnN0IF9fbTEyOGkgcmIwID0gX21tX3VucGFja2xvX2VwaTY0KHYyaCwgdjJsKTsgICAvLyByMC4uLnI3IHwgYjAuLi5iNworICAgIGNvbnN0IF9fbTEyOGkgZ2ExID0gX21tX3NybGlfZXBpMTYoZ2EwLCA0KTsgICAgICAgICAvLyBnMC18ZzEtfC4uLnxhNi18YTctCisgICAgY29uc3QgX19tMTI4aSByYjEgPSBfbW1fYW5kX3NpMTI4KHJiMCwgbWFza18weGYwKTsgIC8vIC1yMHwtcjF8Li4ufC1iNnwtYTcKKyAgICBjb25zdCBfX20xMjhpIGdhMiA9IF9tbV9hbmRfc2kxMjgoZ2ExLCBtYXNrXzB4MGYpOyAgLy8gZzAtfGcxLXwuLi58YTYtfGE3LQorICAgIGNvbnN0IF9fbTEyOGkgcmdiYTAgPSBfbW1fb3Jfc2kxMjgoZ2EyLCByYjEpOyAgICAgICAvLyByZzAuLnJnNyB8IGJhMC4uYmE3CisgICAgY29uc3QgX19tMTI4aSByZ2JhMSA9IF9tbV9zcmxpX3NpMTI4KHJnYmEwLCA4KTsgICAgIC8vIGJhMC4uYmE3IHwgMAorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmdiYTEsIHJnYmEwKTsgIC8vIGJhcmcwLi4uYmFyZzcKKyNlbHNlCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmdiYTAsIHJnYmExKTsgIC8vIHJnYmEwLi4ucmdiYTcKKyNlbmRpZgorICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0KyssIHJnYmEpOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCNTY1X1NTRTIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weGUwID0gX21tX3NldDFfZXBpOCgweGUwKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZjggPSBfbW1fc2V0MV9lcGk4KDB4ZjgpOworICBjb25zdCBfX20xMjhpIG1hc2tfMHgwNyA9IF9tbV9zZXQxX2VwaTgoMHgwNyk7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTAgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhMHxiZ3JhMXxiZ3JhMnxiZ3JhMworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTQgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhNHxiZ3JhNXxiZ3JhNnxiZ3JhNworICAgIGNvbnN0IF9fbTEyOGkgdjBsID0gX21tX3VucGFja2xvX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIwYjRnMGc0cjByNGEwYTQuLi4KKyAgICBjb25zdCBfX20xMjhpIHYwaCA9IF9tbV91bnBhY2toaV9lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMmI2ZzJnNnIycjZhMmE2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWwgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MGwsIHYwaCk7ICAgICAgLy8gYjBiMmI0YjZnMGcyZzRnNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFoID0gX21tX3VucGFja2hpX2VwaTgodjBsLCB2MGgpOyAgICAgIC8vIGIxYjNiNWI3ZzFnM2c1ZzcuLi4KKyAgICBjb25zdCBfX20xMjhpIHYybCA9IF9tbV91bnBhY2tsb19lcGk4KHYxbCwgdjFoKTsgICAgICAvLyBiMC4uLmI3IHwgZzAuLi5nNworICAgIGNvbnN0IF9fbTEyOGkgdjJoID0gX21tX3VucGFja2hpX2VwaTgodjFsLCB2MWgpOyAgICAgIC8vIHIwLi4ucjcgfCBhMC4uLmE3CisgICAgY29uc3QgX19tMTI4aSBnYTAgPSBfbW1fdW5wYWNraGlfZXBpNjQodjJsLCB2MmgpOyAgICAgLy8gZzAuLi5nNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIHJiMCA9IF9tbV91bnBhY2tsb19lcGk2NCh2MmgsIHYybCk7ICAgICAvLyByMC4uLnI3IHwgYjAuLi5iNworICAgIGNvbnN0IF9fbTEyOGkgcmIxID0gX21tX2FuZF9zaTEyOChyYjAsIG1hc2tfMHhmOCk7ICAgIC8vIC1yMC4uLXI3fC1iMC4uLWI3CisgICAgY29uc3QgX19tMTI4aSBnX2xvMSA9IF9tbV9zcmxpX2VwaTE2KGdhMCwgNSk7CisgICAgY29uc3QgX19tMTI4aSBnX2xvMiA9IF9tbV9hbmRfc2kxMjgoZ19sbzEsIG1hc2tfMHgwNyk7ICAvLyBnMC0uLi5nNy18eHggKDNiKQorICAgIGNvbnN0IF9fbTEyOGkgZ19oaTEgPSBfbW1fc2xsaV9lcGkxNihnYTAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgZ19oaTIgPSBfbW1fYW5kX3NpMTI4KGdfaGkxLCBtYXNrXzB4ZTApOyAgLy8gLWcwLi4uLWc3fHh4ICgzYikKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX3NybGlfc2kxMjgocmIxLCA4KTsgICAgICAgICAgICAgIC8vIC1iMC4uLi1iN3wwCisgICAgY29uc3QgX19tMTI4aSByZzEgPSBfbW1fb3Jfc2kxMjgocmIxLCBnX2xvMik7ICAgICAgICAgICAvLyBncjAuLi5ncjd8eHgKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3NybGlfZXBpMTYoYjAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgZ2IxID0gX21tX29yX3NpMTI4KGIxLCBnX2hpMik7ICAgICAgICAgICAgLy8gYmcwLi4uYmc3fHh4CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBjb25zdCBfX20xMjhpIHJnYmEgPSBfbW1fdW5wYWNrbG9fZXBpOChnYjEsIHJnMSk7ICAgICAvLyByZ2diMC4uLnJnZ2I3CisjZWxzZQorICAgIGNvbnN0IF9fbTEyOGkgcmdiYSA9IF9tbV91bnBhY2tsb19lcGk4KHJnMSwgZ2IxKTsgICAgIC8vIGJncmIwLi4uYmdyYjcKKyNlbmRpZgorICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0KyssIHJnYmEpOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1X0MoKGNvbnN0IHVpbnQzMl90KilpbiwgbnVtX3BpeGVscywgKHVpbnQ4X3QqKW91dCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUl9TU0UyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIG1hc2tfbCA9IF9tbV9zZXRfZXBpMzIoMCwgMHgwMGZmZmZmZiwgMCwgMHgwMGZmZmZmZik7CisgIGNvbnN0IF9fbTEyOGkgbWFza19oID0gX21tX3NldF9lcGkzMigweDAwZmZmZmZmLCAwLCAweDAwZmZmZmZmLCAwKTsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBjb25zdCB1aW50OF90KiBjb25zdCBlbmQgPSBkc3QgKyBudW1fcGl4ZWxzICogMzsKKyAgLy8gdGhlIGxhc3Qgc3RvcmVsX2VwaTY0IGJlbG93IHdyaXRlcyA4IGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCAxOAorICB3aGlsZSAoZHN0ICsgMjYgPD0gZW5kKSB7CisgICAgY29uc3QgX19tMTI4aSBiZ3JhMCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmEwfGJncmExfGJncmEyfGJncmEzCisgICAgY29uc3QgX19tMTI4aSBiZ3JhNCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmE0fGJncmE1fGJncmE2fGJncmE3CisgICAgY29uc3QgX19tMTI4aSBhMGwgPSBfbW1fYW5kX3NpMTI4KGJncmEwLCBtYXNrX2wpOyAgIC8vIGJncjB8MHxiZ3IwfDAKKyAgICBjb25zdCBfX20xMjhpIGE0bCA9IF9tbV9hbmRfc2kxMjgoYmdyYTQsIG1hc2tfbCk7ICAgLy8gYmdyMHwwfGJncjB8MAorICAgIGNvbnN0IF9fbTEyOGkgYTBoID0gX21tX2FuZF9zaTEyOChiZ3JhMCwgbWFza19oKTsgICAvLyAwfGJncjB8MHxiZ3IwCisgICAgY29uc3QgX19tMTI4aSBhNGggPSBfbW1fYW5kX3NpMTI4KGJncmE0LCBtYXNrX2gpOyAgIC8vIDB8YmdyMHwwfGJncjAKKyAgICBjb25zdCBfX20xMjhpIGIwaCA9IF9tbV9zcmxpX2VwaTY0KGEwaCwgOCk7ICAgICAgICAgLy8gMDAwYnxncjAwfDAwMGJ8Z3IwMAorICAgIGNvbnN0IF9fbTEyOGkgYjRoID0gX21tX3NybGlfZXBpNjQoYTRoLCA4KTsgICAgICAgICAvLyAwMDBifGdyMDB8MDAwYnxncjAwCisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9vcl9zaTEyOChhMGwsIGIwaCk7ICAgICAgICAgIC8vIHJnYnJnYjAwfHJnYnJnYjAwCisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9vcl9zaTEyOChhNGwsIGI0aCk7ICAgICAgICAgIC8vIHJnYnJnYjAwfHJnYnJnYjAwCisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9zcmxpX3NpMTI4KGMwLCA4KTsKKyAgICBjb25zdCBfX20xMjhpIGM2ID0gX21tX3NybGlfc2kxMjgoYzQsIDgpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAgIDApLCBjMCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAgNiksIGMyKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgIDEyKSwgYzQpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAgMTgpLCBjNik7CisgICAgZHN0ICs9IDI0OworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIFZQOExDb252ZXJ0QkdSQVRvQkdSX0MoKGNvbnN0IHVpbnQzMl90KilpbiwgbnVtX3BpeGVscywgZHN0KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4TFByZWRpY3RvcnNbNV0gPSBQcmVkaWN0b3I1X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzZdID0gUHJlZGljdG9yNl9TU0UyOworICBWUDhMUHJlZGljdG9yc1s3XSA9IFByZWRpY3RvcjdfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbOF0gPSBQcmVkaWN0b3I4X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzldID0gUHJlZGljdG9yOV9TU0UyOworICBWUDhMUHJlZGljdG9yc1sxMF0gPSBQcmVkaWN0b3IxMF9TU0UyOworICBWUDhMUHJlZGljdG9yc1sxMV0gPSBQcmVkaWN0b3IxMV9TU0UyOworICBWUDhMUHJlZGljdG9yc1sxMl0gPSBQcmVkaWN0b3IxMl9TU0UyOworICBWUDhMUHJlZGljdG9yc1sxM10gPSBQcmVkaWN0b3IxM19TU0UyOworCisgIFZQOExQcmVkaWN0b3JzQWRkWzBdID0gUHJlZGljdG9yQWRkMF9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsxXSA9IFByZWRpY3RvckFkZDFfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMl0gPSBQcmVkaWN0b3JBZGQyX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzNdID0gUHJlZGljdG9yQWRkM19TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs0XSA9IFByZWRpY3RvckFkZDRfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNV0gPSBQcmVkaWN0b3JBZGQ1X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzZdID0gUHJlZGljdG9yQWRkNl9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs3XSA9IFByZWRpY3RvckFkZDdfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbOF0gPSBQcmVkaWN0b3JBZGQ4X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzldID0gUHJlZGljdG9yQWRkOV9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsxMF0gPSBQcmVkaWN0b3JBZGQxMF9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsxMV0gPSBQcmVkaWN0b3JBZGQxMV9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsxMl0gPSBQcmVkaWN0b3JBZGQxMl9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsxM10gPSBQcmVkaWN0b3JBZGQxM19TU0UyOworCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkX1NTRTI7CisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBUcmFuc2Zvcm1Db2xvckludmVyc2VfU1NFMjsKKworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IENvbnZlcnRCR1JBVG9SR0JfU1NFMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gQ29udmVydEJHUkFUb1JHQkFfU1NFMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NCA9IENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9TU0UyOworICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NSA9IENvbnZlcnRCR1JBVG9SR0I1NjVfU1NFMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBDb252ZXJ0QkdSQVRvQkdSX1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TERzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbWlwc19tYWNyby5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9taXBzX21hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhYmE5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbWlwc19tYWNyby5oCkBAIC0wLDAgKzEsMjAwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyBjb21tb24gbWFjcm9zCisKKyNpZm5kZWYgV0VCUF9EU1BfTUlQU19NQUNST19IXworI2RlZmluZSBXRUJQX0RTUF9NSVBTX01BQ1JPX0hfCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBMT0NBTF9HQ0NfVkVSU0lPTiA9PSAweDQwOQorI2RlZmluZSBXT1JLX0FST1VORF9HQ0MKKyNlbmRpZgorCisjZGVmaW5lIFNUUihzKSAjcworI2RlZmluZSBYU1RSKHMpIFNUUihzKQorCisvLyBPMFszMS4uMTYgfCAxNS4uMF0gPSBJMFszMS4uMTYgfCAxNS4uMF0gKyBJMVszMS4uMTYgfCAxNS4uMF0KKy8vIE8xWzMxLi4xNiB8IDE1Li4wXSA9IEkwWzMxLi4xNiB8IDE1Li4wXSAtIEkxWzMxLi4xNiB8IDE1Li4wXQorLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgQUREX1NVQl9IQUxWRVMoTzAsIE8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0sICAlWyIgI0kxICJdICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI0kwICJdLCAgJVsiICNJMSAiXSAgICAgICAgICAgXG5cdCIKKworLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKy8vIElbMC8xXSAtIG9mZnNldCBpbiBieXRlcworI2RlZmluZSBMT0FEX0lOX1gyKE8wLCBPMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBJMCwgSTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgICVbIiAjTzAgIl0sICAgIiAjSTAgIiglW2luXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGggICAgICAgICAgICAgICAlWyIgI08xICJdLCAgICIgI0kxICIoJVtpbl0pICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gSTAgLSBsb2NhdGlvbgorLy8gSTEuLkk5IC0gb2Zmc2V0cyBpbiBieXRlcworI2RlZmluZSBMT0FEX1dJVEhfT0ZGU0VUX1g0KE8wLCBPMSwgTzIsIE8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcsIEk4LCBJOSkgICAgICAgICAgICBcCisgICJ1bHcgICAgJVsiICNPMCAiXSwgICAgIiAjSTEgIisiIFhTVFIoSTkpICIqIiAjSTUgIiglWyIgI0kwICJdKSAgICAgICBcblx0IiAgXAorICAidWx3ICAgICVbIiAjTzEgIl0sICAgICIgI0kyICIrIiBYU1RSKEk5KSAiKiIgI0k2ICIoJVsiICNJMCAiXSkgICAgICAgXG5cdCIgIFwKKyAgInVsdyAgICAlWyIgI08yICJdLCAgICAiICNJMyAiKyIgWFNUUihJOSkgIioiICNJNyAiKCVbIiAjSTAgIl0pICAgICAgIFxuXHQiICBcCisgICJ1bHcgICAgJVsiICNPMyAiXSwgICAgIiAjSTQgIisiIFhTVFIoSTkpICIqIiAjSTggIiglWyIgI0kwICJdKSAgICAgICBcblx0IgorCisvLyBPIC0gb3V0cHV0CisvLyBJTyAtIGlucHV0L291dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgTVVMX1NISUZUX1NVTShPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNiwgTzcsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgSU8wLCBJTzEsIElPMiwgSU8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdLCAgICVba0MyXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNJMCAiXSwgICAlW2tDMV0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI08yICJdLCAgICVbIiAjSTEgIl0sICAgJVtrQzJdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPMyAiXSwgICAlWyIgI0kxICJdLCAgICVba0MxXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzQgIl0sICAgJVsiICNJMiAiXSwgICAlW2tDMl0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI081ICJdLCAgICVbIiAjSTIgIl0sICAgJVtrQzFdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPNiAiXSwgICAlWyIgI0kzICJdLCAgICVba0MyXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzcgIl0sICAgJVsiICNJMyAiXSwgICAlW2tDMV0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjTzAgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI08xICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzIgIl0sICAgJVsiICNPMiAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08zICJdLCAgICVbIiAjTzMgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPNCAiXSwgICAlWyIgI080ICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzUgIl0sICAgJVsiICNPNSAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI082ICJdLCAgICVbIiAjTzYgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPNyAiXSwgICAlWyIgI083ICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbIiAjSU8wICJdLCAgJVsiICNJTzAgIl0sICAlWyIgI0k0ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlWyIgI0lPMSAiXSwgICVbIiAjSU8xICJdLCAgJVsiICNJNSAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVsiICNJTzIgIl0sICAlWyIgI0lPMiAiXSwgICVbIiAjSTYgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbIiAjSU8zICJdLCAgJVsiICNJTzMgIl0sICAlWyIgI0k3ICJdICAgIFxuXHQiCisKKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIElOU0VSVF9IQUxGX1gyKE8wLCBPMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdLCAxNiwgICAgMTYgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNJMSAiXSwgMTYsICAgIDE2ICAgICAgICAgICBcblx0IgorCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBTUkFfMTYoTzAsIE8xLCBPMiwgTzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzAgIl0sICAlWyIgI0kwICJdLCAgMTYgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08xICJdLCAgJVsiICNJMSAiXSwgIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMiAiXSwgICVbIiAjSTIgIl0sICAxNiAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzMgIl0sICAlWyIgI0kzICJdLCAgMTYgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyB0ZW1wMFszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wOFszMS4uMTYgfCAxNS4uMF0gKyB0ZW1wMTJbMzEuLjE2IHwgMTUuLjBdCisvLyB0ZW1wMVszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wOFszMS4uMTYgfCAxNS4uMF0gLSB0ZW1wMTJbMzEuLjE2IHwgMTUuLjBdCisvLyB0ZW1wMFszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wMFszMS4uMTYgPj4gMyB8IDE1Li4wID4+IDNdCisvLyB0ZW1wMVszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wMVszMS4uMTYgPj4gMyB8IDE1Li4wID4+IDNdCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBTSElGVF9SX1NVTV9YMihPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNiwgTzcsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgICAlWyIgI0k0ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0sICAgJVsiICNJNCAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI0kxICJdLCAgICVbIiAjSTUgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNJMSAiXSwgICAlWyIgI0k1ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjSTIgIl0sICAgJVsiICNJNiAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI0kyICJdLCAgICVbIiAjSTYgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNJMyAiXSwgICAlWyIgI0k3ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjSTMgIl0sICAgJVsiICNJNyAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI08wICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNPMSAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI08yICJdLCAgICVbIiAjTzIgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPMyAiXSwgICAlWyIgI08zICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzQgIl0sICAgJVsiICNPNCAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI081ICJdLCAgICVbIiAjTzUgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPNiAiXSwgICAlWyIgI082ICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzcgIl0sICAgJVsiICNPNyAiXSwgICAzICAgICAgICAgICAgIFxuXHQiCisKKy8vIHByZWNycS5waC53IHRlbXAwLCB0ZW1wOCwgdGVtcDIKKy8vICAgdGVtcDAgPSB0ZW1wOFszMS4uMTZdIHwgdGVtcDJbMzEuLjE2XQorLy8gaW5zIHRlbXAyLCB0ZW1wOCwgMTYsIDE2CisvLyAgIHRlbXAyID0gdGVtcDhbMzEuLjE2XSB8IHRlbXAyWzE1Li4wXQorLy8gTyAtIG91dHB1dAorLy8gSU8gLSBpbnB1dC9vdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIFBBQ0tfMl9IQUxWRVNfVE9fV09SRChPMCwgTzEsIE8yLCBPMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU8wLCBJTzEsIElPMiwgSU8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnEucGgudyAgICAgICVbIiAjTzAgIl0sICAgICVbIiAjSTAgIl0sICAlWyIgI0lPMCAiXSAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICAlWyIgI08xICJdLCAgICAlWyIgI0kxICJdLCAgJVsiICNJTzEgIl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNJTzAgIl0sICAgJVsiICNJMCAiXSwgIDE2LCAgICAxNiAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjSU8xICJdLCAgICVbIiAjSTEgIl0sICAxNiwgICAgMTYgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICAlWyIgI08yICJdLCAgICAlWyIgI0kyICJdLCAgJVsiICNJTzIgIl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNycS5waC53ICAgICAgJVsiICNPMyAiXSwgICAgJVsiICNJMyAiXSwgICVbIiAjSU8zICJdICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjSU8yICJdLCAgICVbIiAjSTIgIl0sICAxNiwgICAgMTYgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI0lPMyAiXSwgICAlWyIgI0kzICJdLCAgMTYsICAgIDE2ICAgICAgICAgXG5cdCIKKworLy8gcHJlY2V1LnBoLnFiciB0ZW1wMCwgdGVtcDgKKy8vICAgdGVtcDAgPSAwIHwgMCB8IHRlbXA4WzIzLi4xNl0gfCB0ZW1wOFs3Li4wXQorLy8gcHJlY2V1LnBoLnFibCB0ZW1wMSwgdGVtcDgKKy8vICAgdGVtcDEgPSB0ZW1wOFsyMy4uMTZdIHwgdGVtcDhbNy4uMF0gfCAwIHwgMAorLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYoTzAsIE8xLCBPMiwgTzMsIE80LCBPNSwgTzYsIE83LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVsiICNPMSAiXSwgICAlWyIgI0kwICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbIiAjTzIgIl0sICAgJVsiICNJMSAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlWyIgI08zICJdLCAgICVbIiAjSTEgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVsiICNPNCAiXSwgICAlWyIgI0kyICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbIiAjTzUgIl0sICAgJVsiICNJMiAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlWyIgI082ICJdLCAgICVbIiAjSTMgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVsiICNPNyAiXSwgICAlWyIgI0kzICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIHRlbXAwWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXAwWzMxLi4xNiB8IDE1Li4wXSArIHRlbXA4WzMxLi4xNiB8IDE1Li4wXQorLy8gdGVtcDBbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDBbMzEuLjE2IDw8KHMpIDcgfCAxNS4uMCA8PChzKSA3XQorLy8gdGVtcDEuLnRlbXA3IHNhbWUgYXMgdGVtcDAKKy8vIHByZWNycXVfcy5xYi5waCB0ZW1wMCwgdGVtcDEsIHRlbXAwOgorLy8gICB0ZW1wMCA9IHRlbXAxWzMxLi4yNF0gfCB0ZW1wMVsxNS4uOF0gfCB0ZW1wMFszMS4uMjRdIHwgdGVtcDBbMTUuLjhdCisvLyBzdG9yZSB0ZW1wMCB0byBkc3QKKy8vIElPIC0gaW5wdXQvb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBTVE9SRV9TQVRfU1VNX1gyKElPMCwgSU8xLCBJTzIsIElPMywgSU80LCBJTzUsIElPNiwgSU83LCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSTgsIEk5LCBJMTAsIEkxMSwgSTEyLCBJMTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPMCAiXSwgICVbIiAjSU8wICJdLCAgJVsiICNJMCAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzEgIl0sICAlWyIgI0lPMSAiXSwgICVbIiAjSTEgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU8yICJdLCAgJVsiICNJTzIgIl0sICAlWyIgI0kyICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPMyAiXSwgICVbIiAjSU8zICJdLCAgJVsiICNJMyAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzQgIl0sICAlWyIgI0lPNCAiXSwgICVbIiAjSTQgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU81ICJdLCAgJVsiICNJTzUgIl0sICAlWyIgI0k1ICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPNiAiXSwgICVbIiAjSU82ICJdLCAgJVsiICNJNiAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzcgIl0sICAlWyIgI0lPNyAiXSwgICVbIiAjSTcgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU8wICJdLCAgJVsiICNJTzAgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPMSAiXSwgICVbIiAjSU8xICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzIgIl0sICAlWyIgI0lPMiAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU8zICJdLCAgJVsiICNJTzMgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPNCAiXSwgICVbIiAjSU80ICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzUgIl0sICAlWyIgI0lPNSAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU82ICJdLCAgJVsiICNJTzYgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPNyAiXSwgICVbIiAjSU83ICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVsiICNJTzAgIl0sICAlWyIgI0lPMSAiXSwgICVbIiAjSU8wICJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbIiAjSU8yICJdLCAgJVsiICNJTzMgIl0sICAlWyIgI0lPMiAiXSAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0lPNCAiXSwgICVbIiAjSU81ICJdLCAgJVsiICNJTzQgIl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVsiICNJTzYgIl0sICAlWyIgI0lPNyAiXSwgICVbIiAjSU82ICJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgICVbIiAjSU8wICJdLCAgIiBYU1RSKEkxMykgIioiICNJOSAiKCVbIiAjSTggIl0pICAgXG5cdCIgICAgXAorICAidXN3ICAgICAgICAgICAgICAlWyIgI0lPMiAiXSwgICIgWFNUUihJMTMpICIqIiAjSTEwICIoJVsiICNJOCAiXSkgIFxuXHQiICAgIFwKKyAgInVzdyAgICAgICAgICAgICAgJVsiICNJTzQgIl0sICAiIFhTVFIoSTEzKSAiKiIgI0kxMSAiKCVbIiAjSTggIl0pICBcblx0IiAgICBcCisgICJ1c3cgICAgICAgICAgICAgICVbIiAjSU82ICJdLCAgIiBYU1RSKEkxMykgIioiICNJMTIgIiglWyIgI0k4ICJdKSAgXG5cdCIKKworI2RlZmluZSBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzEwKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCAgICAgICAgICAgICBcCisgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksIFt0ZW1wOV0iPSZyIih0ZW1wOSksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDEwXSI9JnIiKHRlbXAxMCkKKworI2RlZmluZSBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xMCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksICAgICAgICAgXAorICBbdGVtcDE0XSI9JnIiKHRlbXAxNCksIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCAgICAgICAgIFwKKyAgW3RlbXAxN10iPSZyIih0ZW1wMTcpLCBbdGVtcDE4XSI9JnIiKHRlbXAxOCkKKworI2VuZGlmICAvLyBXRUJQX0RTUF9NSVBTX01BQ1JPX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21zYV9tYWNyby5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9tc2FfbWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmFjZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9tc2FfbWFjcm8uaApAQCAtMCwwICsxLDEzOTIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgY29tbW9uIG1hY3JvcworLy8KKy8vIEF1dGhvcihzKTogIFByYXNoYW50IFBhdGlsICAgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfTVNBX01BQ1JPX0hfCisjZGVmaW5lIFdFQlBfRFNQX01TQV9NQUNST19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bXNhLmg+CisKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyAgI2RlZmluZSBDTEFOR19CVUlMRAorI2VuZGlmCisKKyNpZmRlZiBDTEFOR19CVUlMRAorICAjZGVmaW5lIEFMUEhBVkFMICAoLTEpCisgICNkZWZpbmUgQUREVklfSChhLCBiKSAgX19tc2FfYWRkdmlfaCgodjhpMTYpYSwgYikKKyAgI2RlZmluZSBBRERWSV9XKGEsIGIpICBfX21zYV9hZGR2aV93KCh2NGkzMilhLCBiKQorICAjZGVmaW5lIFNSQUlfQihhLCBiKSAgX19tc2Ffc3JhaV9iKCh2MTZpOClhLCBiKQorICAjZGVmaW5lIFNSQUlfSChhLCBiKSAgX19tc2Ffc3JhaV9oKCh2OGkxNilhLCBiKQorICAjZGVmaW5lIFNSQUlfVyhhLCBiKSAgX19tc2Ffc3JhaV93KCh2NGkzMilhLCBiKQorICAjZGVmaW5lIFNSTElfSChhLCBiKSAgX19tc2Ffc3JsaV9oKCh2OGkxNilhLCBiKQorICAjZGVmaW5lIFNMTElfQihhLCBiKSAgX19tc2Ffc2xsaV9iKCh2NGkzMilhLCBiKQorICAjZGVmaW5lIEFORElfQihhLCBiKSAgX19tc2FfYW5kaV9iKCh2MTZ1OClhLCBiKQorICAjZGVmaW5lIE9SSV9CKGEsIGIpICAgX19tc2Ffb3JpX2IoKHYxNnU4KWEsIGIpCisjZWxzZQorICAjZGVmaW5lIEFMUEhBVkFMICAoMHhmZikKKyAgI2RlZmluZSBBRERWSV9IKGEsIGIpICAoYSArIGIpCisgICNkZWZpbmUgQUREVklfVyhhLCBiKSAgKGEgKyBiKQorICAjZGVmaW5lIFNSQUlfQihhLCBiKSAgKGEgPj4gYikKKyAgI2RlZmluZSBTUkFJX0goYSwgYikgIChhID4+IGIpCisgICNkZWZpbmUgU1JBSV9XKGEsIGIpICAoYSA+PiBiKQorICAjZGVmaW5lIFNSTElfSChhLCBiKSAgKGEgPDwgYikKKyAgI2RlZmluZSBTTExJX0IoYSwgYikgIChhIDw8IGIpCisgICNkZWZpbmUgQU5ESV9CKGEsIGIpICAoYSAmIGIpCisgICNkZWZpbmUgT1JJX0IoYSwgYikgICAoYSB8IGIpCisjZW5kaWYKKworI2RlZmluZSBMRF9CKFJUWVBFLCBwc3JjKSAqKChSVFlQRSopKHBzcmMpKQorI2RlZmluZSBMRF9VQiguLi4pIExEX0IodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQiguLi4pIExEX0IodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX0goUlRZUEUsIHBzcmMpICooKFJUWVBFKikocHNyYykpCisjZGVmaW5lIExEX1VIKC4uLikgTERfSCh2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NIKC4uLikgTERfSCh2OGkxNiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfVyhSVFlQRSwgcHNyYykgKigoUlRZUEUqKShwc3JjKSkKKyNkZWZpbmUgTERfVVcoLi4uKSBMRF9XKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU1coLi4uKSBMRF9XKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9CKFJUWVBFLCBpbiwgcGRzdCkgKigoUlRZUEUqKShwZHN0KSkgPSBpbgorI2RlZmluZSBTVF9VQiguLi4pIFNUX0IodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TQiguLi4pIFNUX0IodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX0goUlRZUEUsIGluLCBwZHN0KSAqKChSVFlQRSopKHBkc3QpKSA9IGluCisjZGVmaW5lIFNUX1VIKC4uLikgU1RfSCh2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NIKC4uLikgU1RfSCh2OGkxNiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfVyhSVFlQRSwgaW4sIHBkc3QpICooKFJUWVBFKikocGRzdCkpID0gaW4KKyNkZWZpbmUgU1RfVVcoLi4uKSBTVF9XKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1coLi4uKSBTVF9XKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBNU0FfTE9BRF9GVU5DKFRZUEUsIElOU1RSLCBGVU5DX05BTUUpICAgICAgICAgICAgIFwKKyAgc3RhdGljIGlubGluZSBUWVBFIEZVTkNfTkFNRShjb25zdCB2b2lkKiBjb25zdCBwc3JjKSB7ICBcCisgICAgY29uc3QgdWludDhfdCogY29uc3QgcHNyY19tID0gKGNvbnN0IHVpbnQ4X3QqKXBzcmM7ICAgXAorICAgIFRZUEUgdmFsX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiIiAjSU5TVFIgIiAlW3ZhbF9tXSwgJVtwc3JjX21dICBcblx0IiAgICAgICAgICAgICAgXAorICAgICAgOiBbdmFsX21dICI9ciIgKHZhbF9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3BzcmNfbV0gIm0iICgqcHNyY19tKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHZhbF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTVNBX0xPQUQocHNyYywgRlVOQ19OQU1FKSAgRlVOQ19OQU1FKHBzcmMpCisKKyNkZWZpbmUgTVNBX1NUT1JFX0ZVTkMoVFlQRSwgSU5TVFIsIEZVTkNfTkFNRSkgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBGVU5DX05BTUUoVFlQRSB2YWwsIHZvaWQqIGNvbnN0IHBkc3QpIHsgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHBkc3RfbSA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIHZhbF9tID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIiAiICNJTlNUUiAiICAlW3ZhbF9tXSwgICVbcGRzdF9tXSAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgICAgIDogW3Bkc3RfbV0gIj1tIiAoKnBkc3RfbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFt2YWxfbV0gInIiICh2YWxfbSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTVNBX1NUT1JFKHZhbCwgcGRzdCwgRlVOQ19OQU1FKSAgRlVOQ19OQU1FKHZhbCwgcGRzdCkKKworI2lmIChfX21pcHNfaXNhX3JldiA+PSA2KQorICBNU0FfTE9BRF9GVU5DKHVpbnQxNl90LCBsaCwgbXNhX2xoKTsKKyAgI2RlZmluZSBMSChwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX2xoKQorICBNU0FfTE9BRF9GVU5DKHVpbnQzMl90LCBsdywgbXNhX2x3KTsKKyAgI2RlZmluZSBMVyhwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX2x3KQorICAjaWYgKF9fbWlwcyA9PSA2NCkKKyAgICBNU0FfTE9BRF9GVU5DKHVpbnQ2NF90LCBsZCwgbXNhX2xkKTsKKyAgICAjZGVmaW5lIExEKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfbGQpCisgICNlbHNlICAvLyAhKF9fbWlwcyA9PSA2NCkKKyAgICAjZGVmaW5lIExEKHBzcmMpICAoKCgodWludDY0X3QpTVNBX0xPQUQocHNyYyArIDQsIG1zYV9sdykpIDw8IDMyKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgTVNBX0xPQUQocHNyYywgbXNhX2x3KSkKKyAgI2VuZGlmICAvLyAoX19taXBzID09IDY0KQorCisgIE1TQV9TVE9SRV9GVU5DKHVpbnQxNl90LCBzaCwgbXNhX3NoKTsKKyAgI2RlZmluZSBTSCh2YWwsIHBkc3QpICBNU0FfU1RPUkUodmFsLCBwZHN0LCBtc2Ffc2gpCisgIE1TQV9TVE9SRV9GVU5DKHVpbnQzMl90LCBzdywgbXNhX3N3KTsKKyAgI2RlZmluZSBTVyh2YWwsIHBkc3QpICBNU0FfU1RPUkUodmFsLCBwZHN0LCBtc2Ffc3cpCisgIE1TQV9TVE9SRV9GVU5DKHVpbnQ2NF90LCBzZCwgbXNhX3NkKTsKKyAgI2RlZmluZSBTRCh2YWwsIHBkc3QpICBNU0FfU1RPUkUodmFsLCBwZHN0LCBtc2Ffc2QpCisjZWxzZSAgLy8gIShfX21pcHNfaXNhX3JldiA+PSA2KQorICBNU0FfTE9BRF9GVU5DKHVpbnQxNl90LCB1bGgsIG1zYV91bGgpOworICAjZGVmaW5lIExIKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfdWxoKQorICBNU0FfTE9BRF9GVU5DKHVpbnQzMl90LCB1bHcsIG1zYV91bHcpOworICAjZGVmaW5lIExXKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfdWx3KQorICAjaWYgKF9fbWlwcyA9PSA2NCkKKyAgICBNU0FfTE9BRF9GVU5DKHVpbnQ2NF90LCB1bGQsIG1zYV91bGQpOworICAgICNkZWZpbmUgTEQocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV91bGQpCisgICNlbHNlICAvLyAhKF9fbWlwcyA9PSA2NCkKKyAgICAjZGVmaW5lIExEKHBzcmMpICAoKCgodWludDY0X3QpTVNBX0xPQUQocHNyYyArIDQsIG1zYV91bHcpKSA8PCAzMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBNU0FfTE9BRChwc3JjLCBtc2FfdWx3KSkKKyAgI2VuZGlmICAvLyAoX19taXBzID09IDY0KQorCisgIE1TQV9TVE9SRV9GVU5DKHVpbnQxNl90LCB1c2gsIG1zYV91c2gpOworICAjZGVmaW5lIFNIKHZhbCwgcGRzdCkgIE1TQV9TVE9SRSh2YWwsIHBkc3QsIG1zYV91c2gpCisgIE1TQV9TVE9SRV9GVU5DKHVpbnQzMl90LCB1c3csIG1zYV91c3cpOworICAjZGVmaW5lIFNXKHZhbCwgcGRzdCkgIE1TQV9TVE9SRSh2YWwsIHBkc3QsIG1zYV91c3cpCisgICNkZWZpbmUgU0QodmFsLCBwZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgcGRzdF9zZF9tID0gKHVpbnQ4X3QqKShwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdmFsMF9tID0gKHVpbnQzMl90KSh2YWwgJiAweDAwMDAwMDAwRkZGRkZGRkYpOyAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdmFsMV9tID0gKHVpbnQzMl90KSgodmFsID4+IDMyKSAmIDB4MDAwMDAwMDBGRkZGRkZGRik7ICBcCisgICAgU1codmFsMF9tLCBwZHN0X3NkX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1codmFsMV9tLCBwZHN0X3NkX20gKyA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgIC8vIChfX21pcHNfaXNhX3JldiA+PSA2KQorCisvKiBEZXNjcmlwdGlvbiA6IExvYWQgNCB3b3JkcyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gcHNyYywgc3RyaWRlCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzCisgKiBEZXRhaWxzICAgICA6IExvYWQgd29yZCBpbiAnb3V0MCcgZnJvbSAocHNyYykKKyAqICAgICAgICAgICAgICAgTG9hZCB3b3JkIGluICdvdXQxJyBmcm9tIChwc3JjICsgc3RyaWRlKQorICogICAgICAgICAgICAgICBMb2FkIHdvcmQgaW4gJ291dDInIGZyb20gKHBzcmMgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBMb2FkIHdvcmQgaW4gJ291dDMnIGZyb20gKHBzcmMgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIExXNChwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgY29uc3QgdWludDhfdCogcHRtcCA9IChjb25zdCB1aW50OF90Kilwc3JjOyAgICAgICAgICAgXAorICBvdXQwID0gTFcocHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IExXKHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBMVyhwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQzID0gTFcocHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIHdvcmRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IFN0b3JlIHdvcmQgZnJvbSAnaW4wJyB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgU3RvcmUgd29yZCBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSB3b3JkIGZyb20gJ2luMicgdG8gKHBkc3QgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSB3b3JkIGZyb20gJ2luMycgdG8gKHBkc3QgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIFNXNChpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50OF90KiBwdG1wID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4wLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjEsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMiwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4zLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNXMyhpbjAsIGluMSwgaW4yLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDhfdCogcHRtcCA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgXAorICBTVyhpbjAsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4xLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMiwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1cyKGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDhfdCogcHRtcCA9ICh1aW50OF90KilwZHN0OyAgICAgICAgIFwKKyAgU1coaW4wLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4xLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgNCBkb3VibGUgd29yZHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogU3RvcmUgZG91YmxlIHdvcmQgZnJvbSAnaW4wJyB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgU3RvcmUgZG91YmxlIHdvcmQgZnJvbSAnaW4xJyB0byAocGRzdCArIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgZG91YmxlIHdvcmQgZnJvbSAnaW4yJyB0byAocGRzdCArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIGRvdWJsZSB3b3JkIGZyb20gJ2luMycgdG8gKHBkc3QgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIFNENChpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50OF90KiBwdG1wID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgIFwKKyAgU0QoaW4wLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTRChpbjEsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNEKGluMiwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0QoaW4zLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IExvYWQgdmVjdG9ycyB3aXRoIDE2IGJ5dGUgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMsIHN0cmlkZQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBMb2FkIDE2IGJ5dGUgZWxlbWVudHMgaW4gJ291dDAnIGZyb20gKHBzcmMpCisgKiAgICAgICAgICAgICAgIExvYWQgMTYgYnl0ZSBlbGVtZW50cyBpbiAnb3V0MScgZnJvbSAocHNyYyArIHN0cmlkZSkKKyAqLworI2RlZmluZSBMRF9CMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBMRF9CKFJUWVBFLCBwc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IExEX0IoUlRZUEUsIHBzcmMgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVUIyKC4uLikgTERfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjIoLi4uKSBMRF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfQjMoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0MikgZG8geyAgXAorICBMRF9CMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBMRF9CKFJUWVBFLCBwc3JjICsgMiAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VCMyguLi4pIExEX0IzKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0IzKC4uLikgTERfQjModjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX0I0KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgTERfQjIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMRF9CMihSVFlQRSwgcHNyYyArIDIgKiBzdHJpZGUgLCBzdHJpZGUsIG91dDIsIG91dDMpOyAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VQjQoLi4uKSBMRF9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCNCguLi4pIExEX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9COChSVFlQRSwgcHNyYywgc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcpIGRvIHsgIFwKKyAgTERfQjQoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorICBMRF9CNChSVFlQRSwgcHNyYyArIDQgKiBzdHJpZGUsIHN0cmlkZSwgb3V0NCwgb3V0NSwgb3V0Niwgb3V0Nyk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VQjgoLi4uKSBMRF9COCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCOCguLi4pIExEX0I4KHYxNmk4LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBMb2FkIHZlY3RvcnMgd2l0aCA4IGhhbGZ3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBwc3JjLCBzdHJpZGUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogTG9hZCA4IGhhbGZ3b3JkIGVsZW1lbnRzIGluICdvdXQwJyBmcm9tIChwc3JjKQorICogICAgICAgICAgICAgICBMb2FkIDggaGFsZndvcmQgZWxlbWVudHMgaW4gJ291dDEnIGZyb20gKHBzcmMgKyBzdHJpZGUpCisgKi8KKyNkZWZpbmUgTERfSDIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gTERfSChSVFlQRSwgcHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBMRF9IKFJUWVBFLCBwc3JjICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VIMiguLi4pIExEX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0gyKC4uLikgTERfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IExvYWQgdmVjdG9ycyB3aXRoIDQgd29yZCBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gcHNyYywgc3RyaWRlCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzCisgKiBEZXRhaWxzICAgICA6IExvYWQgNCB3b3JkIGVsZW1lbnRzIGluICdvdXQwJyBmcm9tIChwc3JjICsgMCAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgTG9hZCA0IHdvcmQgZWxlbWVudHMgaW4gJ291dDEnIGZyb20gKHBzcmMgKyAxICogc3RyaWRlKQorICogICAgICAgICAgICAgICBMb2FkIDQgd29yZCBlbGVtZW50cyBpbiAnb3V0MicgZnJvbSAocHNyYyArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIExvYWQgNCB3b3JkIGVsZW1lbnRzIGluICdvdXQzJyBmcm9tIChwc3JjICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBMRF9XMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBMRF9XKFJUWVBFLCBwc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IExEX1coUlRZUEUsIHBzcmMgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVVcyKC4uLikgTERfVzIodjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TVzIoLi4uKSBMRF9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfVzMoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0MikgZG8geyAgXAorICBMRF9XMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBMRF9XKFJUWVBFLCBwc3JjICsgMiAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VXMyguLi4pIExEX1czKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU1czKC4uLikgTERfVzModjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX1c0KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgTERfVzIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMRF9XMihSVFlQRSwgcHNyYyArIDIgKiBzdHJpZGUsIHN0cmlkZSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VVzQoLi4uKSBMRF9XNCh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NXNCguLi4pIExEX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSB2ZWN0b3JzIG9mIDE2IGJ5dGUgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBTdG9yZSAxNiBieXRlIGVsZW1lbnRzIGZyb20gJ2luMCcgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgIFN0b3JlIDE2IGJ5dGUgZWxlbWVudHMgZnJvbSAnaW4xJyB0byAocGRzdCArIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVF9CMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9CKFJUWVBFLCBpbjAsIHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9CKFJUWVBFLCBpbjEsIHBkc3QgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVUIyKC4uLikgU1RfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TQjIoLi4uKSBTVF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfQjQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX0IyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9CMihSVFlQRSwgaW4yLCBpbjMsIHBkc3QgKyAyICogc3RyaWRlLCBzdHJpZGUpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VCNCguLi4pIFNUX0I0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0I0KC4uLikgU1RfQjQodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX0I4KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICAgXAorICAgICAgICAgICAgICBwZHN0LCBzdHJpZGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfQjQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgICAgICBcCisgIFNUX0I0KFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIHBkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVUI4KC4uLikgU1RfQjgodjE2dTgsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIHZlY3RvcnMgb2YgNCB3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IFN0b3JlIDQgd29yZCBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0ICsgMCAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgNCB3b3JkIGVsZW1lbnRzIGZyb20gJ2luMScgdG8gKHBkc3QgKyAxICogc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSA0IHdvcmQgZWxlbWVudHMgZnJvbSAnaW4yJyB0byAocGRzdCArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIDQgd29yZCBlbGVtZW50cyBmcm9tICdpbjMnIHRvIChwZHN0ICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVF9XMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9XKFJUWVBFLCBpbjAsIHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9XKFJUWVBFLCBpbjEsIHBkc3QgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVVcyKC4uLikgU1RfVzIodjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TVzIoLi4uKSBTVF9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfVzMoUlRZUEUsIGluMCwgaW4xLCBpbjIsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9XMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCisgIFNUX1coUlRZUEUsIGluMiwgcGRzdCArIDIgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VXMyguLi4pIFNUX1czKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1czKC4uLikgU1RfVzModjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX1c0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9XMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVzIoUlRZUEUsIGluMiwgaW4zLCBwZHN0ICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VVzQoLi4uKSBTVF9XNCh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NXNCguLi4pIFNUX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSB2ZWN0b3JzIG9mIDggaGFsZndvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBTdG9yZSA4IGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ2luMCcgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgIFN0b3JlIDggaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnaW4xJyB0byAocGRzdCArIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVF9IMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9IKFJUWVBFLCBpbjAsIHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9IKFJUWVBFLCBpbjEsIHBkc3QgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVUgyKC4uLikgU1RfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TSDIoLi4uKSBTVF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgMng0IGJ5dGUgYmxvY2sgdG8gZGVzdGluYXRpb24gbWVtb3J5IGZyb20gaW5wdXQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluLCBzdGlkeCwgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IEluZGV4ICdzdGlkeCcgaGFsZndvcmQgZWxlbWVudCBmcm9tICdpbicgdmVjdG9yIGlzIGNvcGllZCB0bworICogICAgICAgICAgICAgICB0aGUgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgSW5kZXggJ3N0aWR4KzEnIGhhbGZ3b3JkIGVsZW1lbnQgZnJvbSAnaW4nIHZlY3RvciBpcyBjb3BpZWQgdG8KKyAqICAgICAgICAgICAgICAgdGhlIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIEluZGV4ICdzdGlkeCsyJyBoYWxmd29yZCBlbGVtZW50IGZyb20gJ2luJyB2ZWN0b3IgaXMgY29waWVkIHRvCisgKiAgICAgICAgICAgICAgIHRoZSBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgSW5kZXggJ3N0aWR4KzMnIGhhbGZ3b3JkIGVsZW1lbnQgZnJvbSAnaW4nIHZlY3RvciBpcyBjb3BpZWQgdG8KKyAqICAgICAgICAgICAgICAgdGhlIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIFNUMng0X1VCKGluLCBzdGlkeCwgcGRzdCwgc3RyaWRlKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCogcGJsa18yeDRfbSA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZfdCBvdXQwX20gPSBfX21zYV9jb3B5X3NfaCgodjhpMTYpaW4sIHN0aWR4KTsgICAgICBcCisgIGNvbnN0IHVpbnQxNl90IG91dDFfbSA9IF9fbXNhX2NvcHlfc19oKCh2OGkxNilpbiwgc3RpZHggKyAxKTsgIFwKKyAgY29uc3QgdWludDE2X3Qgb3V0Ml9tID0gX19tc2FfY29weV9zX2goKHY4aTE2KWluLCBzdGlkeCArIDIpOyAgXAorICBjb25zdCB1aW50MTZfdCBvdXQzX20gPSBfX21zYV9jb3B5X3NfaCgodjhpMTYpaW4sIHN0aWR4ICsgMyk7ICBcCisgIFNIKG91dDBfbSwgcGJsa18yeDRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGJsa18yeDRfbSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTSChvdXQxX20sIHBibGtfMng0X20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBibGtfMng0X20gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0gob3V0Ml9tLCBwYmxrXzJ4NF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwYmxrXzJ4NF9tICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNIKG91dDNfbSwgcGJsa18yeDRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgNHg0IGJ5dGUgYmxvY2sgdG8gZGVzdGluYXRpb24gbWVtb3J5IGZyb20gaW5wdXQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogJ0lkeDAnIHdvcmQgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciAnaW4wJyBpcyBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgICdJZHgxJyB3b3JkIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luMCcgaXMgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgc3RyaWRlKQorICogICAgICAgICAgICAgICAnSWR4Micgd29yZCBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yICdpbjAnIGlzIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgICdJZHgzJyB3b3JkIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luMCcgaXMgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVDR4NF9VQihpbjAsIGluMSwgaWR4MCwgaWR4MSwgaWR4MiwgaWR4MywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQ4X3QqIGNvbnN0IHBibGtfNHg0X20gPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3Qgb3V0MF9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKWluMCwgaWR4MCk7ICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCBvdXQxX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpaW4wLCBpZHgxKTsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IG91dDJfbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilpbjEsIGlkeDIpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3Qgb3V0M19tID0gX19tc2FfY29weV9zX3coKHY0aTMyKWluMSwgaWR4Myk7ICAgICAgICAgICAgXAorICBTVzQob3V0MF9tLCBvdXQxX20sIG91dDJfbSwgb3V0M19tLCBwYmxrXzR4NF9tLCBzdHJpZGUpOyAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUNHg4X1VCKGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHBibGtfNHg4ID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUNHg0X1VCKGluMCwgaW4wLCAwLCAxLCAyLCAzLCBwYmxrXzR4OCwgc3RyaWRlKTsgICAgICAgICAgICAgICBcCisgIFNUNHg0X1VCKGluMSwgaW4xLCAwLCAxLCAyLCAzLCBwYmxrXzR4OCArIDQgKiBzdHJpZGUsIHN0cmlkZSk7ICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IEltbWVkaWF0ZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2xpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzbGlkZV92YWwKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dAorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBCeXRlIGVsZW1lbnRzIGZyb20gJ2luMScgdmVjdG9yIGFyZSBzbGlkIGludG8gJ2luMCcgYnkKKyAqICAgICAgICAgICAgICAgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSAnc2xpZGVfdmFsJworICovCisjZGVmaW5lIFNMRElfQihSVFlQRSwgaW4wLCBpbjEsIHNsaWRlX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoUlRZUEUpX19tc2Ffc2xkaV9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEsIHNsaWRlX3ZhbCkgIFwKKworI2RlZmluZSBTTERJX1VCKC4uLikgU0xESV9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU0xESV9TQiguLi4pIFNMRElfQih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNMRElfU0goLi4uKSBTTERJX0IodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFNodWZmbGUgYnl0ZSB2ZWN0b3IgZWxlbWVudHMgYXMgcGVyIG1hc2sgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIG1hc2swLCBtYXNrMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBCeXRlIGVsZW1lbnRzIGZyb20gJ2luMCcgJiAnaW4xJyBhcmUgY29waWVkIHNlbGVjdGl2ZWx5IHRvCisgKiAgICAgICAgICAgICAgICdvdXQwJyBhcyBwZXIgY29udHJvbCB2ZWN0b3IgJ21hc2swJworICovCisjZGVmaW5lIFZTSEZfQihSVFlQRSwgaW4wLCBpbjEsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoUlRZUEUpX19tc2FfdnNoZl9iKCh2MTZpOCltYXNrLCAodjE2aTgpaW4xLCAodjE2aTgpaW4wKQorCisjZGVmaW5lIFZTSEZfVUIoLi4uKSBWU0hGX0IodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX1NCKC4uLikgVlNIRl9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9VSCguLi4pIFZTSEZfQih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfU0goLi4uKSBWU0hGX0IodjhpMTYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFZTSEZfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgbWFzazAsIG1hc2sxLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBWU0hGX0IoUlRZUEUsIGluMCwgaW4xLCBtYXNrMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBWU0hGX0IoUlRZUEUsIGluMiwgaW4zLCBtYXNrMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBWU0hGX0IyX1VCKC4uLikgVlNIRl9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfQjJfU0IoLi4uKSBWU0hGX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9CMl9VSCguLi4pIFZTSEZfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX0IyX1NIKC4uLikgVlNIRl9CMih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU2h1ZmZsZSBoYWxmd29yZCB2ZWN0b3IgZWxlbWVudHMgYXMgcGVyIG1hc2sgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIG1hc2swLCBtYXNrMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdpbjAnICYgJ2luMScgYXJlIGNvcGllZCBzZWxlY3RpdmVseSB0bworICogICAgICAgICAgICAgICAnb3V0MCcgYXMgcGVyIGNvbnRyb2wgdmVjdG9yICdtYXNrMCcKKyAqLworI2RlZmluZSBWU0hGX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG1hc2swLCBtYXNrMSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX3ZzaGZfaCgodjhpMTYpbWFzazAsICh2OGkxNilpbjEsICh2OGkxNilpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX3ZzaGZfaCgodjhpMTYpbWFzazEsICh2OGkxNilpbjMsICh2OGkxNilpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVlNIRl9IMl9VSCguLi4pIFZTSEZfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX0gyX1NIKC4uLikgVlNIRl9IMih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogRG90IHByb2R1Y3Qgb2YgYnl0ZSB2ZWN0b3IgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gJ211bHQwJyBhcmUgbXVsdGlwbGllZCB3aXRoCisgKiAgICAgICAgICAgICAgIHNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gJ2Nuc3QwJyBwcm9kdWNpbmcgYSByZXN1bHQKKyAqICAgICAgICAgICAgICAgdHdpY2UgdGhlIHNpemUgb2YgaW5wdXQgaS5lLiBzaWduZWQgaGFsZndvcmQuCisgKiAgICAgICAgICAgICAgIFRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgb2YgYWRqYWNlbnQgb2RkLWV2ZW4gZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgYXJlIGFkZGVkIHRvZ2V0aGVyIGFuZCB3cml0dGVuIHRvIHRoZSAnb3V0MCcgdmVjdG9yCisqLworI2RlZmluZSBET1RQX1NCMihSVFlQRSwgbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9kb3RwX3NfaCgodjE2aTgpbXVsdDAsICh2MTZpOCljbnN0MCk7ICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfZG90cF9zX2goKHYxNmk4KW11bHQxLCAodjE2aTgpY25zdDEpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRE9UUF9TQjJfU0goLi4uKSBET1RQX1NCMih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogRG90IHByb2R1Y3Qgb2YgaGFsZndvcmQgdmVjdG9yIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBTaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnbXVsdDAnIGFyZSBtdWx0aXBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ2Nuc3QwJyBwcm9kdWNpbmcgYSByZXN1bHQKKyAqICAgICAgICAgICAgICAgdHdpY2UgdGhlIHNpemUgb2YgaW5wdXQgaS5lLiBzaWduZWQgd29yZC4KKyAqICAgICAgICAgICAgICAgVGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiBhZGphY2VudCBvZGQtZXZlbiBlbGVtZW50cworICogICAgICAgICAgICAgICBhcmUgYWRkZWQgdG9nZXRoZXIgYW5kIHdyaXR0ZW4gdG8gdGhlICdvdXQwJyB2ZWN0b3IKKyAqLworI2RlZmluZSBET1RQX1NIMihSVFlQRSwgbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9kb3RwX3NfdygodjhpMTYpbXVsdDAsICh2OGkxNiljbnN0MCk7ICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfZG90cF9zX3coKHY4aTE2KW11bHQxLCAodjhpMTYpY25zdDEpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRE9UUF9TSDJfU1coLi4uKSBET1RQX1NIMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogRG90IHByb2R1Y3Qgb2YgdW5zaWduZWQgd29yZCB2ZWN0b3IgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFVuc2lnbmVkIHdvcmQgZWxlbWVudHMgZnJvbSAnbXVsdDAnIGFyZSBtdWx0aXBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgdW5zaWduZWQgd29yZCBlbGVtZW50cyBmcm9tICdjbnN0MCcgcHJvZHVjaW5nIGEgcmVzdWx0CisgKiAgICAgICAgICAgICAgIHR3aWNlIHRoZSBzaXplIG9mIGlucHV0IGkuZS4gdW5zaWduZWQgZG91YmxlIHdvcmQuCisgKiAgICAgICAgICAgICAgIFRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgb2YgYWRqYWNlbnQgb2RkLWV2ZW4gZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgYXJlIGFkZGVkIHRvZ2V0aGVyIGFuZCB3cml0dGVuIHRvIHRoZSAnb3V0MCcgdmVjdG9yCisgKi8KKyNkZWZpbmUgRE9UUF9VVzIoUlRZUEUsIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfZG90cF91X2QoKHY0dTMyKW11bHQwLCAodjR1MzIpY25zdDApOyAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2RvdHBfdV9kKCh2NHUzMiltdWx0MSwgKHY0dTMyKWNuc3QxKTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIERPVFBfVVcyX1VEKC4uLikgRE9UUF9VVzIodjJ1NjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IERvdCBwcm9kdWN0ICYgYWRkaXRpb24gb2YgaGFsZndvcmQgdmVjdG9yIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBTaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnbXVsdDAnIGFyZSBtdWx0aXBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ2Nuc3QwJyBwcm9kdWNpbmcgYSByZXN1bHQKKyAqICAgICAgICAgICAgICAgdHdpY2UgdGhlIHNpemUgb2YgaW5wdXQgaS5lLiBzaWduZWQgd29yZC4KKyAqICAgICAgICAgICAgICAgVGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiBhZGphY2VudCBvZGQtZXZlbiBlbGVtZW50cworICogICAgICAgICAgICAgICBhcmUgYWRkZWQgdG8gdGhlICdvdXQwJyB2ZWN0b3IKKyAqLworI2RlZmluZSBEUEFERF9TSDIoUlRZUEUsIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxLCBvdXQwLCBvdXQxKSBkbyB7ICAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2RwYWRkX3NfdygodjRpMzIpb3V0MCwgKHY4aTE2KW11bHQwLCAodjhpMTYpY25zdDApOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2RwYWRkX3NfdygodjRpMzIpb3V0MSwgKHY4aTE2KW11bHQxLCAodjhpMTYpY25zdDEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRFBBRERfU0gyX1NXKC4uLikgRFBBRERfU0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBDbGlwcyBhbGwgc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvcgorICogICAgICAgICAgICAgICBiZXR3ZWVuIDAgJiAyNTUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQvb3V0cHV0ICAtIHZhbAorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCBoYWxmd29yZAorICovCisjZGVmaW5lIENMSVBfU0hfMF8yNTUodmFsKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgbWF4X20gPSBfX21zYV9sZGlfaCgyNTUpOyAgICAgICAgICAgXAorICB2YWwgPSBfX21zYV9tYXhpX3NfaCgodjhpMTYpdmFsLCAwKTsgICAgICAgICAgICBcCisgIHZhbCA9IF9fbXNhX21pbl9zX2gobWF4X20sICh2OGkxNil2YWwpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9TSDJfMF8yNTUoaW4wLCBpbjEpIGRvIHsgIFwKKyAgQ0xJUF9TSF8wXzI1NShpbjApOyAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSF8wXzI1NShpbjEpOyAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9TSDRfMF8yNTUoaW4wLCBpbjEsIGluMiwgaW4zKSBkbyB7ICBcCisgIENMSVBfU0gyXzBfMjU1KGluMCwgaW4xKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIMl8wXzI1NShpbjIsIGluMyk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogQ2xpcHMgYWxsIHVuc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvcgorICogICAgICAgICAgICAgICBiZXR3ZWVuIDAgJiAyNTUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgIC0gaW4KKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gb3V0X20KKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBoYWxmd29yZAorICovCisjZGVmaW5lIENMSVBfVUhfMF8yNTUoaW4pIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3Qgdjh1MTYgbWF4X20gPSAodjh1MTYpX19tc2FfbGRpX2goMjU1KTsgICAgXAorICBpbiA9IF9fbXNhX21heGlfdV9oKCh2OHUxNikgaW4sIDApOyAgICAgICAgICAgICBcCisgIGluID0gX19tc2FfbWluX3VfaCgodjh1MTYpIG1heF9tLCAodjh1MTYpIGluKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9VSDJfMF8yNTUoaW4wLCBpbjEpIGRvIHsgIFwKKyAgQ0xJUF9VSF8wXzI1NShpbjApOyAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9VSF8wXzI1NShpbjEpOyAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogQ2xpcHMgYWxsIHNpZ25lZCB3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvcgorICogICAgICAgICAgICAgICBiZXR3ZWVuIDAgJiAyNTUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQvb3V0cHV0ICAtIHZhbAorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkCisgKi8KKyNkZWZpbmUgQ0xJUF9TV18wXzI1NSh2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBtYXhfbSA9IF9fbXNhX2xkaV93KDI1NSk7ICAgICAgICAgICBcCisgIHZhbCA9IF9fbXNhX21heGlfc193KCh2NGkzMil2YWwsIDApOyAgICAgICAgICAgIFwKKyAgdmFsID0gX19tc2FfbWluX3NfdyhtYXhfbSwgKHY0aTMyKXZhbCk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1NXNF8wXzI1NShpbjAsIGluMSwgaW4yLCBpbjMpIGRvIHsgICBcCisgIENMSVBfU1dfMF8yNTUoaW4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TV18wXzI1NShpbjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NXXzBfMjU1KGluMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU1dfMF8yNTUoaW4zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogSG9yaXpvbnRhbCBhZGRpdGlvbiBvZiA0IHNpZ25lZCB3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbiAgICAgICAoc2lnbmVkIHdvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBPdXRwdXQgLSBzdW1fbSAgICAoaTMyIHN1bSkKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZCAoR1ApCisgKiBEZXRhaWxzICAgICA6IDQgc2lnbmVkIHdvcmQgZWxlbWVudHMgb2YgJ2luJyB2ZWN0b3IgYXJlIGFkZGVkIHRvZ2V0aGVyIGFuZAorICogICAgICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGludGVnZXIgc3VtIGlzIHJldHVybmVkCisgKi8KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQzMl90IGZ1bmNfaGFkZF9zd19zMzIodjRpMzIgaW4pIHsKKyAgY29uc3QgdjJpNjQgcmVzMF9tID0gX19tc2FfaGFkZF9zX2QoKHY0aTMyKWluLCAodjRpMzIpaW4pOworICBjb25zdCB2Mmk2NCByZXMxX20gPSBfX21zYV9zcGxhdGlfZChyZXMwX20sIDEpOworICBjb25zdCB2Mmk2NCBvdXQgPSByZXMwX20gKyByZXMxX207CisgIGludDMyX3Qgc3VtX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpb3V0LCAwKTsKKyAgcmV0dXJuIHN1bV9tOworfQorI2RlZmluZSBIQUREX1NXX1MzMihpbikgZnVuY19oYWRkX3N3X3MzMihpbikKKworLyogRGVzY3JpcHRpb24gOiBIb3Jpem9udGFsIGFkZGl0aW9uIG9mIDggc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0ICAtIGluICAgICAgIChzaWduZWQgaGFsZndvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBPdXRwdXQgLSBzdW1fbSAgICAoczMyIHN1bSkKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZAorICogRGV0YWlscyAgICAgOiA4IHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IgYXJlIGFkZGVkCisgKiAgICAgICAgICAgICAgIHRvZ2V0aGVyIGFuZCB0aGUgcmVzdWx0aW5nIGludGVnZXIgc3VtIGlzIHJldHVybmVkCisgKi8KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQzMl90IGZ1bmNfaGFkZF9zaF9zMzIodjhpMTYgaW4pIHsKKyAgY29uc3QgdjRpMzIgcmVzID0gX19tc2FfaGFkZF9zX3coaW4sIGluKTsKKyAgY29uc3QgdjJpNjQgcmVzMCA9IF9fbXNhX2hhZGRfc19kKHJlcywgcmVzKTsKKyAgY29uc3QgdjJpNjQgcmVzMSA9IF9fbXNhX3NwbGF0aV9kKHJlczAsIDEpOworICBjb25zdCB2Mmk2NCByZXMyID0gcmVzMCArIHJlczE7CisgIGNvbnN0IGludDMyX3Qgc3VtX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpcmVzMiwgMCk7CisgIHJldHVybiBzdW1fbTsKK30KKyNkZWZpbmUgSEFERF9TSF9TMzIoaW4pIGZ1bmNfaGFkZF9zaF9zMzIoaW4pCisKKy8qIERlc2NyaXB0aW9uIDogSG9yaXpvbnRhbCBhZGRpdGlvbiBvZiA4IHVuc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0ICAtIGluICAgICAgICh1bnNpZ25lZCBoYWxmd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIHN1bV9tICAgICh1MzIgc3VtKQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIHdvcmQKKyAqIERldGFpbHMgICAgIDogOCB1bnNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IgYXJlIGFkZGVkCisgKiAgICAgICAgICAgICAgIHRvZ2V0aGVyIGFuZCB0aGUgcmVzdWx0aW5nIGludGVnZXIgc3VtIGlzIHJldHVybmVkCisgKi8KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBmdW5jX2hhZGRfdWhfdTMyKHY4dTE2IGluKSB7CisgIHVpbnQzMl90IHN1bV9tOworICBjb25zdCB2NHUzMiByZXNfbSA9IF9fbXNhX2hhZGRfdV93KGluLCBpbik7CisgIHYydTY0IHJlczBfbSA9IF9fbXNhX2hhZGRfdV9kKHJlc19tLCByZXNfbSk7CisgIHYydTY0IHJlczFfbSA9ICh2MnU2NClfX21zYV9zcGxhdGlfZCgodjJpNjQpcmVzMF9tLCAxKTsKKyAgcmVzMF9tID0gcmVzMF9tICsgcmVzMV9tOworICBzdW1fbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilyZXMwX20sIDApOworICByZXR1cm4gc3VtX207Cit9CisjZGVmaW5lIEhBRERfVUhfVTMyKGluKSBmdW5jX2hhZGRfdWhfdTMyKGluKQorCisvKiBEZXNjcmlwdGlvbiA6IEhvcml6b250YWwgYWRkaXRpb24gb2Ygc2lnbmVkIGhhbGYgd29yZCB2ZWN0b3IgZWxlbWVudHMKKyAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xCisgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgICBEZXRhaWxzICAgICA6IEVhY2ggc2lnbmVkIG9kZCBoYWxmIHdvcmQgZWxlbWVudCBmcm9tICdpbjAnIGlzIGFkZGVkIHRvCisgICAgICAgICAgICAgICAgIGV2ZW4gc2lnbmVkIGhhbGYgd29yZCBlbGVtZW50IGZyb20gJ2luMCcgKHBhaXJ3aXNlKSBhbmQgdGhlCisgICAgICAgICAgICAgICAgIGhhbGZ3b3JkIHJlc3VsdCBpcyB3cml0dGVuIGluICdvdXQwJworKi8KKyNkZWZpbmUgSEFERF9TSDIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICAgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9oYWRkX3NfdygodjhpMTYpaW4wLCAodjhpMTYpaW4wKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9oYWRkX3NfdygodjhpMTYpaW4xLCAodjhpMTYpaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhBRERfU0gyX1NXKC4uLikgSEFERF9TSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEhBRERfU0g0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgSEFERF9TSDIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQUREX1NIMihSVFlQRSwgaW4yLCBpbjMsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIQUREX1NINF9TVyguLi4pIEhBRERfU0g0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBIb3Jpem9udGFsIHN1YnRyYWN0aW9uIG9mIHVuc2lnbmVkIGJ5dGUgdmVjdG9yIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIHVuc2lnbmVkIG9kZCBieXRlIGVsZW1lbnQgZnJvbSAnaW4wJyBpcyBzdWJ0cmFjdGVkIGZyb20KKyAqICAgICAgICAgICAgICAgZXZlbiB1bnNpZ25lZCBieXRlIGVsZW1lbnQgZnJvbSAnaW4wJyAocGFpcndpc2UpIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgaGFsZndvcmQgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSFNVQl9VQjIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICAgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9oc3ViX3VfaCgodjE2dTgpaW4wLCAodjE2dTgpaW4wKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9oc3ViX3VfaCgodjE2dTgpaW4xLCAodjE2dTgpaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhTVUJfVUIyX1VIKC4uLikgSFNVQl9VQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBIU1VCX1VCMl9TSCguLi4pIEhTVUJfVUIyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSFNVQl9VQjJfU1coLi4uKSBIU1VCX1VCMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU2V0IGVsZW1lbnQgbiBpbnB1dCB2ZWN0b3IgdG8gR1BSIHZhbHVlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXQgLSBvdXQKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogU2V0IGVsZW1lbnQgMCBpbiB2ZWN0b3IgJ291dCcgdG8gdmFsdWUgc3BlY2lmaWVkIGluICdpbjAnCisgKi8KKyNkZWZpbmUgSU5TRVJUX1cyKFJUWVBFLCBpbjAsIGluMSwgb3V0KSBkbyB7ICAgICAgICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAwLCBpbjApOyAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMSwgaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElOU0VSVF9XMl9VQiguLi4pIElOU0VSVF9XMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElOU0VSVF9XMl9TQiguLi4pIElOU0VSVF9XMih2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSU5TRVJUX1c0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dCkgZG8geyAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMCwgaW4wKTsgICAgICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAxLCBpbjEpOyAgICAgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDIsIGluMik7ICAgICAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMywgaW4zKTsgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTlNFUlRfVzRfVUIoLi4uKSBJTlNFUlRfVzQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTlNFUlRfVzRfU0IoLi4uKSBJTlNFUlRfVzQodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTlNFUlRfVzRfU1coLi4uKSBJTlNFUlRfVzQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFNldCBlbGVtZW50IG4gb2YgZG91YmxlIHdvcmQgaW5wdXQgdmVjdG9yIHRvIEdQUiB2YWx1ZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMQorICogICAgICAgICAgICAgICBPdXRwdXQgLSBvdXQKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogU2V0IGVsZW1lbnQgMCBpbiB2ZWN0b3IgJ291dCcgdG8gR1BSIHZhbHVlIHNwZWNpZmllZCBpbiAnaW4wJworICogICAgICAgICAgICAgICBTZXQgZWxlbWVudCAxIGluIHZlY3RvciAnb3V0JyB0byBHUFIgdmFsdWUgc3BlY2lmaWVkIGluICdpbjEnCisgKi8KKyNkZWZpbmUgSU5TRVJUX0QyKFJUWVBFLCBpbjAsIGluMSwgb3V0KSBkbyB7ICAgICAgICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfZCgodjJpNjQpb3V0LCAwLCBpbjApOyAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X2QoKHYyaTY0KW91dCwgMSwgaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElOU0VSVF9EMl9VQiguLi4pIElOU0VSVF9EMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElOU0VSVF9EMl9TQiguLi4pIElOU0VSVF9EMih2MTZpOCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuIGJ5dGUgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiBieXRlIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWRVZfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X2IoKHYxNmk4KWluMSwgKHYxNmk4KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2ZXZfYigodjE2aTgpaW4zLCAodjE2aTgpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWX0IyX1VCKC4uLikgSUxWRVZfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9CMl9TQiguLi4pIElMVkVWX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfQjJfVUgoLi4uKSBJTFZFVl9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0IyX1NIKC4uLikgSUxWRVZfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9CMl9TRCguLi4pIElMVkVWX0IyKHYyaTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIG9kZCBieXRlIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IE9kZCBieXRlIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWT0RfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdm9kX2IoKHYxNmk4KWluMSwgKHYxNmk4KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2b2RfYigodjE2aTgpaW4zLCAodjE2aTgpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVk9EX0IyX1VCKC4uLikgSUxWT0RfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9CMl9TQiguLi4pIElMVk9EX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfQjJfVUgoLi4uKSBJTFZPRF9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0IyX1NIKC4uLikgSUxWT0RfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9CMl9TRCguLi4pIElMVk9EX0IyKHYyaTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4gaGFsZndvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVkVWX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl9oKCh2OGkxNilpbjEsICh2OGkxNilpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmV2X2goKHY4aTE2KWluMywgKHY4aTE2KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVl9IMl9VQiguLi4pIElMVkVWX0gyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfSDJfVUgoLi4uKSBJTFZFVl9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0gyX1NIKC4uLikgSUxWRVZfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9IMl9TVyguLi4pIElMVkVWX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIG9kZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBPZGQgaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZPRF9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2b2RfaCgodjhpMTYpaW4xLCAodjhpMTYpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZvZF9oKCh2OGkxNilpbjMsICh2OGkxNilpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWT0RfSDJfVUIoLi4uKSBJTFZPRF9IMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0gyX1VIKC4uLikgSUxWT0RfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9IMl9TSCguLi4pIElMVk9EX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfSDJfU1coLi4uKSBJTFZPRF9IMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuIHdvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiB3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWRVZfVzIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X3coKHY0aTMyKWluMSwgKHY0aTMyKWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2ZXZfdygodjRpMzIpaW4zLCAodjRpMzIpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWX1cyX1VCKC4uLikgSUxWRVZfVzIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9XMl9TQiguLi4pIElMVkVWX1cyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfVzJfVUgoLi4uKSBJTFZFVl9XMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX1cyX1NEKC4uLikgSUxWRVZfVzIodjJpNjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbi1vZGQgd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIHdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqICAgICAgICAgICAgICAgT2RkIHdvcmQgZWxlbWVudHMgb2YgJ2luMicgYW5kICdpbjMnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MScKKyAqLworI2RlZmluZSBJTFZFVk9EX1cyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl93KCh2NGkzMilpbjEsICh2NGkzMilpbjApOyAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2b2RfdygodjRpMzIpaW4zLCAodjRpMzIpaW4yKTsgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZPRF9XMl9VQiguLi4pIElMVkVWT0RfVzIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX1cyX1VIKC4uLikgSUxWRVZPRF9XMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfVzJfU0goLi4uKSBJTFZFVk9EX1cyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9XMl9TVyguLi4pIElMVkVWT0RfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbi1vZGQgaGFsZi13b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gaGFsZi13b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKiAgICAgICAgICAgICAgIE9kZCBoYWxmLXdvcmQgZWxlbWVudHMgb2YgJ2luMicgYW5kICdpbjMnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MScKKyAqLworI2RlZmluZSBJTFZFVk9EX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl9oKCh2OGkxNilpbjEsICh2OGkxNilpbjApOyAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2b2RfaCgodjhpMTYpaW4zLCAodjhpMTYpaW4yKTsgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZPRF9IMl9VQiguLi4pIElMVkVWT0RfSDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX0gyX1VIKC4uLikgSUxWRVZPRF9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfSDJfU0goLi4uKSBJTFZFVk9EX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9IMl9TVyguLi4pIElMVkVWT0RfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbiBkb3VibGUgd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIGRvdWJsZSB3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWRVZfRDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X2QoKHYyaTY0KWluMSwgKHYyaTY0KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2ZXZfZCgodjJpNjQpaW4zLCAodjJpNjQpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWX0QyX1VCKC4uLikgSUxWRVZfRDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9EMl9TQiguLi4pIElMVkVWX0QyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfRDJfU1coLi4uKSBJTFZFVl9EMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0QyX1NEKC4uLikgSUxWRVZfRDIodjJpNjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgbGVmdCBoYWxmIG9mIGJ5dGUgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogTGVmdCBoYWxmIG9mIGJ5dGUgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgSUxWTF9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2bF9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmxfYigodjE2aTgpaW4yLCAodjE2aTgpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkxfQjJfVUIoLi4uKSBJTFZMX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWTF9CMl9TQiguLi4pIElMVkxfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZMX0IyX1VIKC4uLikgSUxWTF9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkxfQjJfU0goLi4uKSBJTFZMX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWTF9CMl9TVyguLi4pIElMVkxfQjIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgcmlnaHQgaGFsZiBvZiBieXRlIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFJpZ2h0IGhhbGYgb2YgYnl0ZSBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvIG91dDAuCisgKi8KKyNkZWZpbmUgSUxWUl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdnJfYigodjE2aTgpaW4yLCAodjE2aTgpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfQjJfVUIoLi4uKSBJTFZSX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CMl9TQiguLi4pIElMVlJfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0IyX1VIKC4uLikgSUxWUl9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjJfU0goLi4uKSBJTFZSX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CMl9TVyguLi4pIElMVlJfQjIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElMVlJfQjQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIElMVlJfQjIoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9CNF9VQiguLi4pIElMVlJfQjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0I0X1NCKC4uLikgSUxWUl9CNCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjRfVUgoLi4uKSBJTFZSX0I0KHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CNF9TSCguLi4pIElMVlJfQjQodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0I0X1NXKC4uLikgSUxWUl9CNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSByaWdodCBoYWxmIG9mIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFJpZ2h0IGhhbGYgb2YgaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZQorICogICAgICAgICAgICAgICBpbnRlcmxlYXZlZCBhbmQgd3JpdHRlbiB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgSUxWUl9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9oKCh2OGkxNilpbjAsICh2OGkxNilpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdnJfaCgodjhpMTYpaW4yLCAodjhpMTYpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfSDJfVUIoLi4uKSBJTFZSX0gyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9IMl9TSCguLi4pIElMVlJfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0gyX1NXKC4uLikgSUxWUl9IMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSUxWUl9INChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgSUxWUl9IMihSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0g0X1VCKC4uLikgSUxWUl9INCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfSDRfU0goLi4uKSBJTFZSX0g0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9INF9TVyguLi4pIElMVlJfSDQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgcmlnaHQgaGFsZiBvZiBkb3VibGUgd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGRvdWJsZSB3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUKKyAqICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgYW5kIHdyaXR0ZW4gdG8gJ291dDAnLgorICovCisjZGVmaW5lIElMVlJfRDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfZCgodjJpNjQpaW4wLCAodjJpNjQpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZyX2QoKHYyaTY0KWluMiwgKHYyaTY0KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0QyX1VCKC4uLikgSUxWUl9EMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfRDJfU0IoLi4uKSBJTFZSX0QyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9EMl9TSCguLi4pIElMVlJfRDIodjhpMTYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElMVlJfRDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUl9EMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIElMVlJfRDIoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9ENF9TQiguLi4pIElMVlJfRDQodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0Q0X1VCKC4uLikgSUxWUl9ENCh2MTZ1OCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBib3RoIGxlZnQgYW5kIHJpZ2h0IGhhbGYgb2YgaW5wdXQgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogUmlnaHQgaGFsZiBvZiBieXRlIGVsZW1lbnRzIGZyb20gJ2luMCcgYW5kICdpbjEnIGFyZQorICogICAgICAgICAgICAgICBpbnRlcmxlYXZlZCBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZSTF9CMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2bF9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUkxfQjJfVUIoLi4uKSBJTFZSTF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0IyX1NCKC4uLikgSUxWUkxfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9CMl9VSCguLi4pIElMVlJMX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfQjJfU0goLi4uKSBJTFZSTF9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0IyX1NXKC4uLikgSUxWUkxfQjIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElMVlJMX0gyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfaCgodjhpMTYpaW4wLCAodjhpMTYpaW4xKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZsX2goKHY4aTE2KWluMCwgKHY4aTE2KWluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSTF9IMl9VQiguLi4pIElMVlJMX0gyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfSDJfU0IoLi4uKSBJTFZSTF9IMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0gyX1NIKC4uLikgSUxWUkxfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9IMl9TVyguLi4pIElMVlJMX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfSDJfVVcoLi4uKSBJTFZSTF9IMih2NHUzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSUxWUkxfVzIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl93KCh2NGkzMilpbjAsICh2NGkzMilpbjEpOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmxfdygodjRpMzIpaW4wLCAodjRpMzIpaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJMX1cyX1VCKC4uLikgSUxWUkxfVzIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9XMl9TSCguLi4pIElMVlJMX1cyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfVzJfU1coLi4uKSBJTFZSTF9XMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX1cyX1VXKC4uLikgSUxWUkxfVzIodjR1MzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFBhY2sgZXZlbiBieXRlIGVsZW1lbnRzIG9mIHZlY3RvciBwYWlycworICogIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiAgRGV0YWlscyAgICAgOiBFdmVuIGJ5dGUgZWxlbWVudHMgb2YgJ2luMCcgYXJlIGNvcGllZCB0byB0aGUgbGVmdCBoYWxmIG9mCisgKiAgICAgICAgICAgICAgICAnb3V0MCcgJiBldmVuIGJ5dGUgZWxlbWVudHMgb2YgJ2luMScgYXJlIGNvcGllZCB0byB0aGUgcmlnaHQKKyAqICAgICAgICAgICAgICAgIGhhbGYgb2YgJ291dDAnLgorICovCisjZGVmaW5lIFBDS0VWX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9wY2tldl9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX3Bja2V2X2IoKHYxNmk4KWluMiwgKHYxNmk4KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQQ0tFVl9CMl9TQiguLi4pIFBDS0VWX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjJfVUIoLi4uKSBQQ0tFVl9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0IyX1NIKC4uLikgUENLRVZfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CMl9TVyguLi4pIFBDS0VWX0IyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBQQ0tFVl9CNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMihSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQQ0tFVl9CNF9TQiguLi4pIFBDS0VWX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjRfVUIoLi4uKSBQQ0tFVl9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0I0X1NIKC4uLikgUENLRVZfQjQodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CNF9TVyguLi4pIFBDS0VWX0I0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBQYWNrIGV2ZW4gaGFsZndvcmQgZWxlbWVudHMgb2YgdmVjdG9yIHBhaXJzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhcmUgY29waWVkIHRvIHRoZSBsZWZ0IGhhbGYgb2YKKyAqICAgICAgICAgICAgICAgJ291dDAnICYgZXZlbiBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4xJyBhcmUgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICByaWdodCBoYWxmIG9mICdvdXQwJy4KKyAqLworI2RlZmluZSBQQ0tFVl9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfcGNrZXZfaCgodjhpMTYpaW4wLCAodjhpMTYpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9wY2tldl9oKCh2OGkxNilpbjIsICh2OGkxNilpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUENLRVZfSDJfVUgoLi4uKSBQQ0tFVl9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0gyX1NIKC4uLikgUENLRVZfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9IMl9TVyguLi4pIFBDS0VWX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfSDJfVVcoLi4uKSBQQ0tFVl9IMih2NHUzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogUGFjayBldmVuIHdvcmQgZWxlbWVudHMgb2YgdmVjdG9yIHBhaXJzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiB3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFyZSBjb3BpZWQgdG8gdGhlIGxlZnQgaGFsZiBvZgorICogICAgICAgICAgICAgICAnb3V0MCcgJiBldmVuIHdvcmQgZWxlbWVudHMgb2YgJ2luMScgYXJlIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgcmlnaHQgaGFsZiBvZiAnb3V0MCcuCisgKi8KKyNkZWZpbmUgUENLRVZfVzIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX3Bja2V2X3coKHY0aTMyKWluMCwgKHY0aTMyKWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfcGNrZXZfdygodjRpMzIpaW4yLCAodjRpMzIpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBDS0VWX1cyX1VIKC4uLikgUENLRVZfVzIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9XMl9TSCguLi4pIFBDS0VWX1cyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfVzJfU1coLi4uKSBQQ0tFVl9XMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX1cyX1VXKC4uLikgUENLRVZfVzIodjR1MzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFBhY2sgb2RkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIHZlY3RvciBwYWlycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IE9kZCBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhcmUgY29waWVkIHRvIHRoZSBsZWZ0IGhhbGYgb2YKKyAqICAgICAgICAgICAgICAgJ291dDAnICYgb2RkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjEnIGFyZSBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIHJpZ2h0IGhhbGYgb2YgJ291dDAnLgorICovCisjZGVmaW5lIFBDS09EX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9wY2tvZF9oKCh2OGkxNilpbjAsICh2OGkxNilpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX3Bja29kX2goKHY4aTE2KWluMiwgKHY4aTE2KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQQ0tPRF9IMl9VSCguLi4pIFBDS09EX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLT0RfSDJfU0goLi4uKSBQQ0tPRF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS09EX0gyX1NXKC4uLikgUENLT0RfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tPRF9IMl9VVyguLi4pIFBDS09EX0gyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBcml0aG1ldGljIGltbWVkaWF0ZSBzaGlmdCByaWdodCBhbGwgZWxlbWVudHMgb2Ygd29yZCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzaGlmdAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4gcGxhY2Ugb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIGlucHV0IHZlY3RvciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgb2YgdmVjdG9yICdpbjAnIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgJ3NoaWZ0JyBhbmQKKyAqICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGluLXBsYWNlLiAnc2hpZnQnIGlzIGEgR1AgdmFyaWFibGUuCisgKi8KKyNkZWZpbmUgU1JBSV9XMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0X3ZhbCkgZG8geyAgXAorICBpbjAgPSAoUlRZUEUpU1JBSV9XKGluMCwgc2hpZnRfdmFsKTsgICAgICAgICAgICBcCisgIGluMSA9IChSVFlQRSlTUkFJX1coaW4xLCBzaGlmdF92YWwpOyAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQUlfVzJfU1coLi4uKSBTUkFJX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBSV9XMl9VVyguLi4pIFNSQUlfVzIodjR1MzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNSQUlfVzQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnRfdmFsKSBkbyB7ICBcCisgIFNSQUlfVzIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdF92YWwpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfVzIoUlRZUEUsIGluMiwgaW4zLCBzaGlmdF92YWwpOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFJX1c0X1NXKC4uLikgU1JBSV9XNCh2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQUlfVzRfVVcoLi4uKSBTUkFJX1c0KHY0dTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0IGFsbCBlbGVtZW50cyBvZiBoYWxmLXdvcmQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc2hpZnQKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluIHBsYWNlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBpbnB1dCB2ZWN0b3IgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IG9mIHZlY3RvciAnaW4wJyBpcyByaWdodCBzaGlmdGVkIGJ5ICdzaGlmdCcgYW5kCisgKiAgICAgICAgICAgICAgIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbi1wbGFjZS4gJ3NoaWZ0JyBpcyBhIEdQIHZhcmlhYmxlLgorICovCisjZGVmaW5lIFNSQUlfSDIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdF92YWwpIGRvIHsgIFwKKyAgaW4wID0gKFJUWVBFKVNSQUlfSChpbjAsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgXAorICBpbjEgPSAoUlRZUEUpU1JBSV9IKGluMSwgc2hpZnRfdmFsKTsgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFJX0gyX1NIKC4uLikgU1JBSV9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQUlfSDJfVUgoLi4uKSBTUkFJX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBcml0aG1ldGljIHJvdW5kZWQgc2hpZnQgcmlnaHQgYWxsIGVsZW1lbnRzIG9mIHdvcmQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc2hpZnQKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluIHBsYWNlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBpbnB1dCB2ZWN0b3IgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IG9mIHZlY3RvciAnaW4wJyBpcyByaWdodCBzaGlmdGVkIGJ5ICdzaGlmdCcgYW5kCisgKiAgICAgICAgICAgICAgIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbi1wbGFjZS4gJ3NoaWZ0JyBpcyBhIEdQIHZhcmlhYmxlLgorICovCisjZGVmaW5lIFNSQVJJX1cyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnQpIGRvIHsgICAgIFwKKyAgaW4wID0gKFJUWVBFKV9fbXNhX3NyYXJpX3coKHY0aTMyKWluMCwgc2hpZnQpOyAgXAorICBpbjEgPSAoUlRZUEUpX19tc2Ffc3JhcmlfdygodjRpMzIpaW4xLCBzaGlmdCk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFSSV9XMl9TVyguLi4pIFNSQVJJX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTUkFSSV9XNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBzaGlmdCkgZG8geyAgXAorICBTUkFSSV9XMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFSSV9XMihSVFlQRSwgaW4yLCBpbjMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBUklfVzRfU0goLi4uKSBTUkFSSV9XNCh2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQVJJX1c0X1VXKC4uLikgU1JBUklfVzQodjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFSSV9XNF9TVyguLi4pIFNSQVJJX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTaGlmdCByaWdodCBhcml0aG1ldGljIHJvdW5kZWQgZG91YmxlIHdvcmRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc2hpZnQKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluIHBsYWNlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgb2YgdmVjdG9yICdpbjAnIGlzIHNoaWZ0ZWQgcmlnaHQgYXJpdGhtZXRpY2FsbHkgYnkKKyAqICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlIHZlY3RvcgorICogICAgICAgICAgICAgICAnc2hpZnQnLiBUaGUgbGFzdCBkaXNjYXJkZWQgYml0IGlzIGFkZGVkIHRvIHNoaWZ0ZWQgdmFsdWUgZm9yCisgKiAgICAgICAgICAgICAgIHJvdW5kaW5nIGFuZCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gaW4tcGxhY2UuCisgKiAgICAgICAgICAgICAgICdzaGlmdCcgaXMgYSB2ZWN0b3IuCisgKi8KKyNkZWZpbmUgU1JBUl9EMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0KSBkbyB7ICAgICAgICAgICAgXAorICBpbjAgPSAoUlRZUEUpX19tc2Ffc3Jhcl9kKCh2Mmk2NClpbjAsICh2Mmk2NClzaGlmdCk7ICBcCisgIGluMSA9IChSVFlQRSlfX21zYV9zcmFyX2QoKHYyaTY0KWluMSwgKHYyaTY0KXNoaWZ0KTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQVJfRDJfU1coLi4uKSBTUkFSX0QyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBUl9EMl9TRCguLi4pIFNSQVJfRDIodjJpNjQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFSX0QyX1VEKC4uLikgU1JBUl9EMih2MnU2NCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1JBUl9ENChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBzaGlmdCkgZG8geyAgXAorICBTUkFSX0QyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQVJfRDIoUlRZUEUsIGluMiwgaW4zLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQVJfRDRfU0QoLi4uKSBTUkFSX0Q0KHYyaTY0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBUl9ENF9VRCguLi4pIFNSQVJfRDQodjJ1NjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFkZGl0aW9uIG9mIDIgcGFpcnMgb2YgaGFsZi13b3JkIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgaW4gJ2luMCcgaXMgYWRkZWQgdG8gJ2luMScgYW5kIHJlc3VsdCBpcyB3cml0dGVuCisgKiAgICAgICAgICAgICAgIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBBRERWSV9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpQUREVklfSChpbjAsIGluMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlBRERWSV9IKGluMiwgaW4zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQUREVklfSDJfU0goLi4uKSBBRERWSV9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIEFERFZJX0gyX1VIKC4uLikgQUREVklfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFkZGl0aW9uIG9mIDIgcGFpcnMgb2Ygd29yZCB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGluICdpbjAnIGlzIGFkZGVkIHRvICdpbjEnIGFuZCByZXN1bHQgaXMgd3JpdHRlbgorICogICAgICAgICAgICAgICB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgQUREVklfVzIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKUFERFZJX1coaW4wLCBpbjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpQUREVklfVyhpbjIsIGluMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEFERFZJX1cyX1NXKC4uLikgQUREVklfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEZpbGwgMiBwYWlycyBvZiB3b3JkIHZlY3RvcnMgd2l0aCBHUCByZWdpc3RlcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEdQIHJlZ2lzdGVyIGluMCBpcyByZXBsaWNhdGVkIGluIGVhY2ggd29yZCBlbGVtZW50IG9mIG91dDAKKyAqICAgICAgICAgICAgICAgR1AgcmVnaXN0ZXIgaW4xIGlzIHJlcGxpY2F0ZWQgaW4gZWFjaCB3b3JkIGVsZW1lbnQgb2Ygb3V0MQorICovCisjZGVmaW5lIEZJTExfVzIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfZmlsbF93KGluMCk7ICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfZmlsbF93KGluMSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBGSUxMX1cyX1NXKC4uLikgRklMTF9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQWRkaXRpb24gb2YgMiBwYWlycyBvZiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGluICdpbjAnIGlzIGFkZGVkIHRvICdpbjEnIGFuZCByZXN1bHQgaXMgd3JpdHRlbgorICogICAgICAgICAgICAgICB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgQUREMihpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCArIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMiArIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURENChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgIFwKKyAgQUREMihpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgQUREMihpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU3VidHJhY3Rpb24gb2YgMiBwYWlycyBvZiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGluICdpbjEnIGlzIHN1YnRyYWN0ZWQgZnJvbSAnaW4wJyBhbmQgcmVzdWx0IGlzCisgKiAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8gJ291dDAnLgorICovCisjZGVmaW5lIFNVQjIoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgLSBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjIgLSBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNVQjMoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgb3V0MCwgb3V0MSwgb3V0MikgZG8geyAgXAorICBvdXQwID0gaW4wIC0gaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMiAtIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBpbjQgLSBpbjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVUI0KGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgXAorICBvdXQwID0gaW4wIC0gaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4yIC0gaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gaW40IC0gaW41OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQzID0gaW42IC0gaW43OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBBZGRpdGlvbiAtIFN1YnRyYWN0aW9uIG9mIGlucHV0IHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBpbiAnaW4xJyBpcyBhZGRlZCB0byAnaW4wJyBhbmQgcmVzdWx0IGlzCisgKiAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8gJ291dDAnLgorICogICAgICAgICAgICAgICBFYWNoIGVsZW1lbnQgaW4gJ2luMScgaXMgc3VidHJhY3RlZCBmcm9tICdpbjAnIGFuZCByZXN1bHQgaXMKKyAqICAgICAgICAgICAgICAgd3JpdHRlbiB0byAnb3V0MScuCisgKi8KKyNkZWZpbmUgQUREU1VCMihpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gaW4wICsgaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjAgLSBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogTXVsdGlwbGljYXRpb24gb2YgcGFpcnMgb2YgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBmcm9tICdpbjAnIGlzIG11bHRpcGxpZWQgd2l0aCBlbGVtZW50cyBmcm9tICdpbjEnCisgKiAgICAgICAgICAgICAgIGFuZCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgTVVMMihpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCAqIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMiAqIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTVVMNChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgIFwKKyAgTVVMMihpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgTVVMMihpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU2lnbiBleHRlbmQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSByaWdodCBoYWxmIG9mIHRoZSB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgIC0gaW4gICAgKGhhbGZ3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gb3V0ICAgKHNpZ24gZXh0ZW5kZWQgd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKKyAqIERldGFpbHMgICAgIDogU2lnbiBiaXQgb2YgaGFsZndvcmQgZWxlbWVudHMgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luJyBpcworICogICAgICAgICAgICAgICBleHRyYWN0ZWQgYW5kIGludGVybGVhdmVkIHdpdGggc2FtZSB2ZWN0b3IgJ2luMCcgdG8gZ2VuZXJhdGUKKyAqICAgICAgICAgICAgICAgNCB3b3JkIGVsZW1lbnRzIGtlZXBpbmcgc2lnbiBpbnRhY3QKKyAqLworI2RlZmluZSBVTlBDS19SX1NIX1NXKGluLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBzaWduX20gPSBfX21zYV9jbHRpX3NfaCgodjhpMTYpaW4sIDApOyAgXAorICBvdXQgPSAodjRpMzIpX19tc2FfaWx2cl9oKHNpZ25fbSwgKHY4aTE2KWluKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTaWduIGV4dGVuZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIGlucHV0IHZlY3RvciBhbmQgcmV0dXJuCisgKiAgICAgICAgICAgICAgIHRoZSByZXN1bHQgaW4gcGFpciBvZiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0ICAgLSBpbiAgICAgICAgICAgIChoYWxmd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxICAgKHNpZ24gZXh0ZW5kZWQgd29yZCB2ZWN0b3JzKQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkCisgKiBEZXRhaWxzICAgICA6IFNpZ24gYml0IG9mIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gaW5wdXQgdmVjdG9yICdpbicgaXMKKyAqICAgICAgICAgICAgICAgZXh0cmFjdGVkIGFuZCBpbnRlcmxlYXZlZCByaWdodCB3aXRoIHNhbWUgdmVjdG9yICdpbjAnIHRvCisgKiAgICAgICAgICAgICAgIGdlbmVyYXRlIDQgc2lnbmVkIHdvcmQgZWxlbWVudHMgaW4gJ291dDAnCisgKiAgICAgICAgICAgICAgIFRoZW4gaW50ZXJsZWF2ZWQgbGVmdCB3aXRoIHNhbWUgdmVjdG9yICdpbjAnIHRvCisgKiAgICAgICAgICAgICAgIGdlbmVyYXRlIDQgc2lnbmVkIHdvcmQgZWxlbWVudHMgaW4gJ291dDEnCisgKi8KKyNkZWZpbmUgVU5QQ0tfU0hfU1coaW4sIG91dDAsIG91dDEpIGRvIHsgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgdG1wX20gPSBfX21zYV9jbHRpX3NfaCgodjhpMTYpaW4sIDApOyAgIFwKKyAgSUxWUkxfSDJfU1codG1wX20sIGluLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogQnV0dGVyZmx5IG9mIDQgaW5wdXQgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzCisgKiBEZXRhaWxzICAgICA6IEJ1dHRlcmZseSBvcGVyYXRpb24KKyAqLworI2RlZmluZSBCVVRURVJGTFlfNChpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCArIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjEgKyBpbjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gaW4xIC0gaW4yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MyA9IGluMCAtIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFRyYW5zcG9zZSAxNng0IGJsb2NrIGludG8gNHgxNiB3aXRoIGJ5dGUgZWxlbWVudHMgaW4gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbjgsIGluOSwgaW4xMCwgaW4xMSwgaW4xMiwgaW4xMywgaW4xNCwgaW4xNQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MworICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGJ5dGUKKyAqLworI2RlZmluZSBUUkFOU1BPU0UxNng0X1VCX1VCKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluOCwgaW45LCBpbjEwLCBpbjExLCBpbjEyLCBpbjEzLCBpbjE0LCBpbjE1LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICB2Mmk2NCB0bXAwX20sIHRtcDFfbSwgdG1wMl9tLCB0bXAzX20sIHRtcDRfbSwgdG1wNV9tOyAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9XMl9TRChpbjAsIGluNCwgaW44LCBpbjEyLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9XMl9TRChpbjEsIGluNSwgaW45LCBpbjEzLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9VQih0bXAyX20sIHRtcDNfbSwgdG1wMF9tLCB0bXAxX20sIG91dDEsIG91dDMpOyAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9XMl9TRChpbjIsIGluNiwgaW4xMCwgaW4xNCwgdG1wNF9tLCB0bXA1X20pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9XMl9TRChpbjMsIGluNywgaW4xMSwgaW4xNSwgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9TRCh0bXA0X20sIHRtcDVfbSwgdG1wMF9tLCB0bXAxX20sIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgXAorICBJTFZFVl9CMl9TRChvdXQxLCBvdXQzLCB0bXAyX20sIHRtcDNfbSwgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgICAgXAorICBJTFZFVk9EX0gyX1VCKHRtcDBfbSwgdG1wMV9tLCB0bXAwX20sIHRtcDFfbSwgb3V0MCwgb3V0Mik7ICAgICAgICAgICAgICAgXAorICBJTFZPRF9CMl9TRChvdXQxLCBvdXQzLCB0bXAyX20sIHRtcDNfbSwgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgICAgXAorICBJTFZFVk9EX0gyX1VCKHRtcDBfbSwgdG1wMV9tLCB0bXAwX20sIHRtcDFfbSwgb3V0MSwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBUcmFuc3Bvc2UgMTZ4OCBibG9jayBpbnRvIDh4MTYgd2l0aCBieXRlIGVsZW1lbnRzIGluIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW44LCBpbjksIGluMTAsIGluMTEsIGluMTIsIGluMTMsIGluMTQsIGluMTUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBieXRlCisgKi8KKyNkZWZpbmUgVFJBTlNQT1NFMTZ4OF9VQl9VQihpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjgsIGluOSwgaW4xMCwgaW4xMSwgaW4xMiwgaW4xMywgaW4xNCwgaW4xNSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ2LCBvdXQ3KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdG1wMF9tLCB0bXAxX20sIHRtcDRfbSwgdG1wNV9tLCB0bXA2X20sIHRtcDdfbTsgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgdG1wMl9tLCB0bXAzX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfVUIoaW4wLCBpbjgsIGluMSwgaW45LCBvdXQ3LCBvdXQ2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfVUIoaW4yLCBpbjEwLCBpbjMsIGluMTEsIG91dDUsIG91dDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfVUIoaW40LCBpbjEyLCBpbjUsIGluMTMsIG91dDMsIG91dDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfVUIoaW42LCBpbjE0LCBpbjcsIGluMTUsIG91dDEsIG91dDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfQjJfU0gob3V0Nywgb3V0Niwgb3V0NSwgb3V0NCwgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWT0RfQjJfU0gob3V0Nywgb3V0Niwgb3V0NSwgb3V0NCwgdG1wNF9tLCB0bXA1X20pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfQjJfVUIob3V0Mywgb3V0Miwgb3V0MSwgb3V0MCwgb3V0NSwgb3V0Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWT0RfQjJfU0gob3V0Mywgb3V0Miwgb3V0MSwgb3V0MCwgdG1wNl9tLCB0bXA3X20pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfSDJfU1codG1wMF9tLCB0bXAxX20sIG91dDUsIG91dDcsIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9XMl9VQih0bXAyX20sIHRtcDNfbSwgdG1wMl9tLCB0bXAzX20sIG91dDAsIG91dDQpOyAgICAgICAgICAgICAgIFwKKyAgSUxWT0RfSDJfU1codG1wMF9tLCB0bXAxX20sIG91dDUsIG91dDcsIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9XMl9VQih0bXAyX20sIHRtcDNfbSwgdG1wMl9tLCB0bXAzX20sIG91dDIsIG91dDYpOyAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfSDJfU1codG1wNF9tLCB0bXA1X20sIHRtcDZfbSwgdG1wN19tLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9XMl9VQih0bXAyX20sIHRtcDNfbSwgdG1wMl9tLCB0bXAzX20sIG91dDEsIG91dDUpOyAgICAgICAgICAgICAgIFwKKyAgSUxWT0RfSDJfU1codG1wNF9tLCB0bXA1X20sIHRtcDZfbSwgdG1wN19tLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9XMl9VQih0bXAyX20sIHRtcDNfbSwgdG1wMl9tLCB0bXAzX20sIG91dDMsIG91dDcpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogVHJhbnNwb3NlIDR4NCBibG9jayB3aXRoIHdvcmQgZWxlbWVudHMgaW4gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MworICogICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqLworI2RlZmluZSBUUkFOU1BPU0U0eDRfVyhSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgczBfbSwgczFfbSwgczJfbSwgczNfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9TVyhpbjEsIGluMCwgczBfbSwgczFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1NXKGluMywgaW4yLCBzMl9tLCBzM19tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2QoKHYyaTY0KXMyX20sICh2Mmk2NClzMF9tKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmxfZCgodjJpNjQpczJfbSwgKHYyaTY0KXMwX20pOyAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSAoUlRZUEUpX19tc2FfaWx2cl9kKCh2Mmk2NClzM19tLCAodjJpNjQpczFfbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MyA9IChSVFlQRSlfX21zYV9pbHZsX2QoKHYyaTY0KXMzX20sICh2Mmk2NClzMV9tKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVFJBTlNQT1NFNHg0X1NXX1NXKC4uLikgVFJBTlNQT1NFNHg0X1codjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFkZCBibG9jayA0eDQKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogTGVhc3Qgc2lnbmlmaWNhbnQgNCBieXRlcyBmcm9tIGVhY2ggaW5wdXQgdmVjdG9yIGFyZSBhZGRlZCB0bworICogICAgICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYnl0ZXMsIGNsaXBwZWQgYmV0d2VlbiAwLTI1NSBhbmQgc3RvcmVkLgorICovCisjZGVmaW5lIEFEREJMS19TVDR4NF9VQihpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50MzJfdCBzcmMwX20sIHNyYzFfbSwgc3JjMl9tLCBzcmMzX207ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgaW5wMF9tLCBpbnAxX20sIHJlczBfbSwgcmVzMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IGRzdDBfbSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCBkc3QxX20gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggemVyb19tID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJfRDJfU0goaW4xLCBpbjAsIGluMywgaW4yLCBpbnAwX20sIGlucDFfbSk7ICAgICAgICAgICAgICAgXAorICBMVzQocGRzdCwgc3RyaWRlLCBzcmMwX20sIHNyYzFfbSwgc3JjMl9tLCBzcmMzX20pOyAgICAgICAgICAgIFwKKyAgSU5TRVJUX1cyX1NCKHNyYzBfbSwgc3JjMV9tLCBkc3QwX20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU0VSVF9XMl9TQihzcmMyX20sIHNyYzNfbSwgZHN0MV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSX0IyX1NIKHplcm9fbSwgZHN0MF9tLCB6ZXJvX20sIGRzdDFfbSwgcmVzMF9tLCByZXMxX20pOyAgIFwKKyAgQUREMihyZXMwX20sIGlucDBfbSwgcmVzMV9tLCBpbnAxX20sIHJlczBfbSwgcmVzMV9tKTsgICAgICAgICBcCisgIENMSVBfU0gyXzBfMjU1KHJlczBfbSwgcmVzMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9TQihyZXMwX20sIHJlczBfbSwgcmVzMV9tLCByZXMxX20sIGRzdDBfbSwgZHN0MV9tKTsgIFwKKyAgU1Q0eDRfVUIoZHN0MF9tLCBkc3QxX20sIDAsIDEsIDAsIDEsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFBhY2sgZXZlbiBieXRlIGVsZW1lbnRzLCBleHRyYWN0IDAgJiAyIGluZGV4IHdvcmRzIGZyb20gcGFpcgorICogICAgICAgICAgICAgICBvZiByZXN1bHRzIGFuZCBzdG9yZSA0IHdvcmRzIGluIGRlc3RpbmF0aW9uIG1lbW9yeSBhcyBwZXIKKyAqICAgICAgICAgICAgICAgc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlCisgKi8KKyNkZWZpbmUgUENLRVZfU1Q0eDRfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdjE2aTggdG1wMF9tLCB0bXAxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfU0IoaW4xLCBpbjAsIGluMywgaW4yLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgIFwKKyAgU1Q0eDRfVUIodG1wMF9tLCB0bXAxX20sIDAsIDIsIDAsIDIsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogYXZlcmFnZSB3aXRoIHJvdW5kaW5nIChpbjAgKyBpbjEgKyAxKSAvIDIuCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggdW5zaWduZWQgYnl0ZSBlbGVtZW50IGZyb20gJ2luMCcgdmVjdG9yIGlzIGFkZGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgZWFjaCB1bnNpZ25lZCBieXRlIGVsZW1lbnQgZnJvbSAnaW4xJyB2ZWN0b3IuIFRoZW4gdGhlIGF2ZXJhZ2UKKyAqICAgICAgICAgICAgICAgd2l0aCByb3VuZGluZyBpcyBjYWxjdWxhdGVkIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIEFWRVJfVUIyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9hdmVyX3VfYigodjE2dTgpaW4wLCAodjE2dTgpaW4xKTsgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2F2ZXJfdV9iKCh2MTZ1OClpbjIsICh2MTZ1OClpbjMpOyAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBBVkVSX1VCMl9VQiguLi4pIEFWRVJfVUIyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKworI2VuZGlmICAvKiBXRUJQX0RTUF9NU0FfTUFDUk9fSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbmVvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9uZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExZGVhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbmVvbi5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIE5FT04gY29tbW9uIGNvZGUuCisKKyNpZm5kZWYgV0VCUF9EU1BfTkVPTl9IXworI2RlZmluZSBXRUJQX0RTUF9ORU9OX0hfCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworLy8gUmlnaHQgbm93LCBzb21lIGludHJpbnNpY3MgZnVuY3Rpb25zIHNlZW0gc2xvd2VyLCBzbyB3ZSBkaXNhYmxlIHRoZW0KKy8vIGV2ZXJ5d2hlcmUgZXhjZXB0IG5ld2VyIGNsYW5nL2djYyBvciBhYXJjaDY0IHdoZXJlIHRoZSBpbmxpbmUgYXNzZW1ibHkgaXMKKy8vIGluY29tcGF0aWJsZS4KKyNpZiBMT0NBTF9DTEFOR19QUkVSRVEoMyw4KSB8fCBMT0NBTF9HQ0NfUFJFUkVRKDQsOSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgV0VCUF9VU0VfSU5UUklOU0lDUyAgIC8vIHVzZSBpbnRyaW5zaWNzIHdoZW4gcG9zc2libGUKKyNlbmRpZgorCisjZGVmaW5lIElOSVRfVkVDVE9SMih2LCBhLCBiKSBkbyB7ICBcCisgIHYudmFsWzBdID0gYTsgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzFdID0gYjsgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOSVRfVkVDVE9SMyh2LCBhLCBiLCBjKSBkbyB7ICBcCisgIHYudmFsWzBdID0gYTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzFdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzJdID0gYzsgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOSVRfVkVDVE9SNCh2LCBhLCBiLCBjLCBkKSBkbyB7ICBcCisgIHYudmFsWzBdID0gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzFdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzJdID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYudmFsWzNdID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBpZiB1c2luZyBpbnRyaW5zaWNzLCB0aGlzIGZsYWcgYXZvaWRzIHNvbWUgZnVuY3Rpb25zIHRoYXQgbWFrZSBnY2MtNC42LjMKKy8vIGNyYXNoICgiaW50ZXJuYWwgY29tcGlsZXIgZXJyb3I6IGluIGltbWVkX2RvdWJsZV9jb25zdCwgYXQgZW1pdC1ydGwuIikuCisvLyAocHJvYmFibHkgc2ltaWxhciB0byBnY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDgxODMpCisjaWYgIShMT0NBTF9DTEFOR19QUkVSRVEoMyw4KSB8fCBMT0NBTF9HQ0NfUFJFUkVRKDQsOCkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykpCisjZGVmaW5lIFdPUktfQVJPVU5EX0dDQworI2VuZGlmCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQzMng0eDRfdCBUcmFuc3Bvc2U0eDRfTkVPTihjb25zdCBpbnQzMng0eDRfdCByb3dzKSB7CisgIHVpbnQ2NHgyeDJfdCByb3cwMSwgcm93MjM7CisKKyAgcm93MDEudmFsWzBdID0gdnJlaW50ZXJwcmV0cV91NjRfczMyKHJvd3MudmFsWzBdKTsKKyAgcm93MDEudmFsWzFdID0gdnJlaW50ZXJwcmV0cV91NjRfczMyKHJvd3MudmFsWzFdKTsKKyAgcm93MjMudmFsWzBdID0gdnJlaW50ZXJwcmV0cV91NjRfczMyKHJvd3MudmFsWzJdKTsKKyAgcm93MjMudmFsWzFdID0gdnJlaW50ZXJwcmV0cV91NjRfczMyKHJvd3MudmFsWzNdKTsKKyAgLy8gVHJhbnNwb3NlIDY0LWJpdCB2YWx1ZXMgKHRoZXJlJ3Mgbm8gdnN3cCBlcXVpdmFsZW50KQorICB7CisgICAgY29uc3QgdWludDY0eDFfdCByb3cwaCA9IHZnZXRfaGlnaF91NjQocm93MDEudmFsWzBdKTsKKyAgICBjb25zdCB1aW50NjR4MV90IHJvdzJsID0gdmdldF9sb3dfdTY0KHJvdzIzLnZhbFswXSk7CisgICAgY29uc3QgdWludDY0eDFfdCByb3cxaCA9IHZnZXRfaGlnaF91NjQocm93MDEudmFsWzFdKTsKKyAgICBjb25zdCB1aW50NjR4MV90IHJvdzNsID0gdmdldF9sb3dfdTY0KHJvdzIzLnZhbFsxXSk7CisgICAgcm93MDEudmFsWzBdID0gdmNvbWJpbmVfdTY0KHZnZXRfbG93X3U2NChyb3cwMS52YWxbMF0pLCByb3cybCk7CisgICAgcm93MjMudmFsWzBdID0gdmNvbWJpbmVfdTY0KHJvdzBoLCB2Z2V0X2hpZ2hfdTY0KHJvdzIzLnZhbFswXSkpOworICAgIHJvdzAxLnZhbFsxXSA9IHZjb21iaW5lX3U2NCh2Z2V0X2xvd191NjQocm93MDEudmFsWzFdKSwgcm93M2wpOworICAgIHJvdzIzLnZhbFsxXSA9IHZjb21iaW5lX3U2NChyb3cxaCwgdmdldF9oaWdoX3U2NChyb3cyMy52YWxbMV0pKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50MzJ4NHgyX3Qgb3V0MDEgPSB2dHJucV9zMzIodnJlaW50ZXJwcmV0cV9zMzJfdTY0KHJvdzAxLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zMzJfdTY0KHJvdzAxLnZhbFsxXSkpOworICAgIGNvbnN0IGludDMyeDR4Ml90IG91dDIzID0gdnRybnFfczMyKHZyZWludGVycHJldHFfczMyX3U2NChyb3cyMy52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczMyX3U2NChyb3cyMy52YWxbMV0pKTsKKyAgICBpbnQzMng0eDRfdCBvdXQ7CisgICAgb3V0LnZhbFswXSA9IG91dDAxLnZhbFswXTsKKyAgICBvdXQudmFsWzFdID0gb3V0MDEudmFsWzFdOworICAgIG91dC52YWxbMl0gPSBvdXQyMy52YWxbMF07CisgICAgb3V0LnZhbFszXSA9IG91dDIzLnZhbFsxXTsKKyAgICByZXR1cm4gb3V0OworICB9Cit9CisKKyNpZiAwICAgICAvLyBVc2VmdWwgZGVidWcgbWFjcm8uCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgUFJJTlRfUkVHKFJFRywgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByaW50ZigiJXMgXHRbJWRdOiAweCIsICNSRUcsIFNJWkUpOyAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKFNJWkUgPT0gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgX3RtcFs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnN0MV91OChfdG1wLCAoUkVHKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSBwcmludGYoIiUuMnggIiwgX3RtcFtpXSk7ICAgXAorICB9IGVsc2UgaWYgKFNJWkUgPT0gMTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgX3RtcFs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2c3QxX3UxNihfdG1wLCAoUkVHKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHByaW50ZigiJS40eCAiLCBfdG1wW2ldKTsgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpbnRmKCJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRFNQX05FT05fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNlMTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlci5jCkBAIC0wLDAgKzEsMjU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcGxlbWVudGF0aW9ucyBvZiBjcml0aWNhbCBmdW5jdGlvbnMgSW1wb3J0Um93IC8gRXhwb3J0Um93CisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGltcG9ydAorCit2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9DKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3RyaWRlID0gd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBpbnQgY2hhbm5lbDsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnhfZXhwYW5kKTsKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBpbnQgeF9pbiA9IGNoYW5uZWw7CisgICAgaW50IHhfb3V0ID0gY2hhbm5lbDsKKyAgICAvLyBzaW1wbGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIGludCBhY2N1bSA9IHdyay0+eF9hZGQ7CisgICAgaW50IGxlZnQgPSBzcmNbeF9pbl07CisgICAgaW50IHJpZ2h0ID0gKHdyay0+c3JjX3dpZHRoID4gMSkgPyBzcmNbeF9pbiArIHhfc3RyaWRlXSA6IGxlZnQ7CisgICAgeF9pbiArPSB4X3N0cmlkZTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgd3JrLT5mcm93W3hfb3V0XSA9IHJpZ2h0ICogd3JrLT54X2FkZCArIChsZWZ0IC0gcmlnaHQpICogYWNjdW07CisgICAgICB4X291dCArPSB4X3N0cmlkZTsKKyAgICAgIGlmICh4X291dCA+PSB4X291dF9tYXgpIGJyZWFrOworICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKKyAgICAgIGlmIChhY2N1bSA8IDApIHsKKyAgICAgICAgbGVmdCA9IHJpZ2h0OworICAgICAgICB4X2luICs9IHhfc3RyaWRlOworICAgICAgICBhc3NlcnQoeF9pbiA8IHdyay0+c3JjX3dpZHRoICogeF9zdHJpZGUpOworICAgICAgICByaWdodCA9IHNyY1t4X2luXTsKKyAgICAgICAgYWNjdW0gKz0gd3JrLT54X2FkZDsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KHdyay0+eF9zdWIgPT0gMCAvKiA8LSBzcGVjaWFsIGNhc2UgZm9yIHNyY193aWR0aD0xICovIHx8IGFjY3VtID09IDApOworICB9Cit9CisKK3ZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX0MoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGludCBjaGFubmVsOworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KCF3cmstPnhfZXhwYW5kKTsKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBpbnQgeF9pbiA9IGNoYW5uZWw7CisgICAgaW50IHhfb3V0ID0gY2hhbm5lbDsKKyAgICB1aW50MzJfdCBzdW0gPSAwOworICAgIGludCBhY2N1bSA9IDA7CisgICAgd2hpbGUgKHhfb3V0IDwgeF9vdXRfbWF4KSB7CisgICAgICB1aW50MzJfdCBiYXNlID0gMDsKKyAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7CisgICAgICB3aGlsZSAoYWNjdW0gPiAwKSB7CisgICAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICAgIGFzc2VydCh4X2luIDwgd3JrLT5zcmNfd2lkdGggKiB4X3N0cmlkZSk7CisgICAgICAgIGJhc2UgPSBzcmNbeF9pbl07CisgICAgICAgIHN1bSArPSBiYXNlOworICAgICAgICB4X2luICs9IHhfc3RyaWRlOworICAgICAgfQorICAgICAgeyAgICAgICAgLy8gRW1pdCBuZXh0IGhvcml6b250YWwgcGl4ZWwuCisgICAgICAgIGNvbnN0IHJlc2NhbGVyX3QgZnJhYyA9IGJhc2UgKiAoLWFjY3VtKTsKKyAgICAgICAgd3JrLT5mcm93W3hfb3V0XSA9IHN1bSAqIHdyay0+eF9zdWIgLSBmcmFjOworICAgICAgICAvLyBmcmVzaCBmcmFjdGlvbmFsIHN0YXJ0IGZvciBuZXh0IHBpeGVsCisgICAgICAgIHN1bSA9IChpbnQpTVVMVF9GSVgoZnJhYywgd3JrLT5meF9zY2FsZSk7CisgICAgICB9CisgICAgICB4X291dCArPSB4X3N0cmlkZTsKKyAgICB9CisgICAgYXNzZXJ0KGFjY3VtID09IDApOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKK3ZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX0MoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gZnJvd1t4X291dF07CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50NjRfdCBJID0gKHVpbnQ2NF90KUEgKiBmcm93W3hfb3V0XQorICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClCICogaXJvd1t4X291dF07CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfQorfQorCit2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19DKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWMgPSAodWludDMyX3QpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSAwOworICAgIH0KKyAgfQorfQorCisjdW5kZWYgTVVMVF9GSVgKKyN1bmRlZiBST1VOREVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGVudHJ5IGNhbGxzCisKK3ZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGlmICghd3JrLT54X2V4cGFuZCkgeworICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmluayh3cmssIHNyYyk7CisgIH0gZWxzZSB7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kKHdyaywgc3JjKTsKKyAgfQorfQorCit2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpZiAod3JrLT55X2FjY3VtIDw9IDApIHsKKyAgICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgICAgaWYgKHdyay0+eV9leHBhbmQpIHsKKyAgICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCh3cmspOworICAgIH0gZWxzZSBpZiAod3JrLT5meHlfc2NhbGUpIHsKKyAgICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmluayh3cmspOworICAgIH0gZWxzZSB7ICAvLyBzcGVjaWFsIGNhc2UKKyAgICAgIGludCBpOworICAgICAgYXNzZXJ0KHdyay0+c3JjX2hlaWdodCA9PSB3cmstPmRzdF9oZWlnaHQgJiYgd3JrLT54X2FkZCA9PSAxKTsKKyAgICAgIGFzc2VydCh3cmstPnNyY193aWR0aCA9PSAxICYmIHdyay0+ZHN0X3dpZHRoIDw9IDIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHdyay0+bnVtX2NoYW5uZWxzICogd3JrLT5kc3Rfd2lkdGg7ICsraSkgeworICAgICAgICB3cmstPmRzdFtpXSA9IHdyay0+aXJvd1tpXTsKKyAgICAgICAgd3JrLT5pcm93W2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgd3JrLT55X2FjY3VtICs9IHdyay0+eV9hZGQ7CisgICAgd3JrLT5kc3QgKz0gd3JrLT5kc3Rfc3RyaWRlOworICAgICsrd3JrLT5kc3RfeTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZDsKK1dlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rOworCitXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZDsKK1dlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rOworCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1TQSh2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRORU9OKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUFJlc2NhbGVyRHNwSW5pdCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfQzsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX0M7CisjZW5kaWYKKworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgPSBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfQzsKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rID0gV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX0M7CisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFdlYlBSZXNjYWxlckRzcEluaXRORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsgIT0gTlVMTCk7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9TSVpFCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIuYwpAQCAtMCwwICsxLDI5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiByZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpICYmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBpbXBvcnQKKworc3RhdGljIHZvaWQgSW1wb3J0Um93U2hyaW5rX01JUFMzMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IGZ4X3NjYWxlID0gd3JrLT5meF9zY2FsZTsKKyAgY29uc3QgaW50IHhfYWRkID0gd3JrLT54X2FkZDsKKyAgY29uc3QgaW50IHhfc3ViID0gd3JrLT54X3N1YjsKKyAgY29uc3QgaW50IHhfc3RyaWRlMSA9IHhfc3RyaWRlIDw8IDI7CisgIGludCBjaGFubmVsOworICBhc3NlcnQoIXdyay0+eF9leHBhbmQpOworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKworICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgeF9zdHJpZGU7ICsrY2hhbm5lbCkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzEgPSBzcmMgKyBjaGFubmVsOworICAgIHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3cgKyBjaGFubmVsOworICAgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICAgIGludCBiYXNlLCBmcmFjLCBzdW07CisgICAgaW50IGFjY3VtLCBhY2N1bTE7CisgICAgaW50IGxvb3BfYyA9IHhfb3V0X21heCAtIGNoYW5uZWw7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgJVt0ZW1wMV0sICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAlW3RlbXAyXSwgICAweDEwMDAwICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICVbc3VtXSwgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgJVthY2N1bV0sICAgMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICVbeF9hZGRdICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgJVtiYXNlXSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImJsZXogICAlW2FjY3VtXSwgICAzZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsYnUgICAgJVtiYXNlXSwgICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW2FjY3VtXSwgICAlW2FjY3VtXSwgICAlW3hfc3ViXSAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbc3JjMV0sICAgICVbc3JjMV0sICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtzdW1dLCAgICAgJVtzdW1dLCAgICAgJVtiYXNlXSAgICAgICBcblx0IgorICAgICAgImJndHogICAlW2FjY3VtXSwgICAyYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJuZWd1ICAgJVthY2N1bTFdLCAgJVthY2N1bV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bCAgICAlW2ZyYWNdLCAgICAlW2Jhc2VdLCAgICAlW2FjY3VtMV0gICAgIFxuXHQiCisgICAgICAibXVsICAgICVbdGVtcDNdLCAgICVbc3VtXSwgICAgICVbeF9zdWJdICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVtsb29wX2NdLCAgJVtsb29wX2NdLCAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgIm11bHQgICAlW3RlbXAxXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICVbZnJhY10sICAgICVbZnhfc2NhbGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgJVtzdW1dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW2ZyYWNdICAgICAgIFxuXHQiCisgICAgICAic3cgICAgICVbdGVtcDNdLCAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtmcm93XSwgICAgJVtmcm93XSwgICAgJVt4X3N0cmlkZTFdICBcblx0IgorICAgICAgImJndHogICAlW2xvb3BfY10sICAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFthY2N1bV0iPSZyIihhY2N1bSksIFtzcmMxXSIrciIoc3JjMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFtzdW1dIj0mciIoc3VtKSwgW2Jhc2VdIj0mciIoYmFzZSksIFtmcmFjXSI9JnIiKGZyYWMpLAorICAgICAgICBbZnJvd10iK3IiKGZyb3cpLCBbYWNjdW0xXSI9JnIiKGFjY3VtMSksCisgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICAgIDogW3hfc3RyaWRlXSJyIih4X3N0cmlkZSksIFtmeF9zY2FsZV0iciIoZnhfc2NhbGUpLAorICAgICAgICBbeF9zdWJdInIiKHhfc3ViKSwgW3hfYWRkXSJyIih4X2FkZCksCisgICAgICAgIFtsb29wX2NdInIiKGxvb3BfYyksIFt4X3N0cmlkZTFdInIiKHhfc3RyaWRlMSkKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICAgIGFzc2VydChhY2N1bSA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbXBvcnRSb3dFeHBhbmRfTUlQUzMyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3RyaWRlID0gd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9hZGQgPSB3cmstPnhfYWRkOworICBjb25zdCBpbnQgeF9zdWIgPSB3cmstPnhfc3ViOworICBjb25zdCBpbnQgc3JjX3dpZHRoID0gd3JrLT5zcmNfd2lkdGg7CisgIGNvbnN0IGludCB4X3N0cmlkZTEgPSB4X3N0cmlkZSA8PCAyOworICBpbnQgY2hhbm5lbDsKKyAgYXNzZXJ0KHdyay0+eF9leHBhbmQpOworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKworICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgeF9zdHJpZGU7ICsrY2hhbm5lbCkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzEgPSBzcmMgKyBjaGFubmVsOworICAgIHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3cgKyBjaGFubmVsOworICAgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgICBpbnQgZnJhYzsKKyAgICBpbnQgYWNjdW07CisgICAgaW50IHhfb3V0ID0gY2hhbm5lbDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImFkZGl1ICAlW3RlbXAzXSwgICAlW3NyY193aWR0aF0sIC0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsYnUgICAgJVt0ZW1wMl0sICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgImJndHogICAlW3RlbXAzXSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgICAwICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYiAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsYnUgICAgJVt0ZW1wMV0sICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAlW2FjY3VtXSwgICAlW3hfYWRkXSwgICAgIDAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbdGVtcDNdLCAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgIm11bCAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICVbYWNjdW1dICAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0sICAgICAlW3hfYWRkXSAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbdGVtcDNdLCAgICVbdGVtcDRdLCAgICAgJVt0ZW1wM10gICAgICBcblx0IgorICAgICAgInN3ICAgICAlW3RlbXAzXSwgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtmcm93XSwgICAgJVtmcm93XSwgICAgICAlW3hfc3RyaWRlMV0gIFxuXHQiCisgICAgICAiYWRkdSAgICVbeF9vdXRdLCAgICVbeF9vdXRdLCAgICAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgInN1YnUgICAlW3RlbXAzXSwgICAlW3hfb3V0XSwgICAgICVbeF9vdXRfbWF4XSAgXG5cdCIKKyAgICAgICJiZ2V6ICAgJVt0ZW1wM10sICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICAgJVt4X3N1Yl0gICAgICBcblx0IgorICAgICAgImJnZXogICAlW2FjY3VtXSwgICA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICAgICAwICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgImxidSAgICAlW3RlbXAxXSwgICAwKCVbc3JjMV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVthY2N1bV0sICAgJVthY2N1bV0sICAgICAlW3hfYWRkXSAgICAgIFxuXHQiCisgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImIgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFtzcmMxXSIrciIoc3JjMSksIFthY2N1bV0iPSZyIihhY2N1bSksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksCisgICAgICAgIFt4X291dF0iK3IiKHhfb3V0KSwgW2ZyYWNdIj0mciIoZnJhYyksIFtmcm93XSIrciIoZnJvdykKKyAgICAgIDogW3hfc3RyaWRlXSJyIih4X3N0cmlkZSksIFt4X2FkZF0iciIoeF9hZGQpLCBbeF9zdWJdInIiKHhfc3ViKSwKKyAgICAgICAgW3hfc3RyaWRlMV0iciIoeF9zdHJpZGUxKSwgW3NyY193aWR0aF0iciIoc3JjX3dpZHRoKSwKKyAgICAgICAgW3hfb3V0X21heF0iciIoeF9vdXRfbWF4KQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgICAgYXNzZXJ0KHdyay0+eF9zdWIgPT0gMCAvKiA8LSBzcGVjaWFsIGNhc2UgZm9yIHNyY193aWR0aD0xICovIHx8IGFjY3VtID09IDApOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd0V4cGFuZF9NSVBTMzIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXAyID0gKGludCl3cmstPmZ5X3NjYWxlOworICBjb25zdCBpbnQgdGVtcDYgPSB4X291dF9tYXggPDwgMjsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAxICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVtBXSwgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVtCXSwgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpCisgICAgICA6IFt0ZW1wMl0iciIodGVtcDIpLCBbdGVtcDZdInIiKHRlbXA2KSwgW0FdInIiKEEpLCBbQl0iciIoQikKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd1Nocmlua19NSVBTMzIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCBpbnQgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgbG9vcF9lbmQ7CisgIGNvbnN0IGludCB0ZW1wMiA9IChpbnQpd3JrLT5meHlfc2NhbGU7CisgIGNvbnN0IGludCB0ZW1wNiA9IHhfb3V0X21heCA8PCAyOworCisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+Znh5X3NjYWxlICE9IDApOworICBpZiAoeXNjYWxlKSB7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wMF0sICAgICVbeXNjYWxlXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAxICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3cgICAgICAgJVt0ZW1wMV0sICAgIC00KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpCisgICAgICA6IFt0ZW1wMl0iciIodGVtcDIpLCBbeXNjYWxlXSJyIih5c2NhbGUpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgIH0gZWxzZSB7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbaXJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAxICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC00KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYm5lICAgICAgJVtpcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtpcm93XSIrciIoaXJvdyksCisgICAgICAgIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpCisgICAgICA6IFt0ZW1wMl0iciIodGVtcDIpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kID0gSW1wb3J0Um93RXhwYW5kX01JUFMzMjsKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rID0gSW1wb3J0Um93U2hyaW5rX01JUFMzMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gRXhwb3J0Um93RXhwYW5kX01JUFMzMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gRXhwb3J0Um93U2hyaW5rX01JUFMzMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4YWFjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDMxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiByZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikgJiYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisjZGVmaW5lIFJPVU5ERVIgKFdFQlBfUkVTQ0FMRVJfT05FID4+IDEpCisjZGVmaW5lIE1VTFRfRklYKHgsIHkpICgoKHVpbnQ2NF90KSh4KSAqICh5KSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBleHBvcnQKKworc3RhdGljIHZvaWQgRXhwb3J0Um93U2hyaW5rX01JUFNkc3BSMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCBpbnQgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIGxvb3BfZW5kOworICBjb25zdCBpbnQgdGVtcDcgPSAoaW50KXdyay0+Znh5X3NjYWxlOworICBjb25zdCBpbnQgdGVtcDYgPSAoeF9vdXRfbWF4ICYgfjB4MykgPDwgMjsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT5meHlfc2NhbGUgIT0gMCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIGludCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDVdLCAgICAxMiglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3lzY2FsZV0gICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt5c2NhbGVdICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wNV0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wNV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA4XSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDldLCAgICA0KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTBdLCAgIDgoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxMV0sICAgMTIoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAic3VidSAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXA4XSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDldLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMTBdLCAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxMV0sICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDBdLCAgICAtMTYoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJVt0ZW1wMV0sICAgIC0xMiglW2lyb3ddKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAlW3RlbXAyXSwgICAgLTgoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDVdLCAgICAtNCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wOF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXA5XSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDEwXSwgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMTFdLCAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksCisgICAgICAgICAgW3RlbXA4XSI9JnIiKHRlbXA4KSwgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLAorICAgICAgICAgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAyXSI9JnIiKHRlbXAyKQorICAgICAgICA6IFt0ZW1wN10iciIodGVtcDcpLCBbeXNjYWxlXSJyIih5c2NhbGUpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIsCisgICAgICAgICAgIiRhYzJoaSIsICIkYWMybG8iLCAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoeF9vdXRfbWF4ICYgMHgzKTsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYKCpmcm93KyssIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoKmlyb3cgLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgICAqaXJvdysrID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2lyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICA0KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA1XSwgICAgMTIoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wNV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTE2KCVbaXJvd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtMTIoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC04KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDBdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAyXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtpcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbaXJvd10iK3IiKGlyb3cpLAorICAgICAgICAgIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbdGVtcDJdIj0mciIodGVtcDIpCisgICAgICAgIDogW3RlbXA3XSJyIih0ZW1wNyksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWCgqaXJvdywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICAqZHN0KysgPSB2OworICAgICAgKmlyb3crKyA9IDA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd0V4cGFuZF9NSVBTZHNwUjIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IGk7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIGxvb3BfZW5kOworICBjb25zdCBpbnQgdGVtcDYgPSAoeF9vdXRfbWF4ICYgfjB4MykgPDwgMjsKKyAgY29uc3QgaW50IHRlbXA3ID0gKGludCl3cmstPmZ5X3NjYWxlOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+eV9zdWIgIT0gMCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIGlmICh4X291dF9tYXggPj0gNCkgeworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDVdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDNdLCAgICAxMiglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAzXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDBdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAyXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDNdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICAgIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbdGVtcDJdIj0mciIodGVtcDIpCisgICAgICAgIDogW3RlbXA3XSJyIih0ZW1wNyksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAqZnJvdysrOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICAqZHN0KysgPSB2OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgaWYgKHhfb3V0X21heCA+PSA0KSB7CisgICAgICBpbnQgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgJVt0ZW1wOF0sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAlW3RlbXA5XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICA0KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtmcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDRdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wNV0sICAgIDQoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxMF0sICAgOCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDExXSwgICAxMiglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW0FdLCAgICAgICAgJVt0ZW1wMF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbQl0sICAgICAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW0FdLCAgICAgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbQl0sICAgICAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW0FdLCAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbQl0sICAgICAgICAlW3RlbXAxMF0gICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW0FdLCAgICAgICAgJVt0ZW1wM10gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbQl0sICAgICAgICAlW3RlbXAxMV0gICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wM10sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wM10sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDFdLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMl0sICAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAzXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgICBbaXJvd10iK3IiKGlyb3cpLCBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwKKyAgICAgICAgICBbdGVtcDhdIj0mciIodGVtcDgpLCBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksCisgICAgICAgICAgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLCBbdGVtcDJdIj0mciIodGVtcDIpCisgICAgICAgIDogW3RlbXA3XSJyIih0ZW1wNyksIFt0ZW1wNl0iciIodGVtcDYpLCBbQV0iciIoQSksIFtCXSJyIihCKQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIsCisgICAgICAgICAgIiRhYzJoaSIsICIkYWMybG8iLCAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoeF9vdXRfbWF4ICYgMHgzKTsgKytpKSB7CisgICAgICBjb25zdCB1aW50NjRfdCBJID0gKHVpbnQ2NF90KUEgKiAqZnJvdysrCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiAqaXJvdysrOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICAqZHN0KysgPSB2OworICAgIH0KKyAgfQorfQorCisjdW5kZWYgTVVMVF9GSVgKKyN1bmRlZiBST1VOREVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IEV4cG9ydFJvd0V4cGFuZF9NSVBTZHNwUjI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IEV4cG9ydFJvd1Nocmlua19NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmM5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21zYS5jCkBAIC0wLDAgKzEsNDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZlcnNpb24gb2YgcmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogUHJhc2hhbnQgUGF0aWwgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpICYmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVhfMTYoaW4wLCBpbjEsIGluMiwgaW4zLCBzY2FsZSwgc2hpZnQsIGRzdCkgZG8geyAgXAorICB2NHUzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDEsIG91dDIsIG91dDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4xLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAyLCB0bXAzLCBzY2FsZSwgc2NhbGUsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1VCKG91dDEsIG91dDAsIG91dDMsIG91dDIsIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjIsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4zLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAyLCB0bXAzLCBzY2FsZSwgc2NhbGUsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1VCKG91dDEsIG91dDAsIG91dDMsIG91dDIsIHQyLCB0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9VQih0MSwgdDAsIHQzLCB0MiwgdDQsIHQ1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KXQ1LCAodjE2aTgpdDQpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVhfNChpbjAsIHNjYWxlLCBzaGlmdCwgZHN0KSBkbyB7ICBcCisgIHY0dTMyIHRtcDAsIHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICBcCisgIFNSQVJfRDJfVUQob3V0MCwgb3V0MSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfcGNrZXZfYigodjE2aTgpb3V0MSwgKHYxNmk4KW91dDApOyAgICAgICBcCisgIHQxID0gX19tc2FfcGNrZXZfYih0MCwgdDApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfcGNrZXZfYih0MSwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMil0MCwgMCk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVgxXzE2KGluMCwgaW4xLCBpbjIsIGluMywgZnlzY2FsZSwgc2hpZnQsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpIGRvIHsgICAgICAgICBcCisgIHY0dTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDEsIG91dDIsIG91dDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIGZ5c2NhbGUsIGZ5c2NhbGUsIG91dDAsIG91dDEpOyAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDIsIHRtcDMsIGZ5c2NhbGUsIGZ5c2NhbGUsIG91dDIsIG91dDMpOyAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX1cyX1VXKG91dDEsIG91dDAsIG91dDMsIG91dDIsIGRzdDAsIGRzdDEpOyAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMiwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMywgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIGZ5c2NhbGUsIGZ5c2NhbGUsIG91dDAsIG91dDEpOyAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDIsIHRtcDMsIGZ5c2NhbGUsIGZ5c2NhbGUsIG91dDIsIG91dDMpOyAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX1cyX1VXKG91dDEsIG91dDAsIG91dDMsIG91dDIsIGRzdDIsIGRzdDMpOyAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVgxXzQoaW4wLCBzY2FsZSwgc2hpZnQsIGRzdCkgZG8geyAgICBcCisgIHY0dTMyIHRtcDAsIHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICBcCisgIFNSQVJfRDJfVUQob3V0MCwgb3V0MSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2NHUzMilfX21zYV9wY2tldl93KCh2NGkzMilvdXQxLCAodjRpMzIpb3V0MCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVgyXzE2KGluMCwgaW4xLCBpbjIsIGluMywgbXVsdCwgc2NhbGUsIHNoaWZ0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDEsIG91dDIsIG91dDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyhpbjAsIGluMiwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoaW4xLCBpbjMsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIG11bHQsIG11bHQsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAyLCB0bXAzLCBtdWx0LCBtdWx0LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKG91dDAsIG91dDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRChvdXQyLCBvdXQzLCBzY2FsZSwgc2NhbGUsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1VCKG91dDEsIG91dDAsIG91dDMsIG91dDIsIGRzdDAsIGRzdDEpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYMl80KGluMCwgaW4xLCBtdWx0LCBzY2FsZSwgc2hpZnQsIGRzdCkgZG8geyAgXAorICB2NHUzMiB0bXAwLCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyhpbjAsIGluMSwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBtdWx0LCBtdWx0LCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgXAorICBTUkFSX0QyX1VEKG91dDAsIG91dDEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRChvdXQwLCBvdXQxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgXAorICBTUkFSX0QyX1VEKG91dDAsIG91dDEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KW91dDEsICh2MTZpOClvdXQwKTsgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX3Bja2V2X2IodDAsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3Bja2V2X2IodDEsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpdDAsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRXhwb3J0Um93RXhwYW5kXzAoY29uc3QgdWludDMyX3QqIGZyb3csIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCB2NHUzMiBzY2FsZSA9ICh2NHUzMilfX21zYV9maWxsX3cod3JrLT5meV9zY2FsZSk7CisgIGNvbnN0IHY0dTMyIHNoaWZ0ID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyhXRUJQX1JFU0NBTEVSX1JGSVgpOworICBjb25zdCB2NGkzMiB6ZXJvID0geyAwIH07CisKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjE2dTggb3V0OworICAgIExEX1VXNChmcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBDQUxDX01VTFRfRklYXzE2KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNjYWxlLCBzaGlmdCwgb3V0KTsKKyAgICBTVF9VQihvdXQsIGRzdCk7CisgICAgbGVuZ3RoIC09IDE2OworICAgIGZyb3cgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgeF9vdXQ7CisgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX20sIHZhbDJfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzI7CisgICAgICBMRF9VVzMoZnJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMyLCBzY2FsZSwgc2hpZnQsIHZhbDJfbSk7CisgICAgICBTVzModmFsMF9tLCB2YWwxX20sIHZhbDJfbSwgZHN0LCA0KTsKKyAgICAgIGxlbmd0aCAtPSAxMjsKKyAgICAgIGZyb3cgICArPSAxMjsKKyAgICAgIGRzdCAgICArPSAxMjsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA4KSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzE7CisgICAgICBMRF9VVzIoZnJvdywgNCwgc3JjMCwgc3JjMSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIFNXMih2YWwwX20sIHZhbDFfbSwgZHN0LCA0KTsKKyAgICAgIGxlbmd0aCAtPSA4OworICAgICAgZnJvdyAgICs9IDg7CisgICAgICBkc3QgICAgKz0gODsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA0KSB7CisgICAgICB1aW50MzJfdCB2YWwwX207CisgICAgICBjb25zdCB2NHUzMiBzcmMwID0gTERfVVcoZnJvdyk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgU1codmFsMF9tLCBkc3QpOworICAgICAgbGVuZ3RoIC09IDQ7CisgICAgICBmcm93ICAgKz0gNDsKKyAgICAgIGRzdCAgICArPSA0OworICAgIH0KKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBsZW5ndGg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEV4cG9ydFJvd0V4cGFuZF8xKGNvbnN0IHVpbnQzMl90KiBmcm93LCB1aW50MzJfdCogaXJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgIGNvbnN0IHY0aTMyIEIxID0gX19tc2FfZmlsbF93KEIpOworICBjb25zdCB2NGkzMiBBMSA9IF9fbXNhX2ZpbGxfdyhBKTsKKyAgY29uc3QgdjRpMzIgQUIgPSBfX21zYV9pbHZyX3coQTEsIEIxKTsKKyAgY29uc3QgdjR1MzIgc2NhbGUgPSAodjR1MzIpX19tc2FfZmlsbF93KHdyay0+Znlfc2NhbGUpOworICBjb25zdCB2NHUzMiBzaGlmdCA9ICh2NHUzMilfX21zYV9maWxsX3coV0VCUF9SRVNDQUxFUl9SRklYKTsKKworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgdjR1MzIgZnJvdzAsIGZyb3cxLCBmcm93MiwgZnJvdzMsIGlyb3cwLCBpcm93MSwgaXJvdzIsIGlyb3czOworICAgIHYxNnU4IHQwLCB0MSwgdDIsIHQzLCB0NCwgdDU7CisgICAgTERfVVc0KGZyb3csIDQsIGZyb3cwLCBmcm93MSwgZnJvdzIsIGZyb3czKTsKKyAgICBMRF9VVzQoaXJvdywgNCwgaXJvdzAsIGlyb3cxLCBpcm93MiwgaXJvdzMpOworICAgIENBTENfTVVMVF9GSVgyXzE2KGZyb3cwLCBmcm93MSwgaXJvdzAsIGlyb3cxLCBBQiwgc2NhbGUsIHNoaWZ0LCB0MCwgdDEpOworICAgIENBTENfTVVMVF9GSVgyXzE2KGZyb3cyLCBmcm93MywgaXJvdzIsIGlyb3czLCBBQiwgc2NhbGUsIHNoaWZ0LCB0MiwgdDMpOworICAgIFBDS0VWX0IyX1VCKHQxLCB0MCwgdDMsIHQyLCB0NCwgdDUpOworICAgIHQwID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KXQ1LCAodjE2aTgpdDQpOworICAgIFNUX1VCKHQwLCBkc3QpOworICAgIGZyb3cgICArPSAxNjsKKyAgICBpcm93ICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2OworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCB4X291dDsKKyAgICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbSwgdmFsMl9tOworICAgICAgdjR1MzIgZnJvdzAsIGZyb3cxLCBmcm93MiwgaXJvdzAsIGlyb3cxLCBpcm93MjsKKyAgICAgIExEX1VXMyhmcm93LCA0LCBmcm93MCwgZnJvdzEsIGZyb3cyKTsKKyAgICAgIExEX1VXMyhpcm93LCA0LCBpcm93MCwgaXJvdzEsIGlyb3cyKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzAsIGlyb3cwLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MSwgaXJvdzEsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cyLCBpcm93MiwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMl9tKTsKKyAgICAgIFNXMyh2YWwwX20sIHZhbDFfbSwgdmFsMl9tLCBkc3QsIDQpOworICAgICAgZnJvdyAgICs9IDEyOworICAgICAgaXJvdyAgICs9IDEyOworICAgICAgZHN0ICAgICs9IDEyOworICAgICAgbGVuZ3RoIC09IDEyOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDgpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tOworICAgICAgdjR1MzIgZnJvdzAsIGZyb3cxLCBpcm93MCwgaXJvdzE7CisgICAgICBMRF9VVzIoZnJvdywgNCwgZnJvdzAsIGZyb3cxKTsKKyAgICAgIExEX1VXMihpcm93LCA0LCBpcm93MCwgaXJvdzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MCwgaXJvdzAsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cxLCBpcm93MSwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIFNXMih2YWwwX20sIHZhbDFfbSwgZHN0LCA0KTsKKyAgICAgIGZyb3cgICArPSA0OworICAgICAgaXJvdyAgICs9IDQ7CisgICAgICBkc3QgICAgKz0gNDsKKyAgICAgIGxlbmd0aCAtPSA0OworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDQpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbTsKKyAgICAgIGNvbnN0IHY0dTMyIGZyb3cwID0gTERfVVcoZnJvdyArIDApOworICAgICAgY29uc3QgdjR1MzIgaXJvdzAgPSBMRF9VVyhpcm93ICsgMCk7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cwLCBpcm93MCwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIFNXKHZhbDBfbSwgZHN0KTsKKyAgICAgIGZyb3cgICArPSA0OworICAgICAgaXJvdyAgICs9IDQ7CisgICAgICBkc3QgICAgKz0gNDsKKyAgICAgIGxlbmd0aCAtPSA0OworICAgIH0KKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBsZW5ndGg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqIGZyb3dbeF9vdXRdCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiBpcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX01JUFNkc3BSMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgRXhwb3J0Um93RXhwYW5kXzAoZnJvdywgZHN0LCB4X291dF9tYXgsIHdyayk7CisgIH0gZWxzZSB7CisgICAgRXhwb3J0Um93RXhwYW5kXzEoZnJvdywgaXJvdywgZHN0LCB4X291dF9tYXgsIHdyayk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRXhwb3J0Um93U2hyaW5rXzAoY29uc3QgdWludDMyX3QqIGZyb3csIHVpbnQzMl90KiBpcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgeXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgY29uc3QgdjR1MzIgeV9zY2FsZSA9ICh2NHUzMilfX21zYV9maWxsX3coeXNjYWxlKTsKKyAgY29uc3QgdjR1MzIgZnh5c2NhbGUgPSAodjR1MzIpX19tc2FfZmlsbF93KHdyay0+Znh5X3NjYWxlKTsKKyAgY29uc3QgdjR1MzIgc2hpZnR2YWwgPSAodjR1MzIpX19tc2FfZmlsbF93KFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgIGNvbnN0IHY0aTMyIHplcm8gPSB7IDAgfTsKKworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZnJhYzAsIGZyYWMxLCBmcmFjMiwgZnJhYzM7CisgICAgdjE2dTggb3V0OworICAgIExEX1VXNChmcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBDQUxDX01VTFRfRklYMV8xNihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCB5X3NjYWxlLCBzaGlmdHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFjMCwgZnJhYzEsIGZyYWMyLCBmcmFjMyk7CisgICAgTERfVVc0KGlyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFNVQjQoc3JjMCwgZnJhYzAsIHNyYzEsIGZyYWMxLCBzcmMyLCBmcmFjMiwgc3JjMywgZnJhYzMsCisgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBDQUxDX01VTFRfRklYXzE2KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgb3V0KTsKKyAgICBTVF9VQihvdXQsIGRzdCk7CisgICAgU1RfVVc0KGZyYWMwLCBmcmFjMSwgZnJhYzIsIGZyYWMzLCBpcm93LCA0KTsKKyAgICBmcm93ICAgKz0gMTY7CisgICAgaXJvdyAgICs9IDE2OworICAgIGRzdCAgICArPSAxNjsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgeF9vdXQ7CisgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX20sIHZhbDJfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzIsIGZyYWMwLCBmcmFjMSwgZnJhYzI7CisgICAgICBMRF9VVzMoZnJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzAsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMCk7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzEsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMSk7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzIsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMik7CisgICAgICBMRF9VVzMoaXJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICBTVUIzKHNyYzAsIGZyYWMwLCBzcmMxLCBmcmFjMSwgc3JjMiwgZnJhYzIsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDFfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMiwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwyX20pOworICAgICAgU1czKHZhbDBfbSwgdmFsMV9tLCB2YWwyX20sIGRzdCwgNCk7CisgICAgICBTVF9VVzMoZnJhYzAsIGZyYWMxLCBmcmFjMiwgaXJvdywgNCk7CisgICAgICBmcm93ICAgKz0gMTI7CisgICAgICBpcm93ICAgKz0gMTI7CisgICAgICBkc3QgICAgKz0gMTI7CisgICAgICBsZW5ndGggLT0gMTI7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gOCkgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxLCBmcmFjMCwgZnJhYzE7CisgICAgICBMRF9VVzIoZnJvdywgNCwgc3JjMCwgc3JjMSk7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzAsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMCk7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzEsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMSk7CisgICAgICBMRF9VVzIoaXJvdywgNCwgc3JjMCwgc3JjMSk7CisgICAgICBTVUIyKHNyYzAsIGZyYWMwLCBzcmMxLCBmcmFjMSwgc3JjMCwgc3JjMSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMV9tKTsKKyAgICAgIFNXMih2YWwwX20sIHZhbDFfbSwgZHN0LCA0KTsKKyAgICAgIFNUX1VXMihmcmFjMCwgZnJhYzEsIGlyb3csIDQpOworICAgICAgZnJvdyAgICs9IDg7CisgICAgICBpcm93ICAgKz0gODsKKyAgICAgIGRzdCAgICArPSA4OworICAgICAgbGVuZ3RoIC09IDg7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNCkgeworICAgICAgdWludDMyX3QgdmFsMF9tOworICAgICAgdjR1MzIgZnJhYzA7CisgICAgICB2NHUzMiBzcmMwID0gTERfVVcoZnJvdyk7CisgICAgICBDQUxDX01VTFRfRklYMV80KHNyYzAsIHlfc2NhbGUsIHNoaWZ0dmFsLCBmcmFjMCk7CisgICAgICBzcmMwID0gTERfVVcoaXJvdyk7CisgICAgICBzcmMwID0gc3JjMCAtIGZyYWMwOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMF9tKTsKKyAgICAgIFNXKHZhbDBfbSwgZHN0KTsKKyAgICAgIFNUX1VXKGZyYWMwLCBpcm93KTsKKyAgICAgIGZyb3cgICArPSA0OworICAgICAgaXJvdyAgICs9IDQ7CisgICAgICBkc3QgICAgKz0gNDsKKyAgICAgIGxlbmd0aCAtPSA0OworICAgIH0KKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBsZW5ndGg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWMgPSAodWludDMyX3QpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSBmcmFjOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBFeHBvcnRSb3dTaHJpbmtfMSh1aW50MzJfdCogaXJvdywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGNvbnN0IHY0dTMyIHNjYWxlID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyh3cmstPmZ4eV9zY2FsZSk7CisgIGNvbnN0IHY0dTMyIHNoaWZ0ID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyhXRUJQX1JFU0NBTEVSX1JGSVgpOworICBjb25zdCB2NGkzMiB6ZXJvID0geyAwIH07CisKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjE2dTggZHN0MDsKKyAgICBMRF9VVzQoaXJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgQ0FMQ19NVUxUX0ZJWF8xNihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzY2FsZSwgc2hpZnQsIGRzdDApOworICAgIFNUX1VCKGRzdDAsIGRzdCk7CisgICAgU1RfU1c0KHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlyb3csIDQpOworICAgIGxlbmd0aCAtPSAxNjsKKyAgICBpcm93ICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2OworICB9CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IHhfb3V0OworICAgIGlmIChsZW5ndGggPj0gMTIpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tLCB2YWwyX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyOworICAgICAgTERfVVczKGlyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMiwgc2NhbGUsIHNoaWZ0LCB2YWwyX20pOworICAgICAgU1czKHZhbDBfbSwgdmFsMV9tLCB2YWwyX20sIGRzdCwgNCk7CisgICAgICBTVF9TVzMoemVybywgemVybywgemVybywgaXJvdywgNCk7CisgICAgICBsZW5ndGggLT0gMTI7CisgICAgICBpcm93ICAgKz0gMTI7CisgICAgICBkc3QgICAgKz0gMTI7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gOCkgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxOworICAgICAgTERfVVcyKGlyb3csIDQsIHNyYzAsIHNyYzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBTVzIodmFsMF9tLCB2YWwxX20sIGRzdCwgNCk7CisgICAgICBTVF9TVzIoemVybywgemVybywgaXJvdywgNCk7CisgICAgICBsZW5ndGggLT0gODsKKyAgICAgIGlyb3cgICArPSA4OworICAgICAgZHN0ICAgICs9IDg7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNCkgeworICAgICAgdWludDMyX3QgdmFsMF9tOworICAgICAgY29uc3QgdjR1MzIgc3JjMCA9IExEX1VXKGlyb3cgKyAwKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBTVyh2YWwwX20sIGRzdCk7CisgICAgICBTVF9TVyh6ZXJvLCBpcm93KTsKKyAgICAgIGxlbmd0aCAtPSA0OworICAgICAgaXJvdyAgICs9IDQ7CisgICAgICBkc3QgICAgKz0gNDsKKyAgICB9CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbGVuZ3RoOyArK3hfb3V0KSB7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0sIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IDA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX01JUFNkc3BSMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHVpbnQzMl90IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIEV4cG9ydFJvd1Nocmlua18wKGZyb3csIGlyb3csIGRzdCwgeF9vdXRfbWF4LCB5c2NhbGUsIHdyayk7CisgIH0gZWxzZSB7CisgICAgRXhwb3J0Um93U2hyaW5rXzEoaXJvdywgZHN0LCB4X291dF9tYXgsIHdyayk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TVNBKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfTUlQU2RzcFIyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAgICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0TVNBKQorCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmY5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX25lb24uYwpAQCAtMCwwICsxLDE4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE5FT04gdmVyc2lvbiBvZiByZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pICYmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisjZGVmaW5lIFJPVU5ERVIgKFdFQlBfUkVTQ0FMRVJfT05FID4+IDEpCisjZGVmaW5lIE1VTFRfRklYX0MoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisjZGVmaW5lIExPQURfMzJ4NChTUkMsIERTVCkgY29uc3QgdWludDMyeDRfdCBEU1QgPSB2bGQxcV91MzIoKFNSQykpCisjZGVmaW5lIExPQURfMzJ4OChTUkMsIERTVDAsIERTVDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQURfMzJ4NChTUkMgKyAwLCBEU1QwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEXzMyeDQoU1JDICsgNCwgRFNUMSkKKworI2RlZmluZSBTVE9SRV8zMng4KFNSQzAsIFNSQzEsIERTVCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2c3QxcV91MzIoKERTVCkgKyAwLCBTUkMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnN0MXFfdTMyKChEU1QpICsgNCwgU1JDMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCk7CisKKyNpZiAoV0VCUF9SRVNDQUxFUl9SRklYID09IDMyKQorI2RlZmluZSBNQUtFX0hBTEZfQ1NUKEMpIHZkdXBxX25fczMyKChpbnQzMl90KSgoQykgPj4gMSkpCisjZGVmaW5lIE1VTFRfRklYKEEsIEIpIC8qIG5vdGU6IEIgaXMgYWN0dWFseSBzY2FsZT4+MS4gU2VlIE1BS0VfSEFMRl9DU1QgKi8gXAorICAgIHZyZWludGVycHJldHFfdTMyX3MzMih2cXJkbXVsaHFfczMyKHZyZWludGVycHJldHFfczMyX3UzMigoQSkpLCAoQikpKQorI2Vsc2UKKyNlcnJvciAiTVVMVF9GSVgvV0VCUF9SRVNDQUxFUl9SRklYIG5lZWQgc29tZSBtb3JlIHdvcmsiCisjZW5kaWYKKworc3RhdGljIHVpbnQzMng0X3QgSW50ZXJwb2xhdGVfTkVPTihjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBpcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBLCB1aW50MzJfdCBCKSB7CisgIExPQURfMzJ4NChmcm93LCBBMCk7CisgIExPQURfMzJ4NChpcm93LCBCMCk7CisgIGNvbnN0IHVpbnQ2NHgyX3QgQzAgPSB2bXVsbF9uX3UzMih2Z2V0X2xvd191MzIoQTApLCBBKTsKKyAgY29uc3QgdWludDY0eDJfdCBDMSA9IHZtdWxsX25fdTMyKHZnZXRfaGlnaF91MzIoQTApLCBBKTsKKyAgY29uc3QgdWludDY0eDJfdCBEMCA9IHZtbGFsX25fdTMyKEMwLCB2Z2V0X2xvd191MzIoQjApLCBCKTsKKyAgY29uc3QgdWludDY0eDJfdCBEMSA9IHZtbGFsX25fdTMyKEMxLCB2Z2V0X2hpZ2hfdTMyKEIwKSwgQik7CisgIGNvbnN0IHVpbnQzMng0X3QgRSA9IHZjb21iaW5lX3UzMigKKyAgICAgIHZyc2hybl9uX3U2NChEMCwgV0VCUF9SRVNDQUxFUl9SRklYKSwKKyAgICAgIHZyc2hybl9uX3U2NChEMSwgV0VCUF9SRVNDQUxFUl9SRklYKSk7CisgIHJldHVybiBFOworfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9ORU9OKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgbWF4X3NwYW4gPSB4X291dF9tYXggJiB+NzsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgZnlfc2NhbGUgPSB3cmstPmZ5X3NjYWxlOworICBjb25zdCBpbnQzMng0X3QgZnlfc2NhbGVfaGFsZiA9IE1BS0VfSEFMRl9DU1QoZnlfc2NhbGUpOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+eV9zdWIgIT0gMCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IG1heF9zcGFuOyB4X291dCArPSA4KSB7CisgICAgICBMT0FEXzMyeDQoZnJvdyArIHhfb3V0ICsgMCwgQTApOworICAgICAgTE9BRF8zMng0KGZyb3cgKyB4X291dCArIDQsIEExKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQjAgPSBNVUxUX0ZJWChBMCwgZnlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEIxID0gTVVMVF9GSVgoQTEsIGZ5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDE2eDRfdCBDMCA9IHZtb3ZuX3UzMihCMCk7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEMxID0gdm1vdm5fdTMyKEIxKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBEID0gdm1vdm5fdTE2KHZjb21iaW5lX3UxNihDMCwgQzEpKTsKKyAgICAgIHZzdDFfdTgoZHN0ICsgeF9vdXQsIEQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWF9DKEosIGZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBtYXhfc3BhbjsgeF9vdXQgKz0gOCkgeworICAgICAgY29uc3QgdWludDMyeDRfdCBDMCA9CisgICAgICAgICAgSW50ZXJwb2xhdGVfTkVPTihmcm93ICsgeF9vdXQgKyAwLCBpcm93ICsgeF9vdXQgKyAwLCBBLCBCKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQzEgPQorICAgICAgICAgIEludGVycG9sYXRlX05FT04oZnJvdyArIHhfb3V0ICsgNCwgaXJvdyArIHhfb3V0ICsgNCwgQSwgQik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEQwID0gTVVMVF9GSVgoQzAsIGZ5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBEMSA9IE1VTFRfRklYKEMxLCBmeV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgRTAgPSB2bW92bl91MzIoRDApOworICAgICAgY29uc3QgdWludDE2eDRfdCBFMSA9IHZtb3ZuX3UzMihEMSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgRiA9IHZtb3ZuX3UxNih2Y29tYmluZV91MTYoRTAsIEUxKSk7CisgICAgICB2c3QxX3U4KGRzdCArIHhfb3V0LCBGKTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50NjRfdCBJID0gKHVpbnQ2NF90KUEgKiBmcm93W3hfb3V0XQorICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClCICogaXJvd1t4X291dF07CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVhfQyhKLCBmeV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19ORU9OKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgbWF4X3NwYW4gPSB4X291dF9tYXggJiB+NzsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgY29uc3QgdWludDMyX3QgZnh5X3NjYWxlID0gd3JrLT5meHlfc2NhbGU7CisgIGNvbnN0IHVpbnQzMng0X3QgemVybyA9IHZkdXBxX25fdTMyKDApOworICBjb25zdCBpbnQzMng0X3QgeXNjYWxlX2hhbGYgPSBNQUtFX0hBTEZfQ1NUKHlzY2FsZSk7CisgIGNvbnN0IGludDMyeDRfdCBmeHlfc2NhbGVfaGFsZiA9IE1BS0VfSEFMRl9DU1QoZnh5X3NjYWxlKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBpZiAoeXNjYWxlKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbWF4X3NwYW47IHhfb3V0ICs9IDgpIHsKKyAgICAgIExPQURfMzJ4OChmcm93ICsgeF9vdXQsIGluMCwgaW4xKTsKKyAgICAgIExPQURfMzJ4OChpcm93ICsgeF9vdXQsIGluMiwgaW4zKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQTAgPSBNVUxUX0ZJWChpbjAsIHlzY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQTEgPSBNVUxUX0ZJWChpbjEsIHlzY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQjAgPSB2cXN1YnFfdTMyKGluMiwgQTApOworICAgICAgY29uc3QgdWludDMyeDRfdCBCMSA9IHZxc3VicV91MzIoaW4zLCBBMSk7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEMwID0gTVVMVF9GSVgoQjAsIGZ4eV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQzEgPSBNVUxUX0ZJWChCMSwgZnh5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDE2eDRfdCBEMCA9IHZtb3ZuX3UzMihDMCk7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEQxID0gdm1vdm5fdTMyKEMxKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBFID0gdm1vdm5fdTE2KHZjb21iaW5lX3UxNihEMCwgRDEpKTsKKyAgICAgIHZzdDFfdTgoZHN0ICsgeF9vdXQsIEUpOworICAgICAgU1RPUkVfMzJ4OChBMCwgQTEsIGlyb3cgKyB4X291dCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9ICh1aW50MzJfdClNVUxUX0ZJWF9DKGZyb3dbeF9vdXRdLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYX0MoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IG1heF9zcGFuOyB4X291dCArPSA4KSB7CisgICAgICBMT0FEXzMyeDgoaXJvdyArIHhfb3V0LCBpbjAsIGluMSk7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEEwID0gTVVMVF9GSVgoaW4wLCBmeHlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEExID0gTVVMVF9GSVgoaW4xLCBmeHlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEIwID0gdm1vdm5fdTMyKEEwKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgQjEgPSB2bW92bl91MzIoQTEpOworICAgICAgY29uc3QgdWludDh4OF90IEMgPSB2bW92bl91MTYodmNvbWJpbmVfdTE2KEIwLCBCMSkpOworICAgICAgdnN0MV91OChkc3QgKyB4X291dCwgQyk7CisgICAgICBTVE9SRV8zMng4KHplcm8sIHplcm8sIGlyb3cgKyB4X291dCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYX0MoaXJvd1t4X291dF0sIGZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSAwOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRORU9OKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfTkVPTjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfTkVPTjsKK30KKworI2Vsc2UgICAgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0TkVPTikKKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjNTBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfc3NlMi5jCkBAIC0wLDAgKzEsMzczIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpICYmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcGxlbWVudGF0aW9ucyBvZiBjcml0aWNhbCBmdW5jdGlvbnMgSW1wb3J0Um93IC8gRXhwb3J0Um93CisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisvLyBpbnB1dDogOCBieXRlcyBBQkNERUZHSCAtPiBvdXRwdXQ6IEEwRTBCMEYwQzBHMEQwSDAKK3N0YXRpYyB2b2lkIExvYWRUd29QaXhlbHNfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIF9fbTEyOGkqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShzcmMpKTsgIC8vIEFCQ0RFRkdICisgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV91bnBhY2tsb19lcGk4KEEsIHplcm8pOyAgICAgICAgICAgICAgLy8gQTBCMEMwRDBFMEYwRzBIMAorICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc3JsaV9zaTEyOChCLCA4KTsgICAgICAgICAgICAgICAgICAgIC8vIEUwRjBHMEgwCisgICpvdXQgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQiwgQyk7Cit9CisKKy8vIGlucHV0OiA4IGJ5dGVzIEFCQ0RFRkdIIC0+IG91dHB1dDogQTBCMEMwRDBFMEYwRzBIMAorc3RhdGljIHZvaWQgTG9hZEVpZ2h0UGl4ZWxzX1NTRTIoY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBfX20xMjhpKiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoc3JjKSk7ICAvLyBBQkNERUZHSAorICAqb3V0ID0gX21tX3VucGFja2xvX2VwaTgoQSwgemVybyk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX1NTRTIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93X2VuZCA9IGZyb3cgKyB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9hZGQgPSB3cmstPnhfYWRkOworICBpbnQgYWNjdW0gPSB4X2FkZDsKKyAgX19tMTI4aSBjdXJfcGl4ZWxzOworCisgIC8vIFNTRTIgaW1wbGVtZW50YXRpb24gb25seSB3b3JrcyB3aXRoIDE2YiBzaWduZWQgYXJpdGhtZXRpYyBhdCBtYXguCisgIGlmICh3cmstPnNyY193aWR0aCA8IDggfHwgYWNjdW0gPj0gKDEgPDwgMTUpKSB7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX0Mod3JrLCBzcmMpOworICAgIHJldHVybjsKKyAgfQorCisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT54X2V4cGFuZCk7CisgIGlmICh3cmstPm51bV9jaGFubmVscyA9PSA0KSB7CisgICAgTG9hZFR3b1BpeGVsc19TU0UyKHNyYywgJmN1cl9waXhlbHMpOworICAgIHNyYyArPSA0OworICAgIHdoaWxlICgxKSB7CisgICAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0MV9lcGkzMigoKHhfYWRkIC0gYWNjdW0pIDw8IDE2KSB8IGFjY3VtKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX21hZGRfZXBpMTYoY3VyX3BpeGVscywgbXVsdCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilmcm93LCBvdXQpOworICAgICAgZnJvdyArPSA0OworICAgICAgaWYgKGZyb3cgPj0gZnJvd19lbmQpIGJyZWFrOworICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKKyAgICAgIGlmIChhY2N1bSA8IDApIHsKKyAgICAgICAgTG9hZFR3b1BpeGVsc19TU0UyKHNyYywgJmN1cl9waXhlbHMpOworICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgYWNjdW0gKz0geF9hZGQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBsZWZ0OworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyY19saW1pdCA9IHNyYyArIHdyay0+c3JjX3dpZHRoIC0gODsKKyAgICBMb2FkRWlnaHRQaXhlbHNfU1NFMihzcmMsICZjdXJfcGl4ZWxzKTsKKyAgICBzcmMgKz0gNzsKKyAgICBsZWZ0ID0gNzsKKyAgICB3aGlsZSAoMSkgeworICAgICAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX2N2dHNpMzJfc2kxMjgoKCh4X2FkZCAtIGFjY3VtKSA8PCAxNikgfCBhY2N1bSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9tYWRkX2VwaTE2KGN1cl9waXhlbHMsIG11bHQpOworICAgICAgYXNzZXJ0KHNpemVvZigqZnJvdykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oKHVpbnQ4X3QqKWZyb3csIF9tbV9jdnRzaTEyOF9zaTMyKG91dCkpOworICAgICAgZnJvdyArPSAxOworICAgICAgaWYgKGZyb3cgPj0gZnJvd19lbmQpIGJyZWFrOworICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKKyAgICAgIGlmIChhY2N1bSA8IDApIHsKKyAgICAgICAgaWYgKC0tbGVmdCkgeworICAgICAgICAgIGN1cl9waXhlbHMgPSBfbW1fc3JsaV9zaTEyOChjdXJfcGl4ZWxzLCAyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmMgPD0gc3JjX2xpbWl0KSB7CisgICAgICAgICAgTG9hZEVpZ2h0UGl4ZWxzX1NTRTIoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgICAgICAgc3JjICs9IDc7CisgICAgICAgICAgbGVmdCA9IDc7CisgICAgICAgIH0gZWxzZSB7ICAgLy8gdGFpbAorICAgICAgICAgIGN1cl9waXhlbHMgPSBfbW1fc3JsaV9zaTEyOChjdXJfcGl4ZWxzLCAyKTsKKyAgICAgICAgICBjdXJfcGl4ZWxzID0gX21tX2luc2VydF9lcGkxNihjdXJfcGl4ZWxzLCBzcmNbMV0sIDEpOworICAgICAgICAgIHNyYyArPSAxOworICAgICAgICAgIGxlZnQgPSAxOworICAgICAgICB9CisgICAgICAgIGFjY3VtICs9IHhfYWRkOworICAgICAgfQorICAgIH0KKyAgfQorICBhc3NlcnQoYWNjdW0gPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX1NTRTIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdWIgPSB3cmstPnhfc3ViOworICBpbnQgYWNjdW0gPSAwOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIG11bHQwID0gX21tX3NldDFfZXBpMTYoeF9zdWIpOworICBjb25zdCBfX20xMjhpIG11bHQxID0gX21tX3NldDFfZXBpMzIod3JrLT5meF9zY2FsZSk7CisgIGNvbnN0IF9fbTEyOGkgcm91bmRlciA9IF9tbV9zZXRfZXBpMzIoMCwgUk9VTkRFUiwgMCwgUk9VTkRFUik7CisgIF9fbTEyOGkgc3VtID0gemVybzsKKyAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvd19lbmQgPSB3cmstPmZyb3cgKyA0ICogd3JrLT5kc3Rfd2lkdGg7CisKKyAgaWYgKHdyay0+bnVtX2NoYW5uZWxzICE9IDQgfHwgd3JrLT54X2FkZCA+ICh4X3N1YiA8PCA3KSkgeworICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua19DKHdyaywgc3JjKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGFzc2VydCghd3JrLT54X2V4cGFuZCk7CisKKyAgZm9yICg7IGZyb3cgPCBmcm93X2VuZDsgZnJvdyArPSA0KSB7CisgICAgX19tMTI4aSBiYXNlID0gemVybzsKKyAgICBhY2N1bSArPSB3cmstPnhfYWRkOworICAgIHdoaWxlIChhY2N1bSA+IDApIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihzcmMpKTsKKyAgICAgIHNyYyArPSA0OworICAgICAgYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KEEsIHplcm8pOworICAgICAgLy8gVG8gYXZvaWQgb3ZlcmZsb3csIHdlIG5lZWQ6IGJhc2UgKiB4X2FkZCAvIHhfc3ViIDwgMzI3NjgKKyAgICAgIC8vID0+IHhfYWRkIDwgeF9zdWIgPDwgNy4gVGhhdCdzIGEgMS8xMjggcmVkdWN0aW9uIHJhdGlvIGxpbWl0LgorICAgICAgc3VtID0gX21tX2FkZF9lcGkxNihzdW0sIGJhc2UpOworICAgICAgYWNjdW0gLT0geF9zdWI7CisgICAgfQorICAgIHsgICAgLy8gRW1pdCBuZXh0IGhvcml6b250YWwgcGl4ZWwuCisgICAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0MV9lcGkxNigtYWNjdW0pOworICAgICAgY29uc3QgX19tMTI4aSBmcmFjMCA9IF9tbV9tdWxsb19lcGkxNihiYXNlLCBtdWx0KTsgIC8vIDE2YiB4IDE2YiAtPiAzMmIKKyAgICAgIGNvbnN0IF9fbTEyOGkgZnJhYzEgPSBfbW1fbXVsaGlfZXB1MTYoYmFzZSwgbXVsdCk7CisgICAgICBjb25zdCBfX20xMjhpIGZyYWMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoZnJhYzAsIGZyYWMxKTsgIC8vIGZyYWMgaXMgMzJiCisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX211bGxvX2VwaTE2KHN1bSwgbXVsdDApOworICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9tdWxoaV9lcHUxNihzdW0sIG11bHQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQTAsIEExKTsgICAgICAvLyBzdW0gKiB4X3N1YgorICAgICAgY29uc3QgX19tMTI4aSBmcm93X291dCA9IF9tbV9zdWJfZXBpMzIoQjAsIGZyYWMpOyAgIC8vIHN1bSAqIHhfc3ViIC0gZnJhYworICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zcmxpX2VwaTY0KGZyYWMsIDMyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fbXVsX2VwdTMyKGZyYWMsIG11bHQxKTsgICAgICAvLyAzMmIgeCAxNmIgLT4gNjRiCisgICAgICBjb25zdCBfX20xMjhpIEQyID0gX21tX211bF9lcHUzMihEMCwgbXVsdDEpOworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9hZGRfZXBpNjQoRDEsIHJvdW5kZXIpOworICAgICAgY29uc3QgX19tMTI4aSBFMiA9IF9tbV9hZGRfZXBpNjQoRDIsIHJvdW5kZXIpOworICAgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9zaHVmZmxlX2VwaTMyKEUxLCAxIHwgKDMgPDwgMikpOworICAgICAgY29uc3QgX19tMTI4aSBGMiA9IF9tbV9zaHVmZmxlX2VwaTMyKEUyLCAxIHwgKDMgPDwgMikpOworICAgICAgY29uc3QgX19tMTI4aSBHID0gX21tX3VucGFja2xvX2VwaTMyKEYxLCBGMik7CisgICAgICBzdW0gPSBfbW1fcGFja3NfZXBpMzIoRywgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilmcm93LCBmcm93X291dCk7CisgICAgfQorICB9CisgIGFzc2VydChhY2N1bSA9PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBleHBvcnQKKworLy8gbG9hZCAqc3JjIGFzIGVwaTY0LCBtdWx0aXBseSBieSBtdWx0IGFuZCBzdG9yZSByZXN1bHQgaW4gW291dDAgLi4uIG91dDNdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoY29uc3QgcmVzY2FsZXJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IG11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MykgeworICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgMCkpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgNCkpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3NybGlfZXBpNjQoQTAsIDMyKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmxpX2VwaTY0KEExLCAzMik7CisgIGlmIChtdWx0ICE9IE5VTEwpIHsKKyAgICAqb3V0MCA9IF9tbV9tdWxfZXB1MzIoQTAsICptdWx0KTsKKyAgICAqb3V0MSA9IF9tbV9tdWxfZXB1MzIoQTEsICptdWx0KTsKKyAgICAqb3V0MiA9IF9tbV9tdWxfZXB1MzIoQTIsICptdWx0KTsKKyAgICAqb3V0MyA9IF9tbV9tdWxfZXB1MzIoQTMsICptdWx0KTsKKyAgfSBlbHNlIHsKKyAgICAqb3V0MCA9IEEwOworICAgICpvdXQxID0gQTE7CisgICAgKm91dDIgPSBBMjsKKyAgICAqb3V0MyA9IEEzOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByb2Nlc3NSb3dfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBBMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBtdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0X2VwaTMyKDB4ZmZmZmZmZmZ1LCAwLCAweGZmZmZmZmZmdSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbXVsX2VwdTMyKCpBMCwgKm11bHQpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX211bF9lcHUzMigqQTEsICptdWx0KTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV9tdWxfZXB1MzIoKkEyLCAqbXVsdCk7CisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fbXVsX2VwdTMyKCpBMywgKm11bHQpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk2NChCMCwgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTY0KEIxLCByb3VuZGVyKTsKKyAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV9hZGRfZXBpNjQoQjIsIHJvdW5kZXIpOworICBjb25zdCBfX20xMjhpIEMzID0gX21tX2FkZF9lcGk2NChCMywgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fc3JsaV9lcGk2NChDMCwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9zcmxpX2VwaTY0KEMxLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworI2lmIChXRUJQX1JFU0NBTEVSX1JGSVggPCAzMikKKyAgY29uc3QgX19tMTI4aSBEMiA9CisgICAgICBfbW1fYW5kX3NpMTI4KF9tbV9zbGxpX2VwaTY0KEMyLCAzMiAtIFdFQlBfUkVTQ0FMRVJfUkZJWCksIG1hc2spOworICBjb25zdCBfX20xMjhpIEQzID0KKyAgICAgIF9tbV9hbmRfc2kxMjgoX21tX3NsbGlfZXBpNjQoQzMsIDMyIC0gV0VCUF9SRVNDQUxFUl9SRklYKSwgbWFzayk7CisjZWxzZQorICBjb25zdCBfX20xMjhpIEQyID0gX21tX2FuZF9zaTEyOChDMiwgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgRDMgPSBfbW1fYW5kX3NpMTI4KEMzLCBtYXNrKTsKKyNlbmRpZgorICBjb25zdCBfX20xMjhpIEUwID0gX21tX29yX3NpMTI4KEQwLCBEMik7CisgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fb3Jfc2kxMjgoRDEsIEQzKTsKKyAgY29uc3QgX19tMTI4aSBGID0gX21tX3BhY2tzX2VwaTMyKEUwLCBFMSk7CisgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9wYWNrdXNfZXBpMTYoRiwgRik7CisgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKWRzdCwgRyk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX1NTRTIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9zZXRfZXBpMzIoMCwgd3JrLT5meV9zY2FsZSwgMCwgd3JrLT5meV9zY2FsZSk7CisKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDAgJiYgd3JrLT55X3N1YiArIHdyay0+eV9hY2N1bSA+PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgKyA4IDw9IHhfb3V0X21heDsgeF9vdXQgKz0gOCkgeworICAgICAgX19tMTI4aSBBMCwgQTEsIEEyLCBBMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihmcm93ICsgeF9vdXQsIE5VTEwsICZBMCwgJkExLCAmQTIsICZBMyk7CisgICAgICBQcm9jZXNzUm93X1NTRTIoJkEwLCAmQTEsICZBMiwgJkEzLCAmbXVsdCwgZHN0ICsgeF9vdXQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBjb25zdCBfX20xMjhpIG1BID0gX21tX3NldF9lcGkzMigwLCBBLCAwLCBBKTsKKyAgICBjb25zdCBfX20xMjhpIG1CID0gX21tX3NldF9lcGkzMigwLCBCLCAwLCBCKTsKKyAgICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzLCBCMCwgQjEsIEIyLCBCMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihmcm93ICsgeF9vdXQsICZtQSwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihpcm93ICsgeF9vdXQsICZtQiwgJkIwLCAmQjEsICZCMiwgJkIzKTsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9hZGRfZXBpNjQoQTAsIEIwKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hZGRfZXBpNjQoQTEsIEIxKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV9hZGRfZXBpNjQoQTIsIEIyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMyA9IF9tbV9hZGRfZXBpNjQoQTMsIEIzKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9hZGRfZXBpNjQoQzAsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX2FkZF9lcGk2NChDMSwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fYWRkX2VwaTY0KEMyLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMyA9IF9tbV9hZGRfZXBpNjQoQzMsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX3NybGlfZXBpNjQoRDAsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc3JsaV9lcGk2NChEMSwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMiA9IF9tbV9zcmxpX2VwaTY0KEQyLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUzID0gX21tX3NybGlfZXBpNjQoRDMsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIFByb2Nlc3NSb3dfU1NFMigmRTAsICZFMSwgJkUyLCAmRTMsICZtdWx0LCBkc3QgKyB4X291dCk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogZnJvd1t4X291dF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqIGlyb3dbeF9vdXRdOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBpZiAoeXNjYWxlKSB7CisgICAgY29uc3QgaW50IHNjYWxlX3h5ID0gd3JrLT5meHlfc2NhbGU7CisgICAgY29uc3QgX19tMTI4aSBtdWx0X3h5ID0gX21tX3NldF9lcGkzMigwLCBzY2FsZV94eSwgMCwgc2NhbGVfeHkpOworICAgIGNvbnN0IF9fbTEyOGkgbXVsdF95ID0gX21tX3NldF9lcGkzMigwLCB5c2NhbGUsIDAsIHlzY2FsZSk7CisgICAgY29uc3QgX19tMTI4aSByb3VuZGVyID0gX21tX3NldF9lcGkzMigwLCBST1VOREVSLCAwLCBST1VOREVSKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgKyA4IDw9IHhfb3V0X21heDsgeF9vdXQgKz0gOCkgeworICAgICAgX19tMTI4aSBBMCwgQTEsIEEyLCBBMywgQjAsIEIxLCBCMiwgQjM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoaXJvdyArIHhfb3V0LCBOVUxMLCAmQTAsICZBMSwgJkEyLCAmQTMpOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGZyb3cgKyB4X291dCwgJm11bHRfeSwgJkIwLCAmQjEsICZCMiwgJkIzKTsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9hZGRfZXBpNjQoQjAsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FkZF9lcGk2NChCMSwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fYWRkX2VwaTY0KEIyLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMyA9IF9tbV9hZGRfZXBpNjQoQjMsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX3NybGlfZXBpNjQoQzAsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7ICAgLy8gPSBmcmFjCisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fc3JsaV9lcGk2NChDMSwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9zcmxpX2VwaTY0KEMyLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEQzID0gX21tX3NybGlfZXBpNjQoQzMsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fc3ViX2VwaTY0KEEwLCBEMCk7ICAgLy8gaXJvd1t4XSAtIGZyYWMKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zdWJfZXBpNjQoQTEsIEQxKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMiA9IF9tbV9zdWJfZXBpNjQoQTIsIEQyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMyA9IF9tbV9zdWJfZXBpNjQoQTMsIEQzKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBGMiA9IF9tbV9zbGxpX2VwaTY0KEQyLCAzMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRjMgPSBfbW1fc2xsaV9lcGk2NChEMywgMzIpOworICAgICAgICBjb25zdCBfX20xMjhpIEcwID0gX21tX29yX3NpMTI4KEQwLCBGMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRzEgPSBfbW1fb3Jfc2kxMjgoRDEsIEYzKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGlyb3cgKyB4X291dCArIDApLCBHMCk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyA0KSwgRzEpOworICAgICAgICBQcm9jZXNzUm93X1NTRTIoJkUwLCAmRTEsICZFMiwgJkUzLCAmbXVsdF94eSwgZHN0ICsgeF9vdXQpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWMgPSAoaW50KU1VTFRfRklYKGZyb3dbeF9vdXRdLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IHdyay0+Znh5X3NjYWxlOworICAgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9zZXRfZXBpMzIoMCwgc2NhbGUsIDAsIHNjYWxlKTsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGlyb3cgKyB4X291dCwgTlVMTCwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyAwKSwgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgNCksIHplcm8pOworICAgICAgUHJvY2Vzc1Jvd19TU0UyKCZBMCwgJkExLCAmQTIsICZBMywgJm11bHQsIGRzdCArIHhfb3V0KTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0sIHNjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IDA7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBNVUxUX0ZJWAorI3VuZGVmIFJPVU5ERVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0U1NFMih2b2lkKSB7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCA9IFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX1NTRTI7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX1NTRTI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX1NTRTI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODljZTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBkaXN0b3J0aW9uIGNhbGN1bGF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTSU0gLyBQU05SCisKKy8vIGhhdC1zaGFwZWQgZmlsdGVyLiBTdW0gb2YgY29lZmZpY2llbnRzIGlzIGVxdWFsIHRvIDE2Lgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtXZWlnaHRbMiAqIFZQOF9TU0lNX0tFUk5FTCArIDFdID0geworICAxLCAyLCAzLCA0LCAzLCAyLCAxCit9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtXZWlnaHRTdW0gPSAxNiAqIDE2OyAgIC8vIHN1bXtrV2VpZ2h0fV4yCisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgU1NJTUNhbGN1bGF0aW9uKAorICAgIGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzLCB1aW50MzJfdCBOICAvKm51bSBzYW1wbGVzKi8pIHsKKyAgY29uc3QgdWludDMyX3QgdzIgPSAgTiAqIE47CisgIGNvbnN0IHVpbnQzMl90IEMxID0gMjAgKiB3MjsKKyAgY29uc3QgdWludDMyX3QgQzIgPSA2MCAqIHcyOworICBjb25zdCB1aW50MzJfdCBDMyA9IDggKiA4ICogdzI7ICAgLy8gJ2RhcmsnIGxpbWl0IH49IDYKKyAgY29uc3QgdWludDY0X3QgeG14bSA9ICh1aW50NjRfdClzdGF0cy0+eG0gKiBzdGF0cy0+eG07CisgIGNvbnN0IHVpbnQ2NF90IHlteW0gPSAodWludDY0X3Qpc3RhdHMtPnltICogc3RhdHMtPnltOworICBpZiAoeG14bSArIHlteW0gPj0gQzMpIHsKKyAgICBjb25zdCBpbnQ2NF90IHhteW0gPSAoaW50NjRfdClzdGF0cy0+eG0gKiBzdGF0cy0+eW07CisgICAgY29uc3QgaW50NjRfdCBzeHkgPSAoaW50NjRfdClzdGF0cy0+eHltICogTiAtIHhteW07ICAgIC8vIGNhbiBiZSBuZWdhdGl2ZQorICAgIGNvbnN0IHVpbnQ2NF90IHN4eCA9ICh1aW50NjRfdClzdGF0cy0+eHhtICogTiAtIHhteG07CisgICAgY29uc3QgdWludDY0X3Qgc3l5ID0gKHVpbnQ2NF90KXN0YXRzLT55eW0gKiBOIC0geW15bTsKKyAgICAvLyB3ZSBkZXNjYWxlIGJ5IDggdG8gcHJldmVudCBvdmVyZmxvdyBkdXJpbmcgdGhlIGZudW0vZmRlbiBtdWx0aXBseS4KKyAgICBjb25zdCB1aW50NjRfdCBudW1fUyA9ICgyICogKHVpbnQ2NF90KShzeHkgPCAwID8gMCA6IHN4eSkgKyBDMikgPj4gODsKKyAgICBjb25zdCB1aW50NjRfdCBkZW5fUyA9IChzeHggKyBzeXkgKyBDMikgPj4gODsKKyAgICBjb25zdCB1aW50NjRfdCBmbnVtID0gKDIgKiB4bXltICsgQzEpICogbnVtX1M7CisgICAgY29uc3QgdWludDY0X3QgZmRlbiA9ICh4bXhtICsgeW15bSArIEMxKSAqIGRlbl9TOworICAgIGNvbnN0IGRvdWJsZSByID0gKGRvdWJsZSlmbnVtIC8gZmRlbjsKKyAgICBhc3NlcnQociA+PSAwLiAmJiByIDw9IDEuMCk7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIDEuOyAgIC8vIGFyZWEgaXMgdG9vIGRhcmsgdG8gY29udHJpYnV0ZSBtZWFuaW5nZnVsbHkKK30KKworZG91YmxlIFZQOFNTSU1Gcm9tU3RhdHMoY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgcmV0dXJuIFNTSU1DYWxjdWxhdGlvbihzdGF0cywga1dlaWdodFN1bSk7Cit9CisKK2RvdWJsZSBWUDhTU0lNRnJvbVN0YXRzQ2xpcHBlZChjb25zdCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICByZXR1cm4gU1NJTUNhbGN1bGF0aW9uKHN0YXRzLCBzdGF0cy0+dyk7Cit9CisKK3N0YXRpYyBkb3VibGUgU1NJTUdldENsaXBwZWRfQyhjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG8sIGludCB5bywgaW50IFcsIGludCBIKSB7CisgIFZQOERpc3RvU3RhdHMgc3RhdHMgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgY29uc3QgaW50IHltaW4gPSAoeW8gLSBWUDhfU1NJTV9LRVJORUwgPCAwKSA/IDAgOiB5byAtIFZQOF9TU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHltYXggPSAoeW8gKyBWUDhfU1NJTV9LRVJORUwgPiBIIC0gMSkgPyBIIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHlvICsgVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeG1pbiA9ICh4byAtIFZQOF9TU0lNX0tFUk5FTCA8IDApID8gMCA6IHhvIC0gVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeG1heCA9ICh4byArIFZQOF9TU0lNX0tFUk5FTCA+IFcgLSAxKSA/IFcgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeG8gKyBWUDhfU1NJTV9LRVJORUw7CisgIGludCB4LCB5OworICBzcmMxICs9IHltaW4gKiBzdHJpZGUxOworICBzcmMyICs9IHltaW4gKiBzdHJpZGUyOworICBmb3IgKHkgPSB5bWluOyB5IDw9IHltYXg7ICsreSwgc3JjMSArPSBzdHJpZGUxLCBzcmMyICs9IHN0cmlkZTIpIHsKKyAgICBmb3IgKHggPSB4bWluOyB4IDw9IHhtYXg7ICsreCkgeworICAgICAgY29uc3QgdWludDMyX3QgdyA9IGtXZWlnaHRbVlA4X1NTSU1fS0VSTkVMICsgeCAtIHhvXQorICAgICAgICAgICAgICAgICAgICAgICAqIGtXZWlnaHRbVlA4X1NTSU1fS0VSTkVMICsgeSAtIHlvXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMxID0gc3JjMVt4XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMyID0gc3JjMlt4XTsKKyAgICAgIHN0YXRzLncgICArPSB3OworICAgICAgc3RhdHMueG0gICs9IHcgKiBzMTsKKyAgICAgIHN0YXRzLnltICArPSB3ICogczI7CisgICAgICBzdGF0cy54eG0gKz0gdyAqIHMxICogczE7CisgICAgICBzdGF0cy54eW0gKz0gdyAqIHMxICogczI7CisgICAgICBzdGF0cy55eW0gKz0gdyAqIHMyICogczI7CisgICAgfQorICB9CisgIHJldHVybiBWUDhTU0lNRnJvbVN0YXRzQ2xpcHBlZCgmc3RhdHMpOworfQorCitzdGF0aWMgZG91YmxlIFNTSU1HZXRfQyhjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyKSB7CisgIFZQOERpc3RvU3RhdHMgc3RhdHMgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPD0gMiAqIFZQOF9TU0lNX0tFUk5FTDsgKyt5LCBzcmMxICs9IHN0cmlkZTEsIHNyYzIgKz0gc3RyaWRlMikgeworICAgIGZvciAoeCA9IDA7IHggPD0gMiAqIFZQOF9TU0lNX0tFUk5FTDsgKyt4KSB7CisgICAgICBjb25zdCB1aW50MzJfdCB3ID0ga1dlaWdodFt4XSAqIGtXZWlnaHRbeV07CisgICAgICBjb25zdCB1aW50MzJfdCBzMSA9IHNyYzFbeF07CisgICAgICBjb25zdCB1aW50MzJfdCBzMiA9IHNyYzJbeF07CisgICAgICBzdGF0cy54bSAgKz0gdyAqIHMxOworICAgICAgc3RhdHMueW0gICs9IHcgKiBzMjsKKyAgICAgIHN0YXRzLnh4bSArPSB3ICogczEgKiBzMTsKKyAgICAgIHN0YXRzLnh5bSArPSB3ICogczEgKiBzMjsKKyAgICAgIHN0YXRzLnl5bSArPSB3ICogczIgKiBzMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOFNTSU1Gcm9tU3RhdHMoJnN0YXRzKTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorc3RhdGljIHVpbnQzMl90IEFjY3VtdWxhdGVTU0VfQyhjb25zdCB1aW50OF90KiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgbGVuKSB7CisgIGludCBpOworICB1aW50MzJfdCBzc2UyID0gMDsKKyAgYXNzZXJ0KGxlbiA8PSA2NTUzNSk7ICAvLyB0byBlbnN1cmUgdGhhdCBhY2N1bXVsYXRpb24gZml0cyB3aXRoaW4gdWludDMyX3QKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50MzJfdCBkaWZmID0gc3JjMVtpXSAtIHNyYzJbaV07CisgICAgc3NlMiArPSBkaWZmICogZGlmZjsKKyAgfQorICByZXR1cm4gc3NlMjsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKK1ZQOFNTSU1HZXRGdW5jIFZQOFNTSU1HZXQ7CitWUDhTU0lNR2V0Q2xpcHBlZEZ1bmMgVlA4U1NJTUdldENsaXBwZWQ7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCitWUDhBY2N1bXVsYXRlU1NFRnVuYyBWUDhBY2N1bXVsYXRlU1NFOworI2VuZGlmCisKK2V4dGVybiB2b2lkIFZQOFNTSU1Ec3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOFNTSU1Ec3BJbml0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgVlA4U1NJTUdldENsaXBwZWQgPSBTU0lNR2V0Q2xpcHBlZF9DOworICBWUDhTU0lNR2V0ID0gU1NJTUdldF9DOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIFZQOEFjY3VtdWxhdGVTU0UgPSBBY2N1bXVsYXRlU1NFX0M7CisjZW5kaWYKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4U1NJTURzcEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbV9zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW1fc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2IwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW1fc3NlMi5jCkBAIC0wLDAgKzEsMTY1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIGRpc3RvcnRpb24gY2FsY3VsYXRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorCisvLyBIZWxwZXIgZnVuY3Rpb24KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN1YnRyYWN0QW5kU3F1YXJlX1NTRTIoY29uc3QgX19tMTI4aSBhLCBjb25zdCBfX20xMjhpIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHN1bSkgeworICAvLyB0YWtlIGFicyhhLWIpIGluIDhiCisgIGNvbnN0IF9fbTEyOGkgYV9iID0gX21tX3N1YnNfZXB1OChhLCBiKTsKKyAgY29uc3QgX19tMTI4aSBiX2EgPSBfbW1fc3Vic19lcHU4KGIsIGEpOworICBjb25zdCBfX20xMjhpIGFic19hX2IgPSBfbW1fb3Jfc2kxMjgoYV9iLCBiX2EpOworICAvLyB6ZXJvLWV4dGVuZCB0byAxNmIKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KGFic19hX2IsIHplcm8pOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTgoYWJzX2FfYiwgemVybyk7CisgIC8vIG11bHRpcGx5IHdpdGggc2VsZgorICBjb25zdCBfX20xMjhpIHN1bTEgPSBfbW1fbWFkZF9lcGkxNihDMCwgQzApOworICBjb25zdCBfX20xMjhpIHN1bTIgPSBfbW1fbWFkZF9lcGkxNihDMSwgQzEpOworICAqc3VtID0gX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTSU0gLyBQU05SIGVudHJ5IHBvaW50CisKK3N0YXRpYyB1aW50MzJfdCBBY2N1bXVsYXRlU1NFX1NTRTIoY29uc3QgdWludDhfdCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IGxlbikgeworICBpbnQgaSA9IDA7CisgIHVpbnQzMl90IHNzZTIgPSAwOworICBpZiAobGVuID49IDE2KSB7CisgICAgY29uc3QgaW50IGxpbWl0ID0gbGVuIC0gMzI7CisgICAgaW50MzJfdCB0bXBbNF07CisgICAgX19tMTI4aSBzdW0xOworICAgIF9fbTEyOGkgc3VtID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMVtpXSk7CisgICAgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzJbaV0pOworICAgIGkgKz0gMTY7CisgICAgd2hpbGUgKGkgPD0gbGltaXQpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMxW2ldKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMyW2ldKTsKKyAgICAgIF9fbTEyOGkgc3VtMjsKKyAgICAgIGkgKz0gMTY7CisgICAgICBTdWJ0cmFjdEFuZFNxdWFyZV9TU0UyKGEwLCBiMCwgJnN1bTEpOworICAgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIHN1bTEpOworICAgICAgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMxW2ldKTsKKyAgICAgIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMltpXSk7CisgICAgICBpICs9IDE2OworICAgICAgU3VidHJhY3RBbmRTcXVhcmVfU1NFMihhMSwgYjEsICZzdW0yKTsKKyAgICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBzdW0yKTsKKyAgICB9CisgICAgU3VidHJhY3RBbmRTcXVhcmVfU1NFMihhMCwgYjAsICZzdW0xKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgc3VtMSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICAgIHNzZTIgKz0gKHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXSk7CisgIH0KKworICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50MzJfdCBkaWZmID0gc3JjMVtpXSAtIHNyYzJbaV07CisgICAgc3NlMiArPSBkaWZmICogZGlmZjsKKyAgfQorICByZXR1cm4gc3NlMjsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworc3RhdGljIHVpbnQzMl90IEhvcml6b250YWxBZGQxNmJfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBtKSB7CisgIHVpbnQxNl90IHRtcFs4XTsKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX3NybGlfc2kxMjgoKm0sIDgpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fYWRkX2VwaTE2KCptLCBhKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBiKTsKKyAgcmV0dXJuICh1aW50MzJfdCl0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF07Cit9CisKK3N0YXRpYyB1aW50MzJfdCBIb3Jpem9udGFsQWRkMzJiX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgbSkgeworICBjb25zdCBfX20xMjhpIGEgPSBfbW1fc3JsaV9zaTEyOCgqbSwgOCk7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9hZGRfZXBpMzIoKm0sIGEpOworICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTMyKGIsIF9tbV9zcmxpX3NpMTI4KGIsIDQpKTsKKyAgcmV0dXJuICh1aW50MzJfdClfbW1fY3Z0c2kxMjhfc2kzMihjKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRbXSA9IHsgMSwgMiwgMywgNCwgMywgMiwgMSwgMCB9OworCisjZGVmaW5lIEFDQ1VNVUxBVEVfUk9XKFdFSUdIVCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGNvbXB1dGUgcm93IHdlaWdodCAoV3ggKiBXeSkgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgV3kgPSBfbW1fc2V0MV9lcGkxNigoV0VJR0hUKSk7ICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVyA9IF9tbV9tdWxsb19lcGkxNihXeCwgV3kpOyAgICAgICAgICAgICAgICBcCisgIC8qIHByb2Nlc3MgOCBieXRlcyBhdCBhIHRpbWUgKDcgYnl0ZXMsIGFjdHVhbGx5KSAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXNyYzEpOyBcCisgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXNyYzIpOyBcCisgIC8qIGNvbnZlcnQgdG8gMTZiIGFuZCBtdWx0aXBseSBieSB3ZWlnaHQgKi8gICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fdW5wYWNrbG9fZXBpOChhMCwgemVybyk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fdW5wYWNrbG9fZXBpOChiMCwgemVybyk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgd2ExID0gX21tX211bGxvX2VwaTE2KGExLCBXKTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgd2IxID0gX21tX211bGxvX2VwaTE2KGIxLCBXKTsgICAgICAgICAgICAgICBcCisgIC8qIGFjY3VtdWxhdGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHhtICA9IF9tbV9hZGRfZXBpMTYoeG0sIHdhMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHltICA9IF9tbV9hZGRfZXBpMTYoeW0sIHdiMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHh4bSA9IF9tbV9hZGRfZXBpMzIoeHhtLCBfbW1fbWFkZF9lcGkxNihhMSwgd2ExKSk7ICAgICAgICBcCisgIHh5bSA9IF9tbV9hZGRfZXBpMzIoeHltLCBfbW1fbWFkZF9lcGkxNihhMSwgd2IxKSk7ICAgICAgICBcCisgIHl5bSA9IF9tbV9hZGRfZXBpMzIoeXltLCBfbW1fbWFkZF9lcGkxNihiMSwgd2IxKSk7ICAgICAgICBcCisgIHNyYzEgKz0gc3RyaWRlMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNyYzIgKz0gc3RyaWRlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgZG91YmxlIFNTSU1HZXRfU1NFMihjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyKSB7CisgIFZQOERpc3RvU3RhdHMgc3RhdHM7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgeG0gPSB6ZXJvLCB5bSA9IHplcm87ICAgICAgICAgICAgICAgIC8vIDE2YiBhY2N1bXMKKyAgX19tMTI4aSB4eG0gPSB6ZXJvLCB5eW0gPSB6ZXJvLCB4eW0gPSB6ZXJvOyAgLy8gMzJiIGFjY3VtCisgIGNvbnN0IF9fbTEyOGkgV3ggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKWtXZWlnaHQpOworICBhc3NlcnQoMiAqIFZQOF9TU0lNX0tFUk5FTCArIDEgPT0gNyk7CisgIEFDQ1VNVUxBVEVfUk9XKDEpOworICBBQ0NVTVVMQVRFX1JPVygyKTsKKyAgQUNDVU1VTEFURV9ST1coMyk7CisgIEFDQ1VNVUxBVEVfUk9XKDQpOworICBBQ0NVTVVMQVRFX1JPVygzKTsKKyAgQUNDVU1VTEFURV9ST1coMik7CisgIEFDQ1VNVUxBVEVfUk9XKDEpOworICBzdGF0cy54bSAgPSBIb3Jpem9udGFsQWRkMTZiX1NTRTIoJnhtKTsKKyAgc3RhdHMueW0gID0gSG9yaXpvbnRhbEFkZDE2Yl9TU0UyKCZ5bSk7CisgIHN0YXRzLnh4bSA9IEhvcml6b250YWxBZGQzMmJfU1NFMigmeHhtKTsKKyAgc3RhdHMueHltID0gSG9yaXpvbnRhbEFkZDMyYl9TU0UyKCZ4eW0pOworICBzdGF0cy55eW0gPSBIb3Jpem9udGFsQWRkMzJiX1NTRTIoJnl5bSk7CisgIHJldHVybiBWUDhTU0lNRnJvbVN0YXRzKCZzdGF0cyk7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworZXh0ZXJuIHZvaWQgVlA4U1NJTURzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4U1NJTURzcEluaXRTU0UyKHZvaWQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIFZQOEFjY3VtdWxhdGVTU0UgPSBBY2N1bXVsYXRlU1NFX1NTRTI7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICBWUDhTU0lNR2V0ID0gU1NJTUdldF9TU0UyOworI2VuZGlmCit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4U1NJTURzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2MGRhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZy5jCkBAIC0wLDAgKzEsMzI3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFuY3kgdXBzYW1wbGVyCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIEZhbmN5IHVwc2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgWVVWIHRvIFJHQgorV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzW01PREVfTEFTVF07CisKKy8vIEdpdmVuIHNhbXBsZXMgbGFpZCBvdXQgaW4gYSBzcXVhcmUgYXM6CisvLyAgW2EgYl0KKy8vICBbYyBkXQorLy8gd2UgaW50ZXJwb2xhdGUgdS92IGFzOgorLy8gIChbOSphICsgMypiICsgMypjICsgICBkICAgIDMqYSArIDkqYiArIDMqYyArICAgZF0gKyBbOCA4XSkgLyAxNgorLy8gIChbMyphICsgICBiICsgOSpjICsgMypkICAgICAgYSArIDMqYiArIDMqYyArIDkqZF0gICBbOCA4XSkgLyAxNgorCisvLyBXZSBwcm9jZXNzIHUgYW5kIHYgdG9nZXRoZXIgc3Rhc2hlZCBpbnRvIDMyYml0ICgxNmJpdCBlYWNoKS4KKyNkZWZpbmUgTE9BRF9VVih1LCB2KSAoKHUpIHwgKCh2KSA8PCAxNikpCisKKyNkZWZpbmUgVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAorICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGxhc3RfcGl4ZWxfcGFpciA9IChsZW4gLSAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IHRsX3V2ID0gTE9BRF9VVih0b3BfdVswXSwgdG9wX3ZbMF0pOyAgIC8qIHRvcC1sZWZ0IHNhbXBsZSAqLyAgICAgICAgXAorICB1aW50MzJfdCBsX3V2ICA9IExPQURfVVYoY3VyX3VbMF0sIGN1cl92WzBdKTsgICAvKiBsZWZ0LXNhbXBsZSAqLyAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF95ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHRvcF95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyhib3R0b21feVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh4ID0gMTsgeCA8PSBsYXN0X3BpeGVsX3BhaXI7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdF91diA9IExPQURfVVYodG9wX3VbeF0sIHRvcF92W3hdKTsgIC8qIHRvcCBzYW1wbGUgKi8gICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2ICAgPSBMT0FEX1VWKGN1cl91W3hdLCBjdXJfdlt4XSk7ICAvKiBzYW1wbGUgKi8gICAgICAgICAgIFwKKyAgICAvKiBwcmVjb21wdXRlIGludmFyaWFudCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGZpcnN0IGFuZCBzZWNvbmQgZGlhZ29uYWxzKi9cCisgICAgY29uc3QgdWludDMyX3QgYXZnID0gdGxfdXYgKyB0X3V2ICsgbF91diArIHV2ICsgMHgwMDA4MDAwOHU7ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGRpYWdfMTIgPSAoYXZnICsgMiAqICh0X3V2ICsgbF91dikpID4+IDM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzAzID0gKGF2ZyArIDIgKiAodGxfdXYgKyB1dikpID4+IDM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMTIgKyB0bF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzAzICsgdF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMSkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggLSAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAoMiAqIHggLSAwKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoZGlhZ18wMyArIGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYxID0gKGRpYWdfMTIgKyB1dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggLSAxKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVsyICogeCArIDBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArICgyICogeCArIDApICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRsX3V2ID0gdF91djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsX3V2ID0gdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShsZW4gJiAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArIChsZW4gLSAxKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95W2xlbiAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKGxlbiAtIDEpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBBbGwgdmFyaWFudHMgaW1wbGVtZW50ZWQuCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpcl9DLCBWUDhZdXZUb1JnYmEsIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyYUxpbmVQYWlyX0MsIFZQOFl1dlRvQmdyYSwgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyX0MsIFZQOFl1dlRvQXJnYiwgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpcl9DLCAgVlA4WXV2VG9SZ2IsICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyX0MsICBWUDhZdXZUb0JnciwgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9DLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX0MsICBWUDhZdXZUb1JnYjU2NSwgIDIpCisjZWxzZQorc3RhdGljIHZvaWQgRW1wdHlVcHNhbXBsZUZ1bmMoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeworICAodm9pZCl0b3BfeTsKKyAgKHZvaWQpYm90dG9tX3k7CisgICh2b2lkKXRvcF91OworICAodm9pZCl0b3BfdjsKKyAgKHZvaWQpY3VyX3U7CisgICh2b2lkKWN1cl92OworICAodm9pZCl0b3BfZHN0OworICAodm9pZClib3R0b21fZHN0OworICAodm9pZClsZW47CisgIGFzc2VydCgwKTsgICAvLyBDT0xPUlNQQUNFIFNVUFBPUlQgTk9UIENPTVBJTEVECit9CisjZGVmaW5lIFVwc2FtcGxlQXJnYkxpbmVQYWlyX0MgRW1wdHlVcHNhbXBsZUZ1bmMKKyNkZWZpbmUgVXBzYW1wbGVSZ2JMaW5lUGFpcl9DIEVtcHR5VXBzYW1wbGVGdW5jCisjZGVmaW5lIFVwc2FtcGxlQmdyTGluZVBhaXJfQyBFbXB0eVVwc2FtcGxlRnVuYworI2RlZmluZSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfQyBFbXB0eVVwc2FtcGxlRnVuYworI2RlZmluZSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX0MgRW1wdHlVcHNhbXBsZUZ1bmMKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjZW5kaWYKKworI3VuZGVmIExPQURfVVYKKyN1bmRlZiBVUFNBTVBMRV9GVU5DCisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIWRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykKKyNkZWZpbmUgRFVBTF9TQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdF95LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBib3RfdSwgY29uc3QgdWludDhfdCogYm90X3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90X2RzdCwgaW50IGxlbikgeyAgICAgICAgICAgXAorICBjb25zdCBpbnQgaGFsZl9sZW4gPSBsZW4gPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfZHN0ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4ICsgMF0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4ICsgMCk7ICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCArIDFdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCArIDQpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGxlbiAmIDEpIEZVTkModG9wX3lbMiAqIHggKyAwXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHgpOyAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdF9kc3QgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IGhhbGZfbGVuOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3RfeVsyICogeCArIDBdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCArIDApOyAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90X3lbMiAqIHggKyAxXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHggKyA0KTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsZW4gJiAxKSBGVU5DKGJvdF95WzIgKiB4ICsgMF0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4KTsgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RVQUxfU0FNUExFX0ZVTkMoRHVhbExpbmVTYW1wbGVyQkdSQSwgVlA4WXV2VG9CZ3JhKQorRFVBTF9TQU1QTEVfRlVOQyhEdWFsTGluZVNhbXBsZXJBUkdCLCBWUDhZdXZUb0FyZ2IpCisjdW5kZWYgRFVBTF9TQU1QTEVfRlVOQworCisjZW5kaWYgIC8vICFGQU5DWV9VUFNBTVBMSU5HCisKK1dlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQR2V0TGluZVBhaXJDb252ZXJ0ZXIoaW50IGFscGhhX2lzX2xhc3QpIHsKKyAgV2ViUEluaXRVcHNhbXBsZXJzKCk7CisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworICByZXR1cm4gV2ViUFVwc2FtcGxlcnNbYWxwaGFfaXNfbGFzdCA/IE1PREVfQkdSQSA6IE1PREVfQVJHQl07CisjZWxzZQorICByZXR1cm4gKGFscGhhX2lzX2xhc3QgPyBEdWFsTGluZVNhbXBsZXJCR1JBIDogRHVhbExpbmVTYW1wbGVyQVJHQik7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVVjQ0NCBjb252ZXJ0ZXIKKworI2RlZmluZSBZVVY0NDRfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2V4dGVybiB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIEZVTkMoeVtpXSwgdVtpXSwgdltpXSwgJmRzdFtpICogKFhTVEVQKV0pOyAgICAgICAgIFwKK30KKworWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvUmdiYV9DLCAgICAgVlA4WXV2VG9SZ2JhLCA0KQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvQmdyYV9DLCAgICAgVlA4WXV2VG9CZ3JhLCA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYl9DLCAgICAgIFZQOFl1dlRvUmdiLCAgMykKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb0Jncl9DLCAgICAgIFZQOFl1dlRvQmdyLCAgMykKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb0FyZ2JfQywgICAgIFZQOFl1dlRvQXJnYiwgNCkKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYmE0NDQ0X0MsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9SZ2I1NjVfQywgICBWUDhZdXZUb1JnYjU2NSwgMikKKyNlbHNlCitzdGF0aWMgdm9pZCBFbXB0eVl1djQ0NEZ1bmMoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICAodm9pZCl5OworICAodm9pZCl1OworICAodm9pZCl2OworICAodm9pZClkc3Q7CisgICh2b2lkKWxlbjsKK30KKyNkZWZpbmUgV2ViUFl1djQ0NFRvUmdiX0MgRW1wdHlZdXY0NDRGdW5jCisjZGVmaW5lIFdlYlBZdXY0NDRUb0Jncl9DIEVtcHR5WXV2NDQ0RnVuYworI2RlZmluZSBXZWJQWXV2NDQ0VG9BcmdiX0MgRW1wdHlZdXY0NDRGdW5jCisjZGVmaW5lIFdlYlBZdXY0NDRUb1JnYmE0NDQ0X0MgRW1wdHlZdXY0NDRGdW5jCisjZGVmaW5lIFdlYlBZdXY0NDRUb1JnYjU2NV9DIEVtcHR5WXV2NDQ0RnVuYworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBZVVY0NDRfRlVOQworCitXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfTEFTVF07CisKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0U0MSh2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBJbml0WVVWNDQ0Q29udmVydGVycykgeworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFdICAgICAgPSBXZWJQWXV2NDQ0VG9SZ2JhX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSQV0gICAgICA9IFdlYlBZdXY0NDRUb0JncmFfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JdICAgICAgID0gV2ViUFl1djQ0NFRvUmdiX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSXSAgICAgICA9IFdlYlBZdXY0NDRUb0Jncl9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FSR0JdICAgICAgPSBXZWJQWXV2NDQ0VG9BcmdiX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV80NDQ0XSA9IFdlYlBZdXY0NDRUb1JnYmE0NDQ0X0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXzU2NV0gICA9IFdlYlBZdXY0NDRUb1JnYjU2NV9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFdICAgICAgPSBXZWJQWXV2NDQ0VG9SZ2JhX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfYmdyQV0gICAgICA9IFdlYlBZdXY0NDRUb0JncmFfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BcmdiXSAgICAgID0gV2ViUFl1djQ0NFRvQXJnYl9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBXZWJQWXV2NDQ0VG9SZ2JhNDQ0NF9DOworCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFNDEoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxscworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTVNBKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUEluaXRVcHNhbXBsZXJzKSB7CisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gVXBzYW1wbGVSZ2JMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gICAgICAgPSBVcHNhbXBsZUJnckxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9DOworI2VuZGlmCisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICBXZWJQSW5pdFVwc2FtcGxlcnNTU0U0MSgpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBXZWJQSW5pdFVwc2FtcGxlcnNNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFdlYlBJbml0VXBzYW1wbGVyc05FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gIT0gTlVMTCk7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKSB8fCAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gIT0gTlVMTCk7CisjZW5kaWYKKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDQ5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDI5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yKHMpOiBCcmFuaW1pciBWYXNpYyAoYnJhbmltaXIudmFzaWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2RlZmluZSBZVVZfVE9fUkdCKFksIFUsIFYsIFIsIEcsIEIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdDEgPSBNdWx0SGkoWSwgMTkwNzcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHQyID0gTXVsdEhpKFYsIDEzMzIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFIgPSBNdWx0SGkoViwgMjYxNDkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHID0gTXVsdEhpKFUsIDY0MTkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQiA9IE11bHRIaShVLCAzMzA1MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFIgPSB0MSArIFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHID0gdDEgLSBHOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQiA9IHQxICsgQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFIgPSBSIC0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHID0gRyAtIHQyICsgODcwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQiA9IEIgLSAxNzY4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzaGxsX3MudyAgICAgICAgICVbIiAjUiAiXSwgICAgICAlWyIgI1IgIl0sICAgICAgICAxNyAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic2hsbF9zLncgICAgICAgICAlWyIgI0cgIl0sICAgICAgJVsiICNHICJdLCAgICAgICAgMTcgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInNobGxfcy53ICAgICAgICAgJVsiICNCICJdLCAgICAgICVbIiAjQiAiXSwgICAgICAgIDE3ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJwcmVjcnF1X3MucWIucGggICVbIiAjUiAiXSwgICAgICAlWyIgI1IgIl0sICAgICAgICAkemVybyAgICAgIFxuXHQiICAgICBcCisgICAgICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0cgIl0sICAgICAgJVsiICNHICJdLCAgICAgICAgJHplcm8gICAgICBcblx0IiAgICAgXAorICAgICAgInByZWNycXVfcy5xYi5waCAgJVsiICNCICJdLCAgICAgICVbIiAjQiAiXSwgICAgICAgICR6ZXJvICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzcmwgICAgICAgICAgICAgICVbIiAjUiAiXSwgICAgICAlWyIgI1IgIl0sICAgICAgICAyNCAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic3JsICAgICAgICAgICAgICAlWyIgI0cgIl0sICAgICAgJVsiICNHICJdLCAgICAgICAgMjQgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInNybCAgICAgICAgICAgICAgJVsiICNCICJdLCAgICAgICVbIiAjQiAiXSwgICAgICAgIDI0ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgIDogW1JdIityIihSKSwgW0ddIityIihHKSwgW0JdIityIihCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvUmdiKGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgcmdiWzBdID0gcjsKKyAgcmdiWzFdID0gZzsKKyAgcmdiWzJdID0gYjsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvQmdyKGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IGJncikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgYmdyWzBdID0gYjsKKyAgYmdyWzFdID0gZzsKKyAgYmdyWzJdID0gcjsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvUmdiNTY1KGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgeworICAgIGNvbnN0IGludCByZyA9IChyICYgMHhmOCkgfCAoZyA+PiA1KTsKKyAgICBjb25zdCBpbnQgZ2IgPSAoKGcgPDwgMykgJiAweGUwKSB8IChiID4+IDMpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgcmdiWzBdID0gZ2I7CisgICAgcmdiWzFdID0gcmc7CisjZWxzZQorICAgIHJnYlswXSA9IHJnOworICAgIHJnYlsxXSA9IGdiOworI2VuZGlmCisgIH0KK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvUmdiYTQ0NDQoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgeworICAgIGNvbnN0IGludCByZyA9IChyICYgMHhmMCkgfCAoZyA+PiA0KTsKKyAgICBjb25zdCBpbnQgYmEgPSAoYiAmIDB4ZjApIHwgMHgwZjsgICAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBhcmdiWzBdID0gYmE7CisgICAgYXJnYlsxXSA9IHJnOworI2Vsc2UKKyAgICBhcmdiWzBdID0gcmc7CisgICAgYXJnYlsxXSA9IGJhOworI2VuZGlmCisgICB9Cit9CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxwaGEgaGFuZGxpbmcgdmFyaWFudHMKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIGFyZ2JbMF0gPSAweGZmOworICBhcmdiWzFdID0gcjsKKyAgYXJnYlsyXSA9IGc7CisgIGFyZ2JbM10gPSBiOworfQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb0JncmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiZ3JhKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICBiZ3JhWzBdID0gYjsKKyAgYmdyYVsxXSA9IGc7CisgIGJncmFbMl0gPSByOworICBiZ3JhWzNdID0gMHhmZjsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvUmdiYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHJnYmFbMF0gPSByOworICByZ2JhWzFdID0gZzsKKyAgcmdiYVsyXSA9IGI7CisgIHJnYmFbM10gPSAweGZmOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFuY3kgdXBzYW1wbGVyCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIEdpdmVuIHNhbXBsZXMgbGFpZCBvdXQgaW4gYSBzcXVhcmUgYXM6CisvLyAgW2EgYl0KKy8vICBbYyBkXQorLy8gd2UgaW50ZXJwb2xhdGUgdS92IGFzOgorLy8gIChbOSphICsgMypiICsgMypjICsgICBkICAgIDMqYSArIDkqYiArIDMqYyArICAgZF0gKyBbOCA4XSkgLyAxNgorLy8gIChbMyphICsgICBiICsgOSpjICsgMypkICAgICAgYSArIDMqYiArIDMqYyArIDkqZF0gICBbOCA4XSkgLyAxNgorCisvLyBXZSBwcm9jZXNzIHUgYW5kIHYgdG9nZXRoZXIgc3Rhc2hlZCBpbnRvIDMyYml0ICgxNmJpdCBlYWNoKS4KKyNkZWZpbmUgTE9BRF9VVih1LCB2KSAoKHUpIHwgKCh2KSA8PCAxNikpCisKKyNkZWZpbmUgVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAorICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGxhc3RfcGl4ZWxfcGFpciA9IChsZW4gLSAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IHRsX3V2ID0gTE9BRF9VVih0b3BfdVswXSwgdG9wX3ZbMF0pOyAgIC8qIHRvcC1sZWZ0IHNhbXBsZSAqLyAgICAgICAgXAorICB1aW50MzJfdCBsX3V2ICA9IExPQURfVVYoY3VyX3VbMF0sIGN1cl92WzBdKTsgICAvKiBsZWZ0LXNhbXBsZSAqLyAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF95ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHRvcF95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyhib3R0b21feVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh4ID0gMTsgeCA8PSBsYXN0X3BpeGVsX3BhaXI7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdF91diA9IExPQURfVVYodG9wX3VbeF0sIHRvcF92W3hdKTsgIC8qIHRvcCBzYW1wbGUgKi8gICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2ICAgPSBMT0FEX1VWKGN1cl91W3hdLCBjdXJfdlt4XSk7ICAvKiBzYW1wbGUgKi8gICAgICAgICAgIFwKKyAgICAvKiBwcmVjb21wdXRlIGludmFyaWFudCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGZpcnN0IGFuZCBzZWNvbmQgZGlhZ29uYWxzKi9cCisgICAgY29uc3QgdWludDMyX3QgYXZnID0gdGxfdXYgKyB0X3V2ICsgbF91diArIHV2ICsgMHgwMDA4MDAwOHU7ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGRpYWdfMTIgPSAoYXZnICsgMiAqICh0X3V2ICsgbF91dikpID4+IDM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzAzID0gKGF2ZyArIDIgKiAodGxfdXYgKyB1dikpID4+IDM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMTIgKyB0bF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzAzICsgdF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggLSAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAoMiAqIHggLSAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoZGlhZ18wMyArIGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYxID0gKGRpYWdfMTIgKyB1dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVsyICogeCArIDBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArICgyICogeCArIDApICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRsX3V2ID0gdF91djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsX3V2ID0gdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShsZW4gJiAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95W2xlbiAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKGxlbiAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBBbGwgdmFyaWFudHMgaW1wbGVtZW50ZWQuCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyLCAgICAgWXV2VG9SZ2JhLCAgICAgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXIsICAgICBZdXZUb0JncmEsICAgICA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpciwgICAgICBZdXZUb1JnYiwgICAgICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyLCAgICAgIFl1dlRvQmdyLCAgICAgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyLCAgICAgWXV2VG9BcmdiLCAgICAgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBZdXZUb1JnYmE0NDQ0LCAyKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgIFl1dlRvUmdiNTY1LCAgIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIExPQURfVVYKKyN1bmRlZiBVUFNBTVBMRV9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIodm9pZCkgeworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFVwc2FtcGxlUmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFVwc2FtcGxlQmdyTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVY0NDQgY29udmVydGVyCisKKyNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgRlVOQyh5W2ldLCB1W2ldLCB2W2ldLCAmZHN0W2kgKiBYU1RFUF0pOyAgICAgICAgICAgXAorfQorCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmEsICAgICBZdXZUb1JnYmEsICAgICA0KQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JhLCAgICAgWXV2VG9CZ3JhLCAgICAgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYiwgICAgICBZdXZUb1JnYiwgICAgICAzKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3IsICAgICAgWXV2VG9CZ3IsICAgICAgMykKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQXJnYiwgICAgIFl1dlRvQXJnYiwgICAgIDQpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmE0NDQ0LCBZdXZUb1JnYmE0NDQ0LCAyKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2I1NjUsICAgWXV2VG9SZ2I1NjUsICAgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjdW5kZWYgWVVWNDQ0X0ZVTkMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV0gICAgICA9IFl1djQ0NFRvUmdiYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JBXSAgICAgID0gWXV2NDQ0VG9CZ3JhOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFdICAgICAgPSBZdXY0NDRUb1JnYmE7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfYmdyQV0gICAgICA9IFl1djQ0NFRvQmdyYTsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXSAgICAgICA9IFl1djQ0NFRvUmdiOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBZdXY0NDRUb0JncjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BUkdCXSAgICAgID0gWXV2NDQ0VG9BcmdiOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBZdXY0NDRUb1JnYmE0NDQ0OworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl81NjVdICAgPSBZdXY0NDRUb1JnYjU2NTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BcmdiXSAgICAgID0gWXV2NDQ0VG9BcmdiOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBZdXY0NDRUb1JnYmE0NDQ0OworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgorCisjaWYgIShkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpICYmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmY0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLmMKQEAgLTAsMCArMSw2OTIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogUHJhc2hhbnQgUGF0aWwgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworI2RlZmluZSBJTFZSX1VXMihpbiwgb3V0MCwgb3V0MSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IHQwID0gKHY4aTE2KV9fbXNhX2lsdnJfYigodjE2aTgpemVybywgKHYxNmk4KWluKTsgIFwKKyAgb3V0MCA9ICh2NHUzMilfX21zYV9pbHZyX2goKHY4aTE2KXplcm8sIHQwKTsgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gKHY0dTMyKV9fbXNhX2lsdmxfaCgodjhpMTYpemVybywgdDApOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElMVlJMX1VXNChpbiwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICB2MTZ1OCB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoemVybywgaW4sIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0gyX1VXKHplcm8sIHQwLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgXAorICBJTFZSTF9IMl9VVyh6ZXJvLCB0MSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTVVMVEhJXzE2KGluMCwgaW4xLCBpbjIsIGluMywgY25zdCwgb3V0MCwgb3V0MSkgZG8geyAgIFwKKyAgY29uc3QgdjRpMzIgY29uc3QwID0gKHY0aTMyKV9fbXNhX2ZpbGxfdyhjbnN0ICogMjU2KTsgICAgICAgIFwKKyAgdjR1MzIgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTVVMNChpbjAsIGNvbnN0MCwgaW4xLCBjb25zdDAsIGluMiwgY29uc3QwLCBpbjMsIGNvbnN0MCwgICAgIFwKKyAgICAgICB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLT0RfSDJfVUgodGVtcDEsIHRlbXAwLCB0ZW1wMywgdGVtcDIsIG91dDAsIG91dDEpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTVVMVEhJXzgoaW4wLCBpbjEsIGNuc3QsIG91dDApIGRvIHsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgY29uc3QwID0gKHY0aTMyKV9fbXNhX2ZpbGxfdyhjbnN0ICogMjU2KTsgICAgIFwKKyAgdjR1MzIgdGVtcDAsIHRlbXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTVVMMihpbjAsIGNvbnN0MCwgaW4xLCBjb25zdDAsIHRlbXAwLCB0ZW1wMSk7ICAgICAgICAgICAgIFwKKyAgb3V0MCA9ICh2OHUxNilfX21zYV9wY2tvZF9oKCh2OGkxNil0ZW1wMSwgKHY4aTE2KXRlbXAwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SMTYoeTAsIHkxLCB2MCwgdjEsIGRzdCkgZG8geyAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IGNvbnN0X2EgPSAodjhpMTYpX19tc2FfZmlsbF9oKDE0MjM0KTsgICAgICAgXAorICBjb25zdCB2OGkxNiBhMCA9IF9fbXNhX2FkZHNfc19oKCh2OGkxNil5MCwgKHY4aTE2KXYwKTsgIFwKKyAgY29uc3QgdjhpMTYgYTEgPSBfX21zYV9hZGRzX3NfaCgodjhpMTYpeTEsICh2OGkxNil2MSk7ICBcCisgIHY4aTE2IGIwID0gX19tc2Ffc3Vic19zX2goYTAsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgXAorICB2OGkxNiBiMSA9IF9fbXNhX3N1YnNfc19oKGExLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSChiMCwgYjEsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0gyXzBfMjU1KGIwLCBiMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYjEsICh2MTZpOCliMCk7ICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SOCh5MCwgdjAsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IGNvbnN0X2EgPSAodjhpMTYpX19tc2FfZmlsbF9oKDE0MjM0KTsgICAgICAgXAorICBjb25zdCB2OGkxNiBhMCA9IF9fbXNhX2FkZHNfc19oKCh2OGkxNil5MCwgKHY4aTE2KXYwKTsgIFwKKyAgdjhpMTYgYjAgPSBfX21zYV9zdWJzX3NfaChhMCwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICBcCisgIGIwID0gU1JBSV9IKGIwLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIXzBfMjU1KGIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWIwLCAodjE2aTgpYjApOyAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfRzE2KHkwLCB5MSwgdTAsIHUxLCB2MCwgdjEsIGRzdCkgZG8geyAgIFwKKyAgY29uc3QgdjhpMTYgY29uc3RfYSA9ICh2OGkxNilfX21zYV9maWxsX2goODcwOCk7ICAgXAorICB2OGkxNiBhMCA9IF9fbXNhX3N1YnNfc19oKCh2OGkxNil5MCwgKHY4aTE2KXUwKTsgICBcCisgIHY4aTE2IGExID0gX19tc2Ffc3Vic19zX2goKHY4aTE2KXkxLCAodjhpMTYpdTEpOyAgIFwKKyAgY29uc3QgdjhpMTYgYjAgPSBfX21zYV9zdWJzX3NfaChhMCwgKHY4aTE2KXYwKTsgICAgXAorICBjb25zdCB2OGkxNiBiMSA9IF9fbXNhX3N1YnNfc19oKGExLCAodjhpMTYpdjEpOyAgICBcCisgIGEwID0gX19tc2FfYWRkc19zX2goYjAsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgIFwKKyAgYTEgPSBfX21zYV9hZGRzX3NfaChiMSwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKGEwLCBhMSwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0gyXzBfMjU1KGEwLCBhMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWExLCAodjE2aTgpYTApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX0c4KHkwLCB1MCwgdjAsIGRzdCkgZG8geyAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IGNvbnN0X2EgPSAodjhpMTYpX19tc2FfZmlsbF9oKDg3MDgpOyAgIFwKKyAgdjhpMTYgYTAgPSBfX21zYV9zdWJzX3NfaCgodjhpMTYpeTAsICh2OGkxNil1MCk7ICAgXAorICBjb25zdCB2OGkxNiBiMCA9IF9fbXNhX3N1YnNfc19oKGEwLCAodjhpMTYpdjApOyAgICBcCisgIGEwID0gX19tc2FfYWRkc19zX2goYjAsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgIFwKKyAgYTAgPSBTUkFJX0goYTAsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIXzBfMjU1KGEwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOClhMCwgKHYxNmk4KWEwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19CMTYoeTAsIHkxLCB1MCwgdTEsIGRzdCkgZG8geyAgICAgICAgICAgXAorICBjb25zdCB2OHUxNiBjb25zdF9hID0gKHY4dTE2KV9fbXNhX2ZpbGxfaCgxNzY4NSk7ICBcCisgIGNvbnN0IHY4dTE2IGEwID0gX19tc2FfYWRkc191X2goKHY4dTE2KXkwLCB1MCk7ICAgIFwKKyAgY29uc3Qgdjh1MTYgYTEgPSBfX21zYV9hZGRzX3VfaCgodjh1MTYpeTEsIHUxKTsgICAgXAorICB2OHUxNiBiMCA9IF9fbXNhX3N1YnNfdV9oKGEwLCBjb25zdF9hKTsgICAgICAgICAgICBcCisgIHY4dTE2IGIxID0gX19tc2Ffc3Vic191X2goYTEsIGNvbnN0X2EpOyAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9VSChiMCwgYjEsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1VIMl8wXzI1NShiMCwgYjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCliMSwgKHYxNmk4KWIwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19COCh5MCwgdTAsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OHUxNiBjb25zdF9hID0gKHY4dTE2KV9fbXNhX2ZpbGxfaCgxNzY4NSk7ICBcCisgIGNvbnN0IHY4dTE2IGEwID0gX19tc2FfYWRkc191X2goKHY4dTE2KXkwLCB1MCk7ICAgIFwKKyAgdjh1MTYgYjAgPSBfX21zYV9zdWJzX3VfaChhMCwgY29uc3RfYSk7ICAgICAgICAgICAgXAorICBiMCA9IFNSQUlfSChiMCwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfVUhfMF8yNTUoYjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWIwLCAodjE2aTgpYjApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpIGRvIHsgICAgXAorICBjb25zdCB2MTZ1OCB6ZXJvID0geyAwIH07ICAgICAgICAgICAgICAgICAgXAorICB2OHUxNiB5MCwgeTEsIHUwLCB1MSwgdjAsIHYxOyAgICAgICAgICAgICAgXAorICB2NHUzMiBwMCwgcDEsIHAyLCBwMzsgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl95ID0gTERfVUIoeSk7ICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl91ID0gTERfVUIodSk7ICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl92ID0gTERfVUIodik7ICAgICAgICAgICAgICAgXAorICBJTFZSTF9VVzQoaW5feSwgcDAsIHAxLCBwMiwgcDMpOyAgICAgICAgICAgXAorICBNVUxUSElfMTYocDAsIHAxLCBwMiwgcDMsIDE5MDc3LCB5MCwgeTEpOyAgXAorICBJTFZSTF9VVzQoaW5fdiwgcDAsIHAxLCBwMiwgcDMpOyAgICAgICAgICAgXAorICBNVUxUSElfMTYocDAsIHAxLCBwMiwgcDMsIDI2MTQ5LCB2MCwgdjEpOyAgXAorICBDQUxDX1IxNih5MCwgeTEsIHYwLCB2MSwgUik7ICAgICAgICAgICAgICAgXAorICBNVUxUSElfMTYocDAsIHAxLCBwMiwgcDMsIDEzMzIwLCB2MCwgdjEpOyAgXAorICBJTFZSTF9VVzQoaW5fdSwgcDAsIHAxLCBwMiwgcDMpOyAgICAgICAgICAgXAorICBNVUxUSElfMTYocDAsIHAxLCBwMiwgcDMsIDY0MTksIHUwLCB1MSk7ICAgXAorICBDQUxDX0cxNih5MCwgeTEsIHUwLCB1MSwgdjAsIHYxLCBHKTsgICAgICAgXAorICBNVUxUSElfMTYocDAsIHAxLCBwMiwgcDMsIDMzMDUwLCB1MCwgdTEpOyAgXAorICBDQUxDX0IxNih5MCwgeTEsIHUwLCB1MSwgQik7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1JHQjgoeSwgdSwgdiwgUiwgRywgQikgZG8geyAgXAorICBjb25zdCB2MTZ1OCB6ZXJvID0geyAwIH07ICAgICAgICAgICAgICAgXAorICB2OHUxNiB5MCwgdTAsIHYwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NHUzMiBwMCwgcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl95ID0gTERfVUIoeSk7ICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl91ID0gTERfVUIodSk7ICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBpbl92ID0gTERfVUIodik7ICAgICAgICAgICAgXAorICBJTFZSX1VXMihpbl95LCBwMCwgcDEpOyAgICAgICAgICAgICAgICAgXAorICBNVUxUSElfOChwMCwgcDEsIDE5MDc3LCB5MCk7ICAgICAgICAgICAgXAorICBJTFZSX1VXMihpbl92LCBwMCwgcDEpOyAgICAgICAgICAgICAgICAgXAorICBNVUxUSElfOChwMCwgcDEsIDI2MTQ5LCB2MCk7ICAgICAgICAgICAgXAorICBDQUxDX1I4KHkwLCB2MCwgUik7ICAgICAgICAgICAgICAgICAgICAgXAorICBNVUxUSElfOChwMCwgcDEsIDEzMzIwLCB2MCk7ICAgICAgICAgICAgXAorICBJTFZSX1VXMihpbl91LCBwMCwgcDEpOyAgICAgICAgICAgICAgICAgXAorICBNVUxUSElfOChwMCwgcDEsIDY0MTksIHUwKTsgICAgICAgICAgICAgXAorICBDQUxDX0c4KHkwLCB1MCwgdjAsIEcpOyAgICAgICAgICAgICAgICAgXAorICBNVUxUSElfOChwMCwgcDEsIDMzMDUwLCB1MCk7ICAgICAgICAgICAgXAorICBDQUxDX0I4KHkwLCB1MCwgQik7ICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRTE2XzMoYTAsIGExLCBhMiwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAwLCAxLCAxNiwgMiwgMywgMTcsIDQsIDUsIDE4LCA2LCA3LCAxOSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIDksIDIwLCAxMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgMCwgMjEsIDEsIDIsIDIyLCAzLCA0LCAyMywgNSwgNiwgMjQsIDcsICBcCisgICAgICAgICAgICAgICAgICAgICAgICA4LCAyNSwgOSwgMTAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggbWFzazIgPSB7IDI2LCAwLCAxLCAyNywgMiwgMywgMjgsIDQsIDUsIDI5LCA2LCA3LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMzAsIDgsIDksIDMxIH07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIHRtcDAsIHRtcDEsIHRtcDI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoYTEsIGEwLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQwID0gVlNIRl9VQih0bXAwLCBhMiwgbWFzazApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDIgPSBTTERJX1VCKHRtcDEsIHRtcDAsIDExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IFZTSEZfVUIodG1wMiwgYTIsIG1hc2sxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAyID0gU0xESV9VQih0bXAxLCB0bXAxLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBWU0hGX1VCKHRtcDIsIGEyLCBtYXNrMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MCwgZHN0ICsgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQxLCBkc3QgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDIsIGRzdCArIDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkU4XzMoYTAsIGExLCBhMiwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludDY0X3Qgb3V0X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMCwgMSwgMTYsIDIsIDMsIDE3LCA0LCA1LCAxOCwgNiwgNywgMTksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIDksIDIwLCAxMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyAxMSwgMjEsIDEyLCAxMywgMjIsIDE0LCAxNSwgMjMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfTsgIFwKKyAgY29uc3QgdjE2dTggdG1wMCA9ICh2MTZ1OClfX21zYV9pbHZyX2IoKHYxNmk4KWExLCAodjE2aTgpYTApOyAgICBcCisgIHYxNnU4IG91dDAsIG91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHRtcDAsIGEyLCB0bXAwLCBhMiwgbWFzazAsIG1hc2sxLCBvdXQwLCBvdXQxKTsgICAgICAgIFwKKyAgU1RfVUIob3V0MCwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dF9tID0gX19tc2FfY29weV9zX2QoKHYyaTY0KW91dDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTRChvdXRfbSwgZHN0ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkUxNl80KGEwLCBhMSwgYTIsIGEzLCBkc3QpIGRvIHsgIFwKKyAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsgICAgICAgICAgICAgIFwKKyAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoYTEsIGEwLCB0bXAwLCB0bXAxKTsgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoYTMsIGEyLCB0bXAyLCB0bXAzKTsgICAgICAgICAgIFwKKyAgSUxWUkxfSDJfVUIodG1wMiwgdG1wMCwgb3V0MCwgb3V0MSk7ICAgICAgIFwKKyAgSUxWUkxfSDJfVUIodG1wMywgdG1wMSwgb3V0Miwgb3V0Myk7ICAgICAgIFwKKyAgU1RfVUIob3V0MCwgZHN0ICsgIDApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MSwgZHN0ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MiwgZHN0ICsgMzIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MywgZHN0ICsgNDgpOyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkU4XzQoYTAsIGExLCBhMiwgYTMsIGRzdCkgZG8geyAgXAorICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOyAgICAgICAgICAgICBcCisgIElMVlJfQjJfVUIoYTEsIGEwLCBhMywgYTIsIHRtcDAsIHRtcDEpOyAgIFwKKyAgSUxWUkxfSDJfVUIodG1wMSwgdG1wMCwgdG1wMiwgdG1wMyk7ICAgICAgXAorICBTVF9VQih0bXAyLCBkc3QgKyAgMCk7ICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKHRtcDMsIGRzdCArIDE2KTsgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkUyXzE2KGEwLCBhMSwgZHN0KSBkbyB7ICBcCisgIHYxNnU4IG91dDAsIG91dDE7ICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihhMSwgYTAsIG91dDAsIG91dDEpOyAgIFwKKyAgU1RfVUIob3V0MCwgZHN0ICsgIDApOyAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDEsIGRzdCArIDE2KTsgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRTJfOChhMCwgYTEsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG91dDAgPSAodjE2dTgpX19tc2FfaWx2cl9iKCh2MTZpOClhMSwgKHYxNmk4KWEwKTsgIFwKKyAgU1RfVUIob3V0MCwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1JHQkE0NDQ0KHksIHUsIHYsIG91dDAsIG91dDEsIE4sIGRzdCkgZG8geyAgXAorICBDQUxDX1JHQiMjTih5LCB1LCB2LCBSLCBHLCBCKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAwID0gQU5ESV9CKFIsIDB4ZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAxID0gU1JBSV9CKEcsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSRyA9IHRtcDAgfCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAwID0gQU5ESV9CKEIsIDB4ZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCQSA9IE9SSV9CKHRtcDAsIDB4MGYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVE9SRTJfIyNOKG91dDAsIG91dDEsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1JHQjU2NSh5LCB1LCB2LCBvdXQwLCBvdXQxLCBOLCBkc3QpIGRvIHsgIFwKKyAgQ0FMQ19SR0IjI04oeSwgdSwgdiwgUiwgRywgQik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDAgPSBBTkRJX0IoUiwgMHhmOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAxID0gU1JBSV9CKEcsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkcgPSB0bXAwIHwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDAgPSBTTExJX0IoRywgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAxID0gQU5ESV9CKHRtcDAsIDB4ZTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMCA9IFNSQUlfQihCLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdCID0gdG1wMCB8IHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVE9SRTJfIyNOKG91dDAsIG91dDEsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQ2xpcDgoaW50IHYpIHsKKyAgcmV0dXJuIHYgPCAwID8gMCA6IHYgPiAyNTUgPyAyNTUgOiB2OworfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgY29uc3QgaW50IHkxID0gTXVsdEhpKHksIDE5MDc3KTsKKyAgY29uc3QgaW50IHIxID0geTEgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQ7CisgIGNvbnN0IGludCBnMSA9IHkxIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDg7CisgIGNvbnN0IGludCBiMSA9IHkxICsgTXVsdEhpKHUsIDMzMDUwKSAtIDE3Njg1OworICByZ2JbMF0gPSBDbGlwOChyMSA+PiA2KTsKKyAgcmdiWzFdID0gQ2xpcDgoZzEgPj4gNik7CisgIHJnYlsyXSA9IENsaXA4KGIxID4+IDYpOworfQorCitzdGF0aWMgdm9pZCBZdXZUb0JncihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCBiZ3IpIHsKKyAgY29uc3QgaW50IHkxID0gTXVsdEhpKHksIDE5MDc3KTsKKyAgY29uc3QgaW50IHIxID0geTEgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQ7CisgIGNvbnN0IGludCBnMSA9IHkxIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDg7CisgIGNvbnN0IGludCBiMSA9IHkxICsgTXVsdEhpKHUsIDMzMDUwKSAtIDE3Njg1OworICBiZ3JbMF0gPSBDbGlwOChiMSA+PiA2KTsKKyAgYmdyWzFdID0gQ2xpcDgoZzEgPj4gNik7CisgIGJnclsyXSA9IENsaXA4KHIxID4+IDYpOworfQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorc3RhdGljIHZvaWQgWXV2VG9SZ2I1NjUoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgcmdiKSB7CisgIGNvbnN0IGludCB5MSA9IE11bHRIaSh5LCAxOTA3Nyk7CisgIGNvbnN0IGludCByMSA9IHkxICsgTXVsdEhpKHYsIDI2MTQ5KSAtIDE0MjM0OworICBjb25zdCBpbnQgZzEgPSB5MSAtIE11bHRIaSh1LCA2NDE5KSAtIE11bHRIaSh2LCAxMzMyMCkgKyA4NzA4OworICBjb25zdCBpbnQgYjEgPSB5MSArIE11bHRIaSh1LCAzMzA1MCkgLSAxNzY4NTsKKyAgY29uc3QgaW50IHIgPSBDbGlwOChyMSA+PiA2KTsKKyAgY29uc3QgaW50IGcgPSBDbGlwOChnMSA+PiA2KTsKKyAgY29uc3QgaW50IGIgPSBDbGlwOChiMSA+PiA2KTsKKyAgY29uc3QgaW50IHJnID0gKHIgJiAweGY4KSB8IChnID4+IDUpOworICBjb25zdCBpbnQgZ2IgPSAoKGcgPDwgMykgJiAweGUwKSB8IChiID4+IDMpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIHJnYlswXSA9IGdiOworICByZ2JbMV0gPSByZzsKKyNlbHNlCisgIHJnYlswXSA9IHJnOworICByZ2JbMV0gPSBnYjsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYmE0NDQ0KGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgY29uc3QgaW50IHkxID0gTXVsdEhpKHksIDE5MDc3KTsKKyAgY29uc3QgaW50IHIxID0geTEgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQ7CisgIGNvbnN0IGludCBnMSA9IHkxIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDg7CisgIGNvbnN0IGludCBiMSA9IHkxICsgTXVsdEhpKHUsIDMzMDUwKSAtIDE3Njg1OworICBjb25zdCBpbnQgciA9IENsaXA4KHIxID4+IDYpOworICBjb25zdCBpbnQgZyA9IENsaXA4KGcxID4+IDYpOworICBjb25zdCBpbnQgYiA9IENsaXA4KGIxID4+IDYpOworICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjApIHwgKGcgPj4gNCk7CisgIGNvbnN0IGludCBiYSA9IChiICYgMHhmMCkgfCAweDBmOyAgICAgLy8gb3ZlcndyaXRlIHRoZSBsb3dlciA0IGJpdHMKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICBhcmdiWzBdID0gYmE7CisgIGFyZ2JbMV0gPSByZzsKKyNlbHNlCisgIGFyZ2JbMF0gPSByZzsKKyAgYXJnYlsxXSA9IGJhOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LCB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGFyZ2JbMF0gPSAweGZmOworICBZdXZUb1JnYih5LCB1LCB2LCBhcmdiICsgMSk7Cit9CisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorCitzdGF0aWMgdm9pZCBZdXZUb0JncmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwgdWludDhfdCogY29uc3QgYmdyYSkgeworICBZdXZUb0Jncih5LCB1LCB2LCBiZ3JhKTsKKyAgYmdyYVszXSA9IDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LCB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIFl1dlRvUmdiKHksIHUsIHYsIHJnYmEpOworICByZ2JhWzNdID0gMHhmZjsKK30KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK3N0YXRpYyB2b2lkIFl1dlRvUmdiTGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzMoUiwgRywgQiwgZHN0KTsKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiAzOworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFszICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCMTYodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl8zKFIsIEcsIEIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDMgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbMyAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCOCh0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRThfMyhSLCBHLCBCLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAzICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JnckxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQjsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl8zKEIsIEcsIFIsIGRzdCk7CisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogMzsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbMyAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjE2KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfMyhCLCBHLCBSLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAzICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzMgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjgodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkU4XzMoQiwgRywgUiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMyAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiYUxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEI7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfbGRpX2IoQUxQSEFWQUwpOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoUiwgRywgQiwgQSwgZHN0KTsKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiA0OworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCMTYoJnRlbXBbMF0sIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChSLCBHLCBCLCBBLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjgodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkU4XzQoUiwgRywgQiwgQSwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JhTGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQjsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9sZGlfYihBTFBIQVZBTCk7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChCLCBHLCBSLCBBLCBkc3QpOworICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDQ7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0IxNih0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoQiwgRywgUiwgQSwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0I4KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFOF80KEIsIEcsIFIsIEEsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitzdGF0aWMgdm9pZCBZdXZUb0FyZ2JMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2xkaV9iKEFMUEhBVkFMKTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KEEsIFIsIEcsIEIsIGRzdCk7CisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogNDsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjE2KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChBLCBSLCBHLCBCLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjgodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkU4XzQoQSwgUiwgRywgQiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2JhNDQ0NExpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCLCBSRywgQkEsIHRtcDAsIHRtcDE7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCQTQ0NDQoeSwgdSwgdiwgQkEsIFJHLCAxNiwgZHN0KTsKKyNlbHNlCisgICAgQ0FMQ19SR0JBNDQ0NCh5LCB1LCB2LCBSRywgQkEsIDE2LCBkc3QpOworI2VuZGlmCisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogMjsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbMiAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCQTQ0NDQodGVtcCwgdSwgdiwgQkEsIFJHLCAxNiwgdGVtcCk7CisjZWxzZQorICAgIENBTENfUkdCQTQ0NDQodGVtcCwgdSwgdiwgUkcsIEJBLCAxNiwgdGVtcCk7CisjZW5kaWYKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAyICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzIgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCQTQ0NDQodGVtcCwgdSwgdiwgQkEsIFJHLCA4LCB0ZW1wKTsKKyNlbHNlCisgICAgQ0FMQ19SR0JBNDQ0NCh0ZW1wLCB1LCB2LCBSRywgQkEsIDgsIHRlbXApOworI2VuZGlmCisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMiAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2I1NjVMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEIsIFJHLCBHQiwgdG1wMCwgdG1wMTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0I1NjUoeSwgdSwgdiwgR0IsIFJHLCAxNiwgZHN0KTsKKyNlbHNlCisgICAgQ0FMQ19SR0I1NjUoeSwgdSwgdiwgUkcsIEdCLCAxNiwgZHN0KTsKKyNlbmRpZgorICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDI7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzIgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQjU2NSh0ZW1wLCB1LCB2LCBHQiwgUkcsIDE2LCB0ZW1wKTsKKyNlbHNlCisgICAgQ0FMQ19SR0I1NjUodGVtcCwgdSwgdiwgUkcsIEdCLCAxNiwgdGVtcCk7CisjZW5kaWYKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAyICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzIgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCNTY1KHRlbXAsIHUsIHYsIEdCLCBSRywgOCwgdGVtcCk7CisjZWxzZQorICAgIENBTENfUkdCNTY1KHRlbXAsIHUsIHYsIFJHLCBHQiwgOCwgdGVtcCk7CisjZW5kaWYKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAyICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI2RlZmluZSBVUFNBTVBMRV8zMlBJWEVMUyhhLCBiLCBjLCBkKSBkbyB7ICAgIFwKKyAgdjE2dTggcyA9IF9fbXNhX2F2ZXJfdV9iKGEsIGQpOyAgICAgICAgICAgICBcCisgIHYxNnU4IHQgPSBfX21zYV9hdmVyX3VfYihiLCBjKTsgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBzdCA9IHMgXiB0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggYWQgPSBhIF4gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IGJjID0gYiBeIGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCB0MCA9IGFkIHwgYmM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggdDEgPSB0MCB8IHN0OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHQyID0gQU5ESV9CKHQxLCAxKTsgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCB0MyA9IF9fbXNhX2F2ZXJfdV9iKHMsIHQpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggayA9IHQzIC0gdDI7ICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVkVSX1VCMl9VQih0LCBrLCBzLCBrLCB0MCwgdDEpOyAgICAgICAgICAgIFwKKyAgYmMgPSBiYyAmIHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkID0gYWQgJiBzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ID0gdCBeIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcyA9IHMgXiBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gYmMgfCB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MyA9IGFkIHwgczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBBTkRJX0IodDIsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQzID0gQU5ESV9CKHQzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVUIyKHQwLCB0MiwgdDEsIHQzLCBkaWFnMSwgZGlhZzIpOyAgICAgICAgIFwKKyAgQVZFUl9VQjJfVUIoYSwgZGlhZzEsIGIsIGRpYWcyLCB0MCwgdDEpOyAgICBcCisgIElMVlJMX0IyX1VCKHQxLCB0MCwgYSwgYik7ICAgICAgICAgICAgICAgICAgXAorICBpZiAocGJvdF95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVkVSX1VCMl9VQihjLCBkaWFnMiwgZCwgZGlhZzEsIHQwLCB0MSk7ICBcCisgICAgSUxWUkxfQjJfVUIodDEsIHQwLCBjLCBkKTsgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdF95LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90X2RzdCwgaW50IGxlbikgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHNpemUgPSAobGVuIC0gMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgdGVtcF91WzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHRlbXBfdls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QgdGxfdXYgPSAoKHRvcF91WzBdKSB8ICgodG9wX3ZbMF0pIDw8IDE2KSk7ICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IGxfdXYgPSAoKGN1cl91WzBdKSB8ICgoY3VyX3ZbMF0pIDw8IDE2KSk7ICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDhfdCogcHRvcF95ID0gJnRvcF95WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgKnB0b3BfZHN0ID0gdG9wX2RzdCArIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90KiBwYm90X3kgPSAmYm90X3lbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCAqcGJvdF9kc3QgPSBib3RfZHN0ICsgWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVU5DKHRvcF95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdF95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYxID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgXAorICAgIEZVTkMoYm90X3lbMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCBib3RfZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzaXplID49IDE2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHYxNnU4IHR1MCwgdHUxLCB0djAsIHR2MSwgY3UwLCBjdTEsIGN2MCwgY3YxOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIodG9wX3UsIDEsIHR1MCwgdHUxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKGN1cl91LCAxLCBjdTAsIGN1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMih0b3BfdiwgMSwgdHYwLCB0djEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoY3VyX3YsIDEsIGN2MCwgY3YxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModHUwLCB0dTEsIGN1MCwgY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHR2MCwgdHYxLCBjdjAsIGN2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjQodHUwLCB0dTEsIGN1MCwgY3UxLCAmdGVtcF91WzBdLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RfVUI0KHR2MCwgdHYxLCBjdjAsIGN2MSwgJnRlbXBfdlswXSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMjI0xpbmUocHRvcF95LCAmdGVtcF91WyAwXSwgJnRlbXBfdlswXSwgcHRvcF9kc3QsIDMyKTsgICAgICAgICAgIFwKKyAgICBpZiAoYm90X3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DIyNMaW5lKHBib3RfeSwgJnRlbXBfdVszMl0sICZ0ZW1wX3ZbMzJdLCBwYm90X2RzdCwgMzIpOyAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdG9wX3kgICArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGJvdF95ICAgKz0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB0b3BfZHN0ICs9IFhTVEVQICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwYm90X2RzdCArPSBYU1RFUCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG9wX3UgICAgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvcF92ICAgICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdSAgICArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3YgICAgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUgICAgIC09IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChzaXplID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHYxNnU4IHR1MCwgdHUxLCB0djAsIHR2MSwgY3UwLCBjdTEsIGN2MCwgY3YxOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJnRlbXBfdVsgMF0sIHRvcF91LCAxNyAqIHNpemVvZih1aW50OF90KSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KCZ0ZW1wX3VbMzJdLCBjdXJfdSwgMTcgKiBzaXplb2YodWludDhfdCkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmdGVtcF92WyAwXSwgdG9wX3YsIDE3ICogc2l6ZW9mKHVpbnQ4X3QpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJnRlbXBfdlszMl0sIGN1cl92LCAxNyAqIHNpemVvZih1aW50OF90KSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKCZ0ZW1wX3VbIDBdLCAxLCB0dTAsIHR1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMigmdGVtcF91WzMyXSwgMSwgY3UwLCBjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoJnRlbXBfdlsgMF0sIDEsIHR2MCwgdHYxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKCZ0ZW1wX3ZbMzJdLCAxLCBjdjAsIGN2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHR1MCwgdHUxLCBjdTAsIGN1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0djAsIHR2MSwgY3YwLCBjdjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RfVUI0KHR1MCwgdHUxLCBjdTAsIGN1MSwgJnRlbXBfdVswXSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCNCh0djAsIHR2MSwgY3YwLCBjdjEsICZ0ZW1wX3ZbMF0sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DIyNMaW5lKHB0b3BfeSwgJnRlbXBfdVsgMF0sICZ0ZW1wX3ZbMF0sIHB0b3BfZHN0LCBzaXplICogMik7ICAgICBcCisgICAgaWYgKGJvdF95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyMjTGluZShwYm90X3ksICZ0ZW1wX3VbMzJdLCAmdGVtcF92WzMyXSwgcGJvdF9kc3QsIHNpemUgKiAyKTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG9wX3UgKz0gc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvcF92ICs9IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdSArPSBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3YgKz0gc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdDAgPSAoKHRvcF91WzBdKSB8ICgodG9wX3ZbMF0pIDw8IDE2KSk7ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGMwICA9ICgoY3VyX3VbMF0pIHwgKChjdXJfdlswXSkgPDwgMTYpKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB0bXAwID0gKDMgKiB0MCArIGMwICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVtsZW4gLSAxXSwgdG1wMCAmIDB4ZmYsICh0bXAwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90X3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB0bXAxID0gKDMgKiBjMCArIHQwICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3RfeVtsZW4gLSAxXSwgdG1wMSAmIDB4ZmYsICh0bXAxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90X2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpciwgICAgIFl1dlRvUmdiYSwgICAgIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyYUxpbmVQYWlyLCAgICAgWXV2VG9CZ3JhLCAgICAgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXIsICAgICAgWXV2VG9SZ2IsICAgICAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpciwgICAgICBZdXZUb0JnciwgICAgICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpciwgICAgIFl1dlRvQXJnYiwgICAgIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpciwgWXV2VG9SZ2JhNDQ0NCwgMikKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2I1NjVMaW5lUGFpciwgICBZdXZUb1JnYjU2NSwgICAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01TQSh2b2lkKSB7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gVXBzYW1wbGVSZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gVXBzYW1wbGVCZ3JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX01TQSkpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRVcHNhbXBsZXJzTVNBKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA1YmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX25lb24uYwpAQCAtMCwwICsxLDI5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE5FT04gdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogbWFuc0BtYW5zci5jb20gKE1hbnMgUnVsbGdhcmQpCisvLyBCYXNlZCBvbiBTU0UgY29kZSBieTogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVS9WIHVwc2FtcGxpbmcKKworLy8gTG9hZHMgOSBwaXhlbHMgZWFjaCBmcm9tIHJvd3MgcjEgYW5kIHIyIGFuZCBnZW5lcmF0ZXMgMTYgcGl4ZWxzLgorI2RlZmluZSBVUFNBTVBMRV8xNlBJWEVMUyhyMSwgcjIsIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgYSA9IHZsZDFfdTgocjEgKyAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgYiA9IHZsZDFfdTgocjEgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgYyA9IHZsZDFfdTgocjIgKyAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgZCA9IHZsZDFfdTgocjIgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBhICsgYiArIGMgKyBkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGFkID0gdmFkZGxfdTgoYSwgIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGJjID0gdmFkZGxfdTgoYiwgIGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGFiY2QgPSB2YWRkcV91MTYoYWQsIGJjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiAzYSArICBiICsgIGMgKyAzZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGFsID0gdmFkZHFfdTE2KGFiY2QsIHZzaGxxX25fdTE2KGFkLCAxKSk7ICAgICAgICAgICAgXAorICAvKiAgYSArIDNiICsgM2MgKyAgZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGJsID0gdmFkZHFfdTE2KGFiY2QsIHZzaGxxX25fdTE2KGJjLCAxKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgZGlhZzIgPSB2c2hybl9uX3UxNihhbCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgZGlhZzEgPSB2c2hybl9uX3UxNihibCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgQSA9IHZyaGFkZF91OChhLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgQiA9IHZyaGFkZF91OChiLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgQyA9IHZyaGFkZF91OChjLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgRCA9IHZyaGFkZF91OChkLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDJfdCBBX0IsIENfRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjIoQV9CLCBBLCBCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjIoQ19ELCBDLCBEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QyX3U4KG91dCArICAwLCBBX0IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QyX3U4KG91dCArIDMyLCBDX0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gVHVybiB0aGUgbWFjcm8gaW50byBhIGZ1bmN0aW9uIGZvciByZWR1Y2luZyBjb2RlLXNpemUgd2hlbiBub24tY3JpdGljYWwKK3N0YXRpYyB2b2lkIFVwc2FtcGxlMTZQaXhlbHNfTkVPTihjb25zdCB1aW50OF90ICpyMSwgY29uc3QgdWludDhfdCAqcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0KSB7CisgIFVQU0FNUExFXzE2UElYRUxTKHIxLCByMiwgb3V0KTsKK30KKworI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHIxWzldLCByMls5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjEsICh0YiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1zZXQocjEgKyAobnVtX3BpeGVscyksIHIxWyhudW1fcGl4ZWxzKSAtIDFdLCA5IC0gKG51bV9waXhlbHMpKTsgICAgXAorICBtZW1zZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCA5IC0gKG51bV9waXhlbHMpKTsgICAgXAorICBVcHNhbXBsZTE2UGl4ZWxzX05FT04ocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVYtPlJHQiBjb252ZXJzaW9uCisKKy8vIG5vdGU6IHdlIHJlcHJlc2VudCB0aGUgMzMwNTAgbGFyZ2UgY29uc3RhbnQgYXMgMzI3NjggKyAyODIKK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDb2VmZnMxWzRdID0geyAxOTA3NywgMjYxNDksIDY0MTksIDEzMzIwIH07CisKKyNkZWZpbmUgdjI1NSB2ZHVwX25fdTgoMjU1KQorCisjZGVmaW5lIFNUT1JFX1JnYihvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4M190IHJfZ19iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SMyhyX2dfYiwgciwgZywgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDNfdTgob3V0LCByX2dfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFX0JncihvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4M190IGJfZ19yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SMyhiX2dfciwgYiwgZywgcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDNfdTgob3V0LCBiX2dfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFX1JnYmEob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4NF90IHJfZ19iX3YyNTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SNChyX2dfYl92MjU1LCByLCBnLCBiLCB2MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDRfdTgob3V0LCByX2dfYl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFX0JncmEob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4NF90IGJfZ19yX3YyNTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SNChiX2dfcl92MjU1LCBiLCBnLCByLCB2MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDRfdTgob3V0LCBiX2dfcl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFX0FyZ2Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4NF90IHYyNTVfcl9nX2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SNCh2MjU1X3JfZ19iLCB2MjU1LCByLCBnLCBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDRfdTgob3V0LCB2MjU1X3JfZ19iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjaWYgIWRlZmluZWQoV0VCUF9TV0FQXzE2QklUX0NTUCkKKyNkZWZpbmUgWklQX1U4KGxvLCBoaSkgdnppcF91OCgobG8pLCAoaGkpKQorI2Vsc2UKKyNkZWZpbmUgWklQX1U4KGxvLCBoaSkgdnppcF91OCgoaGkpLCAobG8pKQorI2VuZGlmCisKKyNkZWZpbmUgU1RPUkVfUmdiYTQ0NDQob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHJnID0gdnNyaV9uX3U4KHIsIGcsIDQpOyAgICAgIC8qIHNoaWZ0IGcsIGluc2VydCByICovIFwKKyAgY29uc3QgdWludDh4OF90IGJhID0gdnNyaV9uX3U4KGIsIHYyNTUsIDQpOyAgIC8qIHNoaWZ0IGEsIGluc2VydCBiICovIFwKKyAgY29uc3QgdWludDh4OHgyX3QgcmdiYTQ0NDQgPSBaSVBfVTgocmcsIGJhKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MXFfdTgob3V0LCB2Y29tYmluZV91OChyZ2JhNDQ0NC52YWxbMF0sIHJnYmE0NDQ0LnZhbFsxXSkpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkVfUmdiNTY1KG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHJnID0gdnNyaV9uX3U4KHIsIGcsIDUpOyAgIC8qIHNoaWZ0IGcgYW5kIGluc2VydCByICovIFwKKyAgY29uc3QgdWludDh4OF90IGcxID0gdnNobF9uX3U4KGcsIDMpOyAgICAgIC8qIHByZS1zaGlmdCBnOiAzYml0cyAqLyAgIFwKKyAgY29uc3QgdWludDh4OF90IGdiID0gdnNyaV9uX3U4KGcxLCBiLCAzKTsgIC8qIHNoaWZ0IGIgYW5kIGluc2VydCBnICovIFwKKyAgY29uc3QgdWludDh4OHgyX3QgcmdiNTY1ID0gWklQX1U4KHJnLCBnYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MXFfdTgob3V0LCB2Y29tYmluZV91OChyZ2I1NjUudmFsWzBdLCByZ2I1NjUudmFsWzFdKSk7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDgoRk1ULCBYU1RFUCwgTiwgc3JjX3ksIHNyY191diwgb3V0LCBjdXJfeCkgZG8geyAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IE47IGkgKz0gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgb2ZmID0gKChjdXJfeCkgKyBpKSAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgeSAgPSB2bGQxX3U4KChzcmNfeSkgKyAoY3VyX3gpICArIGkpOyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgdSAgPSB2bGQxX3U4KChzcmNfdXYpICsgaSArICAwKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgdiAgPSB2bGQxX3U4KChzcmNfdXYpICsgaSArIDE2KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgWTAgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnNobGxfbl91OCh5LCA3KSk7ICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgVTAgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnNobGxfbl91OCh1LCA3KSk7ICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgVjAgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnNobGxfbl91OCh2LCA3KSk7ICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgWTEgPSB2cWRtdWxocV9sYW5lX3MxNihZMCwgY29lZmYxLCAwKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgUjAgPSB2cWRtdWxocV9sYW5lX3MxNihWMCwgY29lZmYxLCAxKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgRzAgPSB2cWRtdWxocV9sYW5lX3MxNihVMCwgY29lZmYxLCAyKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgRzEgPSB2cWRtdWxocV9sYW5lX3MxNihWMCwgY29lZmYxLCAzKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgQjAgPSB2cWRtdWxocV9uX3MxNihVMCwgMjgyKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgUjEgPSB2cWFkZHFfczE2KFkxLCBSX1JvdW5kZXIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgRzIgPSB2cWFkZHFfczE2KFkxLCBHX1JvdW5kZXIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgQjEgPSB2cWFkZHFfczE2KFkxLCBCX1JvdW5kZXIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgUjIgPSB2cWFkZHFfczE2KFIwLCBSMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgRzMgPSB2cWFkZHFfczE2KEcwLCBHMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgQjIgPSB2cWFkZHFfczE2KEIwLCBCMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgRzQgPSB2cXN1YnFfczE2KEcyLCBHMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNng4X3QgQjMgPSB2cWFkZHFfczE2KEIyLCBVMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgUiA9IHZxc2hydW5fbl9zMTYoUjIsIFlVVl9GSVgyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgRyA9IHZxc2hydW5fbl9zMTYoRzQsIFlVVl9GSVgyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHg4X3QgQiA9IHZxc2hydW5fbl9zMTYoQjMsIFlVVl9GSVgyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVE9SRV8gIyMgRk1UKG91dCArIG9mZiwgUiwgRywgQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDEoRlVOQywgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIHJnYiwgY3VyX3gpIHsgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgb2ZmID0gKChjdXJfeCkgKyBpKSAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgeSA9IHNyY195WyhjdXJfeCkgKyBpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdSA9IChzcmNfdXYpW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdiA9IChzcmNfdXYpW2kgKyAxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHksIHUsIHYsIHJnYiArIG9mZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDT05WRVJUMlJHQl84KEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgdXYsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94LCBsZW4pIHsgICAgICAgICAgICAgICAgXAorICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIHRvcF95LCB1diwgdG9wX2RzdCwgY3VyX3gpOyAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZFUlQ4KEZNVCwgWFNURVAsIGxlbiwgYm90dG9tX3ksICh1dikgKyAzMiwgYm90dG9tX2RzdCwgY3VyX3gpOyAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCXzEoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgdXYsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gsIGxlbikgeyAgICAgICAgICAgICAgICBcCisgIENPTlZFUlQxKEZVTkMsIFhTVEVQLCBsZW4sIHRvcF95LCB1diwgdG9wX2RzdCwgY3VyX3gpOyAgICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVkVSVDEoRlVOQywgWFNURVAsIGxlbiwgYm90dG9tX3ksICh1dikgKyAzMiwgYm90dG9tX2RzdCwgY3VyX3gpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTkVPTl9VUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRk1ULCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90ICp0b3BfeSwgY29uc3QgdWludDhfdCAqYm90dG9tX3ksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0b3BfdSwgY29uc3QgdWludDhfdCAqdG9wX3YsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXJfdSwgY29uc3QgdWludDhfdCAqY3VyX3YsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0b3BfZHN0LCB1aW50OF90ICpib3R0b21fZHN0LCBpbnQgbGVuKSB7IFwKKyAgaW50IGJsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogMTYgYnl0ZSBhbGlnbmVkIGFycmF5IHRvIGNhY2hlIHJlY29uc3RydWN0ZWQgdSBhbmQgdiAqLyAgICAgICAgICAgIFwKKyAgdWludDhfdCB1dl9idWZbMiAqIDMyICsgMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCAqY29uc3Qgcl91diA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkodXZfYnVmICsgMTUpICYgfjE1KTsgICAgIFwKKyAgY29uc3QgaW50IHV2X2xlbiA9IChsZW4gKyAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogOSBwaXhlbHMgbXVzdCBiZSByZWFkLWFibGUgZm9yIGVhY2ggYmxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IG51bV9ibG9ja3MgPSAodXZfbGVuIC0gMSkgPj4gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGxlZnRvdmVyID0gdXZfbGVuIC0gbnVtX2Jsb2NrcyAqIDg7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGxhc3RfcG9zID0gMSArIDE2ICogbnVtX2Jsb2NrczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHVfZGlhZyA9ICgodG9wX3VbMF0gKyBjdXJfdVswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHZfZGlhZyA9ICgodG9wX3ZbMF0gKyBjdXJfdlswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4NF90IGNvZWZmMSA9IHZsZDFfczE2KGtDb2VmZnMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4OF90IFJfUm91bmRlciA9IHZkdXBxX25fczE2KC0xNDIzNCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4OF90IEdfUm91bmRlciA9IHZkdXBxX25fczE2KDg3MDgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4OF90IEJfUm91bmRlciA9IHZkdXBxX25fczE2KC0xNzY4NSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogVHJlYXQgdGhlIGZpcnN0IHBpeGVsIGluIHJlZ3VsYXIgd2F5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF95ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdTAgPSAodG9wX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdjAgPSAodG9wX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhZdXZUbyAjIyBGTVQodG9wX3lbMF0sIHUwLCB2MCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdTAgPSAoY3VyX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdjAgPSAoY3VyX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhZdXZUbyAjIyBGTVQoYm90dG9tX3lbMF0sIHUwLCB2MCwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgbnVtX2Jsb2NrczsgKytibG9jaykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8xNlBJWEVMUyh0b3BfdSwgY3VyX3UsIHJfdXYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8xNlBJWEVMUyh0b3BfdiwgY3VyX3YsIHJfdXYgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl84KEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIDE2ICogYmxvY2sgKyAxLCAxNik7ICAgICAgICAgICAgIFwKKyAgICB0b3BfdSArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdSArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3BfdiArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdiArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdSwgY3VyX3UsIGxlZnRvdmVyLCByX3V2KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdiwgY3VyX3YsIGxlZnRvdmVyLCByX3V2ICsgMTYpOyAgICAgICAgICAgICAgIFwKKyAgQ09OVkVSVDJSR0JfMShWUDhZdXZUbyAjIyBGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHJfdXYsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBsYXN0X3BvcywgbGVuIC0gbGFzdF9wb3MpOyAgICAgICAgIFwKK30KKworLy8gTkVPTiB2YXJpYW50cyBvZiB0aGUgZmFuY3kgdXBzYW1wbGVyLgorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyX05FT04sIFJnYmEsIDQpCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXJfTkVPTiwgQmdyYSwgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpcl9ORU9OLCAgUmdiLCAgMykKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyX05FT04sICBCZ3IsICAzKQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyX05FT04sIEFyZ2IsIDQpCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX05FT04sIFJnYmE0NDQ0LCAyKQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfTkVPTiwgUmdiNTY1LCAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc05FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKHZvaWQpIHsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX05FT047CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gID0gVXBzYW1wbGVCZ3JMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfTkVPTjsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCisKKyNpZiAhKGRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykgJiYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNORU9OKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWEzNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIuYwpAQCAtMCwwICsxLDI3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIFdlIGNvbXB1dGUgKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2IGFzIGZvbGxvd3MKKy8vIHUgPSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYKKy8vICAgPSAoYSArIChhICsgMypiICsgMypjICsgZCkgLyA4ICsgMSkgLyAyCisvLyAgID0gKGEgKyBtICsgMSkgLyAyCisvLyB3aGVyZSBtID0gKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDgKKy8vICAgICAgICAgPSAoKGEgKyBiICsgYyArIGQpIC8gMiArIGIgKyBjKSAvIDQKKy8vCisvLyBMZXQncyBzYXkgIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0LgorLy8gV2UgY2FuIGNvbXB1dGUgayBhcworLy8gayA9IChzICsgdCArIDEpIC8gMiAtICgoYV5kKSB8IChiXmMpIHwgKHNedCkpICYgMQorLy8gd2hlcmUgcyA9IChhICsgZCArIDEpIC8gMiBhbmQgdCA9IChiICsgYyArIDEpIC8gMgorLy8KKy8vIFRoZW4gbSBjYW4gYmUgd3JpdHRlbiBhcworLy8gbSA9IChrICsgdCArIDEpIC8gMiAtICgoKGJeYykgJiAoc150KSkgfCAoa150KSkgJiAxCisKKy8vIENvbXB1dGVzIG91dCA9IChrICsgaW4gKyAxKSAvIDIgLSAoKGlqICYgKHNedCkpIHwgKGteaW4pKSAmIDEKKyNkZWZpbmUgR0VUX00oaWosIGluLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hdmdfZXB1OChrLCAoaW4pKTsgICAgIC8qIChrICsgaW4gKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYW5kX3NpMTI4KChpaiksIHN0KTsgICAvKiAoaWopICYgKHNedCkgKi8gICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3hvcl9zaTEyOChrLCAoaW4pKTsgICAgLyogKGteaW4pICovICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9vcl9zaTEyOCh0bXAxLCB0bXAyKTsgIC8qICgoaWopICYgKHNedCkpIHwgKGteaW4pICovXAorICBjb25zdCBfX20xMjhpIHRtcDQgPSBfbW1fYW5kX3NpMTI4KHRtcDMsIG9uZSk7ICAvKiAmIDEgLT4gbHNiX2NvcnJlY3Rpb24gKi8gIFwKKyAgKG91dCkgPSBfbW1fc3ViX2VwaTgodG1wMCwgdG1wNCk7ICAgIC8qIChrICsgaW4gKyAxKSAvIDIgLSBsc2JfY29ycmVjdGlvbiAqLyBcCit9IHdoaWxlICgwKQorCisvLyBwYWNrIGFuZCBzdG9yZSB0d28gYWx0ZXJuYXRpbmcgcGl4ZWwgcm93cworI2RlZmluZSBQQUNLX0FORF9TVE9SRShhLCBiLCBkYSwgZGIsIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0X2EgPSBfbW1fYXZnX2VwdTgoYSwgZGEpOyAgLyogKDlhICsgM2IgKyAzYyArICBkICsgOCkgLyAxNiAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdF9iID0gX21tX2F2Z19lcHU4KGIsIGRiKTsgIC8qICgzYSArIDliICsgIGMgKyAzZCArIDgpIC8gMTYgKi8gXAorICBjb25zdCBfX20xMjhpIHRfMSA9IF9tbV91bnBhY2tsb19lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0XzIgPSBfbW1fdW5wYWNraGlfZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDAsIHRfMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAxLCB0XzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIExvYWRzIDE3IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAzMiBwaXhlbHMuCisjZGVmaW5lIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIxKVswXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMSlbMV0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjIpWzBdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBkID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIyKVsxXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHMgPSBfbW1fYXZnX2VwdTgoYSwgZCk7ICAgICAgICAvKiBzID0gKGEgKyBkICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0ID0gX21tX2F2Z19lcHU4KGIsIGMpOyAgICAgICAgLyogdCA9IChiICsgYyArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgc3QgPSBfbW1feG9yX3NpMTI4KHMsIHQpOyAgICAgIC8qIHN0ID0gc150ICovICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhZCA9IF9tbV94b3Jfc2kxMjgoYSwgZCk7ICAgICAgLyogYWQgPSBhXmQgKi8gICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KGIsIGMpOyAgICAgIC8qIGJjID0gYl5jICovICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9vcl9zaTEyOChhZCwgYmMpOyAgICAgLyogKGFeZCkgfCAoYl5jKSAqLyAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fb3Jfc2kxMjgodDEsIHN0KTsgICAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAqLyAgICAgXAorICBjb25zdCBfX20xMjhpIHQzID0gX21tX2FuZF9zaTEyOCh0Miwgb25lKTsgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgJiAxICovIFwKKyAgY29uc3QgX19tMTI4aSB0NCA9IF9tbV9hdmdfZXB1OChzLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgayA9IF9tbV9zdWJfZXBpOCh0NCwgdDMpOyAgICAgIC8qIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0ICovICAgXAorICBfX20xMjhpIGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFVF9NKGJjLCB0LCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgLyogZGlhZzEgPSAoYSArIDNiICsgM2MgKyBkKSAvIDggKi8gICAgXAorICBHRVRfTShhZCwgcywgZGlhZzIpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcyID0gKDNhICsgYiArIGMgKyAzZCkgLyA4ICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHBhY2sgdGhlIGFsdGVybmF0ZSBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQUNLX0FORF9TVE9SRShhLCBiLCBkaWFnMSwgZGlhZzIsIChvdXQpICsgICAgICAwKTsgIC8qIHN0b3JlIHRvcCAqLyAgICAgICAgIFwKKyAgUEFDS19BTkRfU1RPUkUoYywgZCwgZGlhZzIsIGRpYWcxLCAob3V0KSArIDIgKiAzMik7ICAvKiBzdG9yZSBib3R0b20gKi8gICAgICBcCit9CisKKy8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCitzdGF0aWMgdm9pZCBVcHNhbXBsZTMyUGl4ZWxzX1NTRTIoY29uc3QgdWludDhfdCByMVtdLCBjb25zdCB1aW50OF90IHIyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0KSB7CisgIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KTsKK30KKworI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCByMVsxN10sIHIyWzE3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcmVwbGljYXRlIGxhc3QgYnl0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldChyMSArIChudW1fcGl4ZWxzKSwgcjFbKG51bV9waXhlbHMpIC0gMV0sIDE3IC0gKG51bV9waXhlbHMpKTsgICAgICAgICAgXAorICBtZW1zZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKKyAgLyogdXNpbmcgdGhlIHNoYXJlZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBtYWNybyBzYXZlcyB+M2sgY29kZSBzaXplICovICAgICBcCisgIFVwc2FtcGxlMzJQaXhlbHNfU1NFMihyMSwgcjIsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlVOQyMjMzJfU1NFMigodG9wX3kpICsgKGN1cl94KSwgcl91LCByX3YsICh0b3BfZHN0KSArIChjdXJfeCkgKiAoWFNURVApKTsgICBcCisgIGlmICgoYm90dG9tX3kpICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMjIzMyX1NTRTIoKGJvdHRvbV95KSArIChjdXJfeCksIHJfdSArIDY0LCByX3YgKyA2NCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIChib3R0b21fZHN0KSArIChjdXJfeCkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTU0UyX1VQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCisgIGludCB1dl9wb3MsIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiAxNmJ5dGUtYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCB1dl9idWZbMTQgKiAzMiArIDE1XSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHJfdSA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkodXZfYnVmICsgMTUpICYgfjE1KTsgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCByX3YgPSByX3UgKyAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgLyogVHJlYXQgdGhlIGZpcnN0IHBpeGVsIGluIHJlZ3VsYXIgd2F5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdV9kaWFnID0gKCh0b3BfdVswXSArIGN1cl91WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHZfZGlhZyA9ICgodG9wX3ZbMF0gKyBjdXJfdlswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1MF90ID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdjBfdCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdTBfdCwgdjBfdCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IGludCB1MF9iID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBpbnQgdjBfYiA9IChjdXJfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVswXSwgdTBfYiwgdjBfYiwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBGb3IgVVBTQU1QTEVfMzJQSVhFTFMsIDE3IHUvdiB2YWx1ZXMgbXVzdCBiZSByZWFkLWFibGUgZm9yIGVhY2ggYmxvY2sgKi8gIFwKKyAgZm9yIChwb3MgPSAxLCB1dl9wb3MgPSAwOyBwb3MgKyAzMiArIDEgPD0gbGVuOyBwb3MgKz0gMzIsIHV2X3BvcyArPSAxNikgeyAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCByX3UpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3Bvcywgcl92KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB0b3BfZHN0LCBib3R0b21fZHN0LCBwb3MpOyAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuID4gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gKChsZW4gKyAxKSA+PiAxKSAtIChwb3MgPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX3RvcF9kc3QgPSByX3UgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9ib3R0b21fZHN0ID0gdG1wX3RvcF9kc3QgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfdG9wID0gdG1wX2JvdHRvbV9kc3QgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX2JvdHRvbSA9IChib3R0b21feSA9PSBOVUxMKSA/IE5VTEwgOiB0bXBfdG9wICsgMzI7ICAgICAgXAorICAgIGFzc2VydChsZWZ0X292ZXIgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF91ICsgdXZfcG9zLCBjdXJfdSArIHV2X3BvcywgbGVmdF9vdmVyLCByX3UpOyAgICAgICBcCisgICAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdiArIHV2X3BvcywgY3VyX3YgKyB1dl9wb3MsIGxlZnRfb3Zlciwgcl92KTsgICAgICAgXAorICAgIG1lbWNweSh0bXBfdG9wLCB0b3BfeSArIHBvcywgbGVuIC0gcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgbWVtY3B5KHRtcF9ib3R0b20sIGJvdHRvbV95ICsgcG9zLCBsZW4gLSBwb3MpOyAgICAgICBcCisgICAgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRtcF90b3AsIHRtcF9ib3R0b20sIHRtcF90b3BfZHN0LCAgICAgICAgICAgICAgXAorICAgICAgICAgdG1wX2JvdHRvbV9kc3QsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkodG9wX2RzdCArIHBvcyAqIChYU1RFUCksIHRtcF90b3BfZHN0LCAobGVuIC0gcG9zKSAqIChYU1RFUCkpOyAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVtY3B5KGJvdHRvbV9kc3QgKyBwb3MgKiAoWFNURVApLCB0bXBfYm90dG9tX2RzdCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAobGVuIC0gcG9zKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gU1NFMiB2YXJpYW50cyBvZiB0aGUgZmFuY3kgdXBzYW1wbGVyLgorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyX1NTRTIsIFZQOFl1dlRvUmdiYSwgNCkKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpcl9TU0UyLCBWUDhZdXZUb0JncmEsIDQpCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpcl9TU0UyLCAgVlA4WXV2VG9SZ2IsICAzKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXJfU1NFMiwgIFZQOFl1dlRvQmdyLCAgMykKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpcl9TU0UyLCBWUDhZdXZUb0FyZ2IsIDQpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX1NTRTIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9TU0UyLCBWUDhZdXZUb1JnYjU2NSwgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjdW5kZWYgR0VUX00KKyN1bmRlZiBQQUNLX0FORF9TVE9SRQorI3VuZGVmIFVQU0FNUExFXzMyUElYRUxTCisjdW5kZWYgVVBTQU1QTEVfTEFTVF9CTE9DSworI3VuZGVmIENPTlZFUlQyUkdCCisjdW5kZWYgQ09OVkVSVDJSR0JfMzIKKyN1bmRlZiBTU0UyX1VQU0FNUExFX0ZVTkMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIodm9pZCkgeworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfU1NFMjsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9TU0UyOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1svKiBNT0RFX0xBU1QgKi9dOworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFMih2b2lkKTsKKworI2RlZmluZSBZVVY0NDRfRlVOQyhGVU5DX05BTUUsIENBTEwsIENBTExfQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2V4dGVybiB2b2lkIENBTExfQyhjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbWF4X2xlbiA9IGxlbiAmIH4zMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IG1heF9sZW47IGkgKz0gMzIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0FMTCh5ICsgaSwgdSArIGksIHYgKyBpLCBkc3QgKyBpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgPCBsZW4pIHsgIC8qIEMtZmFsbGJhY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0FMTF9DKHkgKyBpLCB1ICsgaSwgdiArIGksIGRzdCArIGkgKiAoWFNURVApLCBsZW4gLSBpKTsgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhX1NTRTIsIFZQOFl1dlRvUmdiYTMyX1NTRTIsIFdlYlBZdXY0NDRUb1JnYmFfQywgNCk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb0JncmFfU1NFMiwgVlA4WXV2VG9CZ3JhMzJfU1NFMiwgV2ViUFl1djQ0NFRvQmdyYV9DLCA0KTsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYl9TU0UyLCBWUDhZdXZUb1JnYjMyX1NTRTIsIFdlYlBZdXY0NDRUb1JnYl9DLCAzKTsKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyX1NTRTIsIFZQOFl1dlRvQmdyMzJfU1NFMiwgV2ViUFl1djQ0NFRvQmdyX0MsIDMpOworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9BcmdiX1NTRTIsIFZQOFl1dlRvQXJnYjMyX1NTRTIsIFdlYlBZdXY0NDRUb0FyZ2JfQywgNCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiYTQ0NDRfU1NFMiwgVlA4WXV2VG9SZ2JhNDQ0NDMyX1NTRTIsIFwKKyAgICAgICAgICAgIFdlYlBZdXY0NDRUb1JnYmE0NDQ0X0MsIDIpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYjU2NV9TU0UyLCBWUDhZdXZUb1JnYjU2NTMyX1NTRTIsIFdlYlBZdXY0NDRUb1JnYjU2NV9DLCAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKHZvaWQpIHsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXSAgICAgID0gWXV2NDQ0VG9SZ2JhX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSQV0gICAgICA9IFl1djQ0NFRvQmdyYV9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFdICAgICAgPSBZdXY0NDRUb1JnYmFfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9iZ3JBXSAgICAgID0gWXV2NDQ0VG9CZ3JhX1NTRTI7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl0gICAgICAgPSBZdXY0NDRUb1JnYl9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBZdXY0NDRUb0Jncl9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FSR0JdICAgICAgPSBZdXY0NDRUb0FyZ2JfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXzQ0NDRdID0gWXV2NDQ0VG9SZ2JhNDQ0NF9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl81NjVdICAgPSBZdXY0NDRUb1JnYjU2NV9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FyZ2JdICAgICAgPSBZdXY0NDRUb0FyZ2JfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gWXV2NDQ0VG9SZ2JhNDQ0NF9TU0UyOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbHNlCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc1NTRTIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNGRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNDEgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKworLy8gV2UgY29tcHV0ZSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYgYXMgZm9sbG93cworLy8gdSA9ICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNgorLy8gICA9IChhICsgKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDggKyAxKSAvIDIKKy8vICAgPSAoYSArIG0gKyAxKSAvIDIKKy8vIHdoZXJlIG0gPSAoYSArIDMqYiArIDMqYyArIGQpIC8gOAorLy8gICAgICAgICA9ICgoYSArIGIgKyBjICsgZCkgLyAyICsgYiArIGMpIC8gNAorLy8KKy8vIExldCdzIHNheSAgayA9IChhICsgYiArIGMgKyBkKSAvIDQuCisvLyBXZSBjYW4gY29tcHV0ZSBrIGFzCisvLyBrID0gKHMgKyB0ICsgMSkgLyAyIC0gKChhXmQpIHwgKGJeYykgfCAoc150KSkgJiAxCisvLyB3aGVyZSBzID0gKGEgKyBkICsgMSkgLyAyIGFuZCB0ID0gKGIgKyBjICsgMSkgLyAyCisvLworLy8gVGhlbiBtIGNhbiBiZSB3cml0dGVuIGFzCisvLyBtID0gKGsgKyB0ICsgMSkgLyAyIC0gKCgoYl5jKSAmIChzXnQpKSB8IChrXnQpKSAmIDEKKworLy8gQ29tcHV0ZXMgb3V0ID0gKGsgKyBpbiArIDEpIC8gMiAtICgoaWogJiAoc150KSkgfCAoa15pbikpICYgMQorI2RlZmluZSBHRVRfTShpaiwgaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2F2Z19lcHU4KGssIChpbikpOyAgICAgLyogKGsgKyBpbiArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hbmRfc2kxMjgoKGlqKSwgc3QpOyAgIC8qIChpaikgJiAoc150KSAqLyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1feG9yX3NpMTI4KGssIChpbikpOyAgICAvKiAoa15pbikgKi8gICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX29yX3NpMTI4KHRtcDEsIHRtcDIpOyAgLyogKChpaikgJiAoc150KSkgfCAoa15pbikgKi9cCisgIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9hbmRfc2kxMjgodG1wMywgb25lKTsgIC8qICYgMSAtPiBsc2JfY29ycmVjdGlvbiAqLyAgXAorICAob3V0KSA9IF9tbV9zdWJfZXBpOCh0bXAwLCB0bXA0KTsgICAgLyogKGsgKyBpbiArIDEpIC8gMiAtIGxzYl9jb3JyZWN0aW9uICovIFwKK30gd2hpbGUgKDApCisKKy8vIHBhY2sgYW5kIHN0b3JlIHR3byBhbHRlcm5hdGluZyBwaXhlbCByb3dzCisjZGVmaW5lIFBBQ0tfQU5EX1NUT1JFKGEsIGIsIGRhLCBkYiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRfYSA9IF9tbV9hdmdfZXB1OChhLCBkYSk7ICAvKiAoOWEgKyAzYiArIDNjICsgIGQgKyA4KSAvIDE2ICovIFwKKyAgY29uc3QgX19tMTI4aSB0X2IgPSBfbW1fYXZnX2VwdTgoYiwgZGIpOyAgLyogKDNhICsgOWIgKyAgYyArIDNkICsgOCkgLyAxNiAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdF8xID0gX21tX3VucGFja2xvX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRfMiA9IF9tbV91bnBhY2toaV9lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMCwgdF8xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDEsIHRfMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gTG9hZHMgMTcgcGl4ZWxzIGVhY2ggZnJvbSByb3dzIHIxIGFuZCByMiBhbmQgZ2VuZXJhdGVzIDMyIHBpeGVscy4KKyNkZWZpbmUgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjEpWzBdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIxKVsxXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMilbMF0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjIpWzFdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgcyA9IF9tbV9hdmdfZXB1OChhLCBkKTsgICAgICAgIC8qIHMgPSAoYSArIGQgKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHQgPSBfbW1fYXZnX2VwdTgoYiwgYyk7ICAgICAgICAvKiB0ID0gKGIgKyBjICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBzdCA9IF9tbV94b3Jfc2kxMjgocywgdCk7ICAgICAgLyogc3QgPSBzXnQgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFkID0gX21tX3hvcl9zaTEyOChhLCBkKTsgICAgICAvKiBhZCA9IGFeZCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBiYyA9IF9tbV94b3Jfc2kxMjgoYiwgYyk7ICAgICAgLyogYmMgPSBiXmMgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHQxID0gX21tX29yX3NpMTI4KGFkLCBiYyk7ICAgICAvKiAoYV5kKSB8IChiXmMpICovICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9vcl9zaTEyOCh0MSwgc3QpOyAgICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICovICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDMgPSBfbW1fYW5kX3NpMTI4KHQyLCBvbmUpOyAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAmIDEgKi8gXAorICBjb25zdCBfX20xMjhpIHQ0ID0gX21tX2F2Z19lcHU4KHMsIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBrID0gX21tX3N1Yl9lcGk4KHQ0LCB0Myk7ICAgICAgLyogayA9IChhICsgYiArIGMgKyBkKSAvIDQgKi8gICBcCisgIF9fbTEyOGkgZGlhZzEsIGRpYWcyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX00oYmMsIHQsIGRpYWcxKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMSA9IChhICsgM2IgKyAzYyArIGQpIC8gOCAqLyAgICBcCisgIEdFVF9NKGFkLCBzLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgLyogZGlhZzIgPSAoM2EgKyBiICsgYyArIDNkKSAvIDggKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcGFjayB0aGUgYWx0ZXJuYXRlIHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBBQ0tfQU5EX1NUT1JFKGEsIGIsIGRpYWcxLCBkaWFnMiwgKG91dCkgKyAgICAgIDApOyAgLyogc3RvcmUgdG9wICovICAgICAgICAgXAorICBQQUNLX0FORF9TVE9SRShjLCBkLCBkaWFnMiwgZGlhZzEsIChvdXQpICsgMiAqIDMyKTsgIC8qIHN0b3JlIGJvdHRvbSAqLyAgICAgIFwKK30KKworLy8gVHVybiB0aGUgbWFjcm8gaW50byBhIGZ1bmN0aW9uIGZvciByZWR1Y2luZyBjb2RlLXNpemUgd2hlbiBub24tY3JpdGljYWwKK3N0YXRpYyB2b2lkIFVwc2FtcGxlMzJQaXhlbHNfU1NFNDEoY29uc3QgdWludDhfdCByMVtdLCBjb25zdCB1aW50OF90IHIyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0KSB7CisgIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KTsKK30KKworI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCByMVsxN10sIHIyWzE3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcmVwbGljYXRlIGxhc3QgYnl0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldChyMSArIChudW1fcGl4ZWxzKSwgcjFbKG51bV9waXhlbHMpIC0gMV0sIDE3IC0gKG51bV9waXhlbHMpKTsgICAgICAgICAgXAorICBtZW1zZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKKyAgLyogdXNpbmcgdGhlIHNoYXJlZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBtYWNybyBzYXZlcyB+M2sgY29kZSBzaXplICovICAgICBcCisgIFVwc2FtcGxlMzJQaXhlbHNfU1NFNDEocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlVOQyMjMzJfU1NFNDEoKHRvcF95KSArIChjdXJfeCksIHJfdSwgcl92LCAodG9wX2RzdCkgKyAoY3VyX3gpICogKFhTVEVQKSk7ICBcCisgIGlmICgoYm90dG9tX3kpICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMjIzMyX1NTRTQxKChib3R0b21feSkgKyAoY3VyX3gpLCByX3UgKyA2NCwgcl92ICsgNjQsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIChib3R0b21fZHN0KSArIChjdXJfeCkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTU0U0X1VQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCisgIGludCB1dl9wb3MsIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiAxNmJ5dGUtYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCB1dl9idWZbMTQgKiAzMiArIDE1XSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHJfdSA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkodXZfYnVmICsgMTUpICYgfjE1KTsgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCByX3YgPSByX3UgKyAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgLyogVHJlYXQgdGhlIGZpcnN0IHBpeGVsIGluIHJlZ3VsYXIgd2F5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdV9kaWFnID0gKCh0b3BfdVswXSArIGN1cl91WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHZfZGlhZyA9ICgodG9wX3ZbMF0gKyBjdXJfdlswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1MF90ID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdjBfdCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdTBfdCwgdjBfdCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IGludCB1MF9iID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBpbnQgdjBfYiA9IChjdXJfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVswXSwgdTBfYiwgdjBfYiwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBGb3IgVVBTQU1QTEVfMzJQSVhFTFMsIDE3IHUvdiB2YWx1ZXMgbXVzdCBiZSByZWFkLWFibGUgZm9yIGVhY2ggYmxvY2sgKi8gIFwKKyAgZm9yIChwb3MgPSAxLCB1dl9wb3MgPSAwOyBwb3MgKyAzMiArIDEgPD0gbGVuOyBwb3MgKz0gMzIsIHV2X3BvcyArPSAxNikgeyAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCByX3UpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3Bvcywgcl92KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB0b3BfZHN0LCBib3R0b21fZHN0LCBwb3MpOyAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuID4gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gKChsZW4gKyAxKSA+PiAxKSAtIChwb3MgPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX3RvcF9kc3QgPSByX3UgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9ib3R0b21fZHN0ID0gdG1wX3RvcF9kc3QgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfdG9wID0gdG1wX2JvdHRvbV9kc3QgKyA0ICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX2JvdHRvbSA9IChib3R0b21feSA9PSBOVUxMKSA/IE5VTEwgOiB0bXBfdG9wICsgMzI7ICAgICAgXAorICAgIGFzc2VydChsZWZ0X292ZXIgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF91ICsgdXZfcG9zLCBjdXJfdSArIHV2X3BvcywgbGVmdF9vdmVyLCByX3UpOyAgICAgICBcCisgICAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdiArIHV2X3BvcywgY3VyX3YgKyB1dl9wb3MsIGxlZnRfb3Zlciwgcl92KTsgICAgICAgXAorICAgIG1lbWNweSh0bXBfdG9wLCB0b3BfeSArIHBvcywgbGVuIC0gcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgbWVtY3B5KHRtcF9ib3R0b20sIGJvdHRvbV95ICsgcG9zLCBsZW4gLSBwb3MpOyAgICAgICBcCisgICAgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRtcF90b3AsIHRtcF9ib3R0b20sIHRtcF90b3BfZHN0LCAgICAgICAgICAgICAgXAorICAgICAgICAgdG1wX2JvdHRvbV9kc3QsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkodG9wX2RzdCArIHBvcyAqIChYU1RFUCksIHRtcF90b3BfZHN0LCAobGVuIC0gcG9zKSAqIChYU1RFUCkpOyAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVtY3B5KGJvdHRvbV9kc3QgKyBwb3MgKiAoWFNURVApLCB0bXBfYm90dG9tX2RzdCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAobGVuIC0gcG9zKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gU1NFNCB2YXJpYW50cyBvZiB0aGUgZmFuY3kgdXBzYW1wbGVyLgorU1NFNF9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXJfU1NFNDEsICBWUDhZdXZUb1JnYiwgIDMpCitTU0U0X1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpcl9TU0U0MSwgIFZQOFl1dlRvQmdyLCAgMykKKworI3VuZGVmIEdFVF9NCisjdW5kZWYgUEFDS19BTkRfU1RPUkUKKyN1bmRlZiBVUFNBTVBMRV8zMlBJWEVMUworI3VuZGVmIFVQU0FNUExFX0xBU1RfQkxPQ0sKKyN1bmRlZiBDT05WRVJUMlJHQgorI3VuZGVmIENPTlZFUlQyUkdCXzMyCisjdW5kZWYgU1NFNF9VUFNBTVBMRV9GVU5DCisKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTQxKHZvaWQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyX1NTRTQxOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gID0gVXBzYW1wbGVCZ3JMaW5lUGFpcl9TU0U0MTsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIFdlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbLyogTU9ERV9MQVNUICovXTsKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTQxKHZvaWQpOworCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgQ0FMTCwgQ0FMTF9DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZXh0ZXJuIHZvaWQgQ0FMTF9DKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBtYXhfbGVuID0gbGVuICYgfjMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbWF4X2xlbjsgaSArPSAzMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxMKHkgKyBpLCB1ICsgaSwgdiArIGksIGRzdCArIGkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSA8IGxlbikgeyAgLyogQy1mYWxsYmFjayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxMX0MoeSArIGksIHUgKyBpLCB2ICsgaSwgZHN0ICsgaSAqIChYU1RFUCksIGxlbiAtIGkpOyAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JfU1NFNDEsIFZQOFl1dlRvUmdiMzJfU1NFNDEsIFdlYlBZdXY0NDRUb1JnYl9DLCAzKTsKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyX1NTRTQxLCBWUDhZdXZUb0JncjMyX1NTRTQxLCBXZWJQWXV2NDQ0VG9CZ3JfQywgMyk7CisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFNDEodm9pZCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JdICAgICAgID0gWXV2NDQ0VG9SZ2JfU1NFNDE7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSXSAgICAgICA9IFl1djQ0NFRvQmdyX1NTRTQxOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbHNlCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQorCisjaWYgIShkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpICYmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc1NTRTQxKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY3YWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuYwpAQCAtMCwwICsxLDMxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGxhaW4tQyB2ZXJzaW9uCisKKyNkZWZpbmUgUk9XX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZCA9IGRzdCArIChsZW4gJiB+MSkgKiAoWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoZHN0ICE9IGVuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh5WzFdLCB1WzBdLCB2WzBdLCBkc3QgKyAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHkgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSAyICogKFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoeVswXSwgdVswXSwgdlswXSwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisvLyBBbGwgdmFyaWFudHMgaW1wbGVtZW50ZWQuCitST1dfRlVOQyhZdXZUb1JnYlJvdywgICAgICBWUDhZdXZUb1JnYiwgIDMpCitST1dfRlVOQyhZdXZUb0JnclJvdywgICAgICBWUDhZdXZUb0JnciwgIDMpCitST1dfRlVOQyhZdXZUb1JnYmFSb3csICAgICBWUDhZdXZUb1JnYmEsIDQpCitST1dfRlVOQyhZdXZUb0JncmFSb3csICAgICBWUDhZdXZUb0JncmEsIDQpCitST1dfRlVOQyhZdXZUb0FyZ2JSb3csICAgICBWUDhZdXZUb0FyZ2IsIDQpCitST1dfRlVOQyhZdXZUb1JnYmE0NDQ0Um93LCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQorUk9XX0ZVTkMoWXV2VG9SZ2I1NjVSb3csICAgVlA4WXV2VG9SZ2I1NjUsIDIpCisKKyN1bmRlZiBST1dfRlVOQworCisvLyBNYWluIGNhbGwgZm9yIHByb2Nlc3NpbmcgYSBwbGFuZSB3aXRoIGEgV2ViUFNhbXBsZXJSb3dGdW5jIGZ1bmN0aW9uOgordm9pZCBXZWJQU2FtcGxlclByb2Nlc3NQbGFuZShjb25zdCB1aW50OF90KiB5LCBpbnQgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsIGludCB1dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgV2ViUFNhbXBsZXJSb3dGdW5jIGZ1bmMpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZ1bmMoeSwgdSwgdiwgZHN0LCB3aWR0aCk7CisgICAgeSArPSB5X3N0cmlkZTsKKyAgICBpZiAoaiAmIDEpIHsKKyAgICAgIHUgKz0gdXZfc3RyaWRlOworICAgICAgdiArPSB1dl9zdHJpZGU7CisgICAgfQorICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gY2FsbAorCitXZWJQU2FtcGxlclJvd0Z1bmMgV2ViUFNhbXBsZXJzW01PREVfTEFTVF07CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQSW5pdFNhbXBsZXJzKSB7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBZdXZUb1JnYlJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gICAgICA9IFl1dlRvUmdiYVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFl1dlRvQmdyUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gWXV2VG9CZ3JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9BUkdCXSAgICAgID0gWXV2VG9BcmdiUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gWXV2VG9SZ2JhNDQ0NFJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFl1dlRvUmdiNTY1Um93OworICBXZWJQU2FtcGxlcnNbTU9ERV9yZ2JBXSAgICAgID0gWXV2VG9SZ2JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gWXV2VG9CZ3JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gWXV2VG9BcmdiUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gWXV2VG9SZ2JhNDQ0NFJvdzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRTYW1wbGVyc1NTRTIoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzU1NFNDEoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBvbiBhdCBsZWFzdCBvbmUgU3RhcmJvYXJkIE1JUFMgcGxhdGZvcm0gdGhlIE1JUFMgRFNQIChyMikKKyAgICAvLyBjb2RlIHdhcyBmb3VuZCB0byBwcm9kdWNlIGVycm9uZW91cyByZXN1bHRzIChtb3N0IHBpeGVscyBlbmQgdXAgZWl0aGVyCisgICAgLy8gd2hpdGUgb3IgcHVycGxlKS4gIEl0IGlzIGRpc2FibGVkIGZvciBub3cgb3V0IG9mIGxhY2sgb2YgdGltZSBhbmQKKyAgICAvLyBwcmlvcml0eSBmb3IgaW52ZXN0aWdhdGlvbiwgYnV0IGlmIGFkZGl0aW9uYWwgcGVyZm9ybWFuY2UgaXMgcmVxdWlyZWQsCisgICAgLy8gdGhlIGlzc3VlIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgYW5kIGZpeGVkIHByb3Blcmx5LgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUEluaXRTYW1wbGVyc01JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKKyNlbmRpZgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFSR0IgLT4gWVVWIGNvbnZlcnRlcnMKKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1lfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHAgPSBhcmdiW2ldOworICAgIHlbaV0gPSBWUDhSR0JUb1koKHAgPj4gMTYpICYgMHhmZiwgKHAgPj4gOCkgJiAweGZmLCAocCA+PiAgMCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgWVVWX0hBTEYpOworICB9Cit9CisKK3ZvaWQgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKSB7CisgIC8vIE5vIHJvdW5kaW5nLiBMYXN0IHBpeGVsIGlzIGRlYWx0IHdpdGggc2VwYXJhdGVseS4KKyAgY29uc3QgaW50IHV2X3dpZHRoID0gc3JjX3dpZHRoID4+IDE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdXZfd2lkdGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHYwID0gYXJnYlsyICogaSArIDBdOworICAgIGNvbnN0IHVpbnQzMl90IHYxID0gYXJnYlsyICogaSArIDFdOworICAgIC8vIFZQOFJHQlRvVS9WIGV4cGVjdHMgZm91ciBhY2N1bXVsYXRlZCBwaXhlbHMuIEhlbmNlIHdlIG5lZWQgdG8KKyAgICAvLyBzY2FsZSByL2cvYiB2YWx1ZSBieSBhIGZhY3RvciAyLiBXZSBqdXN0IHNoaWZ0IHYwL3YxIG9uZSBiaXQgbGVzcy4KKyAgICBjb25zdCBpbnQgciA9ICgodjAgPj4gMTUpICYgMHgxZmUpICsgKCh2MSA+PiAxNSkgJiAweDFmZSk7CisgICAgY29uc3QgaW50IGcgPSAoKHYwID4+ICA3KSAmIDB4MWZlKSArICgodjEgPj4gIDcpICYgMHgxZmUpOworICAgIGNvbnN0IGludCBiID0gKCh2MCA8PCAgMSkgJiAweDFmZSkgKyAoKHYxIDw8ICAxKSAmIDB4MWZlKTsKKyAgICBjb25zdCBpbnQgdG1wX3UgPSBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgY29uc3QgaW50IHRtcF92ID0gVlA4UkdCVG9WKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGlmIChkb19zdG9yZSkgeworICAgICAgdVtpXSA9IHRtcF91OworICAgICAgdltpXSA9IHRtcF92OworICAgIH0gZWxzZSB7CisgICAgICAvLyBBcHByb3hpbWF0ZWQgYXZlcmFnZS1vZi1mb3VyLiBCdXQgaXQncyBhbiBhY2NlcHRhYmxlIGRpZmYuCisgICAgICB1W2ldID0gKHVbaV0gKyB0bXBfdSArIDEpID4+IDE7CisgICAgICB2W2ldID0gKHZbaV0gKyB0bXBfdiArIDEpID4+IDE7CisgICAgfQorICB9CisgIGlmIChzcmNfd2lkdGggJiAxKSB7ICAgICAgIC8vIGxhc3QgcGl4ZWwKKyAgICBjb25zdCB1aW50MzJfdCB2MCA9IGFyZ2JbMiAqIGkgKyAwXTsKKyAgICBjb25zdCBpbnQgciA9ICh2MCA+PiAxNCkgJiAweDNmYzsKKyAgICBjb25zdCBpbnQgZyA9ICh2MCA+PiAgNikgJiAweDNmYzsKKyAgICBjb25zdCBpbnQgYiA9ICh2MCA8PCAgMikgJiAweDNmYzsKKyAgICBjb25zdCBpbnQgdG1wX3UgPSBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgY29uc3QgaW50IHRtcF92ID0gVlA4UkdCVG9WKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGlmIChkb19zdG9yZSkgeworICAgICAgdVtpXSA9IHRtcF91OworICAgICAgdltpXSA9IHRtcF92OworICAgIH0gZWxzZSB7CisgICAgICB1W2ldID0gKHVbaV0gKyB0bXBfdSArIDEpID4+IDE7CisgICAgICB2W2ldID0gKHZbaV0gKyB0bXBfdiArIDEpID4+IDE7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQ29udmVydFJHQjI0VG9ZX0MoY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpLCByZ2IgKz0gMykgeworICAgIHlbaV0gPSBWUDhSR0JUb1kocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1IyNFRvWV9DKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSwgYmdyICs9IDMpIHsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCit2b2lkIFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgdVtpXSA9IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICB2W2ldID0gVlA4UkdCVG9WKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyNkZWZpbmUgTUFYX1kgKCgxIDw8IDEwKSAtIDEpICAgIC8vIDEwYiBwcmVjaXNpb24gb3ZlciAxNmItYXJpdGhtZXRpYworc3RhdGljIHVpbnQxNl90IGNsaXBfeShpbnQgdikgeworICByZXR1cm4gKHYgPCAwKSA/IDAgOiAodiA+IE1BWF9ZKSA/IE1BWF9ZIDogKHVpbnQxNl90KXY7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBTaGFycFlVVlVwZGF0ZVlfQyhjb25zdCB1aW50MTZfdCogcmVmLCBjb25zdCB1aW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgdWludDY0X3QgZGlmZiA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl95ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGNvbnN0IGludCBuZXdfeSA9IChpbnQpZHN0W2ldICsgZGlmZl95OworICAgIGRzdFtpXSA9IGNsaXBfeShuZXdfeSk7CisgICAgZGlmZiArPSAodWludDY0X3QpYWJzKGRpZmZfeSk7CisgIH0KKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWVXBkYXRlUkdCX0MoY29uc3QgaW50MTZfdCogcmVmLCBjb25zdCBpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfdXYgPSByZWZbaV0gLSBzcmNbaV07CisgICAgZHN0W2ldICs9IGRpZmZfdXY7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZGaWx0ZXJSb3dfQyhjb25zdCBpbnQxNl90KiBBLCBjb25zdCBpbnQxNl90KiBCLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYmVzdF95LCB1aW50MTZfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2ksICsrQSwgKytCKSB7CisgICAgY29uc3QgaW50IHYwID0gKEFbMF0gKiA5ICsgQVsxXSAqIDMgKyBCWzBdICogMyArIEJbMV0gKyA4KSA+PiA0OworICAgIGNvbnN0IGludCB2MSA9IChBWzFdICogOSArIEFbMF0gKiAzICsgQlsxXSAqIDMgKyBCWzBdICsgOCkgPj4gNDsKKyAgICBvdXRbMiAqIGkgKyAwXSA9IGNsaXBfeShiZXN0X3lbMiAqIGkgKyAwXSArIHYwKTsKKyAgICBvdXRbMiAqIGkgKyAxXSA9IGNsaXBfeShiZXN0X3lbMiAqIGkgKyAxXSArIHYxKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyN1bmRlZiBNQVhfWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgKCpXZWJQQ29udmVydFJHQjI0VG9ZKShjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7Cit2b2lkICgqV2ViUENvbnZlcnRCR1IyNFRvWSkoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOwordm9pZCAoKldlYlBDb252ZXJ0UkdCQTMyVG9VVikoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCk7CisKK3ZvaWQgKCpXZWJQQ29udmVydEFSR0JUb1kpKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOwordm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvVVYpKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSk7CisKK3VpbnQ2NF90ICgqV2ViUFNoYXJwWVVWVXBkYXRlWSkoY29uc3QgdWludDE2X3QqIHJlZiwgY29uc3QgdWludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IGxlbik7Cit2b2lkICgqV2ViUFNoYXJwWVVWVXBkYXRlUkdCKShjb25zdCBpbnQxNl90KiByZWYsIGNvbnN0IGludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGRzdCwgaW50IGxlbik7Cit2b2lkICgqV2ViUFNoYXJwWVVWRmlsdGVyUm93KShjb25zdCBpbnQxNl90KiBBLCBjb25zdCBpbnQxNl90KiBCLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGJlc3RfeSwgdWludDE2X3QqIG91dCk7CisKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVk5FT04odm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNoYXJwWVVWU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2hhcnBZVVZORU9OKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKSB7CisgIFdlYlBDb252ZXJ0QVJHQlRvWSA9IENvbnZlcnRBUkdCVG9ZX0M7CisgIFdlYlBDb252ZXJ0QVJHQlRvVVYgPSBXZWJQQ29udmVydEFSR0JUb1VWX0M7CisKKyAgV2ViUENvbnZlcnRSR0IyNFRvWSA9IENvbnZlcnRSR0IyNFRvWV9DOworICBXZWJQQ29udmVydEJHUjI0VG9ZID0gQ29udmVydEJHUjI0VG9ZX0M7CisKKyAgV2ViUENvbnZlcnRSR0JBMzJUb1VWID0gV2ViUENvbnZlcnRSR0JBMzJUb1VWX0M7CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBTaGFycFlVVlVwZGF0ZVkgPSBTaGFycFlVVlVwZGF0ZVlfQzsKKyAgV2ViUFNoYXJwWVVWVXBkYXRlUkdCID0gU2hhcnBZVVZVcGRhdGVSR0JfQzsKKyAgV2ViUFNoYXJwWVVWRmlsdGVyUm93ID0gU2hhcnBZVVZGaWx0ZXJSb3dfQzsKKyNlbmRpZgorCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0UyKCk7CisgICAgICBXZWJQSW5pdFNoYXJwWVVWU1NFMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTQxKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWTkVPTigpOworICAgIFdlYlBJbml0U2hhcnBZVVZORU9OKCk7CisgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgorCisgIGFzc2VydChXZWJQQ29udmVydEFSR0JUb1kgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQ29udmVydEFSR0JUb1VWICE9IE5VTEwpOworICBhc3NlcnQoV2ViUENvbnZlcnRSR0IyNFRvWSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBDb252ZXJ0QkdSMjRUb1kgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQ29udmVydFJHQkEzMlRvVVYgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQU2hhcnBZVVZVcGRhdGVZICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFNoYXJwWVVWVXBkYXRlUkdCICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFNoYXJwWVVWRmlsdGVyUm93ICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3ODcyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBpbmxpbmUgWVVWPC0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb24KKy8vCisvLyBUaGUgZXhhY3QgbmFtaW5nIGlzIFknQ2JDciwgZm9sbG93aW5nIHRoZSBJVFUtUiBCVC42MDEgc3RhbmRhcmQuCisvLyBNb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyCisvLyBZID0gMC4yNTY5ICogUiArIDAuNTA0NCAqIEcgKyAwLjA5NzkgKiBCICsgMTYKKy8vIFUgPSAtMC4xNDgzICogUiAtIDAuMjkxMSAqIEcgKyAwLjQzOTQgKiBCICsgMTI4CisvLyBWID0gMC40Mzk0ICogUiAtIDAuMzY3OSAqIEcgLSAwLjA3MTUgKiBCICsgMTI4CisvLyBXZSB1c2UgMTZiaXQgZml4ZWQgcG9pbnQgb3BlcmF0aW9ucyBmb3IgUkdCLT5ZVVYgY29udmVyc2lvbiAoWVVWX0ZJWCkuCisvLworLy8gRm9yIHRoZSBZJ0NiQ3IgdG8gUkdCIGNvbnZlcnNpb24sIHRoZSBCVC42MDEgc3BlY2lmaWNhdGlvbiByZWFkczoKKy8vICAgUiA9IDEuMTY0ICogKFktMTYpICsgMS41OTYgKiAoVi0xMjgpCisvLyAgIEcgPSAxLjE2NCAqIChZLTE2KSAtIDAuODEzICogKFYtMTI4KSAtIDAuMzkxICogKFUtMTI4KQorLy8gICBCID0gMS4xNjQgKiAoWS0xNikgICAgICAgICAgICAgICAgICAgKyAyLjAxOCAqIChVLTEyOCkKKy8vIHdoZXJlIFkgaXMgaW4gdGhlIFsxNiwyMzVdIHJhbmdlLCBhbmQgVS9WIGluIHRoZSBbMTYsMjQwXSByYW5nZS4KKy8vCisvLyBUaGUgZml4ZWQtcG9pbnQgaW1wbGVtZW50YXRpb24gdXNlZCBoZXJlIGlzOgorLy8gIFIgPSAoMTkwNzcgLiB5ICAgICAgICAgICAgICsgMjYxNDkgLiB2IC0gMTQyMzQpID4+IDYKKy8vICBHID0gKDE5MDc3IC4geSAtICA2NDE5IC4gdSAtIDEzMzIwIC4gdiArICA4NzA4KSA+PiA2CisvLyAgQiA9ICgxOTA3NyAuIHkgKyAzMzA1MCAuIHUgICAgICAgICAgICAgLSAxNzY4NSkgPj4gNgorLy8gd2hlcmUgdGhlICcuJyBvcGVyYXRvciBpcyB0aGUgbXVsaGlfZXB1MTYgdmFyaWFudDoKKy8vICAgYSAuIGIgPSAoKGEgPDwgOCkgKiBiKSA+PiAxNgorLy8gdGhhdCBwcmVzZXJ2ZXMgOCBiaXRzIG9mIGZyYWN0aW9uYWwgcHJlY2lzaW9uIGJlZm9yZSBmaW5hbCBkZXNjYWxpbmcuCisKKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfWVVWX0hfCisjZGVmaW5lIFdFQlBfRFNQX1lVVl9IXworCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOF9kZWMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVViAtPiBSR0IgY29udmVyc2lvbgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0geworICBZVVZfRklYID0gMTYsICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIFJHQi0+WVVWCisgIFlVVl9IQUxGID0gMSA8PCAoWVVWX0ZJWCAtIDEpLAorCisgIFlVVl9GSVgyID0gNiwgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBZVVYtPlJHQgorICBZVVZfTUFTSzIgPSAoMjU2IDw8IFlVVl9GSVgyKSAtIDEKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzbG93ZXIgb24geDg2IGJ5IH43LTglLCBidXQgYml0LWV4YWN0IHdpdGggdGhlIFNTRTIvTkVPTiB2ZXJzaW9uCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTXVsdEhpKGludCB2LCBpbnQgY29lZmYpIHsgICAvLyBfbW1fbXVsaGlfZXB1MTYgZW11bGF0aW9uCisgIHJldHVybiAodiAqIGNvZWZmKSA+PiA4OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOENsaXA4KGludCB2KSB7CisgIHJldHVybiAoKHYgJiB+WVVWX01BU0syKSA9PSAwKSA/ICh2ID4+IFlVVl9GSVgyKSA6ICh2IDwgMCkgPyAwIDogMjU1OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvUihpbnQgeSwgaW50IHYpIHsKKyAgcmV0dXJuIFZQOENsaXA4KE11bHRIaSh5LCAxOTA3NykgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvRyhpbnQgeSwgaW50IHUsIGludCB2KSB7CisgIHJldHVybiBWUDhDbGlwOChNdWx0SGkoeSwgMTkwNzcpIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvQihpbnQgeSwgaW50IHUpIHsKKyAgcmV0dXJuIFZQOENsaXA4KE11bHRIaSh5LCAxOTA3NykgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYihpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7CisgIHJnYlswXSA9IFZQOFlVVlRvUih5LCB2KTsKKyAgcmdiWzFdID0gVlA4WVVWVG9HKHksIHUsIHYpOworICByZ2JbMl0gPSBWUDhZVVZUb0IoeSwgdSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyKGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiZ3IpIHsKKyAgYmdyWzBdID0gVlA4WVVWVG9CKHksIHUpOworICBiZ3JbMV0gPSBWUDhZVVZUb0coeSwgdSwgdik7CisgIGJnclsyXSA9IFZQOFlVVlRvUih5LCB2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2I1NjUoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBjb25zdCBpbnQgciA9IFZQOFlVVlRvUih5LCB2KTsgICAgICAvLyA1IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCBnID0gVlA4WVVWVG9HKHksIHUsIHYpOyAgIC8vIDYgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGIgPSBWUDhZVVZUb0IoeSwgdSk7ICAgICAgLy8gNSB1c2FibGUgYml0cworICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gNSk7CisgIGNvbnN0IGludCBnYiA9ICgoZyA8PCAzKSAmIDB4ZTApIHwgKGIgPj4gMyk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgcmdiWzBdID0gZ2I7CisgIHJnYlsxXSA9IHJnOworI2Vsc2UKKyAgcmdiWzBdID0gcmc7CisgIHJnYlsxXSA9IGdiOworI2VuZGlmCit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYTQ0NDQoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgeworICBjb25zdCBpbnQgciA9IFZQOFlVVlRvUih5LCB2KTsgICAgICAgIC8vIDQgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGcgPSBWUDhZVVZUb0coeSwgdSwgdik7ICAgICAvLyA0IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCBiID0gVlA4WVVWVG9CKHksIHUpOyAgICAgICAgLy8gNCB1c2FibGUgYml0cworICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjApIHwgKGcgPj4gNCk7CisgIGNvbnN0IGludCBiYSA9IChiICYgMHhmMCkgfCAweDBmOyAgICAgLy8gb3ZlcndyaXRlIHRoZSBsb3dlciA0IGJpdHMKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICBhcmdiWzBdID0gYmE7CisgIGFyZ2JbMV0gPSByZzsKKyNlbHNlCisgIGFyZ2JbMF0gPSByZzsKKyAgYXJnYlsxXSA9IGJhOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFscGhhIGhhbmRsaW5nIHZhcmlhbnRzCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgYXJnYlswXSA9IDB4ZmY7CisgIFZQOFl1dlRvUmdiKHksIHUsIHYsIGFyZ2IgKyAxKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyYSkgeworICBWUDhZdXZUb0Jncih5LCB1LCB2LCBiZ3JhKTsKKyAgYmdyYVszXSA9IDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgVlA4WXV2VG9SZ2IoeSwgdSwgdiwgcmdiYSk7CisgIHJnYmFbM10gPSAweGZmOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0UyIGV4dHJhIGZ1bmN0aW9ucyAobW9zdGx5IGZvciB1cHNhbXBsaW5nX3NzZTIuYykKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworLy8gUHJvY2VzcyAzMiBwaXhlbHMgYW5kIHN0b3JlIHRoZSByZXN1bHQgKDE2YiwgMjRiIG9yIDMyYiBwZXIgcGl4ZWwpIGluICpkc3QuCit2b2lkIFZQOFl1dlRvUmdiYTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb1JnYjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvQmdyYTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb0JncjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvQXJnYjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb1JnYmE0NDQ0MzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb1JnYjU2NTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7CisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9TU0UyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTRTQxIGV4dHJhIGZ1bmN0aW9ucyAobW9zdGx5IGZvciB1cHNhbXBsaW5nX3NzZTQxLmMpCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisvLyBQcm9jZXNzIDMyIHBpeGVscyBhbmQgc3RvcmUgdGhlIHJlc3VsdCAoMTZiLCAyNGIgb3IgMzJiIHBlciBwaXhlbCkgaW4gKmRzdC4KK3ZvaWQgVlA4WXV2VG9SZ2IzMl9TU0U0MShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvQmdyMzJfU1NFNDEoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOworCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfU1NFNDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgorCisvLyBTdHViIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCB2YXJpb3VzIHJvdW5kaW5nIHZhbHVlczoKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Q2xpcFVWKGludCB1diwgaW50IHJvdW5kaW5nKSB7CisgIHV2ID0gKHV2ICsgcm91bmRpbmcgKyAoMTI4IDw8IChZVVZfRklYICsgMikpKSA+PiAoWVVWX0ZJWCArIDIpOworICByZXR1cm4gKCh1diAmIH4weGZmKSA9PSAwKSA/IHV2IDogKHV2IDwgMCkgPyAwIDogMjU1OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgcm91bmRpbmcpIHsKKyAgY29uc3QgaW50IGx1bWEgPSAxNjgzOSAqIHIgKyAzMzA1OSAqIGcgKyA2NDIwICogYjsKKyAgcmV0dXJuIChsdW1hICsgcm91bmRpbmcgKyAoMTYgPDwgWVVWX0ZJWCkpID4+IFlVVl9GSVg7ICAvLyBubyBuZWVkIHRvIGNsaXAKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1UoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCB1ID0gLTk3MTkgKiByIC0gMTkwODEgKiBnICsgMjg4MDAgKiBiOworICByZXR1cm4gVlA4Q2xpcFVWKHUsIHJvdW5kaW5nKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCB2ID0gKzI4ODAwICogciAtIDI0MTE2ICogZyAtIDQ2ODQgKiBiOworICByZXR1cm4gVlA4Q2xpcFVWKHYsIHJvdW5kaW5nKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfRFNQX1lVVl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBhODg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwczMyLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2ltcGxlIHBvaW50LXNhbXBsaW5nCisKKyNkZWZpbmUgUk9XX0ZVTkMoRlVOQ19OQU1FLCBYU1RFUCwgUiwgRywgQiwgQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpLCByLCBnLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IChsZW4gPj4gMSk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgPSBNdWx0SGkodlswXSwgMjYxNDkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzID0gTXVsdEhpKHZbMF0sIDEzMzIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiA9IE11bHRIaSh1WzBdLCA2NDE5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgPSBNdWx0SGkodVswXSwgMzMwNTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAwID0gTXVsdEhpKHlbMF0sIDE5MDc3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSAtPSAxNDIzNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDMgLT0gODcwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAyICs9IHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wNCAtPSAxNzY4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgciA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGcgPSBWUDhDbGlwOCh0ZW1wMCAtIHRlbXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDAgPSBNdWx0SGkoeVsxXSwgMTkwNzcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtSXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbR10gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0JdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZyA9IFZQOENsaXA4KHRlbXAwIC0gdGVtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbUiArIFhTVEVQXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0cgKyBYU1RFUF0gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtCICsgWFNURVBdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0EgKyBYU1RFUF0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ICs9IDIgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGxlbiAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgPSBNdWx0SGkodlswXSwgMjYxNDkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzID0gTXVsdEhpKHZbMF0sIDEzMzIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiA9IE11bHRIaSh1WzBdLCA2NDE5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgPSBNdWx0SGkodVswXSwgMzMwNTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAwID0gTXVsdEhpKHlbMF0sIDE5MDc3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSAtPSAxNDIzNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDMgLT0gODcwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAyICs9IHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wNCAtPSAxNzY4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgciA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGcgPSBWUDhDbGlwOCh0ZW1wMCAtIHRlbXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W1JdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtHXSA9IGc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbQl0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUk9XX0ZVTkMoWXV2VG9SZ2JSb3dfTUlQUzMyLCAgICAgIDMsIDAsIDEsIDIsIDApCitST1dfRlVOQyhZdXZUb1JnYmFSb3dfTUlQUzMyLCAgICAgNCwgMCwgMSwgMiwgMykKK1JPV19GVU5DKFl1dlRvQmdyUm93X01JUFMzMiwgICAgICAzLCAyLCAxLCAwLCAwKQorUk9XX0ZVTkMoWXV2VG9CZ3JhUm93X01JUFMzMiwgICAgIDQsIDIsIDEsIDAsIDMpCisKKyN1bmRlZiBST1dfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIodm9pZCkgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICA9IFl1dlRvUmdiUm93X01JUFMzMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gPSBZdXZUb1JnYmFSb3dfTUlQUzMyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICA9IFl1dlRvQmdyUm93X01JUFMzMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSQV0gPSBZdXZUb0JncmFSb3dfTUlQUzMyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTYW1wbGVyc01JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOGFmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMTM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyBEU1ByMiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yKHMpOiAgQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBEam9yZGplIFBlc3V0ICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2ltcGxlIHBvaW50LXNhbXBsaW5nCisKKyNkZWZpbmUgUk9XX0ZVTkNfUEFSVF8xKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDAoJVt2XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXA0XSwgICAwKCVbdV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3ldKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDFdLCAgICVbdF9jb25fMV0sICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RfY29uXzJdLCAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0X2Nvbl8zXSwgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDRdLCAgICVbdF9jb25fNF0sICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RfY29uXzVdLCAgICAgJVt0ZW1wMF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgICVbdF9jb25fNl0gICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICAlW3RfY29uXzddICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICAgICVbdF9jb25fOF0gICAgICBcblx0IiAgICAgICAgICBcCisKKyNkZWZpbmUgUk9XX0ZVTkNfUEFSVF8yKFIsIEcsIEIsIEspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDBdLCAgICAgICAlW3RlbXAxXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgICAgICAgICBcCisiLmlmICIgI0sgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAxKCVbeV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzaGxsX3MudyAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAxNyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2hsbF9zLncgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuaWYgIiAjSyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdF9jb25fNV0sICAgICAlW3RlbXAwXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgIDE3ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmwgICAgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgMjQgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNybCAgICAgICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgIDI0ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICAgICAgICAgICVbdGVtcDVdLCAgICIgI1IgIiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAgICAgICAgICAlW3RlbXA2XSwgICAiICNHICIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgICAgICAgICAgJVt0ZW1wN10sICAgIiAjQiAiKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisKKyNkZWZpbmUgQVNNX0NMT0JCRVJfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogW3RfY29uXzFdInIiKHRfY29uXzEpLCBbdF9jb25fMl0iciIodF9jb25fMiksIFt0X2Nvbl8zXSJyIih0X2Nvbl8zKSwgICAgICAgXAorICAgIFt0X2Nvbl80XSJyIih0X2Nvbl80KSwgW3RfY29uXzVdInIiKHRfY29uXzUpLCBbdF9jb25fNl0iciIodF9jb25fNiksICAgICAgIFwKKyAgICBbdV0iciIodSksIFt2XSJyIih2KSwgW3ldInIiKHkpLCBbZHN0XSJyIihkc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgW3RfY29uXzddInIiKHRfY29uXzcpLCBbdF9jb25fOF0iciIodF9jb25fOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBST1dfRlVOQyhGVU5DX05BTUUsIFhTVEVQLCBSLCBHLCBCLCBBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fMSA9IDI2MTQ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzIgPSAxMzMyMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl8zID0gNjQxOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNCA9IDMzMDUwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzUgPSAxOTA3NzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl82ID0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNyA9IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzggPSAxNzY4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAobGVuID4+IDEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzIoUiwgRywgQiwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8yKFIgKyBYU1RFUCwgRyArIFhTVEVQLCBCICsgWFNURVAsIDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFTTV9DTE9CQkVSX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSBkc3RbQSArIFhTVEVQXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB5ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMiAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8yKFIsIEcsIEIsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFTTV9DTE9CQkVSX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1JPV19GVU5DKFl1dlRvUmdiUm93X01JUFNkc3BSMiwgICAgICAzLCAwLCAxLCAyLCAwKQorUk9XX0ZVTkMoWXV2VG9SZ2JhUm93X01JUFNkc3BSMiwgICAgIDQsIDAsIDEsIDIsIDMpCitST1dfRlVOQyhZdXZUb0JnclJvd19NSVBTZHNwUjIsICAgICAgMywgMiwgMSwgMCwgMCkKK1JPV19GVU5DKFl1dlRvQmdyYVJvd19NSVBTZHNwUjIsICAgICA0LCAyLCAxLCAwLCAzKQorCisjdW5kZWYgUk9XX0ZVTkMKKyN1bmRlZiBBU01fQ0xPQkJFUl9MSVNUCisjdW5kZWYgUk9XX0ZVTkNfUEFSVF8yCisjdW5kZWYgUk9XX0ZVTkNfUEFSVF8xCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl0gID0gWXV2VG9SZ2JSb3dfTUlQU2RzcFIyOworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSA9IFl1dlRvUmdiYVJvd19NSVBTZHNwUjI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3dfTUlQU2RzcFIyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JBXSA9IFl1dlRvQmdyYVJvd19NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRkNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbmVvbi5jCkBAIC0wLDAgKzEsMjg4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHVpbnQ4eDhfdCBDb252ZXJ0UkdCVG9ZX05FT04oY29uc3QgdWludDh4OF90IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHg4X3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBCKSB7CisgIGNvbnN0IHVpbnQxNng4X3QgciA9IHZtb3ZsX3U4KFIpOworICBjb25zdCB1aW50MTZ4OF90IGcgPSB2bW92bF91OChHKTsKKyAgY29uc3QgdWludDE2eDhfdCBiID0gdm1vdmxfdTgoQik7CisgIGNvbnN0IHVpbnQxNng0X3Qgcl9sbyA9IHZnZXRfbG93X3UxNihyKTsKKyAgY29uc3QgdWludDE2eDRfdCByX2hpID0gdmdldF9oaWdoX3UxNihyKTsKKyAgY29uc3QgdWludDE2eDRfdCBnX2xvID0gdmdldF9sb3dfdTE2KGcpOworICBjb25zdCB1aW50MTZ4NF90IGdfaGkgPSB2Z2V0X2hpZ2hfdTE2KGcpOworICBjb25zdCB1aW50MTZ4NF90IGJfbG8gPSB2Z2V0X2xvd191MTYoYik7CisgIGNvbnN0IHVpbnQxNng0X3QgYl9oaSA9IHZnZXRfaGlnaF91MTYoYik7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMF9sbyA9IHZtdWxsX25fdTE2KCAgICAgICAgIHJfbG8sIDE2ODM5dSk7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMF9oaSA9IHZtdWxsX25fdTE2KCAgICAgICAgIHJfaGksIDE2ODM5dSk7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMV9sbyA9IHZtbGFsX25fdTE2KHRtcDBfbG8sIGdfbG8sIDMzMDU5dSk7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMV9oaSA9IHZtbGFsX25fdTE2KHRtcDBfaGksIGdfaGksIDMzMDU5dSk7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMl9sbyA9IHZtbGFsX25fdTE2KHRtcDFfbG8sIGJfbG8sIDY0MjB1KTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAyX2hpID0gdm1sYWxfbl91MTYodG1wMV9oaSwgYl9oaSwgNjQyMHUpOworICBjb25zdCB1aW50MTZ4OF90IFkxID0gdmNvbWJpbmVfdTE2KHZyc2hybl9uX3UzMih0bXAyX2xvLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJzaHJuX25fdTMyKHRtcDJfaGksIDE2KSk7CisgIGNvbnN0IHVpbnQxNng4X3QgWTIgPSB2YWRkcV91MTYoWTEsIHZkdXBxX25fdTE2KDE2KSk7CisgIHJldHVybiB2cW1vdm5fdTE2KFkyKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydFJHQjI0VG9ZX05FT04oY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgsIHJnYiArPSAzICogOCkgeworICAgIGNvbnN0IHVpbnQ4eDh4M190IFJHQiA9IHZsZDNfdTgocmdiKTsKKyAgICBjb25zdCB1aW50OHg4X3QgWSA9IENvbnZlcnRSR0JUb1lfTkVPTihSR0IudmFsWzBdLCBSR0IudmFsWzFdLCBSR0IudmFsWzJdKTsKKyAgICB2c3QxX3U4KHkgKyBpLCBZKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIHJnYiArPSAzKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUjI0VG9ZX05FT04oY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgsIGJnciArPSAzICogOCkgeworICAgIGNvbnN0IHVpbnQ4eDh4M190IEJHUiA9IHZsZDNfdTgoYmdyKTsKKyAgICBjb25zdCB1aW50OHg4X3QgWSA9IENvbnZlcnRSR0JUb1lfTkVPTihCR1IudmFsWzJdLCBCR1IudmFsWzFdLCBCR1IudmFsWzBdKTsKKyAgICB2c3QxX3U4KHkgKyBpLCBZKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIGJnciArPSAzKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvWV9ORU9OKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgpIHsKKyAgICBjb25zdCB1aW50OHg4eDRfdCBSR0IgPSB2bGQ0X3U4KChjb25zdCB1aW50OF90KikmYXJnYltpXSk7CisgICAgY29uc3QgdWludDh4OF90IFkgPSBDb252ZXJ0UkdCVG9ZX05FT04oUkdCLnZhbFsyXSwgUkdCLnZhbFsxXSwgUkdCLnZhbFswXSk7CisgICAgdnN0MV91OCh5ICsgaSwgWSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgY29uc3QgdWludDMyX3QgcCA9IGFyZ2JbaV07CisgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+ICAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICBZVVZfSEFMRik7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBjb21wdXRlczogRFNUX3MxNiA9IFsoQzAgKiByICsgQzEgKiBnICsgQzIgKiBiKSA+PiAxNl0gKyBDU1QKKyNkZWZpbmUgTVVMVElQTFlfMTZiX1BSRUFNQkxFKHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng0X3Qgcl9sbyA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfbG93X3UxNihyKSk7ICBcCisgIGNvbnN0IGludDE2eDRfdCByX2hpID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9oaWdoX3UxNihyKSk7IFwKKyAgY29uc3QgaW50MTZ4NF90IGdfbG8gPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2xvd191MTYoZykpOyAgXAorICBjb25zdCBpbnQxNng0X3QgZ19oaSA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfaGlnaF91MTYoZykpOyBcCisgIGNvbnN0IGludDE2eDRfdCBiX2xvID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9sb3dfdTE2KGIpKTsgIFwKKyAgY29uc3QgaW50MTZ4NF90IGJfaGkgPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2hpZ2hfdTE2KGIpKQorCisjZGVmaW5lIE1VTFRJUExZXzE2YihDMCwgQzEsIEMyLCBDU1QsIERTVF9zMTYpIGRvIHsgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDBfbG8gPSB2bXVsbF9uX3MxNiggICAgICAgICByX2xvLCBDMCk7ICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMF9oaSA9IHZtdWxsX25fczE2KCAgICAgICAgIHJfaGksIEMwKTsgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAxX2xvID0gdm1sYWxfbl9zMTYodG1wMF9sbywgZ19sbywgQzEpOyAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDFfaGkgPSB2bWxhbF9uX3MxNih0bXAwX2hpLCBnX2hpLCBDMSk7ICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMl9sbyA9IHZtbGFsX25fczE2KHRtcDFfbG8sIGJfbG8sIEMyKTsgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAyX2hpID0gdm1sYWxfbl9zMTYodG1wMV9oaSwgYl9oaSwgQzIpOyAgICAgIFwKKyAgY29uc3QgaW50MTZ4OF90IHRtcDMgPSB2Y29tYmluZV9zMTYodnNocm5fbl9zMzIodG1wMl9sbywgMTYpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2hybl9uX3MzMih0bXAyX2hpLCAxNikpOyBcCisgIERTVF9zMTYgPSB2YWRkcV9zMTYodG1wMywgdmR1cHFfbl9zMTYoQ1NUKSk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIFRoaXMgbmVlZHMgdG8gYmUgYSBtYWNybywgc2luY2UgKDEyOCA8PCBTSElGVCkgbmVlZHMgdG8gYmUgYW4gaW1tZWRpYXRlLgorI2RlZmluZSBDT05WRVJUX1JHQl9UT19VVihyLCBnLCBiLCBTSElGVCwgVV9EU1QsIFZfRFNUKSBkbyB7ICAgICBcCisgIE1VTFRJUExZXzE2Yl9QUkVBTUJMRShyLCBnLCBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTVVMVElQTFlfMTZiKC05NzE5LCAtMTkwODEsIDI4ODAwLCAxMjggPDwgU0hJRlQsIFVfRFNUKTsgICAgICAgXAorICBNVUxUSVBMWV8xNmIoMjg4MDAsIC0yNDExNiwgLTQ2ODQsIDEyOCA8PCBTSElGVCwgVl9EU1QpOyAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCQTMyVG9VVl9ORU9OKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCwgcmdiICs9IDQgKiA4KSB7CisgICAgY29uc3QgdWludDE2eDh4NF90IFJHQiA9IHZsZDRxX3UxNigoY29uc3QgdWludDE2X3QqKXJnYik7CisgICAgaW50MTZ4OF90IFUsIFY7CisgICAgQ09OVkVSVF9SR0JfVE9fVVYoUkdCLnZhbFswXSwgUkdCLnZhbFsxXSwgUkdCLnZhbFsyXSwgMiwgVSwgVik7CisgICAgdnN0MV91OCh1ICsgaSwgdnFyc2hydW5fbl9zMTYoVSwgMikpOworICAgIHZzdDFfdTgodiArIGksIHZxcnNocnVuX25fczE2KFYsIDIpKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgdVtpXSA9IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICB2W2ldID0gVlA4UkdCVG9WKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9VVl9ORU9OKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgMTYgPD0gc3JjX3dpZHRoOyBpICs9IDE2LCB1ICs9IDgsIHYgKz0gOCkgeworICAgIGNvbnN0IHVpbnQ4eDE2eDRfdCBSR0IgPSB2bGQ0cV91OCgoY29uc3QgdWludDhfdCopJmFyZ2JbaV0pOworICAgIGNvbnN0IHVpbnQxNng4X3QgUiA9IHZwYWRkbHFfdTgoUkdCLnZhbFsyXSk7ICAvLyBwYWlyLXdpc2UgYWRkcworICAgIGNvbnN0IHVpbnQxNng4X3QgRyA9IHZwYWRkbHFfdTgoUkdCLnZhbFsxXSk7CisgICAgY29uc3QgdWludDE2eDhfdCBCID0gdnBhZGRscV91OChSR0IudmFsWzBdKTsKKyAgICBpbnQxNng4X3QgVV90bXAsIFZfdG1wOworICAgIENPTlZFUlRfUkdCX1RPX1VWKFIsIEcsIEIsIDEsIFVfdG1wLCBWX3RtcCk7CisgICAgeworICAgICAgY29uc3QgdWludDh4OF90IFUgPSB2cXJzaHJ1bl9uX3MxNihVX3RtcCwgMSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgViA9IHZxcnNocnVuX25fczE2KFZfdG1wLCAxKTsKKyAgICAgIGlmIChkb19zdG9yZSkgeworICAgICAgICB2c3QxX3U4KHUsIFUpOworICAgICAgICB2c3QxX3U4KHYsIFYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDh4OF90IHByZXZfdSA9IHZsZDFfdTgodSk7CisgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBwcmV2X3YgPSB2bGQxX3U4KHYpOworICAgICAgICB2c3QxX3U4KHUsIHZyaGFkZF91OChVLCBwcmV2X3UpKTsKKyAgICAgICAgdnN0MV91OCh2LCB2cmhhZGRfdTgoViwgcHJldl92KSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChpIDwgc3JjX3dpZHRoKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICBXZWJQQ29udmVydEFSR0JUb1VWX0MoYXJnYiArIGksIHUsIHYsIHNyY193aWR0aCAtIGksIGRvX3N0b3JlKTsKKyAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVk5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZORU9OKHZvaWQpIHsKKyAgV2ViUENvbnZlcnRSR0IyNFRvWSA9IENvbnZlcnRSR0IyNFRvWV9ORU9OOworICBXZWJQQ29udmVydEJHUjI0VG9ZID0gQ29udmVydEJHUjI0VG9ZX05FT047CisgIFdlYlBDb252ZXJ0QVJHQlRvWSA9IENvbnZlcnRBUkdCVG9ZX05FT047CisgIFdlYlBDb252ZXJ0QVJHQlRvVVYgPSBDb252ZXJ0QVJHQlRvVVZfTkVPTjsKKyAgV2ViUENvbnZlcnRSR0JBMzJUb1VWID0gQ29udmVydFJHQkEzMlRvVVZfTkVPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfWSAoKDEgPDwgMTApIC0gMSkgICAgLy8gMTBiIHByZWNpc2lvbiBvdmVyIDE2Yi1hcml0aG1ldGljCitzdGF0aWMgdWludDE2X3QgY2xpcF95X05FT04oaW50IHYpIHsKKyAgcmV0dXJuICh2IDwgMCkgPyAwIDogKHYgPiBNQVhfWSkgPyBNQVhfWSA6ICh1aW50MTZfdCl2OworfQorCitzdGF0aWMgdWludDY0X3QgU2hhcnBZVVZVcGRhdGVZX05FT04oY29uc3QgdWludDE2X3QqIHJlZiwgY29uc3QgdWludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBpOworICBjb25zdCBpbnQxNng4X3QgemVybyA9IHZkdXBxX25fczE2KDApOworICBjb25zdCBpbnQxNng4X3QgbWF4ID0gdmR1cHFfbl9zMTYoTUFYX1kpOworICB1aW50NjR4Ml90IHN1bSA9IHZkdXBxX25fdTY0KDApOworICB1aW50NjRfdCBkaWZmOworCisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgaW50MTZ4OF90IEEgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmxkMXFfdTE2KHJlZiArIGkpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgQiA9IHZyZWludGVycHJldHFfczE2X3UxNih2bGQxcV91MTYoc3JjICsgaSkpOworICAgIGNvbnN0IGludDE2eDhfdCBDID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZsZDFxX3UxNihkc3QgKyBpKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEQgPSB2c3VicV9zMTYoQSwgQik7ICAgICAgIC8vIGRpZmZfeQorICAgIGNvbnN0IGludDE2eDhfdCBGID0gdmFkZHFfczE2KEMsIEQpOyAgICAgICAvLyBuZXdfeQorICAgIGNvbnN0IHVpbnQxNng4X3QgSCA9CisgICAgICAgIHZyZWludGVycHJldHFfdTE2X3MxNih2bWF4cV9zMTYodm1pbnFfczE2KEYsIG1heCksIHplcm8pKTsKKyAgICBjb25zdCBpbnQxNng4X3QgSSA9IHZhYnNxX3MxNihEKTsgICAgICAgICAgLy8gYWJzKGRpZmZfeSkKKyAgICB2c3QxcV91MTYoZHN0ICsgaSwgSCk7CisgICAgc3VtID0gdnBhZGFscV91MzIoc3VtLCB2cGFkZGxxX3UxNih2cmVpbnRlcnByZXRxX3UxNl9zMTYoSSkpKTsKKyAgfQorICBkaWZmID0gdmdldHFfbGFuZV91NjQoc3VtLCAwKSArIHZnZXRxX2xhbmVfdTY0KHN1bSwgMSk7CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl95ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGNvbnN0IGludCBuZXdfeSA9IChpbnQpKGRzdFtpXSkgKyBkaWZmX3k7CisgICAgZHN0W2ldID0gY2xpcF95X05FT04obmV3X3kpOworICAgIGRpZmYgKz0gKHVpbnQ2NF90KShhYnMoZGlmZl95KSk7CisgIH0KKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWVXBkYXRlUkdCX05FT04oY29uc3QgaW50MTZfdCogcmVmLCBjb25zdCBpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBpbnQxNng4X3QgQSA9IHZsZDFxX3MxNihyZWYgKyBpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgQiA9IHZsZDFxX3MxNihzcmMgKyBpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgQyA9IHZsZDFxX3MxNihkc3QgKyBpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgRCA9IHZzdWJxX3MxNihBLCBCKTsgICAvLyBkaWZmX3V2CisgICAgY29uc3QgaW50MTZ4OF90IEUgPSB2YWRkcV9zMTYoQywgRCk7ICAgLy8gbmV3X3V2CisgICAgdnN0MXFfczE2KGRzdCArIGksIEUpOworICB9CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl91diA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBkc3RbaV0gKz0gZGlmZl91djsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVkZpbHRlclJvd19ORU9OKGNvbnN0IGludDE2X3QqIEEsIGNvbnN0IGludDE2X3QqIEIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBiZXN0X3ksIHVpbnQxNl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludDE2eDhfdCBtYXggPSB2ZHVwcV9uX3MxNihNQVhfWSk7CisgIGNvbnN0IGludDE2eDhfdCB6ZXJvID0gdmR1cHFfbl9zMTYoMCk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgaW50MTZ4OF90IGEwID0gdmxkMXFfczE2KEEgKyBpICsgMCk7CisgICAgY29uc3QgaW50MTZ4OF90IGExID0gdmxkMXFfczE2KEEgKyBpICsgMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGIwID0gdmxkMXFfczE2KEIgKyBpICsgMCk7CisgICAgY29uc3QgaW50MTZ4OF90IGIxID0gdmxkMXFfczE2KEIgKyBpICsgMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGEwYjEgPSB2YWRkcV9zMTYoYTAsIGIxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTFiMCA9IHZhZGRxX3MxNihhMSwgYjApOworICAgIGNvbnN0IGludDE2eDhfdCBhMGExYjBiMSA9IHZhZGRxX3MxNihhMGIxLCBhMWIwKTsgIC8vIEEwK0ExK0IwK0IxCisgICAgY29uc3QgaW50MTZ4OF90IGEwYjFfMiA9IHZhZGRxX3MxNihhMGIxLCBhMGIxKTsgICAgLy8gMiooQTArQjEpCisgICAgY29uc3QgaW50MTZ4OF90IGExYjBfMiA9IHZhZGRxX3MxNihhMWIwLCBhMWIwKTsgICAgLy8gMiooQTErQjApCisgICAgY29uc3QgaW50MTZ4OF90IGMwID0gdnNocnFfbl9zMTYodmFkZHFfczE2KGEwYjFfMiwgYTBhMWIwYjEpLCAzKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYzEgPSB2c2hycV9uX3MxNih2YWRkcV9zMTYoYTFiMF8yLCBhMGExYjBiMSksIDMpOworICAgIGNvbnN0IGludDE2eDhfdCBkMCA9IHZhZGRxX3MxNihjMSwgYTApOworICAgIGNvbnN0IGludDE2eDhfdCBkMSA9IHZhZGRxX3MxNihjMCwgYTEpOworICAgIGNvbnN0IGludDE2eDhfdCBlMCA9IHZyc2hycV9uX3MxNihkMCwgMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGUxID0gdnJzaHJxX25fczE2KGQxLCAxKTsKKyAgICBjb25zdCBpbnQxNng4eDJfdCBmID0gdnppcHFfczE2KGUwLCBlMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGcwID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZsZDFxX3UxNihiZXN0X3kgKyAyICogaSArIDApKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZzEgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmxkMXFfdTE2KGJlc3RfeSArIDIgKiBpICsgOCkpOworICAgIGNvbnN0IGludDE2eDhfdCBoMCA9IHZhZGRxX3MxNihnMCwgZi52YWxbMF0pOworICAgIGNvbnN0IGludDE2eDhfdCBoMSA9IHZhZGRxX3MxNihnMSwgZi52YWxbMV0pOworICAgIGNvbnN0IGludDE2eDhfdCBpMCA9IHZtYXhxX3MxNih2bWlucV9zMTYoaDAsIG1heCksIHplcm8pOworICAgIGNvbnN0IGludDE2eDhfdCBpMSA9IHZtYXhxX3MxNih2bWlucV9zMTYoaDEsIG1heCksIHplcm8pOworICAgIHZzdDFxX3UxNihvdXQgKyAyICogaSArIDAsIHZyZWludGVycHJldHFfdTE2X3MxNihpMCkpOworICAgIHZzdDFxX3UxNihvdXQgKyAyICogaSArIDgsIHZyZWludGVycHJldHFfdTE2X3MxNihpMSkpOworICB9CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgYTBiMSA9IEFbaSArIDBdICsgQltpICsgMV07CisgICAgY29uc3QgaW50IGExYjAgPSBBW2kgKyAxXSArIEJbaSArIDBdOworICAgIGNvbnN0IGludCBhMGExYjBiMSA9IGEwYjEgKyBhMWIwICsgODsKKyAgICBjb25zdCBpbnQgdjAgPSAoOCAqIEFbaSArIDBdICsgMiAqIGExYjAgKyBhMGExYjBiMSkgPj4gNDsKKyAgICBjb25zdCBpbnQgdjEgPSAoOCAqIEFbaSArIDFdICsgMiAqIGEwYjEgKyBhMGExYjBiMSkgPj4gNDsKKyAgICBvdXRbMiAqIGkgKyAwXSA9IGNsaXBfeV9ORU9OKGJlc3RfeVsyICogaSArIDBdICsgdjApOworICAgIG91dFsyICogaSArIDFdID0gY2xpcF95X05FT04oYmVzdF95WzIgKiBpICsgMV0gKyB2MSk7CisgIH0KK30KKyN1bmRlZiBNQVhfWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNoYXJwWVVWTkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2hhcnBZVVZORU9OKHZvaWQpIHsKKyAgV2ViUFNoYXJwWVVWVXBkYXRlWSA9IFNoYXJwWVVWVXBkYXRlWV9ORU9OOworICBXZWJQU2hhcnBZVVZVcGRhdGVSR0IgPSBTaGFycFlVVlVwZGF0ZVJHQl9ORU9OOworICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3cgPSBTaGFycFlVVkZpbHRlclJvd19ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0Q29udmVydEFSR0JUb1lVVk5FT04pCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTaGFycFlVVk5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2UyLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb252ZXJ0IHNwYW5zIG9mIDMyIHBpeGVscyB0byB2YXJpb3VzIFJHQiBmb3JtYXRzIGZvciB0aGUgZmFuY3kgdXBzYW1wbGVyLgorCisvLyBUaGVzZSBjb25zdGFudHMgYXJlIDE0YiBmaXhlZC1wb2ludCB2ZXJzaW9uIG9mIElUVS1SIEJULjYwMSBjb25zdGFudHMuCisvLyBSID0gKDE5MDc3ICogeSAgICAgICAgICAgICArIDI2MTQ5ICogdiAtIDE0MjM0KSA+PiA2CisvLyBHID0gKDE5MDc3ICogeSAtICA2NDE5ICogdSAtIDEzMzIwICogdiArICA4NzA4KSA+PiA2CisvLyBCID0gKDE5MDc3ICogeSArIDMzMDUwICogdSAgICAgICAgICAgICAtIDE3Njg1KSA+PiA2CitzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBZMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IFUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgVjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBrMTkwNzcgPSBfbW1fc2V0MV9lcGkxNigxOTA3Nyk7CisgIGNvbnN0IF9fbTEyOGkgazI2MTQ5ID0gX21tX3NldDFfZXBpMTYoMjYxNDkpOworICBjb25zdCBfX20xMjhpIGsxNDIzNCA9IF9tbV9zZXQxX2VwaTE2KDE0MjM0KTsKKyAgLy8gMzMwNTAgZG9lc24ndCBmaXQgaW4gYSBzaWduZWQgc2hvcnQ6IG9ubHkgdXNlIHRoaXMgd2l0aCB1bnNpZ25lZCBhcml0aG1ldGljCisgIGNvbnN0IF9fbTEyOGkgazMzMDUwID0gX21tX3NldDFfZXBpMTYoKHNob3J0KTMzMDUwKTsKKyAgY29uc3QgX19tMTI4aSBrMTc2ODUgPSBfbW1fc2V0MV9lcGkxNigxNzY4NSk7CisgIGNvbnN0IF9fbTEyOGkgazY0MTkgID0gX21tX3NldDFfZXBpMTYoNjQxOSk7CisgIGNvbnN0IF9fbTEyOGkgazEzMzIwID0gX21tX3NldDFfZXBpMTYoMTMzMjApOworICBjb25zdCBfX20xMjhpIGs4NzA4ICA9IF9tbV9zZXQxX2VwaTE2KDg3MDgpOworCisgIGNvbnN0IF9fbTEyOGkgWTEgPSBfbW1fbXVsaGlfZXB1MTYoKlkwLCBrMTkwNzcpOworCisgIGNvbnN0IF9fbTEyOGkgUjAgPSBfbW1fbXVsaGlfZXB1MTYoKlYwLCBrMjYxNDkpOworICBjb25zdCBfX20xMjhpIFIxID0gX21tX3N1Yl9lcGkxNihZMSwgazE0MjM0KTsKKyAgY29uc3QgX19tMTI4aSBSMiA9IF9tbV9hZGRfZXBpMTYoUjEsIFIwKTsKKworICBjb25zdCBfX20xMjhpIEcwID0gX21tX211bGhpX2VwdTE2KCpVMCwgazY0MTkpOworICBjb25zdCBfX20xMjhpIEcxID0gX21tX211bGhpX2VwdTE2KCpWMCwgazEzMzIwKTsKKyAgY29uc3QgX19tMTI4aSBHMiA9IF9tbV9hZGRfZXBpMTYoWTEsIGs4NzA4KTsKKyAgY29uc3QgX19tMTI4aSBHMyA9IF9tbV9hZGRfZXBpMTYoRzAsIEcxKTsKKyAgY29uc3QgX19tMTI4aSBHNCA9IF9tbV9zdWJfZXBpMTYoRzIsIEczKTsKKworICAvLyBiZSBjYXJlZnVsIHdpdGggdGhlIHNhdHVyYXRlZCAqdW5zaWduZWQqIGFyaXRobWV0aWMgaGVyZSEKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9tdWxoaV9lcHUxNigqVTAsIGszMzA1MCk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fYWRkc19lcHUxNihCMCwgWTEpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX3N1YnNfZXB1MTYoQjEsIGsxNzY4NSk7CisKKyAgLy8gdXNlIGxvZ2ljYWwgc2hpZnQgZm9yIEIyLCB3aGljaCBjYW4gYmUgbGFyZ2VyIHRoYW4gMzI3NjcKKyAgKlIgPSBfbW1fc3JhaV9lcGkxNihSMiwgNik7ICAgLy8gcmFuZ2U6IFstMTQyMzQsIDMwODE1XQorICAqRyA9IF9tbV9zcmFpX2VwaTE2KEc0LCA2KTsgICAvLyByYW5nZTogWy0xMDk1MywgMjc3MTBdCisgICpCID0gX21tX3NybGlfZXBpMTYoQjIsIDYpOyAgIC8vIHJhbmdlOiBbMCwgMzQyMzhdCit9CisKKy8vIExvYWQgdGhlIGJ5dGVzIGludG8gdGhlICp1cHBlciogcGFydCBvZiAxNmIgd29yZHMuIFRoYXQncyAiPDwgOCIsIGJhc2ljYWxseS4KK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIExvYWRfSElfMTZfU1NFMihjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGk4KHplcm8sIF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopc3JjKSk7Cit9CisKKy8vIExvYWQgYW5kIHJlcGxpY2F0ZSB0aGUgVS9WIHNhbXBsZXMKK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIExvYWRfVVZfSElfOF9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGNvbnN0IHVpbnQzMl90KilzcmMpOworICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCB0bXAwKTsKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNih0bXAxLCB0bXAxKTsgICAvLyByZXBsaWNhdGUgc2FtcGxlcworfQorCisvLyBDb252ZXJ0IDMyIHNhbXBsZXMgb2YgWVVWNDQ0IHRvIFIvRy9CCitzdGF0aWMgdm9pZCBZVVY0NDRUb1JHQl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBZMCA9IExvYWRfSElfMTZfU1NFMih5KSwgVTAgPSBMb2FkX0hJXzE2X1NTRTIodSksCisgICAgICAgICAgICAgICAgVjAgPSBMb2FkX0hJXzE2X1NTRTIodik7CisgIENvbnZlcnRZVVY0NDRUb1JHQl9TU0UyKCZZMCwgJlUwLCAmVjAsIFIsIEcsIEIpOworfQorCisvLyBDb252ZXJ0IDMyIHNhbXBsZXMgb2YgWVVWNDIwIHRvIFIvRy9CCitzdGF0aWMgdm9pZCBZVVY0MjBUb1JHQl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBZMCA9IExvYWRfSElfMTZfU1NFMih5KSwgVTAgPSBMb2FkX1VWX0hJXzhfU1NFMih1KSwKKyAgICAgICAgICAgICAgICBWMCA9IExvYWRfVVZfSElfOF9TU0UyKHYpOworICBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFMigmWTAsICZVMCwgJlYwLCBSLCBHLCBCKTsKK30KKworLy8gUGFjayBSL0cvQi9BIHJlc3VsdHMgaW50byAzMmIgb3V0cHV0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGFja0FuZFN0b3JlNF9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgcmIgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgZ2EgPSBfbW1fcGFja3VzX2VwaTE2KCpHLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgcmcgPSBfbW1fdW5wYWNrbG9fZXBpOChyYiwgZ2EpOworICBjb25zdCBfX20xMjhpIGJhID0gX21tX3VucGFja2hpX2VwaTgocmIsIGdhKTsKKyAgY29uc3QgX19tMTI4aSBSR0JBX2xvID0gX21tX3VucGFja2xvX2VwaTE2KHJnLCBiYSk7CisgIGNvbnN0IF9fbTEyOGkgUkdCQV9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihyZywgYmEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgIDApLCBSR0JBX2xvKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIDE2KSwgUkdCQV9oaSk7Cit9CisKKy8vIFBhY2sgUi9HL0IvQSByZXN1bHRzIGludG8gMTZiIG91dHB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBhY2tBbmRTdG9yZTQ0NDRfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDApCisgIGNvbnN0IF9fbTEyOGkgcmcwID0gX21tX3BhY2t1c19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIGJhMCA9IF9tbV9wYWNrdXNfZXBpMTYoKkIsICpBKTsKKyNlbHNlCisgIGNvbnN0IF9fbTEyOGkgcmcwID0gX21tX3BhY2t1c19lcGkxNigqQiwgKkEpOworICBjb25zdCBfX20xMjhpIGJhMCA9IF9tbV9wYWNrdXNfZXBpMTYoKlIsICpHKTsKKyNlbmRpZgorICBjb25zdCBfX20xMjhpIG1hc2tfMHhmMCA9IF9tbV9zZXQxX2VwaTgoMHhmMCk7CisgIGNvbnN0IF9fbTEyOGkgcmIxID0gX21tX3VucGFja2xvX2VwaTgocmcwLCBiYTApOyAgLy8gcmJyYnJicmJyYi4uLgorICBjb25zdCBfX20xMjhpIGdhMSA9IF9tbV91bnBhY2toaV9lcGk4KHJnMCwgYmEwKTsgIC8vIGdhZ2FnYWdhZ2EuLi4KKyAgY29uc3QgX19tMTI4aSByYjIgPSBfbW1fYW5kX3NpMTI4KHJiMSwgbWFza18weGYwKTsKKyAgY29uc3QgX19tMTI4aSBnYTIgPSBfbW1fc3JsaV9lcGkxNihfbW1fYW5kX3NpMTI4KGdhMSwgbWFza18weGYwKSwgNCk7CisgIGNvbnN0IF9fbTEyOGkgcmdiYTQ0NDQgPSBfbW1fb3Jfc2kxMjgocmIyLCBnYTIpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHJnYmE0NDQ0KTsKK30KKworLy8gUGFjayBSL0cvQiByZXN1bHRzIGludG8gMTZiIG91dHB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBhY2tBbmRTdG9yZTU2NV9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBfX20xMjhpIHIwID0gX21tX3BhY2t1c19lcGkxNigqUiwgKlIpOworICBjb25zdCBfX20xMjhpIGcwID0gX21tX3BhY2t1c19lcGkxNigqRywgKkcpOworICBjb25zdCBfX20xMjhpIGIwID0gX21tX3BhY2t1c19lcGkxNigqQiwgKkIpOworICBjb25zdCBfX20xMjhpIHIxID0gX21tX2FuZF9zaTEyOChyMCwgX21tX3NldDFfZXBpOCgweGY4KSk7CisgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYW5kX3NpMTI4KF9tbV9zcmxpX2VwaTE2KGIwLCAzKSwgX21tX3NldDFfZXBpOCgweDFmKSk7CisgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fc3JsaV9lcGkxNihfbW1fYW5kX3NpMTI4KGcwLCBfbW1fc2V0MV9lcGk4KDB4ZTApKSwgNSk7CisgIGNvbnN0IF9fbTEyOGkgZzIgPSBfbW1fc2xsaV9lcGkxNihfbW1fYW5kX3NpMTI4KGcwLCBfbW1fc2V0MV9lcGk4KDB4MWMpKSwgMyk7CisgIGNvbnN0IF9fbTEyOGkgcmcgPSBfbW1fb3Jfc2kxMjgocjEsIGcxKTsKKyAgY29uc3QgX19tMTI4aSBnYiA9IF9tbV9vcl9zaTEyOChnMiwgYjEpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDApCisgIGNvbnN0IF9fbTEyOGkgcmdiNTY1ID0gX21tX3VucGFja2xvX2VwaTgocmcsIGdiKTsKKyNlbHNlCisgIGNvbnN0IF9fbTEyOGkgcmdiNTY1ID0gX21tX3VucGFja2xvX2VwaTgoZ2IsIHJnKTsKKyNlbmRpZgorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHJnYjU2NSk7Cit9CisKKy8vIFBhY2sgdGhlIHBsYW5hciBidWZmZXJzCisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIHRyaXBsZXQgYnkgdHJpcGxldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciByZ2IgYXMgcmdicmdicmdicmdiIC4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGxhbmFyVG8yNGJfU1NFMihfX20xMjhpKiBjb25zdCBpbjAsIF9fbTEyOGkqIGNvbnN0IGluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4yLCBfX20xMjhpKiBjb25zdCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluNCwgX19tMTI4aSogY29uc3QgaW41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgLy8gVGhlIGlucHV0IGlzIDYgcmVnaXN0ZXJzIG9mIHNpeHRlZW4gOGIgYnV0IGZvciB0aGUgc2FrZSBvZiBleHBsYW5hdGlvbiwKKyAgLy8gbGV0J3MgdGFrZSA2IHJlZ2lzdGVycyBvZiBmb3VyIDhiIHZhbHVlcy4KKyAgLy8gVG8gcGFjaywgd2Ugd2lsbCBrZWVwIHRha2luZyBvbmUgZXZlcnkgdHdvIDhiIGludGVnZXIgYW5kIG1vdmUgaXQKKyAgLy8gYXJvdW5kIGFzIGZvbGxvd3M6CisgIC8vIElucHV0OgorICAvLyAgIHIwcjFyMnIzIHwgcjRyNXI2cjcgfCBnMGcxZzJnMyB8IGc0ZzVnNmc3IHwgYjBiMWIyYjMgfCBiNGI1YjZiNworICAvLyBTcGxpdCB0aGUgNiByZWdpc3RlcnMgaW4gdHdvIHNldHMgb2YgMyByZWdpc3RlcnM6IHRoZSBmaXJzdCBzZXQgYXMgdGhlIGV2ZW4KKyAgLy8gOGIgYnl0ZXMsIHRoZSBzZWNvbmQgdGhlIG9kZCBvbmVzOgorICAvLyAgIHIwcjJyNHI2IHwgZzBnMmc0ZzYgfCBiMGIyYjRiNiB8IHIxcjNyNXI3IHwgZzFnM2c1ZzcgfCBiMWIzYjViNworICAvLyBSZXBlYXQgdGhlIHNhbWUgcGVybXV0YXRpb25zIHR3aWNlIG1vcmU6CisgIC8vICAgcjByNGcwZzQgfCBiMGI0cjFyNSB8IGcxZzViMWI1IHwgcjJyNmcyZzYgfCBiMmI2cjNyNyB8IGczZzdiM2I3CisgIC8vICAgcjBnMGIwcjEgfCBnMWIxcjJnMiB8IGIycjNnM2IzIHwgcjRnNGI0cjUgfCBnNWI1cjZnNiB8IGI2cjdnN2I3CisgIFZQOFBsYW5hclRvMjRiX1NTRTIoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSk7CisKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArICAwKSwgKmluMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAxNiksICppbjEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgMzIpLCAqaW4yKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDQ4KSwgKmluMyk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA2NCksICppbjQpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgODApLCAqaW41KTsKK30KKwordm9pZCBWUDhZdXZUb1JnYmEzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJlIsICZHLCAmQiwgJmtBbHBoYSwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvQmdyYTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQl9TU0UyKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigmQiwgJkcsICZSLCAma0FscGhhLCBkc3QpOworICB9Cit9CisKK3ZvaWQgVlA4WXV2VG9BcmdiMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZrQWxwaGEsICZSLCAmRywgJkIsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb1JnYmE0NDQ0MzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAxNikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQl9TU0UyKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTQ0NDRfU1NFMigmUiwgJkcsICZCLCAma0FscGhhLCBkc3QpOworICB9Cit9CisKK3ZvaWQgVlA4WXV2VG9SZ2I1NjUzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMTYpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU1NjVfU1NFMigmUiwgJkcsICZCLCBkc3QpOworICB9Cit9CisKK3ZvaWQgVlA4WXV2VG9SZ2IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICBfX20xMjhpIHJnYjAsIHJnYjEsIHJnYjIsIHJnYjMsIHJnYjQsIHJnYjU7CisKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgMCwgdSArIDAsIHYgKyAwLCAmUjAsICZHMCwgJkIwKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgOCwgdSArIDgsIHYgKyA4LCAmUjEsICZHMSwgJkIxKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgMTYsIHUgKyAxNiwgdiArIDE2LCAmUjIsICZHMiwgJkIyKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgMjQsIHUgKyAyNCwgdiArIDI0LCAmUjMsICZHMywgJkIzKTsKKworICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBSUlJSR0dHR0JCQkIuCisgIHJnYjAgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIHJnYjEgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisgIHJnYjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgIHJnYjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgIHJnYjQgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgIHJnYjUgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisKKyAgLy8gUGFjayBhcyBSR0JSR0JSR0JSR0IuCisgIFBsYW5hclRvMjRiX1NTRTIoJnJnYjAsICZyZ2IxLCAmcmdiMiwgJnJnYjMsICZyZ2I0LCAmcmdiNSwgZHN0KTsKK30KKwordm9pZCBWUDhZdXZUb0JncjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgIF9fbTEyOGkgYmdyMCwgYmdyMSwgYmdyMiwgYmdyMywgYmdyNCwgYmdyNTsKKworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAgOCwgdSArICA4LCB2ICsgIDgsICZSMSwgJkcxLCAmQjEpOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAxNiwgdSArIDE2LCB2ICsgMTYsICZSMiwgJkcyLCAmQjIpOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAyNCwgdSArIDI0LCB2ICsgMjQsICZSMywgJkczLCAmQjMpOworCisgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIEJCQkJHR0dHUlJSUi4KKyAgYmdyMCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgYmdyMSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKyAgYmdyMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgYmdyMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgYmdyNCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgYmdyNT0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworCisgIC8vIFBhY2sgYXMgQkdSQkdSQkdSQkdSLgorICBQbGFuYXJUbzI0Yl9TU0UyKCZiZ3IwLCAmYmdyMSwgJmJncjIsICZiZ3IzLCAmYmdyNCwgJmJncjUsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFyYml0cmFyeS1sZW5ndGggcm93IGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiYVJvd19TU0UyKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyA4IDw9IGxlbjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJlIsICZHLCAmQiwgJmtBbHBoYSwgZHN0KTsKKyAgICB5ICs9IDg7CisgICAgdSArPSA0OworICAgIHYgKz0gNDsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvUmdiYSh5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSA0OworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyYVJvd19TU0UyKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyA4IDw9IGxlbjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJkIsICZHLCAmUiwgJmtBbHBoYSwgZHN0KTsKKyAgICB5ICs9IDg7CisgICAgdSArPSA0OworICAgIHYgKz0gNDsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvQmdyYSh5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSA0OworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQXJnYlJvd19TU0UyKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyA4IDw9IGxlbjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJmtBbHBoYSwgJlIsICZHLCAmQiwgZHN0KTsKKyAgICB5ICs9IDg7CisgICAgdSArPSA0OworICAgIHYgKz0gNDsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvQXJnYih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSA0OworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiUm93X1NTRTIoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgMzIgPD0gbGVuOyBuICs9IDMyLCBkc3QgKz0gMzIgKiAzKSB7CisgICAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICAgIF9fbTEyOGkgcmdiMCwgcmdiMSwgcmdiMiwgcmdiMywgcmdiNCwgcmdiNTsKKworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgIDgsIHUgKyAgNCwgdiArICA0LCAmUjEsICZHMSwgJkIxKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAxNiwgdSArICA4LCB2ICsgIDgsICZSMiwgJkcyLCAmQjIpOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArIDI0LCB1ICsgMTIsIHYgKyAxMiwgJlIzLCAmRzMsICZCMyk7CisKKyAgICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBSUlJSR0dHR0JCQkIuCisgICAgcmdiMCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgICByZ2IxID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworICAgIHJnYjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgICAgcmdiMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgICByZ2I0ID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICAgIHJnYjUgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisKKyAgICAvLyBQYWNrIGFzIFJHQlJHQlJHQlJHQi4KKyAgICBQbGFuYXJUbzI0Yl9TU0UyKCZyZ2IwLCAmcmdiMSwgJnJnYjIsICZyZ2IzLCAmcmdiNCwgJnJnYjUsIGRzdCk7CisKKyAgICB5ICs9IDMyOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvUmdiKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDM7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JSb3dfU1NFMihjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyAzMiA8PSBsZW47IG4gKz0gMzIsIGRzdCArPSAzMiAqIDMpIHsKKyAgICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgICAgX19tMTI4aSBiZ3IwLCBiZ3IxLCBiZ3IyLCBiZ3IzLCBiZ3I0LCBiZ3I1OworCisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAgOCwgdSArICA0LCB2ICsgIDQsICZSMSwgJkcxLCAmQjEpOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArIDE2LCB1ICsgIDgsIHYgKyAgOCwgJlIyLCAmRzIsICZCMik7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgMjQsIHUgKyAxMiwgdiArIDEyLCAmUjMsICZHMywgJkIzKTsKKworICAgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIEJCQkJHR0dHUlJSUi4KKyAgICBiZ3IwID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICAgIGJncjEgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgICAgYmdyMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgICBiZ3IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICAgIGJncjQgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgICAgYmdyNSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKworICAgIC8vIFBhY2sgYXMgQkdSQkdSQkdSQkdSLgorICAgIFBsYW5hclRvMjRiX1NTRTIoJmJncjAsICZiZ3IxLCAmYmdyMiwgJmJncjMsICZiZ3I0LCAmYmdyNSwgZHN0KTsKKworICAgIHkgKz0gMzI7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9CZ3IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gMzsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFMih2b2lkKSB7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl0gID0gWXV2VG9SZ2JSb3dfU1NFMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gPSBZdXZUb1JnYmFSb3dfU1NFMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgPSBZdXZUb0JnclJvd19TU0UyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JBXSA9IFl1dlRvQmdyYVJvd19TU0UyOworICBXZWJQU2FtcGxlcnNbTU9ERV9BUkdCXSA9IFl1dlRvQXJnYlJvd19TU0UyOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCMjQvMzIgLT4gWVVWIGNvbnZlcnRlcnMKKworLy8gTG9hZCBlaWdodCAxNmItd29yZHMgZnJvbSAqc3JjLgorI2RlZmluZSBMT0FEXzE2KHNyYykgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjKSkKKy8vIFN0b3JlIGVpdGhlciAxNmItd29yZHMgaW50byAqZHN0CisjZGVmaW5lIFNUT1JFXzE2KFYsIGRzdCkgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCksIChWKSkKKworLy8gRnVuY3Rpb24gdGhhdCBpbnNlcnRzIGEgdmFsdWUgb2YgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBpbiBidWZmZXIgaW4gYmV0d2VlbgorLy8gZXZlcnkgdHdvIGNoYXIgb2YgdGhlIGZpcnN0IGhhbGYuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIoCisgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4gLyppbls2XSovLCBfX20xMjhpKiBjb25zdCBvdXQgLypvdXRbNl0qLykgeworICBvdXRbMF0gPSBfbW1fdW5wYWNrbG9fZXBpOChpblswXSwgaW5bM10pOworICBvdXRbMV0gPSBfbW1fdW5wYWNraGlfZXBpOChpblswXSwgaW5bM10pOworICBvdXRbMl0gPSBfbW1fdW5wYWNrbG9fZXBpOChpblsxXSwgaW5bNF0pOworICBvdXRbM10gPSBfbW1fdW5wYWNraGlfZXBpOChpblsxXSwgaW5bNF0pOworICBvdXRbNF0gPSBfbW1fdW5wYWNrbG9fZXBpOChpblsyXSwgaW5bNV0pOworICBvdXRbNV0gPSBfbW1fdW5wYWNraGlfZXBpOChpblsyXSwgaW5bNV0pOworfQorCisvLyBVbnBhY2sgdGhlIDhiIGlucHV0IHJnYnJnYnJnYnJnYiAuLi4gYXMgY29udGlndW91cyByZWdpc3RlcnM6CisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIFNpbWlsYXIgdG8gUGxhbmFyVG8yNGJIZWxwZXIoKSwgYnV0IGluIHJldmVyc2Ugb3JkZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTIoCisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiLCBfX20xMjhpKiBjb25zdCBvdXQgLypvdXRbNl0qLykgeworICBfX20xMjhpIHRtcFs2XTsKKyAgdG1wWzBdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgIDApKTsKKyAgdG1wWzFdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMTYpKTsKKyAgdG1wWzJdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMzIpKTsKKyAgdG1wWzNdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNDgpKTsKKyAgdG1wWzRdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNjQpKTsKKyAgdG1wWzVdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgODApKTsKKworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIodG1wLCBvdXQpOworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIob3V0LCB0bXApOworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIodG1wLCBvdXQpOworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIob3V0LCB0bXApOworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyX1NTRTIodG1wLCBvdXQpOworfQorCisvLyBDb252ZXJ0IDggcGFja2VkIEFSR0IgdG8gcltdLCBnW10sIGJbXQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0UyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHJnYiAvKmluWzZdKi8pIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgX19tMTI4aSBhMCA9IExPQURfMTYoYXJnYiArIDApOworICBfX20xMjhpIGExID0gTE9BRF8xNihhcmdiICsgNCk7CisgIF9fbTEyOGkgYTIgPSBMT0FEXzE2KGFyZ2IgKyA4KTsKKyAgX19tMTI4aSBhMyA9IExPQURfMTYoYXJnYiArIDEyKTsKKyAgVlA4TDMyYlRvUGxhbmFyX1NTRTIoJmEwLCAmYTEsICZhMiwgJmEzKTsKKyAgcmdiWzBdID0gX21tX3VucGFja2xvX2VwaTgoYTEsIHplcm8pOworICByZ2JbMV0gPSBfbW1fdW5wYWNraGlfZXBpOChhMSwgemVybyk7CisgIHJnYlsyXSA9IF9tbV91bnBhY2tsb19lcGk4KGEyLCB6ZXJvKTsKKyAgcmdiWzNdID0gX21tX3VucGFja2hpX2VwaTgoYTIsIHplcm8pOworICByZ2JbNF0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMywgemVybyk7CisgIHJnYls1XSA9IF9tbV91bnBhY2toaV9lcGk4KGEzLCB6ZXJvKTsKK30KKworLy8gVGhpcyBtYWNybyBjb21wdXRlcyAoUkcgKiBNVUxUX1JHICsgR0IgKiBNVUxUX0dCICsgUk9VTkRFUikgPj4gREVTQ0FMRV9GSVgKKy8vIEl0J3MgYSBtYWNybyBhbmQgbm90IGEgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBpbW1lZGlhdGUgdmFsdWVzIHdpdGgKKy8vIHNyYWlfZXBpMzIsIGUuZy4KKyNkZWZpbmUgVFJBTlNGT1JNKFJHX0xPLCBSR19ISSwgR0JfTE8sIEdCX0hJLCBNVUxUX1JHLCBNVUxUX0dCLCBcCisgICAgICAgICAgICAgICAgICBST1VOREVSLCBERVNDQUxFX0ZJWCwgT1VUKSBkbyB7ICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYwX2xvID0gX21tX21hZGRfZXBpMTYoUkdfTE8sIE1VTFRfUkcpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMF9oaSA9IF9tbV9tYWRkX2VwaTE2KFJHX0hJLCBNVUxUX1JHKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjFfbG8gPSBfbW1fbWFkZF9lcGkxNihHQl9MTywgTVVMVF9HQik7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYxX2hpID0gX21tX21hZGRfZXBpMTYoR0JfSEksIE1VTFRfR0IpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMl9sbyA9IF9tbV9hZGRfZXBpMzIoVjBfbG8sIFYxX2xvKTsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjJfaGkgPSBfbW1fYWRkX2VwaTMyKFYwX2hpLCBWMV9oaSk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYzX2xvID0gX21tX2FkZF9lcGkzMihWMl9sbywgUk9VTkRFUik7ICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWM19oaSA9IF9tbV9hZGRfZXBpMzIoVjJfaGksIFJPVU5ERVIpOyAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjVfbG8gPSBfbW1fc3JhaV9lcGkzMihWM19sbywgREVTQ0FMRV9GSVgpOyAgICAgXAorICBjb25zdCBfX20xMjhpIFY1X2hpID0gX21tX3NyYWlfZXBpMzIoVjNfaGksIERFU0NBTEVfRklYKTsgICAgIFwKKyAgKE9VVCkgPSBfbW1fcGFja3NfZXBpMzIoVjVfbG8sIFY1X2hpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1LX0NTVF8xNihBLCBCKSBfbW1fc2V0X2VwaTE2KChCKSwgKEEpLCAoQiksIChBKSwgKEIpLCAoQSksIChCKSwgKEEpKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJHQlRvWV9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFkpIHsKKyAgY29uc3QgX19tMTI4aSBrUkdfeSA9IE1LX0NTVF8xNigxNjgzOSwgMzMwNTkgLSAxNjM4NCk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3kgPSBNS19DU1RfMTYoMTYzODQsIDY0MjApOworICBjb25zdCBfX20xMjhpIGtIQUxGX1kgPSBfbW1fc2V0MV9lcGkzMigoMTYgPDwgWVVWX0ZJWCkgKyBZVVZfSEFMRik7CisKKyAgY29uc3QgX19tMTI4aSBSR19sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIFJHX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgR0JfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKkcsICpCKTsKKyAgY29uc3QgX19tMTI4aSBHQl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqRywgKkIpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR195LCBrR0JfeSwga0hBTEZfWSwgWVVWX0ZJWCwgKlkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0UkdCVG9VVl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFYpIHsKKyAgY29uc3QgX19tMTI4aSBrUkdfdSA9IE1LX0NTVF8xNigtOTcxOSwgLTE5MDgxKTsKKyAgY29uc3QgX19tMTI4aSBrR0JfdSA9IE1LX0NTVF8xNigwLCAyODgwMCk7CisgIGNvbnN0IF9fbTEyOGkga1JHX3YgPSBNS19DU1RfMTYoMjg4MDAsIDApOworICBjb25zdCBfX20xMjhpIGtHQl92ID0gTUtfQ1NUXzE2KC0yNDExNiwgLTQ2ODQpOworICBjb25zdCBfX20xMjhpIGtIQUxGX1VWID0gX21tX3NldDFfZXBpMzIoKCgxMjggPDwgWVVWX0ZJWCkgKyBZVVZfSEFMRikgPDwgMik7CisKKyAgY29uc3QgX19tMTI4aSBSR19sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIFJHX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgR0JfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKkcsICpCKTsKKyAgY29uc3QgX19tMTI4aSBHQl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqRywgKkIpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR191LCBrR0JfdSwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlUpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR192LCBrR0JfdiwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlYpOworfQorCisjdW5kZWYgTUtfQ1NUXzE2CisjdW5kZWYgVFJBTlNGT1JNCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWV9TU0UyKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IHJnYiArPSAzICogMTYgKiAyKSB7CisgICAgX19tMTI4aSByZ2JfcGxhbmVbNl07CisgICAgaW50IGo7CisKKyAgICBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTIocmdiLCByZ2JfcGxhbmUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraiwgaSArPSAxNikgeworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIF9fbTEyOGkgciwgZywgYiwgWTAsIFkxOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgYiA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyLCAmZywgJmIsICZZMCk7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnIsICZnLCAmYiwgJlkxKTsKKworICAgICAgLy8gQ2FzdCB0byA4LWJpdCBhbmQgc3RvcmUuCisgICAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCByZ2IgKz0gMykgeyAgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1kocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1IyNFRvWV9TU0UyKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGJnciArPSAzICogMTYgKiAyKSB7CisgICAgX19tMTI4aSBiZ3JfcGxhbmVbNl07CisgICAgaW50IGo7CisKKyAgICBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTIoYmdyLCBiZ3JfcGxhbmUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraiwgaSArPSAxNikgeworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIF9fbTEyOGkgciwgZywgYiwgWTAsIFkxOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyLCAmZywgJmIsICZZMCk7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICBiID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICByID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnIsICZnLCAmYiwgJlkxKTsKKworICAgICAgLy8gQ2FzdCB0byA4LWJpdCBhbmQgc3RvcmUuCisgICAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCBiZ3IgKz0gMykgeyAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShiZ3JbMl0sIGJnclsxXSwgYmdyWzBdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1lfU1NFMihjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4xNTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMTYpIHsKKyAgICBfX20xMjhpIFkwLCBZMSwgcmdiWzZdOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFMigmYXJnYltpXSwgcmdiKTsKKyAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlkwKTsKKyAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnJnYlsxXSwgJnJnYlszXSwgJnJnYls1XSwgJlkxKTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICBjb25zdCB1aW50MzJfdCBwID0gYXJnYltpXTsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKChwID4+IDE2KSAmIDB4ZmYsIChwID4+IDgpICYgMHhmZiwgKHAgPj4gIDApICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgIFlVVl9IQUxGKTsKKyAgfQorfQorCisvLyBIb3Jpem9udGFsIGFkZCAoZG91YmxlZCkgb2YgdHdvIDE2YiB2YWx1ZXMsIHJlc3VsdCBpcyAxNmIuCisvLyBpbjogQSB8IEIgfCBDIHwgRCB8IC4uLiAtPiBvdXQ6IDIqKEErQikgfCAyKihDK0QpIHwgLi4uCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsQWRkUGFja19TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dCkgeworICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoMik7CisgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9tYWRkX2VwaTE2KCpBLCBrMik7CisgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tYWRkX2VwaTE2KCpCLCBrMik7CisgICpvdXQgPSBfbW1fcGFja3NfZXBpMzIoQywgRCk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9VVl9TU0UyKGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gc3JjX3dpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgaSArPSAzMiwgdSArPSAxNiwgdiArPSAxNikgeworICAgIF9fbTEyOGkgcmdiWzZdLCBVMCwgVjAsIFUxLCBWMTsKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTIoJmFyZ2JbaV0sIHJnYik7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzBdLCAmcmdiWzFdLCAmcmdiWzBdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbMl0sICZyZ2JbM10sICZyZ2JbMl0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYls0XSwgJnJnYls1XSwgJnJnYls0XSk7CisgICAgQ29udmVydFJHQlRvVVZfU1NFMigmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmVTAsICZWMCk7CisKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTIoJmFyZ2JbaSArIDE2XSwgcmdiKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbMF0sICZyZ2JbMV0sICZyZ2JbMF0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYlsyXSwgJnJnYlszXSwgJnJnYlsyXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzRdLCAmcmdiWzVdLCAmcmdiWzRdKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0UyKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZVMSwgJlYxKTsKKworICAgIFUwID0gX21tX3BhY2t1c19lcGkxNihVMCwgVTEpOworICAgIFYwID0gX21tX3BhY2t1c19lcGkxNihWMCwgVjEpOworICAgIGlmICghZG9fc3RvcmUpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcHJldl91ID0gTE9BRF8xNih1KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcHJldl92ID0gTE9BRF8xNih2KTsKKyAgICAgIFUwID0gX21tX2F2Z19lcHU4KFUwLCBwcmV2X3UpOworICAgICAgVjAgPSBfbW1fYXZnX2VwdTgoVjAsIHByZXZfdik7CisgICAgfQorICAgIFNUT1JFXzE2KFUwLCB1KTsKKyAgICBTVE9SRV8xNihWMCwgdik7CisgIH0KKyAgaWYgKGkgPCBzcmNfd2lkdGgpIHsgIC8vIGxlZnQtb3ZlcgorICAgIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhhcmdiICsgaSwgdSwgdiwgc3JjX3dpZHRoIC0gaSwgZG9fc3RvcmUpOworICB9Cit9CisKKy8vIENvbnZlcnQgMTYgcGFja2VkIEFSR0IgMTZiLXZhbHVlcyB0byByW10sIGdbXSwgYltdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFMigKKyAgICBjb25zdCB1aW50MTZfdCogY29uc3QgcmdieCwKKyAgICBfX20xMjhpKiBjb25zdCByLCBfX20xMjhpKiBjb25zdCBnLCBfX20xMjhpKiBjb25zdCBiKSB7CisgIGNvbnN0IF9fbTEyOGkgaW4wID0gTE9BRF8xNihyZ2J4ICsgIDApOyAgLy8gcjAgfCBnMCB8IGIwIHx4fCByMSB8IGcxIHwgYjEgfHgKKyAgY29uc3QgX19tMTI4aSBpbjEgPSBMT0FEXzE2KHJnYnggKyAgOCk7ICAvLyByMiB8IGcyIHwgYjIgfHh8IHIzIHwgZzMgfCBiMyB8eAorICBjb25zdCBfX20xMjhpIGluMiA9IExPQURfMTYocmdieCArIDE2KTsgIC8vIHI0IHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgaW4zID0gTE9BRF8xNihyZ2J4ICsgMjQpOyAgLy8gcjYgfCAuLi4KKyAgLy8gY29sdW1uLXdpc2UgdHJhbnNwb3NlCisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoaW4wLCBpbjEpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2hpX2VwaTE2KGluMCwgaW4xKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV91bnBhY2tsb19lcGkxNihpbjIsIGluMyk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fdW5wYWNraGlfZXBpMTYoaW4yLCBpbjMpOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTE2KEEwLCBBMSk7ICAvLyByMCByMSByMiByMyB8IGcwIGcxIC4uCisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNraGlfZXBpMTYoQTAsIEExKTsgIC8vIGIwIGIxIGIyIGIzIHwgeCB4IHggeAorICBjb25zdCBfX20xMjhpIEIyID0gX21tX3VucGFja2xvX2VwaTE2KEEyLCBBMyk7ICAvLyByNCByNSByNiByNyB8IGc0IGc1IC4uCisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fdW5wYWNraGlfZXBpMTYoQTIsIEEzKTsgIC8vIGI0IGI1IGI2IGI3IHwgeCB4IHggeAorICAqciA9IF9tbV91bnBhY2tsb19lcGk2NChCMCwgQjIpOworICAqZyA9IF9tbV91bnBhY2toaV9lcGk2NChCMCwgQjIpOworICAqYiA9IF9tbV91bnBhY2tsb19lcGk2NChCMSwgQjMpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCQTMyVG9VVl9TU0UyKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MTU7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBsYXN0X3JnYiA9IHJnYiArIDQgKiBtYXhfd2lkdGg7CisgIHdoaWxlIChyZ2IgPCBsYXN0X3JnYikgeworICAgIF9fbTEyOGkgciwgZywgYiwgVTAsIFYwLCBVMSwgVjE7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTIocmdiICsgIDAsICZyLCAmZywgJmIpOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTIoJnIsICZnLCAmYiwgJlUwLCAmVjApOworICAgIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0UyKHJnYiArIDMyLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0UyKCZyLCAmZywgJmIsICZVMSwgJlYxKTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFUwLCBVMSksIHUpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoVjAsIFYxKSwgdik7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICAgIHJnYiArPSAyICogMzI7CisgIH0KKyAgaWYgKG1heF93aWR0aCA8IHdpZHRoKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICBXZWJQQ29udmVydFJHQkEzMlRvVVZfQyhyZ2IsIHUsIHYsIHdpZHRoIC0gbWF4X3dpZHRoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMih2b2lkKSB7CisgIFdlYlBDb252ZXJ0QVJHQlRvWSA9IENvbnZlcnRBUkdCVG9ZX1NTRTI7CisgIFdlYlBDb252ZXJ0QVJHQlRvVVYgPSBDb252ZXJ0QVJHQlRvVVZfU1NFMjsKKworICBXZWJQQ29udmVydFJHQjI0VG9ZID0gQ29udmVydFJHQjI0VG9ZX1NTRTI7CisgIFdlYlBDb252ZXJ0QkdSMjRUb1kgPSBDb252ZXJ0QkdSMjRUb1lfU1NFMjsKKworICBXZWJQQ29udmVydFJHQkEzMlRvVVYgPSBDb252ZXJ0UkdCQTMyVG9VVl9TU0UyOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9ZICgoMSA8PCAxMCkgLSAxKSAgICAvLyAxMGIgcHJlY2lzaW9uIG92ZXIgMTZiLWFyaXRobWV0aWMKK3N0YXRpYyB1aW50MTZfdCBjbGlwX3koaW50IHYpIHsKKyAgcmV0dXJuICh2IDwgMCkgPyAwIDogKHYgPiBNQVhfWSkgPyBNQVhfWSA6ICh1aW50MTZfdCl2OworfQorCitzdGF0aWMgdWludDY0X3QgU2hhcnBZVVZVcGRhdGVZX1NTRTIoY29uc3QgdWludDE2X3QqIHJlZiwgY29uc3QgdWludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIHVpbnQ2NF90IGRpZmYgPSAwOworICB1aW50MzJfdCB0bXBbNF07CisgIGludCBpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIG1heCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9ZKTsKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGkxNigxKTsKKyAgX19tMTI4aSBzdW0gPSB6ZXJvOworCisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmVmICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX3N1Yl9lcGkxNihBLCBCKTsgICAgICAgLy8gZGlmZl95CisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIEQpOyAgLy8gc2lnbiAoLTEgb3IgMCkKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fYWRkX2VwaTE2KEMsIEQpOyAgICAgICAvLyBuZXdfeQorICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9vcl9zaTEyOChFLCBvbmUpOyAgICAgIC8vIC0xIG9yIDEKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fbWF4X2VwaTE2KF9tbV9taW5fZXBpMTYoRiwgbWF4KSwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBJID0gX21tX21hZGRfZXBpMTYoRCwgRyk7ICAgICAgLy8gc3VtKGFicyguLi4pKQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBpKSwgSCk7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIEkpOworICB9CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtKTsKKyAgZGlmZiA9IHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXTsKKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3kgPSByZWZbaV0gLSBzcmNbaV07CisgICAgY29uc3QgaW50IG5ld195ID0gKGludClkc3RbaV0gKyBkaWZmX3k7CisgICAgZHN0W2ldID0gY2xpcF95KG5ld195KTsKKyAgICBkaWZmICs9ICh1aW50NjRfdClhYnMoZGlmZl95KTsKKyAgfQorICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZVcGRhdGVSR0JfU1NFMihjb25zdCBpbnQxNl90KiByZWYsIGNvbnN0IGludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZWYgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fc3ViX2VwaTE2KEEsIEIpOyAgIC8vIGRpZmZfdXYKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fYWRkX2VwaTE2KEMsIEQpOyAgIC8vIG5ld191dgorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBpKSwgRSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3V2ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGRzdFtpXSArPSBkaWZmX3V2OworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWRmlsdGVyUm93X1NTRTIoY29uc3QgaW50MTZfdCogQSwgY29uc3QgaW50MTZfdCogQiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGJlc3RfeSwgdWludDE2X3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0OCA9IF9tbV9zZXQxX2VwaTE2KDgpOworICBjb25zdCBfX20xMjhpIG1heCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9ZKTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoQSArIGkgKyAwKSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKEEgKyBpICsgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShCICsgaSArIDApKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoQiArIGkgKyAxKSk7CisgICAgY29uc3QgX19tMTI4aSBhMGIxID0gX21tX2FkZF9lcGkxNihhMCwgYjEpOworICAgIGNvbnN0IF9fbTEyOGkgYTFiMCA9IF9tbV9hZGRfZXBpMTYoYTEsIGIwKTsKKyAgICBjb25zdCBfX20xMjhpIGEwYTFiMGIxID0gX21tX2FkZF9lcGkxNihhMGIxLCBhMWIwKTsgIC8vIEEwK0ExK0IwK0IxCisgICAgY29uc3QgX19tMTI4aSBhMGExYjBiMV84ID0gX21tX2FkZF9lcGkxNihhMGExYjBiMSwga0NzdDgpOworICAgIGNvbnN0IF9fbTEyOGkgYTBiMV8yID0gX21tX2FkZF9lcGkxNihhMGIxLCBhMGIxKTsgICAgLy8gMiooQTArQjEpCisgICAgY29uc3QgX19tMTI4aSBhMWIwXzIgPSBfbW1fYWRkX2VwaTE2KGExYjAsIGExYjApOyAgICAvLyAyKihBMStCMCkKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX3NyYWlfZXBpMTYoX21tX2FkZF9lcGkxNihhMGIxXzIsIGEwYTFiMGIxXzgpLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX3NyYWlfZXBpMTYoX21tX2FkZF9lcGkxNihhMWIwXzIsIGEwYTFiMGIxXzgpLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX2FkZF9lcGkxNihjMSwgYTApOworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fYWRkX2VwaTE2KGMwLCBhMSk7CisgICAgY29uc3QgX19tMTI4aSBlMCA9IF9tbV9zcmFpX2VwaTE2KGQwLCAxKTsKKyAgICBjb25zdCBfX20xMjhpIGUxID0gX21tX3NyYWlfZXBpMTYoZDEsIDEpOworICAgIGNvbnN0IF9fbTEyOGkgZjAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoZTAsIGUxKTsKKyAgICBjb25zdCBfX20xMjhpIGYxID0gX21tX3VucGFja2hpX2VwaTE2KGUwLCBlMSk7CisgICAgY29uc3QgX19tMTI4aSBnMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGJlc3RfeSArIDIgKiBpICsgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShiZXN0X3kgKyAyICogaSArIDgpKTsKKyAgICBjb25zdCBfX20xMjhpIGgwID0gX21tX2FkZF9lcGkxNihnMCwgZjApOworICAgIGNvbnN0IF9fbTEyOGkgaDEgPSBfbW1fYWRkX2VwaTE2KGcxLCBmMSk7CisgICAgY29uc3QgX19tMTI4aSBpMCA9IF9tbV9tYXhfZXBpMTYoX21tX21pbl9lcGkxNihoMCwgbWF4KSwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBpMSA9IF9tbV9tYXhfZXBpMTYoX21tX21pbl9lcGkxNihoMSwgbWF4KSwgemVybyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKG91dCArIDIgKiBpICsgMCksIGkwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikob3V0ICsgMiAqIGkgKyA4KSwgaTEpOworICB9CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAvLyAgICg5ICogQTAgKyAzICogQTEgKyAzICogQjAgKyBCMSArIDgpID4+IDQgPQorICAgIC8vID0gKDggKiBBMCArIDIgKiAoQTEgKyBCMCkgKyAoQTAgKyBBMSArIEIwICsgQjEgKyA4KSkgPj4gNAorICAgIC8vIFdlIHJldXNlIHRoZSBjb21tb24gc3ViLWV4cHJlc3Npb25zLgorICAgIGNvbnN0IGludCBhMGIxID0gQVtpICsgMF0gKyBCW2kgKyAxXTsKKyAgICBjb25zdCBpbnQgYTFiMCA9IEFbaSArIDFdICsgQltpICsgMF07CisgICAgY29uc3QgaW50IGEwYTFiMGIxID0gYTBiMSArIGExYjAgKyA4OworICAgIGNvbnN0IGludCB2MCA9ICg4ICogQVtpICsgMF0gKyAyICogYTFiMCArIGEwYTFiMGIxKSA+PiA0OworICAgIGNvbnN0IGludCB2MSA9ICg4ICogQVtpICsgMV0gKyAyICogYTBiMSArIGEwYTFiMGIxKSA+PiA0OworICAgIG91dFsyICogaSArIDBdID0gY2xpcF95KGJlc3RfeVsyICogaSArIDBdICsgdjApOworICAgIG91dFsyICogaSArIDFdID0gY2xpcF95KGJlc3RfeVsyICogaSArIDFdICsgdjEpOworICB9Cit9CisKKyN1bmRlZiBNQVhfWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNoYXJwWVVWU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2hhcnBZVVZTU0UyKHZvaWQpIHsKKyAgV2ViUFNoYXJwWVVWVXBkYXRlWSA9IFNoYXJwWVVWVXBkYXRlWV9TU0UyOworICBXZWJQU2hhcnBZVVZVcGRhdGVSR0IgPSBTaGFycFlVVlVwZGF0ZVJHQl9TU0UyOworICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3cgPSBTaGFycFlVVkZpbHRlclJvd19TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2FtcGxlcnNTU0UyKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTaGFycFlVVlNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZDFmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTQxLmMKQEAgLTAsMCArMSw2MTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTQxLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c21taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnZlcnQgc3BhbnMgb2YgMzIgcGl4ZWxzIHRvIHZhcmlvdXMgUkdCIGZvcm1hdHMgZm9yIHRoZSBmYW5jeSB1cHNhbXBsZXIuCisKKy8vIFRoZXNlIGNvbnN0YW50cyBhcmUgMTRiIGZpeGVkLXBvaW50IHZlcnNpb24gb2YgSVRVLVIgQlQuNjAxIGNvbnN0YW50cy4KKy8vIFIgPSAoMTkwNzcgKiB5ICAgICAgICAgICAgICsgMjYxNDkgKiB2IC0gMTQyMzQpID4+IDYKKy8vIEcgPSAoMTkwNzcgKiB5IC0gIDY0MTkgKiB1IC0gMTMzMjAgKiB2ICsgIDg3MDgpID4+IDYKKy8vIEIgPSAoMTkwNzcgKiB5ICsgMzMwNTAgKiB1ICAgICAgICAgICAgIC0gMTc2ODUpID4+IDYKK3N0YXRpYyB2b2lkIENvbnZlcnRZVVY0NDRUb1JHQl9TU0U0MShjb25zdCBfX20xMjhpKiBjb25zdCBZMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBVMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBWMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIGsxOTA3NyA9IF9tbV9zZXQxX2VwaTE2KDE5MDc3KTsKKyAgY29uc3QgX19tMTI4aSBrMjYxNDkgPSBfbW1fc2V0MV9lcGkxNigyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgazE0MjM0ID0gX21tX3NldDFfZXBpMTYoMTQyMzQpOworICAvLyAzMzA1MCBkb2Vzbid0IGZpdCBpbiBhIHNpZ25lZCBzaG9ydDogb25seSB1c2UgdGhpcyB3aXRoIHVuc2lnbmVkIGFyaXRobWV0aWMKKyAgY29uc3QgX19tMTI4aSBrMzMwNTAgPSBfbW1fc2V0MV9lcGkxNigoc2hvcnQpMzMwNTApOworICBjb25zdCBfX20xMjhpIGsxNzY4NSA9IF9tbV9zZXQxX2VwaTE2KDE3Njg1KTsKKyAgY29uc3QgX19tMTI4aSBrNjQxOSAgPSBfbW1fc2V0MV9lcGkxNig2NDE5KTsKKyAgY29uc3QgX19tMTI4aSBrMTMzMjAgPSBfbW1fc2V0MV9lcGkxNigxMzMyMCk7CisgIGNvbnN0IF9fbTEyOGkgazg3MDggID0gX21tX3NldDFfZXBpMTYoODcwOCk7CisKKyAgY29uc3QgX19tMTI4aSBZMSA9IF9tbV9tdWxoaV9lcHUxNigqWTAsIGsxOTA3Nyk7CisKKyAgY29uc3QgX19tMTI4aSBSMCA9IF9tbV9tdWxoaV9lcHUxNigqVjAsIGsyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgUjEgPSBfbW1fc3ViX2VwaTE2KFkxLCBrMTQyMzQpOworICBjb25zdCBfX20xMjhpIFIyID0gX21tX2FkZF9lcGkxNihSMSwgUjApOworCisgIGNvbnN0IF9fbTEyOGkgRzAgPSBfbW1fbXVsaGlfZXB1MTYoKlUwLCBrNjQxOSk7CisgIGNvbnN0IF9fbTEyOGkgRzEgPSBfbW1fbXVsaGlfZXB1MTYoKlYwLCBrMTMzMjApOworICBjb25zdCBfX20xMjhpIEcyID0gX21tX2FkZF9lcGkxNihZMSwgazg3MDgpOworICBjb25zdCBfX20xMjhpIEczID0gX21tX2FkZF9lcGkxNihHMCwgRzEpOworICBjb25zdCBfX20xMjhpIEc0ID0gX21tX3N1Yl9lcGkxNihHMiwgRzMpOworCisgIC8vIGJlIGNhcmVmdWwgd2l0aCB0aGUgc2F0dXJhdGVkICp1bnNpZ25lZCogYXJpdGhtZXRpYyBoZXJlIQorICBjb25zdCBfX20xMjhpIEIwID0gX21tX211bGhpX2VwdTE2KCpVMCwgazMzMDUwKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hZGRzX2VwdTE2KEIwLCBZMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fc3Vic19lcHUxNihCMSwgazE3Njg1KTsKKworICAvLyB1c2UgbG9naWNhbCBzaGlmdCBmb3IgQjIsIHdoaWNoIGNhbiBiZSBsYXJnZXIgdGhhbiAzMjc2NworICAqUiA9IF9tbV9zcmFpX2VwaTE2KFIyLCA2KTsgICAvLyByYW5nZTogWy0xNDIzNCwgMzA4MTVdCisgICpHID0gX21tX3NyYWlfZXBpMTYoRzQsIDYpOyAgIC8vIHJhbmdlOiBbLTEwOTUzLCAyNzcxMF0KKyAgKkIgPSBfbW1fc3JsaV9lcGkxNihCMiwgNik7ICAgLy8gcmFuZ2U6IFswLCAzNDIzOF0KK30KKworLy8gTG9hZCB0aGUgYnl0ZXMgaW50byB0aGUgKnVwcGVyKiBwYXJ0IG9mIDE2YiB3b3Jkcy4gVGhhdCdzICI8PCA4IiwgYmFzaWNhbGx5Lgorc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgTG9hZF9ISV8xNl9TU0U0MShjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGk4KHplcm8sIF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopc3JjKSk7Cit9CisKKy8vIExvYWQgYW5kIHJlcGxpY2F0ZSB0aGUgVS9WIHNhbXBsZXMKK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIExvYWRfVVZfSElfOF9TU0U0MShjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2N2dHNpMzJfc2kxMjgoKihjb25zdCB1aW50MzJfdCopc3JjKTsKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX3VucGFja2xvX2VwaTgoemVybywgdG1wMCk7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYodG1wMSwgdG1wMSk7ICAgLy8gcmVwbGljYXRlIHNhbXBsZXMKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQ0NCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDQ0VG9SR0JfU1NFNDEoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBZMCA9IExvYWRfSElfMTZfU1NFNDEoeSksIFUwID0gTG9hZF9ISV8xNl9TU0U0MSh1KSwKKyAgICAgICAgICAgICAgICBWMCA9IExvYWRfSElfMTZfU1NFNDEodik7CisgIENvbnZlcnRZVVY0NDRUb1JHQl9TU0U0MSgmWTAsICZVMCwgJlYwLCBSLCBHLCBCKTsKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQyMCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDIwVG9SR0JfU1NFNDEoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBZMCA9IExvYWRfSElfMTZfU1NFNDEoeSksIFUwID0gTG9hZF9VVl9ISV84X1NTRTQxKHUpLAorICAgICAgICAgICAgICAgIFYwID0gTG9hZF9VVl9ISV84X1NTRTQxKHYpOworICBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFNDEoJlkwLCAmVTAsICZWMCwgUiwgRywgQik7Cit9CisKKy8vIFBhY2sgdGhlIHBsYW5hciBidWZmZXJzCisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIHRyaXBsZXQgYnkgdHJpcGxldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciByZ2IgYXMgcmdicmdicmdicmdiIC4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGxhbmFyVG8yNGJfU1NFNDEoCisgICAgX19tMTI4aSogY29uc3QgaW4wLCBfX20xMjhpKiBjb25zdCBpbjEsIF9fbTEyOGkqIGNvbnN0IGluMiwKKyAgICBfX20xMjhpKiBjb25zdCBpbjMsIF9fbTEyOGkqIGNvbnN0IGluNCwgX19tMTI4aSogY29uc3QgaW41LAorICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICAvLyBUaGUgaW5wdXQgaXMgNiByZWdpc3RlcnMgb2Ygc2l4dGVlbiA4YiBidXQgZm9yIHRoZSBzYWtlIG9mIGV4cGxhbmF0aW9uLAorICAvLyBsZXQncyB0YWtlIDYgcmVnaXN0ZXJzIG9mIGZvdXIgOGIgdmFsdWVzLgorICAvLyBUbyBwYWNrLCB3ZSB3aWxsIGtlZXAgdGFraW5nIG9uZSBldmVyeSB0d28gOGIgaW50ZWdlciBhbmQgbW92ZSBpdAorICAvLyBhcm91bmQgYXMgZm9sbG93czoKKyAgLy8gSW5wdXQ6CisgIC8vICAgcjByMXIycjMgfCByNHI1cjZyNyB8IGcwZzFnMmczIHwgZzRnNWc2ZzcgfCBiMGIxYjJiMyB8IGI0YjViNmI3CisgIC8vIFNwbGl0IHRoZSA2IHJlZ2lzdGVycyBpbiB0d28gc2V0cyBvZiAzIHJlZ2lzdGVyczogdGhlIGZpcnN0IHNldCBhcyB0aGUgZXZlbgorICAvLyA4YiBieXRlcywgdGhlIHNlY29uZCB0aGUgb2RkIG9uZXM6CisgIC8vICAgcjByMnI0cjYgfCBnMGcyZzRnNiB8IGIwYjJiNGI2IHwgcjFyM3I1cjcgfCBnMWczZzVnNyB8IGIxYjNiNWI3CisgIC8vIFJlcGVhdCB0aGUgc2FtZSBwZXJtdXRhdGlvbnMgdHdpY2UgbW9yZToKKyAgLy8gICByMHI0ZzBnNCB8IGIwYjRyMXI1IHwgZzFnNWIxYjUgfCByMnI2ZzJnNiB8IGIyYjZyM3I3IHwgZzNnN2IzYjcKKyAgLy8gICByMGcwYjByMSB8IGcxYjFyMmcyIHwgYjJyM2czYjMgfCByNGc0YjRyNSB8IGc1YjVyNmc2IHwgYjZyN2c3YjcKKyAgVlA4UGxhbmFyVG8yNGJfU1NFNDEoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSk7CisKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArICAwKSwgKmluMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAxNiksICppbjEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgMzIpLCAqaW4yKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDQ4KSwgKmluMyk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA2NCksICppbjQpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgODApLCAqaW41KTsKK30KKwordm9pZCBWUDhZdXZUb1JnYjMyX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgX19tMTI4aSByZ2IwLCByZ2IxLCByZ2IyLCByZ2IzLCByZ2I0LCByZ2I1OworCisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAwLCB1ICsgMCwgdiArIDAsICZSMCwgJkcwLCAmQjApOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgOCwgdSArIDgsIHYgKyA4LCAmUjEsICZHMSwgJkIxKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDE2LCB1ICsgMTYsIHYgKyAxNiwgJlIyLCAmRzIsICZCMik7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAyNCwgdSArIDI0LCB2ICsgMjQsICZSMywgJkczLCAmQjMpOworCisgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIFJSUlJHR0dHQkJCQi4KKyAgcmdiMCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgcmdiMSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgcmdiMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgcmdiMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgcmdiNCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgcmdiNSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKworICAvLyBQYWNrIGFzIFJHQlJHQlJHQlJHQi4KKyAgUGxhbmFyVG8yNGJfU1NFNDEoJnJnYjAsICZyZ2IxLCAmcmdiMiwgJnJnYjMsICZyZ2I0LCAmcmdiNSwgZHN0KTsKK30KKwordm9pZCBWUDhZdXZUb0JncjMyX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgX19tMTI4aSBiZ3IwLCBiZ3IxLCBiZ3IyLCBiZ3IzLCBiZ3I0LCBiZ3I1OworCisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgIDgsIHUgKyAgOCwgdiArICA4LCAmUjEsICZHMSwgJkIxKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDE2LCB1ICsgMTYsIHYgKyAxNiwgJlIyLCAmRzIsICZCMik7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAyNCwgdSArIDI0LCB2ICsgMjQsICZSMywgJkczLCAmQjMpOworCisgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIEJCQkJHR0dHUlJSUi4KKyAgYmdyMCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgYmdyMSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKyAgYmdyMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgYmdyMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgYmdyNCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgYmdyNT0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworCisgIC8vIFBhY2sgYXMgQkdSQkdSQkdSQkdSLgorICBQbGFuYXJUbzI0Yl9TU0U0MSgmYmdyMCwgJmJncjEsICZiZ3IyLCAmYmdyMywgJmJncjQsICZiZ3I1LCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBcmJpdHJhcnktbGVuZ3RoIHJvdyBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitzdGF0aWMgdm9pZCBZdXZUb1JnYlJvd19TU0U0MShjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDMyIDw9IGxlbjsgbiArPSAzMiwgZHN0ICs9IDMyICogMykgeworICAgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgICBfX20xMjhpIHJnYjAsIHJnYjEsIHJnYjIsIHJnYjMsIHJnYjQsIHJnYjU7CisKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgIDgsIHUgKyAgNCwgdiArICA0LCAmUjEsICZHMSwgJkIxKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgMTYsIHUgKyAgOCwgdiArICA4LCAmUjIsICZHMiwgJkIyKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgMjQsIHUgKyAxMiwgdiArIDEyLCAmUjMsICZHMywgJkIzKTsKKworICAgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIFJSUlJHR0dHQkJCQi4KKyAgICByZ2IwID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICAgIHJnYjEgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisgICAgcmdiMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgICByZ2IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICAgIHJnYjQgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgICAgcmdiNSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKworICAgIC8vIFBhY2sgYXMgUkdCUkdCUkdCUkdCLgorICAgIFBsYW5hclRvMjRiX1NTRTQxKCZyZ2IwLCAmcmdiMSwgJnJnYjIsICZyZ2IzLCAmcmdiNCwgJnJnYjUsIGRzdCk7CisKKyAgICB5ICs9IDMyOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvUmdiKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDM7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JSb3dfU1NFNDEoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyAzMiA8PSBsZW47IG4gKz0gMzIsIGRzdCArPSAzMiAqIDMpIHsKKyAgICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgICAgX19tMTI4aSBiZ3IwLCBiZ3IxLCBiZ3IyLCBiZ3IzLCBiZ3I0LCBiZ3I1OworCisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArICA4LCB1ICsgIDQsIHYgKyAgNCwgJlIxLCAmRzEsICZCMSk7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArIDE2LCB1ICsgIDgsIHYgKyAgOCwgJlIyLCAmRzIsICZCMik7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArIDI0LCB1ICsgMTIsIHYgKyAxMiwgJlIzLCAmRzMsICZCMyk7CisKKyAgICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBCQkJCR0dHR1JSUlIuCisgICAgYmdyMCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICBiZ3IxID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworICAgIGJncjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgICAgYmdyMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgICBiZ3I0ID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICAgIGJncjUgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisKKyAgICAvLyBQYWNrIGFzIEJHUkJHUkJHUkJHUi4KKyAgICBQbGFuYXJUbzI0Yl9TU0U0MSgmYmdyMCwgJmJncjEsICZiZ3IyLCAmYmdyMywgJmJncjQsICZiZ3I1LCBkc3QpOworCisgICAgeSArPSAzMjsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0Jncih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSAzOworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFNDEodm9pZCkgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICA9IFl1dlRvUmdiUm93X1NTRTQxOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICA9IFl1dlRvQmdyUm93X1NTRTQxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCMjQvMzIgLT4gWVVWIGNvbnZlcnRlcnMKKworLy8gTG9hZCBlaWdodCAxNmItd29yZHMgZnJvbSAqc3JjLgorI2RlZmluZSBMT0FEXzE2KHNyYykgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjKSkKKy8vIFN0b3JlIGVpdGhlciAxNmItd29yZHMgaW50byAqZHN0CisjZGVmaW5lIFNUT1JFXzE2KFYsIGRzdCkgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCksIChWKSkKKworI2RlZmluZSBXRUJQX1NTRTQxX1NIVUZGKE9VVCkgIGRvIHsgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9zaHVmZmxlX2VwaTgoQTAsIHNodWZmMCk7IFwKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX3NodWZmbGVfZXBpOChBMSwgc2h1ZmYxKTsgXAorICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc2h1ZmZsZV9lcGk4KEEyLCBzaHVmZjIpOyBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zaHVmZmxlX2VwaTgoQTMsIHNodWZmMCk7IFwKKyAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX3NodWZmbGVfZXBpOChBNCwgc2h1ZmYxKTsgXAorICBjb25zdCBfX20xMjhpIHRtcDUgPSBfbW1fc2h1ZmZsZV9lcGk4KEE1LCBzaHVmZjIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogT1IgZXZlcnl0aGluZyB0byBnZXQgb25lIGNoYW5uZWwgKi8gICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDYgPSBfbW1fb3Jfc2kxMjgodG1wMCwgdG1wMSk7ICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wNyA9IF9tbV9vcl9zaTEyOCh0bXAzLCB0bXA0KTsgICAgIFwKKyAgb3V0W09VVCArIDBdID0gX21tX29yX3NpMTI4KHRtcDYsIHRtcDIpOyAgICAgICAgICAgXAorICBvdXRbT1VUICsgMV0gPSBfbW1fb3Jfc2kxMjgodG1wNywgdG1wNSk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKTsKKworLy8gVW5wYWNrIHRoZSA4YiBpbnB1dCByZ2JyZ2JyZ2JyZ2IgLi4uIGFzIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzOgorLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyBTaW1pbGFyIHRvIFBsYW5hclRvMjRiSGVscGVyKCksIGJ1dCBpbiByZXZlcnNlIG9yZGVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0U0MSgKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2IsIF9fbTEyOGkqIGNvbnN0IG91dCAvKm91dFs2XSovKSB7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAgMCkpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMTYpKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDMyKSk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA0OCkpOworICBjb25zdCBfX20xMjhpIEE0ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNjQpKTsKKyAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDgwKSk7CisKKyAgLy8gQ29tcHV0ZSBSUi4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTUsIDEyLCA5LCA2LCAzLCAwKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNCwgMTEsIDgsIDUsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAgICAxMywgMTAsIDcsIDQsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgV0VCUF9TU0U0MV9TSFVGRigwKQorICB9CisgIC8vIENvbXB1dGUgR0cuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMywgMTAsIDcsIDQsIDEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIDE1LCAxMiwgOSwgNiwgMywgMCwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgMTQsIDExLCA4LCA1LCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIFdFQlBfU1NFNDFfU0hVRkYoMikKKyAgfQorICAvLyBDb21wdXRlIEJCLgorICB7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTQsIDExLCA4LCA1LCAyKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTMsIDEwLCA3LCA0LCAxLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAgICAxNSwgMTIsIDksIDYsIDMsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKDQpCisgIH0KK30KKworI3VuZGVmIFdFQlBfU1NFNDFfU0hVRkYKKworLy8gQ29udmVydCA4IHBhY2tlZCBBUkdCIHRvIHJbXSwgZ1tdLCBiW10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFNDEoCisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIF9fbTEyOGkqIGNvbnN0IHJnYiAvKmluWzZdKi8pIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgX19tMTI4aSBhMCA9IExPQURfMTYoYXJnYiArIDApOworICBfX20xMjhpIGExID0gTE9BRF8xNihhcmdiICsgNCk7CisgIF9fbTEyOGkgYTIgPSBMT0FEXzE2KGFyZ2IgKyA4KTsKKyAgX19tMTI4aSBhMyA9IExPQURfMTYoYXJnYiArIDEyKTsKKyAgVlA4TDMyYlRvUGxhbmFyX1NTRTQxKCZhMCwgJmExLCAmYTIsICZhMyk7CisgIHJnYlswXSA9IF9tbV91bnBhY2tsb19lcGk4KGExLCB6ZXJvKTsKKyAgcmdiWzFdID0gX21tX3VucGFja2hpX2VwaTgoYTEsIHplcm8pOworICByZ2JbMl0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMiwgemVybyk7CisgIHJnYlszXSA9IF9tbV91bnBhY2toaV9lcGk4KGEyLCB6ZXJvKTsKKyAgcmdiWzRdID0gX21tX3VucGFja2xvX2VwaTgoYTMsIHplcm8pOworICByZ2JbNV0gPSBfbW1fdW5wYWNraGlfZXBpOChhMywgemVybyk7Cit9CisKKy8vIFRoaXMgbWFjcm8gY29tcHV0ZXMgKFJHICogTVVMVF9SRyArIEdCICogTVVMVF9HQiArIFJPVU5ERVIpID4+IERFU0NBTEVfRklYCisvLyBJdCdzIGEgbWFjcm8gYW5kIG5vdCBhIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgaW1tZWRpYXRlIHZhbHVlcyB3aXRoCisvLyBzcmFpX2VwaTMyLCBlLmcuCisjZGVmaW5lIFRSQU5TRk9STShSR19MTywgUkdfSEksIEdCX0xPLCBHQl9ISSwgTVVMVF9SRywgTVVMVF9HQiwgXAorICAgICAgICAgICAgICAgICAgUk9VTkRFUiwgREVTQ0FMRV9GSVgsIE9VVCkgZG8geyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMF9sbyA9IF9tbV9tYWRkX2VwaTE2KFJHX0xPLCBNVUxUX1JHKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjBfaGkgPSBfbW1fbWFkZF9lcGkxNihSR19ISSwgTVVMVF9SRyk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYxX2xvID0gX21tX21hZGRfZXBpMTYoR0JfTE8sIE1VTFRfR0IpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMV9oaSA9IF9tbV9tYWRkX2VwaTE2KEdCX0hJLCBNVUxUX0dCKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjJfbG8gPSBfbW1fYWRkX2VwaTMyKFYwX2xvLCBWMV9sbyk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYyX2hpID0gX21tX2FkZF9lcGkzMihWMF9oaSwgVjFfaGkpOyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWM19sbyA9IF9tbV9hZGRfZXBpMzIoVjJfbG8sIFJPVU5ERVIpOyAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjNfaGkgPSBfbW1fYWRkX2VwaTMyKFYyX2hpLCBST1VOREVSKTsgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFY1X2xvID0gX21tX3NyYWlfZXBpMzIoVjNfbG8sIERFU0NBTEVfRklYKTsgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWNV9oaSA9IF9tbV9zcmFpX2VwaTMyKFYzX2hpLCBERVNDQUxFX0ZJWCk7ICAgICBcCisgIChPVVQpID0gX21tX3BhY2tzX2VwaTMyKFY1X2xvLCBWNV9oaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNS19DU1RfMTYoQSwgQikgX21tX3NldF9lcGkxNigoQiksIChBKSwgKEIpLCAoQSksIChCKSwgKEEpLCAoQiksIChBKSkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1lfU1NFNDEoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgWSkgeworICBjb25zdCBfX20xMjhpIGtSR195ID0gTUtfQ1NUXzE2KDE2ODM5LCAzMzA1OSAtIDE2Mzg0KTsKKyAgY29uc3QgX19tMTI4aSBrR0JfeSA9IE1LX0NTVF8xNigxNjM4NCwgNjQyMCk7CisgIGNvbnN0IF9fbTEyOGkga0hBTEZfWSA9IF9tbV9zZXQxX2VwaTMyKCgxNiA8PCBZVVZfRklYKSArIFlVVl9IQUxGKTsKKworICBjb25zdCBfX20xMjhpIFJHX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgUkdfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBHQl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqRywgKkIpOworICBjb25zdCBfX20xMjhpIEdCX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpHLCAqQik7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3ksIGtHQl95LCBrSEFMRl9ZLCBZVVZfRklYLCAqWSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1VWX1NTRTQxKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBWKSB7CisgIGNvbnN0IF9fbTEyOGkga1JHX3UgPSBNS19DU1RfMTYoLTk3MTksIC0xOTA4MSk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3UgPSBNS19DU1RfMTYoMCwgMjg4MDApOworICBjb25zdCBfX20xMjhpIGtSR192ID0gTUtfQ1NUXzE2KDI4ODAwLCAwKTsKKyAgY29uc3QgX19tMTI4aSBrR0JfdiA9IE1LX0NTVF8xNigtMjQxMTYsIC00Njg0KTsKKyAgY29uc3QgX19tMTI4aSBrSEFMRl9VViA9IF9tbV9zZXQxX2VwaTMyKCgoMTI4IDw8IFlVVl9GSVgpICsgWVVWX0hBTEYpIDw8IDIpOworCisgIGNvbnN0IF9fbTEyOGkgUkdfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBSR19oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIEdCX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpHLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgR0JfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKkcsICpCKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfdSwga0dCX3UsCisgICAgICAgICAgICBrSEFMRl9VViwgWVVWX0ZJWCArIDIsICpVKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfdiwga0dCX3YsCisgICAgICAgICAgICBrSEFMRl9VViwgWVVWX0ZJWCArIDIsICpWKTsKK30KKworI3VuZGVmIE1LX0NTVF8xNgorI3VuZGVmIFRSQU5TRk9STQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMjRUb1lfU1NFNDEoY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgcmdiICs9IDMgKiAxNiAqIDIpIHsKKyAgICBfX20xMjhpIHJnYl9wbGFuZVs2XTsKKyAgICBpbnQgajsKKworICAgIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFNDEocmdiLCByZ2JfcGxhbmUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraiwgaSArPSAxNikgeworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIF9fbTEyOGkgciwgZywgYiwgWTAsIFkxOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgYiA9IF9tbV91bnBhY2tsb19lcGk4KHJnYl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmciwgJmcsICZiLCAmWTApOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgciA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgYiA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmciwgJmcsICZiLCAmWTEpOworCisgICAgICAvLyBDYXN0IHRvIDgtYml0IGFuZCBzdG9yZS4KKyAgICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICAgIH0KKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIHJnYiArPSAzKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUjI0VG9ZX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGJnciArPSAzICogMTYgKiAyKSB7CisgICAgX19tMTI4aSBiZ3JfcGxhbmVbNl07CisgICAgaW50IGo7CisKKyAgICBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTQxKGJnciwgYmdyX3BsYW5lKTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2osIGkgKz0gMTYpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICBfX20xMjhpIHIsIGcsIGIsIFkwLCBZMTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIGIgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnIsICZnLCAmYiwgJlkwKTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIGIgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIHIgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnIsICZnLCAmYiwgJlkxKTsKKworICAgICAgLy8gQ2FzdCB0byA4LWJpdCBhbmQgc3RvcmUuCisgICAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCBiZ3IgKz0gMykgeyAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShiZ3JbMl0sIGJnclsxXSwgYmdyWzBdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1lfU1NFNDEoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MTU7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBpICs9IDE2KSB7CisgICAgX19tMTI4aSBZMCwgWTEsIHJnYls2XTsKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTQxKCZhcmdiW2ldLCByZ2IpOworICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlkwKTsKKyAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyZ2JbMV0sICZyZ2JbM10sICZyZ2JbNV0sICZZMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgY29uc3QgdWludDMyX3QgcCA9IGFyZ2JbaV07CisgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+ICAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICBZVVZfSEFMRik7CisgIH0KK30KKworLy8gSG9yaXpvbnRhbCBhZGQgKGRvdWJsZWQpIG9mIHR3byAxNmIgdmFsdWVzLCByZXN1bHQgaXMgMTZiLgorLy8gaW46IEEgfCBCIHwgQyB8IEQgfCAuLi4gLT4gb3V0OiAyKihBK0IpIHwgMiooQytEKSB8IC4uLgorc3RhdGljIHZvaWQgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KDIpOworICBjb25zdCBfX20xMjhpIEMgPSBfbW1fbWFkZF9lcGkxNigqQSwgazIpOworICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbWFkZF9lcGkxNigqQiwgazIpOworICAqb3V0ID0gX21tX3BhY2tzX2VwaTMyKEMsIEQpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvVVZfU1NFNDEoY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHNyY193aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMzIsIHUgKz0gMTYsIHYgKz0gMTYpIHsKKyAgICBfX20xMjhpIHJnYls2XSwgVTAsIFYwLCBVMSwgVjE7CisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0U0MSgmYXJnYltpXSwgcmdiKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzBdLCAmcmdiWzFdLCAmcmdiWzBdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzJdLCAmcmdiWzNdLCAmcmdiWzJdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzRdLCAmcmdiWzVdLCAmcmdiWzRdKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0U0MSgmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmVTAsICZWMCk7CisKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTQxKCZhcmdiW2kgKyAxNl0sIHJnYik7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYlswXSwgJnJnYlsxXSwgJnJnYlswXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYlsyXSwgJnJnYlszXSwgJnJnYlsyXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYls0XSwgJnJnYls1XSwgJnJnYls0XSk7CisgICAgQ29udmVydFJHQlRvVVZfU1NFNDEoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlUxLCAmVjEpOworCisgICAgVTAgPSBfbW1fcGFja3VzX2VwaTE2KFUwLCBVMSk7CisgICAgVjAgPSBfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSk7CisgICAgaWYgKCFkb19zdG9yZSkgeworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3UgPSBMT0FEXzE2KHUpOworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3YgPSBMT0FEXzE2KHYpOworICAgICAgVTAgPSBfbW1fYXZnX2VwdTgoVTAsIHByZXZfdSk7CisgICAgICBWMCA9IF9tbV9hdmdfZXB1OChWMCwgcHJldl92KTsKKyAgICB9CisgICAgU1RPUkVfMTYoVTAsIHUpOworICAgIFNUT1JFXzE2KFYwLCB2KTsKKyAgfQorICBpZiAoaSA8IHNyY193aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGFyZ2IgKyBpLCB1LCB2LCBzcmNfd2lkdGggLSBpLCBkb19zdG9yZSk7CisgIH0KK30KKworLy8gQ29udmVydCAxNiBwYWNrZWQgQVJHQiAxNmItdmFsdWVzIHRvIHJbXSwgZ1tdLCBiW10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0U0MSgKKyAgICBjb25zdCB1aW50MTZfdCogY29uc3QgcmdieCwKKyAgICBfX20xMjhpKiBjb25zdCByLCBfX20xMjhpKiBjb25zdCBnLCBfX20xMjhpKiBjb25zdCBiKSB7CisgIGNvbnN0IF9fbTEyOGkgaW4wID0gTE9BRF8xNihyZ2J4ICsgIDApOyAgLy8gcjAgfCBnMCB8IGIwIHx4fCByMSB8IGcxIHwgYjEgfHgKKyAgY29uc3QgX19tMTI4aSBpbjEgPSBMT0FEXzE2KHJnYnggKyAgOCk7ICAvLyByMiB8IGcyIHwgYjIgfHh8IHIzIHwgZzMgfCBiMyB8eAorICBjb25zdCBfX20xMjhpIGluMiA9IExPQURfMTYocmdieCArIDE2KTsgIC8vIHI0IHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgaW4zID0gTE9BRF8xNihyZ2J4ICsgMjQpOyAgLy8gcjYgfCAuLi4KKyAgLy8gYWFycmdnYmIgYXMgMTYtYml0LgorICBjb25zdCBfX20xMjhpIHNodWZmMCA9CisgICAgICBfbW1fc2V0X2VwaTgoLTEsIC0xLCAtMSwgLTEsIDEzLCAxMiwgNSwgNCwgMTEsIDEwLCAzLCAyLCA5LCA4LCAxLCAwKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmZjEgPQorICAgICAgX21tX3NldF9lcGk4KDEzLCAxMiwgNSwgNCwgLTEsIC0xLCAtMSwgLTEsIDExLCAxMCwgMywgMiwgOSwgOCwgMSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMCwgc2h1ZmYwKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zaHVmZmxlX2VwaTgoaW4xLCBzaHVmZjEpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3NodWZmbGVfZXBpOChpbjIsIHNodWZmMCk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMywgc2h1ZmYxKTsKKyAgLy8gUjBSMUcwRzEKKyAgLy8gQjBCMSoqKioKKyAgLy8gUjJSM0cyRzMKKyAgLy8gQjJCMyoqKioKKyAgLy8gKE9SIGlzIHVzZWQgdG8gZnJlZSBwb3J0IDUgZm9yIHRoZSB1bnBhY2spCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9vcl9zaTEyOChBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX3VucGFja2xvX2VwaTMyKEEyLCBBMyk7CisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fb3Jfc2kxMjgoQTIsIEEzKTsKKyAgLy8gR2F0aGVyIHRoZSBjaGFubmVscy4KKyAgKnIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjAsIEIyKTsKKyAgKmcgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjAsIEIyKTsKKyAgKmIgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjEsIEIzKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydFJHQkEzMlRvVVZfU1NFNDEoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MTU7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBsYXN0X3JnYiA9IHJnYiArIDQgKiBtYXhfd2lkdGg7CisgIHdoaWxlIChyZ2IgPCBsYXN0X3JnYikgeworICAgIF9fbTEyOGkgciwgZywgYiwgVTAsIFYwLCBVMSwgVjE7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTQxKHJnYiArICAwLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0U0MSgmciwgJmcsICZiLCAmVTAsICZWMCk7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTQxKHJnYiArIDMyLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0U0MSgmciwgJmcsICZiLCAmVTEsICZWMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihVMCwgVTEpLCB1KTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSksIHYpOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgICByZ2IgKz0gMiAqIDMyOworICB9CisgIGlmIChtYXhfd2lkdGggPCB3aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRSR0JBMzJUb1VWX0MocmdiLCB1LCB2LCB3aWR0aCAtIG1heF93aWR0aCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0U0MSh2b2lkKSB7CisgIFdlYlBDb252ZXJ0QVJHQlRvWSA9IENvbnZlcnRBUkdCVG9ZX1NTRTQxOworICBXZWJQQ29udmVydEFSR0JUb1VWID0gQ29udmVydEFSR0JUb1VWX1NTRTQxOworCisgIFdlYlBDb252ZXJ0UkdCMjRUb1kgPSBDb252ZXJ0UkdCMjRUb1lfU1NFNDE7CisgIFdlYlBDb252ZXJ0QkdSMjRUb1kgPSBDb252ZXJ0QkdSMjRUb1lfU1NFNDE7CisKKyAgV2ViUENvbnZlcnRSR0JBMzJUb1VWID0gQ29udmVydFJHQkEzMlRvVVZfU1NFNDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFNDEKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2FtcGxlcnNTU0U0MSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkNTIyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwZW5jb2RlLmxhCisKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gYWxwaGFfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBhbmFseXNpc19lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGJhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gY29uZmlnX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gY29zdF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGNvc3RfZW5jLmgKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBmaWx0ZXJfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBmcmFtZV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGhpc3RvZ3JhbV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGhpc3RvZ3JhbV9lbmMuaAorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGl0ZXJhdG9yX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gbmVhcl9sb3NzbGVzc19lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHBpY3R1cmVfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwaWN0dXJlX2NzcF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHBpY3R1cmVfcHNucl9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHBpY3R1cmVfcmVzY2FsZV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHBpY3R1cmVfdG9vbHNfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwcmVkaWN0b3JfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBxdWFudF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHN5bnRheF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHRva2VuX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gdHJlZV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHZwOGlfZW5jLmgKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB2cDhsX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gdnA4bGlfZW5jLmgKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB3ZWJwX2VuYy5jCisKK2xpYndlYnBlbmNvZGVpbmNsdWRlX0hFQURFUlMgPQorbGlid2VicGVuY29kZWluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL2VuY29kZS5oCitsaWJ3ZWJwZW5jb2RlaW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvdHlwZXMuaAorbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicGVuY29kZV9sYV9MREZMQUdTID0gLWxtCitsaWJ3ZWJwZW5jb2RlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK2xpYndlYnBlbmNvZGVpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FscGhhX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbHBoYV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U5Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbHBoYV9lbmMuYwpAQCAtMCwwICsxLDQ0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFscGhhLXBsYW5lIGNvbXByZXNzaW9uLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9maWx0ZXJzX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kZXMgdGhlIGdpdmVuIGFscGhhIGRhdGEgdmlhIHNwZWNpZmllZCBjb21wcmVzc2lvbiBtZXRob2QgJ21ldGhvZCcuCisvLyBUaGUgcHJlLXByb2Nlc3NpbmcgKHF1YW50aXphdGlvbikgaXMgcGVyZm9ybWVkIGlmICdxdWFsaXR5JyBpcyBsZXNzIHRoYW4gMTAwLgorLy8gRm9yIHN1Y2ggY2FzZXMsIHRoZSBlbmNvZGluZyBpcyBsb3NzeS4gVGhlIHZhbGlkIHJhbmdlIGlzIFswLCAxMDBdIGZvcgorLy8gJ3F1YWxpdHknIGFuZCBbMCwgMV0gZm9yICdtZXRob2QnOgorLy8gICAnbWV0aG9kID0gMCcgLSBObyBjb21wcmVzc2lvbjsKKy8vICAgJ21ldGhvZCA9IDEnIC0gVXNlIGxvc3NsZXNzIGNvZGVyIG9uIHRoZSBhbHBoYSBwbGFuZSBvbmx5CisvLyAnZmlsdGVyJyB2YWx1ZXMgWzAsIDRdIGNvcnJlc3BvbmQgdG8gcHJlZGljdGlvbiBtb2RlcyBub25lLCBob3Jpem9udGFsLAorLy8gdmVydGljYWwgJiBncmFkaWVudCBmaWx0ZXJzLiBUaGUgcHJlZGljdGlvbiBtb2RlIDQgd2lsbCB0cnkgYWxsIHRoZQorLy8gcHJlZGljdGlvbiBtb2RlcyAwIHRvIDMgYW5kIHBpY2sgdGhlIGJlc3Qgb25lLgorLy8gJ2VmZm9ydF9sZXZlbCc6IHNwZWNpZmllcyBob3cgbXVjaCBlZmZvcnQgbXVzdCBiZSBzcGVudCB0byB0cnkgYW5kIHJlZHVjZQorLy8gIHRoZSBjb21wcmVzc2VkIG91dHB1dCBzaXplLiBJbiByYW5nZSAwIChxdWljaykgdG8gNiAoc2xvdykuCisvLworLy8gJ291dHB1dCcgY29ycmVzcG9uZHMgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIGNvbXByZXNzZWQgYWxwaGEgZGF0YS4KKy8vICAgICAgICAgIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZCBhbmQgY2FsbGVyIHNob3VsZCBjYWxsCisvLyAgICAgICAgICBXZWJQU2FmZUZyZWUoKm91dHB1dCkgd2hlbiBkb25lLgorLy8gJ291dHB1dF9zaXplJyBjb3JyZXNwb25kcyB0byBzaXplIG9mIHRoaXMgY29tcHJlc3NlZCBhbHBoYSBidWZmZXIuCisvLworLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3NmdWxseSBlbmNvZGluZyB0aGUgYWxwaGEgYW5kCisvLyAgICAgICAgIDAgaWYgZWl0aGVyOgorLy8gICAgICAgICAgIGludmFsaWQgcXVhbGl0eSBvciBtZXRob2QsIG9yCisvLyAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgZmFpbHMuCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorCitzdGF0aWMgaW50IEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwgIC8vIGluIFswLi42XSByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX3F1YWxpdHlfMTAwLCBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgb2sgPSAwOworICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgV2ViUFBpY3R1cmUgcGljdHVyZTsKKworICBXZWJQUGljdHVyZUluaXQoJnBpY3R1cmUpOworICBwaWN0dXJlLndpZHRoID0gd2lkdGg7CisgIHBpY3R1cmUuaGVpZ2h0ID0gaGVpZ2h0OworICBwaWN0dXJlLnVzZV9hcmdiID0gMTsKKyAgcGljdHVyZS5zdGF0cyA9IHN0YXRzOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJnBpY3R1cmUpKSByZXR1cm4gMDsKKworICAvLyBUcmFuc2ZlciB0aGUgYWxwaGEgdmFsdWVzIHRvIHRoZSBncmVlbiBjaGFubmVsLgorICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4oZGF0YSwgd2lkdGgsIHBpY3R1cmUud2lkdGgsIHBpY3R1cmUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS5hcmdiLCBwaWN0dXJlLmFyZ2Jfc3RyaWRlKTsKKworICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKyAgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgLy8gRW5hYmxlIGV4YWN0LCBvciBpdCB3b3VsZCBhbHRlciBSR0IgdmFsdWVzIG9mIHRyYW5zcGFyZW50IGFscGhhLCB3aGljaCBpcworICAvLyBub3JtYWxseSBPSyBidXQgbm90IGhlcmUgc2luY2Ugd2UgYXJlIG5vdCBlbmNvZGluZyB0aGUgaW5wdXQgaW1hZ2UgYnV0ICBhbgorICAvLyBpbnRlcm5hbCBlbmNvZGluZy1yZWxhdGVkIGltYWdlIGNvbnRhaW5pbmcgbmVjZXNzYXJ5IGV4YWN0IGluZm9ybWF0aW9uIGluCisgIC8vIFJHQiBjaGFubmVscy4KKyAgY29uZmlnLmV4YWN0ID0gMTsKKyAgY29uZmlnLm1ldGhvZCA9IGVmZm9ydF9sZXZlbDsgIC8vIGltcGFjdCBpcyB2ZXJ5IHNtYWxsCisgIC8vIFNldCBhIGxvdyBkZWZhdWx0IHF1YWxpdHkgZm9yIGVuY29kaW5nIGFscGhhLiBFbnN1cmUgdGhhdCBBbHBoYSBxdWFsaXR5IGF0CisgIC8vIGxvd2VyIG1ldGhvZHMgKDMgYW5kIGJlbG93KSBpcyBsZXNzIHRoYW4gdGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZworICAvLyBjb3N0bHkgJ0JhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzJy4KKyAgLy8gSWYgdGhlIGFscGhhIHF1YWxpdHkgaXMgc2V0IHRvIDEwMCBhbmQgdGhlIG1ldGhvZCB0byA2LCBhbGxvdyBmb3IgYSBoaWdoCisgIC8vIGxvc3NsZXNzIHF1YWxpdHkgdG8gdHJpZ2dlciB0aGUgY3J1bmNoZXIuCisgIGNvbmZpZy5xdWFsaXR5ID0KKyAgICAgICh1c2VfcXVhbGl0eV8xMDAgJiYgZWZmb3J0X2xldmVsID09IDYpID8gMTAwIDogOC5mICogZWZmb3J0X2xldmVsOworICBhc3NlcnQoY29uZmlnLnF1YWxpdHkgPj0gMCAmJiBjb25maWcucXVhbGl0eSA8PSAxMDAuZik7CisKKyAgLy8gVE9ETyh1cnZhbmcpOiBUZW1wb3JhcnkgZml4IHRvIGF2b2lkIGdlbmVyYXRpbmcgaW1hZ2VzIHRoYXQgdHJpZ2dlcgorICAvLyBhIGRlY29kZXIgYnVnIHJlbGF0ZWQgdG8gYWxwaGEgd2l0aCBjb2xvciBjYWNoZS4KKyAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYnAvaXNzdWVzL2RldGFpbD9pZD0yMzkKKyAgLy8gTmVlZCB0byByZS1lbmFibGUgdGhpcyBsYXRlci4KKyAgb2sgPSAoVlA4TEVuY29kZVN0cmVhbSgmY29uZmlnLCAmcGljdHVyZSwgYncsIDAgLyp1c2VfY2FjaGUqLykgPT0gVlA4X0VOQ19PSyk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljdHVyZSk7CisgIG9rID0gb2sgJiYgIWJ3LT5lcnJvcl87CisgIGlmICghb2spIHsKKyAgICBWUDhMQml0V3JpdGVyV2lwZU91dChidyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNtYWxsIHN0cnVjdCB0byBob2xkIHRoZSByZXN1bHQgb2YgYSBmaWx0ZXIgbW9kZSBjb21wcmVzc2lvbiBhdHRlbXB0LgordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3Qgc2NvcmU7CisgIFZQOEJpdFdyaXRlciBidzsKKyAgV2ViUEF1eFN0YXRzIHN0YXRzOworfSBGaWx0ZXJUcmlhbDsKKworLy8gVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBpbml0aWFsaXplZCAnYncnIG9iamVjdCwgZXZlbiB1cG9uIGVycm9yLgorc3RhdGljIGludCBFbmNvZGVBbHBoYUludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLCBpbnQgZmlsdGVyLCBpbnQgcmVkdWNlX2xldmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLCAgLy8gaW4gWzAuLjZdIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgdG1wX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclRyaWFsKiByZXN1bHQpIHsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgdWludDhfdCogYWxwaGFfc3JjOworICBXZWJQRmlsdGVyRnVuYyBmaWx0ZXJfZnVuYzsKKyAgdWludDhfdCBoZWFkZXI7CisgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgY29uc3QgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgc2l6ZV90IG91dHB1dF9zaXplID0gMDsKKyAgVlA4TEJpdFdyaXRlciB0bXBfYnc7CisKKyAgYXNzZXJ0KCh1aW50NjRfdClkYXRhX3NpemUgPT0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KTsgIC8vIGFzIHBlciBzcGVjCisgIGFzc2VydChmaWx0ZXIgPj0gMCAmJiBmaWx0ZXIgPCBXRUJQX0ZJTFRFUl9MQVNUKTsKKyAgYXNzZXJ0KG1ldGhvZCA+PSBBTFBIQV9OT19DT01QUkVTU0lPTik7CisgIGFzc2VydChtZXRob2QgPD0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pOworICBhc3NlcnQoc2l6ZW9mKGhlYWRlcikgPT0gQUxQSEFfSEVBREVSX0xFTik7CisKKyAgZmlsdGVyX2Z1bmMgPSBXZWJQRmlsdGVyc1tmaWx0ZXJdOworICBpZiAoZmlsdGVyX2Z1bmMgIT0gTlVMTCkgeworICAgIGZpbHRlcl9mdW5jKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCB0bXBfYWxwaGEpOworICAgIGFscGhhX3NyYyA9IHRtcF9hbHBoYTsKKyAgfSAgZWxzZSB7CisgICAgYWxwaGFfc3JjID0gZGF0YTsKKyAgfQorCisgIGlmIChtZXRob2QgIT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICBvayA9IFZQOExCaXRXcml0ZXJJbml0KCZ0bXBfYncsIGRhdGFfc2l6ZSA+PiAzKTsKKyAgICBvayA9IG9rICYmIEVuY29kZUxvc3NsZXNzKGFscGhhX3NyYywgd2lkdGgsIGhlaWdodCwgZWZmb3J0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlZHVjZV9sZXZlbHMsICZ0bXBfYncsICZyZXN1bHQtPnN0YXRzKTsKKyAgICBpZiAob2spIHsKKyAgICAgIG91dHB1dCA9IFZQOExCaXRXcml0ZXJGaW5pc2goJnRtcF9idyk7CisgICAgICBvdXRwdXRfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcygmdG1wX2J3KTsKKyAgICAgIGlmIChvdXRwdXRfc2l6ZSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAvLyBjb21wcmVzc2VkIHNpemUgaXMgbGFyZ2VyIHRoYW4gc291cmNlISBSZXZlcnQgdG8gdW5jb21wcmVzc2VkIG1vZGUuCisgICAgICAgIG1ldGhvZCA9IEFMUEhBX05PX0NPTVBSRVNTSU9OOworICAgICAgICBWUDhMQml0V3JpdGVyV2lwZU91dCgmdG1wX2J3KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAobWV0aG9kID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgb3V0cHV0ID0gYWxwaGFfc3JjOworICAgIG91dHB1dF9zaXplID0gZGF0YV9zaXplOworICAgIG9rID0gMTsKKyAgfQorCisgIC8vIEVtaXQgZmluYWwgcmVzdWx0LgorICBoZWFkZXIgPSBtZXRob2QgfCAoZmlsdGVyIDw8IDIpOworICBpZiAocmVkdWNlX2xldmVscykgaGVhZGVyIHw9IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMgPDwgNDsKKworICBWUDhCaXRXcml0ZXJJbml0KCZyZXN1bHQtPmJ3LCBBTFBIQV9IRUFERVJfTEVOICsgb3V0cHV0X3NpemUpOworICBvayA9IG9rICYmIFZQOEJpdFdyaXRlckFwcGVuZCgmcmVzdWx0LT5idywgJmhlYWRlciwgQUxQSEFfSEVBREVSX0xFTik7CisgIG9rID0gb2sgJiYgVlA4Qml0V3JpdGVyQXBwZW5kKCZyZXN1bHQtPmJ3LCBvdXRwdXQsIG91dHB1dF9zaXplKTsKKworICBpZiAobWV0aG9kICE9IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7CisgIH0KKyAgb2sgPSBvayAmJiAhcmVzdWx0LT5idy5lcnJvcl87CisgIHJlc3VsdC0+c2NvcmUgPSBWUDhCaXRXcml0ZXJTaXplKCZyZXN1bHQtPmJ3KTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEdldE51bUNvbG9ycyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIGludCBqOworICBpbnQgY29sb3JzID0gMDsKKyAgdWludDhfdCBjb2xvclsyNTZdID0geyAwIH07CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IGRhdGEgKyBqICogc3RyaWRlOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb2xvcltwW2ldXSA9IDE7CisgICAgfQorICB9CisgIGZvciAoaiA9IDA7IGogPCAyNTY7ICsraikgeworICAgIGlmIChjb2xvcltqXSA+IDApICsrY29sb3JzOworICB9CisgIHJldHVybiBjb2xvcnM7Cit9CisKKyNkZWZpbmUgRklMVEVSX1RSWV9OT05FICgxIDw8IFdFQlBfRklMVEVSX05PTkUpCisjZGVmaW5lIEZJTFRFUl9UUllfQUxMICgoMSA8PCBXRUJQX0ZJTFRFUl9MQVNUKSAtIDEpCisKKy8vIEdpdmVuIHRoZSBpbnB1dCAnZmlsdGVyJyBvcHRpb24sIHJldHVybiBhbiBPUidkIGJpdC1zZXQgb2YgZmlsdGVycyB0byB0cnkuCitzdGF0aWMgdWludDMyX3QgR2V0RmlsdGVyTWFwKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXIsIGludCBlZmZvcnRfbGV2ZWwpIHsKKyAgdWludDMyX3QgYml0X21hcCA9IDBVOworICBpZiAoZmlsdGVyID09IFdFQlBfRklMVEVSX0ZBU1QpIHsKKyAgICAvLyBRdWljayBlc3RpbWF0ZSBvZiB0aGUgYmVzdCBjYW5kaWRhdGUuCisgICAgaW50IHRyeV9maWx0ZXJfbm9uZSA9IChlZmZvcnRfbGV2ZWwgPiAzKTsKKyAgICBjb25zdCBpbnQga01pbkNvbG9yc0ZvckZpbHRlck5vbmUgPSAxNjsKKyAgICBjb25zdCBpbnQga01heENvbG9yc0ZvckZpbHRlck5vbmUgPSAxOTI7CisgICAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBHZXROdW1Db2xvcnMoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKKyAgICAvLyBGb3IgbG93IG51bWJlciBvZiBjb2xvcnMsIE5PTkUgeWllbGRzIGJldHRlciBjb21wcmVzc2lvbi4KKyAgICBmaWx0ZXIgPSAobnVtX2NvbG9ycyA8PSBrTWluQ29sb3JzRm9yRmlsdGVyTm9uZSkKKyAgICAgICAgPyBXRUJQX0ZJTFRFUl9OT05FCisgICAgICAgIDogV2ViUEVzdGltYXRlQmVzdEZpbHRlcihhbHBoYSwgd2lkdGgsIGhlaWdodCwgd2lkdGgpOworICAgIGJpdF9tYXAgfD0gMSA8PCBmaWx0ZXI7CisgICAgLy8gRm9yIGxhcmdlIG51bWJlciBvZiBjb2xvcnMsIHRyeSBGSUxURVJfTk9ORSBpbiBhZGRpdGlvbiB0byB0aGUgYmVzdAorICAgIC8vIGZpbHRlciBhcyB3ZWxsLgorICAgIGlmICh0cnlfZmlsdGVyX25vbmUgfHwgbnVtX2NvbG9ycyA+IGtNYXhDb2xvcnNGb3JGaWx0ZXJOb25lKSB7CisgICAgICBiaXRfbWFwIHw9IEZJTFRFUl9UUllfTk9ORTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZmlsdGVyID09IFdFQlBfRklMVEVSX05PTkUpIHsKKyAgICBiaXRfbWFwID0gRklMVEVSX1RSWV9OT05FOworICB9IGVsc2UgeyAgLy8gV0VCUF9GSUxURVJfQkVTVCAtPiB0cnkgYWxsCisgICAgYml0X21hcCA9IEZJTFRFUl9UUllfQUxMOworICB9CisgIHJldHVybiBiaXRfbWFwOworfQorCitzdGF0aWMgdm9pZCBJbml0RmlsdGVyVHJpYWwoRmlsdGVyVHJpYWwqIGNvbnN0IHNjb3JlKSB7CisgIHNjb3JlLT5zY29yZSA9IChzaXplX3QpfjBVOworICBWUDhCaXRXcml0ZXJJbml0KCZzY29yZS0+YncsIDApOworfQorCitzdGF0aWMgaW50IEFwcGx5RmlsdGVyc0FuZEVuY29kZShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgaW50IG1ldGhvZCwgaW50IGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWR1Y2VfbGV2ZWxzLCBpbnQgZWZmb3J0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGNvbnN0IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3Qgb3V0cHV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzKSB7CisgIGludCBvayA9IDE7CisgIEZpbHRlclRyaWFsIGJlc3Q7CisgIHVpbnQzMl90IHRyeV9tYXAgPQorICAgICAgR2V0RmlsdGVyTWFwKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXIsIGVmZm9ydF9sZXZlbCk7CisgIEluaXRGaWx0ZXJUcmlhbCgmYmVzdCk7CisKKyAgaWYgKHRyeV9tYXAgIT0gRklMVEVSX1RSWV9OT05FKSB7CisgICAgdWludDhfdCogZmlsdGVyZWRfYWxwaGEgPSAgKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIGRhdGFfc2l6ZSk7CisgICAgaWYgKGZpbHRlcmVkX2FscGhhID09IE5VTEwpIHJldHVybiAwOworCisgICAgZm9yIChmaWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOyBvayAmJiB0cnlfbWFwOyArK2ZpbHRlciwgdHJ5X21hcCA+Pj0gMSkgeworICAgICAgaWYgKHRyeV9tYXAgJiAxKSB7CisgICAgICAgIEZpbHRlclRyaWFsIHRyaWFsOworICAgICAgICBvayA9IEVuY29kZUFscGhhSW50ZXJuYWwoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIG1ldGhvZCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlX2xldmVscywgZWZmb3J0X2xldmVsLCBmaWx0ZXJlZF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmlhbCk7CisgICAgICAgIGlmIChvayAmJiB0cmlhbC5zY29yZSA8IGJlc3Quc2NvcmUpIHsKKyAgICAgICAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KCZiZXN0LmJ3KTsKKyAgICAgICAgICBiZXN0ID0gdHJpYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmdHJpYWwuYncpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShmaWx0ZXJlZF9hbHBoYSk7CisgIH0gZWxzZSB7CisgICAgb2sgPSBFbmNvZGVBbHBoYUludGVybmFsKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCBtZXRob2QsIFdFQlBfRklMVEVSX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZV9sZXZlbHMsIGVmZm9ydF9sZXZlbCwgTlVMTCwgJmJlc3QpOworICB9CisgIGlmIChvaykgeworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgICBpZiAoc3RhdHMgIT0gTlVMTCkgeworICAgICAgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzID0gYmVzdC5zdGF0cy5sb3NzbGVzc19mZWF0dXJlczsKKyAgICAgIHN0YXRzLT5oaXN0b2dyYW1fYml0cyA9IGJlc3Quc3RhdHMuaGlzdG9ncmFtX2JpdHM7CisgICAgICBzdGF0cy0+dHJhbnNmb3JtX2JpdHMgPSBiZXN0LnN0YXRzLnRyYW5zZm9ybV9iaXRzOworICAgICAgc3RhdHMtPmNhY2hlX2JpdHMgPSBiZXN0LnN0YXRzLmNhY2hlX2JpdHM7CisgICAgICBzdGF0cy0+cGFsZXR0ZV9zaXplID0gYmVzdC5zdGF0cy5wYWxldHRlX3NpemU7CisgICAgICBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IGJlc3Quc3RhdHMubG9zc2xlc3Nfc2l6ZTsKKyAgICAgIHN0YXRzLT5sb3NzbGVzc19oZHJfc2l6ZSA9IGJlc3Quc3RhdHMubG9zc2xlc3NfaGRyX3NpemU7CisgICAgICBzdGF0cy0+bG9zc2xlc3NfZGF0YV9zaXplID0gYmVzdC5zdGF0cy5sb3NzbGVzc19kYXRhX3NpemU7CisgICAgfQorI2Vsc2UKKyAgICAodm9pZClzdGF0czsKKyNlbmRpZgorICAgICpvdXRwdXRfc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoJmJlc3QuYncpOworICAgICpvdXRwdXQgPSBWUDhCaXRXcml0ZXJCdWYoJmJlc3QuYncpOworICB9IGVsc2UgeworICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJlc3QuYncpOworICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBFbmNvZGVBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbWV0aG9kLCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogY29uc3Qgb3V0cHV0LCBzaXplX3QqIGNvbnN0IG91dHB1dF9zaXplKSB7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKworICB1aW50OF90KiBxdWFudF9hbHBoYSA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgdWludDY0X3Qgc3NlID0gMDsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgaW50IHJlZHVjZV9sZXZlbHMgPSAocXVhbGl0eSA8IDEwMCk7CisKKyAgLy8gcXVpY2sgc2FuaXR5IGNoZWNrcworICBhc3NlcnQoKHVpbnQ2NF90KWRhdGFfc2l6ZSA9PSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpOyAgLy8gYXMgcGVyIHNwZWMKKyAgYXNzZXJ0KGVuYyAhPSBOVUxMICYmIHBpYyAhPSBOVUxMICYmIHBpYy0+YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KG91dHB1dCAhPSBOVUxMICYmIG91dHB1dF9zaXplICE9IE5VTEwpOworICBhc3NlcnQod2lkdGggPiAwICYmIGhlaWdodCA+IDApOworICBhc3NlcnQocGljLT5hX3N0cmlkZSA+PSB3aWR0aCk7CisgIGFzc2VydChmaWx0ZXIgPj0gV0VCUF9GSUxURVJfTk9ORSAmJiBmaWx0ZXIgPD0gV0VCUF9GSUxURVJfRkFTVCk7CisKKyAgaWYgKHF1YWxpdHkgPCAwIHx8IHF1YWxpdHkgPiAxMDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZXRob2QgPCBBTFBIQV9OT19DT01QUkVTU0lPTiB8fCBtZXRob2QgPiBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTikgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIC8vIERvbid0IGZpbHRlciwgYXMgZmlsdGVyaW5nIHdpbGwgbWFrZSBubyBpbXBhY3Qgb24gY29tcHJlc3NlZCBzaXplLgorICAgIGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7CisgIH0KKworICBxdWFudF9hbHBoYSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBkYXRhX3NpemUpOworICBpZiAocXVhbnRfYWxwaGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRXh0cmFjdCBhbHBoYSBkYXRhICh3aWR0aCB4IGhlaWdodCkgZnJvbSByYXdfZGF0YSAoc3RyaWRlIHggaGVpZ2h0KS4KKyAgV2ViUENvcHlQbGFuZShwaWMtPmEsIHBpYy0+YV9zdHJpZGUsIHF1YW50X2FscGhhLCB3aWR0aCwgd2lkdGgsIGhlaWdodCk7CisKKyAgaWYgKHJlZHVjZV9sZXZlbHMpIHsgIC8vIE5vIFF1YW50aXphdGlvbiByZXF1aXJlZCBmb3IgJ3F1YWxpdHkgPSAxMDAnLgorICAgIC8vIDE2IGFscGhhIGxldmVscyBnaXZlcyBxdWl0ZSBhIGxvdyBNU0Ugdy5yLnQgb3JpZ2luYWwgYWxwaGEgcGxhbmUgaGVuY2UKKyAgICAvLyBtYXBwZWQgdG8gbW9kZXJhdGUgcXVhbGl0eSA3MC4gSGVuY2UgUXVhbGl0eTpbMCwgNzBdIC0+IExldmVsczpbMiwgMTZdCisgICAgLy8gYW5kIFF1YWxpdHk6XTcwLCAxMDBdIC0+IExldmVsczpdMTYsIDI1Nl0uCisgICAgY29uc3QgaW50IGFscGhhX2xldmVscyA9IChxdWFsaXR5IDw9IDcwKSA/ICgyICsgcXVhbGl0eSAvIDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgxNiArIChxdWFsaXR5IC0gNzApICogOCk7CisgICAgb2sgPSBRdWFudGl6ZUxldmVscyhxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwgYWxwaGFfbGV2ZWxzLCAmc3NlKTsKKyAgfQorCisgIGlmIChvaykgeworICAgIFZQOEZpbHRlcnNJbml0KCk7CisgICAgb2sgPSBBcHBseUZpbHRlcnNBbmRFbmNvZGUocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIGRhdGFfc2l6ZSwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVkdWNlX2xldmVscywgZWZmb3J0X2xldmVsLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NpemUsIHBpYy0+c3RhdHMpOworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7ICAvLyBuZWVkIHN0YXRzPworICAgICAgcGljLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KSgqb3V0cHV0X3NpemUpOworICAgICAgZW5jLT5zc2VfWzNdID0gc3NlOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgV2ViUFNhZmVGcmVlKHF1YW50X2FscGhhKTsKKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxscworCitzdGF0aWMgaW50IENvbXByZXNzQWxwaGFKb2Iodm9pZCogYXJnMSwgdm9pZCogZHVtbXkpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gKFZQOEVuY29kZXIqKWFyZzE7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKKyAgdWludDhfdCogYWxwaGFfZGF0YSA9IE5VTEw7CisgIHNpemVfdCBhbHBoYV9zaXplID0gMDsKKyAgY29uc3QgaW50IGVmZm9ydF9sZXZlbCA9IGNvbmZpZy0+bWV0aG9kOyAgLy8gbWFwcyB0byBbMC4uNl0KKyAgY29uc3QgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXIgPQorICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDApID8gV0VCUF9GSUxURVJfTk9ORSA6CisgICAgICAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPT0gMSkgPyBXRUJQX0ZJTFRFUl9GQVNUIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRklMVEVSX0JFU1Q7CisgIGlmICghRW5jb2RlQWxwaGEoZW5jLCBjb25maWctPmFscGhhX3F1YWxpdHksIGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBlZmZvcnRfbGV2ZWwsICZhbHBoYV9kYXRhLCAmYWxwaGFfc2l6ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYWxwaGFfc2l6ZSAhPSAodWludDMyX3QpYWxwaGFfc2l6ZSkgeyAgLy8gU2FuaXR5IGNoZWNrLgorICAgIFdlYlBTYWZlRnJlZShhbHBoYV9kYXRhKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAodWludDMyX3QpYWxwaGFfc2l6ZTsKKyAgZW5jLT5hbHBoYV9kYXRhXyA9IGFscGhhX2RhdGE7CisgICh2b2lkKWR1bW15OworICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhFbmNJbml0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgIGVuYy0+aGFzX2FscGhhXyA9IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KGVuYy0+cGljXyk7CisgIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOworICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOworICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5Jbml0KHdvcmtlcik7CisgICAgd29ya2VyLT5kYXRhMSA9IGVuYzsKKyAgICB3b3JrZXItPmRhdGEyID0gTlVMTDsKKyAgICB3b3JrZXItPmhvb2sgPSBDb21wcmVzc0FscGhhSm9iOworICB9Cit9CisKK2ludCBWUDhFbmNTdGFydEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7CisgICAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgICAvLyBNYWtlcyBzdXJlIHdvcmtlciBpcyBnb29kIHRvIGdvLgorICAgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlJlc2V0KHdvcmtlcikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkxhdW5jaCh3b3JrZXIpOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDb21wcmVzc0FscGhhSm9iKGVuYywgTlVMTCk7ICAgLy8ganVzdCBkbyB0aGUgam9iIHJpZ2h0IGF3YXkKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBWUDhFbmNGaW5pc2hBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaWYgKGVuYy0+aGFzX2FscGhhXykgeworICAgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7CisgICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOworICAgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMod29ya2VyKSkgcmV0dXJuIDA7ICAvLyBlcnJvcgorICAgIH0KKyAgfQorICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Cit9CisKK2ludCBWUDhFbmNEZWxldGVBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IG9rID0gMTsKKyAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOworICAgIC8vIGZpbmlzaCBhbnl0aGluZyBsZWZ0IGluIGZsaWdodAorICAgIG9rID0gV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5TeW5jKHdvcmtlcik7CisgICAgLy8gc3RpbGwgbmVlZCB0byBlbmQgdGhlIHdvcmtlciwgZXZlbiBpZiAhb2sKKyAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkVuZCh3b3JrZXIpOworICB9CisgIFdlYlBTYWZlRnJlZShlbmMtPmFscGhhX2RhdGFfKTsKKyAgZW5jLT5hbHBoYV9kYXRhXyA9IE5VTEw7CisgIGVuYy0+YWxwaGFfZGF0YV9zaXplXyA9IDA7CisgIGVuYy0+aGFzX2FscGhhXyA9IDA7CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbmFseXNpcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbmFseXNpc19lbmMuYwpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYW5hbHlzaXMuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbmFseXNpc19lbmMuYwppbmRleCBmNDM1ODA3Li5hNDdmZjdkIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYW5hbHlzaXMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FuYWx5c2lzX2VuYy5jCkBAIC0xMSwyMiArMTEsMTMgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKIAotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vY29zdC5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCiAKICNkZWZpbmUgTUFYX0lURVJTX0tfTUVBTlMgIDYKIApAQCAtMzksOCArMzAsOCBAQAogICBjb25zdCBpbnQgdyA9IGVuYy0+bWJfd187CiAgIGNvbnN0IGludCBoID0gZW5jLT5tYl9oXzsKICAgY29uc3QgaW50IG1ham9yaXR5X2NudF8zX3hfM19ncmlkID0gNTsKLSAgdWludDhfdCogY29uc3QgdG1wID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCl3ICogaCwgc2l6ZW9mKCp0bXApKTsKLSAgU0JfRENIRUNLKCh1aW50NjRfdCkodyAqIGgpID09ICh1aW50NjRfdCl3ICogaCk7ICAgLy8gbm8gb3ZlcmZsb3csIGFzIHBlciBzcGVjCisgIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh3ICogaCwgc2l6ZW9mKCp0bXApKTsKKyAgYXNzZXJ0KCh1aW50NjRfdCkodyAqIGgpID09ICh1aW50NjRfdCl3ICogaCk7ICAgLy8gbm8gb3ZlcmZsb3csIGFzIHBlciBzcGVjCiAKICAgaWYgKHRtcCA9PSBOVUxMKSByZXR1cm47CiAgIGZvciAoeSA9IDE7IHkgPCBoIC0gMTsgKyt5KSB7CkBAIC02MCw2ICs1MSw3IEBACiAgICAgICBmb3IgKG4gPSAwOyBuIDwgTlVNX01CX1NFR01FTlRTOyArK24pIHsKICAgICAgICAgaWYgKGNudFtuXSA+PSBtYWpvcml0eV9jbnRfM194XzNfZ3JpZCkgewogICAgICAgICAgIG1ham9yaXR5X3NlZyA9IG47CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHRtcFt4ICsgeSAqIHddID0gbWFqb3JpdHlfc2VnOwpAQCAtNzEsNyArNjMsNyBAQAogICAgICAgbWItPnNlZ21lbnRfID0gdG1wW3ggKyB5ICogd107CiAgICAgfQogICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZSh0bXApOworICBXZWJQU2FmZUZyZWUodG1wKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk1LDcgKzg3LDcgQEAKICAgICB9CiAgIH0KICAgaWYgKG1heCA9PSBtaW4pIG1heCA9IG1pbiArIDE7Ci0gIFNCX0RDSEVDSyhtaWQgPD0gbWF4ICYmIG1pZCA+PSBtaW4pOworICBhc3NlcnQobWlkIDw9IG1heCAmJiBtaWQgPj0gbWluKTsKICAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKICAgICBjb25zdCBpbnQgYWxwaGEgPSAyNTUgKiAoY2VudGVyc1tuXSAtIG1pZCkgLyAobWF4IC0gbWluKTsKICAgICBjb25zdCBpbnQgYmV0YSA9IDI1NSAqIChjZW50ZXJzW25dIC0gbWluKSAvIChtYXggLSBtaW4pOwpAQCAtMTE5LDI4ICsxMTEsMjggQEAKIH0KIAogc3RhdGljIGludCBHZXRBbHBoYShjb25zdCBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7Ci0gIGludCBtYXhfdmFsdWUgPSAwLCBsYXN0X25vbl96ZXJvID0gMTsKLSAgaW50IGs7Ci0gIGludCBhbHBoYTsKLSAgZm9yIChrID0gMDsgayA8PSBNQVhfQ09FRkZfVEhSRVNIOyArK2spIHsKLSAgICBjb25zdCBpbnQgdmFsdWUgPSBoaXN0by0+ZGlzdHJpYnV0aW9uW2tdOwotICAgIGlmICh2YWx1ZSA+IDApIHsKLSAgICAgIGlmICh2YWx1ZSA+IG1heF92YWx1ZSkgbWF4X3ZhbHVlID0gdmFsdWU7Ci0gICAgICBsYXN0X25vbl96ZXJvID0gazsKLSAgICB9Ci0gIH0KICAgLy8gJ2FscGhhJyB3aWxsIGxhdGVyIGJlIGNsaXBwZWQgdG8gWzAuLk1BWF9BTFBIQV0gcmFuZ2UsIGNsYW1waW5nIG91dGVyCiAgIC8vIHZhbHVlcyB3aGljaCBoYXBwZW4gdG8gYmUgbW9zdGx5IG5vaXNlLiBUaGlzIGxlYXZlcyB0aGUgbWF4aW11bSBwcmVjaXNpb24KICAgLy8gZm9yIGhhbmRsaW5nIHRoZSB1c2VmdWwgc21hbGwgdmFsdWVzIHdoaWNoIGNvbnRyaWJ1dGUgbW9zdC4KLSAgYWxwaGEgPSAobWF4X3ZhbHVlID4gMSkgPyBBTFBIQV9TQ0FMRSAqIGxhc3Rfbm9uX3plcm8gLyBtYXhfdmFsdWUgOiAwOworICBjb25zdCBpbnQgbWF4X3ZhbHVlID0gaGlzdG8tPm1heF92YWx1ZTsKKyAgY29uc3QgaW50IGxhc3Rfbm9uX3plcm8gPSBoaXN0by0+bGFzdF9ub25femVybzsKKyAgY29uc3QgaW50IGFscGhhID0KKyAgICAgIChtYXhfdmFsdWUgPiAxKSA/IEFMUEhBX1NDQUxFICogbGFzdF9ub25femVybyAvIG1heF92YWx1ZSA6IDA7CiAgIHJldHVybiBhbHBoYTsKIH0KIAorc3RhdGljIHZvaWQgSW5pdEhpc3RvZ3JhbShWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGhpc3RvLT5tYXhfdmFsdWUgPSAwOworICBoaXN0by0+bGFzdF9ub25femVybyA9IDE7Cit9CisKIHN0YXRpYyB2b2lkIE1lcmdlSGlzdG9ncmFtcyhjb25zdCBWUDhIaXN0b2dyYW0qIGNvbnN0IGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9DT0VGRl9USFJFU0g7ICsraSkgewotICAgIG91dC0+ZGlzdHJpYnV0aW9uW2ldICs9IGluLT5kaXN0cmlidXRpb25baV07CisgIGlmIChpbi0+bWF4X3ZhbHVlID4gb3V0LT5tYXhfdmFsdWUpIHsKKyAgICBvdXQtPm1heF92YWx1ZSA9IGluLT5tYXhfdmFsdWU7CisgIH0KKyAgaWYgKGluLT5sYXN0X25vbl96ZXJvID4gb3V0LT5sYXN0X25vbl96ZXJvKSB7CisgICAgb3V0LT5sYXN0X25vbl96ZXJvID0gaW4tPmxhc3Rfbm9uX3plcm87CiAgIH0KIH0KIApAQCAtMTQ5LDcgKzE0MSwxMSBAQAogCiBzdGF0aWMgdm9pZCBBc3NpZ25TZWdtZW50cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWxwaGFzW01BWF9BTFBIQSArIDFdKSB7Ci0gIGNvbnN0IGludCBuYiA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187CisgIC8vICdudW1fc2VnbWVudHNfJyBpcyBwcmV2aW91c2x5IHZhbGlkYXRlZCBhbmQgPD0gTlVNX01CX1NFR01FTlRTLCBidXQgYW4KKyAgLy8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIHNwdXJpb3VzIHdhcm5pbmcgYWJvdXQgJ24gKyAxJyBleGNlZWRpbmcKKyAgLy8gYXJyYXkgYm91bmRzIG9mICdjZW50ZXJzJyB3aXRoIHNvbWUgY29tcGlsZXJzIChub3RpY2VkIHdpdGggZ2NjLTQuOSkuCisgIGNvbnN0IGludCBuYiA9IChlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfIDwgTlVNX01CX1NFR01FTlRTKSA/CisgICAgICAgICAgICAgICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gOiBOVU1fTUJfU0VHTUVOVFM7CiAgIGludCBjZW50ZXJzW05VTV9NQl9TRUdNRU5UU107CiAgIGludCB3ZWlnaHRlZF9hdmVyYWdlID0gMDsKICAgaW50IG1hcFtNQVhfQUxQSEEgKyAxXTsKQEAgLTE1OCw2ICsxNTQsOSBAQAogICAvLyAnaW50JyB0eXBlIGlzIG9rIGZvciBoaXN0bywgYW5kIHdvbid0IG92ZXJmbG93CiAgIGludCBhY2N1bVtOVU1fTUJfU0VHTUVOVFNdLCBkaXN0X2FjY3VtW05VTV9NQl9TRUdNRU5UU107CiAKKyAgYXNzZXJ0KG5iID49IDEpOworICBhc3NlcnQobmIgPD0gTlVNX01CX1NFR01FTlRTKTsKKwogICAvLyBicmFja2V0IHRoZSBpbnB1dAogICBmb3IgKG4gPSAwOyBuIDw9IE1BWF9BTFBIQSAmJiBhbHBoYXNbbl0gPT0gMDsgKytuKSB7fQogICBtaW5fYSA9IG47CkBAIC0xNjYsOCArMTY1LDkgQEAKICAgcmFuZ2VfYSA9IG1heF9hIC0gbWluX2E7CiAKICAgLy8gU3ByZWFkIGluaXRpYWwgY2VudGVycyBldmVubHkKLSAgZm9yIChuID0gMSwgayA9IDA7IG4gPCAyICogbmI7IG4gKz0gMikgewotICAgIGNlbnRlcnNbaysrXSA9IG1pbl9hICsgKG4gKiByYW5nZV9hKSAvICgyICogbmIpOworICBmb3IgKGsgPSAwLCBuID0gMTsgayA8IG5iOyArK2ssIG4gKz0gMikgeworICAgIGFzc2VydChuIDwgMiAqIG5iKTsKKyAgICBjZW50ZXJzW2tdID0gbWluX2EgKyAobiAqIHJhbmdlX2EpIC8gKDIgKiBuYik7CiAgIH0KIAogICBmb3IgKGsgPSAwOyBrIDwgTUFYX0lURVJTX0tfTUVBTlM7ICsraykgeyAgICAgLy8gZmV3IGl0ZXJzIGFyZSBlbm91Z2gKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIG4gPSAwOyAgICAvLyB0cmFjayB0aGUgbmVhcmVzdCBjZW50ZXIgZm9yIGN1cnJlbnQgJ2EnCiAgICAgZm9yIChhID0gbWluX2E7IGEgPD0gbWF4X2E7ICsrYSkgewogICAgICAgaWYgKGFscGhhc1thXSkgewotICAgICAgICB3aGlsZSAobiA8IG5iIC0gMSAmJiBhYnMoYSAtIGNlbnRlcnNbbiArIDFdKSA8IGFicyhhIC0gY2VudGVyc1tuXSkpIHsKKyAgICAgICAgd2hpbGUgKG4gKyAxIDwgbmIgJiYgYWJzKGEgLSBjZW50ZXJzW24gKyAxXSkgPCBhYnMoYSAtIGNlbnRlcnNbbl0pKSB7CiAgICAgICAgICAgbisrOwogICAgICAgICB9CiAgICAgICAgIG1hcFthXSA9IG47CkBAIC0yMzAsMjggKzIzMCwyNiBAQAogLy8gc3VzY2VwdGliaWxpdHkgYW5kIHNldCBiZXN0IG1vZGVzIGZvciB0aGlzIG1hY3JvYmxvY2suCiAvLyBTZWdtZW50IGFzc2lnbm1lbnQgaXMgZG9uZSBsYXRlci4KIAotLy8gTnVtYmVyIG9mIG1vZGVzIHRvIGluc3BlY3QgZm9yIGFscGhhXyBldmFsdWF0aW9uLiBGb3IgaGlnaC1xdWFsaXR5IHNldHRpbmdzCi0vLyAobWV0aG9kID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgYWxsIHRoZSBwb3NzaWJsZSBtb2RlcwotLy8gZHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZS4KLSNkZWZpbmUgRkFTVF9BTkFMWVNJU19NRVRIT0QgNCAgLy8gbWV0aG9kIGFib3ZlIHdoaWNoIHdlIGRvIHBhcnRpYWwgYW5hbHlzaXMKKy8vIE51bWJlciBvZiBtb2RlcyB0byBpbnNwZWN0IGZvciBhbHBoYV8gZXZhbHVhdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGFsbAorLy8gdGhlIHBvc3NpYmxlIG1vZGVzIGR1cmluZyB0aGUgYW5hbHlzaXMgcGhhc2U6IHdlIHJpc2sgZmFsbGluZyBpbnRvIGEgbG9jYWwKKy8vIG9wdGltdW0sIG9yIGJlIHN1YmplY3QgdG8gYm91bmRhcnkgZWZmZWN0CiAjZGVmaW5lIE1BWF9JTlRSQTE2X01PREUgMgogI2RlZmluZSBNQVhfSU5UUkE0X01PREUgIDIKICNkZWZpbmUgTUFYX1VWX01PREUgICAgICAyCiAKIHN0YXRpYyBpbnQgTUJBbmFseXplQmVzdEludHJhMTZNb2RlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBpbnQgbWF4X21vZGUgPQotICAgICAgKGl0LT5lbmNfLT5tZXRob2RfID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSA/IE1BWF9JTlRSQTE2X01PREUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fUFJFRF9NT0RFUzsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX0lOVFJBMTZfTU9ERTsKICAgaW50IG1vZGU7CiAgIGludCBiZXN0X2FscGhhID0gREVGQVVMVF9BTFBIQTsKICAgaW50IGJlc3RfbW9kZSA9IDA7CiAKICAgVlA4TWFrZUx1bWExNlByZWRzKGl0KTsKICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IG1heF9tb2RlOyArK21vZGUpIHsKLSAgICBWUDhIaXN0b2dyYW0gaGlzdG8gPSB7IHsgMCB9IH07CisgICAgVlA4SGlzdG9ncmFtIGhpc3RvOwogICAgIGludCBhbHBoYTsKIAotICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oaXQtPnl1dl9pbl8gKyBZX09GRiwKKyAgICBJbml0SGlzdG9ncmFtKCZoaXN0byk7CisgICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShpdC0+eXV2X2luXyArIFlfT0ZGX0VOQywKICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXSwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2LCAmaGlzdG8pOwogICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3RvKTsKQEAgLTI2NCwyOCArMjYyLDUwIEBACiAgIHJldHVybiBiZXN0X2FscGhhOwogfQogCitzdGF0aWMgaW50IEZhc3RNQkFuYWx5emUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIC8vIEVtcGlyaWNhbCBjdXQtb2ZmIHZhbHVlLCBzaG91bGQgYmUgYXJvdW5kIDE2ICh+PWJsb2NrIHNpemUpLiBXZSB1c2UgdGhlCisgIC8vIFs4LTE3XSByYW5nZSBhbmQgZmF2b3IgaW50cmE0IGF0IGhpZ2ggcXVhbGl0eSwgaW50cmExNiBmb3IgbG93IHF1YWxpdHkuCisgIGNvbnN0IGludCBxID0gKGludClpdC0+ZW5jXy0+Y29uZmlnXy0+cXVhbGl0eTsKKyAgY29uc3QgdWludDMyX3Qga1RocmVzaG9sZCA9IDggKyAoMTcgLSA4KSAqIHEgLyAxMDA7CisgIGludCBrOworICB1aW50MzJfdCBkY1sxNl0sIG0sIG0yOworICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsgKz0gNCkgeworICAgIFZQOE1lYW4xNng0KGl0LT55dXZfaW5fICsgWV9PRkZfRU5DICsgayAqIEJQUywgJmRjW2tdKTsKKyAgfQorICBmb3IgKG0gPSAwLCBtMiA9IDAsIGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgIG0gKz0gZGNba107CisgICAgbTIgKz0gZGNba10gKiBkY1trXTsKKyAgfQorICBpZiAoa1RocmVzaG9sZCAqIG0yIDwgbSAqIG0pIHsKKyAgICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgMCk7ICAgLy8gREMxNgorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QgbW9kZXNbMTZdID0geyAwIH07ICAvLyBEQzQKKyAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCBtb2Rlcyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgTUJBbmFseXplQmVzdEludHJhNE1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9hbHBoYSkgewogICB1aW50OF90IG1vZGVzWzE2XTsKLSAgY29uc3QgaW50IG1heF9tb2RlID0KLSAgICAgIChpdC0+ZW5jXy0+bWV0aG9kXyA+PSBGQVNUX0FOQUxZU0lTX01FVEhPRCkgPyBNQVhfSU5UUkE0X01PREUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fQk1PREVTOworICBjb25zdCBpbnQgbWF4X21vZGUgPSBNQVhfSU5UUkE0X01PREU7CiAgIGludCBpNF9hbHBoYTsKLSAgVlA4SGlzdG9ncmFtIHRvdGFsX2hpc3RvID0geyB7IDAgfSB9OworICBWUDhIaXN0b2dyYW0gdG90YWxfaGlzdG87CiAgIGludCBjdXJfaGlzdG8gPSAwOworICBJbml0SGlzdG9ncmFtKCZ0b3RhbF9oaXN0byk7CiAKICAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKICAgZG8gewogICAgIGludCBtb2RlOwogICAgIGludCBiZXN0X21vZGVfYWxwaGEgPSBERUZBVUxUX0FMUEhBOwogICAgIFZQOEhpc3RvZ3JhbSBoaXN0b3NbMl07Ci0gICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRiArIFZQOFNjYW5baXQtPmk0X107CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOwogCiAgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgewogICAgICAgaW50IGFscGhhOwogCi0gICAgICBTYk1lbW9yeVNldCgmaGlzdG9zW2N1cl9oaXN0b10sIDAsIHNpemVvZihoaXN0b3NbY3VyX2hpc3RvXSkpOworICAgICAgSW5pdEhpc3RvZ3JhbSgmaGlzdG9zW2N1cl9oaXN0b10pOwogICAgICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShzcmMsIGl0LT55dXZfcF8gKyBWUDhJNE1vZGVPZmZzZXRzW21vZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAmaGlzdG9zW2N1cl9oaXN0b10pOwogICAgICAgYWxwaGEgPSBHZXRBbHBoYSgmaGlzdG9zW2N1cl9oaXN0b10pOwpAQCAtMjk4LDcgKzMxOCw3IEBACiAgICAgLy8gYWNjdW11bGF0ZSBiZXN0IGhpc3RvZ3JhbQogICAgIE1lcmdlSGlzdG9ncmFtcygmaGlzdG9zW2N1cl9oaXN0byBeIDFdLCAmdG90YWxfaGlzdG8pOwogICAgIC8vIE5vdGU6IHdlIHJldXNlIHRoZSBvcmlnaW5hbCBzYW1wbGVzIGZvciBwcmVkaWN0b3JzCi0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkYpKTsKKyAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMpKTsKIAogICBpNF9hbHBoYSA9IEdldEFscGhhKCZ0b3RhbF9oaXN0byk7CiAgIGlmIChJU19CRVRURVJfQUxQSEEoaTRfYWxwaGEsIGJlc3RfYWxwaGEpKSB7CkBAIC0zMTAsMjEgKzMzMCwyNiBAQAogCiBzdGF0aWMgaW50IE1CQW5hbHl6ZUJlc3RVVk1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CiAgIGludCBiZXN0X2FscGhhID0gREVGQVVMVF9BTFBIQTsKKyAgaW50IHNtYWxsZXN0X2FscGhhID0gMDsKICAgaW50IGJlc3RfbW9kZSA9IDA7Ci0gIGNvbnN0IGludCBtYXhfbW9kZSA9Ci0gICAgICAoaXQtPmVuY18tPm1ldGhvZF8gPj0gRkFTVF9BTkFMWVNJU19NRVRIT0QpID8gTUFYX1VWX01PREUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fUFJFRF9NT0RFUzsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX1VWX01PREU7CiAgIGludCBtb2RlOworCiAgIFZQOE1ha2VDaHJvbWE4UHJlZHMoaXQpOwogICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgewotICAgIFZQOEhpc3RvZ3JhbSBoaXN0byA9IHsgeyAwIH0gfTsKKyAgICBWUDhIaXN0b2dyYW0gaGlzdG87CiAgICAgaW50IGFscGhhOwotICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oaXQtPnl1dl9pbl8gKyBVX09GRiwKKyAgICBJbml0SGlzdG9ncmFtKCZoaXN0byk7CisgICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShpdC0+eXV2X2luXyArIFVfT0ZGX0VOQywKICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT55dXZfcF8gKyBWUDhVVk1vZGVPZmZzZXRzW21vZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE2ICsgNCArIDQsICZoaXN0byk7CiAgICAgYWxwaGEgPSBHZXRBbHBoYSgmaGlzdG8pOwogICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfYWxwaGEpKSB7CiAgICAgICBiZXN0X2FscGhhID0gYWxwaGE7CisgICAgfQorICAgIC8vIFRoZSBiZXN0IHByZWRpY3Rpb24gbW9kZSB0ZW5kcyB0byBiZSB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGFscGhhLgorICAgIGlmIChtb2RlID09IDAgfHwgYWxwaGEgPCBzbWFsbGVzdF9hbHBoYSkgeworICAgICAgc21hbGxlc3RfYWxwaGEgPSBhbHBoYTsKICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CiAgICAgfQogICB9CkBAIC0zNDIsMTMgKzM2NywxNyBAQAogICBWUDhTZXRTa2lwKGl0LCAwKTsgICAgICAgICAvLyBub3Qgc2tpcHBlZAogICBWUDhTZXRTZWdtZW50KGl0LCAwKTsgICAgICAvLyBkZWZhdWx0IHNlZ21lbnQsIHNwZWMtd2lzZS4KIAotICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhMTZNb2RlKGl0KTsKLSAgaWYgKGVuYy0+bWV0aG9kXyA+PSA1KSB7Ci0gICAgLy8gV2UgZ28gYW5kIG1ha2UgYSBmYXN0IGRlY2lzaW9uIGZvciBpbnRyYTQvaW50cmExNi4KLSAgICAvLyBJdCdzIHVzdWFsbHkgbm90IGEgZ29vZCBhbmQgZGVmaW5pdGl2ZSBwaWNrLCBidXQgaGVscHMgc2VlZGluZyB0aGUgc3RhdHMKLSAgICAvLyBhYm91dCBsZXZlbCBiaXQtY29zdC4KLSAgICAvLyBUT0RPKHNrYWwpOiBpbXByb3ZlIGNyaXRlcmlvbi4KLSAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhNE1vZGUoaXQsIGJlc3RfYWxwaGEpOworICBpZiAoZW5jLT5tZXRob2RfIDw9IDEpIHsKKyAgICBiZXN0X2FscGhhID0gRmFzdE1CQW5hbHl6ZShpdCk7CisgIH0gZWxzZSB7CisgICAgYmVzdF9hbHBoYSA9IE1CQW5hbHl6ZUJlc3RJbnRyYTE2TW9kZShpdCk7CisgICAgaWYgKGVuYy0+bWV0aG9kXyA+PSA1KSB7CisgICAgICAvLyBXZSBnbyBhbmQgbWFrZSBhIGZhc3QgZGVjaXNpb24gZm9yIGludHJhNC9pbnRyYTE2LgorICAgICAgLy8gSXQncyB1c3VhbGx5IG5vdCBhIGdvb2QgYW5kIGRlZmluaXRpdmUgcGljaywgYnV0IGhlbHBzIHNlZWRpbmcgdGhlCisgICAgICAvLyBzdGF0cyBhYm91dCBsZXZlbCBiaXQtY29zdC4KKyAgICAgIC8vIFRPRE8oc2thbCk6IGltcHJvdmUgY3JpdGVyaW9uLgorICAgICAgYmVzdF9hbHBoYSA9IE1CQW5hbHl6ZUJlc3RJbnRyYTRNb2RlKGl0LCBiZXN0X2FscGhhKTsKKyAgICB9CiAgIH0KICAgYmVzdF91dl9hbHBoYSA9IE1CQW5hbHl6ZUJlc3RVVk1vZGUoaXQpOwogCkBAIC0zODksMzggKzQxOCwxMTggQEAKICAgLy8gRGVmYXVsdCBzdXNjZXB0aWJpbGl0aWVzLgogICBlbmMtPmRxbV9bMF0uYWxwaGFfID0gMDsKICAgZW5jLT5kcW1fWzBdLmJldGFfID0gMDsKLSAgLy8gTm90ZTogd2UgY2FuJ3QgY29tcHV0ZSB0aGlzIGFscGhhXyAvIHV2X2FscGhhXy4KKyAgLy8gTm90ZTogd2UgY2FuJ3QgY29tcHV0ZSB0aGlzIGFscGhhXyAvIHV2X2FscGhhXyAtPiBzZXQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgZW5jLT5hbHBoYV8gPSAwOworICBlbmMtPnV2X2FscGhhXyA9IDA7CiAgIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGVuYy0+cGVyY2VudF8gKyAyMCwgJmVuYy0+cGVyY2VudF8pOwogfQogCisvLyBzdHJ1Y3QgdXNlZCB0byBjb2xsZWN0IGpvYiByZXN1bHQKK3R5cGVkZWYgc3RydWN0IHsKKyAgV2ViUFdvcmtlciB3b3JrZXI7CisgIGludCBhbHBoYXNbTUFYX0FMUEhBICsgMV07CisgIGludCBhbHBoYSwgdXZfYWxwaGE7CisgIFZQOEVuY0l0ZXJhdG9yIGl0OworICBpbnQgZGVsdGFfcHJvZ3Jlc3M7Cit9IFNlZ21lbnRKb2I7CisKKy8vIG1haW4gd29yayBjYWxsCitzdGF0aWMgaW50IERvU2VnbWVudHNKb2Iodm9pZCogYXJnMSwgdm9pZCogYXJnMikgeworICBTZWdtZW50Sm9iKiBjb25zdCBqb2IgPSAoU2VnbWVudEpvYiopYXJnMTsKKyAgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0ID0gKFZQOEVuY0l0ZXJhdG9yKilhcmcyOworICBpbnQgb2sgPSAxOworICBpZiAoIVZQOEl0ZXJhdG9ySXNEb25lKGl0KSkgeworICAgIHVpbnQ4X3QgdG1wWzMyICsgV0VCUF9BTElHTl9DU1RdOworICAgIHVpbnQ4X3QqIGNvbnN0IHNjcmF0Y2ggPSAodWludDhfdCopV0VCUF9BTElHTih0bXApOworICAgIGRvIHsKKyAgICAgIC8vIExldCdzIHByZXRlbmQgd2UgaGF2ZSBwZXJmZWN0IGxvc3NsZXNzIHJlY29uc3RydWN0aW9uLgorICAgICAgVlA4SXRlcmF0b3JJbXBvcnQoaXQsIHNjcmF0Y2gpOworICAgICAgTUJBbmFseXplKGl0LCBqb2ItPmFscGhhcywgJmpvYi0+YWxwaGEsICZqb2ItPnV2X2FscGhhKTsKKyAgICAgIG9rID0gVlA4SXRlcmF0b3JQcm9ncmVzcyhpdCwgam9iLT5kZWx0YV9wcm9ncmVzcyk7CisgICAgfSB3aGlsZSAob2sgJiYgVlA4SXRlcmF0b3JOZXh0KGl0KSk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBNZXJnZUpvYnMoY29uc3QgU2VnbWVudEpvYiogY29uc3Qgc3JjLCBTZWdtZW50Sm9iKiBjb25zdCBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0FMUEhBOyArK2kpIGRzdC0+YWxwaGFzW2ldICs9IHNyYy0+YWxwaGFzW2ldOworICBkc3QtPmFscGhhICs9IHNyYy0+YWxwaGE7CisgIGRzdC0+dXZfYWxwaGEgKz0gc3JjLT51dl9hbHBoYTsKK30KKworLy8gaW5pdGlhbGl6ZSB0aGUgam9iIHN0cnVjdCB3aXRoIHNvbWUgVE9ET3MKK3N0YXRpYyB2b2lkIEluaXRTZWdtZW50Sm9iKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgU2VnbWVudEpvYiogY29uc3Qgam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3JvdywgaW50IGVuZF9yb3cpIHsKKyAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5Jbml0KCZqb2ItPndvcmtlcik7CisgIGpvYi0+d29ya2VyLmRhdGExID0gam9iOworICBqb2ItPndvcmtlci5kYXRhMiA9ICZqb2ItPml0OworICBqb2ItPndvcmtlci5ob29rID0gRG9TZWdtZW50c0pvYjsKKyAgVlA4SXRlcmF0b3JJbml0KGVuYywgJmpvYi0+aXQpOworICBWUDhJdGVyYXRvclNldFJvdygmam9iLT5pdCwgc3RhcnRfcm93KTsKKyAgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oJmpvYi0+aXQsIChlbmRfcm93IC0gc3RhcnRfcm93KSAqIGVuYy0+bWJfd18pOworICBtZW1zZXQoam9iLT5hbHBoYXMsIDAsIHNpemVvZihqb2ItPmFscGhhcykpOworICBqb2ItPmFscGhhID0gMDsKKyAgam9iLT51dl9hbHBoYSA9IDA7CisgIC8vIG9ubHkgb25lIG9mIGJvdGggam9icyBjYW4gcmVjb3JkIHRoZSBwcm9ncmVzcywgc2luY2Ugd2UgZG9uJ3QKKyAgLy8gZXhwZWN0IHRoZSB1c2VyJ3MgaG9vayB0byBiZSBtdWx0aS10aHJlYWQgc2FmZQorICBqb2ItPmRlbHRhX3Byb2dyZXNzID0gKHN0YXJ0X3JvdyA9PSAwKSA/IDIwIDogMDsKK30KKworLy8gbWFpbiBlbnRyeSBwb2ludAogaW50IFZQOEVuY0FuYWx5emUoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CiAgIGludCBvayA9IDE7CiAgIGNvbnN0IGludCBkb19zZWdtZW50cyA9CiAgICAgICBlbmMtPmNvbmZpZ18tPmVtdWxhdGVfanBlZ19zaXplIHx8ICAgLy8gV2UgbmVlZCB0aGUgY29tcGxleGl0eSBldmFsdWF0aW9uLgogICAgICAgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB8fAotICAgICAgKGVuYy0+bWV0aG9kXyA9PSAwKTsgIC8vIGZvciBtZXRob2QgMCwgd2UgbmVlZCBwcmVkc19bXSB0byBiZSBmaWxsZWQuCi0gIGVuYy0+YWxwaGFfID0gMDsKLSAgZW5jLT51dl9hbHBoYV8gPSAwOworICAgICAgKGVuYy0+bWV0aG9kXyA8PSAxKTsgIC8vIGZvciBtZXRob2QgMCAtIDEsIHdlIG5lZWQgcHJlZHNfW10gdG8gYmUgZmlsbGVkLgogICBpZiAoZG9fc2VnbWVudHMpIHsKLSAgICBpbnQgYWxwaGFzW01BWF9BTFBIQSArIDFdID0geyAwIH07Ci0gICAgVlA4RW5jSXRlcmF0b3IgaXQ7Ci0KLSAgICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwotICAgIGRvIHsKLSAgICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCk7Ci0gICAgICBNQkFuYWx5emUoJml0LCBhbHBoYXMsICZlbmMtPmFscGhhXywgJmVuYy0+dXZfYWxwaGFfKTsKLSAgICAgIG9rID0gVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIDIwKTsKLSAgICAgIC8vIExldCdzIHByZXRlbmQgd2UgaGF2ZSBwZXJmZWN0IGxvc3NsZXNzIHJlY29uc3RydWN0aW9uLgotICAgIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQsIGl0Lnl1dl9pbl8pKTsKLSAgICBlbmMtPmFscGhhXyAvPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKLSAgICBlbmMtPnV2X2FscGhhXyAvPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKLSAgICBpZiAob2spIEFzc2lnblNlZ21lbnRzKGVuYywgYWxwaGFzKTsKKyAgICBjb25zdCBpbnQgbGFzdF9yb3cgPSBlbmMtPm1iX2hfOworICAgIC8vIFdlIGdpdmUgYSBsaXR0bGUgbW9yZSB0aGFuIGEgaGFsZiB3b3JrIHRvIHRoZSBtYWluIHRocmVhZC4KKyAgICBjb25zdCBpbnQgc3BsaXRfcm93ID0gKDkgKiBsYXN0X3JvdyArIDE1KSA+PiA0OworICAgIGNvbnN0IGludCB0b3RhbF9tYiA9IGxhc3Rfcm93ICogZW5jLT5tYl93XzsKKyNpZmRlZiBXRUJQX1VTRV9USFJFQUQKKyAgICBjb25zdCBpbnQga01pblNwbGl0Um93ID0gMjsgIC8vIG1pbmltYWwgcm93cyBuZWVkZWQgZm9yIG10IHRvIGJlIHdvcnRoIGl0CisgICAgY29uc3QgaW50IGRvX210ID0gKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApICYmIChzcGxpdF9yb3cgPj0ga01pblNwbGl0Um93KTsKKyNlbHNlCisgICAgY29uc3QgaW50IGRvX210ID0gMDsKKyNlbmRpZgorICAgIGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIGNvbnN0IHdvcmtlcl9pbnRlcmZhY2UgPQorICAgICAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCk7CisgICAgU2VnbWVudEpvYiBtYWluX2pvYjsKKyAgICBpZiAoZG9fbXQpIHsKKyAgICAgIFNlZ21lbnRKb2Igc2lkZV9qb2I7CisgICAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgJyYnIGluc3RlYWQgb2YgJyYmJyBiZWNhdXNlIHdlIG11c3QgY2FsbCB0aGUgZnVuY3Rpb25zCisgICAgICAvLyBubyBtYXR0ZXIgd2hhdC4KKyAgICAgIEluaXRTZWdtZW50Sm9iKGVuYywgJm1haW5fam9iLCAwLCBzcGxpdF9yb3cpOworICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmc2lkZV9qb2IsIHNwbGl0X3JvdywgbGFzdF9yb3cpOworICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBjYWxsIFJlc2V0KCkgb24gbWFpbl9qb2Iud29ya2VyLCBzaW5jZSB3ZSdyZSBjYWxsaW5nCisgICAgICAvLyBXZWJQV29ya2VyRXhlY3V0ZSgpIG9uIGl0CisgICAgICBvayAmPSB3b3JrZXJfaW50ZXJmYWNlLT5SZXNldCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgIC8vIGxhdW5jaCB0aGUgdHdvIGpvYnMgaW4gcGFyYWxsZWwKKyAgICAgIGlmIChvaykgeworICAgICAgICB3b3JrZXJfaW50ZXJmYWNlLT5MYXVuY2goJnNpZGVfam9iLndvcmtlcik7CisgICAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkV4ZWN1dGUoJm1haW5fam9iLndvcmtlcik7CisgICAgICAgIG9rICY9IHdvcmtlcl9pbnRlcmZhY2UtPlN5bmMoJnNpZGVfam9iLndvcmtlcik7CisgICAgICAgIG9rICY9IHdvcmtlcl9pbnRlcmZhY2UtPlN5bmMoJm1haW5fam9iLndvcmtlcik7CisgICAgICB9CisgICAgICB3b3JrZXJfaW50ZXJmYWNlLT5FbmQoJnNpZGVfam9iLndvcmtlcik7CisgICAgICBpZiAob2spIE1lcmdlSm9icygmc2lkZV9qb2IsICZtYWluX2pvYik7ICAvLyBtZXJnZSByZXN1bHRzIHRvZ2V0aGVyCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEV2ZW4gZm9yIHNpbmdsZS10aHJlYWQgY2FzZSwgd2UgdXNlIHRoZSBnZW5lcmljIFdvcmtlciB0b29scy4KKyAgICAgIEluaXRTZWdtZW50Sm9iKGVuYywgJm1haW5fam9iLCAwLCBsYXN0X3Jvdyk7CisgICAgICB3b3JrZXJfaW50ZXJmYWNlLT5FeGVjdXRlKCZtYWluX2pvYi53b3JrZXIpOworICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmbWFpbl9qb2Iud29ya2VyKTsKKyAgICB9CisgICAgd29ya2VyX2ludGVyZmFjZS0+RW5kKCZtYWluX2pvYi53b3JrZXIpOworICAgIGlmIChvaykgeworICAgICAgZW5jLT5hbHBoYV8gPSBtYWluX2pvYi5hbHBoYSAvIHRvdGFsX21iOworICAgICAgZW5jLT51dl9hbHBoYV8gPSBtYWluX2pvYi51dl9hbHBoYSAvIHRvdGFsX21iOworICAgICAgQXNzaWduU2VnbWVudHMoZW5jLCBtYWluX2pvYi5hbHBoYXMpOworICAgIH0KICAgfSBlbHNlIHsgICAvLyBVc2Ugb25seSBvbmUgZGVmYXVsdCBzZWdtZW50LgogICAgIFJlc2V0QWxsTUJJbmZvKGVuYyk7CiAgIH0KICAgcmV0dXJuIG9rOwogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jCkBAIC0wLDAgKzEsNzkwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1wcm92ZXMgYSBnaXZlbiBzZXQgb2YgYmFja3dhcmQgcmVmZXJlbmNlcyBieSBhbmFseXppbmcgaXRzIGJpdCBjb3N0LgorLy8gVGhlIGFsZ29yaXRobSBpcyBzaW1pbGFyIHRvIHRoZSBab3BmbGkgY29tcHJlc3Npb24gYWxnb3JpdGhtIGJ1dCB0YWlsb3JlZCB0bworLy8gaW1hZ2VzLgorLy8KKy8vIEF1dGhvcjogVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKy8vCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIFZBTFVFU19JTl9CWVRFIDI1NgorCitleHRlcm4gdm9pZCBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7CitleHRlcm4gaW50IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKGludCB4c2l6ZSwgaW50IGRpc3QpOworZXh0ZXJuIHZvaWQgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkgdik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZG91YmxlIGFscGhhX1tWQUxVRVNfSU5fQllURV07CisgIGRvdWJsZSByZWRfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGJsdWVfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBkb3VibGUqIGxpdGVyYWxfOworfSBDb3N0TW9kZWw7CisKK3N0YXRpYyB2b2lkIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgIGludCBudW1fc3ltYm9scywgY29uc3QgdWludDMyX3QgcG9wdWxhdGlvbl9jb3VudHNbXSwgZG91YmxlIG91dHB1dFtdKSB7CisgIHVpbnQzMl90IHN1bSA9IDA7CisgIGludCBub256ZXJvcyA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgeworICAgIHN1bSArPSBwb3B1bGF0aW9uX2NvdW50c1tpXTsKKyAgICBpZiAocG9wdWxhdGlvbl9jb3VudHNbaV0gPiAwKSB7CisgICAgICArK25vbnplcm9zOworICAgIH0KKyAgfQorICBpZiAobm9uemVyb3MgPD0gMSkgeworICAgIG1lbXNldChvdXRwdXQsIDAsIG51bV9zeW1ib2xzICogc2l6ZW9mKCpvdXRwdXQpKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBkb3VibGUgbG9nc3VtID0gVlA4TEZhc3RMb2cyKHN1bSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHsKKyAgICAgIG91dHB1dFtpXSA9IGxvZ3N1bSAtIFZQOExGYXN0TG9nMihwb3B1bGF0aW9uX2NvdW50c1tpXSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgQ29zdE1vZGVsQnVpbGQoQ29zdE1vZGVsKiBjb25zdCBtLCBpbnQgeHNpemUsIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBvayA9IDA7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGNhY2hlX2JpdHMpOworICBpZiAoaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgc2ltaWxhciB0byBWUDhMSGlzdG9ncmFtQ3JlYXRlIGJ1dCBjb252ZXJ0cyB0aGUKKyAgLy8gZGlzdGFuY2UgdG8gcGxhbmUgY29kZS4KKyAgVlA4TEhpc3RvZ3JhbUluaXQoaGlzdG8sIGNhY2hlX2JpdHMpOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCBjLmN1cl9wb3MsIFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNpemUpOworICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhoaXN0by0+cGFsZXR0ZV9jb2RlX2JpdHNfKSwKKyAgICAgIGhpc3RvLT5saXRlcmFsXywgbS0+bGl0ZXJhbF8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+cmVkXywgbS0+cmVkXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLT5ibHVlXywgbS0+Ymx1ZV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+YWxwaGFfLCBtLT5hbHBoYV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIE5VTV9ESVNUQU5DRV9DT0RFUywgaGlzdG8tPmRpc3RhbmNlXywgbS0+ZGlzdGFuY2VfKTsKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExpdGVyYWxDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgdikgeworICByZXR1cm4gbS0+YWxwaGFfW3YgPj4gMjRdICsKKyAgICAgICAgIG0tPnJlZF9bKHYgPj4gMTYpICYgMHhmZl0gKworICAgICAgICAgbS0+bGl0ZXJhbF9bKHYgPj4gOCkgJiAweGZmXSArCisgICAgICAgICBtLT5ibHVlX1t2ICYgMHhmZl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0Q2FjaGVDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgaWR4KSB7CisgIGNvbnN0IGludCBsaXRlcmFsX2lkeCA9IFZBTFVFU19JTl9CWVRFICsgTlVNX0xFTkdUSF9DT0RFUyArIGlkeDsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW2xpdGVyYWxfaWR4XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRMZW5ndGhDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaW50IGNvZGUsIGV4dHJhX2JpdHM7CisgIFZQOExQcmVmaXhFbmNvZGVCaXRzKGxlbmd0aCwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW1ZBTFVFU19JTl9CWVRFICsgY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldERpc3RhbmNlQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaXN0YW5jZSkgeworICBpbnQgY29kZSwgZXh0cmFfYml0czsKKyAgVlA4TFByZWZpeEVuY29kZUJpdHMoZGlzdGFuY2UsICZjb2RlLCAmZXh0cmFfYml0cyk7CisgIHJldHVybiBtLT5kaXN0YW5jZV9bY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRTaW5nbGVMaXRlcmFsV2l0aENvc3RNb2RlbCgKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGhhc2hlcnMsCisgICAgY29uc3QgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsLCBpbnQgaWR4LCBpbnQgdXNlX2NvbG9yX2NhY2hlLAorICAgIGZsb2F0IHByZXZfY29zdCwgZmxvYXQqIGNvbnN0IGNvc3QsIHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5KSB7CisgIGRvdWJsZSBjb3N0X3ZhbCA9IHByZXZfY29zdDsKKyAgY29uc3QgdWludDMyX3QgY29sb3IgPSBhcmdiW2lkeF07CisgIGNvbnN0IGludCBpeCA9IHVzZV9jb2xvcl9jYWNoZSA/IFZQOExDb2xvckNhY2hlQ29udGFpbnMoaGFzaGVycywgY29sb3IpIDogLTE7CisgIGlmIChpeCA+PSAwKSB7CisgICAgLy8gdXNlX2NvbG9yX2NhY2hlIGlzIHRydWUgYW5kIGhhc2hlcnMgY29udGFpbnMgY29sb3IKKyAgICBjb25zdCBkb3VibGUgbXVsMCA9IDAuNjg7CisgICAgY29zdF92YWwgKz0gR2V0Q2FjaGVDb3N0KGNvc3RfbW9kZWwsIGl4KSAqIG11bDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgZG91YmxlIG11bDEgPSAwLjgyOworICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KGhhc2hlcnMsIGNvbG9yKTsKKyAgICBjb3N0X3ZhbCArPSBHZXRMaXRlcmFsQ29zdChjb3N0X21vZGVsLCBjb2xvcikgKiBtdWwxOworICB9CisgIGlmIChjb3N0W2lkeF0gPiBjb3N0X3ZhbCkgeworICAgIGNvc3RbaWR4XSA9IChmbG9hdCljb3N0X3ZhbDsKKyAgICBkaXN0X2FycmF5W2lkeF0gPSAxOyAgLy8gb25seSBvbmUgaXMgaW5zZXJ0ZWQuCisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvc3RNYW5hZ2VyIGFuZCBpbnRlcnZhbCBoYW5kbGluZworCisvLyBFbXBpcmljYWwgdmFsdWUgdG8gYXZvaWQgaGlnaCBtZW1vcnkgY29uc3VtcHRpb24gYnV0IGdvb2QgZm9yIHBlcmZvcm1hbmNlLgorI2RlZmluZSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYIDUwMAorCisvLyBUbyBwZXJmb3JtIGJhY2t3YXJkIHJlZmVyZW5jZSBldmVyeSBwaXhlbCBhdCBpbmRleCBpbmRleF8gaXMgY29uc2lkZXJlZCBhbmQKKy8vIHRoZSBjb3N0IGZvciB0aGUgTUFYX0xFTkdUSCBmb2xsb3dpbmcgcGl4ZWxzIGNvbXB1dGVkLiBUaG9zZSBmb2xsb3dpbmcgcGl4ZWxzCisvLyBhdCBpbmRleCBpbmRleF8gKyBrIChrIGZyb20gMCB0byBNQVhfTEVOR1RIKSBoYXZlIGEgY29zdCBvZjoKKy8vICAgICBjb3N0XyA9IGRpc3RhbmNlIGNvc3QgYXQgaW5kZXggKyBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspCisvLyBhbmQgdGhlIG1pbmltdW0gdmFsdWUgaXMga2VwdC4gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBpcyBjYWNoZWQgaW4gYW4KKy8vIGFycmF5IG9mIHNpemUgTUFYX0xFTkdUSC4KKy8vIEluc3RlYWQgb2YgcGVyZm9ybWluZyBNQVhfTEVOR1RIIGNvbXBhcmlzb25zIHBlciBwaXhlbCwgd2Uga2VlcCB0cmFjayBvZiB0aGUKKy8vIG1pbmltYWwgdmFsdWVzIHVzaW5nIGludGVydmFscyBvZiBjb25zdGFudCBjb3N0LgorLy8gQW4gaW50ZXJ2YWwgaXMgZGVmaW5lZCBieSB0aGUgaW5kZXhfIG9mIHRoZSBwaXhlbCB0aGF0IGdlbmVyYXRlZCBpdCBhbmQKKy8vIGlzIG9ubHkgdXNlZnVsIGluIGEgcmFuZ2Ugb2YgaW5kaWNlcyBmcm9tIHN0YXJ0XyB0byBlbmRfIChleGNsdXNpdmUpLCBpLmUuCisvLyBpdCBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgcGl4ZWxzIGJldHdlZW4gc3RhcnRfIGFuZCBlbmRfLgorLy8gSW50ZXJ2YWxzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBhbmQgb3JkZXJlZCBieSBzdGFydF8uIFdoZW4gYSBuZXcKKy8vIGludGVydmFsIGhhcyBhIGJldHRlciB2YWx1ZSwgb2xkIGludGVydmFscyBhcmUgc3BsaXQgb3IgcmVtb3ZlZC4gVGhlcmUgYXJlCisvLyB0aGVyZWZvcmUgbm8gb3ZlcmxhcHBpbmcgaW50ZXJ2YWxzLgordHlwZWRlZiBzdHJ1Y3QgQ29zdEludGVydmFsIENvc3RJbnRlcnZhbDsKK3N0cnVjdCBDb3N0SW50ZXJ2YWwgeworICBmbG9hdCBjb3N0XzsKKyAgaW50IHN0YXJ0XzsKKyAgaW50IGVuZF87CisgIGludCBpbmRleF87CisgIENvc3RJbnRlcnZhbCogcHJldmlvdXNfOworICBDb3N0SW50ZXJ2YWwqIG5leHRfOworfTsKKworLy8gVGhlIEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgaykgYXJlIGNhY2hlZCBpbiBhIENvc3RDYWNoZUludGVydmFsLgordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgY29zdF87CisgIGludCBzdGFydF87CisgIGludCBlbmRfOyAgICAgICAvLyBFeGNsdXNpdmUuCit9IENvc3RDYWNoZUludGVydmFsOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyBpbiBjaGFyZ2Ugb2YgbWFuYWdpbmcgaW50ZXJ2YWxzIGFuZCBjb3N0cy4KKy8vIEl0IGNhY2hlcyB0aGUgZGlmZmVyZW50IENvc3RDYWNoZUludGVydmFsLCBjYWNoZXMgdGhlIGRpZmZlcmVudAorLy8gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBpbiBjb3N0X2NhY2hlXyBhbmQgdGhlIENvc3RJbnRlcnZhbCdzICh3aG9zZQorLy8gY291bnRfIGlzIGxpbWl0ZWQgYnkgQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWCkuCisjZGVmaW5lIENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUIDEwCit0eXBlZGVmIHN0cnVjdCB7CisgIENvc3RJbnRlcnZhbCogaGVhZF87CisgIGludCBjb3VudF87ICAvLyBUaGUgbnVtYmVyIG9mIHN0b3JlZCBpbnRlcnZhbHMuCisgIENvc3RDYWNoZUludGVydmFsKiBjYWNoZV9pbnRlcnZhbHNfOworICBzaXplX3QgY2FjaGVfaW50ZXJ2YWxzX3NpemVfOworICBkb3VibGUgY29zdF9jYWNoZV9bTUFYX0xFTkdUSF07ICAvLyBDb250YWlucyB0aGUgR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKS4KKyAgZmxvYXQqIGNvc3RzXzsKKyAgdWludDE2X3QqIGRpc3RfYXJyYXlfOworICAvLyBNb3N0IG9mIHRoZSB0aW1lLCB3ZSBvbmx5IG5lZWQgZmV3IGludGVydmFscyAtPiB1c2UgYSBmcmVlLWxpc3QsIHRvIGF2b2lkCisgIC8vIGZyYWdtZW50YXRpb24gd2l0aCBzbWFsbCBhbGxvY3MgaW4gbW9zdCBjb21tb24gY2FzZXMuCisgIENvc3RJbnRlcnZhbCBpbnRlcnZhbHNfW0NPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUXTsKKyAgQ29zdEludGVydmFsKiBmcmVlX2ludGVydmFsc187CisgIC8vIFRoZXNlIGFyZSByZWd1bGFybHkgbWFsbG9jJ2QgcmVtYWlucy4gVGhpcyBsaXN0IGNhbid0IGdyb3cgbGFyZ2VyIHRoYW4gdGhhbgorICAvLyBzaXplIENPU1RfQ0FDSEVfSU5URVJWQUxfU0laRV9NQVggLSBDT1NUX01BTkFHRVJfTUFYX0ZSRUVfTElTVCwgbm90ZS4KKyAgQ29zdEludGVydmFsKiByZWN5Y2xlZF9pbnRlcnZhbHNfOworfSBDb3N0TWFuYWdlcjsKKworc3RhdGljIHZvaWQgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBpbnRlcnZhbCkgeworICBpbnRlcnZhbC0+bmV4dF8gPSBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc187CisgIG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyA9IGludGVydmFsOworfQorCitzdGF0aWMgaW50IENvc3RJbnRlcnZhbElzSW5GcmVlTGlzdChjb25zdCBDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgcmV0dXJuIChpbnRlcnZhbCA+PSAmbWFuYWdlci0+aW50ZXJ2YWxzX1swXSAmJgorICAgICAgICAgIGludGVydmFsIDw9ICZtYW5hZ2VyLT5pbnRlcnZhbHNfW0NPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUIC0gMV0pOworfQorCitzdGF0aWMgdm9pZCBDb3N0TWFuYWdlckluaXRGcmVlTGlzdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlcikgeworICBpbnQgaTsKKyAgbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUOyArK2kpIHsKKyAgICBDb3N0SW50ZXJ2YWxBZGRUb0ZyZWVMaXN0KG1hbmFnZXIsICZtYW5hZ2VyLT5pbnRlcnZhbHNfW2ldKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEZWxldGVJbnRlcnZhbExpc3QoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdEludGVydmFsKiBpbnRlcnZhbCkgeworICB3aGlsZSAoaW50ZXJ2YWwgIT0gTlVMTCkgeworICAgIGNvbnN0IENvc3RJbnRlcnZhbCogY29uc3QgbmV4dCA9IGludGVydmFsLT5uZXh0XzsKKyAgICBpZiAoIUNvc3RJbnRlcnZhbElzSW5GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCkpIHsKKyAgICAgIFdlYlBTYWZlRnJlZSgodm9pZCopaW50ZXJ2YWwpOworICAgIH0gIC8vIGVsc2U6IGRvIG5vdGhpbmcKKyAgICBpbnRlcnZhbCA9IG5leHQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29zdE1hbmFnZXJDbGVhcihDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlcikgeworICBpZiAobWFuYWdlciA9PSBOVUxMKSByZXR1cm47CisKKyAgV2ViUFNhZmVGcmVlKG1hbmFnZXItPmNvc3RzXyk7CisgIFdlYlBTYWZlRnJlZShtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfKTsKKworICAvLyBDbGVhciB0aGUgaW50ZXJ2YWwgbGlzdHMuCisgIERlbGV0ZUludGVydmFsTGlzdChtYW5hZ2VyLCBtYW5hZ2VyLT5oZWFkXyk7CisgIG1hbmFnZXItPmhlYWRfID0gTlVMTDsKKyAgRGVsZXRlSW50ZXJ2YWxMaXN0KG1hbmFnZXIsIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18pOworICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gTlVMTDsKKworICAvLyBSZXNldCBwb2ludGVycywgY291bnRfIGFuZCBjYWNoZV9pbnRlcnZhbHNfc2l6ZV8uCisgIG1lbXNldChtYW5hZ2VyLCAwLCBzaXplb2YoKm1hbmFnZXIpKTsKKyAgQ29zdE1hbmFnZXJJbml0RnJlZUxpc3QobWFuYWdlcik7Cit9CisKK3N0YXRpYyBpbnQgQ29zdE1hbmFnZXJJbml0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGRpc3RfYXJyYXksIGludCBwaXhfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3N0TW9kZWwqIGNvbnN0IGNvc3RfbW9kZWwpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBjb3N0X2NhY2hlX3NpemUgPSAocGl4X2NvdW50ID4gTUFYX0xFTkdUSCkgPyBNQVhfTEVOR1RIIDogcGl4X2NvdW50OworCisgIG1hbmFnZXItPmNvc3RzXyA9IE5VTEw7CisgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc18gPSBOVUxMOworICBtYW5hZ2VyLT5oZWFkXyA9IE5VTEw7CisgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBOVUxMOworICBtYW5hZ2VyLT5jb3VudF8gPSAwOworICBtYW5hZ2VyLT5kaXN0X2FycmF5XyA9IGRpc3RfYXJyYXk7CisgIENvc3RNYW5hZ2VySW5pdEZyZWVMaXN0KG1hbmFnZXIpOworCisgIC8vIEZpbGwgaW4gdGhlIGNvc3RfY2FjaGVfLgorICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8gPSAxOworICBtYW5hZ2VyLT5jb3N0X2NhY2hlX1swXSA9IEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgMCk7CisgIGZvciAoaSA9IDE7IGkgPCBjb3N0X2NhY2hlX3NpemU7ICsraSkgeworICAgIG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldID0gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBpKTsKKyAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBib3VuZCBpbnRlcnZhbHMuCisgICAgaWYgKG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldICE9IG1hbmFnZXItPmNvc3RfY2FjaGVfW2kgLSAxXSkgeworICAgICAgKyttYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV87CisgICAgfQorICB9CisKKyAgLy8gV2l0aCB0aGUgY3VycmVudCBjb3N0IG1vZGVsLCB3ZSB1c3VhbGx5IGhhdmUgYmVsb3cgMjAgaW50ZXJ2YWxzLgorICAvLyBUaGUgd29yc3QgY2FzZSBzY2VuYXJpbyB3aXRoIGEgY29zdCBtb2RlbCB3b3VsZCBiZSBpZiBldmVyeSBsZW5ndGggaGFzIGEKKyAgLy8gZGlmZmVyZW50IGNvc3QsIGhlbmNlIE1BWF9MRU5HVEggYnV0IHRoYXQgaXMgaW1wb3NzaWJsZSB3aXRoIHRoZSBjdXJyZW50CisgIC8vIGltcGxlbWVudGF0aW9uIHRoYXQgc3BpcmFscyBhcm91bmQgYSBwaXhlbC4KKyAgYXNzZXJ0KG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXyA8PSBNQVhfTEVOR1RIKTsKKyAgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyA9IChDb3N0Q2FjaGVJbnRlcnZhbCopV2ViUFNhZmVNYWxsb2MoCisgICAgICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8sIHNpemVvZigqbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXykpOworICBpZiAobWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyA9PSBOVUxMKSB7CisgICAgQ29zdE1hbmFnZXJDbGVhcihtYW5hZ2VyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEZpbGwgaW4gdGhlIGNhY2hlX2ludGVydmFsc18uCisgIHsKKyAgICBDb3N0Q2FjaGVJbnRlcnZhbCogY3VyID0gbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXzsKKworICAgIC8vIENvbnNlY3V0aXZlIHZhbHVlcyBpbiBjb3N0X2NhY2hlXyBhcmUgY29tcGFyZWQgYW5kIGlmIGEgYmlnIGVub3VnaAorICAgIC8vIGRpZmZlcmVuY2UgaXMgZm91bmQsIGEgbmV3IGludGVydmFsIGlzIGNyZWF0ZWQgYW5kIGJvdW5kZWQuCisgICAgY3VyLT5zdGFydF8gPSAwOworICAgIGN1ci0+ZW5kXyA9IDE7CisgICAgY3VyLT5jb3N0XyA9IG1hbmFnZXItPmNvc3RfY2FjaGVfWzBdOworICAgIGZvciAoaSA9IDE7IGkgPCBjb3N0X2NhY2hlX3NpemU7ICsraSkgeworICAgICAgY29uc3QgZG91YmxlIGNvc3RfdmFsID0gbWFuYWdlci0+Y29zdF9jYWNoZV9baV07CisgICAgICBpZiAoY29zdF92YWwgIT0gY3VyLT5jb3N0XykgeworICAgICAgICArK2N1cjsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbiBpbnRlcnZhbC4KKyAgICAgICAgY3VyLT5zdGFydF8gPSBpOworICAgICAgICBjdXItPmNvc3RfID0gY29zdF92YWw7CisgICAgICB9CisgICAgICBjdXItPmVuZF8gPSBpICsgMTsKKyAgICB9CisgIH0KKworICBtYW5hZ2VyLT5jb3N0c18gPSAoZmxvYXQqKVdlYlBTYWZlTWFsbG9jKHBpeF9jb3VudCwgc2l6ZW9mKCptYW5hZ2VyLT5jb3N0c18pKTsKKyAgaWYgKG1hbmFnZXItPmNvc3RzXyA9PSBOVUxMKSB7CisgICAgQ29zdE1hbmFnZXJDbGVhcihtYW5hZ2VyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBTZXQgdGhlIGluaXRpYWwgY29zdHNfIGhpZ2ggZm9yIGV2ZXJ5IHBpeGVsIGFzIHdlIHdpbGwga2VlcCB0aGUgbWluaW11bS4KKyAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDsgKytpKSBtYW5hZ2VyLT5jb3N0c19baV0gPSAxZTM4ZjsKKworICByZXR1cm4gMTsKK30KKworLy8gR2l2ZW4gdGhlIGNvc3QgYW5kIHRoZSBwb3NpdGlvbiB0aGF0IGRlZmluZSBhbiBpbnRlcnZhbCwgdXBkYXRlIHRoZSBjb3N0IGF0CisvLyBwaXhlbCAnaScgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIHZhbHVlLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlQ29zdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgZmxvYXQgY29zdCkgeworICBjb25zdCBpbnQgayA9IGkgLSBwb3NpdGlvbjsKKyAgYXNzZXJ0KGsgPj0gMCAmJiBrIDwgTUFYX0xFTkdUSCk7CisKKyAgaWYgKG1hbmFnZXItPmNvc3RzX1tpXSA+IGNvc3QpIHsKKyAgICBtYW5hZ2VyLT5jb3N0c19baV0gPSBjb3N0OworICAgIG1hbmFnZXItPmRpc3RfYXJyYXlfW2ldID0gayArIDE7CisgIH0KK30KKworLy8gR2l2ZW4gdGhlIGNvc3QgYW5kIHRoZSBwb3NpdGlvbiB0aGF0IGRlZmluZSBhbiBpbnRlcnZhbCwgdXBkYXRlIHRoZSBjb3N0IGZvcgorLy8gYWxsIHRoZSBwaXhlbHMgYmV0d2VlbiAnc3RhcnQnIGFuZCAnZW5kJyBleGNsdWRlZC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUNvc3RQZXJJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb3N0KSB7CisgIGludCBpOworICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSBVcGRhdGVDb3N0KG1hbmFnZXIsIGksIHBvc2l0aW9uLCBjb3N0KTsKK30KKworLy8gR2l2ZW4gdHdvIGludGVydmFscywgbWFrZSAncHJldicgYmUgdGhlIHByZXZpb3VzIG9uZSBvZiAnbmV4dCcgaW4gJ21hbmFnZXInLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29ubmVjdEludGVydmFscyhDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IG5leHQpIHsKKyAgaWYgKHByZXYgIT0gTlVMTCkgeworICAgIHByZXYtPm5leHRfID0gbmV4dDsKKyAgfSBlbHNlIHsKKyAgICBtYW5hZ2VyLT5oZWFkXyA9IG5leHQ7CisgIH0KKworICBpZiAobmV4dCAhPSBOVUxMKSBuZXh0LT5wcmV2aW91c18gPSBwcmV2OworfQorCisvLyBQb3AgYW4gaW50ZXJ2YWwgaW4gdGhlIG1hbmFnZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQb3BJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgaWYgKGludGVydmFsID09IE5VTEwpIHJldHVybjsKKworICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIGludGVydmFsLT5wcmV2aW91c18sIGludGVydmFsLT5uZXh0Xyk7CisgIGlmIChDb3N0SW50ZXJ2YWxJc0luRnJlZUxpc3QobWFuYWdlciwgaW50ZXJ2YWwpKSB7CisgICAgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgIH0gZWxzZSB7ICAvLyByZWN5Y2xlIHJlZ3VsYXJseSBtYWxsb2MnZCBpbnRlcnZhbHMgdG9vCisgICAgaW50ZXJ2YWwtPm5leHRfID0gbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gaW50ZXJ2YWw7CisgIH0KKyAgLS1tYW5hZ2VyLT5jb3VudF87CisgIGFzc2VydChtYW5hZ2VyLT5jb3VudF8gPj0gMCk7Cit9CisKKy8vIFVwZGF0ZSB0aGUgY29zdCBhdCBpbmRleCBpIGJ5IGdvaW5nIG92ZXIgYWxsIHRoZSBzdG9yZWQgaW50ZXJ2YWxzIHRoYXQKKy8vIG92ZXJsYXAgd2l0aCBpLgorLy8gSWYgJ2RvX2NsZWFuX2ludGVydmFscycgaXMgc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiAwLCBpbnRlcnZhbHMgdGhhdAorLy8gZW5kIGJlZm9yZSAnaScgd2lsbCBiZSBwb3BwZWQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBVcGRhdGVDb3N0QXRJbmRleChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fY2xlYW5faW50ZXJ2YWxzKSB7CisgIENvc3RJbnRlcnZhbCogY3VycmVudCA9IG1hbmFnZXItPmhlYWRfOworCisgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgY3VycmVudC0+c3RhcnRfIDw9IGkpIHsKKyAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IG5leHQgPSBjdXJyZW50LT5uZXh0XzsKKyAgICBpZiAoY3VycmVudC0+ZW5kXyA8PSBpKSB7CisgICAgICBpZiAoZG9fY2xlYW5faW50ZXJ2YWxzKSB7CisgICAgICAgIC8vIFdlIGhhdmUgYW4gb3V0ZGF0ZWQgaW50ZXJ2YWwsIHJlbW92ZSBpdC4KKyAgICAgICAgUG9wSW50ZXJ2YWwobWFuYWdlciwgY3VycmVudCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFVwZGF0ZUNvc3QobWFuYWdlciwgaSwgY3VycmVudC0+aW5kZXhfLCBjdXJyZW50LT5jb3N0Xyk7CisgICAgfQorICAgIGN1cnJlbnQgPSBuZXh0OworICB9Cit9CisKKy8vIEdpdmVuIGEgY3VycmVudCBvcnBoYW4gaW50ZXJ2YWwgYW5kIGl0cyBwcmV2aW91cyBpbnRlcnZhbCwgYmVmb3JlCisvLyBpdCB3YXMgb3JwaGFuZWQgKHdoaWNoIGNhbiBiZSBOVUxMKSwgc2V0IGl0IGF0IHRoZSByaWdodCBwbGFjZSBpbiB0aGUgbGlzdAorLy8gb2YgaW50ZXJ2YWxzIHVzaW5nIHRoZSBzdGFydF8gb3JkZXJpbmcgYW5kIHRoZSBwcmV2aW91cyBpbnRlcnZhbCBhcyBhIGhpbnQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQb3NpdGlvbk9ycGhhbkludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogcHJldmlvdXMpIHsKKyAgYXNzZXJ0KGN1cnJlbnQgIT0gTlVMTCk7CisKKyAgaWYgKHByZXZpb3VzID09IE5VTEwpIHByZXZpb3VzID0gbWFuYWdlci0+aGVhZF87CisgIHdoaWxlIChwcmV2aW91cyAhPSBOVUxMICYmIGN1cnJlbnQtPnN0YXJ0XyA8IHByZXZpb3VzLT5zdGFydF8pIHsKKyAgICBwcmV2aW91cyA9IHByZXZpb3VzLT5wcmV2aW91c187CisgIH0KKyAgd2hpbGUgKHByZXZpb3VzICE9IE5VTEwgJiYgcHJldmlvdXMtPm5leHRfICE9IE5VTEwgJiYKKyAgICAgICAgIHByZXZpb3VzLT5uZXh0Xy0+c3RhcnRfIDwgY3VycmVudC0+c3RhcnRfKSB7CisgICAgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF87CisgIH0KKworICBpZiAocHJldmlvdXMgIT0gTlVMTCkgeworICAgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgY3VycmVudCwgcHJldmlvdXMtPm5leHRfKTsKKyAgfSBlbHNlIHsKKyAgICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIGN1cnJlbnQsIG1hbmFnZXItPmhlYWRfKTsKKyAgfQorICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIHByZXZpb3VzLCBjdXJyZW50KTsKK30KKworLy8gSW5zZXJ0IGFuIGludGVydmFsIGluIHRoZSBsaXN0IGNvbnRhaW5lZCBpbiB0aGUgbWFuYWdlciBieSBzdGFydGluZyBhdAorLy8gaW50ZXJ2YWxfaW4gYXMgYSBoaW50LiBUaGUgaW50ZXJ2YWxzIGFyZSBzb3J0ZWQgYnkgc3RhcnRfIHZhbHVlLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSW5zZXJ0SW50ZXJ2YWwoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGludGVydmFsX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY29zdCwgaW50IHBvc2l0aW9uLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kKSB7CisgIENvc3RJbnRlcnZhbCogaW50ZXJ2YWxfbmV3OworCisgIGlmIChzdGFydCA+PSBlbmQpIHJldHVybjsKKyAgaWYgKG1hbmFnZXItPmNvdW50XyA+PSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYKSB7CisgICAgLy8gU2VyaWFsaXplIHRoZSBpbnRlcnZhbCBpZiB3ZSBjYW5ub3Qgc3RvcmUgaXQuCisgICAgVXBkYXRlQ29zdFBlckludGVydmFsKG1hbmFnZXIsIHN0YXJ0LCBlbmQsIHBvc2l0aW9uLCBjb3N0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyAhPSBOVUxMKSB7CisgICAgaW50ZXJ2YWxfbmV3ID0gbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfOworICAgIG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyA9IGludGVydmFsX25ldy0+bmV4dF87CisgIH0gZWxzZSBpZiAobWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyAhPSBOVUxMKSB7CisgICAgaW50ZXJ2YWxfbmV3ID0gbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gaW50ZXJ2YWxfbmV3LT5uZXh0XzsKKyAgfSBlbHNlIHsgIC8vIG1hbGxvYyBmb3IgZ29vZAorICAgIGludGVydmFsX25ldyA9IChDb3N0SW50ZXJ2YWwqKVdlYlBTYWZlTWFsbG9jKDEsIHNpemVvZigqaW50ZXJ2YWxfbmV3KSk7CisgICAgaWYgKGludGVydmFsX25ldyA9PSBOVUxMKSB7CisgICAgICAvLyBXcml0ZSBkb3duIHRoZSBpbnRlcnZhbCBpZiB3ZSBjYW5ub3QgY3JlYXRlIGl0LgorICAgICAgVXBkYXRlQ29zdFBlckludGVydmFsKG1hbmFnZXIsIHN0YXJ0LCBlbmQsIHBvc2l0aW9uLCBjb3N0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpbnRlcnZhbF9uZXctPmNvc3RfID0gY29zdDsKKyAgaW50ZXJ2YWxfbmV3LT5pbmRleF8gPSBwb3NpdGlvbjsKKyAgaW50ZXJ2YWxfbmV3LT5zdGFydF8gPSBzdGFydDsKKyAgaW50ZXJ2YWxfbmV3LT5lbmRfID0gZW5kOworICBQb3NpdGlvbk9ycGhhbkludGVydmFsKG1hbmFnZXIsIGludGVydmFsX25ldywgaW50ZXJ2YWxfaW4pOworCisgICsrbWFuYWdlci0+Y291bnRfOworfQorCisvLyBHaXZlbiBhIG5ldyBjb3N0IGludGVydmFsIGRlZmluZWQgYnkgaXRzIHN0YXJ0IGF0IHBvc2l0aW9uLCBpdHMgbGVuZ3RoIHZhbHVlCisvLyBhbmQgZGlzdGFuY2VfY29zdCwgYWRkIGl0cyBjb250cmlidXRpb25zIHRvIHRoZSBwcmV2aW91cyBpbnRlcnZhbHMgYW5kIGNvc3RzLgorLy8gSWYgaGFuZGxpbmcgdGhlIGludGVydmFsIG9yIG9uZSBvZiBpdHMgc3ViaW50ZXJ2YWxzIGJlY29tZXMgdG8gaGVhdnksIGl0cworLy8gY29udHJpYnV0aW9uIGlzIGFkZGVkIHRvIHRoZSBjb3N0cyByaWdodCBhd2F5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHVzaEludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZV9jb3N0LCBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikgeworICBzaXplX3QgaTsKKyAgQ29zdEludGVydmFsKiBpbnRlcnZhbCA9IG1hbmFnZXItPmhlYWRfOworICBDb3N0SW50ZXJ2YWwqIGludGVydmFsX25leHQ7CisgIGNvbnN0IENvc3RDYWNoZUludGVydmFsKiBjb25zdCBjb3N0X2NhY2hlX2ludGVydmFscyA9CisgICAgICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfOworICAvLyBJZiB0aGUgaW50ZXJ2YWwgaXMgc21hbGwgZW5vdWdoLCBubyBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgaGVhdnkKKyAgLy8gaW50ZXJ2YWwgbG9naWMsIGp1c3Qgc2VyaWFsaXplIGl0IHJpZ2h0IGF3YXkuIFRoaXMgY29uc3RhbnQgaXMgZW1waXJpY2FsLgorICBjb25zdCBpbnQga1NraXBEaXN0YW5jZSA9IDEwOworCisgIGlmIChsZW4gPCBrU2tpcERpc3RhbmNlKSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gcG9zaXRpb247IGogPCBwb3NpdGlvbiArIGxlbjsgKytqKSB7CisgICAgICBjb25zdCBpbnQgayA9IGogLSBwb3NpdGlvbjsKKyAgICAgIGZsb2F0IGNvc3RfdG1wOworICAgICAgYXNzZXJ0KGsgPj0gMCAmJiBrIDwgTUFYX0xFTkdUSCk7CisgICAgICBjb3N0X3RtcCA9IChmbG9hdCkoZGlzdGFuY2VfY29zdCArIG1hbmFnZXItPmNvc3RfY2FjaGVfW2tdKTsKKworICAgICAgaWYgKG1hbmFnZXItPmNvc3RzX1tqXSA+IGNvc3RfdG1wKSB7CisgICAgICAgIG1hbmFnZXItPmNvc3RzX1tqXSA9IGNvc3RfdG1wOworICAgICAgICBtYW5hZ2VyLT5kaXN0X2FycmF5X1tqXSA9IGsgKyAxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfICYmCisgICAgICAgICAgICAgIGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLnN0YXJ0XyA8IGxlbjsKKyAgICAgICArK2kpIHsKKyAgICAvLyBEZWZpbmUgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaXRoIGludGVydmFsIHdpdGggdGhlIG5ldyBvbmUuCisgICAgaW50IHN0YXJ0ID0gcG9zaXRpb24gKyBjb3N0X2NhY2hlX2ludGVydmFsc1tpXS5zdGFydF87CisgICAgY29uc3QgaW50IGVuZCA9IHBvc2l0aW9uICsgKGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmVuZF8gPiBsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmVuZF8pOworICAgIGNvbnN0IGZsb2F0IGNvc3QgPSAoZmxvYXQpKGRpc3RhbmNlX2Nvc3QgKyBjb3N0X2NhY2hlX2ludGVydmFsc1tpXS5jb3N0Xyk7CisKKyAgICBmb3IgKDsgaW50ZXJ2YWwgIT0gTlVMTCAmJiBpbnRlcnZhbC0+c3RhcnRfIDwgZW5kOworICAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbF9uZXh0KSB7CisgICAgICBpbnRlcnZhbF9uZXh0ID0gaW50ZXJ2YWwtPm5leHRfOworCisgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBzb21lIG92ZXJsYXAKKyAgICAgIGlmIChzdGFydCA+PSBpbnRlcnZhbC0+ZW5kXykgY29udGludWU7CisKKyAgICAgIGlmIChjb3N0ID49IGludGVydmFsLT5jb3N0XykgeworICAgICAgICAvLyBXaGVuIGludGVydmFscyBhcmUgcmVwcmVzZW50ZWQsIHRoZSBsb3dlciwgdGhlIGJldHRlci4KKyAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAvLyBJZiB3ZSBhcmUgd29yc2UgdGhhbiB3aGF0IHdlIGFscmVhZHkgaGF2ZSwgYWRkIHdoYXRldmVyIHdlIGhhdmUgc28KKyAgICAgICAgLy8gZmFyIHVwIHRvIGludGVydmFsLgorICAgICAgICBjb25zdCBpbnQgc3RhcnRfbmV3ID0gaW50ZXJ2YWwtPmVuZF87CisgICAgICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBjb3N0LCBwb3NpdGlvbiwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8pOworICAgICAgICBzdGFydCA9IHN0YXJ0X25ldzsKKyAgICAgICAgaWYgKHN0YXJ0ID49IGVuZCkgYnJlYWs7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RhcnQgPD0gaW50ZXJ2YWwtPnN0YXJ0XykgeworICAgICAgICBpZiAoaW50ZXJ2YWwtPmVuZF8gPD0gZW5kKSB7CisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAgIC8vIFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlsKKyAgICAgICAgICAvLyBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgLy8gV2UgY2FuIHNhZmVseSByZW1vdmUgdGhlIG9sZCBpbnRlcnZhbCBhcyBpdCBpcyBmdWxseSBpbmNsdWRlZC4KKyAgICAgICAgICBQb3BJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8gICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqWworICAgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfID0gZW5kOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZW5kIDwgaW50ZXJ2YWwtPmVuZF8pIHsKKyAgICAgICAgICAvLyBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqWworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIG9sZCBpbnRlcnZhbCBhcyBpdCBmdWxseSBjb250YWlucyB0aGUgbmV3IG9uZS4KKyAgICAgICAgICBjb25zdCBpbnQgZW5kX29yaWdpbmFsID0gaW50ZXJ2YWwtPmVuZF87CisgICAgICAgICAgaW50ZXJ2YWwtPmVuZF8gPSBzdGFydDsKKyAgICAgICAgICBJbnNlcnRJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCwgaW50ZXJ2YWwtPmNvc3RfLCBpbnRlcnZhbC0+aW5kZXhfLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwgZW5kX29yaWdpbmFsKTsKKyAgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsLT5uZXh0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWworICAgICAgICAgIC8vIGludGVydmFsLT5zdGFydF8gICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgaW50ZXJ2YWwtPmVuZF8gPSBzdGFydDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBJbnNlcnQgdGhlIHJlbWFpbmluZyBpbnRlcnZhbCBmcm9tIHN0YXJ0IHRvIGVuZC4KKyAgICBJbnNlcnRJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCwgY29zdCwgcG9zaXRpb24sIHN0YXJ0LCBlbmQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAorICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICB1aW50MTZfdCogY29uc3QgZGlzdF9hcnJheSkgeworICBpbnQgaTsKKyAgaW50IG9rID0gMDsKKyAgaW50IGNjX2luaXQgPSAwOworICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGNvbnN0IHNpemVfdCBsaXRlcmFsX2FycmF5X3NpemUgPQorICAgICAgc2l6ZW9mKGRvdWJsZSkgKiAoTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2FjaGVfYml0cyA+IDApID8gKDEgPDwgY2FjaGVfYml0cykgOiAwKSk7CisgIGNvbnN0IHNpemVfdCBjb3N0X21vZGVsX3NpemUgPSBzaXplb2YoQ29zdE1vZGVsKSArIGxpdGVyYWxfYXJyYXlfc2l6ZTsKKyAgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsID0KKyAgICAgIChDb3N0TW9kZWwqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIGNvc3RfbW9kZWxfc2l6ZSk7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisgIENvc3RNYW5hZ2VyKiBjb3N0X21hbmFnZXIgPQorICAgICAgKENvc3RNYW5hZ2VyKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKmNvc3RfbWFuYWdlcikpOworICBpbnQgb2Zmc2V0X3ByZXYgPSAtMSwgbGVuX3ByZXYgPSAtMTsKKyAgZG91YmxlIG9mZnNldF9jb3N0ID0gLTE7CisgIGludCBmaXJzdF9vZmZzZXRfaXNfY29uc3RhbnQgPSAtMTsgIC8vIGluaXRpYWxpemVkIHdpdGggJ2ltcG9zc2libGUnIHZhbHVlCisgIGludCByZWFjaCA9IDA7CisKKyAgaWYgKGNvc3RfbW9kZWwgPT0gTlVMTCB8fCBjb3N0X21hbmFnZXIgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBjb3N0X21vZGVsLT5saXRlcmFsXyA9IChkb3VibGUqKShjb3N0X21vZGVsICsgMSk7CisgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKKyAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIUNvc3RNb2RlbEJ1aWxkKGNvc3RfbW9kZWwsIHhzaXplLCBjYWNoZV9iaXRzLCByZWZzKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIUNvc3RNYW5hZ2VySW5pdChjb3N0X21hbmFnZXIsIGRpc3RfYXJyYXksIHBpeF9jb3VudCwgY29zdF9tb2RlbCkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gV2UgbG9vcCBvbmUgcGl4ZWwgYXQgYSB0aW1lLCBidXQgc3RvcmUgYWxsIGN1cnJlbnRseSBiZXN0IHBvaW50cyB0bworICAvLyBub24tcHJvY2Vzc2VkIGxvY2F0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIGRpc3RfYXJyYXlbMF0gPSAwOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoYXJnYiwgJmhhc2hlcnMsIGNvc3RfbW9kZWwsIDAsIHVzZV9jb2xvcl9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC5mLCBjb3N0X21hbmFnZXItPmNvc3RzXywgZGlzdF9hcnJheSk7CisKKyAgZm9yIChpID0gMTsgaSA8IHBpeF9jb3VudDsgKytpKSB7CisgICAgY29uc3QgZmxvYXQgcHJldl9jb3N0ID0gY29zdF9tYW5hZ2VyLT5jb3N0c19baSAtIDFdOworICAgIGludCBvZmZzZXQsIGxlbjsKKyAgICBWUDhMSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSwgJm9mZnNldCwgJmxlbik7CisKKyAgICAvLyBUcnkgYWRkaW5nIHRoZSBwaXhlbCBhcyBhIGxpdGVyYWwuCisgICAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoYXJnYiwgJmhhc2hlcnMsIGNvc3RfbW9kZWwsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2NvbG9yX2NhY2hlLCBwcmV2X2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdF9tYW5hZ2VyLT5jb3N0c18sIGRpc3RfYXJyYXkpOworCisgICAgLy8gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIG5vbi1saXRlcmFsLgorICAgIGlmIChsZW4gPj0gMikgeworICAgICAgaWYgKG9mZnNldCAhPSBvZmZzZXRfcHJldikgeworICAgICAgICBjb25zdCBpbnQgY29kZSA9IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpOworICAgICAgICBvZmZzZXRfY29zdCA9IEdldERpc3RhbmNlQ29zdChjb3N0X21vZGVsLCBjb2RlKTsKKyAgICAgICAgZmlyc3Rfb2Zmc2V0X2lzX2NvbnN0YW50ID0gMTsKKyAgICAgICAgUHVzaEludGVydmFsKGNvc3RfbWFuYWdlciwgcHJldl9jb3N0ICsgb2Zmc2V0X2Nvc3QsIGksIGxlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQob2Zmc2V0X2Nvc3QgPj0gMCk7CisgICAgICAgIGFzc2VydChsZW5fcHJldiA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9PSAwIHx8IGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9PSAxKTsKKyAgICAgICAgLy8gSW5zdGVhZCBvZiBjb25zaWRlcmluZyBhbGwgY29udHJpYnV0aW9ucyBmcm9tIGEgcGl4ZWwgaSBieSBjYWxsaW5nOgorICAgICAgICAvLyAgICAgICAgIFB1c2hJbnRlcnZhbChjb3N0X21hbmFnZXIsIHByZXZfY29zdCArIG9mZnNldF9jb3N0LCBpLCBsZW4pOworICAgICAgICAvLyB3ZSBvcHRpbWl6ZSB0aGVzZSBjb250cmlidXRpb25zIGluIGNhc2Ugb2Zmc2V0X2Nvc3Qgc3RheXMgdGhlIHNhbWUKKyAgICAgICAgLy8gZm9yIGNvbnNlY3V0aXZlIHBpeGVscy4gVGhpcyBkZXNjcmliZXMgYSBzZXQgb2YgcGl4ZWxzIHNpbWlsYXIgdG8gYQorICAgICAgICAvLyBwcmV2aW91cyBzZXQgKGUuZy4gY29uc3RhbnQgY29sb3IgcmVnaW9ucykuCisgICAgICAgIGlmIChmaXJzdF9vZmZzZXRfaXNfY29uc3RhbnQpIHsKKyAgICAgICAgICByZWFjaCA9IGkgLSAxICsgbGVuX3ByZXYgLSAxOworICAgICAgICAgIGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSArIGxlbiAtIDEgPiByZWFjaCkgeworICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IGJlIGdvIGZ1cnRoZXIgd2l0aCB0aGUgc2FtZSBvZmZzZXQgaWYgdGhlIHByZXZpb3VzCisgICAgICAgICAgLy8gbGVuZ3RoIHdhcyBtYXhlZCwgaGVuY2UgbGVuX3ByZXYgPT0gbGVuID09IE1BWF9MRU5HVEguCisgICAgICAgICAgLy8gVE9ETyh2cmFiYXVkKSwgYnVtcCBpIHRvIHRoZSBlbmQgcmlnaHQgYXdheSAoaW5zZXJ0IGNhY2hlIGFuZAorICAgICAgICAgIC8vIHVwZGF0ZSBjb3N0KS4KKyAgICAgICAgICAvLyBUT0RPKHZyYWJhdWQpLCBjaGVjayBpZiBvbmUgb2YgdGhlIHBvaW50cyBpbiBiZXR3ZWVuIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICAvLyBhIGxvd2VyIGNvc3QuCisgICAgICAgICAgLy8gQWxyZWFkeSBjb25zaWRlciB0aGUgcGl4ZWwgYXQgInJlYWNoIiB0byBhZGQgaW50ZXJ2YWxzIHRoYXQgYXJlCisgICAgICAgICAgLy8gYmV0dGVyIHRoYW4gd2hhdGV2ZXIgd2UgYWRkLgorICAgICAgICAgIGludCBvZmZzZXRfaiwgbGVuX2ogPSAwOworICAgICAgICAgIGludCBqOworICAgICAgICAgIGFzc2VydChsZW4gPT0gTUFYX0xFTkdUSCB8fCBsZW4gPT0gcGl4X2NvdW50IC0gaSk7CisgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbGFzdCBjb25zZWN1dGl2ZSBwaXhlbCB3aXRoaW4gW2ksIHJlYWNoICsgMV0gd2l0aAorICAgICAgICAgIC8vIHRoZSBzYW1lIG9mZnNldC4KKyAgICAgICAgICBmb3IgKGogPSBpOyBqIDw9IHJlYWNoOyArK2opIHsKKyAgICAgICAgICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBqICsgMSwgJm9mZnNldF9qLCAmbGVuX2opOworICAgICAgICAgICAgaWYgKG9mZnNldF9qICE9IG9mZnNldCkgeworICAgICAgICAgICAgICBWUDhMSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaiwgJm9mZnNldF9qLCAmbGVuX2opOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb3N0IGF0IGogLSAxIGFuZCBqLgorICAgICAgICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaiAtIDEsIDApOworICAgICAgICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaiwgMCk7CisKKyAgICAgICAgICBQdXNoSW50ZXJ2YWwoY29zdF9tYW5hZ2VyLCBjb3N0X21hbmFnZXItPmNvc3RzX1tqIC0gMV0gKyBvZmZzZXRfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaiwgbGVuX2opOworICAgICAgICAgIHJlYWNoID0gaiArIGxlbl9qIC0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaSwgMSk7CisgICAgb2Zmc2V0X3ByZXYgPSBvZmZzZXQ7CisgICAgbGVuX3ByZXYgPSBsZW47CisgIH0KKworICBvayA9ICFyZWZzLT5lcnJvcl87CitFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICBDb3N0TWFuYWdlckNsZWFyKGNvc3RfbWFuYWdlcik7CisgIFdlYlBTYWZlRnJlZShjb3N0X21vZGVsKTsKKyAgV2ViUFNhZmVGcmVlKGNvc3RfbWFuYWdlcik7CisgIHJldHVybiBvazsKK30KKworLy8gV2UgcGFjayB0aGUgcGF0aCBhdCB0aGUgZW5kIG9mICpkaXN0X2FycmF5IGFuZCByZXR1cm4KKy8vIGEgcG9pbnRlciB0byB0aGlzIHBhcnQgb2YgdGhlIGFycmF5LiBFeGFtcGxlOgorLy8gZGlzdF9hcnJheSA9IFsxeDJ4eDN4Ml0gPT4gcGFja2VkIFsxeDJ4MTIzMl0sIGNob3Nlbl9wYXRoID0gWzEyMzJdCitzdGF0aWMgdm9pZCBUcmFjZUJhY2t3YXJkcyh1aW50MTZfdCogY29uc3QgZGlzdF9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0X2FycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCoqIGNvbnN0IGNob3Nlbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjaG9zZW5fcGF0aF9zaXplKSB7CisgIHVpbnQxNl90KiBwYXRoID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZTsKKyAgdWludDE2X3QqIGN1ciA9IGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSAxOworICB3aGlsZSAoY3VyID49IGRpc3RfYXJyYXkpIHsKKyAgICBjb25zdCBpbnQgayA9ICpjdXI7CisgICAgLS1wYXRoOworICAgICpwYXRoID0gazsKKyAgICBjdXIgLT0gazsKKyAgfQorICAqY2hvc2VuX3BhdGggPSBwYXRoOworICAqY2hvc2VuX3BhdGhfc2l6ZSA9IChpbnQpKGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSBwYXRoKTsKK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCB1aW50MTZfdCogY29uc3QgY2hvc2VuX3BhdGgsIGludCBjaG9zZW5fcGF0aF9zaXplLAorICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGludCBpeDsKKyAgaW50IGkgPSAwOworICBpbnQgb2sgPSAwOworICBpbnQgY2NfaW5pdCA9IDA7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorCisgIFZQOExDbGVhckJhY2t3YXJkUmVmcyhyZWZzKTsKKyAgZm9yIChpeCA9IDA7IGl4IDwgY2hvc2VuX3BhdGhfc2l6ZTsgKytpeCkgeworICAgIGNvbnN0IGludCBsZW4gPSBjaG9zZW5fcGF0aFtpeF07CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICBpbnQgazsKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBWUDhMSGFzaENoYWluRmluZE9mZnNldChoYXNoX2NoYWluLCBpKTsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgUGl4T3JDb3B5Q3JlYXRlQ29weShvZmZzZXQsIGxlbikpOworICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpICs9IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgUGl4T3JDb3B5IHY7CisgICAgICBjb25zdCBpbnQgaWR4ID0KKyAgICAgICAgICB1c2VfY29sb3JfY2FjaGUgPyBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBhcmdiW2ldKSA6IC0xOworICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgIC8vIHVzZV9jb2xvcl9jYWNoZSBpcyB0cnVlIGFuZCBoYXNoZXJzIGNvbnRhaW5zIGFyZ2JbaV0KKyAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIGNvbG9yIGNhY2hlIGluZGV4CisgICAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpZHgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaV0pOworICAgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChhcmdiW2ldKTsKKyAgICAgIH0KKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgdik7CisgICAgICArK2k7CisgICAgfQorICB9CisgIG9rID0gIXJlZnMtPmVycm9yXzsKKyBFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgorZXh0ZXJuIGludCBWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfc3JjLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2RzdCk7CitpbnQgVlA4TEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2RzdCkgeworICBpbnQgb2sgPSAwOworICBjb25zdCBpbnQgZGlzdF9hcnJheV9zaXplID0geHNpemUgKiB5c2l6ZTsKKyAgdWludDE2X3QqIGNob3Nlbl9wYXRoID0gTlVMTDsKKyAgaW50IGNob3Nlbl9wYXRoX3NpemUgPSAwOworICB1aW50MTZfdCogZGlzdF9hcnJheSA9CisgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGRpc3RfYXJyYXlfc2l6ZSwgc2l6ZW9mKCpkaXN0X2FycmF5KSk7CisKKyAgaWYgKGRpc3RfYXJyYXkgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seSgKKyAgICAgICAgICB4c2l6ZSwgeXNpemUsIGFyZ2IsIGNhY2hlX2JpdHMsIGhhc2hfY2hhaW4sIHJlZnNfc3JjLCBkaXN0X2FycmF5KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgVHJhY2VCYWNrd2FyZHMoZGlzdF9hcnJheSwgZGlzdF9hcnJheV9zaXplLCAmY2hvc2VuX3BhdGgsICZjaG9zZW5fcGF0aF9zaXplKTsKKyAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAorICAgICAgICAgIGFyZ2IsIGNhY2hlX2JpdHMsIGNob3Nlbl9wYXRoLCBjaG9zZW5fcGF0aF9zaXplLCBoYXNoX2NoYWluLAorICAgICAgICAgIHJlZnNfZHN0KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgb2sgPSAxOworIEVycm9yOgorICBXZWJQU2FmZUZyZWUoZGlzdF9hcnJheSk7CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIzMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jCkBAIC0wLDAgKzEsOTQzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIE1JTl9CTE9DS19TSVpFIDI1NiAgLy8gbWluaW11bSBibG9jayBzaXplIGZvciBiYWNrd2FyZCByZWZlcmVuY2VzCisKKyNkZWZpbmUgTUFYX0VOVFJPUFkgICAgKDFlMzBmKQorCisvLyAxTSB3aW5kb3cgKDRNIGJ5dGVzKSBtaW51cyAxMjAgc3BlY2lhbCBjb2RlcyBmb3Igc2hvcnQgZGlzdGFuY2VzLgorI2RlZmluZSBXSU5ET1dfU0laRSAoKDEgPDwgV0lORE9XX1NJWkVfQklUUykgLSAxMjApCisKKy8vIE1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyBmb3Igd2hpY2ggaXQgaXMgY2hlYXBlciB0byBlbmNvZGUgYQorLy8gZGlzdGFuY2UgKyBsZW5ndGggaW5zdGVhZCBvZiBlYWNoIHBpeGVsIGFzIGEgbGl0ZXJhbC4KKyNkZWZpbmUgTUlOX0xFTkdUSCA0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBsYW5lX3RvX2NvZGVfbHV0WzEyOF0gPSB7CisgOTYsICAgNzMsICA1NSwgIDM5LCAgMjMsICAxMywgICA1LCAgMSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorIDEwMSwgIDc4LCAgNTgsICA0MiwgIDI2LCAgMTYsICAgOCwgIDIsICAgIDAsICAgMywgIDksICAgMTcsICAyNywgIDQzLCAgNTksICA3OSwKKyAxMDIsICA4NiwgIDYyLCAgNDYsICAzMiwgIDIwLCAgMTAsICA2LCAgICA0LCAgIDcsICAxMSwgIDIxLCAgMzMsICA0NywgIDYzLCAgODcsCisgMTA1LCAgOTAsICA3MCwgIDUyLCAgMzcsICAyOCwgIDE4LCAgMTQsICAxMiwgIDE1LCAgMTksICAyOSwgIDM4LCAgNTMsICA3MSwgIDkxLAorIDExMCwgIDk5LCAgODIsICA2NiwgIDQ4LCAgMzUsICAzMCwgIDI0LCAgMjIsICAyNSwgIDMxLCAgMzYsICA0OSwgIDY3LCAgODMsIDEwMCwKKyAxMTUsIDEwOCwgIDk0LCAgNzYsICA2NCwgIDUwLCAgNDQsICA0MCwgIDM0LCAgNDEsICA0NSwgIDUxLCAgNjUsICA3NywgIDk1LCAxMDksCisgMTE4LCAxMTMsIDEwMywgIDkyLCAgODAsICA2OCwgIDYwLCAgNTYsICA1NCwgIDU3LCAgNjEsICA2OSwgIDgxLCAgOTMsIDEwNCwgMTE0LAorIDExOSwgMTE2LCAxMTEsIDEwNiwgIDk3LCAgODgsICA4NCwgIDc0LCAgNzIsICA3NSwgIDg1LCAgODksICA5OCwgMTA3LCAxMTIsIDExNworfTsKKworZXh0ZXJuIGludCBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZShpbnQgeHNpemUsIGludCBkaXN0KTsKK2ludCBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZShpbnQgeHNpemUsIGludCBkaXN0KSB7CisgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdCAvIHhzaXplOworICBjb25zdCBpbnQgeG9mZnNldCA9IGRpc3QgLSB5b2Zmc2V0ICogeHNpemU7CisgIGlmICh4b2Zmc2V0IDw9IDggJiYgeW9mZnNldCA8IDgpIHsKKyAgICByZXR1cm4gcGxhbmVfdG9fY29kZV9sdXRbeW9mZnNldCAqIDE2ICsgOCAtIHhvZmZzZXRdICsgMTsKKyAgfSBlbHNlIGlmICh4b2Zmc2V0ID4geHNpemUgLSA4ICYmIHlvZmZzZXQgPCA3KSB7CisgICAgcmV0dXJuIHBsYW5lX3RvX2NvZGVfbHV0Wyh5b2Zmc2V0ICsgMSkgKiAxNiArIDggKyAoeHNpemUgLSB4b2Zmc2V0KV0gKyAxOworICB9CisgIHJldHVybiBkaXN0ICsgMTIwOworfQorCisvLyBSZXR1cm5zIHRoZSBleGFjdCBpbmRleCB3aGVyZSBhcnJheTEgYW5kIGFycmF5MiBhcmUgZGlmZmVyZW50LiBGb3IgYW4gaW5kZXgKKy8vIGluZmVyaW9yIG9yIGVxdWFsIHRvIGJlc3RfbGVuX21hdGNoLCB0aGUgcmV0dXJuIHZhbHVlIGp1c3QgaGFzIHRvIGJlIHN0cmljdGx5CisvLyBpbmZlcmlvciB0byBiZXN0X2xlbl9tYXRjaC4gVGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIDAgaWYgdGhpcyBpbmRleAorLy8gaXMgYmVzdF9sZW5fbWF0Y2gsIGFuZCB0aGUgaW5kZXggaXRzZWxmIG90aGVyd2lzZS4KKy8vIElmIG5vIHR3byBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGl0IHJldHVybnMgbWF4X2xpbWl0Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBGaW5kTWF0Y2hMZW5ndGgoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9sZW5fbWF0Y2gsIGludCBtYXhfbGltaXQpIHsKKyAgLy8gQmVmb3JlICdleHBlbnNpdmUnIGxpbmVhciBtYXRjaCwgY2hlY2sgaWYgdGhlIHR3byBhcnJheXMgbWF0Y2ggYXQgdGhlCisgIC8vIGN1cnJlbnQgYmVzdCBsZW5ndGggaW5kZXguCisgIGlmIChhcnJheTFbYmVzdF9sZW5fbWF0Y2hdICE9IGFycmF5MltiZXN0X2xlbl9tYXRjaF0pIHJldHVybiAwOworCisgIHJldHVybiBWUDhMVmVjdG9yTWlzbWF0Y2goYXJyYXkxLCBhcnJheTIsIG1heF9saW1pdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVlA4TEJhY2t3YXJkUmVmcworCitzdHJ1Y3QgUGl4T3JDb3B5QmxvY2sgeworICBQaXhPckNvcHlCbG9jayogbmV4dF87ICAgLy8gbmV4dCBibG9jayAob3IgTlVMTCkKKyAgUGl4T3JDb3B5KiBzdGFydF87ICAgICAgIC8vIGRhdGEgc3RhcnQKKyAgaW50IHNpemVfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2VkIHNpemUKK307CisKK2V4dGVybiB2b2lkIFZQOExDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKK3ZvaWQgVlA4TENsZWFyQmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIGlmIChyZWZzLT50YWlsXyAhPSBOVUxMKSB7CisgICAgKnJlZnMtPnRhaWxfID0gcmVmcy0+ZnJlZV9ibG9ja3NfOyAgLy8gcmVjeWNsZSBhbGwgYmxvY2tzIGF0IG9uY2UKKyAgfQorICByZWZzLT5mcmVlX2Jsb2Nrc18gPSByZWZzLT5yZWZzXzsKKyAgcmVmcy0+dGFpbF8gPSAmcmVmcy0+cmVmc187CisgIHJlZnMtPmxhc3RfYmxvY2tfID0gTlVMTDsKKyAgcmVmcy0+cmVmc18gPSBOVUxMOworfQorCit2b2lkIFZQOExCYWNrd2FyZFJlZnNDbGVhcihWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGFzc2VydChyZWZzICE9IE5VTEwpOworICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIHdoaWxlIChyZWZzLT5mcmVlX2Jsb2Nrc18gIT0gTlVMTCkgeworICAgIFBpeE9yQ29weUJsb2NrKiBjb25zdCBuZXh0ID0gcmVmcy0+ZnJlZV9ibG9ja3NfLT5uZXh0XzsKKyAgICBXZWJQU2FmZUZyZWUocmVmcy0+ZnJlZV9ibG9ja3NfKTsKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBuZXh0OworICB9Cit9CisKK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0luaXQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGJsb2NrX3NpemUpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIG1lbXNldChyZWZzLCAwLCBzaXplb2YoKnJlZnMpKTsKKyAgcmVmcy0+dGFpbF8gPSAmcmVmcy0+cmVmc187CisgIHJlZnMtPmJsb2NrX3NpemVfID0KKyAgICAgIChibG9ja19zaXplIDwgTUlOX0JMT0NLX1NJWkUpID8gTUlOX0JMT0NLX1NJWkUgOiBibG9ja19zaXplOworfQorCitWUDhMUmVmc0N1cnNvciBWUDhMUmVmc0N1cnNvckluaXQoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBWUDhMUmVmc0N1cnNvciBjOworICBjLmN1cl9ibG9ja18gPSByZWZzLT5yZWZzXzsKKyAgaWYgKHJlZnMtPnJlZnNfICE9IE5VTEwpIHsKKyAgICBjLmN1cl9wb3MgPSBjLmN1cl9ibG9ja18tPnN0YXJ0XzsKKyAgICBjLmxhc3RfcG9zXyA9IGMuY3VyX3BvcyArIGMuY3VyX2Jsb2NrXy0+c2l6ZV87CisgIH0gZWxzZSB7CisgICAgYy5jdXJfcG9zID0gTlVMTDsKKyAgICBjLmxhc3RfcG9zXyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGNvbnN0IGIgPSBjLT5jdXJfYmxvY2tfLT5uZXh0XzsKKyAgYy0+Y3VyX3BvcyA9IChiID09IE5VTEwpID8gTlVMTCA6IGItPnN0YXJ0XzsKKyAgYy0+bGFzdF9wb3NfID0gKGIgPT0gTlVMTCkgPyBOVUxMIDogYi0+c3RhcnRfICsgYi0+c2l6ZV87CisgIGMtPmN1cl9ibG9ja18gPSBiOworfQorCisvLyBDcmVhdGUgYSBuZXcgYmxvY2ssIGVpdGhlciBmcm9tIHRoZSBmcmVlIGxpc3Qgb3IgYWxsb2NhdGVkCitzdGF0aWMgUGl4T3JDb3B5QmxvY2sqIEJhY2t3YXJkUmVmc05ld0Jsb2NrKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGIgPSByZWZzLT5mcmVlX2Jsb2Nrc187CisgIGlmIChiID09IE5VTEwpIHsgICAvLyBhbGxvY2F0ZSBuZXcgbWVtb3J5IGNodW5rCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPQorICAgICAgICBzaXplb2YoKmIpICsgcmVmcy0+YmxvY2tfc2l6ZV8gKiBzaXplb2YoKmItPnN0YXJ0Xyk7CisgICAgYiA9IChQaXhPckNvcHlCbG9jayopV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG90YWxfc2l6ZSk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgcmVmcy0+ZXJyb3JfIHw9IDE7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYi0+c3RhcnRfID0gKFBpeE9yQ29weSopKCh1aW50OF90KiliICsgc2l6ZW9mKCpiKSk7ICAvLyBub3QgYWx3YXlzIGFsaWduZWQKKyAgfSBlbHNlIHsgIC8vIHJlY3ljbGUgZnJvbSBmcmVlLWxpc3QKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBiLT5uZXh0XzsKKyAgfQorICAqcmVmcy0+dGFpbF8gPSBiOworICByZWZzLT50YWlsXyA9ICZiLT5uZXh0XzsKKyAgcmVmcy0+bGFzdF9ibG9ja18gPSBiOworICBiLT5uZXh0XyA9IE5VTEw7CisgIGItPnNpemVfID0gMDsKKyAgcmV0dXJuIGI7Cit9CisKK2V4dGVybiB2b2lkIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5IHYpOwordm9pZCBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5IHYpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGIgPSByZWZzLT5sYXN0X2Jsb2NrXzsKKyAgaWYgKGIgPT0gTlVMTCB8fCBiLT5zaXplXyA9PSByZWZzLT5ibG9ja19zaXplXykgeworICAgIGIgPSBCYWNrd2FyZFJlZnNOZXdCbG9jayhyZWZzKTsKKyAgICBpZiAoYiA9PSBOVUxMKSByZXR1cm47ICAgLy8gcmVmcy0+ZXJyb3JfIGlzIHNldAorICB9CisgIGItPnN0YXJ0X1tiLT5zaXplXysrXSA9IHY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXNoIGNoYWlucworCitpbnQgVlA4TEhhc2hDaGFpbkluaXQoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHNpemUpIHsKKyAgYXNzZXJ0KHAtPnNpemVfID09IDApOworICBhc3NlcnQocC0+b2Zmc2V0X2xlbmd0aF8gPT0gTlVMTCk7CisgIGFzc2VydChzaXplID4gMCk7CisgIHAtPm9mZnNldF9sZW5ndGhfID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2Moc2l6ZSwgc2l6ZW9mKCpwLT5vZmZzZXRfbGVuZ3RoXykpOworICBpZiAocC0+b2Zmc2V0X2xlbmd0aF8gPT0gTlVMTCkgcmV0dXJuIDA7CisgIHAtPnNpemVfID0gc2l6ZTsKKworICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhMSGFzaENoYWluQ2xlYXIoVlA4TEhhc2hDaGFpbiogY29uc3QgcCkgeworICBhc3NlcnQocCAhPSBOVUxMKTsKKyAgV2ViUFNhZmVGcmVlKHAtPm9mZnNldF9sZW5ndGhfKTsKKworICBwLT5zaXplXyA9IDA7CisgIHAtPm9mZnNldF9sZW5ndGhfID0gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBIQVNIX01VTFRJUExJRVJfSEkgKDB4YzZhNGE3OTNVTEwpCisjZGVmaW5lIEhBU0hfTVVMVElQTElFUl9MTyAoMHg1YmQxZTk5NlVMTCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldFBpeFBhaXJIYXNoNjQoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IpIHsKKyAgdWludDMyX3Qga2V5OworICBrZXkgID0gKGFyZ2JbMV0gKiBIQVNIX01VTFRJUExJRVJfSEkpICYgMHhmZmZmZmZmZnU7CisgIGtleSArPSAoYXJnYlswXSAqIEhBU0hfTVVMVElQTElFUl9MTykgJiAweGZmZmZmZmZmdTsKKyAga2V5ID0ga2V5ID4+ICgzMiAtIEhBU0hfQklUUyk7CisgIHJldHVybiBrZXk7Cit9CisKKy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhhc2ggY2hhaW4gbG9va3VwcyB0byBkbyBmb3IgYQorLy8gZ2l2ZW4gY29tcHJlc3Npb24gcXVhbGl0eS4gUmV0dXJuIHZhbHVlIGluIHJhbmdlIFs4LCA4Nl0uCitzdGF0aWMgaW50IEdldE1heEl0ZXJzRm9yUXVhbGl0eShpbnQgcXVhbGl0eSkgeworICByZXR1cm4gOCArIChxdWFsaXR5ICogcXVhbGl0eSkgLyAxMjg7Cit9CisKK3N0YXRpYyBpbnQgR2V0V2luZG93U2l6ZUZvckhhc2hDaGFpbihpbnQgcXVhbGl0eSwgaW50IHhzaXplKSB7CisgIGNvbnN0IGludCBtYXhfd2luZG93X3NpemUgPSAocXVhbGl0eSA+IDc1KSA/IFdJTkRPV19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocXVhbGl0eSA+IDUwKSA/ICh4c2l6ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHF1YWxpdHkgPiAyNSkgPyAoeHNpemUgPDwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh4c2l6ZSA8PCA0KTsKKyAgYXNzZXJ0KHhzaXplID4gMCk7CisgIHJldHVybiAobWF4X3dpbmRvd19zaXplID4gV0lORE9XX1NJWkUpID8gV0lORE9XX1NJWkUgOiBtYXhfd2luZG93X3NpemU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTWF4RmluZENvcHlMZW5ndGgoaW50IGxlbikgeworICByZXR1cm4gKGxlbiA8IE1BWF9MRU5HVEgpID8gbGVuIDogTUFYX0xFTkdUSDsKK30KKworaW50IFZQOExIYXNoQ2hhaW5GaWxsKFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCkgeworICBjb25zdCBpbnQgc2l6ZSA9IHhzaXplICogeXNpemU7CisgIGNvbnN0IGludCBpdGVyX21heCA9IEdldE1heEl0ZXJzRm9yUXVhbGl0eShxdWFsaXR5KTsKKyAgY29uc3QgdWludDMyX3Qgd2luZG93X3NpemUgPSBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluKHF1YWxpdHksIHhzaXplKTsKKyAgaW50IHBvczsKKyAgaW50IGFyZ2JfY29tcDsKKyAgdWludDMyX3QgYmFzZV9wb3NpdGlvbjsKKyAgaW50MzJfdCogaGFzaF90b19maXJzdF9pbmRleDsKKyAgLy8gVGVtcG9yYXJpbHkgdXNlIHRoZSBwLT5vZmZzZXRfbGVuZ3RoXyBhcyBhIGhhc2ggY2hhaW4uCisgIGludDMyX3QqIGNoYWluID0gKGludDMyX3QqKXAtPm9mZnNldF9sZW5ndGhfOworICBhc3NlcnQoc2l6ZSA+IDApOworICBhc3NlcnQocC0+c2l6ZV8gIT0gMCk7CisgIGFzc2VydChwLT5vZmZzZXRfbGVuZ3RoXyAhPSBOVUxMKTsKKworICBpZiAoc2l6ZSA8PSAyKSB7CisgICAgcC0+b2Zmc2V0X2xlbmd0aF9bMF0gPSBwLT5vZmZzZXRfbGVuZ3RoX1tzaXplIC0gMV0gPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgaGFzaF90b19maXJzdF9pbmRleCA9CisgICAgICAoaW50MzJfdCopV2ViUFNhZmVNYWxsb2MoSEFTSF9TSVpFLCBzaXplb2YoKmhhc2hfdG9fZmlyc3RfaW5kZXgpKTsKKyAgaWYgKGhhc2hfdG9fZmlyc3RfaW5kZXggPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gU2V0IHRoZSBpbnQzMl90IGFycmF5IHRvIC0xLgorICBtZW1zZXQoaGFzaF90b19maXJzdF9pbmRleCwgMHhmZiwgSEFTSF9TSVpFICogc2l6ZW9mKCpoYXNoX3RvX2ZpcnN0X2luZGV4KSk7CisgIC8vIEZpbGwgdGhlIGNoYWluIGxpbmtpbmcgcGl4ZWxzIHdpdGggdGhlIHNhbWUgaGFzaC4KKyAgYXJnYl9jb21wID0gKGFyZ2JbMF0gPT0gYXJnYlsxXSk7CisgIGZvciAocG9zID0gMDsgcG9zIDwgc2l6ZSAtIDI7KSB7CisgICAgdWludDMyX3QgaGFzaF9jb2RlOworICAgIGNvbnN0IGludCBhcmdiX2NvbXBfbmV4dCA9IChhcmdiW3BvcyArIDFdID09IGFyZ2JbcG9zICsgMl0pOworICAgIGlmIChhcmdiX2NvbXAgJiYgYXJnYl9jb21wX25leHQpIHsKKyAgICAgIC8vIENvbnNlY3V0aXZlIHBpeGVscyB3aXRoIHRoZSBzYW1lIGNvbG9yIHdpbGwgc2hhcmUgdGhlIHNhbWUgaGFzaC4KKyAgICAgIC8vIFdlIHRoZXJlZm9yZSB1c2UgYSBkaWZmZXJlbnQgaGFzaDogdGhlIGNvbG9yIGFuZCBpdHMgcmVwZXRpdGlvbgorICAgICAgLy8gbGVuZ3RoLgorICAgICAgdWludDMyX3QgdG1wWzJdOworICAgICAgdWludDMyX3QgbGVuID0gMTsKKyAgICAgIHRtcFswXSA9IGFyZ2JbcG9zXTsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IGZhciB0aGUgcGl4ZWxzIGFyZSB0aGUgc2FtZS4KKyAgICAgIC8vIFRoZSBsYXN0IHBpeGVsIGhhcyBhIGRpZmZlcmVudCA2NCBiaXQgaGFzaCwgYXMgaXRzIG5leHQgcGl4ZWwgZG9lcworICAgICAgLy8gbm90IGhhdmUgdGhlIHNhbWUgY29sb3IsIHNvIHdlIGp1c3QgbmVlZCB0byBnZXQgdG8gdGhlIGxhc3QgcGl4ZWwgZXF1YWwKKyAgICAgIC8vIHRvIGl0cyBmb2xsb3dlci4KKyAgICAgIHdoaWxlIChwb3MgKyAoaW50KWxlbiArIDIgPCBzaXplICYmIGFyZ2JbcG9zICsgbGVuICsgMl0gPT0gYXJnYltwb3NdKSB7CisgICAgICAgICsrbGVuOworICAgICAgfQorICAgICAgaWYgKGxlbiA+IE1BWF9MRU5HVEgpIHsKKyAgICAgICAgLy8gU2tpcCB0aGUgcGl4ZWxzIHRoYXQgbWF0Y2ggZm9yIGRpc3RhbmNlPTEgYW5kIGxlbmd0aD5NQVhfTEVOR1RICisgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgbGlua2VkIHRvIHRoZWlyIHByZWRlY2Vzc29yIGFuZCB3ZSBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGNoZWNrIHRoYXQgaW4gdGhlIG1haW4gZm9yIGxvb3AgYmVsb3cuIFNraXBwaW5nIG1lYW5zIHNldHRpbmcgbm8KKyAgICAgICAgLy8gcHJlZGVjZXNzb3IgaW4gdGhlIGNoYWluLCBoZW5jZSAtMS4KKyAgICAgICAgbWVtc2V0KGNoYWluICsgcG9zLCAweGZmLCAobGVuIC0gTUFYX0xFTkdUSCkgKiBzaXplb2YoKmNoYWluKSk7CisgICAgICAgIHBvcyArPSBsZW4gLSBNQVhfTEVOR1RIOworICAgICAgICBsZW4gPSBNQVhfTEVOR1RIOworICAgICAgfQorICAgICAgLy8gUHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgaGFzaCBjaGFpbi4KKyAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgdG1wWzFdID0gbGVuLS07CisgICAgICAgIGhhc2hfY29kZSA9IEdldFBpeFBhaXJIYXNoNjQodG1wKTsKKyAgICAgICAgY2hhaW5bcG9zXSA9IGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXTsKKyAgICAgICAgaGFzaF90b19maXJzdF9pbmRleFtoYXNoX2NvZGVdID0gcG9zKys7CisgICAgICB9CisgICAgICBhcmdiX2NvbXAgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBKdXN0IG1vdmUgb25lIHBpeGVsIGZvcndhcmQuCisgICAgICBoYXNoX2NvZGUgPSBHZXRQaXhQYWlySGFzaDY0KGFyZ2IgKyBwb3MpOworICAgICAgY2hhaW5bcG9zXSA9IGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXTsKKyAgICAgIGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXSA9IHBvcysrOworICAgICAgYXJnYl9jb21wID0gYXJnYl9jb21wX25leHQ7CisgICAgfQorICB9CisgIC8vIFByb2Nlc3MgdGhlIHBlbnVsdGltYXRlIHBpeGVsLgorICBjaGFpbltwb3NdID0gaGFzaF90b19maXJzdF9pbmRleFtHZXRQaXhQYWlySGFzaDY0KGFyZ2IgKyBwb3MpXTsKKworICBXZWJQU2FmZUZyZWUoaGFzaF90b19maXJzdF9pbmRleCk7CisKKyAgLy8gRmluZCB0aGUgYmVzdCBtYXRjaCBpbnRlcnZhbCBhdCBlYWNoIHBpeGVsLCBkZWZpbmVkIGJ5IGFuIG9mZnNldCB0byB0aGUKKyAgLy8gcGl4ZWwgYW5kIGEgbGVuZ3RoLiBUaGUgcmlnaHQtbW9zdCBwaXhlbCBjYW5ub3QgbWF0Y2ggYW55dGhpbmcgdG8gdGhlIHJpZ2h0CisgIC8vIChoZW5jZSBhIGJlc3QgbGVuZ3RoIG9mIDApIGFuZCB0aGUgbGVmdC1tb3N0IHBpeGVsIG5vdGhpbmcgdG8gdGhlIGxlZnQKKyAgLy8gKGhlbmNlIGFuIG9mZnNldCBvZiAwKS4KKyAgYXNzZXJ0KHNpemUgPiAyKTsKKyAgcC0+b2Zmc2V0X2xlbmd0aF9bMF0gPSBwLT5vZmZzZXRfbGVuZ3RoX1tzaXplIC0gMV0gPSAwOworICBmb3IgKGJhc2VfcG9zaXRpb24gPSBzaXplIC0gMjsgYmFzZV9wb3NpdGlvbiA+IDA7KSB7CisgICAgY29uc3QgaW50IG1heF9sZW4gPSBNYXhGaW5kQ29weUxlbmd0aChzaXplIC0gMSAtIGJhc2VfcG9zaXRpb24pOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3N0YXJ0ID0gYXJnYiArIGJhc2VfcG9zaXRpb247CisgICAgaW50IGl0ZXIgPSBpdGVyX21heDsKKyAgICBpbnQgYmVzdF9sZW5ndGggPSAwOworICAgIHVpbnQzMl90IGJlc3RfZGlzdGFuY2UgPSAwOworICAgIHVpbnQzMl90IGJlc3RfYXJnYjsKKyAgICBjb25zdCBpbnQgbWluX3BvcyA9CisgICAgICAgIChiYXNlX3Bvc2l0aW9uID4gd2luZG93X3NpemUpID8gYmFzZV9wb3NpdGlvbiAtIHdpbmRvd19zaXplIDogMDsKKyAgICBjb25zdCBpbnQgbGVuZ3RoX21heCA9IChtYXhfbGVuIDwgMjU2KSA/IG1heF9sZW4gOiAyNTY7CisgICAgdWludDMyX3QgbWF4X2Jhc2VfcG9zaXRpb247CisKKyAgICBwb3MgPSBjaGFpbltiYXNlX3Bvc2l0aW9uXTsKKyAgICBpZiAoIWxvd19lZmZvcnQpIHsKKyAgICAgIGludCBjdXJyX2xlbmd0aDsKKyAgICAgIC8vIEhldXJpc3RpYzogdXNlIHRoZSBjb21wYXJpc29uIHdpdGggdGhlIGFib3ZlIGxpbmUgYXMgYW4gaW5pdGlhbGl6YXRpb24uCisgICAgICBpZiAoYmFzZV9wb3NpdGlvbiA+PSAodWludDMyX3QpeHNpemUpIHsKKyAgICAgICAgY3Vycl9sZW5ndGggPSBGaW5kTWF0Y2hMZW5ndGgoYXJnYl9zdGFydCAtIHhzaXplLCBhcmdiX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2xlbmd0aCwgbWF4X2xlbik7CisgICAgICAgIGlmIChjdXJyX2xlbmd0aCA+IGJlc3RfbGVuZ3RoKSB7CisgICAgICAgICAgYmVzdF9sZW5ndGggPSBjdXJyX2xlbmd0aDsKKyAgICAgICAgICBiZXN0X2Rpc3RhbmNlID0geHNpemU7CisgICAgICAgIH0KKyAgICAgICAgLS1pdGVyOworICAgICAgfQorICAgICAgLy8gSGV1cmlzdGljOiBjb21wYXJlIHRvIHRoZSBwcmV2aW91cyBwaXhlbC4KKyAgICAgIGN1cnJfbGVuZ3RoID0KKyAgICAgICAgICBGaW5kTWF0Y2hMZW5ndGgoYXJnYl9zdGFydCAtIDEsIGFyZ2Jfc3RhcnQsIGJlc3RfbGVuZ3RoLCBtYXhfbGVuKTsKKyAgICAgIGlmIChjdXJyX2xlbmd0aCA+IGJlc3RfbGVuZ3RoKSB7CisgICAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7CisgICAgICAgIGJlc3RfZGlzdGFuY2UgPSAxOworICAgICAgfQorICAgICAgLS1pdGVyOworICAgICAgLy8gU2tpcCB0aGUgZm9yIGxvb3AgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBtYXhpbXVtLgorICAgICAgaWYgKGJlc3RfbGVuZ3RoID09IE1BWF9MRU5HVEgpIHBvcyA9IG1pbl9wb3MgLSAxOworICAgIH0KKyAgICBiZXN0X2FyZ2IgPSBhcmdiX3N0YXJ0W2Jlc3RfbGVuZ3RoXTsKKworICAgIGZvciAoOyBwb3MgPj0gbWluX3BvcyAmJiAtLWl0ZXI7IHBvcyA9IGNoYWluW3Bvc10pIHsKKyAgICAgIGludCBjdXJyX2xlbmd0aDsKKyAgICAgIGFzc2VydChiYXNlX3Bvc2l0aW9uID4gKHVpbnQzMl90KXBvcyk7CisKKyAgICAgIGlmIChhcmdiW3BvcyArIGJlc3RfbGVuZ3RoXSAhPSBiZXN0X2FyZ2IpIGNvbnRpbnVlOworCisgICAgICBjdXJyX2xlbmd0aCA9IFZQOExWZWN0b3JNaXNtYXRjaChhcmdiICsgcG9zLCBhcmdiX3N0YXJ0LCBtYXhfbGVuKTsKKyAgICAgIGlmIChiZXN0X2xlbmd0aCA8IGN1cnJfbGVuZ3RoKSB7CisgICAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7CisgICAgICAgIGJlc3RfZGlzdGFuY2UgPSBiYXNlX3Bvc2l0aW9uIC0gcG9zOworICAgICAgICBiZXN0X2FyZ2IgPSBhcmdiX3N0YXJ0W2Jlc3RfbGVuZ3RoXTsKKyAgICAgICAgLy8gU3RvcCBpZiB3ZSBoYXZlIHJlYWNoZWQgYSBnb29kIGVub3VnaCBsZW5ndGguCisgICAgICAgIGlmIChiZXN0X2xlbmd0aCA+PSBsZW5ndGhfbWF4KSBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gV2UgaGF2ZSB0aGUgYmVzdCBtYXRjaCBidXQgaW4gY2FzZSB0aGUgdHdvIGludGVydmFscyBjb250aW51ZSBtYXRjaGluZworICAgIC8vIHRvIHRoZSBsZWZ0LCB3ZSBoYXZlIHRoZSBiZXN0IG1hdGNoZXMgZm9yIHRoZSBsZWZ0LWV4dGVuZGVkIHBpeGVscy4KKyAgICBtYXhfYmFzZV9wb3NpdGlvbiA9IGJhc2VfcG9zaXRpb247CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGFzc2VydChiZXN0X2xlbmd0aCA8PSBNQVhfTEVOR1RIKTsKKyAgICAgIGFzc2VydChiZXN0X2Rpc3RhbmNlIDw9IFdJTkRPV19TSVpFKTsKKyAgICAgIHAtPm9mZnNldF9sZW5ndGhfW2Jhc2VfcG9zaXRpb25dID0KKyAgICAgICAgICAoYmVzdF9kaXN0YW5jZSA8PCBNQVhfTEVOR1RIX0JJVFMpIHwgKHVpbnQzMl90KWJlc3RfbGVuZ3RoOworICAgICAgLS1iYXNlX3Bvc2l0aW9uOworICAgICAgLy8gU3RvcCBpZiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2ggb3IgaWYgd2UgYXJlIG91dCBvZiBib3VuZHMuCisgICAgICBpZiAoYmVzdF9kaXN0YW5jZSA9PSAwIHx8IGJhc2VfcG9zaXRpb24gPT0gMCkgYnJlYWs7CisgICAgICAvLyBTdG9wIGlmIHdlIGNhbm5vdCBleHRlbmQgdGhlIG1hdGNoaW5nIGludGVydmFscyB0byB0aGUgbGVmdC4KKyAgICAgIGlmIChiYXNlX3Bvc2l0aW9uIDwgYmVzdF9kaXN0YW5jZSB8fAorICAgICAgICAgIGFyZ2JbYmFzZV9wb3NpdGlvbiAtIGJlc3RfZGlzdGFuY2VdICE9IGFyZ2JbYmFzZV9wb3NpdGlvbl0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBTdG9wIGlmIHdlIGFyZSBtYXRjaGluZyBhdCBpdHMgbGltaXQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIGNsb3NlcgorICAgICAgLy8gbWF0Y2hpbmcgaW50ZXJ2YWwgd2l0aCB0aGUgc2FtZSBtYXhpbXVtIGxlbmd0aC4gVGhlbiBhZ2FpbiwgaWYgdGhlCisgICAgICAvLyBtYXRjaGluZyBpbnRlcnZhbCBpcyBhcyBjbG9zZSBhcyBwb3NzaWJsZSAoYmVzdF9kaXN0YW5jZSA9PSAxKSwgd2Ugd2lsbAorICAgICAgLy8gbmV2ZXIgZmluZCBhbnl0aGluZyBiZXR0ZXIgc28gbGV0J3MgY29udGludWUuCisgICAgICBpZiAoYmVzdF9sZW5ndGggPT0gTUFYX0xFTkdUSCAmJiBiZXN0X2Rpc3RhbmNlICE9IDEgJiYKKyAgICAgICAgICBiYXNlX3Bvc2l0aW9uICsgTUFYX0xFTkdUSCA8IG1heF9iYXNlX3Bvc2l0aW9uKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGJlc3RfbGVuZ3RoIDwgTUFYX0xFTkdUSCkgeworICAgICAgICArK2Jlc3RfbGVuZ3RoOworICAgICAgICBtYXhfYmFzZV9wb3NpdGlvbiA9IGJhc2VfcG9zaXRpb247CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRTaW5nbGVMaXRlcmFsKHVpbnQzMl90IHBpeGVsLCBpbnQgdXNlX2NvbG9yX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZSogY29uc3QgaGFzaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBQaXhPckNvcHkgdjsKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNvbnN0IHVpbnQzMl90IGtleSA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoaGFzaGVycywgcGl4ZWwpOworICAgIGlmIChWUDhMQ29sb3JDYWNoZUxvb2t1cChoYXNoZXJzLCBrZXkpID09IHBpeGVsKSB7CisgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoa2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOworICAgICAgVlA4TENvbG9yQ2FjaGVTZXQoaGFzaGVycywga2V5LCBwaXhlbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHYgPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeGVsKTsKKyAgfQorICBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIHYpOworfQorCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc1JsZShpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIGludCBpLCBrOworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKworICBpZiAodXNlX2NvbG9yX2NhY2hlICYmICFWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgVlA4TENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiWzBdLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgcGl4X2NvdW50KSB7CisgICAgY29uc3QgaW50IG1heF9sZW4gPSBNYXhGaW5kQ29weUxlbmd0aChwaXhfY291bnQgLSBpKTsKKyAgICBjb25zdCBpbnQgcmxlX2xlbiA9IEZpbmRNYXRjaExlbmd0aChhcmdiICsgaSwgYXJnYiArIGkgLSAxLCAwLCBtYXhfbGVuKTsKKyAgICBjb25zdCBpbnQgcHJldl9yb3dfbGVuID0gKGkgPCB4c2l6ZSkgPyAwIDoKKyAgICAgICAgRmluZE1hdGNoTGVuZ3RoKGFyZ2IgKyBpLCBhcmdiICsgaSAtIHhzaXplLCAwLCBtYXhfbGVuKTsKKyAgICBpZiAocmxlX2xlbiA+PSBwcmV2X3Jvd19sZW4gJiYgcmxlX2xlbiA+PSBNSU5fTEVOR1RIKSB7CisgICAgICBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIFBpeE9yQ29weUNyZWF0ZUNvcHkoMSwgcmxlX2xlbikpOworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgdGhlIGNvbG9yIGNhY2hlIGhlcmUgc2luY2UgaXQgaXMgYWx3YXlzIHRoZQorICAgICAgLy8gc2FtZSBwaXhlbCBiZWluZyBjb3BpZWQsIGFuZCB0aGF0IGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgY2FjaGUKKyAgICAgIC8vIHN0YXRlLgorICAgICAgaSArPSBybGVfbGVuOworICAgIH0gZWxzZSBpZiAocHJldl9yb3dfbGVuID49IE1JTl9MRU5HVEgpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgUGl4T3JDb3B5Q3JlYXRlQ29weSh4c2l6ZSwgcHJldl9yb3dfbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBwcmV2X3Jvd19sZW47ICsraykgeworICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGkgKz0gcHJldl9yb3dfbGVuOworICAgIH0gZWxzZSB7CisgICAgICBBZGRTaW5nbGVMaXRlcmFsKGFyZ2JbaV0sIHVzZV9jb2xvcl9jYWNoZSwgJmhhc2hlcnMsIHJlZnMpOworICAgICAgaSsrOworICAgIH0KKyAgfQorICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuICFyZWZzLT5lcnJvcl87Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzTHo3NyhpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBpOworICBpbnQgaV9sYXN0X2NoZWNrID0gLTE7CisgIGludCBvayA9IDA7CisgIGludCBjY19pbml0ID0gMDsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworCisgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKKyAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7CisgIH0KKyAgVlA4TENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OykgeworICAgIC8vIEFsdGVybmF0aXZlIzE6IENvZGUgdGhlIHBpeGVscyBzdGFydGluZyBhdCAnaScgdXNpbmcgYmFja3dhcmQgcmVmZXJlbmNlLgorICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBsZW4gPSAwOworICAgIGludCBqOworICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCAmb2Zmc2V0LCAmbGVuKTsKKyAgICBpZiAobGVuID49IE1JTl9MRU5HVEgpIHsKKyAgICAgIGNvbnN0IGludCBsZW5faW5pID0gbGVuOworICAgICAgaW50IG1heF9yZWFjaCA9IDA7CisgICAgICBjb25zdCBpbnQgal9tYXggPQorICAgICAgICAgIChpICsgbGVuX2luaSA+PSBwaXhfY291bnQpID8gcGl4X2NvdW50IC0gMSA6IGkgKyBsZW5faW5pOworICAgICAgLy8gT25seSBzdGFydCBmcm9tIHdoYXQgd2UgaGF2ZSBub3QgY2hlY2tlZCBhbHJlYWR5LgorICAgICAgaV9sYXN0X2NoZWNrID0gKGkgPiBpX2xhc3RfY2hlY2spID8gaSA6IGlfbGFzdF9jaGVjazsKKyAgICAgIC8vIFdlIGtub3cgdGhlIGJlc3QgbWF0Y2ggZm9yIHRoZSBjdXJyZW50IHBpeGVsIGJ1dCB3ZSB0cnkgdG8gZmluZCB0aGUKKyAgICAgIC8vIGJlc3QgbWF0Y2hlcyBmb3IgdGhlIGN1cnJlbnQgcGl4ZWwgQU5EIHRoZSBuZXh0IG9uZSBjb21iaW5lZC4KKyAgICAgIC8vIFRoZSBuYWl2ZSBtZXRob2Qgd291bGQgdXNlIHRoZSBpbnRlcnZhbHM6CisgICAgICAvLyBbaSxpK2xlbikgKyBbaStsZW4sIGxlbmd0aCBvZiBiZXN0IG1hdGNoIGF0IGkrbGVuKQorICAgICAgLy8gd2hpbGUgd2UgY2hlY2sgaWYgd2UgY2FuIHVzZToKKyAgICAgIC8vIFtpLGopICh3aGVyZSBqPD1pK2xlbikgKyBbaiwgbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggYXQgaikKKyAgICAgIGZvciAoaiA9IGlfbGFzdF9jaGVjayArIDE7IGogPD0gal9tYXg7ICsraikgeworICAgICAgICBjb25zdCBpbnQgbGVuX2ogPSBWUDhMSGFzaENoYWluRmluZExlbmd0aChoYXNoX2NoYWluLCBqKTsKKyAgICAgICAgY29uc3QgaW50IHJlYWNoID0KKyAgICAgICAgICAgIGogKyAobGVuX2ogPj0gTUlOX0xFTkdUSCA/IGxlbl9qIDogMSk7ICAvLyAxIGZvciBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgaWYgKHJlYWNoID4gbWF4X3JlYWNoKSB7CisgICAgICAgICAgbGVuID0gaiAtIGk7CisgICAgICAgICAgbWF4X3JlYWNoID0gcmVhY2g7CisgICAgICAgICAgaWYgKG1heF9yZWFjaCA+PSBwaXhfY291bnQpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxlbiA9IDE7CisgICAgfQorICAgIC8vIEdvIHdpdGggbGl0ZXJhbCBvciBiYWNrd2FyZCByZWZlcmVuY2UuCisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiW2ldLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgbGVuOyArK2opIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2pdKTsKKyAgICAgIH0KKyAgICB9CisgICAgaSArPSBsZW47CisgIH0KKworICBvayA9ICFyZWZzLT5lcnJvcl87CisgRXJyb3I6CisgIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBDb21wdXRlIGFuIExaNzcgYnkgZm9yY2luZyBtYXRjaGVzIHRvIGhhcHBlbiB3aXRoaW4gYSBnaXZlbiBkaXN0YW5jZSBjb3N0LgorLy8gV2UgdGhlcmVmb3JlIGxpbWl0IHRoZSBhbGdvcml0aG0gdG8gdGhlIGxvd2VzdCAzMiB2YWx1ZXMgaW4gdGhlIFBsYW5lQ29kZQorLy8gZGVmaW5pdGlvbi4KKyNkZWZpbmUgV0lORE9XX09GRlNFVFNfU0laRV9NQVggMzIKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzTHo3N0JveChpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbl9iZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIYXNoQ2hhaW4qIGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIHVpbnQxNl90KiBjb3VudHM7CisgIGludCB3aW5kb3dfb2Zmc2V0c1tXSU5ET1dfT0ZGU0VUU19TSVpFX01BWF0gPSB7MH07CisgIGludCB3aW5kb3dfb2Zmc2V0c19uZXdbV0lORE9XX09GRlNFVFNfU0laRV9NQVhdID0gezB9OworICBpbnQgd2luZG93X29mZnNldHNfc2l6ZSA9IDA7CisgIGludCB3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZSA9IDA7CisgIHVpbnQxNl90KiBjb25zdCBjb3VudHNfaW5pID0KKyAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoeHNpemUgKiB5c2l6ZSwgc2l6ZW9mKCpjb3VudHNfaW5pKSk7CisgIGludCBiZXN0X29mZnNldF9wcmV2ID0gLTEsIGJlc3RfbGVuZ3RoX3ByZXYgPSAtMTsKKyAgaWYgKGNvdW50c19pbmkgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gY291bnRzW2ldIGNvdW50cyBob3cgbWFueSB0aW1lcyBhIHBpeGVsIGlzIHJlcGVhdGVkIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIGkuCisgIGkgPSBwaXhfY291bnQgLSAyOworICBjb3VudHMgPSBjb3VudHNfaW5pICsgaTsKKyAgY291bnRzWzFdID0gMTsKKyAgZm9yICg7IGkgPj0gMDsgLS1pLCAtLWNvdW50cykgeworICAgIGlmIChhcmdiW2ldID09IGFyZ2JbaSArIDFdKSB7CisgICAgICAvLyBNYXggb3V0IHRoZSBjb3VudHMgdG8gTUFYX0xFTkdUSC4KKyAgICAgIGNvdW50c1swXSA9IGNvdW50c1sxXSArIChjb3VudHNbMV0gIT0gTUFYX0xFTkdUSCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvdW50c1swXSA9IDE7CisgICAgfQorICB9CisKKyAgLy8gRmlndXJlIG91dCB0aGUgd2luZG93IG9mZnNldHMgYXJvdW5kIGEgcGl4ZWwuIFRoZXkgYXJlIHN0b3JlZCBpbiBhCisgIC8vIHNwaXJhbGluZyBvcmRlciBhcm91bmQgdGhlIHBpeGVsIGFzIGRlZmluZWQgYnkgVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUuCisgIHsKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDw9IDY7ICsreSkgeworICAgICAgZm9yICh4ID0gLTY7IHggPD0gNjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB5ICogeHNpemUgKyB4OworICAgICAgICBpbnQgcGxhbmVfY29kZTsKKyAgICAgICAgLy8gSWdub3JlIG9mZnNldHMgdGhhdCBicmluZyB1cyBhZnRlciB0aGUgcGl4ZWwuCisgICAgICAgIGlmIChvZmZzZXQgPD0gMCkgY29udGludWU7CisgICAgICAgIHBsYW5lX2NvZGUgPSBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZSh4c2l6ZSwgb2Zmc2V0KSAtIDE7CisgICAgICAgIGlmIChwbGFuZV9jb2RlID49IFdJTkRPV19PRkZTRVRTX1NJWkVfTUFYKSBjb250aW51ZTsKKyAgICAgICAgd2luZG93X29mZnNldHNbcGxhbmVfY29kZV0gPSBvZmZzZXQ7CisgICAgICB9CisgICAgfQorICAgIC8vIEZvciBuYXJyb3cgaW1hZ2VzLCBub3QgYWxsIHBsYW5lIGNvZGVzIGFyZSByZWFjaGVkLCBzbyByZW1vdmUgdGhvc2UuCisgICAgZm9yIChpID0gMDsgaSA8IFdJTkRPV19PRkZTRVRTX1NJWkVfTUFYOyArK2kpIHsKKyAgICAgIGlmICh3aW5kb3dfb2Zmc2V0c1tpXSA9PSAwKSBjb250aW51ZTsKKyAgICAgIHdpbmRvd19vZmZzZXRzW3dpbmRvd19vZmZzZXRzX3NpemUrK10gPSB3aW5kb3dfb2Zmc2V0c1tpXTsKKyAgICB9CisgICAgLy8gR2l2ZW4gYSBwaXhlbCBQLCBmaW5kIHRoZSBvZmZzZXRzIHRoYXQgcmVhY2ggcGl4ZWxzIHVucmVhY2hhYmxlIGZyb20gUC0xCisgICAgLy8gd2l0aCBhbnkgb2YgdGhlIG9mZnNldHMgaW4gd2luZG93X29mZnNldHNbXS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2luZG93X29mZnNldHNfc2l6ZTsgKytpKSB7CisgICAgICBpbnQgajsKKyAgICAgIGludCBpc19yZWFjaGFibGUgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IHdpbmRvd19vZmZzZXRzX3NpemUgJiYgIWlzX3JlYWNoYWJsZTsgKytqKSB7CisgICAgICAgIGlzX3JlYWNoYWJsZSB8PSAod2luZG93X29mZnNldHNbaV0gPT0gd2luZG93X29mZnNldHNbal0gKyAxKTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNfcmVhY2hhYmxlKSB7CisgICAgICAgIHdpbmRvd19vZmZzZXRzX25ld1t3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZV0gPSB3aW5kb3dfb2Zmc2V0c1tpXTsKKyAgICAgICAgKyt3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBoYXNoX2NoYWluLT5vZmZzZXRfbGVuZ3RoX1swXSA9IDA7CisgIGZvciAoaSA9IDE7IGkgPCBwaXhfY291bnQ7ICsraSkgeworICAgIGludCBpbmQ7CisgICAgaW50IGJlc3RfbGVuZ3RoID0gVlA4TEhhc2hDaGFpbkZpbmRMZW5ndGgoaGFzaF9jaGFpbl9iZXN0LCBpKTsKKyAgICBpbnQgYmVzdF9vZmZzZXQ7CisgICAgaW50IGRvX2NvbXB1dGUgPSAxOworCisgICAgaWYgKGJlc3RfbGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKKyAgICAgIC8vIERvIG5vdCByZWNvbXB1dGUgdGhlIGJlc3QgbWF0Y2ggaWYgd2UgYWxyZWFkeSBoYXZlIGEgbWF4aW1hbCBvbmUgaW4gdGhlCisgICAgICAvLyB3aW5kb3cuCisgICAgICBiZXN0X29mZnNldCA9IFZQOExIYXNoQ2hhaW5GaW5kT2Zmc2V0KGhhc2hfY2hhaW5fYmVzdCwgaSk7CisgICAgICBmb3IgKGluZCA9IDA7IGluZCA8IHdpbmRvd19vZmZzZXRzX3NpemU7ICsraW5kKSB7CisgICAgICAgIGlmIChiZXN0X29mZnNldCA9PSB3aW5kb3dfb2Zmc2V0c1tpbmRdKSB7CisgICAgICAgICAgZG9fY29tcHV0ZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvX2NvbXB1dGUpIHsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgb2Zmc2V0L2xlbmd0aCBmcm9tIHRoZSBwcmV2aW91cyBwaXhlbAorICAgICAgLy8gYXMgYW4gaW5pdGlhbCBndWVzcyBhbmQgdGhlcmVmb3JlIG9ubHkgaW5zcGVjdCB0aGUgb2Zmc2V0cyBpbgorICAgICAgLy8gd2luZG93X29mZnNldHNfbmV3W10uCisgICAgICBjb25zdCBpbnQgdXNlX3ByZXYgPQorICAgICAgICAgIChiZXN0X2xlbmd0aF9wcmV2ID4gMSkgJiYgKGJlc3RfbGVuZ3RoX3ByZXYgPCBNQVhfTEVOR1RIKTsKKyAgICAgIGNvbnN0IGludCBudW1faW5kID0KKyAgICAgICAgICB1c2VfcHJldiA/IHdpbmRvd19vZmZzZXRzX25ld19zaXplIDogd2luZG93X29mZnNldHNfc2l6ZTsKKyAgICAgIGJlc3RfbGVuZ3RoID0gdXNlX3ByZXYgPyBiZXN0X2xlbmd0aF9wcmV2IC0gMSA6IDA7CisgICAgICBiZXN0X29mZnNldCA9IHVzZV9wcmV2ID8gYmVzdF9vZmZzZXRfcHJldiA6IDA7CisgICAgICAvLyBGaW5kIHRoZSBsb25nZXN0IG1hdGNoIGluIGEgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwuCisgICAgICBmb3IgKGluZCA9IDA7IGluZCA8IG51bV9pbmQ7ICsraW5kKSB7CisgICAgICAgIGludCBjdXJyX2xlbmd0aCA9IDA7CisgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgaW50IGpfb2Zmc2V0ID0KKyAgICAgICAgICAgIHVzZV9wcmV2ID8gaSAtIHdpbmRvd19vZmZzZXRzX25ld1tpbmRdIDogaSAtIHdpbmRvd19vZmZzZXRzW2luZF07CisgICAgICAgIGlmIChqX29mZnNldCA8IDAgfHwgYXJnYltqX29mZnNldF0gIT0gYXJnYltpXSkgY29udGludWU7CisgICAgICAgIC8vIFRoZSBsb25nZXN0IG1hdGNoIGlzIHRoZSBzdW0gb2YgaG93IG1hbnkgdGltZXMgZWFjaCBwaXhlbCBpcworICAgICAgICAvLyByZXBlYXRlZC4KKyAgICAgICAgZG8geworICAgICAgICAgIGNvbnN0IGludCBjb3VudHNfal9vZmZzZXQgPSBjb3VudHNfaW5pW2pfb2Zmc2V0XTsKKyAgICAgICAgICBjb25zdCBpbnQgY291bnRzX2ogPSBjb3VudHNfaW5pW2pdOworICAgICAgICAgIGlmIChjb3VudHNfal9vZmZzZXQgIT0gY291bnRzX2opIHsKKyAgICAgICAgICAgIGN1cnJfbGVuZ3RoICs9CisgICAgICAgICAgICAgICAgKGNvdW50c19qX29mZnNldCA8IGNvdW50c19qKSA/IGNvdW50c19qX29mZnNldCA6IGNvdW50c19qOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFRoZSBzYW1lIGNvbG9yIGlzIHJlcGVhdGVkIGNvdW50c19wb3MgdGltZXMgYXQgal9vZmZzZXQgYW5kIGouCisgICAgICAgICAgY3Vycl9sZW5ndGggKz0gY291bnRzX2pfb2Zmc2V0OworICAgICAgICAgIGpfb2Zmc2V0ICs9IGNvdW50c19qX29mZnNldDsKKyAgICAgICAgICBqICs9IGNvdW50c19qX29mZnNldDsKKyAgICAgICAgfSB3aGlsZSAoY3Vycl9sZW5ndGggPD0gTUFYX0xFTkdUSCAmJiBqIDwgcGl4X2NvdW50ICYmCisgICAgICAgICAgICAgICAgIGFyZ2Jbal9vZmZzZXRdID09IGFyZ2Jbal0pOworICAgICAgICBpZiAoYmVzdF9sZW5ndGggPCBjdXJyX2xlbmd0aCkgeworICAgICAgICAgIGJlc3Rfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgdXNlX3ByZXYgPyB3aW5kb3dfb2Zmc2V0c19uZXdbaW5kXSA6IHdpbmRvd19vZmZzZXRzW2luZF07CisgICAgICAgICAgaWYgKGN1cnJfbGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKKyAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gTUFYX0xFTkdUSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZXN0X2xlbmd0aCA9IGN1cnJfbGVuZ3RoOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChpICsgYmVzdF9sZW5ndGggPD0gcGl4X2NvdW50KTsKKyAgICBhc3NlcnQoYmVzdF9sZW5ndGggPD0gTUFYX0xFTkdUSCk7CisgICAgaWYgKGJlc3RfbGVuZ3RoIDw9IE1JTl9MRU5HVEgpIHsKKyAgICAgIGhhc2hfY2hhaW4tPm9mZnNldF9sZW5ndGhfW2ldID0gMDsKKyAgICAgIGJlc3Rfb2Zmc2V0X3ByZXYgPSAwOworICAgICAgYmVzdF9sZW5ndGhfcHJldiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhc2hfY2hhaW4tPm9mZnNldF9sZW5ndGhfW2ldID0KKyAgICAgICAgICAoYmVzdF9vZmZzZXQgPDwgTUFYX0xFTkdUSF9CSVRTKSB8ICh1aW50MzJfdCliZXN0X2xlbmd0aDsKKyAgICAgIGJlc3Rfb2Zmc2V0X3ByZXYgPSBiZXN0X29mZnNldDsKKyAgICAgIGJlc3RfbGVuZ3RoX3ByZXYgPSBiZXN0X2xlbmd0aDsKKyAgICB9CisgIH0KKyAgaGFzaF9jaGFpbi0+b2Zmc2V0X2xlbmd0aF9bMF0gPSAwOworICBXZWJQU2FmZUZyZWUoY291bnRzX2luaSk7CisKKyAgcmV0dXJuIEJhY2t3YXJkUmVmZXJlbmNlc0x6NzcoeHNpemUsIHlzaXplLCBhcmdiLCBjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eShpbnQgeHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgaWYgKFBpeE9yQ29weUlzQ29weShjLmN1cl9wb3MpKSB7CisgICAgICBjb25zdCBpbnQgZGlzdCA9IGMuY3VyX3Bvcy0+YXJnYl9vcl9kaXN0YW5jZTsKKyAgICAgIGNvbnN0IGludCB0cmFuc2Zvcm1lZF9kaXN0ID0gVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIGRpc3QpOworICAgICAgYy5jdXJfcG9zLT5hcmdiX29yX2Rpc3RhbmNlID0gdHJhbnNmb3JtZWRfZGlzdDsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorfQorCisvLyBFdmFsdWF0ZSBvcHRpbWFsIGNhY2hlIGJpdHMgZm9yIHRoZSBsb2NhbCBjb2xvciBjYWNoZS4KKy8vIFRoZSBpbnB1dCAqYmVzdF9jYWNoZV9iaXRzIHNldHMgdGhlIG1heGltdW0gY2FjaGUgYml0cyB0byB1c2UgKHBhc3NpbmcgMAorLy8gaW1wbGllcyBkaXNhYmxpbmcgdGhlIGxvY2FsIGNvbG9yIGNhY2hlKS4gVGhlIGxvY2FsIGNvbG9yIGNhY2hlIGlzIGFsc28KKy8vIGRpc2FibGVkIGZvciB0aGUgbG93ZXIgKDw9IDI1KSBxdWFsaXR5LgorLy8gUmV0dXJucyAwIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorc3RhdGljIGludCBDYWxjdWxhdGVCZXN0Q2FjaGVTaXplKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgYmVzdF9jYWNoZV9iaXRzKSB7CisgIGludCBpOworICBjb25zdCBpbnQgY2FjaGVfYml0c19tYXggPSAocXVhbGl0eSA8PSAyNSkgPyAwIDogKmJlc3RfY2FjaGVfYml0czsKKyAgZG91YmxlIGVudHJvcHlfbWluID0gTUFYX0VOVFJPUFk7CisgIGludCBjY19pbml0W01BWF9DT0xPUl9DQUNIRV9CSVRTICsgMV0gPSB7IDAgfTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyc1tNQVhfQ09MT1JfQ0FDSEVfQklUUyArIDFdOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICBWUDhMSGlzdG9ncmFtKiBoaXN0b3NbTUFYX0NPTE9SX0NBQ0hFX0JJVFMgKyAxXSA9IHsgTlVMTCB9OworICBpbnQgb2sgPSAwOworCisgIGFzc2VydChjYWNoZV9iaXRzX21heCA+PSAwICYmIGNhY2hlX2JpdHNfbWF4IDw9IE1BWF9DT0xPUl9DQUNIRV9CSVRTKTsKKworICBpZiAoY2FjaGVfYml0c19tYXggPT0gMCkgeworICAgICpiZXN0X2NhY2hlX2JpdHMgPSAwOworICAgIC8vIExvY2FsIGNvbG9yIGNhY2hlIGlzIGRpc2FibGVkLgorICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQWxsb2NhdGUgZGF0YS4KKyAgZm9yIChpID0gMDsgaSA8PSBjYWNoZV9iaXRzX21heDsgKytpKSB7CisgICAgaGlzdG9zW2ldID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGkpOworICAgIGlmIChoaXN0b3NbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICBpZiAoaSA9PSAwKSBjb250aW51ZTsKKyAgICBjY19pbml0W2ldID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzW2ldLCBpKTsKKyAgICBpZiAoIWNjX2luaXRbaV0pIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBGaW5kIHRoZSBjYWNoZV9iaXRzIGdpdmluZyB0aGUgbG93ZXN0IGVudHJvcHkuIFRoZSBzZWFyY2ggaXMgZG9uZSBpbiBhCisgIC8vIGJydXRlLWZvcmNlIHdheSBhcyB0aGUgZnVuY3Rpb24gKGVudHJvcHkgdy5yLnQgY2FjaGVfYml0cykgY2FuIGJlCisgIC8vIGFueXRoaW5nIGluIHByYWN0aWNlLgorICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gKmFyZ2IrKzsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSAocGl4ID4+IDI0KSAmIDB4ZmY7CisgICAgICBjb25zdCB1aW50MzJfdCByID0gKHBpeCA+PiAxNikgJiAweGZmOworICAgICAgY29uc3QgdWludDMyX3QgZyA9IChwaXggPj4gIDgpICYgMHhmZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSAocGl4ID4+ICAwKSAmIDB4ZmY7CisgICAgICAvLyBUaGUga2V5cyBvZiB0aGUgY2FjaGVzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlIGxvbmdlc3Qgb25lLgorICAgICAgaW50IGtleSA9IFZQOExIYXNoUGl4KHBpeCwgMzIgLSBjYWNoZV9iaXRzX21heCk7CisgICAgICAvLyBEbyBub3QgdXNlIHRoZSBjb2xvciBjYWNoZSBmb3IgY2FjaGVfYml0cyA9IDAuCisgICAgICArK2hpc3Rvc1swXS0+Ymx1ZV9bYl07CisgICAgICArK2hpc3Rvc1swXS0+bGl0ZXJhbF9bZ107CisgICAgICArK2hpc3Rvc1swXS0+cmVkX1tyXTsKKyAgICAgICsraGlzdG9zWzBdLT5hbHBoYV9bYV07CisgICAgICAvLyBEZWFsIHdpdGggY2FjaGVfYml0cyA+IDAuCisgICAgICBmb3IgKGkgPSBjYWNoZV9iaXRzX21heDsgaSA+PSAxOyAtLWksIGtleSA+Pj0gMSkgeworICAgICAgICBpZiAoVlA4TENvbG9yQ2FjaGVMb29rdXAoJmhhc2hlcnNbaV0sIGtleSkgPT0gcGl4KSB7CisgICAgICAgICAgKytoaXN0b3NbaV0tPmxpdGVyYWxfW05VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArIGtleV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVTZXQoJmhhc2hlcnNbaV0sIGtleSwgcGl4KTsKKyAgICAgICAgICArK2hpc3Rvc1tpXS0+Ymx1ZV9bYl07CisgICAgICAgICAgKytoaXN0b3NbaV0tPmxpdGVyYWxfW2ddOworICAgICAgICAgICsraGlzdG9zW2ldLT5yZWRfW3JdOworICAgICAgICAgICsraGlzdG9zW2ldLT5hbHBoYV9bYV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2hvdWxkIGNvbXB1dGUgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgKGRpc3RhbmNlLGxlbmd0aCkKKyAgICAgIC8vIGhpc3RvZ3JhbXMgYnV0IHRob3NlIGFyZSB0aGUgc2FtZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIGNhY2hlIHNpemUuCisgICAgICAvLyBBcyB0aG9zZSBjb25zdGFudCBjb250cmlidXRpb25zIGFyZSBpbiB0aGUgZW5kIGFkZGVkIHRvIHRoZSBvdGhlcgorICAgICAgLy8gaGlzdG9ncmFtIGNvbnRyaWJ1dGlvbnMsIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZW0uCisgICAgICBpbnQgbGVuID0gUGl4T3JDb3B5TGVuZ3RoKHYpOworICAgICAgdWludDMyX3QgYXJnYl9wcmV2ID0gKmFyZ2IgXiAweGZmZmZmZmZmdTsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgY29sb3IgY2FjaGVzLgorICAgICAgZG8geworICAgICAgICBpZiAoKmFyZ2IgIT0gYXJnYl9wcmV2KSB7CisgICAgICAgICAgLy8gRWZmaWNpZW5jeTogaW5zZXJ0IG9ubHkgaWYgdGhlIGNvbG9yIGNoYW5nZXMuCisgICAgICAgICAgaW50IGtleSA9IFZQOExIYXNoUGl4KCphcmdiLCAzMiAtIGNhY2hlX2JpdHNfbWF4KTsKKyAgICAgICAgICBmb3IgKGkgPSBjYWNoZV9iaXRzX21heDsgaSA+PSAxOyAtLWksIGtleSA+Pj0gMSkgeworICAgICAgICAgICAgaGFzaGVyc1tpXS5jb2xvcnNfW2tleV0gPSAqYXJnYjsKKyAgICAgICAgICB9CisgICAgICAgICAgYXJnYl9wcmV2ID0gKmFyZ2I7CisgICAgICAgIH0KKyAgICAgICAgYXJnYisrOworICAgICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDw9IGNhY2hlX2JpdHNfbWF4OyArK2kpIHsKKyAgICBjb25zdCBkb3VibGUgZW50cm9weSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG9zW2ldKTsKKyAgICBpZiAoaSA9PSAwIHx8IGVudHJvcHkgPCBlbnRyb3B5X21pbikgeworICAgICAgZW50cm9weV9taW4gPSBlbnRyb3B5OworICAgICAgKmJlc3RfY2FjaGVfYml0cyA9IGk7CisgICAgfQorICB9CisgIG9rID0gMTsKK0Vycm9yOgorICBmb3IgKGkgPSAwOyBpIDw9IGNhY2hlX2JpdHNfbWF4OyArK2kpIHsKKyAgICBpZiAoY2NfaW5pdFtpXSkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVyc1tpXSk7CisgICAgVlA4TEZyZWVIaXN0b2dyYW0oaGlzdG9zW2ldKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vIFVwZGF0ZSAoaW4tcGxhY2UpIGJhY2t3YXJkIHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBjYWNoZV9iaXRzLgorc3RhdGljIGludCBCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZShjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgaW50IHBpeGVsX2luZGV4ID0gMDsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgaWYgKCFWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpKSByZXR1cm4gMDsKKworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgY29uc3QgdWludDMyX3QgYXJnYl9saXRlcmFsID0gdi0+YXJnYl9vcl9kaXN0YW5jZTsKKyAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JfbGl0ZXJhbCk7CisgICAgICBpZiAoaXggPj0gMCkgeworICAgICAgICAvLyBoYXNoZXJzIGNvbnRhaW5zIGFyZ2JfbGl0ZXJhbAorICAgICAgICAqdiA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGl4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiX2xpdGVyYWwpOworICAgICAgfQorICAgICAgKytwaXhlbF9pbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gcmVmcyB3YXMgY3JlYXRlZCB3aXRob3V0IGxvY2FsIGNhY2hlLCBzbyBpdCBjYW4gbm90IGhhdmUgY2FjaGUgaW5kZXhlcy4KKyAgICAgIGludCBrOworICAgICAgYXNzZXJ0KFBpeE9yQ29weUlzQ29weSh2KSk7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgdi0+bGVuOyArK2spIHsKKyAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbcGl4ZWxfaW5kZXgrK10pOworICAgICAgfQorICAgIH0KKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIFZQOExCYWNrd2FyZFJlZnMqIEdldEJhY2t3YXJkUmVmZXJlbmNlc0xvd0VmZm9ydCgKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgIGludCogY29uc3QgY2FjaGVfYml0cywgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2x6NzcpIHsKKyAgKmNhY2hlX2JpdHMgPSAwOworICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0x6Nzcod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwgcmVmc19sejc3KSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkod2lkdGgsIHJlZnNfbHo3Nyk7CisgIHJldHVybiByZWZzX2x6Nzc7Cit9CisKK2V4dGVybiBpbnQgVlA4TEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKAorICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3NyYywgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc19kc3QpOworc3RhdGljIFZQOExCYWNrd2FyZFJlZnMqIEdldEJhY2t3YXJkUmVmZXJlbmNlcygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgbHo3N190eXBlc190b190cnksIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzKiBiZXN0LAorICAgIFZQOExCYWNrd2FyZFJlZnMqIHdvcnN0KSB7CisgIGNvbnN0IGludCBjYWNoZV9iaXRzX2luaXRpYWwgPSAqY2FjaGVfYml0czsKKyAgZG91YmxlIGJpdF9jb3N0X2Jlc3QgPSAtMTsKKyAgVlA4TEhpc3RvZ3JhbSogaGlzdG8gPSBOVUxMOworICBpbnQgbHo3N190eXBlLCBsejc3X3R5cGVfYmVzdCA9IDA7CisgIFZQOExIYXNoQ2hhaW4gaGFzaF9jaGFpbl9ib3g7CisgIG1lbXNldCgmaGFzaF9jaGFpbl9ib3gsIDAsIHNpemVvZihoYXNoX2NoYWluX2JveCkpOworCisgIGhpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKE1BWF9DT0xPUl9DQUNIRV9CSVRTKTsKKyAgaWYgKGhpc3RvID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgZm9yIChsejc3X3R5cGUgPSAxOyBsejc3X3R5cGVzX3RvX3RyeTsKKyAgICAgICBsejc3X3R5cGVzX3RvX3RyeSAmPSB+bHo3N190eXBlLCBsejc3X3R5cGUgPDw9IDEpIHsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBkb3VibGUgYml0X2Nvc3Q7CisgICAgaW50IGNhY2hlX2JpdHNfdG1wID0gY2FjaGVfYml0c19pbml0aWFsOworICAgIGlmICgobHo3N190eXBlc190b190cnkgJiBsejc3X3R5cGUpID09IDApIGNvbnRpbnVlOworICAgIHN3aXRjaCAobHo3N190eXBlKSB7CisgICAgICBjYXNlIGtMWjc3UkxFOgorICAgICAgICByZXMgPSBCYWNrd2FyZFJlZmVyZW5jZXNSbGUod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgd29yc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0xaNzdTdGFuZGFyZDoKKyAgICAgICAgLy8gQ29tcHV0ZSBMWjc3IHdpdGggbm8gY2FjaGUgKDAgYml0cyksIGFzIHRoZSBpZGVhbCBMWjc3IHdpdGggYSBjb2xvcgorICAgICAgICAvLyBjYWNoZSBpcyBub3QgdGhhdCBkaWZmZXJlbnQgaW4gcHJhY3RpY2UuCisgICAgICAgIHJlcyA9IEJhY2t3YXJkUmVmZXJlbmNlc0x6Nzcod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwgd29yc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0xaNzdCb3g6CisgICAgICAgIGlmICghVlA4TEhhc2hDaGFpbkluaXQoJmhhc2hfY2hhaW5fYm94LCB3aWR0aCAqIGhlaWdodCkpIGdvdG8gRXJyb3I7CisgICAgICAgIHJlcyA9IEJhY2t3YXJkUmVmZXJlbmNlc0x6NzdCb3god2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzaF9jaGFpbl9ib3gsIHdvcnN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorICAgIGlmICghcmVzKSBnb3RvIEVycm9yOworCisgICAgLy8gTmV4dCwgdHJ5IHdpdGggYSBjb2xvciBjYWNoZSBhbmQgdXBkYXRlIHRoZSByZWZlcmVuY2VzLgorICAgIGlmICghQ2FsY3VsYXRlQmVzdENhY2hlU2l6ZShhcmdiLCBxdWFsaXR5LCB3b3JzdCwgJmNhY2hlX2JpdHNfdG1wKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKGNhY2hlX2JpdHNfdG1wID4gMCkgeworICAgICAgaWYgKCFCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZShhcmdiLCBjYWNoZV9iaXRzX3RtcCwgd29yc3QpKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfQorCisgICAgLy8gS2VlcCB0aGUgYmVzdCBiYWNrd2FyZCByZWZlcmVuY2VzLgorICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sIHdvcnN0LCBjYWNoZV9iaXRzX3RtcCk7CisgICAgYml0X2Nvc3QgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKKyAgICBpZiAobHo3N190eXBlX2Jlc3QgPT0gMCB8fCBiaXRfY29zdCA8IGJpdF9jb3N0X2Jlc3QpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHRtcCA9IHdvcnN0OworICAgICAgd29yc3QgPSBiZXN0OworICAgICAgYmVzdCA9IHRtcDsKKyAgICAgIGJpdF9jb3N0X2Jlc3QgPSBiaXRfY29zdDsKKyAgICAgICpjYWNoZV9iaXRzID0gY2FjaGVfYml0c190bXA7CisgICAgICBsejc3X3R5cGVfYmVzdCA9IGx6NzdfdHlwZTsKKyAgICB9CisgIH0KKyAgYXNzZXJ0KGx6NzdfdHlwZV9iZXN0ID4gMCk7CisKKyAgLy8gSW1wcm92ZSBvbiBzaW1wbGUgTFo3NyBidXQgb25seSBmb3IgaGlnaCBxdWFsaXR5IChUcmFjZUJhY2t3YXJkcyBpcworICAvLyBjb3N0bHkpLgorICBpZiAoKGx6NzdfdHlwZV9iZXN0ID09IGtMWjc3U3RhbmRhcmQgfHwgbHo3N190eXBlX2Jlc3QgPT0ga0xaNzdCb3gpICYmCisgICAgICBxdWFsaXR5ID49IDI1KSB7CisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbl90bXAgPQorICAgICAgICAobHo3N190eXBlX2Jlc3QgPT0ga0xaNzdTdGFuZGFyZCkgPyBoYXNoX2NoYWluIDogJmhhc2hfY2hhaW5fYm94OworICAgIGlmIChWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMod2lkdGgsIGhlaWdodCwgYXJnYiwgKmNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluX3RtcCwgYmVzdCwgd29yc3QpKSB7CisgICAgICBkb3VibGUgYml0X2Nvc3RfdHJhY2U7CisgICAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCB3b3JzdCwgKmNhY2hlX2JpdHMpOworICAgICAgYml0X2Nvc3RfdHJhY2UgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKKyAgICAgIGlmIChiaXRfY29zdF90cmFjZSA8IGJpdF9jb3N0X2Jlc3QpIGJlc3QgPSB3b3JzdDsKKyAgICB9CisgIH0KKworICBCYWNrd2FyZFJlZmVyZW5jZXMyRExvY2FsaXR5KHdpZHRoLCBiZXN0KTsKKworRXJyb3I6CisgIFZQOExIYXNoQ2hhaW5DbGVhcigmaGFzaF9jaGFpbl9ib3gpOworICBWUDhMRnJlZUhpc3RvZ3JhbShoaXN0byk7CisgIHJldHVybiBiZXN0OworfQorCitWUDhMQmFja3dhcmRSZWZzKiBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LAorICAgIGludCBsb3dfZWZmb3J0LCBpbnQgbHo3N190eXBlc190b190cnksIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDEsCisgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAyKSB7CisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgcmV0dXJuIEdldEJhY2t3YXJkUmVmZXJlbmNlc0xvd0VmZm9ydCh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9jaGFpbiwgcmVmc190bXAxKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR2V0QmFja3dhcmRSZWZlcmVuY2VzKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsejc3X3R5cGVzX3RvX3RyeSwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNfdG1wMSwgcmVmc190bXAyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjZmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgKQEAgLTAsMCArMSwyMzggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworCisjaWZuZGVmIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfRU5DX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gVGhlIG1heGltdW0gYWxsb3dlZCBsaW1pdCBpcyAxMS4KKyNkZWZpbmUgTUFYX0NPTE9SX0NBQ0hFX0JJVFMgMTAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBpeE9yQ29weQorCitlbnVtIE1vZGUgeworICBrTGl0ZXJhbCwKKyAga0NhY2hlSWR4LAorICBrQ29weSwKKyAga05vbmUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gbW9kZSBhcyB1aW50OF90IHRvIG1ha2UgdGhlIG1lbW9yeSBsYXlvdXQgdG8gYmUgZXhhY3RseSA4IGJ5dGVzLgorICB1aW50OF90IG1vZGU7CisgIHVpbnQxNl90IGxlbjsKKyAgdWludDMyX3QgYXJnYl9vcl9kaXN0YW5jZTsKK30gUGl4T3JDb3B5OworCitzdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUNvcHkodWludDMyX3QgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7CisgIFBpeE9yQ29weSByZXR2YWw7CisgIHJldHZhbC5tb2RlID0ga0NvcHk7CisgIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gZGlzdGFuY2U7CisgIHJldHZhbC5sZW4gPSBsZW47CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaW50IGlkeCkgeworICBQaXhPckNvcHkgcmV0dmFsOworICBTQl9EQ0hFQ0soaWR4ID49IDApOworICBTQl9EQ0hFQ0soaWR4IDwgKDEgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKTsKKyAgcmV0dmFsLm1vZGUgPSBrQ2FjaGVJZHg7CisgIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gaWR4OworICByZXR2YWwubGVuID0gMTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHVpbnQzMl90IGFyZ2IpIHsKKyAgUGl4T3JDb3B5IHJldHZhbDsKKyAgcmV0dmFsLm1vZGUgPSBrTGl0ZXJhbDsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBhcmdiOworICByZXR2YWwubGVuID0gMTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0xpdGVyYWwoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiAocC0+bW9kZSA9PSBrTGl0ZXJhbCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDYWNoZUlkeChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgcmV0dXJuIChwLT5tb2RlID09IGtDYWNoZUlkeCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDb3B5KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gKHAtPm1vZGUgPT0ga0NvcHkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50KSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtMaXRlcmFsKTsKKyAgcmV0dXJuIChwLT5hcmdiX29yX2Rpc3RhbmNlID4+IChjb21wb25lbnQgKiA4KSkgJiAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGVuZ3RoKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gcC0+bGVuOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5Q2FjaGVJZHgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDYWNoZUlkeCk7CisgIFNCX0RDSEVDSyhwLT5hcmdiX29yX2Rpc3RhbmNlIDwgKDFVIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSk7CisgIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5RGlzdGFuY2UoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDb3B5KTsKKyAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMSGFzaENoYWluCisKKyNkZWZpbmUgSEFTSF9CSVRTIDE4CisjZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCisKKy8vIElmIHlvdSBjaGFuZ2UgdGhpcywgeW91IG5lZWQgTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA8PSAzMiBhcyBpdAorLy8gaXMgdXNlZCBpbiBWUDhMSGFzaENoYWluLgorI2RlZmluZSBNQVhfTEVOR1RIX0JJVFMgMTIKKyNkZWZpbmUgV0lORE9XX1NJWkVfQklUUyAyMAorLy8gV2Ugd2FudCB0aGUgbWF4IHZhbHVlIHRvIGJlIGF0dGFpbmFibGUgYW5kIHN0b3JlZCBpbiBNQVhfTEVOR1RIX0JJVFMgYml0cy4KKyNkZWZpbmUgTUFYX0xFTkdUSCAoKDEgPDwgTUFYX0xFTkdUSF9CSVRTKSAtIDEpCisjaWYgTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA+IDMyCisjZXJyb3IgIk1BWF9MRU5HVEhfQklUUyArIFdJTkRPV19TSVpFX0JJVFMgPiAzMiIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBWUDhMSGFzaENoYWluIFZQOExIYXNoQ2hhaW47CitzdHJ1Y3QgVlA4TEhhc2hDaGFpbiB7CisgIC8vIFRoZSAyMCBtb3N0IHNpZ25pZmljYW50IGJpdHMgY29udGFpbiB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBiZXN0IG1hdGNoCisgIC8vIGlzIGZvdW5kLiBUaGVzZSAyMCBiaXRzIGFyZSB0aGUgbGltaXQgZGVmaW5lZCBieSBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluCisgIC8vICh0aHJvdWdoIFdJTkRPV19TSVpFID0gMTw8MjApLgorICAvLyBUaGUgbG93ZXIgMTIgYml0cyBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBUaGUgMTIgYml0IGxpbWl0IGlzCisgIC8vIGRlZmluZWQgaW4gTWF4RmluZENvcHlMZW5ndGggd2l0aCBNQVhfTEVOR1RIPTQwOTYuCisgIHVpbnQzMl90KiBvZmZzZXRfbGVuZ3RoXzsKKyAgLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBoYXNoX2NoYWluIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLgorICAvLyBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgcGl4ZWwgY291bnQgKHdpZHRoIHggaGVpZ2h0KSBmb3IgYSBnaXZlbiBpbWFnZS4KKyAgaW50IHNpemVfOworfTsKKworLy8gTXVzdCBiZSBjYWxsZWQgZmlyc3QsIHRvIHNldCBzaXplLgoraW50IFZQOExIYXNoQ2hhaW5Jbml0KFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsIGludCBzaXplKTsKKy8vIFByZS1jb21wdXRlIHRoZSBiZXN0IG1hdGNoZXMgZm9yIGFyZ2IuCitpbnQgVlA4TEhhc2hDaGFpbkZpbGwoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dfZWZmb3J0KTsKK3ZvaWQgVlA4TEhhc2hDaGFpbkNsZWFyKFZQOExIYXNoQ2hhaW4qIGNvbnN0IHApOyAgLy8gcmVsZWFzZSBtZW1vcnkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGFzaENoYWluRmluZE9mZnNldChjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFzZV9wb3NpdGlvbikgeworICByZXR1cm4gcC0+b2Zmc2V0X2xlbmd0aF9bYmFzZV9wb3NpdGlvbl0gPj4gTUFYX0xFTkdUSF9CSVRTOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExIYXNoQ2hhaW5GaW5kTGVuZ3RoKGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXNlX3Bvc2l0aW9uKSB7CisgIHJldHVybiBwLT5vZmZzZXRfbGVuZ3RoX1tiYXNlX3Bvc2l0aW9uXSAmICgoMVUgPDwgTUFYX0xFTkdUSF9CSVRTKSAtIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMSGFzaENoYWluRmluZENvcHkoY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG9mZnNldF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZW5ndGhfcHRyKSB7CisgICpvZmZzZXRfcHRyID0gVlA4TEhhc2hDaGFpbkZpbmRPZmZzZXQocCwgYmFzZV9wb3NpdGlvbik7CisgICpsZW5ndGhfcHRyID0gVlA4TEhhc2hDaGFpbkZpbmRMZW5ndGgocCwgYmFzZV9wb3NpdGlvbik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMQmFja3dhcmRSZWZzIChibG9jay1iYXNlZCBiYWNrd2FyZC1yZWZlcmVuY2VzIHN0b3JhZ2UpCisKKy8vIG1heGltdW0gbnVtYmVyIG9mIHJlZmVyZW5jZSBibG9ja3MgdGhlIGltYWdlIHdpbGwgYmUgc2VnbWVudGVkIGludG8KKyNkZWZpbmUgTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFIDE2CisKK3R5cGVkZWYgc3RydWN0IFBpeE9yQ29weUJsb2NrIFBpeE9yQ29weUJsb2NrOyAgIC8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3R5cGVkZWYgc3RydWN0IFZQOExCYWNrd2FyZFJlZnMgVlA4TEJhY2t3YXJkUmVmczsKKworLy8gQ29udGFpbmVyIGZvciBibG9ja3MgY2hhaW4KK3N0cnVjdCBWUDhMQmFja3dhcmRSZWZzIHsKKyAgaW50IGJsb2NrX3NpemVfOyAgICAgICAgICAgICAgIC8vIGNvbW1vbiBibG9jay1zaXplCisgIGludCBlcnJvcl87ICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBpZiBzb21lIG1lbW9yeSBlcnJvciBvY2N1cnJlZAorICBQaXhPckNvcHlCbG9jayogcmVmc187ICAgICAgICAgLy8gbGlzdCBvZiBjdXJyZW50bHkgdXNlZCBibG9ja3MKKyAgUGl4T3JDb3B5QmxvY2sqKiB0YWlsXzsgICAgICAgIC8vIGZvciBsaXN0IHJlY3ljbGluZworICBQaXhPckNvcHlCbG9jayogZnJlZV9ibG9ja3NfOyAgLy8gZnJlZS1saXN0CisgIFBpeE9yQ29weUJsb2NrKiBsYXN0X2Jsb2NrXzsgICAvLyB1c2VkIGZvciBhZGRpbmcgbmV3IHJlZnMgKGludGVybmFsKQorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiAnYmxvY2tfc2l6ZScgaXMgdGhlIGNvbW1vbiBibG9jayBzaXplIHRvIHN0b3JlCisvLyByZWZlcmVuY2VzICh0eXBpY2FsbHksIHdpZHRoICogaGVpZ2h0IC8gTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFKS4KK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0luaXQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGJsb2NrX3NpemUpOworLy8gUmVsZWFzZSBtZW1vcnkgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZXMuCit2b2lkIFZQOExCYWNrd2FyZFJlZnNDbGVhcihWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKKworLy8gQ3Vyc29yIGZvciBpdGVyYXRpbmcgb24gcmVmZXJlbmNlcyBjb250ZW50Cit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIHB1YmxpYzoKKyAgUGl4T3JDb3B5KiBjdXJfcG9zOyAgICAgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbgorICAvLyBwcml2YXRlOgorICBQaXhPckNvcHlCbG9jayogY3VyX2Jsb2NrXzsgICAvLyBjdXJyZW50IGJsb2NrIGluIHRoZSByZWZzIGxpc3QKKyAgY29uc3QgUGl4T3JDb3B5KiBsYXN0X3Bvc187ICAgLy8gc2VudGluZWwgZm9yIHN3aXRjaGluZyB0byBuZXh0IGJsb2NrCit9IFZQOExSZWZzQ3Vyc29yOworCisvLyBSZXR1cm5zIGEgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmZXJlbmNlcyBsaXN0LgorVlA4TFJlZnNDdXJzb3IgVlA4TFJlZnNDdXJzb3JJbml0KGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOworLy8gUmV0dXJucyB0cnVlIGlmIGN1cnNvciBpcyBwb2ludGluZyBhdCBhIHZhbGlkIHBvc2l0aW9uLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMUmVmc0N1cnNvck9rKGNvbnN0IFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIHJldHVybiAoYy0+Y3VyX3BvcyAhPSBOVUxMKTsKK30KKy8vIE1vdmUgdG8gbmV4dCBibG9jayBvZiByZWZlcmVuY2VzLiBJbnRlcm5hbCwgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4KK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpOworLy8gTW92ZSB0byBuZXh0IHBvc2l0aW9uLCBvciBOVUxMLiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiAhVlA4TFJlZnNDdXJzb3JPaygpLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0KFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIFNCX0RDSEVDSyhjICE9IE5VTEwpOworICBTQl9EQ0hFQ0soVlA4TFJlZnNDdXJzb3JPayhjKSk7CisgIGlmICgrK2MtPmN1cl9wb3MgPT0gYy0+bGFzdF9wb3NfKSBWUDhMUmVmc0N1cnNvck5leHRCbG9jayhjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnRzCisKK2VudW0gVlA4TExaNzdUeXBlIHsKKyAga0xaNzdTdGFuZGFyZCA9IDEsCisgIGtMWjc3UkxFID0gMiwKKyAga0xaNzdCb3ggPSA0Cit9OworCisvLyBFdmFsdWF0ZXMgYmVzdCBwb3NzaWJsZSBiYWNrd2FyZCByZWZlcmVuY2VzIGZvciBzcGVjaWZpZWQgcXVhbGl0eS4KKy8vIFRoZSBpbnB1dCBjYWNoZV9iaXRzIHRvICdWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzJyBzZXRzIHRoZSBtYXhpbXVtIGNhY2hlCisvLyBiaXRzIHRvIHVzZSAocGFzc2luZyAwIGltcGxpZXMgZGlzYWJsaW5nIHRoZSBsb2NhbCBjb2xvciBjYWNoZSkuCisvLyBUaGUgb3B0aW1hbCBjYWNoZSBiaXRzIGlzIGV2YWx1YXRlZCBhbmQgc2V0IGZvciB0aGUgKmNhY2hlX2JpdHMgcGFyYW1ldGVyLgorLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmVzdCBvZiB0aGUgdHdvIGJhY2t3YXJkIHJlZnMgdml6LAorLy8gcmVmc1swXSBvciByZWZzWzFdLgorVlA4TEJhY2t3YXJkUmVmcyogVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgbG93X2VmZm9ydCwgaW50IGx6NzdfdHlwZXNfdG9fdHJ5LCBpbnQqIGNvbnN0IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAxLAorICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19FTkNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29uZmlnX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb25maWdfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0ODI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29uZmlnX2VuYy5jCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29kaW5nIHRvb2xzIGNvbmZpZ3VyYXRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBDb25maWcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQcmVzZXQgcHJlc2V0LCBmbG9hdCBxdWFsaXR5LCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCisgIH0KKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBjb25maWctPnF1YWxpdHkgPSBxdWFsaXR5OworICBjb25maWctPnRhcmdldF9zaXplID0gMDsKKyAgY29uZmlnLT50YXJnZXRfUFNOUiA9IDAuOworICBjb25maWctPm1ldGhvZCA9IDQ7CisgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gNTA7CisgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gNjA7ICAgLy8gbWlkLWZpbHRlcmluZworICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSAwOworICBjb25maWctPmZpbHRlcl90eXBlID0gMTsgICAgICAgIC8vIGRlZmF1bHQ6IHN0cm9uZyAoc28gVS9WIGlzIGZpbHRlcmVkIHRvbykKKyAgY29uZmlnLT5wYXJ0aXRpb25zID0gMDsKKyAgY29uZmlnLT5zZWdtZW50cyA9IDQ7CisgIGNvbmZpZy0+cGFzcyA9IDE7CisgIGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID0gMDsKKyAgY29uZmlnLT5wcmVwcm9jZXNzaW5nID0gMDsKKyAgY29uZmlnLT5hdXRvZmlsdGVyID0gMDsKKyAgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPSAwOworICBjb25maWctPmFscGhhX2NvbXByZXNzaW9uID0gMTsKKyAgY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPSAxOworICBjb25maWctPmFscGhhX3F1YWxpdHkgPSAxMDA7CisgIGNvbmZpZy0+bG9zc2xlc3MgPSAwOworICBjb25maWctPmV4YWN0ID0gMDsKKyAgY29uZmlnLT5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX0RFRkFVTFQ7CisgIGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPSAwOworICBjb25maWctPnRocmVhZF9sZXZlbCA9IDA7CisgIGNvbmZpZy0+bG93X21lbW9yeSA9IDA7CisgIGNvbmZpZy0+bmVhcl9sb3NzbGVzcyA9IDEwMDsKKyAgY29uZmlnLT51c2VfZGVsdGFfcGFsZXR0ZSA9IDA7CisgIGNvbmZpZy0+dXNlX3NoYXJwX3l1diA9IDA7CisKKyAgLy8gVE9ETyhza2FsKTogdHVuZS4KKyAgc3dpdGNoIChwcmVzZXQpIHsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BJQ1RVUkU6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzU7CisgICAgICBjb25maWctPnByZXByb2Nlc3NpbmcgJj0gfjI7ICAgLy8gbm8gZGl0aGVyaW5nCisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BIT1RPOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA4MDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDM7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDMwOworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nIHw9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0RSQVdJTkc6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDI1OworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNjsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0lDT046CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nICY9IH4yOyAgIC8vIG5vIGRpdGhlcmluZworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9URVhUOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAwOworICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAwOyAgIC8vIGRpc2FibGUgZmlsdGVyaW5nIHRvIHJldGFpbiBzaGFycG5lc3MKKyAgICAgIGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmPSB+MjsgICAvLyBubyBkaXRoZXJpbmcKKyAgICAgIGNvbmZpZy0+c2VnbWVudHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9ERUZBVUxUOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gV2ViUFZhbGlkYXRlQ29uZmlnKGNvbmZpZyk7Cit9CisKK2ludCBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnF1YWxpdHkgPCAwIHx8IGNvbmZpZy0+cXVhbGl0eSA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRhcmdldF9zaXplIDwgMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRhcmdldF9QU05SIDwgMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPm1ldGhvZCA8IDAgfHwgY29uZmlnLT5tZXRob2QgPiA2KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c2VnbWVudHMgPCAxIHx8IGNvbmZpZy0+c2VnbWVudHMgPiA0KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c25zX3N0cmVuZ3RoIDwgMCB8fCBjb25maWctPnNuc19zdHJlbmd0aCA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzIDwgMCB8fCBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPiA3KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+ZmlsdGVyX3R5cGUgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3R5cGUgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+YXV0b2ZpbHRlciA8IDAgfHwgY29uZmlnLT5hdXRvZmlsdGVyID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnBhc3MgPCAxIHx8IGNvbmZpZy0+cGFzcyA+IDEwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c2hvd19jb21wcmVzc2VkIDwgMCB8fCBjb25maWctPnNob3dfY29tcHJlc3NlZCA+IDEpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nIDwgMCB8fCBjb25maWctPnByZXByb2Nlc3NpbmcgPiA3KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cGFydGl0aW9ucyA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25zID4gMykgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnBhcnRpdGlvbl9saW1pdCA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiA8IDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPCAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA8IDAgfHwgY29uZmlnLT5hbHBoYV9xdWFsaXR5ID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bG9zc2xlc3MgPCAwIHx8IGNvbmZpZy0+bG9zc2xlc3MgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bmVhcl9sb3NzbGVzcyA8IDAgfHwgY29uZmlnLT5uZWFyX2xvc3NsZXNzID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+aW1hZ2VfaGludCA+PSBXRUJQX0hJTlRfTEFTVCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmVtdWxhdGVfanBlZ19zaXplIDwgMCB8fCBjb25maWctPmVtdWxhdGVfanBlZ19zaXplID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRocmVhZF9sZXZlbCA8IDAgfHwgY29uZmlnLT50aHJlYWRfbGV2ZWwgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bG93X21lbW9yeSA8IDAgfHwgY29uZmlnLT5sb3dfbWVtb3J5ID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmV4YWN0IDwgMCB8fCBjb25maWctPmV4YWN0ID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnVzZV9kZWx0YV9wYWxldHRlIDwgMCB8fCBjb25maWctPnVzZV9kZWx0YV9wYWxldHRlID4gMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb25maWctPnVzZV9zaGFycF95dXYgPCAwIHx8IGNvbmZpZy0+dXNlX3NoYXJwX3l1diA+IDEpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9MRVZFTCA5CisKKy8vIE1hcHBpbmcgYmV0d2VlbiAteiBsZXZlbCBhbmQgLW0gLyAtcSBwYXJhbWV0ZXIgc2V0dGluZ3MuCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdWludDhfdCBtZXRob2RfOworICB1aW50OF90IHF1YWxpdHlfOworfSBrTG9zc2xlc3NQcmVzZXRzW01BWF9MRVZFTCArIDFdID0geworICB7IDAsICAwIH0sIHsgMSwgMjAgfSwgeyAyLCAyNSB9LCB7IDMsIDMwIH0sIHsgMywgNTAgfSwKKyAgeyA0LCA1MCB9LCB7IDQsIDc1IH0sIHsgNCwgOTAgfSwgeyA1LCA5MCB9LCB7IDYsIDEwMCB9Cit9OworCitpbnQgV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KFdlYlBDb25maWcqIGNvbmZpZywgaW50IGxldmVsKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiBNQVhfTEVWRUwpIHJldHVybiAwOworICBjb25maWctPmxvc3NsZXNzID0gMTsKKyAgY29uZmlnLT5tZXRob2QgPSBrTG9zc2xlc3NQcmVzZXRzW2xldmVsXS5tZXRob2RfOworICBjb25maWctPnF1YWxpdHkgPSBrTG9zc2xlc3NQcmVzZXRzW2xldmVsXS5xdWFsaXR5XzsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3N2MxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuYwpAQCAtMCwwICsxLDM0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvc3QgdGFibGVzIGZvciBsZXZlbCBhbmQgbW9kZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGV2ZWwgY29zdCB0YWJsZXMKKworLy8gRm9yIGVhY2ggZ2l2ZW4gbGV2ZWwsIHRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgdGhlIHBhdHRlcm4gb2YgY29udGV4dHMgdG8KKy8vIHVzZSBmb3IgY29kaW5nIGl0IChpbiBbXVswXSkgYXMgd2VsbCBhcyB0aGUgYml0IHZhbHVlIHRvIHVzZSBmb3IgZWFjaAorLy8gY29udGV4dCAoaW4gW11bMV0pLgorY29uc3QgdWludDE2X3QgVlA4TGV2ZWxDb2Rlc1tNQVhfVkFSSUFCTEVfTEVWRUxdWzJdID0geworICAgICAgICAgICAgICAgICAgezB4MDAxLCAweDAwMH0sIHsweDAwNywgMHgwMDF9LCB7MHgwMGYsIDB4MDA1fSwKKyAgezB4MDBmLCAweDAwZH0sIHsweDAzMywgMHgwMDN9LCB7MHgwMzMsIDB4MDAzfSwgezB4MDMzLCAweDAyM30sCisgIHsweDAzMywgMHgwMjN9LCB7MHgwMzMsIDB4MDIzfSwgezB4MDMzLCAweDAyM30sIHsweDBkMywgMHgwMTN9LAorICB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwKKyAgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAorICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKKyAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDE1M30KK307CisKK3N0YXRpYyBpbnQgVmFyaWFibGVMZXZlbENvc3QoaW50IGxldmVsLCBjb25zdCB1aW50OF90IHByb2Jhc1tOVU1fUFJPQkFTXSkgeworICBpbnQgcGF0dGVybiA9IFZQOExldmVsQ29kZXNbbGV2ZWwgLSAxXVswXTsKKyAgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMV07CisgIGludCBjb3N0ID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDI7IHBhdHRlcm47ICsraSkgeworICAgIGlmIChwYXR0ZXJuICYgMSkgeworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KGJpdHMgJiAxLCBwcm9iYXNbaV0pOworICAgIH0KKyAgICBiaXRzID4+PSAxOworICAgIHBhdHRlcm4gPj49IDE7CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmUtY2FsYyBsZXZlbCBjb3N0cyBvbmNlIGZvciBhbGwKKwordm9pZCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSkgeworICBpbnQgY3R5cGUsIGJhbmQsIGN0eDsKKworICBpZiAoIXByb2JhLT5kaXJ0eV8pIHJldHVybjsgIC8vIG5vdGhpbmcgdG8gZG8uCisKKyAgZm9yIChjdHlwZSA9IDA7IGN0eXBlIDwgTlVNX1RZUEVTOyArK2N0eXBlKSB7CisgICAgaW50IG47CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IE5VTV9CQU5EUzsgKytiYW5kKSB7CisgICAgICBmb3IgKGN0eCA9IDA7IGN0eCA8IE5VTV9DVFg7ICsrY3R4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBwcm9iYS0+Y29lZmZzX1tjdHlwZV1bYmFuZF1bY3R4XTsKKyAgICAgICAgdWludDE2X3QqIGNvbnN0IHRhYmxlID0gcHJvYmEtPmxldmVsX2Nvc3RfW2N0eXBlXVtiYW5kXVtjdHhdOworICAgICAgICBjb25zdCBpbnQgY29zdDAgPSAoY3R4ID4gMCkgPyBWUDhCaXRDb3N0KDEsIHBbMF0pIDogMDsKKyAgICAgICAgY29uc3QgaW50IGNvc3RfYmFzZSA9IFZQOEJpdENvc3QoMSwgcFsxXSkgKyBjb3N0MDsKKyAgICAgICAgaW50IHY7CisgICAgICAgIHRhYmxlWzBdID0gVlA4Qml0Q29zdCgwLCBwWzFdKSArIGNvc3QwOworICAgICAgICBmb3IgKHYgPSAxOyB2IDw9IE1BWF9WQVJJQUJMRV9MRVZFTDsgKyt2KSB7CisgICAgICAgICAgdGFibGVbdl0gPSBjb3N0X2Jhc2UgKyBWYXJpYWJsZUxldmVsQ29zdCh2LCBwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTdGFydGluZyBhdCBsZXZlbCA2NyBhbmQgdXAsIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBjb3N0IGlzCisgICAgICAgIC8vIGFjdHVhbGx5IGNvbnN0YW50LgorICAgICAgfQorICAgIH0KKyAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgeyAgICAvLyByZXBsaWNhdGUgYmFuZHMuIFdlIGRvbid0IG5lZWQgdG8gc2VudGluZWwuCisgICAgICBmb3IgKGN0eCA9IDA7IGN0eCA8IE5VTV9DVFg7ICsrY3R4KSB7CisgICAgICAgIHByb2JhLT5yZW1hcHBlZF9jb3N0c19bY3R5cGVdW25dW2N0eF0gPQorICAgICAgICAgICAgcHJvYmEtPmxldmVsX2Nvc3RfW2N0eXBlXVtWUDhFbmNCYW5kc1tuXV1bY3R4XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJvYmEtPmRpcnR5XyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNb2RlIGNvc3QgdGFibGVzLgorCisvLyBUaGVzZSBhcmUgdGhlIGZpeGVkIHByb2JhYmlsaXRpZXMgKGluIHRoZSBjb2RpbmcgdHJlZXMpIHR1cm5lZCBpbnRvIGJpdC1jb3N0CisvLyBieSBjYWxsaW5nIFZQOEJpdENvc3QoKS4KK2NvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNVVls0XSA9IHsgMzAyLCA5ODQsIDQzOSwgNjQyIH07CisvLyBub3RlOiB0aGVzZSB2YWx1ZXMgaW5jbHVkZSB0aGUgZml4ZWQgVlA4Qml0Q29zdCgxLCAxNDUpIG1vZGUgc2VsZWN0aW9uIGNvc3QuCitjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTE2WzRdID0geyA2NjMsIDkxOSwgODcyLCA5MTkgfTsKK2NvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJNFtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXSA9IHsKKyAgeyB7ICAgNDAsIDExNTEsIDE3MjMsIDE4NzQsIDIxMDMsIDIwMTksIDE2MjgsIDE3NzcsIDIyMjYsIDIxMzcgfSwKKyAgICB7ICAxOTIsICA0NjksIDEyOTYsIDEzMDgsIDE4NDksIDE3OTQsIDE3ODEsIDE3MDMsIDE3MTMsIDE1MjIgfSwKKyAgICB7ICAxNDIsICA5MTAsICA3NjIsIDE2ODQsIDE4NDksIDE1NzYsIDE0NjAsIDEzMDUsIDE4MDEsIDE2NTcgfSwKKyAgICB7ICA1NTksICA2NDEsIDEzNzAsICA0MjEsIDExODIsIDE1NjksIDE2MTIsIDE3MjUsICA4NjMsIDEwMDcgfSwKKyAgICB7ICAyOTksIDEwNTksIDEyNTYsIDExMDgsICA2MzYsIDEwNjgsIDE1ODEsIDE4ODMsICA4NjksIDExNDIgfSwKKyAgICB7ICAyNzcsIDExMTEsICA3MDcsIDEzNjIsIDEwODksICA2NzIsIDE2MDMsIDE1NDEsIDE1NDUsIDEyOTEgfSwKKyAgICB7ICAyMTQsICA3ODEsIDE2MDksIDEzMDMsIDE2MzIsIDIyMjksICA3MjYsIDE1NjAsIDE3MTMsICA5MTggfSwKKyAgICB7ICAxNTIsIDEwMzcsIDEwNDYsIDE3NTksIDE5ODMsIDIxNzQsIDEzNTgsICA3NDIsIDE3NDAsIDEzOTAgfSwKKyAgICB7ICA1MTIsIDEwNDYsIDE0MjAsICA3NTMsICA3NTIsIDEyOTcsIDE0ODYsIDE2MTMsICA0NjAsIDEyMDcgfSwKKyAgICB7ICA0MjQsICA4MjcsIDEzNjIsICA3MTksIDE0NjIsIDEyMDIsIDExOTksIDE0NzYsIDExOTksICA1MzggfSB9LAorICB7IHsgIDI0MCwgIDQwMiwgMTEzNCwgMTQ5MSwgMTY1OSwgMTUwNSwgMTUxNywgMTU1NSwgMTk3OSwgMjA5OSB9LAorICAgIHsgIDQ2NywgIDI0MiwgIDk2MCwgMTIzMiwgMTcxNCwgMTYyMCwgMTgzNCwgMTU3MCwgMTY3NiwgMTM5MSB9LAorICAgIHsgIDUwMCwgIDQ1NSwgIDQ2MywgMTUwNywgMTY5OSwgMTI4MiwgMTU2NCwgIDk4MiwgMjExNCwgMjExNCB9LAorICAgIHsgIDY3MiwgIDY0MywgMTM3MiwgIDMzMSwgMTU4OSwgMTY2NywgMTQ1MywgMTkzOCwgIDk5NiwgIDg3NiB9LAorICAgIHsgIDQ1OCwgIDc4MywgMTAzNywgIDkxMSwgIDczOCwgIDk2OCwgMTE2NSwgMTUxOCwgIDg1OSwgMTAzMyB9LAorICAgIHsgIDUwNCwgIDgxNSwgIDUwNCwgMTEzOSwgMTIxOSwgIDcxOSwgMTUwNiwgMTA4NSwgMTI2OCwgMTI2OCB9LAorICAgIHsgIDMzMywgIDYzMCwgMTQ0NSwgMTIzOSwgMTg4MywgMzY3MiwgIDc5OSwgMTU0OCwgMTg2NSwgIDU5OCB9LAorICAgIHsgIDM5OSwgIDY0NCwgIDc0NiwgMTM0MiwgMTg1NiwgMTM1MCwgMTQ5MywgIDYxMywgMTg1NSwgMTAxNSB9LAorICAgIHsgIDYyMiwgIDc0OSwgMTIwNSwgIDYwOCwgMTA2NiwgMTQwOCwgMTI5MCwgMTQwNiwgIDU0NiwgIDk3MSB9LAorICAgIHsgIDUwMCwgIDc1MywgMTA0MSwgIDY2OCwgMTIzMCwgMTYxNywgMTI5NywgMTQyNSwgMTM4MywgIDUyMyB9IH0sCisgIHsgeyAgMzk0LCAgNTUzLCAgNTIzLCAxNTAyLCAxNTM2LCAgOTgxLCAxNjA4LCAxMTQyLCAxNjY2LCAyMTgxIH0sCisgICAgeyAgNjU1LCAgNDMwLCAgMzc1LCAxNDExLCAxODYxLCAxMjIwLCAxNjc3LCAxMTM1LCAxOTc4LCAxNTUzIH0sCisgICAgeyAgNjkwLCAgNjQwLCAgMjQ1LCAxOTU0LCAyMDcwLCAxMTk0LCAxNTI4LCAgOTgyLCAxOTcyLCAyMjMyIH0sCisgICAgeyAgNTU5LCAgODM0LCAgNzQxLCAgODY3LCAxMTMxLCAgOTgwLCAxMjI1LCAgODUyLCAxMDkyLCAgNzg0IH0sCisgICAgeyAgNjkwLCAgODc1LCAgNTE2LCAgOTU5LCAgNjczLCAgODk0LCAxMDU2LCAxMTkwLCAxNTI4LCAxMTI2IH0sCisgICAgeyAgNzQwLCAgOTUxLCAgMzg0LCAxMjc3LCAxMTc3LCAgNDkyLCAxNTc5LCAxMTU1LCAxODQ2LCAxNTEzIH0sCisgICAgeyAgMzIzLCAgNzc1LCAxMDYyLCAxNzc2LCAzMDYyLCAxMjc0LCAgODEzLCAxMTg4LCAxMzcyLCAgNjU1IH0sCisgICAgeyAgNDg4LCAgOTcxLCAgNDg0LCAxNzY3LCAxNTE1LCAxNzc1LCAxMTE1LCAgNTAzLCAxNTM5LCAxNDYxIH0sCisgICAgeyAgNzQwLCAxMDA2LCAgOTk4LCAgNzA5LCAgODUxLCAxMjMwLCAxMzM3LCAgNzg4LCAgNzQxLCAgNzIxIH0sCisgICAgeyAgNTIyLCAxMDczLCAgNTczLCAxMDQ1LCAxMzQ2LCAgODg3LCAxMDQ2LCAxMTQ2LCAxMjAzLCAgNjk3IH0gfSwKKyAgeyB7ICAxMDUsICA4NjQsIDE0NDIsIDEwMDksIDE5MzQsIDE4NDAsIDE1MTksIDE5MjAsIDE2NzMsIDE1NzkgfSwKKyAgICB7ICA1MzQsICAzMDUsIDExOTMsICA2ODMsIDEzODgsIDIxNjQsIDE4MDIsIDE4OTQsIDEyNjQsIDExNzAgfSwKKyAgICB7ICAzMDUsICA1MTgsICA4NzcsIDExMDgsIDE0MjYsIDMyMTUsIDE0MjUsIDEwNjQsIDEzMjAsIDEyNDIgfSwKKyAgICB7ICA2ODMsICA3MzIsIDE5MjcsICAyNTcsIDE0OTMsIDIwNDgsIDE4NTgsIDE1NTIsIDEwNTUsICA5NDcgfSwKKyAgICB7ICAzOTQsICA4MTQsIDEwMjQsICA2NjAsICA5NTksIDE1NTYsIDEyODIsIDEyODksICA4OTMsIDEwNDcgfSwKKyAgICB7ICA1MjgsICA2MTUsICA5OTYsICA5NDAsIDEyMDEsICA2MzUsIDEwOTQsIDI1MTUsICA4MDMsIDEzNTggfSwKKyAgICB7ICAzNDcsICA2MTQsIDE2MDksIDExODcsIDMxMzMsIDEzNDUsIDEwMDcsIDEzMzksIDEwMTcsICA2NjcgfSwKKyAgICB7ICAyMTgsICA3NDAsICA4NzgsIDE2MDUsIDM2NTAsIDM2NTAsIDEzNDUsICA3NTgsIDEzNTcsIDE2MTcgfSwKKyAgICB7ICA2NzIsICA3NTAsIDE1NDEsICA1NTgsIDEyNTcsIDE1OTksIDE4NzAsIDIxMzUsICA0MDIsIDEwODcgfSwKKyAgICB7ICA1OTIsICA2ODQsIDExNjEsICA0MzAsIDEwOTIsIDE0OTcsIDE0NzUsIDE0ODksIDEwOTUsICA4MjIgfSB9LAorICB7IHsgIDIyOCwgMTA1NiwgMTA1OSwgMTM2OCwgIDc1MiwgIDk4MiwgMTUxMiwgMTUxOCwgIDk4NywgMTc4MiB9LAorICAgIHsgIDQ5NCwgIDUxNCwgIDgxOCwgIDk0MiwgIDk2NSwgIDg5MiwgMTYxMCwgMTM1NiwgMTA0OCwgMTM2MyB9LAorICAgIHsgIDUxMiwgIDY0OCwgIDU5MSwgMTA0MiwgIDc2MSwgIDk5MSwgMTE5NiwgMTQ1NCwgMTMwOSwgMTQ2MyB9LAorICAgIHsgIDY4MywgIDc0OSwgMTA0MywgIDY3NiwgIDg0MSwgMTM5NiwgMTEzMywgMTEzOCwgIDY1NCwgIDkzOSB9LAorICAgIHsgIDYyMiwgMTEwMSwgMTEyNiwgIDk5NCwgIDM2MSwgMTA3NywgMTIwMywgMTMxOCwgIDg3NywgMTIxOSB9LAorICAgIHsgIDYzMSwgMTA2OCwgIDg1NywgMTY1MCwgIDY1MSwgIDQ3NywgMTY1MCwgMTQxOSwgIDgyOCwgMTE3MCB9LAorICAgIHsgIDU1NSwgIDcyNywgMTA2OCwgMTMzNSwgMzEyNywgMTMzOSwgIDgyMCwgMTMzMSwgMTA3NywgIDQyOSB9LAorICAgIHsgIDUwNCwgIDg3OSwgIDYyNCwgMTM5OCwgIDg4OSwgIDg4OSwgMTM5MiwgIDgwOCwgIDg5MSwgMTQwNiB9LAorICAgIHsgIDY4MywgMTYwMiwgMTI4OSwgIDk3NywgIDU3OCwgIDk4MywgMTI4MCwgMTcwOCwgIDQwNiwgMTEyMiB9LAorICAgIHsgIDM5OSwgIDg2NSwgMTQzMywgMTA3MCwgMTA3MiwgIDc2NCwgIDk2OCwgMTQ3NywgMTIyMywgIDY3OCB9IH0sCisgIHsgeyAgMzMzLCAgNzYwLCAgOTM1LCAxNjM4LCAxMDEwLCAgNTI5LCAxNjQ2LCAxNDEwLCAxNDcyLCAyMjE5IH0sCisgICAgeyAgNTEyLCAgNDk0LCAgNzUwLCAxMTYwLCAxMjE1LCAgNjEwLCAxODcwLCAxODY4LCAxNjI4LCAxMTY5IH0sCisgICAgeyAgNTcyLCAgNjQ2LCAgNDkyLCAxOTM0LCAxMjA4LCAgNjAzLCAxNTgwLCAxMDk5LCAxMzk4LCAxOTk1IH0sCisgICAgeyAgNzg2LCAgNzg5LCAgOTQyLCAgNTgxLCAxMDE4LCAgOTUxLCAxNTk5LCAxMjA3LCAgNzMxLCAgNzY4IH0sCisgICAgeyAgNjkwLCAxMDE1LCAgNjcyLCAxMDc4LCAgNTgyLCAgNTA0LCAxNjkzLCAxNDM4LCAxMTA4LCAyODk3IH0sCisgICAgeyAgNzY4LCAxMjY3LCAgNTcxLCAyMDA1LCAxMjQzLCAgMjQ0LCAyODgxLCAxMzgwLCAxNzg2LCAxNDUzIH0sCisgICAgeyAgNDUyLCAgODk5LCAxMjkzLCAgOTAzLCAxMzExLCAzMTAwLCAgNDY1LCAxMzExLCAxMzE5LCAgODEzIH0sCisgICAgeyAgMzk0LCAgOTI3LCAgOTQyLCAxMTAzLCAxMzU4LCAxMTA0LCAgOTQ2LCAgNTkzLCAxMzYzLCAxMTA5IH0sCisgICAgeyAgNTU5LCAxMDA1LCAxMDA3LCAxMDE2LCAgNjU4LCAxMTczLCAxMDIxLCAxMTY0LCAgNjIzLCAxMDI4IH0sCisgICAgeyAgNTY0LCAgNzk2LCAgNjMyLCAxMDA1LCAxMDE0LCAgODYzLCAyMzE2LCAxMjY4LCAgOTM4LCAgNzY0IH0gfSwKKyAgeyB7ICAyNjYsICA2MDYsIDEwOTgsIDEyMjgsIDE0OTcsIDEyNDMsICA5NDgsIDEwMzAsIDE3MzQsIDE0NjEgfSwKKyAgICB7ICAzNjYsICA1ODUsICA5MDEsIDEwNjAsIDE0MDcsIDEyNDcsICA4NzYsIDExMzQsIDE2MjAsIDEwNTQgfSwKKyAgICB7ICA0NTIsICA1NjUsICA1NDIsIDE3MjksIDE0NzksIDE0NzksIDEwMTYsICA4ODYsIDI5MzgsIDExNTAgfSwKKyAgICB7ICA1NTUsIDEwODgsIDE1MzMsICA5NTAsIDEzNTQsICA4OTUsICA4MzQsIDEwMTksIDEwMjEsICA0OTYgfSwKKyAgICB7ICA3MDQsICA4MTUsIDExOTMsICA5NzEsICA5NzMsICA2NDAsIDEyMTcsIDIyMTQsICA4MzIsICA1NzggfSwKKyAgICB7ICA2NzIsIDEyNDUsICA1NzksICA4NzEsICA4NzUsICA3NzQsICA4NzIsIDEyNzMsIDEwMjcsICA5NDkgfSwKKyAgICB7ICAyOTYsIDExMzQsIDIwNTAsIDE3ODQsIDE2MzYsIDM0MjUsICA0NDIsIDE1NTAsIDIwNzYsICA3MjIgfSwKKyAgICB7ICAzNDIsICA5ODIsIDEyNTksIDE4NDYsIDE4NDgsIDE4NDgsICA2MjIsICA1NjgsIDE4NDcsIDEwNTIgfSwKKyAgICB7ICA1NTUsIDEwNjQsIDEzMDQsICA4MjgsICA3NDYsIDEzNDMsIDEwNzUsIDEzMjksIDEwNzgsICA0OTQgfSwKKyAgICB7ICAyODgsIDExNjcsIDEyODUsIDExNzQsIDE2MzksIDE2MzksICA4MzMsIDIyNTQsIDEzMDQsICA1MDkgfSB9LAorICB7IHsgIDM0MiwgIDcxOSwgIDc2NywgMTg2NiwgMTc1NywgMTI3MCwgMTI0NiwgIDU1MCwgMTc0NiwgMjE1MSB9LAorICAgIHsgIDQ4MywgIDY1MywgIDY5NCwgMTUwOSwgMTQ1OSwgMTQxMCwgMTIxOCwgIDUwNywgMTkxNCwgMTI2NiB9LAorICAgIHsgIDQ4OCwgIDc1NywgIDQ0NywgMjk3OSwgMTgxMywgMTI2OCwgMTY1NCwgIDUzOSwgMTg0OSwgMjEwOSB9LAorICAgIHsgIDUyMiwgMTA5NywgMTA4NSwgIDg1MSwgMTM2NSwgMTExMSwgIDg1MSwgIDkwMSwgIDk2MSwgIDYwNSB9LAorICAgIHsgIDcwOSwgIDcxNiwgIDg0MSwgIDcyOCwgIDczNiwgIDk0NSwgIDk0MSwgIDg2MiwgMjg0NSwgMTA1NyB9LAorICAgIHsgIDUxMiwgMTMyMywgIDUwMCwgMTMzNiwgMTA4MywgIDY4MSwgMTM0MiwgIDcxNywgMTYwNCwgMTM1MCB9LAorICAgIHsgIDQ1MiwgMTE1NSwgMTM3MiwgMTkwMCwgMTUwMSwgMzI5MCwgIDMxMSwgIDk0NCwgMTkxOSwgIDkyMiB9LAorICAgIHsgIDQwMywgMTUyMCwgIDk3NywgMjEzMiwgMTczMywgMzUyMiwgMTA3NiwgIDI3NiwgMzMzNSwgMTU0NyB9LAorICAgIHsgIDU1OSwgMTM3NCwgMTEwMSwgIDYxNSwgIDY3MywgMjQ2MiwgIDk3NCwgIDc5NSwgIDk4NCwgIDk4NCB9LAorICAgIHsgIDU0NywgMTEyMiwgMTA2MiwgIDgxMiwgMTQxMCwgIDk1MSwgMTE0MCwgIDYyMiwgMTI2OCwgIDY1MSB9IH0sCisgIHsgeyAgMTY1LCAgOTgyLCAxMjM1LCAgOTM4LCAxMzM0LCAxMzY2LCAxNjU5LCAxNTc4LCAgOTY0LCAxNjEyIH0sCisgICAgeyAgNTkyLCAgNDIyLCAgOTI1LCAgODQ3LCAxMTM5LCAxMTEyLCAxMzg3LCAyMDM2LCAgODYxLCAxMDQxIH0sCisgICAgeyAgNDAzLCAgODM3LCAgNzMyLCAgNzcwLCAgOTQxLCAxNjU4LCAxMjUwLCAgODA5LCAxNDA3LCAxNDA3IH0sCisgICAgeyAgODk2LCAgODc0LCAxMDcxLCAgMzgxLCAxNTY4LCAxNzIyLCAxNDM3LCAyMTkyLCAgNDgwLCAxMDM1IH0sCisgICAgeyAgNjQwLCAxMDk4LCAxMDEyLCAxMDMyLCAgNjg0LCAxMzgyLCAxNTgxLCAyMTA2LCAgNDE2LCAgODY1IH0sCisgICAgeyAgNTU5LCAxMDA1LCAgODE5LCAgOTE0LCAgNzEwLCAgNzcwLCAxNDE4LCAgOTIwLCAgODM4LCAxNDM1IH0sCisgICAgeyAgNDE1LCAxMjU4LCAxMjQ1LCAgODcwLCAxMjc4LCAzMDY3LCAgNzcwLCAxMDIxLCAxMjg3LCAgNTIyIH0sCisgICAgeyAgNDA2LCAgOTkwLCAgNjAxLCAxMDA5LCAxMjY1LCAxMjY1LCAxMjY3LCAgNzU5LCAxMDE3LCAxMjc3IH0sCisgICAgeyAgOTY4LCAxMTgyLCAxMzI5LCAgNzg4LCAxMDMyLCAxMjkyLCAxNzA1LCAxNzE0LCAgMjAzLCAxNDAzIH0sCisgICAgeyAgNzMyLCAgODc3LCAxMjc5LCAgNDcxLCAgOTAxLCAxMTYxLCAxNTQ1LCAxMjk0LCAgNzU1LCAgNzU1IH0gfSwKKyAgeyB7ICAxMTEsICA5MzEsIDEzNzgsIDExODUsIDE5MzMsIDE2NDgsIDExNDgsIDE3MTQsIDE4NzMsIDEzMDcgfSwKKyAgICB7ICA0MDYsICA0MTQsIDEwMzAsIDEwMjMsIDE5MTAsIDE0MDQsIDEzMTMsIDE2NDcsIDE1MDksICA3OTMgfSwKKyAgICB7ICAzNDIsICA2NDAsICA1NzUsIDEwODgsIDEyNDEsIDEzNDksIDExNjEsIDEzNTAsIDE3NTYsIDE1MDIgfSwKKyAgICB7ICA1NTksICA3NjYsIDExODUsICAzNTcsIDE2ODIsIDE0MjgsIDEzMjksIDE4OTcsIDEyMTksICA4MDIgfSwKKyAgICB7ICA0NzMsICA5MDksIDExNjQsICA3NzEsICA3MTksIDI1MDgsIDE0MjcsIDE0MzIsICA3MjIsICA3ODIgfSwKKyAgICB7ICAzNDIsICA4OTIsICA3ODUsIDExNDUsIDExNTAsICA3OTQsIDEyOTYsIDE1NTAsICA5NzMsIDEwNTcgfSwKKyAgICB7ICAyMDgsIDEwMzYsIDEzMjYsIDEzNDMsIDE2MDYsIDMzOTUsICA4MTUsIDE0NTUsIDE2MTgsICA3MTIgfSwKKyAgICB7ICAyMjgsICA5MjgsICA4OTAsIDEwNDYsIDM0OTksIDE3MTEsICA5OTQsICA4MjksIDE3MjAsIDEzMTggfSwKKyAgICB7ICA3NjgsICA3MjQsIDEwNTgsICA2MzYsICA5OTEsIDEwNzUsIDEzMTksIDEzMjQsICA2MTYsICA4MjUgfSwKKyAgICB7ICAzMDUsIDExNjcsIDEzNTgsICA4OTksIDE1ODcsIDE1ODcsICA5ODcsIDE5ODgsIDEzMzIsICA1MDEgfSB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVzaWR1YWxzIHN0cnVjdCBWUDhSZXNpZHVhbC4KKwordm9pZCBWUDhJbml0UmVzaWR1YWwoaW50IGZpcnN0LCBpbnQgY29lZmZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICByZXMtPmNvZWZmX3R5cGUgPSBjb2VmZl90eXBlOworICByZXMtPnByb2IgID0gZW5jLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5zdGF0cyA9IGVuYy0+cHJvYmFfLnN0YXRzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5jb3N0cyA9IGVuYy0+cHJvYmFfLnJlbWFwcGVkX2Nvc3RzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5maXJzdCA9IGZpcnN0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9kZSBjb3N0cworCitpbnQgVlA4R2V0Q29zdEx1bWE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgaW50MTZfdCBsZXZlbHNbMTZdKSB7CisgIGNvbnN0IGludCB4ID0gKGl0LT5pNF8gJiAzKSwgeSA9IChpdC0+aTRfID4+IDIpOworICBWUDhSZXNpZHVhbCByZXM7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgUiA9IDA7CisgIGludCBjdHg7CisKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyhsZXZlbHMsICZyZXMpOworICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOworICByZXR1cm4gUjsKK30KKworaW50IFZQOEdldENvc3RMdW1hMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGludCB4LCB5OworICBpbnQgUiA9IDA7CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOyAgIC8vIHJlLWltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAorCisgIC8vIERDCisgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisKKyAgLy8gQUMKKyAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSAocmVzLmxhc3QgPj0gMCk7CisgICAgfQorICB9CisgIHJldHVybiBSOworfQorCitpbnQgVlA4R2V0Q29zdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBWUDhSZXNpZHVhbCByZXM7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgY2gsIHgsIHk7CisgIGludCBSID0gMDsKKworICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAvLyByZS1pbXBvcnQgdGhlIG5vbi16ZXJvIGNvbnRleHQKKworICBWUDhJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKKyAgICAgICAgUiArPSBWUDhHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKKyAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPSAocmVzLmxhc3QgPj0gMCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBSOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZWNvcmRpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcy4KKworLy8gV2Uga2VlcCB0aGUgdGFibGUtZnJlZSB2YXJpYW50IGFyb3VuZCBmb3IgcmVmZXJlbmNlLCBpbiBjYXNlLgorI2RlZmluZSBVU0VfTEVWRUxfQ09ERV9UQUJMRQorCisvLyBTaW11bGF0ZSBibG9jayBjb2RpbmcsIGJ1dCBvbmx5IHJlY29yZCBzdGF0aXN0aWNzLgorLy8gTm90ZTogbm8gbmVlZCB0byByZWNvcmQgdGhlIGZpeGVkIHByb2Jhcy4KK2ludCBWUDhSZWNvcmRDb2VmZnMoaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07CisgIGlmIChyZXMtPmxhc3QgIDwgMCkgeworICAgIFZQOFJlY29yZFN0YXRzKDAsIHMgKyAwKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3aGlsZSAobiA8PSByZXMtPmxhc3QpIHsKKyAgICBpbnQgdjsKKyAgICBWUDhSZWNvcmRTdGF0cygxLCBzICsgMCk7ICAvLyBvcmRlciBvZiByZWNvcmQgZG9lc24ndCBtYXR0ZXIKKyAgICB3aGlsZSAoKHYgPSByZXMtPmNvZWZmc1tuKytdKSA9PSAwKSB7CisgICAgICBWUDhSZWNvcmRTdGF0cygwLCBzICsgMSk7CisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgfQorICAgIFZQOFJlY29yZFN0YXRzKDEsIHMgKyAxKTsKKyAgICBpZiAoIVZQOFJlY29yZFN0YXRzKDJ1IDwgKHVuc2lnbmVkIGludCkodiArIDEpLCBzICsgMikpIHsgIC8vIHYgPSAtMSBvciAxCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgIHYgPSBhYnModik7CisjaWYgIWRlZmluZWQoVVNFX0xFVkVMX0NPREVfVEFCTEUpCisgICAgICBpZiAoIVZQOFJlY29yZFN0YXRzKHYgPiA0LCBzICsgMykpIHsKKyAgICAgICAgaWYgKFZQOFJlY29yZFN0YXRzKHYgIT0gMiwgcyArIDQpKQorICAgICAgICAgIFZQOFJlY29yZFN0YXRzKHYgPT0gNCwgcyArIDUpOworICAgICAgfSBlbHNlIGlmICghVlA4UmVjb3JkU3RhdHModiA+IDEwLCBzICsgNikpIHsKKyAgICAgICAgVlA4UmVjb3JkU3RhdHModiA+IDYsIHMgKyA3KTsKKyAgICAgIH0gZWxzZSBpZiAoIVZQOFJlY29yZFN0YXRzKCh2ID49IDMgKyAoOCA8PCAyKSksIHMgKyA4KSkgeworICAgICAgICBWUDhSZWNvcmRTdGF0cygodiA+PSAzICsgKDggPDwgMSkpLCBzICsgOSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWUDhSZWNvcmRTdGF0cygodiA+PSAzICsgKDggPDwgMykpLCBzICsgMTApOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmICh2ID4gTUFYX1ZBUklBQkxFX0xFVkVMKSB7CisgICAgICAgIHYgPSBNQVhfVkFSSUFCTEVfTEVWRUw7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW3YgLSAxXVsxXTsKKyAgICAgICAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW3YgLSAxXVswXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IChwYXR0ZXJuID4+PSAxKSAhPSAwOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBpbnQgbWFzayA9IDIgPDwgaTsKKyAgICAgICAgICBpZiAocGF0dGVybiAmIDEpIFZQOFJlY29yZFN0YXRzKCEhKGJpdHMgJiBtYXNrKSwgcyArIDMgKyBpKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMl07CisgICAgfQorICB9CisgIGlmIChuIDwgMTYpIFZQOFJlY29yZFN0YXRzKDAsIHMgKyAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuaApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29zdCB0YWJsZXMgZm9yIGxldmVsIGFuZCBtb2Rlcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfRU5DX0NPU1RfRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0NPU1RfRU5DX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gT24tdGhlLWZseSBpbmZvIGFib3V0IHRoZSBjdXJyZW50IHNldCBvZiByZXNpZHVhbHMuIEhhbmR5IHRvIGF2b2lkCisvLyBwYXNzaW5nIHppbGxpb25zIG9mIHBhcmFtcy4KK3R5cGVkZWYgc3RydWN0IFZQOFJlc2lkdWFsIFZQOFJlc2lkdWFsOworc3RydWN0IFZQOFJlc2lkdWFsIHsKKyAgaW50IGZpcnN0OworICBpbnQgbGFzdDsKKyAgY29uc3QgaW50MTZfdCogY29lZmZzOworCisgIGludCBjb2VmZl90eXBlOworICBQcm9iYUFycmF5KiAgIHByb2I7CisgIFN0YXRzQXJyYXkqICAgc3RhdHM7CisgIENvc3RBcnJheVB0ciAgY29zdHM7Cit9OworCit2b2lkIFZQOEluaXRSZXNpZHVhbChpbnQgZmlyc3QsIGludCBjb2VmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKKworaW50IFZQOFJlY29yZENvZWZmcyhpbnQgY3R4LCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKKworLy8gUmVjb3JkIHByb2JhIGNvbnRleHQgdXNlZC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmVjb3JkU3RhdHMoaW50IGJpdCwgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKKyAgcHJvYmFfdCBwID0gKnN0YXRzOworICAvLyBBbiBvdmVyZmxvdyBpcyBpbmJvdW5kLiBOb3RlIHdlIGhhbmRsZSB0aGlzIGF0IDB4ZmZmZTAwMDB1IGluc3RlYWQgb2YKKyAgLy8gMHhmZmZmMDAwMHUgdG8gbWFrZSBzdXJlIHAgKyAxdSBkb2VzIG5vdCBvdmVyZmxvdy4KKyAgaWYgKHAgPj0gMHhmZmZlMDAwMHUpIHsKKyAgICBwID0gKChwICsgMXUpID4+IDEpICYgMHg3ZmZmN2ZmZnU7ICAvLyAtPiBkaXZpZGUgdGhlIHN0YXRzIGJ5IDIuCisgIH0KKyAgLy8gcmVjb3JkIGJpdCBjb3VudCAobG93ZXIgMTYgYml0cykgYW5kIGluY3JlbWVudCB0b3RhbCBjb3VudCAodXBwZXIgMTYgYml0cykuCisgIHAgKz0gMHgwMDAxMDAwMHUgKyBiaXQ7CisgICpzdGF0cyA9IHA7CisgIHJldHVybiBiaXQ7Cit9CisKKy8vIENvc3Qgb2YgY29kaW5nIG9uZSBldmVudCB3aXRoIHByb2JhYmlsaXR5ICdwcm9iYScuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEJpdENvc3QoaW50IGJpdCwgdWludDhfdCBwcm9iYSkgeworICByZXR1cm4gIWJpdCA/IFZQOEVudHJvcHlDb3N0W3Byb2JhXSA6IFZQOEVudHJvcHlDb3N0WzI1NSAtIHByb2JhXTsKK30KKworLy8gTGV2ZWwgY29zdCBjYWxjdWxhdGlvbnMKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhMZXZlbENvZGVzW01BWF9WQVJJQUJMRV9MRVZFTF1bMl07Cit2b2lkIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKTsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TGV2ZWxDb3N0KGNvbnN0IHVpbnQxNl90KiBjb25zdCB0YWJsZSwgaW50IGxldmVsKSB7CisgIHJldHVybiBWUDhMZXZlbEZpeGVkQ29zdHNbbGV2ZWxdCisgICAgICAgKyB0YWJsZVsobGV2ZWwgPiBNQVhfVkFSSUFCTEVfTEVWRUwpID8gTUFYX1ZBUklBQkxFX0xFVkVMIDogbGV2ZWxdOworfQorCisvLyBNb2RlIGNvc3RzCitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c1VWWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJMTZbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0k0W05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9FTkNfQ09TVF9FTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZmlsdGVyX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9maWx0ZXJfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ODIxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZmlsdGVyX2VuYy5jCkBAIC0wLDAgKzEsMjQwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2VsZWN0aW5nIGZpbHRlciBsZXZlbAorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisvLyBUaGlzIHRhYmxlIGdpdmVzLCBmb3IgYSBnaXZlbiBzaGFycG5lc3MsIHRoZSBmaWx0ZXJpbmcgc3RyZW5ndGggdG8gYmUKKy8vIHVzZWQgKGF0IGxlYXN0KSBpbiBvcmRlciB0byBmaWx0ZXIgYSBnaXZlbiBlZGdlIHN0ZXAgZGVsdGEuCisvLyBUaGlzIGlzIGNvbnN0cnVjdGVkIGJ5IGJydXRlIGZvcmNlIGluc3BlY3Rpb246IGZvciBhbGwgZGVsdGEsIHdlIGl0ZXJhdGUKKy8vIG92ZXIgYWxsIHBvc3NpYmxlIGZpbHRlcmluZyBzdHJlbmd0aCAvIHRocmVzaCB1bnRpbCBuZWVkc19maWx0ZXIoKSByZXR1cm5zCisvLyB0cnVlLgorI2RlZmluZSBNQVhfREVMVEFfU0laRSA2NAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0xldmVsc0Zyb21EZWx0YVs4XVtNQVhfREVMVEFfU0laRV0gPSB7CisgIHsgMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMgfSwKKyAgeyAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE0LCAxNSwgMTcsIDE4LAorICAgIDIwLCAyMSwgMjMsIDI0LCAyNiwgMjcsIDI5LCAzMCwgMzIsIDMzLCAzNSwgMzYsIDM4LCAzOSwgNDEsIDQyLAorICAgIDQ0LCA0NSwgNDcsIDQ4LCA1MCwgNTEsIDUzLCA1NCwgNTYsIDU3LCA1OSwgNjAsIDYyLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDMsICA1LCAgNiwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTQsIDE2LCAxNywgMTksCisgICAgMjAsIDIyLCAyMywgMjUsIDI2LCAyOCwgMjksIDMxLCAzMiwgMzQsIDM1LCAzNywgMzgsIDQwLCA0MSwgNDMsCisgICAgNDQsIDQ2LCA0NywgNDksIDUwLCA1MiwgNTMsIDU1LCA1NiwgNTgsIDU5LCA2MSwgNjIsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDUsICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE4LCAxOSwKKyAgICAyMSwgMjIsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzEsIDMzLCAzNCwgMzYsIDM3LCAzOSwgNDAsIDQyLCA0MywKKyAgICA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUyLCA1NCwgNTUsIDU3LCA1OCwgNjAsIDYxLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTQsIDE1LCAxNywgMTgsIDIwLAorICAgIDIxLCAyMywgMjQsIDI2LCAyNywgMjksIDMwLCAzMiwgMzMsIDM1LCAzNiwgMzgsIDM5LCA0MSwgNDIsIDQ0LAorICAgIDQ1LCA0NywgNDgsIDUwLCA1MSwgNTMsIDU0LCA1NiwgNTcsIDU5LCA2MCwgNjIsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDQsICA1LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOSwgMjAsCisgICAgMjIsIDIzLCAyNSwgMjYsIDI4LCAyOSwgMzEsIDMyLCAzNCwgMzUsIDM3LCAzOCwgNDAsIDQxLCA0MywgNDQsCisgICAgNDYsIDQ3LCA0OSwgNTAsIDUyLCA1MywgNTUsIDU2LCA1OCwgNTksIDYxLCA2MiwgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgNCwgIDUsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTgsIDE5LCAyMSwKKyAgICAyMiwgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMsIDM0LCAzNiwgMzcsIDM5LCA0MCwgNDIsIDQzLCA0NSwKKyAgICA0NiwgNDgsIDQ5LCA1MSwgNTIsIDU0LCA1NSwgNTcsIDU4LCA2MCwgNjEsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDcsICA4LCAgOSwgMTEsIDEyLCAxNCwgMTUsIDE3LCAxOCwgMjAsIDIxLAorICAgIDIzLCAyNCwgMjYsIDI3LCAyOSwgMzAsIDMyLCAzMywgMzUsIDM2LCAzOCwgMzksIDQxLCA0MiwgNDQsIDQ1LAorICAgIDQ3LCA0OCwgNTAsIDUxLCA1MywgNTQsIDU2LCA1NywgNTksIDYwLCA2MiwgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0KK307CisKK2ludCBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShpbnQgc2hhcnBuZXNzLCBpbnQgZGVsdGEpIHsKKyAgY29uc3QgaW50IHBvcyA9IChkZWx0YSA8IE1BWF9ERUxUQV9TSVpFKSA/IGRlbHRhIDogTUFYX0RFTFRBX1NJWkUgLSAxOworICBhc3NlcnQoc2hhcnBuZXNzID49IDAgJiYgc2hhcnBuZXNzIDw9IDcpOworICByZXR1cm4ga0xldmVsc0Zyb21EZWx0YVtzaGFycG5lc3NdW3Bvc107Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhZ3JhcGggMTUuNDogY29tcHV0ZSB0aGUgaW5uZXItZWRnZSBmaWx0ZXJpbmcgc3RyZW5ndGgKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKK3N0YXRpYyBpbnQgR2V0SUxldmVsKGludCBzaGFycG5lc3MsIGludCBsZXZlbCkgeworICBpZiAoc2hhcnBuZXNzID4gMCkgeworICAgIGlmIChzaGFycG5lc3MgPiA0KSB7CisgICAgICBsZXZlbCA+Pj0gMjsKKyAgICB9IGVsc2UgeworICAgICAgbGV2ZWwgPj49IDE7CisgICAgfQorICAgIGlmIChsZXZlbCA+IDkgLSBzaGFycG5lc3MpIHsKKyAgICAgIGxldmVsID0gOSAtIHNoYXJwbmVzczsKKyAgICB9CisgIH0KKyAgaWYgKGxldmVsIDwgMSkgbGV2ZWwgPSAxOworICByZXR1cm4gbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGxldmVsKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgaWxldmVsID0gR2V0SUxldmVsKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3NoYXJwbmVzcywgbGV2ZWwpOworICBjb25zdCBpbnQgbGltaXQgPSAyICogbGV2ZWwgKyBpbGV2ZWw7CisKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOworICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFZfT0ZGX0VOQzsKKworICAvLyBjb3B5IGN1cnJlbnQgYmxvY2sgdG8geXV2X291dDJfCisgIG1lbWNweSh5X2RzdCwgaXQtPnl1dl9vdXRfLCBZVVZfU0laRV9FTkMgKiBzaXplb2YodWludDhfdCkpOworCisgIGlmIChlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQorICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICB9IGVsc2UgeyAgICAvLyBjb21wbGV4CisgICAgY29uc3QgaW50IGhldl90aHJlc2ggPSAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKKyAgICBWUDhIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIFZQOEhGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICBWUDhWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIG1ldHJpYyBmb3Igb25lIG1hY3JvYmxvY2sKKworc3RhdGljIGRvdWJsZSBHZXRNQlNTSU0oY29uc3QgdWludDhfdCogeXV2MSwgY29uc3QgdWludDhfdCogeXV2MikgeworICBpbnQgeCwgeTsKKyAgZG91YmxlIHN1bSA9IDAuOworCisgIC8vIGNvbXB1dGUgU1NJTSBpbiBhIDEwIHggMTAgd2luZG93CisgIGZvciAoeSA9IFZQOF9TU0lNX0tFUk5FTDsgeSA8IDE2IC0gVlA4X1NTSU1fS0VSTkVMOyB5KyspIHsKKyAgICBmb3IgKHggPSBWUDhfU1NJTV9LRVJORUw7IHggPCAxNiAtIFZQOF9TU0lNX0tFUk5FTDsgeCsrKSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoeXV2MSArIFlfT0ZGX0VOQywgQlBTLCB5dXYyICsgWV9PRkZfRU5DLCBCUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgMTYsIDE2KTsKKyAgICB9CisgIH0KKyAgZm9yICh4ID0gMTsgeCA8IDc7IHgrKykgeworICAgIGZvciAoeSA9IDE7IHkgPCA3OyB5KyspIHsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZCh5dXYxICsgVV9PRkZfRU5DLCBCUFMsIHl1djIgKyBVX09GRl9FTkMsIEJQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCA4LCA4KTsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZCh5dXYxICsgVl9PRkZfRU5DLCBCUFMsIHl1djIgKyBWX09GRl9FTkMsIEJQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCA4LCA4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXhwb3NlZCBBUElzOiBFbmNvZGVyIHNob3VsZCBjYWxsIHRoZSBmb2xsb3dpbmcgMyBmdW5jdGlvbnMgdG8gYWRqdXN0CisvLyBsb29wIGZpbHRlciBzdHJlbmd0aAorCit2b2lkIFZQOEluaXRGaWx0ZXIoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgaWYgKGl0LT5sZl9zdGF0c18gIT0gTlVMTCkgeworICAgIGludCBzLCBpOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7IHMrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgeworICAgICAgICAoKml0LT5sZl9zdGF0c18pW3NdW2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U1NJTURzcEluaXQoKTsKKyAgfQorI2Vsc2UKKyAgKHZvaWQpaXQ7CisjZW5kaWYKK30KKwordm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIGludCBkOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgaW50IHMgPSBpdC0+bWJfLT5zZWdtZW50XzsKKyAgY29uc3QgaW50IGxldmVsMCA9IGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfOworCisgIC8vIGV4cGxvcmUgKy8tcXVhbnQgcmFuZ2Ugb2YgdmFsdWVzIGFyb3VuZCBsZXZlbDAKKyAgY29uc3QgaW50IGRlbHRhX21pbiA9IC1lbmMtPmRxbV9bc10ucXVhbnRfOworICBjb25zdCBpbnQgZGVsdGFfbWF4ID0gZW5jLT5kcW1fW3NdLnF1YW50XzsKKyAgY29uc3QgaW50IHN0ZXBfc2l6ZSA9IChkZWx0YV9tYXggLSBkZWx0YV9taW4gPj0gNCkgPyA0IDogMTsKKworICBpZiAoaXQtPmxmX3N0YXRzXyA9PSBOVUxMKSByZXR1cm47CisKKyAgLy8gTk9URTogQ3VycmVudGx5IHdlIGFyZSBhcHBseWluZyBmaWx0ZXIgb25seSBhY3Jvc3MgdGhlIHN1YmxvY2sgZWRnZXMKKyAgLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciB0aGF0LgorICAvLyAxLiBBcHBseWluZyBmaWx0ZXIgb24gbWFjcm8gYmxvY2sgZWRnZXMgd2lsbCBjaGFuZ2UgdGhlIHBpeGVscyBpbgorICAvLyB0aGUgbGVmdCBhbmQgdG9wIG1hY3JvIGJsb2Nrcy4gVGhhdCB3aWxsIGJlIGhhcmQgdG8gcmVzdG9yZQorICAvLyAyLiBNYWNybyBCbG9ja3Mgb24gdGhlIGJvdHRvbSBhbmQgcmlnaHQgYXJlIG5vdCB5ZXQgY29tcHJlc3NlZC4gU28gd2UKKyAgLy8gY2Fubm90IGFwcGx5IGZpbHRlciBvbiB0aGUgcmlnaHQgYW5kIGJvdHRvbSBtYWNybyBibG9jayBlZGdlcy4KKyAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEgJiYgaXQtPm1iXy0+c2tpcF8pIHJldHVybjsKKworICAvLyBBbHdheXMgdHJ5IGZpbHRlciBsZXZlbCAgemVybworICAoKml0LT5sZl9zdGF0c18pW3NdWzBdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXRfKTsKKworICBmb3IgKGQgPSBkZWx0YV9taW47IGQgPD0gZGVsdGFfbWF4OyBkICs9IHN0ZXBfc2l6ZSkgeworICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsMCArIGQ7CisgICAgaWYgKGxldmVsIDw9IDAgfHwgbGV2ZWwgPj0gTUFYX0xGX0xFVkVMUykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIERvRmlsdGVyKGl0LCBsZXZlbCk7CisgICAgKCppdC0+bGZfc3RhdHNfKVtzXVtsZXZlbF0gKz0gR2V0TUJTU0lNKGl0LT55dXZfaW5fLCBpdC0+eXV2X291dDJfKTsKKyAgfQorI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgKHZvaWQpaXQ7CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCit9CisKK3ZvaWQgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIGlmIChpdC0+bGZfc3RhdHNfICE9IE5VTEwpIHsKKyAgICBpbnQgczsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKKyAgICAgIGludCBpLCBiZXN0X2xldmVsID0gMDsKKyAgICAgIC8vIEltcHJvdmVtZW50IG92ZXIgZmlsdGVyIGxldmVsIDAgc2hvdWxkIGJlIGF0IGxlYXN0IDFlLTUgKHJlbGF0aXZlbHkpCisgICAgICBkb3VibGUgYmVzdF92ID0gMS4wMDAwMSAqICgqaXQtPmxmX3N0YXRzXylbc11bMF07CisgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gKCppdC0+bGZfc3RhdHNfKVtzXVtpXTsKKyAgICAgICAgaWYgKHYgPiBiZXN0X3YpIHsKKyAgICAgICAgICBiZXN0X3YgPSB2OworICAgICAgICAgIGJlc3RfbGV2ZWwgPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXyA9IGJlc3RfbGV2ZWw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICBpZiAoZW5jLT5jb25maWdfLT5maWx0ZXJfc3RyZW5ndGggPiAwKSB7CisgICAgaW50IG1heF9sZXZlbCA9IDA7CisgICAgaW50IHM7CisgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgcysrKSB7CisgICAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tzXTsKKyAgICAgIC8vIHRoaXMgJz4+IDMnIGFjY291bnRzIGZvciBzb21lIGludmVyc2UgV0hUIHNjYWxpbmcKKyAgICAgIGNvbnN0IGludCBkZWx0YSA9IChkcW0tPm1heF9lZGdlXyAqIGRxbS0+eTJfLnFfWzFdKSA+PiAzOworICAgICAgY29uc3QgaW50IGxldmVsID0KKyAgICAgICAgICBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18sIGRlbHRhKTsKKyAgICAgIGlmIChsZXZlbCA+IGRxbS0+ZnN0cmVuZ3RoXykgeworICAgICAgICBkcW0tPmZzdHJlbmd0aF8gPSBsZXZlbDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfbGV2ZWwgPCBkcW0tPmZzdHJlbmd0aF8pIHsKKyAgICAgICAgbWF4X2xldmVsID0gZHFtLT5mc3RyZW5ndGhfOworICAgICAgfQorICAgIH0KKyAgICBlbmMtPmZpbHRlcl9oZHJfLmxldmVsXyA9IG1heF9sZXZlbDsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9mcmFtZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZnJhbWVfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3NjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZnJhbWVfZW5jLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGZyYW1lIGNvZGluZyBhbmQgYW5hbHlzaXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBSSUZGIGNvbnN0YW50cworCisjZGVmaW5lIFNFR01FTlRfVklTVSAwCisjZGVmaW5lIERFQlVHX1NFQVJDSCAwICAgIC8vIHVzZWZ1bCB0byB0cmFjayBzZWFyY2ggY29udmVyZ2VuY2UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG11bHRpLXBhc3MgY29udmVyZ2VuY2UKKworI2RlZmluZSBIRUFERVJfU0laRV9FU1RJTUFURSAoUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9GUkFNRV9IRUFERVJfU0laRSkKKyNkZWZpbmUgRFFfTElNSVQgMC40ICAvLyBjb252ZXJnZW5jZSBpcyBjb25zaWRlcmVkIHJlYWNoZWQgaWYgZHEgPCBEUV9MSU1JVAorLy8gd2UgYWxsb3cgMmsgb2YgZXh0cmEgaGVhZC1yb29tIGluIFBBUlRJVElPTjAgbGltaXQuCisjZGVmaW5lIFBBUlRJVElPTjBfU0laRV9MSU1JVCAoKFZQOF9NQVhfUEFSVElUSU9OMF9TSVpFIC0gMjA0OFVMTCkgPDwgMTEpCisKK3R5cGVkZWYgc3RydWN0IHsgIC8vIHN0cnVjdCBmb3Igb3JnYW5pemluZyBjb252ZXJnZW5jZSBpbiBlaXRoZXIgc2l6ZSBvciBQU05SCisgIGludCBpc19maXJzdDsKKyAgZmxvYXQgZHE7CisgIGZsb2F0IHEsIGxhc3RfcTsKKyAgZG91YmxlIHZhbHVlLCBsYXN0X3ZhbHVlOyAgIC8vIFBTTlIgb3Igc2l6ZQorICBkb3VibGUgdGFyZ2V0OworICBpbnQgZG9fc2l6ZV9zZWFyY2g7Cit9IFBhc3NTdGF0czsKKworc3RhdGljIGludCBJbml0UGFzc1N0YXRzKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywgUGFzc1N0YXRzKiBjb25zdCBzKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRhcmdldF9zaXplID0gKHVpbnQ2NF90KWVuYy0+Y29uZmlnXy0+dGFyZ2V0X3NpemU7CisgIGNvbnN0IGludCBkb19zaXplX3NlYXJjaCA9ICh0YXJnZXRfc2l6ZSAhPSAwKTsKKyAgY29uc3QgZmxvYXQgdGFyZ2V0X1BTTlIgPSBlbmMtPmNvbmZpZ18tPnRhcmdldF9QU05SOworCisgIHMtPmlzX2ZpcnN0ID0gMTsKKyAgcy0+ZHEgPSAxMC5mOworICBzLT5xID0gcy0+bGFzdF9xID0gZW5jLT5jb25maWdfLT5xdWFsaXR5OworICBzLT50YXJnZXQgPSBkb19zaXplX3NlYXJjaCA/IChkb3VibGUpdGFyZ2V0X3NpemUKKyAgICAgICAgICAgIDogKHRhcmdldF9QU05SID4gMC4pID8gdGFyZ2V0X1BTTlIKKyAgICAgICAgICAgIDogNDAuOyAgIC8vIGRlZmF1bHQsIGp1c3QgaW4gY2FzZQorICBzLT52YWx1ZSA9IHMtPmxhc3RfdmFsdWUgPSAwLjsKKyAgcy0+ZG9fc2l6ZV9zZWFyY2ggPSBkb19zaXplX3NlYXJjaDsKKyAgcmV0dXJuIGRvX3NpemVfc2VhcmNoOworfQorCitzdGF0aWMgZmxvYXQgQ2xhbXAoZmxvYXQgdiwgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgcmV0dXJuICh2IDwgbWluKSA/IG1pbiA6ICh2ID4gbWF4KSA/IG1heCA6IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBDb21wdXRlTmV4dFEoUGFzc1N0YXRzKiBjb25zdCBzKSB7CisgIGZsb2F0IGRxOworICBpZiAocy0+aXNfZmlyc3QpIHsKKyAgICBkcSA9IChzLT52YWx1ZSA+IHMtPnRhcmdldCkgPyAtcy0+ZHEgOiBzLT5kcTsKKyAgICBzLT5pc19maXJzdCA9IDA7CisgIH0gZWxzZSBpZiAocy0+dmFsdWUgIT0gcy0+bGFzdF92YWx1ZSkgeworICAgIGNvbnN0IGRvdWJsZSBzbG9wZSA9IChzLT50YXJnZXQgLSBzLT52YWx1ZSkgLyAocy0+bGFzdF92YWx1ZSAtIHMtPnZhbHVlKTsKKyAgICBkcSA9IChmbG9hdCkoc2xvcGUgKiAocy0+bGFzdF9xIC0gcy0+cSkpOworICB9IGVsc2UgeworICAgIGRxID0gMC47ICAvLyB3ZSdyZSBkb25lPyEKKyAgfQorICAvLyBMaW1pdCB2YXJpYWJsZSB0byBhdm9pZCBsYXJnZSBzd2luZ3MuCisgIHMtPmRxID0gQ2xhbXAoZHEsIC0zMC5mLCAzMC5mKTsKKyAgcy0+bGFzdF9xID0gcy0+cTsKKyAgcy0+bGFzdF92YWx1ZSA9IHMtPnZhbHVlOworICBzLT5xID0gQ2xhbXAocy0+cSArIHMtPmRxLCAwLmYsIDEwMC5mKTsKKyAgcmV0dXJuIHMtPnE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZXMgZm9yIGxldmVsIGNvZGluZworCitjb25zdCB1aW50OF90IFZQOENhdDNbXSA9IHsgMTczLCAxNDgsIDE0MCB9OworY29uc3QgdWludDhfdCBWUDhDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSB9OworY29uc3QgdWludDhfdCBWUDhDYXQ1W10gPSB7IDE4MCwgMTU3LCAxNDEsIDEzNCwgMTMwIH07Citjb25zdCB1aW50OF90IFZQOENhdDZbXSA9CisgICAgeyAyNTQsIDI1NCwgMjQzLCAyMzAsIDE5NiwgMTc3LCAxNTMsIDE0MCwgMTMzLCAxMzAsIDEyOSB9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MgYWJvdXQ6IG51bWJlciBvZiBza2lwcywgdG9rZW4gcHJvYmEsIGxldmVsIGNvc3QsLi4uCisKK3N0YXRpYyB2b2lkIFJlc2V0U3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhwcm9iYSk7CisgIHByb2JhLT5uYl9za2lwXyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTa2lwIGRlY2lzaW9uIHByb2JhYmlsaXR5CisKKyNkZWZpbmUgU0tJUF9QUk9CQV9USFJFU0hPTEQgMjUwICAvLyB2YWx1ZSBiZWxvdyB3aGljaCB1c2luZyBza2lwX3Byb2JhIGlzIE9LLgorCitzdGF0aWMgaW50IENhbGNTa2lwUHJvYmEodWludDY0X3QgbmIsIHVpbnQ2NF90IHRvdGFsKSB7CisgIHJldHVybiAoaW50KSh0b3RhbCA/ICh0b3RhbCAtIG5iKSAqIDI1NSAvIHRvdGFsIDogMjU1KTsKK30KKworLy8gUmV0dXJucyB0aGUgYml0LWNvc3QgZm9yIGNvZGluZyB0aGUgc2tpcCBwcm9iYWJpbGl0eS4KK3N0YXRpYyBpbnQgRmluYWxpemVTa2lwUHJvYmEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgY29uc3QgaW50IG5iX21icyA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICBjb25zdCBpbnQgbmJfZXZlbnRzID0gcHJvYmEtPm5iX3NraXBfOworICBpbnQgc2l6ZTsKKyAgcHJvYmEtPnNraXBfcHJvYmFfID0gQ2FsY1NraXBQcm9iYShuYl9ldmVudHMsIG5iX21icyk7CisgIHByb2JhLT51c2Vfc2tpcF9wcm9iYV8gPSAocHJvYmEtPnNraXBfcHJvYmFfIDwgU0tJUF9QUk9CQV9USFJFU0hPTEQpOworICBzaXplID0gMjU2OyAgIC8vICd1c2Vfc2tpcF9wcm9iYScgYml0CisgIGlmIChwcm9iYS0+dXNlX3NraXBfcHJvYmFfKSB7CisgICAgc2l6ZSArPSAgbmJfZXZlbnRzICogVlA4Qml0Q29zdCgxLCBwcm9iYS0+c2tpcF9wcm9iYV8pCisgICAgICAgICArIChuYl9tYnMgLSBuYl9ldmVudHMpICogVlA4Qml0Q29zdCgwLCBwcm9iYS0+c2tpcF9wcm9iYV8pOworICAgIHNpemUgKz0gOCAqIDI1NjsgICAvLyBjb3N0IG9mIHNpZ25hbGluZyB0aGUgc2tpcF9wcm9iYV8gaXRzZWxmLgorICB9CisgIHJldHVybiBzaXplOworfQorCisvLyBDb2xsZWN0IHN0YXRpc3RpY3MgYW5kIGRlZHVjZSBwcm9iYWJpbGl0aWVzIGZvciBuZXh0IGNvZGluZyBwYXNzLgorLy8gUmV0dXJuIHRoZSB0b3RhbCBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBwcm9iYWJpbGl0eSB1cGRhdGVzLgorc3RhdGljIGludCBDYWxjVG9rZW5Qcm9iYShpbnQgbmIsIGludCB0b3RhbCkgeworICBhc3NlcnQobmIgPD0gdG90YWwpOworICByZXR1cm4gbmIgPyAoMjU1IC0gbmIgKiAyNTUgLyB0b3RhbCkgOiAyNTU7Cit9CisKKy8vIENvc3Qgb2YgY29kaW5nICduYicgMSdzIGFuZCAndG90YWwtbmInIDAncyB1c2luZyAncHJvYmEnIHByb2JhYmlsaXR5Lgorc3RhdGljIGludCBCcmFuY2hDb3N0KGludCBuYiwgaW50IHRvdGFsLCBpbnQgcHJvYmEpIHsKKyAgcmV0dXJuIG5iICogVlA4Qml0Q29zdCgxLCBwcm9iYSkgKyAodG90YWwgLSBuYikgKiBWUDhCaXRDb3N0KDAsIHByb2JhKTsKK30KKworc3RhdGljIHZvaWQgUmVzZXRUb2tlblN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87CisgIG1lbXNldChwcm9iYS0+c3RhdHNfLCAwLCBzaXplb2YocHJvYmEtPnN0YXRzXykpOworfQorCitzdGF0aWMgaW50IEZpbmFsaXplVG9rZW5Qcm9iYXMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKSB7CisgIGludCBoYXNfY2hhbmdlZCA9IDA7CisgIGludCBzaXplID0gMDsKKyAgaW50IHQsIGIsIGMsIHA7CisgIGZvciAodCA9IDA7IHQgPCBOVU1fVFlQRVM7ICsrdCkgeworICAgIGZvciAoYiA9IDA7IGIgPCBOVU1fQkFORFM7ICsrYikgeworICAgICAgZm9yIChjID0gMDsgYyA8IE5VTV9DVFg7ICsrYykgeworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgTlVNX1BST0JBUzsgKytwKSB7CisgICAgICAgICAgY29uc3QgcHJvYmFfdCBzdGF0cyA9IHByb2JhLT5zdGF0c19bdF1bYl1bY11bcF07CisgICAgICAgICAgY29uc3QgaW50IG5iID0gKHN0YXRzID4+IDApICYgMHhmZmZmOworICAgICAgICAgIGNvbnN0IGludCB0b3RhbCA9IChzdGF0cyA+PiAxNikgJiAweGZmZmY7CisgICAgICAgICAgY29uc3QgaW50IHVwZGF0ZV9wcm9iYSA9IFZQOENvZWZmc1VwZGF0ZVByb2JhW3RdW2JdW2NdW3BdOworICAgICAgICAgIGNvbnN0IGludCBvbGRfcCA9IFZQOENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXTsKKyAgICAgICAgICBjb25zdCBpbnQgbmV3X3AgPSBDYWxjVG9rZW5Qcm9iYShuYiwgdG90YWwpOworICAgICAgICAgIGNvbnN0IGludCBvbGRfY29zdCA9IEJyYW5jaENvc3QobmIsIHRvdGFsLCBvbGRfcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWUDhCaXRDb3N0KDAsIHVwZGF0ZV9wcm9iYSk7CisgICAgICAgICAgY29uc3QgaW50IG5ld19jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG5ld19wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMSwgdXBkYXRlX3Byb2JhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDggKiAyNTY7CisgICAgICAgICAgY29uc3QgaW50IHVzZV9uZXdfcCA9IChvbGRfY29zdCA+IG5ld19jb3N0KTsKKyAgICAgICAgICBzaXplICs9IFZQOEJpdENvc3QodXNlX25ld19wLCB1cGRhdGVfcHJvYmEpOworICAgICAgICAgIGlmICh1c2VfbmV3X3ApIHsgIC8vIG9ubHkgdXNlIHByb2JhIHRoYXQgc2VlbSBtZWFuaW5nZnVsIGVub3VnaC4KKyAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gbmV3X3A7CisgICAgICAgICAgICBoYXNfY2hhbmdlZCB8PSAobmV3X3AgIT0gb2xkX3ApOworICAgICAgICAgICAgc2l6ZSArPSA4ICogMjU2OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9iYS0+Y29lZmZzX1t0XVtiXVtjXVtwXSA9IG9sZF9wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBwcm9iYS0+ZGlydHlfID0gaGFzX2NoYW5nZWQ7CisgIHJldHVybiBzaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluYWxpemUgU2VnbWVudCBwcm9iYWJpbGl0eSBiYXNlZCBvbiB0aGUgY29kaW5nIHRyZWUKKworc3RhdGljIGludCBHZXRQcm9iYShpbnQgYSwgaW50IGIpIHsKKyAgY29uc3QgaW50IHRvdGFsID0gYSArIGI7CisgIHJldHVybiAodG90YWwgPT0gMCkgPyAyNTUgICAgIC8vIHRoYXQncyB0aGUgZGVmYXVsdCBwcm9iYWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgICA6ICgyNTUgKiBhICsgdG90YWwgLyAyKSAvIHRvdGFsOyAgLy8gcm91bmRlZCBwcm9iYQorfQorCitzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKKyAgICBlbmMtPm1iX2luZm9fW25dLnNlZ21lbnRfID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTZXRTZWdtZW50UHJvYmFzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgcFtOVU1fTUJfU0VHTUVOVFNdID0geyAwIH07CisgIGludCBuOworCisgIGZvciAobiA9IDA7IG4gPCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsgKytuKSB7CisgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW25dOworICAgICsrcFttYi0+c2VnbWVudF9dOworICB9CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBpZiAoZW5jLT5waWNfLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgZm9yIChuID0gMDsgbiA8IE5VTV9NQl9TRUdNRU5UUzsgKytuKSB7CisgICAgICBlbmMtPnBpY18tPnN0YXRzLT5zZWdtZW50X3NpemVbbl0gPSBwW25dOworICAgIH0KKyAgfQorI2VuZGlmCisgIGlmIChlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfID4gMSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHByb2JhcyA9IGVuYy0+cHJvYmFfLnNlZ21lbnRzXzsKKyAgICBwcm9iYXNbMF0gPSBHZXRQcm9iYShwWzBdICsgcFsxXSwgcFsyXSArIHBbM10pOworICAgIHByb2Jhc1sxXSA9IEdldFByb2JhKHBbMF0sIHBbMV0pOworICAgIHByb2Jhc1syXSA9IEdldFByb2JhKHBbMl0sIHBbM10pOworCisgICAgZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8gPQorICAgICAgICAocHJvYmFzWzBdICE9IDI1NSkgfHwgKHByb2Jhc1sxXSAhPSAyNTUpIHx8IChwcm9iYXNbMl0gIT0gMjU1KTsKKyAgICBpZiAoIWVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfKSBSZXNldFNlZ21lbnRzKGVuYyk7CisgICAgZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV8gPQorICAgICAgICBwWzBdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzFdKSkgKworICAgICAgICBwWzFdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzFdKSkgKworICAgICAgICBwWzJdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzJdKSkgKworICAgICAgICBwWzNdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzJdKSk7CisgIH0gZWxzZSB7CisgICAgZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8gPSAwOworICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0gMDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29lZmZpY2llbnQgY29kaW5nCisKK3N0YXRpYyBpbnQgUHV0Q29lZmZzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBjdHgsIGNvbnN0IFZQOFJlc2lkdWFsKiByZXMpIHsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGNvbnN0IHVpbnQ4X3QqIHAgPSByZXMtPnByb2Jbbl1bY3R4XTsKKyAgaWYgKCFWUDhQdXRCaXQoYncsIHJlcy0+bGFzdCA+PSAwLCBwWzBdKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKG4gPCAxNikgeworICAgIGNvbnN0IGludCBjID0gcmVzLT5jb2VmZnNbbisrXTsKKyAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOworICAgIGludCB2ID0gc2lnbiA/IC1jIDogYzsKKyAgICBpZiAoIVZQOFB1dEJpdChidywgdiAhPSAwLCBwWzFdKSkgeworICAgICAgcCA9IHJlcy0+cHJvYltWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiAxLCBwWzJdKSkgeworICAgICAgcCA9IHJlcy0+cHJvYltWUDhFbmNCYW5kc1tuXV1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNCwgcFszXSkpIHsKKyAgICAgICAgaWYgKFZQOFB1dEJpdChidywgdiAhPSAyLCBwWzRdKSkgeworICAgICAgICAgIFZQOFB1dEJpdChidywgdiA9PSA0LCBwWzVdKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMTAsIHBbNl0pKSB7CisgICAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNiwgcFs3XSkpIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPT0gNiwgMTU5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPj0gOSwgMTY1KTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsICEodiAmIDEpLCAxNDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgY29uc3QgdWludDhfdCogdGFiOworICAgICAgICBpZiAodiA8IDMgKyAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzhdKTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOV0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOworICAgICAgICAgIG1hc2sgPSAxIDw8IDI7CisgICAgICAgICAgdGFiID0gVlA4Q2F0MzsKKyAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzldKTsKKyAgICAgICAgICB2IC09IDMgKyAoOCA8PCAxKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAzOworICAgICAgICAgIHRhYiA9IFZQOENhdDQ7CisgICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOworICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFsxMF0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDIpOworICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzEwXSk7CisgICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMTA7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobWFzaykgeworICAgICAgICAgIFZQOFB1dEJpdChidywgISEodiAmIG1hc2spLCAqdGFiKyspOworICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzJdOworICAgIH0KKyAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBzaWduKTsKKyAgICBpZiAobiA9PSAxNiB8fCAhVlA4UHV0Qml0KGJ3LCBuIDw9IHJlcy0+bGFzdCwgcFswXSkpIHsKKyAgICAgIHJldHVybiAxOyAgIC8vIEVPQgorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ29kZVJlc2lkdWFscyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IHgsIHksIGNoOworICBWUDhSZXNpZHVhbCByZXM7CisgIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7CisgIGNvbnN0IGludCBpMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGNvbnN0IGludCBzZWdtZW50ID0gaXQtPm1iXy0+c2VnbWVudF87CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworCisgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKKworICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKyAgaWYgKGkxNikgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7CisgICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQorICAgICAgUHV0Q29lZmZzKGJ3LCBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisgICAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIH0gZWxzZSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIH0KKworICAvLyBsdW1hLUFDCisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IFB1dENvZWZmcyhidywgY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKyAgcG9zMiA9IFZQOEJpdFdyaXRlclBvcyhidyk7CisKKyAgLy8gVS9WCisgIFZQOEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOworICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgeworICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOworICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9CisgICAgICAgICAgICBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7CisgICAgICB9CisgICAgfQorICB9CisgIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworICBpdC0+bHVtYV9iaXRzXyA9IHBvczIgLSBwb3MxOworICBpdC0+dXZfYml0c18gPSBwb3MzIC0gcG9zMjsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1baTE2XSArPSBpdC0+bHVtYV9iaXRzXzsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1bMl0gKz0gaXQtPnV2X2JpdHNfOworICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Cit9CisKKy8vIFNhbWUgYXMgQ29kZVJlc2lkdWFscywgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgd3JpdGUgYW55dGhpbmcuCisvLyBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHMgdGhlIGV2ZW50IGRpc3RyaWJ1dGlvbi4KK3N0YXRpYyB2b2lkIFJlY29yZFJlc2lkdWFscyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworCisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7CisgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKKyAgICBpdC0+dG9wX256X1s4XSA9IGl0LT5sZWZ0X256X1s4XSA9CisgICAgICBWUDhSZWNvcmRDb2VmZnMoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBWUDhSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRva2VuIGJ1ZmZlcgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKK3N0YXRpYyBpbnQgUmVjb3JkVG9rZW5zKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgorICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XTsKKyAgICBWUDhJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKKyAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KKyAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAmcmVzLCB0b2tlbnMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPQorICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgJnJlcywgdG9rZW5zKTsKKyAgICB9CisgIH0KKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgJnJlcywgdG9rZW5zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOworICByZXR1cm4gIXRva2Vucy0+ZXJyb3JfOworfQorCisjZW5kaWYgICAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHRyYUluZm8gbWFwIC8gRGVidWcgZnVuY3Rpb24KKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKworI2lmIFNFR01FTlRfVklTVQorc3RhdGljIHZvaWQgU2V0QmxvY2sodWludDhfdCogcCwgaW50IHZhbHVlLCBpbnQgc2l6ZSkgeworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIG1lbXNldChwLCB2YWx1ZSwgc2l6ZSk7CisgICAgcCArPSBCUFM7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgZW5jLT5zc2VfWzBdID0gMDsKKyAgZW5jLT5zc2VfWzFdID0gMDsKKyAgZW5jLT5zc2VfWzJdID0gMDsKKyAgLy8gTm90ZTogZW5jLT5zc2VfWzNdIGlzIG1hbmFnZWQgYnkgYWxwaGEuYworICBlbmMtPnNzZV9jb3VudF8gPSAwOworfQorCitzdGF0aWMgdm9pZCBTdG9yZVNTRShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gaXQtPnl1dl9pbl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG91dCA9IGl0LT55dXZfb3V0XzsKKyAgLy8gTm90ZTogbm90IHRvdGFsbHkgYWNjdXJhdGUgYXQgYm91bmRhcnkuIEFuZCBkb2Vzbid0IGluY2x1ZGUgaW4tbG9vcCBmaWx0ZXIuCisgIGVuYy0+c3NlX1swXSArPSBWUDhTU0UxNngxNihpbiArIFlfT0ZGX0VOQywgb3V0ICsgWV9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfWzFdICs9IFZQOFNTRTh4OChpbiArIFVfT0ZGX0VOQywgb3V0ICsgVV9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfWzJdICs9IFZQOFNTRTh4OChpbiArIFZfT0ZGX0VOQywgb3V0ICsgVl9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfY291bnRfICs9IDE2ICogMTY7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlU2lkZUluZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQtPm1iXzsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKworICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgU3RvcmVTU0UoaXQpOworICAgIGVuYy0+YmxvY2tfY291bnRfWzBdICs9IChtYi0+dHlwZV8gPT0gMCk7CisgICAgZW5jLT5ibG9ja19jb3VudF9bMV0gKz0gKG1iLT50eXBlXyA9PSAxKTsKKyAgICBlbmMtPmJsb2NrX2NvdW50X1syXSArPSAobWItPnNraXBfICE9IDApOworICB9CisKKyAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7CisgICAgdWludDhfdCogY29uc3QgaW5mbyA9ICZwaWMtPmV4dHJhX2luZm9baXQtPnhfICsgaXQtPnlfICogZW5jLT5tYl93X107CisgICAgc3dpdGNoIChwaWMtPmV4dHJhX2luZm9fdHlwZSkgeworICAgICAgY2FzZSAxOiAqaW5mbyA9IG1iLT50eXBlXzsgYnJlYWs7CisgICAgICBjYXNlIDI6ICppbmZvID0gbWItPnNlZ21lbnRfOyBicmVhazsKKyAgICAgIGNhc2UgMzogKmluZm8gPSBlbmMtPmRxbV9bbWItPnNlZ21lbnRfXS5xdWFudF87IGJyZWFrOworICAgICAgY2FzZSA0OiAqaW5mbyA9IChtYi0+dHlwZV8gPT0gMSkgPyBpdC0+cHJlZHNfWzBdIDogMHhmZjsgYnJlYWs7CisgICAgICBjYXNlIDU6ICppbmZvID0gbWItPnV2X21vZGVfOyBicmVhazsKKyAgICAgIGNhc2UgNjogeworICAgICAgICBjb25zdCBpbnQgYiA9IChpbnQpKChpdC0+bHVtYV9iaXRzXyArIGl0LT51dl9iaXRzXyArIDcpID4+IDMpOworICAgICAgICAqaW5mbyA9IChiID4gMjU1KSA/IDI1NSA6IGI7IGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA3OiAqaW5mbyA9IG1iLT5hbHBoYV87IGJyZWFrOworICAgICAgZGVmYXVsdDogKmluZm8gPSAwOyBicmVhazsKKyAgICB9CisgIH0KKyNpZiBTRUdNRU5UX1ZJU1UgIC8vIHZpc3VhbGl6ZSBzZWdtZW50cyBhbmQgcHJlZGljdGlvbiBtb2RlcworICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBZX09GRl9FTkMsIG1iLT5zZWdtZW50XyAqIDY0LCAxNik7CisgIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQywgaXQtPnByZWRzX1swXSAqIDY0LCA4KTsKKyAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgVl9PRkZfRU5DLCBtYi0+dXZfbW9kZV8gKiA2NCwgOCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgUmVzZXRTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoZW5jLT5ibG9ja19jb3VudF8sIDAsIHNpemVvZihlbmMtPmJsb2NrX2NvdW50XykpOworICB9CisgIFJlc2V0U1NFKGVuYyk7Cit9CisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCitzdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgKHZvaWQpZW5jOworfQorc3RhdGljIHZvaWQgU3RvcmVTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGlmIChwaWMtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIGlmIChpdC0+eF8gPT0gMCAmJiBpdC0+eV8gPT0gMCkgeyAgIC8vIG9ubHkgZG8gaXQgb25jZSwgYXQgc3RhcnQKKyAgICAgIG1lbXNldChwaWMtPmV4dHJhX2luZm8sIDAsCisgICAgICAgICAgICAgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiBzaXplb2YoKnBpYy0+ZXh0cmFfaW5mbykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNldFNpZGVJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICAodm9pZClpdDsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorCitzdGF0aWMgZG91YmxlIEdldFBTTlIodWludDY0X3QgbXNlLCB1aW50NjRfdCBzaXplKSB7CisgIHJldHVybiAobXNlID4gMCAmJiBzaXplID4gMCkgPyAxMC4gKiBsb2cxMCgyNTUuICogMjU1LiAqIHNpemUgLyBtc2UpIDogOTk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RhdExvb3AoKTogb25seSBjb2xsZWN0IHN0YXRpc3RpY3MgKG51bWJlciBvZiBza2lwcywgdG9rZW4gdXNhZ2UsIC4uLikuCisvLyAgVGhpcyBpcyB1c2VkIGZvciBkZWNpZGluZyBvcHRpbWFsIHByb2JhYmlsaXRpZXMuIEl0IGFsc28gbW9kaWZpZXMgdGhlCisvLyAgcXVhbnRpemVyIHZhbHVlIGlmIHNvbWUgdGFyZ2V0IChzaXplLCBQU05SKSB3YXMgc3BlY2lmaWVkLgorCitzdGF0aWMgdm9pZCBTZXRMb29wUGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcSkgeworICAvLyBNYWtlIHN1cmUgdGhlIHF1YWxpdHkgcGFyYW1ldGVyIGlzIGluc2lkZSB2YWxpZCBib3VuZHMKKyAgcSA9IENsYW1wKHEsIDAuZiwgMTAwLmYpOworCisgIFZQOFNldFNlZ21lbnRQYXJhbXMoZW5jLCBxKTsgICAgICAvLyBzZXR1cCBzZWdtZW50IHF1YW50aXphdGlvbnMgYW5kIGZpbHRlcnMKKyAgU2V0U2VnbWVudFByb2JhcyhlbmMpOyAgICAgICAgICAgIC8vIGNvbXB1dGUgc2VnbWVudCBwcm9iYWJpbGl0aWVzCisKKyAgUmVzZXRTdGF0cyhlbmMpOworICBSZXNldFNTRShlbmMpOworfQorCitzdGF0aWMgdWludDY0X3QgT25lU3RhdFBhc3MoVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSRExldmVsIHJkX29wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfbWJzLCBpbnQgcGVyY2VudF9kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIHVpbnQ2NF90IHNpemUgPSAwOworICB1aW50NjRfdCBzaXplX3AwID0gMDsKKyAgdWludDY0X3QgZGlzdG9ydGlvbiA9IDA7CisgIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gbmJfbWJzICogMzg0OworCisgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgIFNldExvb3BQYXJhbXMoZW5jLCBzLT5xKTsKKyAgZG8geworICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCwgTlVMTCk7CisgICAgaWYgKFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkpIHsKKyAgICAgIC8vIEp1c3QgcmVjb3JkIHRoZSBudW1iZXIgb2Ygc2tpcHMgYW5kIGFjdCBsaWtlIHNraXBfcHJvYmEgaXMgbm90IHVzZWQuCisgICAgICArK2VuYy0+cHJvYmFfLm5iX3NraXBfOworICAgIH0KKyAgICBSZWNvcmRSZXNpZHVhbHMoJml0LCAmaW5mbyk7CisgICAgc2l6ZSArPSBpbmZvLlIgKyBpbmZvLkg7CisgICAgc2l6ZV9wMCArPSBpbmZvLkg7CisgICAgZGlzdG9ydGlvbiArPSBpbmZvLkQ7CisgICAgaWYgKHBlcmNlbnRfZGVsdGEgJiYgIVZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCBwZXJjZW50X2RlbHRhKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCZpdCk7CisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQpICYmIC0tbmJfbWJzID4gMCk7CisKKyAgc2l6ZV9wMCArPSBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXzsKKyAgaWYgKHMtPmRvX3NpemVfc2VhcmNoKSB7CisgICAgc2l6ZSArPSBGaW5hbGl6ZVNraXBQcm9iYShlbmMpOworICAgIHNpemUgKz0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICAgIHNpemUgPSAoKHNpemUgKyBzaXplX3AwICsgMTAyNCkgPj4gMTEpICsgSEVBREVSX1NJWkVfRVNUSU1BVEU7CisgICAgcy0+dmFsdWUgPSAoZG91YmxlKXNpemU7CisgIH0gZWxzZSB7CisgICAgcy0+dmFsdWUgPSBHZXRQU05SKGRpc3RvcnRpb24sIHBpeGVsX2NvdW50KTsKKyAgfQorICByZXR1cm4gc2l6ZV9wMDsKK30KKworc3RhdGljIGludCBTdGF0TG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGVuYy0+bWV0aG9kXzsKKyAgY29uc3QgaW50IGRvX3NlYXJjaCA9IGVuYy0+ZG9fc2VhcmNoXzsKKyAgY29uc3QgaW50IGZhc3RfcHJvYmUgPSAoKG1ldGhvZCA9PSAwIHx8IG1ldGhvZCA9PSAzKSAmJiAhZG9fc2VhcmNoKTsKKyAgaW50IG51bV9wYXNzX2xlZnQgPSBlbmMtPmNvbmZpZ18tPnBhc3M7CisgIGNvbnN0IGludCB0YXNrX3BlcmNlbnQgPSAyMDsKKyAgY29uc3QgaW50IHBlcmNlbnRfcGVyX3Bhc3MgPQorICAgICAgKHRhc2tfcGVyY2VudCArIG51bV9wYXNzX2xlZnQgLyAyKSAvIG51bV9wYXNzX2xlZnQ7CisgIGNvbnN0IGludCBmaW5hbF9wZXJjZW50ID0gZW5jLT5wZXJjZW50XyArIHRhc2tfcGVyY2VudDsKKyAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPQorICAgICAgKG1ldGhvZCA+PSAzIHx8IGRvX3NlYXJjaCkgPyBSRF9PUFRfQkFTSUMgOiBSRF9PUFRfTk9ORTsKKyAgaW50IG5iX21icyA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICBQYXNzU3RhdHMgc3RhdHM7CisKKyAgSW5pdFBhc3NTdGF0cyhlbmMsICZzdGF0cyk7CisgIFJlc2V0VG9rZW5TdGF0cyhlbmMpOworCisgIC8vIEZhc3QgbW9kZTogcXVpY2sgYW5hbHlzaXMgcGFzcyBvdmVyIGZldyBtYnMuIEJldHRlciB0aGFuIG5vdGhpbmcuCisgIGlmIChmYXN0X3Byb2JlKSB7CisgICAgaWYgKG1ldGhvZCA9PSAzKSB7ICAvLyB3ZSBuZWVkIG1vcmUgc3RhdHMgZm9yIG1ldGhvZCAzIHRvIGJlIHJlbGlhYmxlLgorICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMSA6IDEwMDsKKyAgICB9IGVsc2UgeworICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMiA6IDUwOworICAgIH0KKyAgfQorCisgIHdoaWxlIChudW1fcGFzc19sZWZ0LS0gPiAwKSB7CisgICAgY29uc3QgaW50IGlzX2xhc3RfcGFzcyA9IChmYWJzKHN0YXRzLmRxKSA8PSBEUV9MSU1JVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYXNzX2xlZnQgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKTsKKyAgICBjb25zdCB1aW50NjRfdCBzaXplX3AwID0KKyAgICAgICAgT25lU3RhdFBhc3MoZW5jLCByZF9vcHQsIG5iX21icywgcGVyY2VudF9wZXJfcGFzcywgJnN0YXRzKTsKKyAgICBpZiAoc2l6ZV9wMCA9PSAwKSByZXR1cm4gMDsKKyNpZiAoREVCVUdfU0VBUkNIID4gMCkKKyAgICBwcmludGYoIiMlZCB2YWx1ZTolLjFsZiAtPiAlLjFsZiAgIHE6JS4yZiAtPiAlLjJmXG4iLAorICAgICAgICAgICBudW1fcGFzc19sZWZ0LCBzdGF0cy5sYXN0X3ZhbHVlLCBzdGF0cy52YWx1ZSwgc3RhdHMubGFzdF9xLCBzdGF0cy5xKTsKKyNlbmRpZgorICAgIGlmIChlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPiAwICYmIHNpemVfcDAgPiBQQVJUSVRJT04wX1NJWkVfTElNSVQpIHsKKyAgICAgICsrbnVtX3Bhc3NfbGVmdDsKKyAgICAgIGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+Pj0gMTsgIC8vIHN0cmVuZ3RoZW4gaGVhZGVyIGJpdCBsaW1pdGF0aW9uLi4uCisgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgc3RhcnQgb3ZlcgorICAgIH0KKyAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gSWYgbm8gdGFyZ2V0IHNpemU6IGp1c3QgZG8gc2V2ZXJhbCBwYXNzIHdpdGhvdXQgY2hhbmdpbmcgJ3EnCisgICAgaWYgKGRvX3NlYXJjaCkgeworICAgICAgQ29tcHV0ZU5leHRRKCZzdGF0cyk7CisgICAgICBpZiAoZmFicyhzdGF0cy5kcSkgPD0gRFFfTElNSVQpIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWRvX3NlYXJjaCB8fCAhc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAvLyBOZWVkIHRvIGZpbmFsaXplIHByb2JhcyBub3csIHNpbmNlIGl0IHdhc24ndCBkb25lIGR1cmluZyB0aGUgc2VhcmNoLgorICAgIEZpbmFsaXplU2tpcFByb2JhKGVuYyk7CisgICAgRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICB9CisgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoJmVuYy0+cHJvYmFfKTsgIC8vIGZpbmFsaXplIGNvc3RzCisgIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBmaW5hbF9wZXJjZW50LCAmZW5jLT5wZXJjZW50Xyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3BzCisvLworCitzdGF0aWMgY29uc3QgdWludDhfdCBrQXZlcmFnZUJ5dGVzUGVyTUJbOF0gPSB7IDUwLCAyNCwgMTYsIDksIDcsIDUsIDMsIDIgfTsKKworc3RhdGljIGludCBQcmVMb29wSW5pdGlhbGl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IHA7CisgIGludCBvayA9IDE7CisgIGNvbnN0IGludCBhdmVyYWdlX2J5dGVzX3Blcl9NQiA9IGtBdmVyYWdlQnl0ZXNQZXJNQltlbmMtPmJhc2VfcXVhbnRfID4+IDRdOworICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BhcnRzID0KKyAgICAgIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfICogYXZlcmFnZV9ieXRlc19wZXJfTUIgLyBlbmMtPm51bV9wYXJ0c187CisgIC8vIEluaXRpYWxpemUgdGhlIGJpdC13cml0ZXJzCisgIGZvciAocCA9IDA7IG9rICYmIHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgeworICAgIG9rID0gVlA4Qml0V3JpdGVySW5pdChlbmMtPnBhcnRzXyArIHAsIGJ5dGVzX3Blcl9wYXJ0cyk7CisgIH0KKyAgaWYgKCFvaykgeworICAgIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKGVuYyk7ICAvLyBtYWxsb2MgZXJyb3Igb2NjdXJyZWQKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IFBvc3RMb29wRmluYWxpemUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgb2spIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChvaykgeyAgICAgIC8vIEZpbmFsaXplIHRoZSBwYXJ0aXRpb25zLCBjaGVjayBmb3IgZXh0cmEgZXJyb3JzLgorICAgIGludCBwOworICAgIGZvciAocCA9IDA7IHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgeworICAgICAgVlA4Qml0V3JpdGVyRmluaXNoKGVuYy0+cGFydHNfICsgcCk7CisgICAgICBvayAmPSAhZW5jLT5wYXJ0c19bcF0uZXJyb3JfOworICAgIH0KKyAgfQorCisgIGlmIChvaykgeyAgICAgIC8vIEFsbCBnb29kLiBGaW5pc2ggdXAuCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIGlmIChlbmMtPnBpY18tPnN0YXRzICE9IE5VTEwpIHsgIC8vIGZpbmFsaXplIGJ5dGUgY291bnRlcnMuLi4KKyAgICAgIGludCBpLCBzOworICAgICAgZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgICAgZW5jLT5yZXNpZHVhbF9ieXRlc19baV1bc10gPSAoaW50KSgoaXQtPmJpdF9jb3VudF9bc11baV0gKyA3KSA+PiAzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKGl0KTsgICAgIC8vIC4uLmFuZCBzdG9yZSBmaWx0ZXIgc3RhdHMuCisgIH0gZWxzZSB7CisgICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAtPiBuZWVkIHRvIGRvIHNvbWUgbWVtb3J5IGNsZWFudXAuCisgICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVlA4RW5jTG9vcCgpOiBkb2VzIHRoZSBmaW5hbCBiaXRzdHJlYW0gY29kaW5nLgorCitzdGF0aWMgdm9pZCBSZXNldEFmdGVyU2tpcChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEpIHsKKyAgICAqaXQtPm56XyA9IDA7ICAvLyByZXNldCBhbGwgcHJlZGljdG9ycworICAgIGl0LT5sZWZ0X256X1s4XSA9IDA7CisgIH0gZWxzZSB7CisgICAgKml0LT5uel8gJj0gKDEgPDwgMjQpOyAgLy8gcHJlc2VydmUgdGhlIGRjX256IGJpdAorICB9Cit9CisKK2ludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgaW50IG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKKyAgaWYgKCFvaykgcmV0dXJuIDA7CisKKyAgU3RhdExvb3AoZW5jKTsgIC8vIHN0YXRzLWNvbGxlY3Rpb24gbG9vcAorCisgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgIFZQOEluaXRGaWx0ZXIoJml0KTsKKyAgZG8geworICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgIGNvbnN0IGludCBkb250X3VzZV9za2lwID0gIWVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXzsKKyAgICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKKworICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCwgTlVMTCk7CisgICAgLy8gV2FybmluZyEgb3JkZXIgaXMgaW1wb3J0YW50OiBmaXJzdCBjYWxsIFZQOERlY2ltYXRlKCkgYW5kCisgICAgLy8gKnRoZW4qIGRlY2lkZSBob3cgdG8gY29kZSB0aGUgc2tpcCBkZWNpc2lvbiBpZiB0aGVyZSdzIG9uZS4KKyAgICBpZiAoIVZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkgfHwgZG9udF91c2Vfc2tpcCkgeworICAgICAgQ29kZVJlc2lkdWFscyhpdC5id18sICZpdCwgJmluZm8pOworICAgIH0gZWxzZSB7ICAgLy8gcmVzZXQgcHJlZGljdG9ycyBhZnRlciBhIHNraXAKKyAgICAgIFJlc2V0QWZ0ZXJTa2lwKCZpdCk7CisgICAgfQorICAgIFN0b3JlU2lkZUluZm8oJml0KTsKKyAgICBWUDhTdG9yZUZpbHRlclN0YXRzKCZpdCk7CisgICAgVlA4SXRlcmF0b3JFeHBvcnQoJml0KTsKKyAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7CisgICAgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoJml0KTsKKyAgfSB3aGlsZSAob2sgJiYgVlA4SXRlcmF0b3JOZXh0KCZpdCkpOworCisgIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2luZ2xlIHBhc3MgdXNpbmcgVG9rZW4gQnVmZmVyLgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKKyNkZWZpbmUgTUlOX0NPVU5UIDk2ICAvLyBtaW5pbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZWZvcmUgdXBkYXRpbmcgc3RhdHMKKworaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgLy8gUm91Z2hseSByZWZyZXNoIHRoZSBwcm9iYSBlaWdodCB0aW1lcyBwZXIgcGFzcworICBpbnQgbWF4X2NvdW50ID0gKGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKSA+PiAzOworICBpbnQgbnVtX3Bhc3NfbGVmdCA9IGVuYy0+Y29uZmlnXy0+cGFzczsKKyAgY29uc3QgaW50IGRvX3NlYXJjaCA9IGVuYy0+ZG9fc2VhcmNoXzsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSBlbmMtPnJkX29wdF9sZXZlbF87CisgIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiAzODQ7CisgIFBhc3NTdGF0cyBzdGF0czsKKyAgaW50IG9rOworCisgIEluaXRQYXNzU3RhdHMoZW5jLCAmc3RhdHMpOworICBvayA9IFByZUxvb3BJbml0aWFsaXplKGVuYyk7CisgIGlmICghb2spIHJldHVybiAwOworCisgIGlmIChtYXhfY291bnQgPCBNSU5fQ09VTlQpIG1heF9jb3VudCA9IE1JTl9DT1VOVDsKKworICBhc3NlcnQoZW5jLT5udW1fcGFydHNfID09IDEpOworICBhc3NlcnQoZW5jLT51c2VfdG9rZW5zXyk7CisgIGFzc2VydChwcm9iYS0+dXNlX3NraXBfcHJvYmFfID09IDApOworICBhc3NlcnQocmRfb3B0ID49IFJEX09QVF9CQVNJQyk7ICAgLy8gb3RoZXJ3aXNlLCB0b2tlbi1idWZmZXIgd29uJ3QgYmUgdXNlZnVsCisgIGFzc2VydChudW1fcGFzc19sZWZ0ID4gMCk7CisKKyAgd2hpbGUgKG9rICYmIG51bV9wYXNzX2xlZnQtLSA+IDApIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9wYXNzID0gKGZhYnMoc3RhdHMuZHEpIDw9IERRX0xJTUlUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3Bhc3NfbGVmdCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApOworICAgIHVpbnQ2NF90IHNpemVfcDAgPSAwOworICAgIHVpbnQ2NF90IGRpc3RvcnRpb24gPSAwOworICAgIGludCBjbnQgPSBtYXhfY291bnQ7CisgICAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKKyAgICBTZXRMb29wUGFyYW1zKGVuYywgc3RhdHMucSk7CisgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgUmVzZXRUb2tlblN0YXRzKGVuYyk7CisgICAgICBWUDhJbml0RmlsdGVyKCZpdCk7ICAvLyBkb24ndCBjb2xsZWN0IHN0YXRzIHVudGlsIGxhc3QgcGFzcyAodG9vIGNvc3RseSkKKyAgICB9CisgICAgVlA4VEJ1ZmZlckNsZWFyKCZlbmMtPnRva2Vuc18pOworICAgIGRvIHsKKyAgICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0LCBOVUxMKTsKKyAgICAgIGlmICgtLWNudCA8IDApIHsKKyAgICAgICAgRmluYWxpemVUb2tlblByb2Jhcyhwcm9iYSk7CisgICAgICAgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMocHJvYmEpOyAgLy8gcmVmcmVzaCBjb3N0IHRhYmxlcyBmb3IgcmQtb3B0CisgICAgICAgIGNudCA9IG1heF9jb3VudDsKKyAgICAgIH0KKyAgICAgIFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCk7CisgICAgICBvayA9IFJlY29yZFRva2VucygmaXQsICZpbmZvLCAmZW5jLT50b2tlbnNfKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IoZW5jLT5waWNfLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNpemVfcDAgKz0gaW5mby5IOworICAgICAgZGlzdG9ydGlvbiArPSBpbmZvLkQ7CisgICAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICAgIFN0b3JlU2lkZUluZm8oJml0KTsKKyAgICAgICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOworICAgICAgICBWUDhJdGVyYXRvckV4cG9ydCgmaXQpOworICAgICAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7CisgICAgICB9CisgICAgICBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeSgmaXQpOworICAgIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQpKTsKKyAgICBpZiAoIW9rKSBicmVhazsKKworICAgIHNpemVfcDAgKz0gZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV87CisgICAgaWYgKHN0YXRzLmRvX3NpemVfc2VhcmNoKSB7CisgICAgICB1aW50NjRfdCBzaXplID0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICAgICAgc2l6ZSArPSBWUDhFc3RpbWF0ZVRva2VuU2l6ZSgmZW5jLT50b2tlbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcHJvYmEtPmNvZWZmc18pOworICAgICAgc2l6ZSA9IChzaXplICsgc2l6ZV9wMCArIDEwMjQpID4+IDExOyAgLy8gLT4gc2l6ZSBpbiBieXRlcworICAgICAgc2l6ZSArPSBIRUFERVJfU0laRV9FU1RJTUFURTsKKyAgICAgIHN0YXRzLnZhbHVlID0gKGRvdWJsZSlzaXplOworICAgIH0gZWxzZSB7ICAvLyBjb21wdXRlIGFuZCBzdG9yZSBQU05SCisgICAgICBzdGF0cy52YWx1ZSA9IEdldFBTTlIoZGlzdG9ydGlvbiwgcGl4ZWxfY291bnQpOworICAgIH0KKworI2lmIChERUJVR19TRUFSQ0ggPiAwKQorICAgIHByaW50ZigiIyUyZCBtZXRyaWM6JS4xbGYgLT4gJS4xbGYgICBsYXN0X3E9JS4ybGYgcT0lLjJsZiBkcT0lLjJsZlxuIiwKKyAgICAgICAgICAgbnVtX3Bhc3NfbGVmdCwgc3RhdHMubGFzdF92YWx1ZSwgc3RhdHMudmFsdWUsCisgICAgICAgICAgIHN0YXRzLmxhc3RfcSwgc3RhdHMucSwgc3RhdHMuZHEpOworI2VuZGlmCisgICAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+IDAgJiYgc2l6ZV9wMCA+IFBBUlRJVElPTjBfU0laRV9MSU1JVCkgeworICAgICAgKytudW1fcGFzc19sZWZ0OworICAgICAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID4+PSAxOyAgLy8gc3RyZW5ndGhlbiBoZWFkZXIgYml0IGxpbWl0YXRpb24uLi4KKyAgICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgICAgUmVzZXRTaWRlSW5mbygmaXQpOworICAgICAgfQorICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uYW5kIHN0YXJ0IG92ZXIKKyAgICB9CisgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgYnJlYWs7ICAgLy8gZG9uZQorICAgIH0KKyAgICBpZiAoZG9fc2VhcmNoKSB7CisgICAgICBDb21wdXRlTmV4dFEoJnN0YXRzKTsgIC8vIEFkanVzdCBxCisgICAgfQorICB9CisgIGlmIChvaykgeworICAgIGlmICghc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAgIEZpbmFsaXplVG9rZW5Qcm9iYXMoJmVuYy0+cHJvYmFfKTsKKyAgICB9CisgICAgb2sgPSBWUDhFbWl0VG9rZW5zKCZlbmMtPnRva2Vuc18sIGVuYy0+cGFydHNfICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfLCAxKTsKKyAgfQorICBvayA9IG9rICYmIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGVuYy0+cGVyY2VudF8gKyAyMCwgJmVuYy0+cGVyY2VudF8pOworICByZXR1cm4gUG9zdExvb3BGaW5hbGl6ZSgmaXQsIG9rKTsKK30KKworI2Vsc2UKKworaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgKHZvaWQpZW5jOworICByZXR1cm4gMDsgICAvLyB3ZSBzaG91bGRuJ3QgYmUgaGVyZS4KK30KKworI2VuZGlmICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmVmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgTUFYX0NPU1QgMS5lMzgKKworLy8gTnVtYmVyIG9mIHBhcnRpdGlvbnMgZm9yIHRoZSB0aHJlZSBkb21pbmFudCAobGl0ZXJhbCwgcmVkIGFuZCBibHVlKSBzeW1ib2wKKy8vIGNvc3RzLgorI2RlZmluZSBOVU1fUEFSVElUSU9OUyA0CisvLyBUaGUgc2l6ZSBvZiB0aGUgYmluLWhhc2ggY29ycmVzcG9uZGluZyB0byB0aGUgdGhyZWUgZG9taW5hbnQgY29zdHMuCisjZGVmaW5lIEJJTl9TSVpFIChOVU1fUEFSVElUSU9OUyAqIE5VTV9QQVJUSVRJT05TICogTlVNX1BBUlRJVElPTlMpCisvLyBNYXhpbXVtIG51bWJlciBvZiBoaXN0b2dyYW1zIGFsbG93ZWQgaW4gZ3JlZWR5IGNvbWJpbmluZyBhbGdvcml0aG0uCisjZGVmaW5lIE1BWF9ISVNUT19HUkVFRFkgMTAwCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNsZWFyKFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKKyAgdWludDMyX3QqIGNvbnN0IGxpdGVyYWwgPSBwLT5saXRlcmFsXzsKKyAgY29uc3QgaW50IGNhY2hlX2JpdHMgPSBwLT5wYWxldHRlX2NvZGVfYml0c187CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoY2FjaGVfYml0cyk7CisgIG1lbXNldChwLCAwLCBoaXN0b19zaXplKTsKKyAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gY2FjaGVfYml0czsKKyAgcC0+bGl0ZXJhbF8gPSBsaXRlcmFsOworfQorCisvLyBTd2FwIHR3byBoaXN0b2dyYW0gcG9pbnRlcnMuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Td2FwKFZQOExIaXN0b2dyYW0qKiBjb25zdCBBLCBWUDhMSGlzdG9ncmFtKiogY29uc3QgQikgeworICBWUDhMSGlzdG9ncmFtKiBjb25zdCB0bXAgPSAqQTsKKyAgKkEgPSAqQjsKKyAgKkIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNvcHkoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBkc3QpIHsKKyAgdWludDMyX3QqIGNvbnN0IGRzdF9saXRlcmFsID0gZHN0LT5saXRlcmFsXzsKKyAgY29uc3QgaW50IGRzdF9jYWNoZV9iaXRzID0gZHN0LT5wYWxldHRlX2NvZGVfYml0c187CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoZHN0X2NhY2hlX2JpdHMpOworICBhc3NlcnQoc3JjLT5wYWxldHRlX2NvZGVfYml0c18gPT0gZHN0X2NhY2hlX2JpdHMpOworICBtZW1jcHkoZHN0LCBzcmMsIGhpc3RvX3NpemUpOworICBkc3QtPmxpdGVyYWxfID0gZHN0X2xpdGVyYWw7Cit9CisKK2ludCBWUDhMR2V0SGlzdG9ncmFtU2l6ZShpbnQgY2FjaGVfYml0cykgeworICBjb25zdCBpbnQgbGl0ZXJhbF9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGNhY2hlX2JpdHMpOworICBjb25zdCBzaXplX3QgdG90YWxfc2l6ZSA9IHNpemVvZihWUDhMSGlzdG9ncmFtKSArIHNpemVvZihpbnQpICogbGl0ZXJhbF9zaXplOworICBhc3NlcnQodG90YWxfc2l6ZSA8PSAoc2l6ZV90KTB4N2ZmZmZmZmYpOworICByZXR1cm4gKGludCl0b3RhbF9zaXplOworfQorCit2b2lkIFZQOExGcmVlSGlzdG9ncmFtKFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIFdlYlBTYWZlRnJlZShoaXN0byk7Cit9CisKK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW1TZXQoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG8pIHsKKyAgV2ViUFNhZmVGcmVlKGhpc3RvKTsKK30KKwordm9pZCBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgYy5jdXJfcG9zLCBOVUxMLCAwKTsKKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9Cit9CisKK3ZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7CisgIGlmIChwYWxldHRlX2NvZGVfYml0cyA+PSAwKSB7CisgICAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gcGFsZXR0ZV9jb2RlX2JpdHM7CisgIH0KKyAgSGlzdG9ncmFtQ2xlYXIocCk7CisgIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMocmVmcywgcCk7Cit9CisKK3ZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7CisgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOworICBIaXN0b2dyYW1DbGVhcihwKTsKK30KKworVlA4TEhpc3RvZ3JhbSogVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGludCBjYWNoZV9iaXRzKSB7CisgIFZQOExIaXN0b2dyYW0qIGhpc3RvID0gTlVMTDsKKyAgY29uc3QgaW50IHRvdGFsX3NpemUgPSBWUDhMR2V0SGlzdG9ncmFtU2l6ZShjYWNoZV9iaXRzKTsKKyAgdWludDhfdCogY29uc3QgbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtb3J5KSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGhpc3RvID0gKFZQOExIaXN0b2dyYW0qKW1lbW9yeTsKKyAgLy8gbGl0ZXJhbF8gd29uJ3QgbmVjZXNzYXJ5IGJlIGFsaWduZWQuCisgIGhpc3RvLT5saXRlcmFsXyA9ICh1aW50MzJfdCopKG1lbW9yeSArIHNpemVvZihWUDhMSGlzdG9ncmFtKSk7CisgIFZQOExIaXN0b2dyYW1Jbml0KGhpc3RvLCBjYWNoZV9iaXRzKTsKKyAgcmV0dXJuIGhpc3RvOworfQorCitWUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKSB7CisgIGludCBpOworICBWUDhMSGlzdG9ncmFtU2V0KiBzZXQ7CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoY2FjaGVfYml0cyk7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0KKyAgICAgIHNpemVvZigqc2V0KSArIHNpemUgKiAoc2l6ZW9mKCpzZXQtPmhpc3RvZ3JhbXMpICsKKyAgICAgIGhpc3RvX3NpemUgKyBXRUJQX0FMSUdOX0NTVCk7CisgIHVpbnQ4X3QqIG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbW9yeSkpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIHNldCA9IChWUDhMSGlzdG9ncmFtU2V0KiltZW1vcnk7CisgIG1lbW9yeSArPSBzaXplb2YoKnNldCk7CisgIHNldC0+aGlzdG9ncmFtcyA9IChWUDhMSGlzdG9ncmFtKiopbWVtb3J5OworICBtZW1vcnkgKz0gc2l6ZSAqIHNpemVvZigqc2V0LT5oaXN0b2dyYW1zKTsKKyAgc2V0LT5tYXhfc2l6ZSA9IHNpemU7CisgIHNldC0+c2l6ZSA9IHNpemU7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBtZW1vcnkgPSAodWludDhfdCopV0VCUF9BTElHTihtZW1vcnkpOworICAgIHNldC0+aGlzdG9ncmFtc1tpXSA9IChWUDhMSGlzdG9ncmFtKiltZW1vcnk7CisgICAgLy8gbGl0ZXJhbF8gd29uJ3QgbmVjZXNzYXJ5IGJlIGFsaWduZWQuCisgICAgc2V0LT5oaXN0b2dyYW1zW2ldLT5saXRlcmFsXyA9ICh1aW50MzJfdCopKG1lbW9yeSArIHNpemVvZihWUDhMSGlzdG9ncmFtKSk7CisgICAgVlA4TEhpc3RvZ3JhbUluaXQoc2V0LT5oaXN0b2dyYW1zW2ldLCBjYWNoZV9iaXRzKTsKKyAgICBtZW1vcnkgKz0gaGlzdG9fc2l6ZTsKKyAgfQorICByZXR1cm4gc2V0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbnN0IGRpc3RhbmNlX21vZGlmaWVyKShpbnQsIGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlX21vZGlmaWVyX2FyZzApIHsKKyAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICsraGlzdG8tPmFscGhhX1tQaXhPckNvcHlMaXRlcmFsKHYsIDMpXTsKKyAgICArK2hpc3RvLT5yZWRfW1BpeE9yQ29weUxpdGVyYWwodiwgMildOworICAgICsraGlzdG8tPmxpdGVyYWxfW1BpeE9yQ29weUxpdGVyYWwodiwgMSldOworICAgICsraGlzdG8tPmJsdWVfW1BpeE9yQ29weUxpdGVyYWwodiwgMCldOworICB9IGVsc2UgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKKyAgICBjb25zdCBpbnQgbGl0ZXJhbF9peCA9CisgICAgICAgIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArIFBpeE9yQ29weUNhY2hlSWR4KHYpOworICAgICsraGlzdG8tPmxpdGVyYWxfW2xpdGVyYWxfaXhdOworICB9IGVsc2UgeworICAgIGludCBjb2RlLCBleHRyYV9iaXRzOworICAgIFZQOExQcmVmaXhFbmNvZGVCaXRzKFBpeE9yQ29weUxlbmd0aCh2KSwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgICArK2hpc3RvLT5saXRlcmFsX1tOVU1fTElURVJBTF9DT0RFUyArIGNvZGVdOworICAgIGlmIChkaXN0YW5jZV9tb2RpZmllciA9PSBOVUxMKSB7CisgICAgICBWUDhMUHJlZml4RW5jb2RlQml0cyhQaXhPckNvcHlEaXN0YW5jZSh2KSwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TFByZWZpeEVuY29kZUJpdHMoCisgICAgICAgICAgZGlzdGFuY2VfbW9kaWZpZXIoZGlzdGFuY2VfbW9kaWZpZXJfYXJnMCwgUGl4T3JDb3B5RGlzdGFuY2UodikpLAorICAgICAgICAgICZjb2RlLCAmZXh0cmFfYml0cyk7CisgICAgfQorICAgICsraGlzdG8tPmRpc3RhbmNlX1tjb2RlXTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cm9weS1yZWxhdGVkIGZ1bmN0aW9ucy4KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBCaXRzRW50cm9weVJlZmluZShjb25zdCBWUDhMQml0RW50cm9weSogZW50cm9weSkgeworICBkb3VibGUgbWl4OworICBpZiAoZW50cm9weS0+bm9uemVyb3MgPCA1KSB7CisgICAgaWYgKGVudHJvcHktPm5vbnplcm9zIDw9IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBUd28gc3ltYm9scywgdGhleSB3aWxsIGJlIDAgYW5kIDEgaW4gYSBIdWZmbWFuIGNvZGUuCisgICAgLy8gTGV0J3MgbWl4IGluIGEgYml0IG9mIGVudHJvcHkgdG8gZmF2b3IgZ29vZCBjbHVzdGVyaW5nIHdoZW4KKyAgICAvLyBkaXN0cmlidXRpb25zIG9mIHRoZXNlIGFyZSBjb21iaW5lZC4KKyAgICBpZiAoZW50cm9weS0+bm9uemVyb3MgPT0gMikgeworICAgICAgcmV0dXJuIDAuOTkgKiBlbnRyb3B5LT5zdW0gKyAwLjAxICogZW50cm9weS0+ZW50cm9weTsKKyAgICB9CisgICAgLy8gTm8gbWF0dGVyIHdoYXQgdGhlIGVudHJvcHkgc2F5cywgd2UgY2Fubm90IGJlIGJldHRlciB0aGFuIG1pbl9saW1pdAorICAgIC8vIHdpdGggSHVmZm1hbiBjb2RpbmcuIEkgYW0gbWl4aW5nIGEgYml0IG9mIGVudHJvcHkgaW50byB0aGUKKyAgICAvLyBtaW5fbGltaXQgc2luY2UgaXQgcHJvZHVjZXMgbXVjaCBiZXR0ZXIgKH4wLjUgJSkgY29tcHJlc3Npb24gcmVzdWx0cworICAgIC8vIHBlcmhhcHMgYmVjYXVzZSBvZiBiZXR0ZXIgZW50cm9weSBjbHVzdGVyaW5nLgorICAgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA9PSAzKSB7CisgICAgICBtaXggPSAwLjk1OworICAgIH0gZWxzZSB7CisgICAgICBtaXggPSAwLjc7ICAvLyBub256ZXJvcyA9PSA0LgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtaXggPSAwLjYyNzsKKyAgfQorCisgIHsKKyAgICBkb3VibGUgbWluX2xpbWl0ID0gMiAqIGVudHJvcHktPnN1bSAtIGVudHJvcHktPm1heF92YWw7CisgICAgbWluX2xpbWl0ID0gbWl4ICogbWluX2xpbWl0ICsgKDEuMCAtIG1peCkgKiBlbnRyb3B5LT5lbnRyb3B5OworICAgIHJldHVybiAoZW50cm9weS0+ZW50cm9weSA8IG1pbl9saW1pdCkgPyBtaW5fbGltaXQgOiBlbnRyb3B5LT5lbnRyb3B5OworICB9Cit9CisKK2RvdWJsZSBWUDhMQml0c0VudHJvcHkoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbikgeworICBWUDhMQml0RW50cm9weSBlbnRyb3B5OworICBWUDhMQml0c0VudHJvcHlVbnJlZmluZWQoYXJyYXksIG4sICZlbnRyb3B5KTsKKworICByZXR1cm4gQml0c0VudHJvcHlSZWZpbmUoJmVudHJvcHkpOworfQorCitzdGF0aWMgZG91YmxlIEluaXRpYWxIdWZmbWFuQ29zdCh2b2lkKSB7CisgIC8vIFNtYWxsIGJpYXMgYmVjYXVzZSBIdWZmbWFuIGNvZGUgbGVuZ3RoIGlzIHR5cGljYWxseSBub3Qgc3RvcmVkIGluCisgIC8vIGZ1bGwgbGVuZ3RoLgorICBzdGF0aWMgY29uc3QgaW50IGtIdWZmbWFuQ29kZU9mSHVmZm1hbkNvZGVTaXplID0gQ09ERV9MRU5HVEhfQ09ERVMgKiAzOworICBzdGF0aWMgY29uc3QgZG91YmxlIGtTbWFsbEJpYXMgPSA5LjE7CisgIHJldHVybiBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSAtIGtTbWFsbEJpYXM7Cit9CisKKy8vIEZpbmFsaXplIHRoZSBIdWZmbWFuIGNvc3QgYmFzZWQgb24gc3RyZWFrIG51bWJlcnMgYW5kIGxlbmd0aCB0eXBlICg8MyBvciA+PTMpCitzdGF0aWMgZG91YmxlIEZpbmFsSHVmZm1hbkNvc3QoY29uc3QgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIC8vIFRoZSBjb25zdGFudHMgaW4gdGhpcyBmdW5jdGlvbiBhcmUgZXhwZXJpbWVudGFsIGFuZCBnb3Qgcm91bmRlZCBmcm9tCisgIC8vIHRoZWlyIG9yaWdpbmFsIHZhbHVlcyBpbiAxLzggd2hlbiBzd2l0Y2hlZCB0byAxLzEwMjQuCisgIGRvdWJsZSByZXR2YWwgPSBJbml0aWFsSHVmZm1hbkNvc3QoKTsKKyAgLy8gU2Vjb25kIGNvZWZmaWNpZW50OiBNYW55IHplcm9zIGluIHRoZSBoaXN0b2dyYW0gYXJlIGNvdmVyZWQgZWZmaWNpZW50bHkKKyAgLy8gYnkgYSBydW4tbGVuZ3RoIGVuY29kZS4gT3JpZ2luYWxseSAyLzguCisgIHJldHZhbCArPSBzdGF0cy0+Y291bnRzWzBdICogMS41NjI1ICsgMC4yMzQzNzUgKiBzdGF0cy0+c3RyZWFrc1swXVsxXTsKKyAgLy8gU2Vjb25kIGNvZWZmaWNpZW50OiBDb25zdGFudCB2YWx1ZXMgYXJlIGVuY29kZWQgbGVzcyBlZmZpY2llbnRseSwgYnV0IHN0aWxsCisgIC8vIFJMRSdlZC4gT3JpZ2luYWxseSA2LzguCisgIHJldHZhbCArPSBzdGF0cy0+Y291bnRzWzFdICogMi41NzgxMjUgKyAwLjcwMzEyNSAqIHN0YXRzLT5zdHJlYWtzWzFdWzFdOworICAvLyAwcyBhcmUgdXN1YWxseSBlbmNvZGVkIG1vcmUgZWZmaWNpZW50bHkgdGhhbiBub24tMHMuCisgIC8vIE9yaWdpbmFsbHkgMTUvOC4KKyAgcmV0dmFsICs9IDEuNzk2ODc1ICogc3RhdHMtPnN0cmVha3NbMF1bMF07CisgIC8vIE9yaWdpbmFsbHkgMjYvOC4KKyAgcmV0dmFsICs9IDMuMjgxMjUgKiBzdGF0cy0+c3RyZWFrc1sxXVswXTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLy8gR2V0IHRoZSBzeW1ib2wgZW50cm9weSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAncG9wdWxhdGlvbicuCisvLyBTZXQgJ3RyaXZpYWxfc3ltJywgaWYgdGhlcmUncyBvbmx5IG9uZSBzeW1ib2wgcHJlc2VudCBpbiB0aGUgZGlzdHJpYnV0aW9uLgorc3RhdGljIGRvdWJsZSBQb3B1bGF0aW9uQ29zdChjb25zdCB1aW50MzJfdCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHRyaXZpYWxfc3ltKSB7CisgIFZQOExCaXRFbnRyb3B5IGJpdF9lbnRyb3B5OworICBWUDhMU3RyZWFrcyBzdGF0czsKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWQocG9wdWxhdGlvbiwgbGVuZ3RoLCAmYml0X2VudHJvcHksICZzdGF0cyk7CisgIGlmICh0cml2aWFsX3N5bSAhPSBOVUxMKSB7CisgICAgKnRyaXZpYWxfc3ltID0gKGJpdF9lbnRyb3B5Lm5vbnplcm9zID09IDEpID8gYml0X2VudHJvcHkubm9uemVyb19jb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVlA4TF9OT05fVFJJVklBTF9TWU07CisgIH0KKworICByZXR1cm4gQml0c0VudHJvcHlSZWZpbmUoJmJpdF9lbnRyb3B5KSArIEZpbmFsSHVmZm1hbkNvc3QoJnN0YXRzKTsKK30KKworLy8gdHJpdmlhbF9hdF9lbmQgaXMgMSBpZiB0aGUgdHdvIGhpc3RvZ3JhbXMgb25seSBoYXZlIG9uZSBlbGVtZW50IHRoYXQgaXMKKy8vIG5vbi16ZXJvOiBib3RoIHRoZSB6ZXJvLXRoIG9uZSwgb3IgYm90aCB0aGUgbGFzdCBvbmUuCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldENvbWJpbmVkRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHRyaXZpYWxfYXRfZW5kKSB7CisgIFZQOExTdHJlYWtzIHN0YXRzOworICBpZiAodHJpdmlhbF9hdF9lbmQpIHsKKyAgICAvLyBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgZHVlIHRvIHBhbGV0dGl6YXRpb24gdGhhdCB0cmFuc2Zvcm1zIGFuIGluZGV4ZWQKKyAgICAvLyBwaXhlbCBpbnRvIDB4ZmYwMDAwMDAgfCAocGl4ZWwgPDwgOCkgaW4gVlA4TEJ1bmRsZUNvbG9yTWFwLgorICAgIC8vIEJpdHNFbnRyb3B5UmVmaW5lIGlzIDAgZm9yIGhpc3RvZ3JhbXMgd2l0aCBvbmx5IG9uZSBub24temVybyB2YWx1ZS4KKyAgICAvLyBPbmx5IEZpbmFsSHVmZm1hbkNvc3QgbmVlZHMgdG8gYmUgZXZhbHVhdGVkLgorICAgIG1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOworICAgIC8vIERlYWwgd2l0aCB0aGUgbm9uLXplcm8gdmFsdWUgYXQgaW5kZXggMCBvciBsZW5ndGgtMS4KKyAgICBzdGF0cy5zdHJlYWtzWzFdWzBdICs9IDE7CisgICAgLy8gRGVhbCB3aXRoIHRoZSBmb2xsb3dpbmcvcHJldmlvdXMgemVybyBzdHJlYWsuCisgICAgc3RhdHMuY291bnRzWzBdICs9IDE7CisgICAgc3RhdHMuc3RyZWFrc1swXVsxXSArPSBsZW5ndGggLSAxOworICAgIHJldHVybiBGaW5hbEh1ZmZtYW5Db3N0KCZzdGF0cyk7CisgIH0gZWxzZSB7CisgICAgVlA4TEJpdEVudHJvcHkgYml0X2VudHJvcHk7CisgICAgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZChYLCBZLCBsZW5ndGgsICZiaXRfZW50cm9weSwgJnN0YXRzKTsKKworICAgIHJldHVybiBCaXRzRW50cm9weVJlZmluZSgmYml0X2VudHJvcHkpICsgRmluYWxIdWZmbWFuQ29zdCgmc3RhdHMpOworICB9Cit9CisKKy8vIEVzdGltYXRlcyB0aGUgRW50cm9weSArIEh1ZmZtYW4gKyBvdGhlciBibG9jayBvdmVyaGVhZCBzaXplIGNvc3QuCitkb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7CisgIHJldHVybgorICAgICAgUG9wdWxhdGlvbkNvc3QoCisgICAgICAgICAgcC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwLT5wYWxldHRlX2NvZGVfYml0c18pLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgTlVMTCkKKyAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgTlVMTCkKKyAgICAgICsgVlA4TEV4dHJhQ29zdChwLT5saXRlcmFsXyArIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTEVOR1RIX0NPREVTKQorICAgICAgKyBWUDhMRXh0cmFDb3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgaGlzdG9ncmFtIGNvbWJpbmUvY29zdC1ldmFsIGZ1bmN0aW9ucworCitzdGF0aWMgaW50IEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29zdCkgeworICBjb25zdCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMgPSBhLT5wYWxldHRlX2NvZGVfYml0c187CisgIGludCB0cml2aWFsX2F0X2VuZCA9IDA7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgKmNvc3QgKz0gR2V0Q29tYmluZWRFbnRyb3B5KGEtPmxpdGVyYWxfLCBiLT5saXRlcmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwYWxldHRlX2NvZGVfYml0cyksIDApOworICAqY29zdCArPSBWUDhMRXh0cmFDb3N0Q29tYmluZWQoYS0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPmxpdGVyYWxfICsgTlVNX0xJVEVSQUxfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fTEVOR1RIX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgIGlmIChhLT50cml2aWFsX3N5bWJvbF8gIT0gVlA4TF9OT05fVFJJVklBTF9TWU0gJiYKKyAgICAgIGEtPnRyaXZpYWxfc3ltYm9sXyA9PSBiLT50cml2aWFsX3N5bWJvbF8pIHsKKyAgICAvLyBBLCBSIGFuZCBCIGFyZSBhbGwgMCBvciAweGZmLgorICAgIGNvbnN0IHVpbnQzMl90IGNvbG9yX2EgPSAoYS0+dHJpdmlhbF9zeW1ib2xfID4+IDI0KSAmIDB4ZmY7CisgICAgY29uc3QgdWludDMyX3QgY29sb3JfciA9IChhLT50cml2aWFsX3N5bWJvbF8gPj4gMTYpICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBjb2xvcl9iID0gKGEtPnRyaXZpYWxfc3ltYm9sXyA+PiAwKSAmIDB4ZmY7CisgICAgaWYgKChjb2xvcl9hID09IDAgfHwgY29sb3JfYSA9PSAweGZmKSAmJgorICAgICAgICAoY29sb3JfciA9PSAwIHx8IGNvbG9yX3IgPT0gMHhmZikgJiYKKyAgICAgICAgKGNvbG9yX2IgPT0gMCB8fCBjb2xvcl9iID09IDB4ZmYpKSB7CisgICAgICB0cml2aWFsX2F0X2VuZCA9IDE7CisgICAgfQorICB9CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5yZWRfLCBiLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgdHJpdmlhbF9hdF9lbmQpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5ibHVlXywgYi0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCB0cml2aWFsX2F0X2VuZCk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPSBHZXRDb21iaW5lZEVudHJvcHkoYS0+YWxwaGFfLCBiLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpdmlhbF9hdF9lbmQpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTLCAwKTsKKyAgKmNvc3QgKz0KKyAgICAgIFZQOExFeHRyYUNvc3RDb21iaW5lZChhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIaXN0b2dyYW1BZGQoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICBWUDhMSGlzdG9ncmFtQWRkKGEsIGIsIG91dCk7CisgIG91dC0+dHJpdmlhbF9zeW1ib2xfID0gKGEtPnRyaXZpYWxfc3ltYm9sXyA9PSBiLT50cml2aWFsX3N5bWJvbF8pCisgICAgICAgICAgICAgICAgICAgICAgID8gYS0+dHJpdmlhbF9zeW1ib2xfCisgICAgICAgICAgICAgICAgICAgICAgIDogVlA4TF9OT05fVFJJVklBTF9TWU07Cit9CisKKy8vIFBlcmZvcm1zIG91dCA9IGEgKyBiLCBjb21wdXRpbmcgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSAtIEMoYikgd2hpbGUgY29tcGFyaW5nCisvLyB0byB0aGUgdGhyZXNob2xkIHZhbHVlICdjb3N0X3RocmVzaG9sZCcuIFRoZSBzY29yZSByZXR1cm5lZCBpcworLy8gIFNjb3JlID0gQyhhK2IpIC0gQyhhKSAtIEMoYiksIHdoZXJlIEMoYSkgKyBDKGIpIGlzIGtub3duIGFuZCBmaXhlZC4KKy8vIFNpbmNlIHRoZSBwcmV2aW91cyBzY29yZSBwYXNzZWQgaXMgJ2Nvc3RfdGhyZXNob2xkJywgd2Ugb25seSBuZWVkIHRvIGNvbXBhcmUKKy8vIHRoZSBwYXJ0aWFsIGNvc3QgYWdhaW5zdCAnY29zdF90aHJlc2hvbGQgKyBDKGEpICsgQyhiKScgdG8gcG9zc2libHkgYmFpbC1vdXQKKy8vIGVhcmx5Lgorc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRFdmFsKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7CisgIGRvdWJsZSBjb3N0ID0gMDsKKyAgY29uc3QgZG91YmxlIHN1bV9jb3N0ID0gYS0+Yml0X2Nvc3RfICsgYi0+Yml0X2Nvc3RfOworICBjb3N0X3RocmVzaG9sZCArPSBzdW1fY29zdDsKKworICBpZiAoR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGEsIGIsIGNvc3RfdGhyZXNob2xkLCAmY29zdCkpIHsKKyAgICBIaXN0b2dyYW1BZGQoYSwgYiwgb3V0KTsKKyAgICBvdXQtPmJpdF9jb3N0XyA9IGNvc3Q7CisgICAgb3V0LT5wYWxldHRlX2NvZGVfYml0c18gPSBhLT5wYWxldHRlX2NvZGVfYml0c187CisgIH0KKworICByZXR1cm4gY29zdCAtIHN1bV9jb3N0OworfQorCisvLyBTYW1lIGFzIEhpc3RvZ3JhbUFkZEV2YWwoKSwgZXhjZXB0IHRoYXQgdGhlIHJlc3VsdGluZyBoaXN0b2dyYW0KKy8vIGlzIG5vdCBzdG9yZWQuIE9ubHkgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSBpcyBldmFsdWF0ZWQuIFdlIG9taXQKKy8vIHRoZSB0ZXJtIEMoYikgd2hpY2ggaXMgY29uc3RhbnQgb3ZlciBhbGwgdGhlIGV2YWx1YXRpb25zLgorc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRUaHJlc2goY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29zdF90aHJlc2hvbGQpIHsKKyAgZG91YmxlIGNvc3QgPSAtYS0+Yml0X2Nvc3RfOworICBHZXRDb21iaW5lZEhpc3RvZ3JhbUVudHJvcHkoYSwgYiwgY29zdF90aHJlc2hvbGQsICZjb3N0KTsKKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBjb3N0IHJhbmdlIGZvciB0aGUgdGhyZWUgZG9taW5hbnQgZW50cm9weQorLy8gc3ltYm9scy4KKy8vIFRPRE8oc2thbCk6IEV2YWx1YXRlIGlmIGZsb2F0IGNhbiBiZSB1c2VkIGhlcmUgaW5zdGVhZCBvZiBkb3VibGUgZm9yCisvLyByZXByZXNlbnRpbmcgdGhlIGVudHJvcHkgY29zdHMuCit0eXBlZGVmIHN0cnVjdCB7CisgIGRvdWJsZSBsaXRlcmFsX21heF87CisgIGRvdWJsZSBsaXRlcmFsX21pbl87CisgIGRvdWJsZSByZWRfbWF4XzsKKyAgZG91YmxlIHJlZF9taW5fOworICBkb3VibGUgYmx1ZV9tYXhfOworICBkb3VibGUgYmx1ZV9taW5fOworfSBEb21pbmFudENvc3RSYW5nZTsKKworc3RhdGljIHZvaWQgRG9taW5hbnRDb3N0UmFuZ2VJbml0KERvbWluYW50Q29zdFJhbmdlKiBjb25zdCBjKSB7CisgIGMtPmxpdGVyYWxfbWF4XyA9IDAuOworICBjLT5saXRlcmFsX21pbl8gPSBNQVhfQ09TVDsKKyAgYy0+cmVkX21heF8gPSAwLjsKKyAgYy0+cmVkX21pbl8gPSBNQVhfQ09TVDsKKyAgYy0+Ymx1ZV9tYXhfID0gMC47CisgIGMtPmJsdWVfbWluXyA9IE1BWF9DT1NUOworfQorCitzdGF0aWMgdm9pZCBVcGRhdGVEb21pbmFudENvc3RSYW5nZSgKKyAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBoLCBEb21pbmFudENvc3RSYW5nZSogY29uc3QgYykgeworICBpZiAoYy0+bGl0ZXJhbF9tYXhfIDwgaC0+bGl0ZXJhbF9jb3N0XykgYy0+bGl0ZXJhbF9tYXhfID0gaC0+bGl0ZXJhbF9jb3N0XzsKKyAgaWYgKGMtPmxpdGVyYWxfbWluXyA+IGgtPmxpdGVyYWxfY29zdF8pIGMtPmxpdGVyYWxfbWluXyA9IGgtPmxpdGVyYWxfY29zdF87CisgIGlmIChjLT5yZWRfbWF4XyA8IGgtPnJlZF9jb3N0XykgYy0+cmVkX21heF8gPSBoLT5yZWRfY29zdF87CisgIGlmIChjLT5yZWRfbWluXyA+IGgtPnJlZF9jb3N0XykgYy0+cmVkX21pbl8gPSBoLT5yZWRfY29zdF87CisgIGlmIChjLT5ibHVlX21heF8gPCBoLT5ibHVlX2Nvc3RfKSBjLT5ibHVlX21heF8gPSBoLT5ibHVlX2Nvc3RfOworICBpZiAoYy0+Ymx1ZV9taW5fID4gaC0+Ymx1ZV9jb3N0XykgYy0+Ymx1ZV9taW5fID0gaC0+Ymx1ZV9jb3N0XzsKK30KKworc3RhdGljIHZvaWQgVXBkYXRlSGlzdG9ncmFtQ29zdChWUDhMSGlzdG9ncmFtKiBjb25zdCBoKSB7CisgIHVpbnQzMl90IGFscGhhX3N5bSwgcmVkX3N5bSwgYmx1ZV9zeW07CisgIGNvbnN0IGRvdWJsZSBhbHBoYV9jb3N0ID0KKyAgICAgIFBvcHVsYXRpb25Db3N0KGgtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsICZhbHBoYV9zeW0pOworICBjb25zdCBkb3VibGUgZGlzdGFuY2VfY29zdCA9CisgICAgICBQb3B1bGF0aW9uQ29zdChoLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgTlVMTCkgKworICAgICAgVlA4TEV4dHJhQ29zdChoLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUyk7CisgIGNvbnN0IGludCBudW1fY29kZXMgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaC0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgaC0+bGl0ZXJhbF9jb3N0XyA9IFBvcHVsYXRpb25Db3N0KGgtPmxpdGVyYWxfLCBudW1fY29kZXMsIE5VTEwpICsKKyAgICAgICAgICAgICAgICAgICAgIFZQOExFeHRyYUNvc3QoaC0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0xFTkdUSF9DT0RFUyk7CisgIGgtPnJlZF9jb3N0XyA9IFBvcHVsYXRpb25Db3N0KGgtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCAmcmVkX3N5bSk7CisgIGgtPmJsdWVfY29zdF8gPSBQb3B1bGF0aW9uQ29zdChoLT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsICZibHVlX3N5bSk7CisgIGgtPmJpdF9jb3N0XyA9IGgtPmxpdGVyYWxfY29zdF8gKyBoLT5yZWRfY29zdF8gKyBoLT5ibHVlX2Nvc3RfICsKKyAgICAgICAgICAgICAgICAgYWxwaGFfY29zdCArIGRpc3RhbmNlX2Nvc3Q7CisgIGlmICgoYWxwaGFfc3ltIHwgcmVkX3N5bSB8IGJsdWVfc3ltKSA9PSBWUDhMX05PTl9UUklWSUFMX1NZTSkgeworICAgIGgtPnRyaXZpYWxfc3ltYm9sXyA9IFZQOExfTk9OX1RSSVZJQUxfU1lNOworICB9IGVsc2UgeworICAgIGgtPnRyaXZpYWxfc3ltYm9sXyA9CisgICAgICAgICgodWludDMyX3QpYWxwaGFfc3ltIDw8IDI0KSB8IChyZWRfc3ltIDw8IDE2KSB8IChibHVlX3N5bSA8PCAwKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEdldEJpbklkRm9yRW50cm9weShkb3VibGUgbWluLCBkb3VibGUgbWF4LCBkb3VibGUgdmFsKSB7CisgIGNvbnN0IGRvdWJsZSByYW5nZSA9IG1heCAtIG1pbjsKKyAgaWYgKHJhbmdlID4gMC4pIHsKKyAgICBjb25zdCBkb3VibGUgZGVsdGEgPSB2YWwgLSBtaW47CisgICAgcmV0dXJuIChpbnQpKChOVU1fUEFSVElUSU9OUyAtIDFlLTYpICogZGVsdGEgLyByYW5nZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBHZXRIaXN0b0JpbkluZGV4KGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hbnRDb3N0UmFuZ2UqIGNvbnN0IGMsIGludCBsb3dfZWZmb3J0KSB7CisgIGludCBiaW5faWQgPSBHZXRCaW5JZEZvckVudHJvcHkoYy0+bGl0ZXJhbF9taW5fLCBjLT5saXRlcmFsX21heF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bGl0ZXJhbF9jb3N0Xyk7CisgIGFzc2VydChiaW5faWQgPCBOVU1fUEFSVElUSU9OUyk7CisgIGlmICghbG93X2VmZm9ydCkgeworICAgIGJpbl9pZCA9IGJpbl9pZCAqIE5VTV9QQVJUSVRJT05TCisgICAgICAgICAgICsgR2V0QmluSWRGb3JFbnRyb3B5KGMtPnJlZF9taW5fLCBjLT5yZWRfbWF4XywgaC0+cmVkX2Nvc3RfKTsKKyAgICBiaW5faWQgPSBiaW5faWQgKiBOVU1fUEFSVElUSU9OUworICAgICAgICAgICArIEdldEJpbklkRm9yRW50cm9weShjLT5ibHVlX21pbl8sIGMtPmJsdWVfbWF4XywgaC0+Ymx1ZV9jb3N0Xyk7CisgICAgYXNzZXJ0KGJpbl9pZCA8IEJJTl9TSVpFKTsKKyAgfQorICByZXR1cm4gYmluX2lkOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIGhpc3RvZ3JhbXMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQnVpbGQoCisgICAgaW50IHhzaXplLCBpbnQgaGlzdG9fYml0cywgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmFja3dhcmRfcmVmcywKKyAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgeCA9IDAsIHkgPSAwOworICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaGlzdG9fYml0cyk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQoYmFja3dhcmRfcmVmcyk7CisgIGFzc2VydChoaXN0b19iaXRzID4gMCk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBjb25zdCBpbnQgaXggPSAoeSA+PiBoaXN0b19iaXRzKSAqIGhpc3RvX3hzaXplICsgKHggPj4gaGlzdG9fYml0cyk7CisgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0b2dyYW1zW2l4XSwgdiwgTlVMTCwgMCk7CisgICAgeCArPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgd2hpbGUgKHggPj0geHNpemUpIHsKKyAgICAgIHggLT0geHNpemU7CisgICAgICArK3k7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KK30KKworLy8gQ29waWVzIHRoZSBoaXN0b2dyYW1zIGFuZCBjb21wdXRlcyBpdHMgYml0X2Nvc3QuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Db3B5QW5kQW5hbHl6ZSgKKyAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBvcmlnX2hpc3RvLCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBvcmlnX2hpc3RvLT5zaXplOworICBWUDhMSGlzdG9ncmFtKiogY29uc3Qgb3JpZ19oaXN0b2dyYW1zID0gb3JpZ19oaXN0by0+aGlzdG9ncmFtczsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3NpemU7ICsraSkgeworICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gb3JpZ19oaXN0b2dyYW1zW2ldOworICAgIFVwZGF0ZUhpc3RvZ3JhbUNvc3QoaGlzdG8pOworICAgIC8vIENvcHkgaGlzdG9ncmFtcyBmcm9tIG9yaWdfaGlzdG9bXSB0byBpbWFnZV9oaXN0b1tdLgorICAgIEhpc3RvZ3JhbUNvcHkoaGlzdG8sIGhpc3RvZ3JhbXNbaV0pOworICB9Cit9CisKKy8vIFBhcnRpdGlvbiBoaXN0b2dyYW1zIHRvIGRpZmZlcmVudCBlbnRyb3B5IGJpbnMgZm9yIHRocmVlIGRvbWluYW50IChsaXRlcmFsLAorLy8gcmVkIGFuZCBibHVlKSBzeW1ib2wgY29zdHMgYW5kIGNvbXB1dGUgdGhlIGhpc3RvZ3JhbSBhZ2dyZWdhdGUgYml0X2Nvc3QuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BbmFseXplRW50cm9weUJpbihWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBiaW5fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQpIHsKKyAgaW50IGk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIERvbWluYW50Q29zdFJhbmdlIGNvc3RfcmFuZ2U7CisgIERvbWluYW50Q29zdFJhbmdlSW5pdCgmY29zdF9yYW5nZSk7CisKKyAgLy8gQW5hbHl6ZSB0aGUgZG9taW5hbnQgKGxpdGVyYWwsIHJlZCBhbmQgYmx1ZSkgZW50cm9weSBjb3N0cy4KKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3NpemU7ICsraSkgeworICAgIFVwZGF0ZURvbWluYW50Q29zdFJhbmdlKGhpc3RvZ3JhbXNbaV0sICZjb3N0X3JhbmdlKTsKKyAgfQorCisgIC8vIGJpbi1oYXNoIGhpc3RvZ3JhbXMgb24gdGhyZWUgb2YgdGhlIGRvbWluYW50IChsaXRlcmFsLCByZWQgYW5kIGJsdWUpCisgIC8vIHN5bWJvbCBjb3N0cyBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZyBiaW5faWQgZm9yIGVhY2ggaGlzdG9ncmFtLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgYmluX21hcFtpXSA9IEdldEhpc3RvQmluSW5kZXgoaGlzdG9ncmFtc1tpXSwgJmNvc3RfcmFuZ2UsIGxvd19lZmZvcnQpOworICB9Cit9CisKKy8vIENvbXBhY3QgaW1hZ2VfaGlzdG9bXSBieSBtZXJnaW5nIHNvbWUgaGlzdG9ncmFtcyB3aXRoIHNhbWUgYmluX2lkIHRvZ2V0aGVyIGlmCisvLyBpdCdzIGFkdmFudGFnZW91cy4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY3VyX2NvbWJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IGJpbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmluX21hcF9zaXplLCBpbnQgbnVtX2JpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29tYmluZV9jb3N0X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dfZWZmb3J0KSB7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIGludCBpZHg7CisgIC8vIFdvcmsgaW4tcGxhY2U6IHByb2Nlc3NlZCBoaXN0b2dyYW1zIGFyZSBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAvLyBpbWFnZV9oaXN0b1tdLiBBdCB0aGUgZW5kLCB3ZSBqdXN0IGhhdmUgdG8gdHJ1bmNhdGUgdGhlIGFycmF5LgorICBpbnQgc2l6ZSA9IDA7CisgIHN0cnVjdCB7CisgICAgaW50MTZfdCBmaXJzdDsgICAgLy8gcG9zaXRpb24gb2YgdGhlIGhpc3RvZ3JhbSB0aGF0IGFjY3VtdWxhdGVzIGFsbAorICAgICAgICAgICAgICAgICAgICAgIC8vIGhpc3RvZ3JhbXMgd2l0aCB0aGUgc2FtZSBiaW5faWQKKyAgICB1aW50MTZfdCBudW1fY29tYmluZV9mYWlsdXJlczsgICAvLyBudW1iZXIgb2YgY29tYmluZSBmYWlsdXJlcyBwZXIgYmluX2lkCisgIH0gYmluX2luZm9bQklOX1NJWkVdOworCisgIGFzc2VydChudW1fYmlucyA8PSBCSU5fU0laRSk7CisgIGZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2JpbnM7ICsraWR4KSB7CisgICAgYmluX2luZm9baWR4XS5maXJzdCA9IC0xOworICAgIGJpbl9pbmZvW2lkeF0ubnVtX2NvbWJpbmVfZmFpbHVyZXMgPSAwOworICB9CisKKyAgZm9yIChpZHggPSAwOyBpZHggPCBiaW5fbWFwX3NpemU7ICsraWR4KSB7CisgICAgY29uc3QgaW50IGJpbl9pZCA9IGJpbl9tYXBbaWR4XTsKKyAgICBjb25zdCBpbnQgZmlyc3QgPSBiaW5faW5mb1tiaW5faWRdLmZpcnN0OworICAgIGFzc2VydChzaXplIDw9IGlkeCk7CisgICAgaWYgKGZpcnN0ID09IC0xKSB7CisgICAgICAvLyBqdXN0IG1vdmUgaGlzdG9ncmFtICNpZHggdG8gaXRzIGZpbmFsIHBvc2l0aW9uCisgICAgICBoaXN0b2dyYW1zW3NpemVdID0gaGlzdG9ncmFtc1tpZHhdOworICAgICAgYmluX2luZm9bYmluX2lkXS5maXJzdCA9IHNpemUrKzsKKyAgICB9IGVsc2UgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIEhpc3RvZ3JhbUFkZChoaXN0b2dyYW1zW2lkeF0sIGhpc3RvZ3JhbXNbZmlyc3RdLCBoaXN0b2dyYW1zW2ZpcnN0XSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHRyeSB0byBtZXJnZSAjaWR4IGludG8gI2ZpcnN0IChib3RoIHNoYXJlIHRoZSBzYW1lIGJpbl9pZCkKKyAgICAgIGNvbnN0IGRvdWJsZSBiaXRfY29zdCA9IGhpc3RvZ3JhbXNbaWR4XS0+Yml0X2Nvc3RfOworICAgICAgY29uc3QgZG91YmxlIGJpdF9jb3N0X3RocmVzaCA9IC1iaXRfY29zdCAqIGNvbWJpbmVfY29zdF9mYWN0b3I7CisgICAgICBjb25zdCBkb3VibGUgY3Vycl9jb3N0X2RpZmYgPQorICAgICAgICAgIEhpc3RvZ3JhbUFkZEV2YWwoaGlzdG9ncmFtc1tmaXJzdF0sIGhpc3RvZ3JhbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb21ibywgYml0X2Nvc3RfdGhyZXNoKTsKKyAgICAgIGlmIChjdXJyX2Nvc3RfZGlmZiA8IGJpdF9jb3N0X3RocmVzaCkgeworICAgICAgICAvLyBUcnkgdG8gbWVyZ2UgdHdvIGhpc3RvZ3JhbXMgb25seSBpZiB0aGUgY29tYm8gaXMgYSB0cml2aWFsIG9uZSBvcgorICAgICAgICAvLyB0aGUgdHdvIGNhbmRpZGF0ZSBoaXN0b2dyYW1zIGFyZSBhbHJlYWR5IG5vbi10cml2aWFsLgorICAgICAgICAvLyBGb3Igc29tZSBpbWFnZXMsICd0cnlfY29tYmluZScgdHVybnMgb3V0IHRvIGJlIGZhbHNlIGZvciBhIGxvdCBvZgorICAgICAgICAvLyBoaXN0b2dyYW0gcGFpcnMuIEluIHRoYXQgY2FzZSwgd2UgZmFsbGJhY2sgdG8gY29tYmluaW5nCisgICAgICAgIC8vIGhpc3RvZ3JhbXMgYXMgdXN1YWwgdG8gYXZvaWQgaW5jcmVhc2luZyB0aGUgaGVhZGVyIHNpemUuCisgICAgICAgIGNvbnN0IGludCB0cnlfY29tYmluZSA9CisgICAgICAgICAgICAoY3VyX2NvbWJvLT50cml2aWFsX3N5bWJvbF8gIT0gVlA4TF9OT05fVFJJVklBTF9TWU0pIHx8CisgICAgICAgICAgICAoKGhpc3RvZ3JhbXNbaWR4XS0+dHJpdmlhbF9zeW1ib2xfID09IFZQOExfTk9OX1RSSVZJQUxfU1lNKSAmJgorICAgICAgICAgICAgIChoaXN0b2dyYW1zW2ZpcnN0XS0+dHJpdmlhbF9zeW1ib2xfID09IFZQOExfTk9OX1RSSVZJQUxfU1lNKSk7CisgICAgICAgIGNvbnN0IGludCBtYXhfY29tYmluZV9mYWlsdXJlcyA9IDMyOworICAgICAgICBpZiAodHJ5X2NvbWJpbmUgfHwKKyAgICAgICAgICAgIGJpbl9pbmZvW2Jpbl9pZF0ubnVtX2NvbWJpbmVfZmFpbHVyZXMgPj0gbWF4X2NvbWJpbmVfZmFpbHVyZXMpIHsKKyAgICAgICAgICAvLyBtb3ZlIHRoZSAoYmV0dGVyKSBtZXJnZWQgaGlzdG9ncmFtIHRvIGl0cyBmaW5hbCBzbG90CisgICAgICAgICAgSGlzdG9ncmFtU3dhcCgmY3VyX2NvbWJvLCAmaGlzdG9ncmFtc1tmaXJzdF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhpc3RvZ3JhbXNbc2l6ZSsrXSA9IGhpc3RvZ3JhbXNbaWR4XTsKKyAgICAgICAgICArK2Jpbl9pbmZvW2Jpbl9pZF0ubnVtX2NvbWJpbmVfZmFpbHVyZXM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhpc3RvZ3JhbXNbc2l6ZSsrXSA9IGhpc3RvZ3JhbXNbaWR4XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1hZ2VfaGlzdG8tPnNpemUgPSBzaXplOworICBpZiAobG93X2VmZm9ydCkgeworICAgIC8vIGZvciBsb3dfZWZmb3J0IGNhc2UsIHVwZGF0ZSB0aGUgZmluYWwgY29zdCB3aGVuIGV2ZXJ5dGhpbmcgaXMgbWVyZ2VkCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBzaXplOyArK2lkeCkgeworICAgICAgVXBkYXRlSGlzdG9ncmFtQ29zdChoaXN0b2dyYW1zW2lkeF0pOworICAgIH0KKyAgfQorfQorCisvLyBJbXBsZW1lbnQgYSBMZWhtZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCBhIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50IG9mCisvLyA0ODI3MSBhbmQgYSBtb2R1bG8gY29uc3RhbnQgb2YgMl4zMSAtIDEuCitzdGF0aWMgdWludDMyX3QgTXlSYW5kKHVpbnQzMl90KiBjb25zdCBzZWVkKSB7CisgICpzZWVkID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KSgqc2VlZCkgKiA0ODI3MXUpICUgMjE0NzQ4MzY0N3UpOworICBhc3NlcnQoKnNlZWQgPiAwKTsKKyAgcmV0dXJuICpzZWVkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlzdG9ncmFtIHBhaXJzIHByaW9yaXR5IHF1ZXVlCisKKy8vIFBhaXIgb2YgaGlzdG9ncmFtcy4gTmVnYXRpdmUgaWR4MSB2YWx1ZSBtZWFucyB0aGF0IHBhaXIgaXMgb3V0LW9mLWRhdGUuCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBpZHgxOworICBpbnQgaWR4MjsKKyAgZG91YmxlIGNvc3RfZGlmZjsKKyAgZG91YmxlIGNvc3RfY29tYm87Cit9IEhpc3RvZ3JhbVBhaXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSGlzdG9ncmFtUGFpciogcXVldWU7CisgIGludCBzaXplOworICBpbnQgbWF4X3NpemU7Cit9IEhpc3RvUXVldWU7CisKK3N0YXRpYyBpbnQgSGlzdG9RdWV1ZUluaXQoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUsIGNvbnN0IGludCBtYXhfaW5kZXgpIHsKKyAgaGlzdG9fcXVldWUtPnNpemUgPSAwOworICAvLyBtYXhfaW5kZXheMiBmb3IgdGhlIHF1ZXVlIHNpemUgaXMgc2FmZS4gSWYgeW91IGxvb2sgYXQKKyAgLy8gSGlzdG9ncmFtQ29tYmluZUdyZWVkeSwgYW5kIGltYWdpbmUgdGhhdCBVcGRhdGVRdWV1ZUZyb250IGFsd2F5cyBwdXNoZXMKKyAgLy8gZGF0YSB0byB0aGUgcXVldWUsIHlvdSBpbnNlcnQgYXQgbW9zdDoKKyAgLy8gLSBtYXhfaW5kZXgqKG1heF9pbmRleC0xKS8yICh0aGUgZmlyc3QgdHdvIGZvciBsb29wcykKKyAgLy8gLSBtYXhfaW5kZXggLSAxIGluIHRoZSBsYXN0IGZvciBsb29wIGF0IHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIHdoaWxlCisgIC8vICAgbG9vcCwgbWF4X2luZGV4IC0gMiBhdCB0aGUgc2Vjb25kIGl0ZXJhdGlvbiAuLi4gdGhlcmVmb3JlCisgIC8vICAgbWF4X2luZGV4KihtYXhfaW5kZXgtMSkvMiBvdmVyYWxsIHRvbworICBoaXN0b19xdWV1ZS0+bWF4X3NpemUgPSBtYXhfaW5kZXggKiBtYXhfaW5kZXg7CisgIC8vIFdlIGFsbG9jYXRlIG1heF9zaXplICsgMSBiZWNhdXNlIHRoZSBsYXN0IGVsZW1lbnQgYXQgaW5kZXggInNpemUiIGlzCisgIC8vIHVzZWQgYXMgdGVtcG9yYXJ5IGRhdGEgKGFuZCBpdCBjb3VsZCBiZSB1cCB0byBtYXhfc2l6ZSkuCisgIGhpc3RvX3F1ZXVlLT5xdWV1ZSA9IChIaXN0b2dyYW1QYWlyKilXZWJQU2FmZU1hbGxvYygKKyAgICAgIGhpc3RvX3F1ZXVlLT5tYXhfc2l6ZSArIDEsIHNpemVvZigqaGlzdG9fcXVldWUtPnF1ZXVlKSk7CisgIHJldHVybiBoaXN0b19xdWV1ZS0+cXVldWUgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgSGlzdG9RdWV1ZUNsZWFyKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlKSB7CisgIGFzc2VydChoaXN0b19xdWV1ZSAhPSBOVUxMKTsKKyAgV2ViUFNhZmVGcmVlKGhpc3RvX3F1ZXVlLT5xdWV1ZSk7CisgIGhpc3RvX3F1ZXVlLT5zaXplID0gMDsKKyAgaGlzdG9fcXVldWUtPm1heF9zaXplID0gMDsKK30KKworLy8gUG9wIGEgc3BlY2lmaWMgcGFpciBpbiB0aGUgcXVldWUgYnkgcmVwbGFjaW5nIGl0IHdpdGggdGhlIGxhc3Qgb25lCisvLyBhbmQgc2hyaW5raW5nIHRoZSBxdWV1ZS4KK3N0YXRpYyB2b2lkIEhpc3RvUXVldWVQb3BQYWlyKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcGFpcikgeworICBhc3NlcnQocGFpciA+PSBoaXN0b19xdWV1ZS0+cXVldWUgJiYKKyAgICAgICAgIHBhaXIgPCAoaGlzdG9fcXVldWUtPnF1ZXVlICsgaGlzdG9fcXVldWUtPnNpemUpKTsKKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlLT5zaXplID4gMCk7CisgICpwYWlyID0gaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplIC0gMV07CisgIC0taGlzdG9fcXVldWUtPnNpemU7Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgYSBwYWlyIGluIHRoZSBxdWV1ZSBzaG91bGQgYmUgdXBkYXRlZCBhcyBoZWFkIG9yIG5vdC4KK3N0YXRpYyB2b2lkIEhpc3RvUXVldWVVcGRhdGVIZWFkKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcGFpcikgeworICBhc3NlcnQocGFpci0+Y29zdF9kaWZmIDwgMC4pOworICBhc3NlcnQocGFpciA+PSBoaXN0b19xdWV1ZS0+cXVldWUgJiYKKyAgICAgICAgIHBhaXIgPCAoaGlzdG9fcXVldWUtPnF1ZXVlICsgaGlzdG9fcXVldWUtPnNpemUpKTsKKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlLT5zaXplID4gMCk7CisgIGlmIChwYWlyLT5jb3N0X2RpZmYgPCBoaXN0b19xdWV1ZS0+cXVldWVbMF0uY29zdF9kaWZmKSB7CisgICAgLy8gUmVwbGFjZSB0aGUgYmVzdCBwYWlyLgorICAgIGNvbnN0IEhpc3RvZ3JhbVBhaXIgdG1wID0gaGlzdG9fcXVldWUtPnF1ZXVlWzBdOworICAgIGhpc3RvX3F1ZXVlLT5xdWV1ZVswXSA9ICpwYWlyOworICAgICpwYWlyID0gdG1wOworICB9Cit9CisKKy8vIENyZWF0ZSBhIHBhaXIgZnJvbSBpbmRpY2VzICJpZHgxIiBhbmQgImlkeDIiIHByb3ZpZGVkIGl0cyBjb3N0CisvLyBpcyBpbmZlcmlvciB0byAidGhyZXNob2xkIiwgYSBuZWdhdGl2ZSBlbnRyb3B5LgorLy8gSXQgcmV0dXJucyB0aGUgY29zdCBvZiB0aGUgcGFpciwgb3IgMC4gaWYgaXQgc3VwZXJpb3IgdG8gdGhyZXNob2xkLgorc3RhdGljIGRvdWJsZSBIaXN0b1F1ZXVlUHVzaChIaXN0b1F1ZXVlKiBjb25zdCBoaXN0b19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMsIGludCBpZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4MiwgZG91YmxlIHRocmVzaG9sZCkgeworICBjb25zdCBWUDhMSGlzdG9ncmFtKiBoMTsKKyAgY29uc3QgVlA4TEhpc3RvZ3JhbSogaDI7CisgIEhpc3RvZ3JhbVBhaXIgcGFpcjsKKyAgZG91YmxlIHN1bV9jb3N0OworCisgIGFzc2VydCh0aHJlc2hvbGQgPD0gMC4pOworICBpZiAoaWR4MSA+IGlkeDIpIHsKKyAgICBjb25zdCBpbnQgdG1wID0gaWR4MjsKKyAgICBpZHgyID0gaWR4MTsKKyAgICBpZHgxID0gdG1wOworICB9CisgIHBhaXIuaWR4MSA9IGlkeDE7CisgIHBhaXIuaWR4MiA9IGlkeDI7CisgIGgxID0gaGlzdG9ncmFtc1tpZHgxXTsKKyAgaDIgPSBoaXN0b2dyYW1zW2lkeDJdOworICBzdW1fY29zdCA9IGgxLT5iaXRfY29zdF8gKyBoMi0+Yml0X2Nvc3RfOworICBwYWlyLmNvc3RfY29tYm8gPSAwLjsKKyAgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGgxLCBoMiwgc3VtX2Nvc3QgKyB0aHJlc2hvbGQsICZwYWlyLmNvc3RfY29tYm8pOworICBwYWlyLmNvc3RfZGlmZiA9IHBhaXIuY29zdF9jb21ibyAtIHN1bV9jb3N0OworCisgIC8vIERvIG5vdCBldmVuIGNvbnNpZGVyIHRoZSBwYWlyIGlmIGl0IGRvZXMgbm90IGltcHJvdmUgdGhlIGVudHJvcHkuCisgIGlmIChwYWlyLmNvc3RfZGlmZiA+PSB0aHJlc2hvbGQpIHJldHVybiAwLjsKKworICAvLyBXZSBjYW5ub3QgYWRkIG1vcmUgZWxlbWVudHMgdGhhbiB0aGUgY2FwYWNpdHkuCisgIGFzc2VydChoaXN0b19xdWV1ZS0+c2l6ZSA8IGhpc3RvX3F1ZXVlLT5tYXhfc2l6ZSk7CisgIGhpc3RvX3F1ZXVlLT5xdWV1ZVtoaXN0b19xdWV1ZS0+c2l6ZSsrXSA9IHBhaXI7CisgIEhpc3RvUXVldWVVcGRhdGVIZWFkKGhpc3RvX3F1ZXVlLCAmaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplIC0gMV0pOworCisgIHJldHVybiBwYWlyLmNvc3RfZGlmZjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29tYmluZXMgaGlzdG9ncmFtcyBieSBjb250aW51b3VzbHkgY2hvb3NpbmcgdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IGNvc3QKKy8vIHJlZHVjdGlvbi4KK3N0YXRpYyBpbnQgSGlzdG9ncmFtQ29tYmluZUdyZWVkeShWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgb2sgPSAwOworICBpbnQgaW1hZ2VfaGlzdG9fc2l6ZSA9IGltYWdlX2hpc3RvLT5zaXplOworICBpbnQgaSwgajsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgLy8gSW5kZXhlcyBvZiByZW1haW5pbmcgaGlzdG9ncmFtcy4KKyAgaW50KiBjb25zdCBjbHVzdGVycyA9CisgICAgICAoaW50KilXZWJQU2FmZU1hbGxvYyhpbWFnZV9oaXN0b19zaXplLCBzaXplb2YoKmNsdXN0ZXJzKSk7CisgIC8vIFByaW9yaXR5IHF1ZXVlIG9mIGhpc3RvZ3JhbSBwYWlycy4KKyAgSGlzdG9RdWV1ZSBoaXN0b19xdWV1ZTsKKworICBpZiAoIUhpc3RvUXVldWVJbml0KCZoaXN0b19xdWV1ZSwgaW1hZ2VfaGlzdG9fc2l6ZSkgfHwgY2x1c3RlcnMgPT0gTlVMTCkgeworICAgIGdvdG8gRW5kOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgIC8vIEluaXRpYWxpemUgY2x1c3RlcnMgaW5kZXhlcy4KKyAgICBjbHVzdGVyc1tpXSA9IGk7CisgICAgZm9yIChqID0gaSArIDE7IGogPCBpbWFnZV9oaXN0b19zaXplOyArK2opIHsKKyAgICAgIC8vIEluaXRpYWxpemUgcG9zaXRpb25zIGFycmF5LgorICAgICAgSGlzdG9RdWV1ZVB1c2goJmhpc3RvX3F1ZXVlLCBoaXN0b2dyYW1zLCBpLCBqLCAwLik7CisgICAgfQorICB9CisKKyAgd2hpbGUgKGltYWdlX2hpc3RvX3NpemUgPiAxICYmIGhpc3RvX3F1ZXVlLnNpemUgPiAwKSB7CisgICAgY29uc3QgaW50IGlkeDEgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgxOworICAgIGNvbnN0IGludCBpZHgyID0gaGlzdG9fcXVldWUucXVldWVbMF0uaWR4MjsKKyAgICBIaXN0b2dyYW1BZGQoaGlzdG9ncmFtc1tpZHgyXSwgaGlzdG9ncmFtc1tpZHgxXSwgaGlzdG9ncmFtc1tpZHgxXSk7CisgICAgaGlzdG9ncmFtc1tpZHgxXS0+Yml0X2Nvc3RfID0gaGlzdG9fcXVldWUucXVldWVbMF0uY29zdF9jb21ibzsKKyAgICAvLyBSZW1vdmUgbWVyZ2VkIGhpc3RvZ3JhbS4KKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgICAgaWYgKGNsdXN0ZXJzW2ldID49IGlkeDIpIHsKKyAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tpICsgMV07CisgICAgICB9CisgICAgfQorICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKworICAgIC8vIFJlbW92ZSBwYWlycyBpbnRlcnNlY3RpbmcgdGhlIGp1c3QgY29tYmluZWQgYmVzdCBwYWlyLgorICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b19xdWV1ZS5zaXplOykgeworICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcCA9IGhpc3RvX3F1ZXVlLnF1ZXVlICsgaTsKKyAgICAgIGlmIChwLT5pZHgxID09IGlkeDEgfHwgcC0+aWR4MiA9PSBpZHgxIHx8CisgICAgICAgICAgcC0+aWR4MSA9PSBpZHgyIHx8IHAtPmlkeDIgPT0gaWR4MikgeworICAgICAgICBIaXN0b1F1ZXVlUG9wUGFpcigmaGlzdG9fcXVldWUsIHApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSGlzdG9RdWV1ZVVwZGF0ZUhlYWQoJmhpc3RvX3F1ZXVlLCBwKTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFB1c2ggbmV3IHBhaXJzIGZvcm1lZCB3aXRoIGNvbWJpbmVkIGhpc3RvZ3JhbSB0byB0aGUgcXVldWUuCisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9IGlkeDEpIHsKKyAgICAgICAgSGlzdG9RdWV1ZVB1c2goJmhpc3RvX3F1ZXVlLCBoaXN0b2dyYW1zLCBpZHgxLCBjbHVzdGVyc1tpXSwgMC4pOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBNb3ZlIHJlbWFpbmluZyBoaXN0b2dyYW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgorICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgaWYgKGkgIT0gY2x1c3RlcnNbaV0pIHsgIC8vIHN3YXAgdGhlIHR3byBoaXN0b2dyYW1zCisgICAgICBIaXN0b2dyYW1Td2FwKCZoaXN0b2dyYW1zW2ldLCAmaGlzdG9ncmFtc1tjbHVzdGVyc1tpXV0pOworICAgIH0KKyAgfQorCisgIGltYWdlX2hpc3RvLT5zaXplID0gaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgb2sgPSAxOworCisgRW5kOgorICBXZWJQU2FmZUZyZWUoY2x1c3RlcnMpOworICBIaXN0b1F1ZXVlQ2xlYXIoJmhpc3RvX3F1ZXVlKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBQZXJmb3JtIGhpc3RvZ3JhbSBhZ2dyZWdhdGlvbiB1c2luZyBhIHN0b2NoYXN0aWMgYXBwcm9hY2guCisvLyAnZG9fZ3JlZWR5JyBpcyBzZXQgdG8gMSBpZiBhIGdyZWVkeSBhcHByb2FjaCBuZWVkcyB0byBiZSBwZXJmb3JtZWQKKy8vIGFmdGVyd2FyZHMsIDAgb3RoZXJ3aXNlLgorc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYyhWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9jbHVzdGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZG9fZ3JlZWR5KSB7CisgIGludCBpdGVyOworICB1aW50MzJfdCBzZWVkID0gMTsKKyAgaW50IHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7CisgIGludCBpbWFnZV9oaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIGNvbnN0IGludCBvdXRlcl9pdGVycyA9IGltYWdlX2hpc3RvX3NpemU7CisgIGNvbnN0IGludCBudW1fdHJpZXNfbm9fc3VjY2VzcyA9IG91dGVyX2l0ZXJzIC8gMjsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgLy8gUHJpb3JpdHkgcXVldWUgb2YgaGlzdG9ncmFtIHBhaXJzLiBJdHMgc2l6ZSBvZiAia0Nvc3RIZWFwU2l6ZVNxcnQiXjIKKyAgLy8gaW1wYWN0cyB0aGUgcXVhbGl0eSBvZiB0aGUgY29tcHJlc3Npb24gYW5kIHRoZSBzcGVlZDogdGhlIHNtYWxsZXIgdGhlCisgIC8vIGZhc3RlciBidXQgdGhlIHdvcnNlIGZvciB0aGUgY29tcHJlc3Npb24uCisgIEhpc3RvUXVldWUgaGlzdG9fcXVldWU7CisgIGNvbnN0IGludCBrSGlzdG9RdWV1ZVNpemVTcXJ0ID0gMzsKKyAgaW50IG9rID0gMDsKKworICBpZiAoIUhpc3RvUXVldWVJbml0KCZoaXN0b19xdWV1ZSwga0hpc3RvUXVldWVTaXplU3FydCkpIHsKKyAgICBnb3RvIEVuZDsKKyAgfQorICAvLyBDb2xsYXBzZSBzaW1pbGFyIGhpc3RvZ3JhbXMgaW4gJ2ltYWdlX2hpc3RvJy4KKyAgKyttaW5fY2x1c3Rlcl9zaXplOworICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgb3V0ZXJfaXRlcnMgJiYgaW1hZ2VfaGlzdG9fc2l6ZSA+PSBtaW5fY2x1c3Rlcl9zaXplICYmCisgICAgICAgICAgICAgICAgICsrdHJpZXNfd2l0aF9ub19zdWNjZXNzIDwgbnVtX3RyaWVzX25vX3N1Y2Nlc3M7CisgICAgICAgKytpdGVyKSB7CisgICAgZG91YmxlIGJlc3RfY29zdCA9CisgICAgICAgIChoaXN0b19xdWV1ZS5zaXplID09IDApID8gMC4gOiBoaXN0b19xdWV1ZS5xdWV1ZVswXS5jb3N0X2RpZmY7CisgICAgaW50IGJlc3RfaWR4MSA9IC0xLCBiZXN0X2lkeDIgPSAxOworICAgIGludCBqOworICAgIGNvbnN0IHVpbnQzMl90IHJhbmRfcmFuZ2UgPSAoaW1hZ2VfaGlzdG9fc2l6ZSAtIDEpICogaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICAvLyBpbWFnZV9oaXN0b19zaXplIC8gMiB3YXMgY2hvc2VuIGVtcGlyaWNhbGx5LiBMZXNzIG1lYW5zIGZhc3RlciBidXQgd29yc2UKKyAgICAvLyBjb21wcmVzc2lvbi4KKyAgICBjb25zdCBpbnQgbnVtX3RyaWVzID0gaW1hZ2VfaGlzdG9fc2l6ZSAvIDI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3RyaWVzOyArK2opIHsKKyAgICAgIGRvdWJsZSBjdXJyX2Nvc3Q7CisgICAgICAvLyBDaG9vc2UgdHdvIGRpZmZlcmVudCBoaXN0b2dyYW1zIGF0IHJhbmRvbSBhbmQgdHJ5IHRvIGNvbWJpbmUgdGhlbS4KKyAgICAgIGNvbnN0IHVpbnQzMl90IHRtcCA9IE15UmFuZCgmc2VlZCkgJSByYW5kX3JhbmdlOworICAgICAgY29uc3QgdWludDMyX3QgaWR4MSA9IHRtcCAvIChpbWFnZV9oaXN0b19zaXplIC0gMSk7CisgICAgICB1aW50MzJfdCBpZHgyID0gdG1wICUgKGltYWdlX2hpc3RvX3NpemUgLSAxKTsKKyAgICAgIGlmIChpZHgyID49IGlkeDEpICsraWR4MjsKKworICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgcmVkdWN0aW9uIG9uIGNvbWJpbmF0aW9uLgorICAgICAgY3Vycl9jb3N0ID0KKyAgICAgICAgICBIaXN0b1F1ZXVlUHVzaCgmaGlzdG9fcXVldWUsIGhpc3RvZ3JhbXMsIGlkeDEsIGlkeDIsIGJlc3RfY29zdCk7CisgICAgICBpZiAoY3Vycl9jb3N0IDwgMCkgeyAgLy8gZm91bmQgYSBiZXR0ZXIgcGFpcj8KKyAgICAgICAgYmVzdF9jb3N0ID0gY3Vycl9jb3N0OworICAgICAgICAvLyBFbXB0eSB0aGUgcXVldWUgaWYgd2UgcmVhY2hlZCBmdWxsIGNhcGFjaXR5LgorICAgICAgICBpZiAoaGlzdG9fcXVldWUuc2l6ZSA9PSBoaXN0b19xdWV1ZS5tYXhfc2l6ZSkgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChoaXN0b19xdWV1ZS5zaXplID09IDApIGNvbnRpbnVlOworCisgICAgLy8gTWVyZ2UgdGhlIHR3byBiZXN0IGhpc3RvZ3JhbXMuCisgICAgYmVzdF9pZHgxID0gaGlzdG9fcXVldWUucXVldWVbMF0uaWR4MTsKKyAgICBiZXN0X2lkeDIgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgyOworICAgIGFzc2VydChiZXN0X2lkeDEgPCBiZXN0X2lkeDIpOworICAgIEhpc3RvZ3JhbUFkZEV2YWwoaGlzdG9ncmFtc1tiZXN0X2lkeDFdLCBoaXN0b2dyYW1zW2Jlc3RfaWR4Ml0sCisgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1zW2Jlc3RfaWR4MV0sIDApOworICAgIC8vIFN3YXAgdGhlIGJlc3RfaWR4MiBoaXN0b2dyYW0gd2l0aCB0aGUgbGFzdCBvbmUgKHdoaWNoIGlzIG5vdyB1bnVzZWQpLgorICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICBpZiAoYmVzdF9pZHgyICE9IGltYWdlX2hpc3RvX3NpemUpIHsKKyAgICAgIEhpc3RvZ3JhbVN3YXAoJmhpc3RvZ3JhbXNbaW1hZ2VfaGlzdG9fc2l6ZV0sICZoaXN0b2dyYW1zW2Jlc3RfaWR4Ml0pOworICAgIH0KKyAgICBoaXN0b2dyYW1zW2ltYWdlX2hpc3RvX3NpemVdID0gTlVMTDsKKyAgICAvLyBQYXJzZSB0aGUgcXVldWUgYW5kIHVwZGF0ZSBlYWNoIHBhaXIgdGhhdCBkZWFscyB3aXRoIGJlc3RfaWR4MSwKKyAgICAvLyBiZXN0X2lkeDIgb3IgaW1hZ2VfaGlzdG9fc2l6ZS4KKyAgICBmb3IgKGogPSAwOyBqIDwgaGlzdG9fcXVldWUuc2l6ZTspIHsKKyAgICAgIEhpc3RvZ3JhbVBhaXIqIGNvbnN0IHAgPSBoaXN0b19xdWV1ZS5xdWV1ZSArIGo7CisgICAgICBjb25zdCBpbnQgaXNfaWR4MV9iZXN0ID0gcC0+aWR4MSA9PSBiZXN0X2lkeDEgfHwgcC0+aWR4MSA9PSBiZXN0X2lkeDI7CisgICAgICBjb25zdCBpbnQgaXNfaWR4Ml9iZXN0ID0gcC0+aWR4MiA9PSBiZXN0X2lkeDEgfHwgcC0+aWR4MiA9PSBiZXN0X2lkeDI7CisgICAgICBpbnQgZG9fZXZhbCA9IDA7CisgICAgICAvLyBUaGUgZnJvbnQgcGFpciBjb3VsZCBoYXZlIGJlZW4gZHVwbGljYXRlZCBieSBhIHJhbmRvbSBwaWNrIHNvCisgICAgICAvLyBjaGVjayBmb3IgaXQgYWxsIHRoZSB0aW1lIG5ldmVydGhlbGVzcy4KKyAgICAgIGlmIChpc19pZHgxX2Jlc3QgJiYgaXNfaWR4Ml9iZXN0KSB7CisgICAgICAgIEhpc3RvUXVldWVQb3BQYWlyKCZoaXN0b19xdWV1ZSwgcCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gQW55IHBhaXIgY29udGFpbmluZyBvbmUgb2YgdGhlIHR3byBiZXN0IGluZGljZXMgc2hvdWxkIG9ubHkgcmVmZXIgdG8KKyAgICAgIC8vIGJlc3RfaWR4MS4gSXRzIGNvc3Qgc2hvdWxkIGFsc28gYmUgdXBkYXRlZC4KKyAgICAgIGlmIChpc19pZHgxX2Jlc3QpIHsKKyAgICAgICAgcC0+aWR4MSA9IGJlc3RfaWR4MTsKKyAgICAgICAgZG9fZXZhbCA9IDE7CisgICAgICB9IGVsc2UgaWYgKGlzX2lkeDJfYmVzdCkgeworICAgICAgICBwLT5pZHgyID0gYmVzdF9pZHgxOworICAgICAgICBkb19ldmFsID0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5pZHgyID09IGltYWdlX2hpc3RvX3NpemUpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byByZS1ldmFsdWF0ZSBoZXJlIGFzIGl0IGRvZXMgbm90IGludm9sdmUgYSBwYWlyCisgICAgICAgIC8vIGNvbnRhaW5pbmcgYmVzdF9pZHgxIG9yIGJlc3RfaWR4Mi4KKyAgICAgICAgcC0+aWR4MiA9IGJlc3RfaWR4MjsKKyAgICAgIH0KKyAgICAgIGFzc2VydChwLT5pZHgyIDwgaW1hZ2VfaGlzdG9fc2l6ZSk7CisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGluZGV4IG9yZGVyIGlzIHJlc3BlY3RlZC4KKyAgICAgIGlmIChwLT5pZHgxID4gcC0+aWR4MikgeworICAgICAgICBjb25zdCBpbnQgdG1wID0gcC0+aWR4MjsKKyAgICAgICAgcC0+aWR4MiA9IHAtPmlkeDE7CisgICAgICAgIHAtPmlkeDEgPSB0bXA7CisgICAgICB9CisgICAgICBpZiAoZG9fZXZhbCkgeworICAgICAgICAvLyBSZS1ldmFsdWF0ZSB0aGUgY29zdCBvZiBhbiB1cGRhdGVkIHBhaXIuCisgICAgICAgIEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShoaXN0b2dyYW1zW3AtPmlkeDFdLCBoaXN0b2dyYW1zW3AtPmlkeDJdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmNvc3RfZGlmZik7CisgICAgICAgIGlmIChwLT5jb3N0X2RpZmYgPj0gMC4pIHsKKyAgICAgICAgICBIaXN0b1F1ZXVlUG9wUGFpcigmaGlzdG9fcXVldWUsIHApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBIaXN0b1F1ZXVlVXBkYXRlSGVhZCgmaGlzdG9fcXVldWUsIHApOworICAgICAgKytqOworICAgIH0KKworICAgIHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7CisgIH0KKyAgaW1hZ2VfaGlzdG8tPnNpemUgPSBpbWFnZV9oaXN0b19zaXplOworICAqZG9fZ3JlZWR5ID0gKGltYWdlX2hpc3RvLT5zaXplIDw9IG1pbl9jbHVzdGVyX3NpemUpOworICBvayA9IDE7CisKK0VuZDoKKyAgSGlzdG9RdWV1ZUNsZWFyKCZoaXN0b19xdWV1ZSk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpc3RvZ3JhbSByZWZpbmVtZW50CisKKy8vIEZpbmQgdGhlIGJlc3QgJ291dCcgaGlzdG9ncmFtIGZvciBlYWNoIG9mIHRoZSAnaW4nIGhpc3RvZ3JhbXMuCisvLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCBvdXRbXS0+Yml0X2Nvc3RfIGlzIGFscmVhZHkgdXAtdG8tZGF0ZS4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbVJlbWFwKGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IHN5bWJvbHMpIHsKKyAgaW50IGk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBpbl9oaXN0byA9IGluLT5oaXN0b2dyYW1zOworICBWUDhMSGlzdG9ncmFtKiogY29uc3Qgb3V0X2hpc3RvID0gb3V0LT5oaXN0b2dyYW1zOworICBjb25zdCBpbnQgaW5fc2l6ZSA9IGluLT5zaXplOworICBjb25zdCBpbnQgb3V0X3NpemUgPSBvdXQtPnNpemU7CisgIGlmIChvdXRfc2l6ZSA+IDEpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgKytpKSB7CisgICAgICBpbnQgYmVzdF9vdXQgPSAwOworICAgICAgZG91YmxlIGJlc3RfYml0cyA9IE1BWF9DT1NUOworICAgICAgaW50IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgb3V0X3NpemU7ICsraykgeworICAgICAgICBjb25zdCBkb3VibGUgY3VyX2JpdHMgPQorICAgICAgICAgICAgSGlzdG9ncmFtQWRkVGhyZXNoKG91dF9oaXN0b1trXSwgaW5faGlzdG9baV0sIGJlc3RfYml0cyk7CisgICAgICAgIGlmIChrID09IDAgfHwgY3VyX2JpdHMgPCBiZXN0X2JpdHMpIHsKKyAgICAgICAgICBiZXN0X2JpdHMgPSBjdXJfYml0czsKKyAgICAgICAgICBiZXN0X291dCA9IGs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN5bWJvbHNbaV0gPSBiZXN0X291dDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KG91dF9zaXplID09IDEpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbl9zaXplOyArK2kpIHsKKyAgICAgIHN5bWJvbHNbaV0gPSAwOworICAgIH0KKyAgfQorCisgIC8vIFJlY29tcHV0ZSBlYWNoIG91dCBiYXNlZCBvbiByYXcgYW5kIHN5bWJvbHMuCisgIGZvciAoaSA9IDA7IGkgPCBvdXRfc2l6ZTsgKytpKSB7CisgICAgSGlzdG9ncmFtQ2xlYXIob3V0X2hpc3RvW2ldKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBpbl9zaXplOyArK2kpIHsKKyAgICBjb25zdCBpbnQgaWR4ID0gc3ltYm9sc1tpXTsKKyAgICBIaXN0b2dyYW1BZGQoaW5faGlzdG9baV0sIG91dF9oaXN0b1tpZHhdLCBvdXRfaGlzdG9baWR4XSk7CisgIH0KK30KKworc3RhdGljIGRvdWJsZSBHZXRDb21iaW5lQ29zdEZhY3RvcihpbnQgaGlzdG9fc2l6ZSwgaW50IHF1YWxpdHkpIHsKKyAgZG91YmxlIGNvbWJpbmVfY29zdF9mYWN0b3IgPSAwLjE2OworICBpZiAocXVhbGl0eSA8IDkwKSB7CisgICAgaWYgKGhpc3RvX3NpemUgPiAyNTYpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKGhpc3RvX3NpemUgPiA1MTIpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKGhpc3RvX3NpemUgPiAxMDI0KSBjb21iaW5lX2Nvc3RfZmFjdG9yIC89IDIuOworICAgIGlmIChxdWFsaXR5IDw9IDUwKSBjb21iaW5lX2Nvc3RfZmFjdG9yIC89IDIuOworICB9CisgIHJldHVybiBjb21iaW5lX2Nvc3RfZmFjdG9yOworfQorCitpbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b19iaXRzLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IHRtcF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaGlzdG9fYml0cykgOiAxOworICBjb25zdCBpbnQgaGlzdG9feXNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGhpc3RvX2JpdHMpIDogMTsKKyAgY29uc3QgaW50IGltYWdlX2hpc3RvX3Jhd19zaXplID0gaGlzdG9feHNpemUgKiBoaXN0b195c2l6ZTsKKyAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3JpZ19oaXN0byA9CisgICAgICBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW1hZ2VfaGlzdG9fcmF3X3NpemUsIGNhY2hlX2JpdHMpOworICAvLyBEb24ndCBhdHRlbXB0IGxpbmVhciBiaW4tcGFydGl0aW9uIGhldXJpc3RpYyBmb3IKKyAgLy8gaGlzdG9ncmFtcyBvZiBzbWFsbCBzaXplcyAoYXMgYmluX21hcCB3aWxsIGJlIHZlcnkgc3BhcnNlKSBhbmQKKyAgLy8gbWF4aW11bSBxdWFsaXR5IHE9PTEwMCAodG8gcHJlc2VydmUgdGhlIGNvbXByZXNzaW9uIGdhaW5zIGF0IHRoYXQgbGV2ZWwpLgorICBjb25zdCBpbnQgZW50cm9weV9jb21iaW5lX251bV9iaW5zID0gbG93X2VmZm9ydCA/IE5VTV9QQVJUSVRJT05TIDogQklOX1NJWkU7CisgIGNvbnN0IGludCBlbnRyb3B5X2NvbWJpbmUgPQorICAgICAgKG9yaWdfaGlzdG8tPnNpemUgPiBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnMgKiAyKSAmJiAocXVhbGl0eSA8IDEwMCk7CisKKyAgaWYgKG9yaWdfaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAvLyBDb25zdHJ1Y3QgdGhlIGhpc3RvZ3JhbXMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorICBIaXN0b2dyYW1CdWlsZCh4c2l6ZSwgaGlzdG9fYml0cywgcmVmcywgb3JpZ19oaXN0byk7CisgIC8vIENvcGllcyB0aGUgaGlzdG9ncmFtcyBhbmQgY29tcHV0ZXMgaXRzIGJpdF9jb3N0LgorICBIaXN0b2dyYW1Db3B5QW5kQW5hbHl6ZShvcmlnX2hpc3RvLCBpbWFnZV9oaXN0byk7CisKKyAgaWYgKGVudHJvcHlfY29tYmluZSkgeworICAgIGNvbnN0IGludCBiaW5fbWFwX3NpemUgPSBvcmlnX2hpc3RvLT5zaXplOworICAgIC8vIFJldXNlIGhpc3RvZ3JhbV9zeW1ib2xzIHN0b3JhZ2UuIEJ5IGRlZmluaXRpb24sIGl0J3MgZ3VhcmFudGVlZCB0byBiZSBvay4KKyAgICB1aW50MTZfdCogY29uc3QgYmluX21hcCA9IGhpc3RvZ3JhbV9zeW1ib2xzOworICAgIGNvbnN0IGRvdWJsZSBjb21iaW5lX2Nvc3RfZmFjdG9yID0KKyAgICAgICAgR2V0Q29tYmluZUNvc3RGYWN0b3IoaW1hZ2VfaGlzdG9fcmF3X3NpemUsIHF1YWxpdHkpOworCisgICAgSGlzdG9ncmFtQW5hbHl6ZUVudHJvcHlCaW4ob3JpZ19oaXN0bywgYmluX21hcCwgbG93X2VmZm9ydCk7CisgICAgLy8gQ29sbGFwc2UgaGlzdG9ncmFtcyB3aXRoIHNpbWlsYXIgZW50cm9weS4KKyAgICBIaXN0b2dyYW1Db21iaW5lRW50cm9weUJpbihpbWFnZV9oaXN0bywgdG1wX2hpc3RvLCBiaW5fbWFwLCBiaW5fbWFwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weV9jb21iaW5lX251bV9iaW5zLCBjb21iaW5lX2Nvc3RfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQpOworICB9CisKKyAgLy8gRG9uJ3QgY29tYmluZSB0aGUgaGlzdG9ncmFtcyB1c2luZyBzdG9jaGFzdGljIGFuZCBncmVlZHkgaGV1cmlzdGljcyBmb3IKKyAgLy8gbG93LWVmZm9ydCBjb21wcmVzc2lvbiBtb2RlLgorICBpZiAoIWxvd19lZmZvcnQgfHwgIWVudHJvcHlfY29tYmluZSkgeworICAgIGNvbnN0IGZsb2F0IHggPSBxdWFsaXR5IC8gMTAwLmY7CisgICAgLy8gY3ViaWMgcmFtcCBiZXR3ZWVuIDEgYW5kIE1BWF9ISVNUT19HUkVFRFk6CisgICAgY29uc3QgaW50IHRocmVzaG9sZF9zaXplID0gKGludCkoMSArICh4ICogeCAqIHgpICogKE1BWF9ISVNUT19HUkVFRFkgLSAxKSk7CisgICAgaW50IGRvX2dyZWVkeTsKKyAgICBpZiAoIUhpc3RvZ3JhbUNvbWJpbmVTdG9jaGFzdGljKGltYWdlX2hpc3RvLCB0aHJlc2hvbGRfc2l6ZSwgJmRvX2dyZWVkeSkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmIChkb19ncmVlZHkgJiYgIUhpc3RvZ3JhbUNvbWJpbmVHcmVlZHkoaW1hZ2VfaGlzdG8pKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8odnJhYmF1ZCk6IE9wdGltaXplIEhpc3RvZ3JhbVJlbWFwIGZvciBsb3ctZWZmb3J0IGNvbXByZXNzaW9uIG1vZGUuCisgIC8vIEZpbmQgdGhlIG9wdGltYWwgbWFwIGZyb20gb3JpZ2luYWwgaGlzdG9ncmFtcyB0byB0aGUgZmluYWwgb25lcy4KKyAgSGlzdG9ncmFtUmVtYXAob3JpZ19oaXN0bywgaW1hZ2VfaGlzdG8sIGhpc3RvZ3JhbV9zeW1ib2xzKTsKKworICBvayA9IDE7CisKKyBFcnJvcjoKKyAgVlA4TEZyZWVIaXN0b2dyYW1TZXQob3JpZ19oaXN0byk7CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ZjQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKy8vIE1vZGVscyB0aGUgaGlzdG9ncmFtcyBvZiBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2Rlcy4KKworI2lmbmRlZiBXRUJQX0VOQ19ISVNUT0dSQU1fRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0hJU1RPR1JBTV9FTkNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTm90IGEgdHJpdmlhbCBsaXRlcmFsIHN5bWJvbC4KKyNkZWZpbmUgVlA4TF9OT05fVFJJVklBTF9TWU0gKDB4ZmZmZmZmZmYpCisKKy8vIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgaGlzdG9ncmFtcyBvZiBkYXRhLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBsaXRlcmFsXyBjb250YWlucyBncmVlbiBsaXRlcmFsLCBwYWxldHRlLWNvZGUgYW5kCisgIC8vIGNvcHktbGVuZ3RoLXByZWZpeCBoaXN0b2dyYW0KKyAgdWludDMyX3QqIGxpdGVyYWxfOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgZm9yIGxpdGVyYWwuCisgIHVpbnQzMl90IHJlZF9bTlVNX0xJVEVSQUxfQ09ERVNdOworICB1aW50MzJfdCBibHVlX1tOVU1fTElURVJBTF9DT0RFU107CisgIHVpbnQzMl90IGFscGhhX1tOVU1fTElURVJBTF9DT0RFU107CisgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSBwcmVmaXgtY29kZSBoaXN0b2dyYW0uCisgIHVpbnQzMl90IGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHNfOworICB1aW50MzJfdCB0cml2aWFsX3N5bWJvbF87ICAvLyBUcnVlLCBpZiBoaXN0b2dyYW1zIGZvciBSZWQsIEJsdWUgJiBBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXRlcmFsIHN5bWJvbHMgYXJlIHNpbmdsZSB2YWx1ZWQuCisgIGRvdWJsZSBiaXRfY29zdF87ICAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZSBvZiBiaXQgY29zdC4KKyAgZG91YmxlIGxpdGVyYWxfY29zdF87ICAgICAgLy8gQ2FjaGVkIHZhbHVlcyBvZiBkb21pbmFudCBlbnRyb3B5IGNvc3RzOgorICBkb3VibGUgcmVkX2Nvc3RfOyAgICAgICAgICAvLyBsaXRlcmFsLCByZWQgJiBibHVlLgorICBkb3VibGUgYmx1ZV9jb3N0XzsKK30gVlA4TEhpc3RvZ3JhbTsKKworLy8gQ29sbGVjdGlvbiBvZiBoaXN0b2dyYW1zIHdpdGggZml4ZWQgY2FwYWNpdHksIGFsbG9jYXRlZCBhcyBvbmUKKy8vIGJpZyBtZW1vcnkgY2h1bmsuIENhbiBiZSBkZXN0cm95ZWQgYnkgY2FsbGluZyBXZWJQU2FmZUZyZWUoKS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNpemU7ICAgICAgICAgLy8gbnVtYmVyIG9mIHNsb3RzIGN1cnJlbnRseSBpbiB1c2UKKyAgaW50IG1heF9zaXplOyAgICAgLy8gbWF4aW11bSBjYXBhY2l0eQorICBWUDhMSGlzdG9ncmFtKiogaGlzdG9ncmFtczsKK30gVlA4TEhpc3RvZ3JhbVNldDsKKworLy8gQ3JlYXRlIHRoZSBoaXN0b2dyYW0uCisvLworLy8gVGhlIGlucHV0IGRhdGEgaXMgdGhlIFBpeE9yQ29weSBkYXRhLCB3aGljaCBtb2RlbHMgdGhlIGxpdGVyYWxzLCBzdG9wCisvLyBjb2RlcyBhbmQgYmFja3dhcmQgcmVmZXJlbmNlcyAoYm90aCBkaXN0YW5jZXMgYW5kIGxlbmd0aHMpLiAgQWxzbzogaWYKKy8vIHBhbGV0dGVfY29kZV9iaXRzIGlzID49IDAsIGluaXRpYWxpemUgdGhlIGhpc3RvZ3JhbSB3aXRoIHRoaXMgdmFsdWUuCit2b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGZvciBhIGdpdmVuIHBhbGV0dGVfY29kZV9iaXRzLgoraW50IFZQOExHZXRIaXN0b2dyYW1TaXplKGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFNldCB0aGUgcGFsZXR0ZV9jb2RlX2JpdHMgYW5kIHJlc2V0IHRoZSBzdGF0cy4KK3ZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKKworLy8gQ29sbGVjdCBhbGwgdGhlIHJlZmVyZW5jZXMgaW50byBhIGhpc3RvZ3JhbSAod2l0aG91dCByZXNldCkKK3ZvaWQgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKKworLy8gRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGhpc3RvZ3JhbS4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW0oVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworCisvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9ncmFtIHNldC4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW1TZXQoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG8pOworCisvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVyIHRvIGhpc3RvZ3JhbXMsIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKy8vIHVzaW5nICdjYWNoZV9iaXRzJy4gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitWUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKTsKKworLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgaGlzdG9ncmFtIG9iamVjdCB3aXRoIHNwZWNpZmllZCAnY2FjaGVfYml0cycuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCisvLyBTcGVjaWFsIGNhc2Ugb2YgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0LCB3aXRoIHNpemUgZXF1YWxzIDEuCitWUDhMSGlzdG9ncmFtKiBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oaW50IGNhY2hlX2JpdHMpOworCisvLyBBY2N1bXVsYXRlIGEgdG9rZW4gJ3YnIGludG8gYSBoaXN0b2dyYW0uCit2b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbnN0IGRpc3RhbmNlX21vZGlmaWVyKShpbnQsIGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlX21vZGlmaWVyX2FyZzApOworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpIHsKKyAgcmV0dXJuIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArCisgICAgICAoKHBhbGV0dGVfY29kZV9iaXRzID4gMCkgPyAoMSA8PCBwYWxldHRlX2NvZGVfYml0cykgOiAwKTsKK30KKworLy8gQnVpbGRzIHRoZSBoaXN0b2dyYW0gaW1hZ2UuCitpbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b2dyYW1fYml0cywgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCB0bXBfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyk7CisKKy8vIFJldHVybnMgdGhlIGVudHJvcHkgZm9yIHRoZSBzeW1ib2xzIGluIHRoZSBpbnB1dCBhcnJheS4KK2RvdWJsZSBWUDhMQml0c0VudHJvcHkoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbik7CisKKy8vIEVzdGltYXRlIGhvdyBtYW55IGJpdHMgdGhlIGNvbWJpbmVkIGVudHJvcHkgb2YgbGl0ZXJhbHMgYW5kIGRpc3RhbmNlCisvLyBhcHByb3hpbWF0ZWx5IG1hcHMgdG8uCitkb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VOQ19ISVNUT0dSQU1fRU5DX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaXRlcmF0b3IuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaXRlcmF0b3JfZW5jLmMKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaXRlcmF0b3JfZW5jLmMKaW5kZXggMmNkMWJjMC4uMWRmOWNiMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9pdGVyYXRvcl9lbmMuYwpAQCAtMTEsNzYgKzExLDkyIEBACiAvLwogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVlA4SXRlcmF0b3IKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkIEluaXRMZWZ0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgZW5jLT55X2xlZnRfWy0xXSA9IGVuYy0+dV9sZWZ0X1stMV0gPSBlbmMtPnZfbGVmdF9bLTFdID0KKyAgaXQtPnlfbGVmdF9bLTFdID0gaXQtPnVfbGVmdF9bLTFdID0gaXQtPnZfbGVmdF9bLTFdID0KICAgICAgIChpdC0+eV8gPiAwKSA/IDEyOSA6IDEyNzsKLSAgU2JNZW1vcnlTZXQoZW5jLT55X2xlZnRfLCAxMjksIDE2KTsKLSAgU2JNZW1vcnlTZXQoZW5jLT51X2xlZnRfLCAxMjksIDgpOwotICBTYk1lbW9yeVNldChlbmMtPnZfbGVmdF8sIDEyOSwgOCk7CisgIG1lbXNldChpdC0+eV9sZWZ0XywgMTI5LCAxNik7CisgIG1lbXNldChpdC0+dV9sZWZ0XywgMTI5LCA4KTsKKyAgbWVtc2V0KGl0LT52X2xlZnRfLCAxMjksIDgpOwogICBpdC0+bGVmdF9uel9bOF0gPSAwOworICBpZiAoaXQtPnRvcF9kZXJyXyAhPSBOVUxMKSB7CisgICAgbWVtc2V0KCZpdC0+bGVmdF9kZXJyXywgMCwgc2l6ZW9mKGl0LT5sZWZ0X2RlcnJfKSk7CisgIH0KIH0KIAogc3RhdGljIHZvaWQgSW5pdFRvcChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKICAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CiAgIGNvbnN0IHNpemVfdCB0b3Bfc2l6ZSA9IGVuYy0+bWJfd18gKiAxNjsKLSAgU2JNZW1vcnlTZXQoZW5jLT55X3RvcF8sIDEyNywgMiAqIHRvcF9zaXplKTsKLSAgU2JNZW1vcnlTZXQoZW5jLT5uel8sIDAsIGVuYy0+bWJfd18gKiBzaXplb2YoKmVuYy0+bnpfKSk7CisgIG1lbXNldChlbmMtPnlfdG9wXywgMTI3LCAyICogdG9wX3NpemUpOworICBtZW1zZXQoZW5jLT5uel8sIDAsIGVuYy0+bWJfd18gKiBzaXplb2YoKmVuYy0+bnpfKSk7CisgIGlmIChlbmMtPnRvcF9kZXJyXyAhPSBOVUxMKSB7CisgICAgbWVtc2V0KGVuYy0+dG9wX2RlcnJfLCAwLCBlbmMtPm1iX3dfICogc2l6ZW9mKCplbmMtPnRvcF9kZXJyXykpOworICB9Cit9CisKK3ZvaWQgVlA4SXRlcmF0b3JTZXRSb3coVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgeSkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaXQtPnhfID0gMDsKKyAgaXQtPnlfID0geTsKKyAgaXQtPmJ3XyA9ICZlbmMtPnBhcnRzX1t5ICYgKGVuYy0+bnVtX3BhcnRzXyAtIDEpXTsKKyAgaXQtPnByZWRzXyA9IGVuYy0+cHJlZHNfICsgeSAqIDQgKiBlbmMtPnByZWRzX3dfOworICBpdC0+bnpfID0gZW5jLT5uel87CisgIGl0LT5tYl8gPSBlbmMtPm1iX2luZm9fICsgeSAqIGVuYy0+bWJfd187CisgIGl0LT55X3RvcF8gPSBlbmMtPnlfdG9wXzsKKyAgaXQtPnV2X3RvcF8gPSBlbmMtPnV2X3RvcF87CisgIEluaXRMZWZ0KGl0KTsKIH0KIAogdm9pZCBWUDhJdGVyYXRvclJlc2V0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewogICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaXQtPnhfID0gMDsKLSAgaXQtPnlfID0gMDsKLSAgaXQtPnlfb2Zmc2V0XyA9IDA7Ci0gIGl0LT51dl9vZmZzZXRfID0gMDsKLSAgaXQtPm1iXyA9IGVuYy0+bWJfaW5mb187Ci0gIGl0LT5wcmVkc18gPSBlbmMtPnByZWRzXzsKLSAgaXQtPm56XyA9IGVuYy0+bnpfOwotICBpdC0+YndfID0gJmVuYy0+cGFydHNfWzBdOwotICBpdC0+ZG9uZV8gPSBlbmMtPm1iX3dfKiBlbmMtPm1iX2hfOworICBWUDhJdGVyYXRvclNldFJvdyhpdCwgMCk7CisgIFZQOEl0ZXJhdG9yU2V0Q291bnREb3duKGl0LCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyk7ICAvLyBkZWZhdWx0CiAgIEluaXRUb3AoaXQpOwotICBJbml0TGVmdChpdCk7Ci0gIFNiTWVtb3J5U2V0KGl0LT5iaXRfY291bnRfLCAwLCBzaXplb2YoaXQtPmJpdF9jb3VudF8pKTsKKyAgbWVtc2V0KGl0LT5iaXRfY291bnRfLCAwLCBzaXplb2YoaXQtPmJpdF9jb3VudF8pKTsKICAgaXQtPmRvX3RyZWxsaXNfID0gMDsKIH0KIAordm9pZCBWUDhJdGVyYXRvclNldENvdW50RG93bihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBjb3VudF9kb3duKSB7CisgIGl0LT5jb3VudF9kb3duXyA9IGl0LT5jb3VudF9kb3duMF8gPSBjb3VudF9kb3duOworfQorCitpbnQgVlA4SXRlcmF0b3JJc0RvbmUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIHJldHVybiAoaXQtPmNvdW50X2Rvd25fIDw9IDApOworfQorCiB2b2lkIFZQOEl0ZXJhdG9ySW5pdChWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewogICBpdC0+ZW5jXyA9IGVuYzsKLSAgaXQtPnlfc3RyaWRlXyAgPSBlbmMtPnBpY18tPnlfc3RyaWRlOwotICBpdC0+dXZfc3RyaWRlXyA9IGVuYy0+cGljXy0+dXZfc3RyaWRlOwotICAvLyBUT0RPKGxhdGVyKTogZm9yIG11bHRpdGhyZWFkaW5nLCB0aGVzZSBzaG91bGQgYmUgb3duZWQgYnkgJ2l0Jy4KLSAgaXQtPnl1dl9pbl8gICA9IGVuYy0+eXV2X2luXzsKLSAgaXQtPnl1dl9vdXRfICA9IGVuYy0+eXV2X291dF87Ci0gIGl0LT55dXZfb3V0Ml8gPSBlbmMtPnl1dl9vdXQyXzsKLSAgaXQtPnl1dl9wXyAgICA9IGVuYy0+eXV2X3BfOworICBpdC0+eXV2X2luXyAgID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04oaXQtPnl1dl9tZW1fKTsKKyAgaXQtPnl1dl9vdXRfICA9IGl0LT55dXZfaW5fICsgWVVWX1NJWkVfRU5DOworICBpdC0+eXV2X291dDJfID0gaXQtPnl1dl9vdXRfICsgWVVWX1NJWkVfRU5DOworICBpdC0+eXV2X3BfICAgID0gaXQtPnl1dl9vdXQyXyArIFlVVl9TSVpFX0VOQzsKICAgaXQtPmxmX3N0YXRzXyA9IGVuYy0+bGZfc3RhdHNfOwogICBpdC0+cGVyY2VudDBfID0gZW5jLT5wZXJjZW50XzsKKyAgaXQtPnlfbGVmdF8gPSAodWludDhfdCopV0VCUF9BTElHTihpdC0+eXV2X2xlZnRfbWVtXyArIDEpOworICBpdC0+dV9sZWZ0XyA9IGl0LT55X2xlZnRfICsgMTYgKyAxNjsKKyAgaXQtPnZfbGVmdF8gPSBpdC0+dV9sZWZ0XyArIDE2OworICBpdC0+dG9wX2RlcnJfID0gZW5jLT50b3BfZGVycl87CiAgIFZQOEl0ZXJhdG9yUmVzZXQoaXQpOwogfQogCiBpbnQgVlA4SXRlcmF0b3JQcm9ncmVzcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBkZWx0YSkgewogICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaWYgKGRlbHRhICYmIGVuYy0+cGljXy0+cHJvZ3Jlc3NfaG9vaykgewotICAgIGNvbnN0IGludCBwZXJjZW50ID0gKGVuYy0+bWJfaF8gPD0gMSkKKyAgaWYgKGRlbHRhICYmIGVuYy0+cGljXy0+cHJvZ3Jlc3NfaG9vayAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IGRvbmUgPSBpdC0+Y291bnRfZG93bjBfIC0gaXQtPmNvdW50X2Rvd25fOworICAgIGNvbnN0IGludCBwZXJjZW50ID0gKGl0LT5jb3VudF9kb3duMF8gPD0gMCkKICAgICAgICAgICAgICAgICAgICAgICA/IGl0LT5wZXJjZW50MF8KLSAgICAgICAgICAgICAgICAgICAgICA6IGl0LT5wZXJjZW50MF8gKyBkZWx0YSAqIGl0LT55XyAvIChlbmMtPm1iX2hfIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgOiBpdC0+cGVyY2VudDBfICsgZGVsdGEgKiBkb25lIC8gaXQtPmNvdW50X2Rvd24wXzsKICAgICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOwogICB9CiAgIHJldHVybiAxOwpAQCAtOTAsNDcgKzEwNiw3NCBAQAogLy8gSW1wb3J0IHRoZSBzb3VyY2Ugc2FtcGxlcyBpbnRvIHRoZSBjYWNoZS4gVGFrZXMgY2FyZSBvZiByZXBsaWNhdGluZwogLy8gYm91bmRhcnkgcGl4ZWxzIGlmIG5lY2Vzc2FyeS4KIAorc3RhdGljIFdFQlBfSU5MSU5FIGludCBNaW5TaXplKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisKIHN0YXRpYyB2b2lkIEltcG9ydEJsb2NrKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCB3LCBpbnQgaCwgaW50IHNpemUpIHsKICAgaW50IGk7CiAgIGZvciAoaSA9IDA7IGkgPCBoOyArK2kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHcpOworICAgIG1lbWNweShkc3QsIHNyYywgdyk7CiAgICAgaWYgKHcgPCBzaXplKSB7Ci0gICAgICBTYk1lbW9yeVNldChkc3QgKyB3LCBkc3RbdyAtIDFdLCBzaXplIC0gdyk7CisgICAgICBtZW1zZXQoZHN0ICsgdywgZHN0W3cgLSAxXSwgc2l6ZSAtIHcpOwogICAgIH0KICAgICBkc3QgKz0gQlBTOwogICAgIHNyYyArPSBzcmNfc3RyaWRlOwogICB9CiAgIGZvciAoaSA9IGg7IGkgPCBzaXplOyArK2kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBkc3QgLSBCUFMsIHNpemUpOworICAgIG1lbWNweShkc3QsIGRzdCAtIEJQUywgc2l6ZSk7CiAgICAgZHN0ICs9IEJQUzsKICAgfQogfQogCi12b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworc3RhdGljIHZvaWQgSW1wb3J0TGluZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4sIGludCB0b3RhbF9sZW4pIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSwgc3JjICs9IHNyY19zdHJpZGUpIGRzdFtpXSA9ICpzcmM7CisgIGZvciAoOyBpIDwgdG90YWxfbGVuOyArK2kpIGRzdFtpXSA9IGRzdFtsZW4gLSAxXTsKK30KKwordm9pZCBWUDhJdGVyYXRvckltcG9ydChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIHVpbnQ4X3QqIHRtcF8zMikgewogICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKICAgY29uc3QgaW50IHggPSBpdC0+eF8sIHkgPSBpdC0+eV87CiAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBwaWMtPnkgKyAoeSAqIHBpYy0+eV9zdHJpZGUgKyB4KSAqIDE2OworICBjb25zdCB1aW50OF90KiBjb25zdCB5c3JjID0gcGljLT55ICsgKHkgKiBwaWMtPnlfc3RyaWRlICArIHgpICogMTY7CiAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHVzcmMgPSBwaWMtPnUgKyAoeSAqIHBpYy0+dXZfc3RyaWRlICsgeCkgKiA4OwogICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gcGljLT52ICsgKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogODsKLSAgdWludDhfdCogY29uc3QgeWRzdCA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHVkc3QgPSBpdC0+eXV2X2luXyArIFVfT0ZGOwotICB1aW50OF90KiBjb25zdCB2ZHN0ID0gaXQtPnl1dl9pbl8gKyBWX09GRjsKLSAgaW50IHcgPSAocGljLT53aWR0aCAtIHggKiAxNik7Ci0gIGludCBoID0gKHBpYy0+aGVpZ2h0IC0geSAqIDE2KTsKKyAgY29uc3QgaW50IHcgPSBNaW5TaXplKHBpYy0+d2lkdGggLSB4ICogMTYsIDE2KTsKKyAgY29uc3QgaW50IGggPSBNaW5TaXplKHBpYy0+aGVpZ2h0IC0geSAqIDE2LCAxNik7CisgIGNvbnN0IGludCB1dl93ID0gKHcgKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfaCA9IChoICsgMSkgPj4gMTsKIAotICBpZiAodyA+IDE2KSB3ID0gMTY7Ci0gIGlmIChoID4gMTYpIGggPSAxNjsKKyAgSW1wb3J0QmxvY2soeXNyYywgcGljLT55X3N0cmlkZSwgIGl0LT55dXZfaW5fICsgWV9PRkZfRU5DLCB3LCBoLCAxNik7CisgIEltcG9ydEJsb2NrKHVzcmMsIHBpYy0+dXZfc3RyaWRlLCBpdC0+eXV2X2luXyArIFVfT0ZGX0VOQywgdXZfdywgdXZfaCwgOCk7CisgIEltcG9ydEJsb2NrKHZzcmMsIHBpYy0+dXZfc3RyaWRlLCBpdC0+eXV2X2luXyArIFZfT0ZGX0VOQywgdXZfdywgdXZfaCwgOCk7CiAKLSAgLy8gTHVtYSBwbGFuZQotICBJbXBvcnRCbG9jayh5c3JjLCBwaWMtPnlfc3RyaWRlLCB5ZHN0LCB3LCBoLCAxNik7CisgIGlmICh0bXBfMzIgPT0gTlVMTCkgcmV0dXJuOwogCi0gIHsgICAvLyBVL1YgcGxhbmVzCi0gICAgY29uc3QgaW50IHV2X3cgPSAodyArIDEpID4+IDE7Ci0gICAgY29uc3QgaW50IHV2X2ggPSAoaCArIDEpID4+IDE7Ci0gICAgSW1wb3J0QmxvY2sodXNyYywgcGljLT51dl9zdHJpZGUsIHVkc3QsIHV2X3csIHV2X2gsIDgpOwotICAgIEltcG9ydEJsb2NrKHZzcmMsIHBpYy0+dXZfc3RyaWRlLCB2ZHN0LCB1dl93LCB1dl9oLCA4KTsKKyAgLy8gSW1wb3J0IHNvdXJjZSAodW5jb21wcmVzc2VkKSBzYW1wbGVzIGludG8gYm91bmRhcnkuCisgIGlmICh4ID09IDApIHsKKyAgICBJbml0TGVmdChpdCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHkgPT0gMCkgeworICAgICAgaXQtPnlfbGVmdF9bLTFdID0gaXQtPnVfbGVmdF9bLTFdID0gaXQtPnZfbGVmdF9bLTFdID0gMTI3OworICAgIH0gZWxzZSB7CisgICAgICBpdC0+eV9sZWZ0X1stMV0gPSB5c3JjWy0gMSAtIHBpYy0+eV9zdHJpZGVdOworICAgICAgaXQtPnVfbGVmdF9bLTFdID0gdXNyY1stIDEgLSBwaWMtPnV2X3N0cmlkZV07CisgICAgICBpdC0+dl9sZWZ0X1stMV0gPSB2c3JjWy0gMSAtIHBpYy0+dXZfc3RyaWRlXTsKKyAgICB9CisgICAgSW1wb3J0TGluZSh5c3JjIC0gMSwgcGljLT55X3N0cmlkZSwgIGl0LT55X2xlZnRfLCBoLCAgIDE2KTsKKyAgICBJbXBvcnRMaW5lKHVzcmMgLSAxLCBwaWMtPnV2X3N0cmlkZSwgaXQtPnVfbGVmdF8sIHV2X2gsIDgpOworICAgIEltcG9ydExpbmUodnNyYyAtIDEsIHBpYy0+dXZfc3RyaWRlLCBpdC0+dl9sZWZ0XywgdXZfaCwgOCk7CisgIH0KKworICBpdC0+eV90b3BfICA9IHRtcF8zMiArIDA7CisgIGl0LT51dl90b3BfID0gdG1wXzMyICsgMTY7CisgIGlmICh5ID09IDApIHsKKyAgICBtZW1zZXQodG1wXzMyLCAxMjcsIDMyICogc2l6ZW9mKCp0bXBfMzIpKTsKKyAgfSBlbHNlIHsKKyAgICBJbXBvcnRMaW5lKHlzcmMgLSBwaWMtPnlfc3RyaWRlLCAgMSwgdG1wXzMyLCAgICAgICAgICB3LCAgIDE2KTsKKyAgICBJbXBvcnRMaW5lKHVzcmMgLSBwaWMtPnV2X3N0cmlkZSwgMSwgdG1wXzMyICsgMTYsICAgICB1dl93LCA4KTsKKyAgICBJbXBvcnRMaW5lKHZzcmMgLSBwaWMtPnV2X3N0cmlkZSwgMSwgdG1wXzMyICsgMTYgKyA4LCB1dl93LCA4KTsKICAgfQogfQogCkBAIC0xNDAsNyArMTgzLDcgQEAKIHN0YXRpYyB2b2lkIEV4cG9ydEJsb2NrKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgewogICB3aGlsZSAoaC0tID4gMCkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgdyk7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsKICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICBzcmMgKz0gQlBTOwogICB9CkBAIC0xNTAsOSArMTkzLDkgQEAKICAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CiAgIGlmIChlbmMtPmNvbmZpZ18tPnNob3dfY29tcHJlc3NlZCkgewogICAgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRjsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1c3JjID0gaXQtPnl1dl9vdXRfICsgVV9PRkY7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdnNyYyA9IGl0LT55dXZfb3V0XyArIFZfT0ZGOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgdXNyYyA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gaXQtPnl1dl9vdXRfICsgVl9PRkZfRU5DOwogICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CiAgICAgdWludDhfdCogY29uc3QgeWRzdCA9IHBpYy0+eSArICh5ICogcGljLT55X3N0cmlkZSArIHgpICogMTY7CiAgICAgdWludDhfdCogY29uc3QgdWRzdCA9IHBpYy0+dSArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CkBAIC0yNDYsNDggKzI4OSw0NCBAQAogI3VuZGVmIEJJVAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBwb3NpdGlvbiwgZG9pbmcgdGhlIGJvb2tlZXBpbmcuCisvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBkb2luZyB0aGUgYm9va2tlZXBpbmcuCiAKLWludCBWUDhJdGVyYXRvck5leHQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBibG9ja190b19zYXZlKSB7Cit2b2lkIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewogICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaWYgKGJsb2NrX3RvX3NhdmUpIHsKLSAgICBjb25zdCBpbnQgeCA9IGl0LT54XywgeSA9IGl0LT55XzsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB5c3JjID0gYmxvY2tfdG9fc2F2ZSArIFlfT0ZGOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHVzcmMgPSBibG9ja190b19zYXZlICsgVV9PRkY7Ci0gICAgaWYgKHggPCBlbmMtPm1iX3dfIC0gMSkgeyAgIC8vIGxlZnQKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgZW5jLT55X2xlZnRfW2ldID0geXNyY1sxNSArIGkgKiBCUFNdOwotICAgICAgfQotICAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotICAgICAgICBlbmMtPnVfbGVmdF9baV0gPSB1c3JjWzcgKyBpICogQlBTXTsKLSAgICAgICAgZW5jLT52X2xlZnRfW2ldID0gdXNyY1sxNSArIGkgKiBCUFNdOwotICAgICAgfQotICAgICAgLy8gdG9wLWxlZnQgKGJlZm9yZSAndG9wJyEpCi0gICAgICBlbmMtPnlfbGVmdF9bLTFdID0gZW5jLT55X3RvcF9beCAqIDE2ICsgMTVdOwotICAgICAgZW5jLT51X2xlZnRfWy0xXSA9IGVuYy0+dXZfdG9wX1t4ICogMTYgKyAwICsgN107Ci0gICAgICBlbmMtPnZfbGVmdF9bLTFdID0gZW5jLT51dl90b3BfW3ggKiAxNiArIDggKyA3XTsKKyAgY29uc3QgaW50IHggPSBpdC0+eF8sIHkgPSBpdC0+eV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHV2c3JjID0gaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DOworICBpZiAoeCA8IGVuYy0+bWJfd18gLSAxKSB7ICAgLy8gbGVmdAorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBpdC0+eV9sZWZ0X1tpXSA9IHlzcmNbMTUgKyBpICogQlBTXTsKICAgICB9Ci0gICAgaWYgKHkgPCBlbmMtPm1iX2hfIC0gMSkgeyAgLy8gdG9wCi0gICAgICBTYk1lbW9yeUNvcHkoZW5jLT55X3RvcF8gKyB4ICogMTYsIHlzcmMgKyAxNSAqIEJQUywgMTYpOwotICAgICAgU2JNZW1vcnlDb3B5KGVuYy0+dXZfdG9wXyArIHggKiAxNiwgdXNyYyArIDcgKiBCUFMsIDggKyA4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBpdC0+dV9sZWZ0X1tpXSA9IHV2c3JjWzcgKyBpICogQlBTXTsKKyAgICAgIGl0LT52X2xlZnRfW2ldID0gdXZzcmNbMTUgKyBpICogQlBTXTsKICAgICB9CisgICAgLy8gdG9wLWxlZnQgKGJlZm9yZSAndG9wJyEpCisgICAgaXQtPnlfbGVmdF9bLTFdID0gaXQtPnlfdG9wX1sxNV07CisgICAgaXQtPnVfbGVmdF9bLTFdID0gaXQtPnV2X3RvcF9bMCArIDddOworICAgIGl0LT52X2xlZnRfWy0xXSA9IGl0LT51dl90b3BfWzggKyA3XTsKICAgfQorICBpZiAoeSA8IGVuYy0+bWJfaF8gLSAxKSB7ICAvLyB0b3AKKyAgICBtZW1jcHkoaXQtPnlfdG9wXywgeXNyYyArIDE1ICogQlBTLCAxNik7CisgICAgbWVtY3B5KGl0LT51dl90b3BfLCB1dnNyYyArIDcgKiBCUFMsIDggKyA4KTsKKyAgfQorfQogCi0gIGl0LT5tYl8rKzsKLSAgaXQtPnByZWRzXyArPSA0OwotICBpdC0+bnpfKys7Ci0gIGl0LT54XysrOwotICBpZiAoaXQtPnhfID09IGVuYy0+bWJfd18pIHsKLSAgICBpdC0+eF8gPSAwOwotICAgIGl0LT55XysrOwotICAgIGl0LT5id18gPSAmZW5jLT5wYXJ0c19baXQtPnlfICYgKGVuYy0+bnVtX3BhcnRzXyAtIDEpXTsKLSAgICBpdC0+cHJlZHNfID0gZW5jLT5wcmVkc18gKyBpdC0+eV8gKiA0ICogZW5jLT5wcmVkc193XzsKLSAgICBpdC0+bnpfID0gZW5jLT5uel87Ci0gICAgSW5pdExlZnQoaXQpOworaW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgaWYgKCsraXQtPnhfID09IGl0LT5lbmNfLT5tYl93XykgeworICAgIFZQOEl0ZXJhdG9yU2V0Um93KGl0LCArK2l0LT55Xyk7CisgIH0gZWxzZSB7CisgICAgaXQtPnByZWRzXyArPSA0OworICAgIGl0LT5tYl8gKz0gMTsKKyAgICBpdC0+bnpfICs9IDE7CisgICAgaXQtPnlfdG9wXyArPSAxNjsKKyAgICBpdC0+dXZfdG9wXyArPSAxNjsKICAgfQotICByZXR1cm4gKDAgPCAtLWl0LT5kb25lXyk7CisgIHJldHVybiAoMCA8IC0taXQtPmNvdW50X2Rvd25fKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5Nyw3ICszMzYsNyBAQAogICB1aW50OF90KiBwcmVkcyA9IGl0LT5wcmVkc187CiAgIGludCB5OwogICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgU2JNZW1vcnlTZXQocHJlZHMsIG1vZGUsIDQpOworICAgIG1lbXNldChwcmVkcywgbW9kZSwgNCk7CiAgICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOwogICB9CiAgIGl0LT5tYl8tPnR5cGVfID0gMTsKQEAgLTMwNyw3ICszNDYsNyBAQAogICB1aW50OF90KiBwcmVkcyA9IGl0LT5wcmVkc187CiAgIGludCB5OwogICBmb3IgKHkgPSA0OyB5ID4gMDsgLS15KSB7Ci0gICAgU2JNZW1vcnlDb3B5KHByZWRzLCBtb2RlcywgNCAqIHNpemVvZigqbW9kZXMpKTsKKyAgICBtZW1jcHkocHJlZHMsIG1vZGVzLCA0ICogc2l6ZW9mKCptb2RlcykpOwogICAgIHByZWRzICs9IGl0LT5lbmNfLT5wcmVkc193XzsKICAgICBtb2RlcyArPSA0OwogICB9CkBAIC0zNzQsMTUgKzQxMywxNSBAQAogCiAgIC8vIEltcG9ydCB0aGUgYm91bmRhcnkgc2FtcGxlcwogICBmb3IgKGkgPSAwOyBpIDwgMTc7ICsraSkgeyAgICAvLyBsZWZ0Ci0gICAgaXQtPmk0X2JvdW5kYXJ5X1tpXSA9IGVuYy0+eV9sZWZ0X1sxNSAtIGldOworICAgIGl0LT5pNF9ib3VuZGFyeV9baV0gPSBpdC0+eV9sZWZ0X1sxNSAtIGldOwogICB9CiAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7ICAgIC8vIHRvcAotICAgIGl0LT5pNF9ib3VuZGFyeV9bMTcgKyBpXSA9IGVuYy0+eV90b3BfW2l0LT54XyAqIDE2ICsgaV07CisgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gaXQtPnlfdG9wX1tpXTsKICAgfQogICAvLyB0b3AtcmlnaHQgc2FtcGxlcyBoYXZlIGEgc3BlY2lhbCBjYXNlIG9uIHRoZSBmYXIgcmlnaHQgb2YgdGhlIHBpY3R1cmUKICAgaWYgKGl0LT54XyA8IGVuYy0+bWJfd18gLSAxKSB7CiAgICAgZm9yIChpID0gMTY7IGkgPCAxNiArIDQ7ICsraSkgewotICAgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gZW5jLT55X3RvcF9baXQtPnhfICogMTYgKyBpXTsKKyAgICAgIGl0LT5pNF9ib3VuZGFyeV9bMTcgKyBpXSA9IGl0LT55X3RvcF9baV07CiAgICAgfQogICB9IGVsc2UgeyAgICAvLyBlbHNlLCByZXBsaWNhdGUgdGhlIGxhc3QgdmFsaWQgcGl4ZWwgZm91ciB0aW1lcwogICAgIGZvciAoaSA9IDE2OyBpIDwgMTYgKyA0OyArK2kpIHsKQEAgLTQyMiw3ICs0NjEsMyBAQAogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvbmVhcl9sb3NzbGVzc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvbmVhcl9sb3NzbGVzc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQ5NDY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jCkBAIC0wLDAgKzEsMTU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTmVhci1sb3NzbGVzcyBpbWFnZSBwcmVwcm9jZXNzaW5nIGFkanVzdHMgcGl4ZWwgdmFsdWVzIHRvIGhlbHAKKy8vIGNvbXByZXNzaWJpbGl0eSB3aXRoIGEgZ3VhcmFudGVlIG9mIG1heGltdW0gZGV2aWF0aW9uIGJldHdlZW4gb3JpZ2luYWwgYW5kCisvLyByZXN1bHRpbmcgcGl4ZWwgdmFsdWVzLgorLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vIENvbnZlcnRlZCB0byBDIGJ5IEFsZWtzYW5kZXIgS3JhbWFyeiAoYWtyYW1hcnpAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhsaV9lbmMuaCIKKworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKworI2RlZmluZSBNSU5fRElNX0ZPUl9ORUFSX0xPU1NMRVNTIDY0CisjZGVmaW5lIE1BWF9MSU1JVF9CSVRTICAgICAgICAgICAgIDUKKworLy8gUXVhbnRpemVzIHRoZSB2YWx1ZSB1cCBvciBkb3duIHRvIGEgbXVsdGlwbGUgb2YgMTw8Yml0cyAob3IgdG8gMjU1KSwKKy8vIGNob29zaW5nIHRoZSBjbG9zZXIgb25lLCByZXNvbHZpbmcgdGllcyB1c2luZyBiYW5rZXJzJyByb3VuZGluZy4KK3N0YXRpYyB1aW50MzJfdCBGaW5kQ2xvc2VzdERpc2NyZXRpemVkKHVpbnQzMl90IGEsIGludCBiaXRzKSB7CisgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAoMXUgPDwgYml0cykgLSAxOworICBjb25zdCB1aW50MzJfdCBiaWFzZWQgPSBhICsgKG1hc2sgPj4gMSkgKyAoKGEgPj4gYml0cykgJiAxKTsKKyAgYXNzZXJ0KGJpdHMgPiAwKTsKKyAgaWYgKGJpYXNlZCA+IDB4ZmYpIHJldHVybiAweGZmOworICByZXR1cm4gYmlhc2VkICYgfm1hc2s7Cit9CisKKy8vIEFwcGxpZXMgRmluZENsb3Nlc3REaXNjcmV0aXplZCB0byBhbGwgY2hhbm5lbHMgb2YgcGl4ZWwuCitzdGF0aWMgdWludDMyX3QgQ2xvc2VzdERpc2NyZXRpemVkQXJnYih1aW50MzJfdCBhLCBpbnQgYml0cykgeworICByZXR1cm4KKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKGEgPj4gMjQsIGJpdHMpIDw8IDI0KSB8CisgICAgICAoRmluZENsb3Nlc3REaXNjcmV0aXplZCgoYSA+PiAxNikgJiAweGZmLCBiaXRzKSA8PCAxNikgfAorICAgICAgKEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoKGEgPj4gOCkgJiAweGZmLCBiaXRzKSA8PCA4KSB8CisgICAgICAoRmluZENsb3Nlc3REaXNjcmV0aXplZChhICYgMHhmZiwgYml0cykpOworfQorCisvLyBDaGVja3MgaWYgZGlzdGFuY2UgYmV0d2VlbiBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdmFsdWVzIG9mIHBpeGVscyBhIGFuZCBiCisvLyBpcyB3aXRoaW4gdGhlIGdpdmVuIGxpbWl0Lgorc3RhdGljIGludCBJc05lYXIodWludDMyX3QgYSwgdWludDMyX3QgYiwgaW50IGxpbWl0KSB7CisgIGludCBrOworICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7CisgICAgY29uc3QgaW50IGRlbHRhID0KKyAgICAgICAgKGludCkoKGEgPj4gKGsgKiA4KSkgJiAweGZmKSAtIChpbnQpKChiID4+IChrICogOCkpICYgMHhmZik7CisgICAgaWYgKGRlbHRhID49IGxpbWl0IHx8IGRlbHRhIDw9IC1saW1pdCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IElzU21vb3RoKGNvbnN0IHVpbnQzMl90KiBjb25zdCBwcmV2X3JvdywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGN1cnJfcm93LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgbmV4dF9yb3csCisgICAgICAgICAgICAgICAgICAgIGludCBpeCwgaW50IGxpbWl0KSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIHBpeGVscyBpbiA0LWNvbm5lY3RlZCBuZWlnaGJvcmhvb2QgYXJlIHNtb290aC4KKyAgcmV0dXJuIChJc05lYXIoY3Vycl9yb3dbaXhdLCBjdXJyX3Jvd1tpeCAtIDFdLCBsaW1pdCkgJiYKKyAgICAgICAgICBJc05lYXIoY3Vycl9yb3dbaXhdLCBjdXJyX3Jvd1tpeCArIDFdLCBsaW1pdCkgJiYKKyAgICAgICAgICBJc05lYXIoY3Vycl9yb3dbaXhdLCBwcmV2X3Jvd1tpeF0sIGxpbWl0KSAmJgorICAgICAgICAgIElzTmVhcihjdXJyX3Jvd1tpeF0sIG5leHRfcm93W2l4XSwgbGltaXQpKTsKK30KKworLy8gQWRqdXN0cyBwaXhlbCB2YWx1ZXMgb2YgaW1hZ2Ugd2l0aCBnaXZlbiBtYXhpbXVtIGVycm9yLgorc3RhdGljIHZvaWQgTmVhckxvc3NsZXNzKGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogYXJnYl9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGxpbWl0X2JpdHMsIHVpbnQzMl90KiBjb3B5X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYl9kc3QpIHsKKyAgaW50IHgsIHk7CisgIGNvbnN0IGludCBsaW1pdCA9IDEgPDwgbGltaXRfYml0czsKKyAgdWludDMyX3QqIHByZXZfcm93ID0gY29weV9idWZmZXI7CisgIHVpbnQzMl90KiBjdXJyX3JvdyA9IHByZXZfcm93ICsgeHNpemU7CisgIHVpbnQzMl90KiBuZXh0X3JvdyA9IGN1cnJfcm93ICsgeHNpemU7CisgIG1lbWNweShjdXJyX3JvdywgYXJnYl9zcmMsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisgIG1lbWNweShuZXh0X3JvdywgYXJnYl9zcmMgKyBzdHJpZGUsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisKKyAgZm9yICh5ID0gMDsgeSA8IHlzaXplOyArK3ksIGFyZ2Jfc3JjICs9IHN0cmlkZSwgYXJnYl9kc3QgKz0geHNpemUpIHsKKyAgICBpZiAoeSA9PSAwIHx8IHkgPT0geXNpemUgLSAxKSB7CisgICAgICBtZW1jcHkoYXJnYl9kc3QsIGFyZ2Jfc3JjLCB4c2l6ZSAqIHNpemVvZihhcmdiX3NyY1swXSkpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkobmV4dF9yb3csIGFyZ2Jfc3JjICsgc3RyaWRlLCB4c2l6ZSAqIHNpemVvZihhcmdiX3NyY1swXSkpOworICAgICAgYXJnYl9kc3RbMF0gPSBhcmdiX3NyY1swXTsKKyAgICAgIGFyZ2JfZHN0W3hzaXplIC0gMV0gPSBhcmdiX3NyY1t4c2l6ZSAtIDFdOworICAgICAgZm9yICh4ID0gMTsgeCA8IHhzaXplIC0gMTsgKyt4KSB7CisgICAgICAgIGlmIChJc1Ntb290aChwcmV2X3JvdywgY3Vycl9yb3csIG5leHRfcm93LCB4LCBsaW1pdCkpIHsKKyAgICAgICAgICBhcmdiX2RzdFt4XSA9IGN1cnJfcm93W3hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFyZ2JfZHN0W3hdID0gQ2xvc2VzdERpc2NyZXRpemVkQXJnYihjdXJyX3Jvd1t4XSwgbGltaXRfYml0cyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgLy8gVGhyZWUtd2F5IHN3YXAuCisgICAgICB1aW50MzJfdCogY29uc3QgdGVtcCA9IHByZXZfcm93OworICAgICAgcHJldl9yb3cgPSBjdXJyX3JvdzsKKyAgICAgIGN1cnJfcm93ID0gbmV4dF9yb3c7CisgICAgICBuZXh0X3JvdyA9IHRlbXA7CisgICAgfQorICB9Cit9CisKK2ludCBWUDhBcHBseU5lYXJMb3NzbGVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2JfZHN0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgeHNpemUgPSBwaWN0dXJlLT53aWR0aDsKKyAgY29uc3QgaW50IHlzaXplID0gcGljdHVyZS0+aGVpZ2h0OworICBjb25zdCBpbnQgc3RyaWRlID0gcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgIHVpbnQzMl90KiBjb25zdCBjb3B5X2J1ZmZlciA9CisgICAgICAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHhzaXplICogMywgc2l6ZW9mKCpjb3B5X2J1ZmZlcikpOworICBjb25zdCBpbnQgbGltaXRfYml0cyA9IFZQOExOZWFyTG9zc2xlc3NCaXRzKHF1YWxpdHkpOworICBhc3NlcnQoYXJnYl9kc3QgIT0gTlVMTCk7CisgIGFzc2VydChsaW1pdF9iaXRzID4gMCk7CisgIGFzc2VydChsaW1pdF9iaXRzIDw9IE1BWF9MSU1JVF9CSVRTKTsKKyAgaWYgKGNvcHlfYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBGb3Igc21hbGwgaWNvbiBpbWFnZXMsIGRvbid0IGF0dGVtcHQgdG8gYXBwbHkgbmVhci1sb3NzbGVzcyBjb21wcmVzc2lvbi4KKyAgaWYgKCh4c2l6ZSA8IE1JTl9ESU1fRk9SX05FQVJfTE9TU0xFU1MgJiYKKyAgICAgICB5c2l6ZSA8IE1JTl9ESU1fRk9SX05FQVJfTE9TU0xFU1MpIHx8CisgICAgICB5c2l6ZSA8IDMpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgeXNpemU7ICsraSkgeworICAgICAgbWVtY3B5KGFyZ2JfZHN0ICsgaSAqIHhzaXplLCBwaWN0dXJlLT5hcmdiICsgaSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgIHhzaXplICogc2l6ZW9mKCphcmdiX2RzdCkpOworICAgIH0KKyAgICBXZWJQU2FmZUZyZWUoY29weV9idWZmZXIpOworICAgIHJldHVybiAxOworICB9CisKKyAgTmVhckxvc3NsZXNzKHhzaXplLCB5c2l6ZSwgcGljdHVyZS0+YXJnYiwgc3RyaWRlLCBsaW1pdF9iaXRzLCBjb3B5X2J1ZmZlciwKKyAgICAgICAgICAgICAgIGFyZ2JfZHN0KTsKKyAgZm9yIChpID0gbGltaXRfYml0cyAtIDE7IGkgIT0gMDsgLS1pKSB7CisgICAgTmVhckxvc3NsZXNzKHhzaXplLCB5c2l6ZSwgYXJnYl9kc3QsIHhzaXplLCBpLCBjb3B5X2J1ZmZlciwgYXJnYl9kc3QpOworICB9CisgIFdlYlBTYWZlRnJlZShjb3B5X2J1ZmZlcik7CisgIHJldHVybiAxOworfQorI2Vsc2UgIC8vIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKworLy8gRGVmaW5lIGEgc3R1YiB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5ncy4KK2V4dGVybiB2b2lkIFZQOExOZWFyTG9zc2xlc3NTdHViKHZvaWQpOwordm9pZCBWUDhMTmVhckxvc3NsZXNzU3R1Yih2b2lkKSB7fQorCisjZW5kaWYgIC8vIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfY3NwX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTQ2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfY3NwX2VuYy5jCkBAIC0wLDAgKzEsMTIxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHV0aWxzIGZvciBjb2xvcnNwYWNlIGNvbnZlcnNpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworLy8gVW5jb21tZW50IHRvIGRpc2FibGUgZ2FtbWEtY29tcHJlc3Npb24gZHVyaW5nIFJHQi0+VS9WIGF2ZXJhZ2luZworI2RlZmluZSBVU0VfR0FNTUFfQ09NUFJFU1NJT04KKworLy8gSWYgZGVmaW5lZCwgdXNlIHRhYmxlIHRvIGNvbXB1dGUgeCAvIGFscGhhLgorI2RlZmluZSBVU0VfSU5WRVJTRV9BTFBIQV9UQUJMRQorCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIEFMUEhBX09GRlNFVCAwICAgLy8gdWludDMyX3QgMHhmZjAwMDAwMCBpcyAweGZmLDAwLDAwLDAwIGluIG1lbW9yeQorI2Vsc2UKKyNkZWZpbmUgQUxQSEFfT0ZGU0VUIDMgICAvLyB1aW50MzJfdCAweGZmMDAwMDAwIGlzIDB4MDAsMDAsMDAsZmYgaW4gbWVtb3J5CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERldGVjdGlvbiBvZiBub24tdHJpdmlhbCB0cmFuc3BhcmVuY3kKKworLy8gUmV0dXJucyB0cnVlIGlmIGFscGhhW10gaGFzIG5vbi0weGZmIHZhbHVlcy4KK3N0YXRpYyBpbnQgQ2hlY2tOb25PcGFxdWUoY29uc3QgdWludDhfdCogYWxwaGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc3RlcCwgaW50IHlfc3RlcCkgeworICBpZiAoYWxwaGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgIGlmICh4X3N0ZXAgPT0gMSkgeworICAgIGZvciAoOyBoZWlnaHQtLSA+IDA7IGFscGhhICs9IHlfc3RlcCkgeworICAgICAgaWYgKFdlYlBIYXNBbHBoYThiKGFscGhhLCB3aWR0aCkpIHJldHVybiAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKDsgaGVpZ2h0LS0gPiAwOyBhbHBoYSArPSB5X3N0ZXApIHsKKyAgICAgIGlmIChXZWJQSGFzQWxwaGEzMmIoYWxwaGEsIHdpZHRoKSkgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLyBDaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIG5vbi1vcGFxdWUgYWxwaGEuCitpbnQgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUocGljdHVyZS0+YSwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgcGljdHVyZS0+YV9zdHJpZGUpOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBhbHBoYV9vZmZzZXQgPSBBTFBIQV9PRkZTRVQ7CisgICAgcmV0dXJuIENoZWNrTm9uT3BhcXVlKChjb25zdCB1aW50OF90KilwaWN0dXJlLT5hcmdiICsgYWxwaGFfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICA0LCBwaWN0dXJlLT5hcmdiX3N0cmlkZSAqIHNpemVvZigqcGljdHVyZS0+YXJnYikpOworICB9CisgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3IgZ2FtbWEgY29ycmVjdGlvbgorCisjaWYgZGVmaW5lZChVU0VfR0FNTUFfQ09NUFJFU1NJT04pCisKKy8vIGdhbW1hLWNvbXBlbnNhdGVzIGxvc3Mgb2YgcmVzb2x1dGlvbiBkdXJpbmcgY2hyb21hIHN1YnNhbXBsaW5nCisjZGVmaW5lIGtHYW1tYSAwLjgwICAgICAgLy8gZm9yIG5vdyB3ZSB1c2UgYSBkaWZmZXJlbnQgZ2FtbWEgdmFsdWUgdGhhbiBrR2FtbWFGCisjZGVmaW5lIGtHYW1tYUZpeCAxMiAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBsaW5lYXIgdmFsdWVzCisjZGVmaW5lIGtHYW1tYVNjYWxlICgoMSA8PCBrR2FtbWFGaXgpIC0gMSkKKyNkZWZpbmUga0dhbW1hVGFiRml4IDcgICAvLyBmaXhlZC1wb2ludCBmcmFjdGlvbmFsIGJpdHMgcHJlY2lzaW9uCisjZGVmaW5lIGtHYW1tYVRhYlNjYWxlICgxIDw8IGtHYW1tYVRhYkZpeCkKKyNkZWZpbmUga0dhbW1hVGFiUm91bmRlciAoa0dhbW1hVGFiU2NhbGUgPj4gMSkKKyNkZWZpbmUga0dhbW1hVGFiU2l6ZSAoMSA8PCAoa0dhbW1hRml4IC0ga0dhbW1hVGFiRml4KSkKKworc3RhdGljIGludCBrTGluZWFyVG9HYW1tYVRhYltrR2FtbWFUYWJTaXplICsgMV07CitzdGF0aWMgdWludDE2X3Qga0dhbW1hVG9MaW5lYXJUYWJbMjU2XTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQga0dhbW1hVGFibGVzT2sgPSAwOworCitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRHYW1tYVRhYmxlcyh2b2lkKSB7CisgIGlmICgha0dhbW1hVGFibGVzT2spIHsKKyAgICBpbnQgdjsKKyAgICBjb25zdCBkb3VibGUgc2NhbGUgPSAoZG91YmxlKSgxIDw8IGtHYW1tYVRhYkZpeCkgLyBrR2FtbWFTY2FsZTsKKyAgICBjb25zdCBkb3VibGUgbm9ybSA9IDEuIC8gMjU1LjsKKyAgICBmb3IgKHYgPSAwOyB2IDw9IDI1NTsgKyt2KSB7CisgICAgICBrR2FtbWFUb0xpbmVhclRhYlt2XSA9CisgICAgICAgICAgKHVpbnQxNl90KShwb3cobm9ybSAqIHYsIGtHYW1tYSkgKiBrR2FtbWFTY2FsZSArIC41KTsKKyAgICB9CisgICAgZm9yICh2ID0gMDsgdiA8PSBrR2FtbWFUYWJTaXplOyArK3YpIHsKKyAgICAgIGtMaW5lYXJUb0dhbW1hVGFiW3ZdID0gKGludCkoMjU1LiAqIHBvdyhzY2FsZSAqIHYsIDEuIC8ga0dhbW1hKSArIC41KTsKKyAgICB9CisgICAga0dhbW1hVGFibGVzT2sgPSAxOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHYW1tYVRvTGluZWFyKHVpbnQ4X3QgdikgeworICByZXR1cm4ga0dhbW1hVG9MaW5lYXJUYWJbdl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgSW50ZXJwb2xhdGUoaW50IHYpIHsKKyAgY29uc3QgaW50IHRhYl9wb3MgPSB2ID4+IChrR2FtbWFUYWJGaXggKyAyKTsgICAgLy8gaW50ZWdlciBwYXJ0CisgIGNvbnN0IGludCB4ID0gdiAmICgoa0dhbW1hVGFiU2NhbGUgPDwgMikgLSAxKTsgIC8vIGZyYWN0aW9uYWwgcGFydAorICBjb25zdCBpbnQgdjAgPSBrTGluZWFyVG9HYW1tYVRhYlt0YWJfcG9zXTsKKyAgY29uc3QgaW50IHYxID0ga0xpbmVhclRvR2FtbWFUYWJbdGFiX3BvcyArIDFdOworICBjb25zdCBpbnQgeSA9IHYxICogeCArIHYwICogKChrR2FtbWFUYWJTY2FsZSA8PCAyKSAtIHgpOyAgIC8vIGludGVycG9sYXRlCisgIGFzc2VydCh0YWJfcG9zICsgMSA8IGtHYW1tYVRhYlNpemUgKyAxKTsKKyAgcmV0dXJuIHk7Cit9CisKKy8vIENvbnZlcnQgYSBsaW5lYXIgdmFsdWUgJ3YnIHRvIFlVVl9GSVgrMiBmaXhlZC1wb2ludCBwcmVjaXNpb24KKy8vIFUvViB2YWx1ZSwgc3VpdGFibGUgZm9yIFJHQlRvVS9WIGNhbGxzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBMaW5lYXJUb0dhbW1hKHVpbnQzMl90IGJhc2VfdmFsdWUsIGludCBzaGlmdCkgeworICBjb25zdCBpbnQgeSA9IEludGVycG9sYXRlKGJhc2VfdmFsdWUgPDwgc2hpZnQpOyAgIC8vIGZpbmFsIHVwbGlmdGVkIHZhbHVlCisgIHJldHVybiAoeSArIGtHYW1tYVRhYlJvdW5kZXIpID4+IGtHYW1tYVRhYkZpeDsgICAgLy8gZGVzY2FsZQorfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBJbml0R2FtbWFUYWJsZXModm9pZCkge30KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHYW1tYVRvTGluZWFyKHVpbnQ4X3QgdikgeyByZXR1cm4gdjsgfQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBMaW5lYXJUb0dhbW1hKHVpbnQzMl90IGJhc2VfdmFsdWUsIGludCBzaGlmdCkgeworICByZXR1cm4gKGludCkoYmFzZV92YWx1ZSA8PCBzaGlmdCk7Cit9CisKKyNlbmRpZiAgICAvLyBVU0VfR0FNTUFfQ09NUFJFU1NJT04KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgorCitzdGF0aWMgaW50IFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1kociwgZywgYiwgWVVWX0hBTEYpCisgICAgICAgICAgICAgICAgICAgICAgOiBWUDhSR0JUb1kociwgZywgYiwgVlA4UmFuZG9tQml0cyhyZywgWVVWX0ZJWCkpOworfQorCitzdGF0aWMgaW50IFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvVShyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYICsgMikpOworfQorCitzdGF0aWMgaW50IFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvVihyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYICsgMikpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2hhcnAgUkdCLT5ZVVYgY29udmVyc2lvbgorCitzdGF0aWMgY29uc3QgaW50IGtOdW1JdGVyYXRpb25zID0gNDsKK3N0YXRpYyBjb25zdCBpbnQga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24gPSA0OworCisvLyBXZSBjb3VsZCB1c2UgU0ZJWD0wIGFuZCBvbmx5IHVpbnQ4X3QgZm9yIGZpeGVkX3lfdCwgYnV0IGl0IHByb2R1Y2VzIHNvbWUKKy8vIGJhbmRpbmcgc29tZXRpbWVzLiBCZXR0ZXIgdXNlIGV4dHJhIHByZWNpc2lvbi4KKyNkZWZpbmUgU0ZJWCAyICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBvZiBSR0IgYW5kIFkvVwordHlwZWRlZiBpbnQxNl90IGZpeGVkX3Q7ICAgICAgLy8gc2lnbmVkIHR5cGUgd2l0aCBleHRyYSBTRklYIHByZWNpc2lvbiBmb3IgVVYKK3R5cGVkZWYgdWludDE2X3QgZml4ZWRfeV90OyAgIC8vIHVuc2lnbmVkIHR5cGUgd2l0aCBleHRyYSBTRklYIHByZWNpc2lvbiBmb3IgVworCisjZGVmaW5lIFNIQUxGICgxIDw8IFNGSVggPj4gMSkKKyNkZWZpbmUgTUFYX1lfVCAoKDI1NiA8PCBTRklYKSAtIDEpCisjZGVmaW5lIFNST1VOREVSICgxIDw8IChZVVZfRklYICsgU0ZJWCAtIDEpKQorCisjaWYgZGVmaW5lZChVU0VfR0FNTUFfQ09NUFJFU1NJT04pCisKKy8vIFdlIHVzZSB0YWJsZXMgb2YgZGlmZmVyZW50IHNpemUgYW5kIHByZWNpc2lvbiBmb3IgdGhlIFJlYzcwOSAvIEJUMjAyMAorLy8gdHJhbnNmZXIgZnVuY3Rpb24uCisjZGVmaW5lIGtHYW1tYUYgKDEuLzAuNDUpCitzdGF0aWMgdWludDMyX3Qga0xpbmVhclRvR2FtbWFUYWJTW2tHYW1tYVRhYlNpemUgKyAyXTsKKyNkZWZpbmUgR0FNTUFfVE9fTElORUFSX0JJVFMgMTQKK3N0YXRpYyB1aW50MzJfdCBrR2FtbWFUb0xpbmVhclRhYlNbTUFYX1lfVCArIDFdOyAgIC8vIHNpemUgc2NhbGVzIHdpdGggWV9GSVgKK3N0YXRpYyB2b2xhdGlsZSBpbnQga0dhbW1hVGFibGVzU09rID0gMDsKKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2FtbWFUYWJsZXNTKHZvaWQpIHsKKyAgYXNzZXJ0KDIgKiBHQU1NQV9UT19MSU5FQVJfQklUUyA8IDMyKTsgIC8vIHdlIHVzZSB1aW50MzJfdCBpbnRlcm1lZGlhdGUgdmFsdWVzCisgIGlmICgha0dhbW1hVGFibGVzU09rKSB7CisgICAgaW50IHY7CisgICAgY29uc3QgZG91YmxlIG5vcm0gPSAxLiAvIE1BWF9ZX1Q7CisgICAgY29uc3QgZG91YmxlIHNjYWxlID0gMS4gLyBrR2FtbWFUYWJTaXplOworICAgIGNvbnN0IGRvdWJsZSBhID0gMC4wOTkyOTY4MjY4MDk0NDsKKyAgICBjb25zdCBkb3VibGUgdGhyZXNoID0gMC4wMTgwNTM5Njg1MTA4MDc7CisgICAgY29uc3QgZG91YmxlIGZpbmFsX3NjYWxlID0gMSA8PCBHQU1NQV9UT19MSU5FQVJfQklUUzsKKyAgICBmb3IgKHYgPSAwOyB2IDw9IE1BWF9ZX1Q7ICsrdikgeworICAgICAgY29uc3QgZG91YmxlIGcgPSBub3JtICogdjsKKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIGlmIChnIDw9IHRocmVzaCAqIDQuNSkgeworICAgICAgICB2YWx1ZSA9IGcgLyA0LjU7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBkb3VibGUgYV9yZWMgPSAxLiAvICgxLiArIGEpOworICAgICAgICB2YWx1ZSA9IHBvdyhhX3JlYyAqIChnICsgYSksIGtHYW1tYUYpOworICAgICAgfQorICAgICAga0dhbW1hVG9MaW5lYXJUYWJTW3ZdID0gKHVpbnQzMl90KSh2YWx1ZSAqIGZpbmFsX3NjYWxlICsgLjUpOworICAgIH0KKyAgICBmb3IgKHYgPSAwOyB2IDw9IGtHYW1tYVRhYlNpemU7ICsrdikgeworICAgICAgY29uc3QgZG91YmxlIGcgPSBzY2FsZSAqIHY7CisgICAgICBkb3VibGUgdmFsdWU7CisgICAgICBpZiAoZyA8PSB0aHJlc2gpIHsKKyAgICAgICAgdmFsdWUgPSA0LjUgKiBnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSAoMS4gKyBhKSAqIHBvdyhnLCAxLiAvIGtHYW1tYUYpIC0gYTsKKyAgICAgIH0KKyAgICAgIC8vIHdlIGFscmVhZHkgaW5jb3Jwb3JhdGUgdGhlIDEvMiByb3VuZGluZyBjb25zdGFudCBoZXJlCisgICAgICBrTGluZWFyVG9HYW1tYVRhYlNbdl0gPQorICAgICAgICAgICh1aW50MzJfdCkoTUFYX1lfVCAqIHZhbHVlKSArICgxIDw8IEdBTU1BX1RPX0xJTkVBUl9CSVRTID4+IDEpOworICAgIH0KKyAgICAvLyB0byBwcmV2ZW50IHNtYWxsIHJvdW5kaW5nIGVycm9ycyB0byBjYXVzZSByZWFkLW92ZXJmbG93OgorICAgIGtMaW5lYXJUb0dhbW1hVGFiU1trR2FtbWFUYWJTaXplICsgMV0gPSBrTGluZWFyVG9HYW1tYVRhYlNba0dhbW1hVGFiU2l6ZV07CisgICAga0dhbW1hVGFibGVzU09rID0gMTsKKyAgfQorfQorCisvLyByZXR1cm4gdmFsdWUgaGFzIGEgZml4ZWQtcG9pbnQgcHJlY2lzaW9uIG9mIEdBTU1BX1RPX0xJTkVBUl9CSVRTCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2FtbWFUb0xpbmVhclMoaW50IHYpIHsKKyAgcmV0dXJuIGtHYW1tYVRvTGluZWFyVGFiU1t2XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IExpbmVhclRvR2FtbWFTKHVpbnQzMl90IHZhbHVlKSB7CisgIC8vICd2YWx1ZScgaXMgaW4gR0FNTUFfVE9fTElORUFSX0JJVFMgZnJhY3Rpb25hbCBwcmVjaXNpb24KKyAgY29uc3QgdWludDMyX3QgdiA9IHZhbHVlICoga0dhbW1hVGFiU2l6ZTsKKyAgY29uc3QgdWludDMyX3QgdGFiX3BvcyA9IHYgPj4gR0FNTUFfVE9fTElORUFSX0JJVFM7CisgIC8vIGZyYWN0aW9uYWwgcGFydCwgaW4gR0FNTUFfVE9fTElORUFSX0JJVFMgZml4ZWQtcG9pbnQgcHJlY2lzaW9uCisgIGNvbnN0IHVpbnQzMl90IHggPSB2IC0gKHRhYl9wb3MgPDwgR0FNTUFfVE9fTElORUFSX0JJVFMpOyAgLy8gZnJhY3Rpb25hbCBwYXJ0CisgIC8vIHYwIC8gdjEgYXJlIGluIEdBTU1BX1RPX0xJTkVBUl9CSVRTIGZpeGVkLXBvaW50IHByZWNpc2lvbiAocmFuZ2UgWzAuLjFdKQorICBjb25zdCB1aW50MzJfdCB2MCA9IGtMaW5lYXJUb0dhbW1hVGFiU1t0YWJfcG9zICsgMF07CisgIGNvbnN0IHVpbnQzMl90IHYxID0ga0xpbmVhclRvR2FtbWFUYWJTW3RhYl9wb3MgKyAxXTsKKyAgLy8gRmluYWwgaW50ZXJwb2xhdGlvbi4gTm90ZSB0aGF0IHJvdW5kaW5nIGlzIGFscmVhZHkgaW5jbHVkZWQuCisgIGNvbnN0IHVpbnQzMl90IHYyID0gKHYxIC0gdjApICogeDsgICAgLy8gbm90ZTogdjEgPj0gdjAuCisgIGNvbnN0IHVpbnQzMl90IHJlc3VsdCA9IHYwICsgKHYyID4+IEdBTU1BX1RPX0xJTkVBUl9CSVRTKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgSW5pdEdhbW1hVGFibGVzUyh2b2lkKSB7fQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdhbW1hVG9MaW5lYXJTKGludCB2KSB7CisgIHJldHVybiAodiA8PCBHQU1NQV9UT19MSU5FQVJfQklUUykgLyBNQVhfWV9UOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IExpbmVhclRvR2FtbWFTKHVpbnQzMl90IHZhbHVlKSB7CisgIHJldHVybiAoTUFYX1lfVCAqIHZhbHVlKSA+PiBHQU1NQV9UT19MSU5FQVJfQklUUzsKK30KKworI2VuZGlmICAgIC8vIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdWludDhfdCBjbGlwXzhiKGZpeGVkX3QgdikgeworICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyAodWludDhfdCl2IDogKHYgPCAwKSA/IDB1IDogMjU1dTsKK30KKworc3RhdGljIGZpeGVkX3lfdCBjbGlwX3koaW50IHkpIHsKKyAgcmV0dXJuICghKHkgJiB+TUFYX1lfVCkpID8gKGZpeGVkX3lfdCl5IDogKHkgPCAwKSA/IDAgOiBNQVhfWV9UOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFJHQlRvR3JheShpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCBsdW1hID0gMTM5MzMgKiByICsgNDY4NzEgKiBnICsgNDczMiAqIGIgKyBZVVZfSEFMRjsKKyAgcmV0dXJuIChsdW1hID4+IFlVVl9GSVgpOworfQorCitzdGF0aWMgdWludDMyX3QgU2NhbGVEb3duKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CisgIGNvbnN0IHVpbnQzMl90IEEgPSBHYW1tYVRvTGluZWFyUyhhKTsKKyAgY29uc3QgdWludDMyX3QgQiA9IEdhbW1hVG9MaW5lYXJTKGIpOworICBjb25zdCB1aW50MzJfdCBDID0gR2FtbWFUb0xpbmVhclMoYyk7CisgIGNvbnN0IHVpbnQzMl90IEQgPSBHYW1tYVRvTGluZWFyUyhkKTsKKyAgcmV0dXJuIExpbmVhclRvR2FtbWFTKChBICsgQiArIEMgKyBEICsgMikgPj4gMik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZVcoY29uc3QgZml4ZWRfeV90KiBzcmMsIGZpeGVkX3lfdCogZHN0LCBpbnQgdykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IFIgPSBHYW1tYVRvTGluZWFyUyhzcmNbMCAqIHcgKyBpXSk7CisgICAgY29uc3QgdWludDMyX3QgRyA9IEdhbW1hVG9MaW5lYXJTKHNyY1sxICogdyArIGldKTsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gR2FtbWFUb0xpbmVhclMoc3JjWzIgKiB3ICsgaV0pOworICAgIGNvbnN0IHVpbnQzMl90IFkgPSBSR0JUb0dyYXkoUiwgRywgQik7CisgICAgZHN0W2ldID0gKGZpeGVkX3lfdClMaW5lYXJUb0dhbW1hUyhZKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBVcGRhdGVDaHJvbWEoY29uc3QgZml4ZWRfeV90KiBzcmMxLCBjb25zdCBmaXhlZF95X3QqIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdCogZHN0LCBpbnQgdXZfdykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHV2X3c7ICsraSkgeworICAgIGNvbnN0IGludCByID0gU2NhbGVEb3duKHNyYzFbMCAqIHV2X3cgKyAwXSwgc3JjMVswICogdXZfdyArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbMCAqIHV2X3cgKyAwXSwgc3JjMlswICogdXZfdyArIDFdKTsKKyAgICBjb25zdCBpbnQgZyA9IFNjYWxlRG93bihzcmMxWzIgKiB1dl93ICsgMF0sIHNyYzFbMiAqIHV2X3cgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyWzIgKiB1dl93ICsgMF0sIHNyYzJbMiAqIHV2X3cgKyAxXSk7CisgICAgY29uc3QgaW50IGIgPSBTY2FsZURvd24oc3JjMVs0ICogdXZfdyArIDBdLCBzcmMxWzQgKiB1dl93ICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMls0ICogdXZfdyArIDBdLCBzcmMyWzQgKiB1dl93ICsgMV0pOworICAgIGNvbnN0IGludCBXID0gUkdCVG9HcmF5KHIsIGcsIGIpOworICAgIGRzdFswICogdXZfd10gPSAoZml4ZWRfdCkociAtIFcpOworICAgIGRzdFsxICogdXZfd10gPSAoZml4ZWRfdCkoZyAtIFcpOworICAgIGRzdFsyICogdXZfd10gPSAoZml4ZWRfdCkoYiAtIFcpOworICAgIGRzdCAgKz0gMTsKKyAgICBzcmMxICs9IDI7CisgICAgc3JjMiArPSAyOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlR3JheShjb25zdCBmaXhlZF95X3QqIHJnYiwgZml4ZWRfeV90KiB5LCBpbnQgdykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgIHlbaV0gPSBSR0JUb0dyYXkocmdiWzAgKiB3ICsgaV0sIHJnYlsxICogdyArIGldLCByZ2JbMiAqIHcgKyBpXSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGZpeGVkX3lfdCBGaWx0ZXIyKGludCBBLCBpbnQgQiwgaW50IFcwKSB7CisgIGNvbnN0IGludCB2MCA9IChBICogMyArIEIgKyAyKSA+PiAyOworICByZXR1cm4gY2xpcF95KHYwICsgVzApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZml4ZWRfeV90IFVwTGlmdCh1aW50OF90IGEpIHsgIC8vIDhiaXQgLT4gU0ZJWAorICByZXR1cm4gKChmaXhlZF95X3QpYSA8PCBTRklYKSB8IFNIQUxGOworfQorCitzdGF0aWMgdm9pZCBJbXBvcnRPbmVSb3coY29uc3QgdWludDhfdCogY29uc3Qgcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF95X3QqIGNvbnN0IGRzdCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHcgPSAocGljX3dpZHRoICsgMSkgJiB+MTsKKyAgZm9yIChpID0gMDsgaSA8IHBpY193aWR0aDsgKytpKSB7CisgICAgY29uc3QgaW50IG9mZiA9IGkgKiBzdGVwOworICAgIGRzdFtpICsgMCAqIHddID0gVXBMaWZ0KHJfcHRyW29mZl0pOworICAgIGRzdFtpICsgMSAqIHddID0gVXBMaWZ0KGdfcHRyW29mZl0pOworICAgIGRzdFtpICsgMiAqIHddID0gVXBMaWZ0KGJfcHRyW29mZl0pOworICB9CisgIGlmIChwaWNfd2lkdGggJiAxKSB7ICAvLyByZXBsaWNhdGUgcmlnaHRtb3N0IHBpeGVsCisgICAgZHN0W3BpY193aWR0aCArIDAgKiB3XSA9IGRzdFtwaWNfd2lkdGggKyAwICogdyAtIDFdOworICAgIGRzdFtwaWNfd2lkdGggKyAxICogd10gPSBkc3RbcGljX3dpZHRoICsgMSAqIHcgLSAxXTsKKyAgICBkc3RbcGljX3dpZHRoICsgMiAqIHddID0gZHN0W3BpY193aWR0aCArIDIgKiB3IC0gMV07CisgIH0KK30KKworc3RhdGljIHZvaWQgSW50ZXJwb2xhdGVUd29Sb3dzKGNvbnN0IGZpeGVkX3lfdCogY29uc3QgYmVzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeGVkX3QqIHByZXZfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogY3VyX3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeGVkX3QqIG5leHRfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfeV90KiBvdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3lfdCogb3V0MikgeworICBjb25zdCBpbnQgdXZfdyA9IHcgPj4gMTsKKyAgY29uc3QgaW50IGxlbiA9ICh3IC0gMSkgPj4gMTsgICAvLyBsZW5ndGggdG8gZmlsdGVyCisgIGludCBrID0gMzsKKyAgd2hpbGUgKGstLSA+IDApIHsgICAvLyBwcm9jZXNzIGVhY2ggUi9HL0Igc2VnbWVudHMgaW4gdHVybgorICAgIC8vIHNwZWNpYWwgYm91bmRhcnkgY2FzZSBmb3IgaT09MAorICAgIG91dDFbMF0gPSBGaWx0ZXIyKGN1cl91dlswXSwgcHJldl91dlswXSwgYmVzdF95WzBdKTsKKyAgICBvdXQyWzBdID0gRmlsdGVyMihjdXJfdXZbMF0sIG5leHRfdXZbMF0sIGJlc3RfeVt3XSk7CisKKyAgICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3coY3VyX3V2LCBwcmV2X3V2LCBsZW4sIGJlc3RfeSArIDAgKyAxLCBvdXQxICsgMSk7CisgICAgV2ViUFNoYXJwWVVWRmlsdGVyUm93KGN1cl91diwgbmV4dF91diwgbGVuLCBiZXN0X3kgKyB3ICsgMSwgb3V0MiArIDEpOworCisgICAgLy8gc3BlY2lhbCBib3VuZGFyeSBjYXNlIGZvciBpID09IHcgLSAxIHdoZW4gdyBpcyBldmVuCisgICAgaWYgKCEodyAmIDEpKSB7CisgICAgICBvdXQxW3cgLSAxXSA9IEZpbHRlcjIoY3VyX3V2W3V2X3cgLSAxXSwgcHJldl91dlt1dl93IC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF95W3cgLSAxICsgMF0pOworICAgICAgb3V0Mlt3IC0gMV0gPSBGaWx0ZXIyKGN1cl91dlt1dl93IC0gMV0sIG5leHRfdXZbdXZfdyAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfeVt3IC0gMSArIHddKTsKKyAgICB9CisgICAgb3V0MSArPSB3OworICAgIG91dDIgKz0gdzsKKyAgICBwcmV2X3V2ICs9IHV2X3c7CisgICAgY3VyX3V2ICArPSB1dl93OworICAgIG5leHRfdXYgKz0gdXZfdzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBDb252ZXJ0UkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IGx1bWEgPSAxNjgzOSAqIHIgKyAzMzA1OSAqIGcgKyA2NDIwICogYiArIFNST1VOREVSOworICByZXR1cm4gY2xpcF84YigxNiArIChsdW1hID4+IChZVVZfRklYICsgU0ZJWCkpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgQ29udmVydFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCB1ID0gIC05NzE5ICogciAtIDE5MDgxICogZyArIDI4ODAwICogYiArIFNST1VOREVSOworICByZXR1cm4gY2xpcF84YigxMjggKyAodSA+PiAoWVVWX0ZJWCArIFNGSVgpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IENvbnZlcnRSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYikgeworICBjb25zdCBpbnQgdiA9ICsyODgwMCAqIHIgLSAyNDExNiAqIGcgLSAgNDY4NCAqIGIgKyBTUk9VTkRFUjsKKyAgcmV0dXJuIGNsaXBfOGIoMTI4ICsgKHYgPj4gKFlVVl9GSVggKyBTRklYKSkpOworfQorCitzdGF0aWMgaW50IENvbnZlcnRXUkdCVG9ZVVYoY29uc3QgZml4ZWRfeV90KiBiZXN0X3ksIGNvbnN0IGZpeGVkX3QqIGJlc3RfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IGksIGo7CisgIHVpbnQ4X3QqIGRzdF95ID0gcGljdHVyZS0+eTsKKyAgdWludDhfdCogZHN0X3UgPSBwaWN0dXJlLT51OworICB1aW50OF90KiBkc3RfdiA9IHBpY3R1cmUtPnY7CisgIGNvbnN0IGZpeGVkX3QqIGNvbnN0IGJlc3RfdXZfYmFzZSA9IGJlc3RfdXY7CisgIGNvbnN0IGludCB3ID0gKHBpY3R1cmUtPndpZHRoICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IGggPSAocGljdHVyZS0+aGVpZ2h0ICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IHV2X3cgPSB3ID4+IDE7CisgIGNvbnN0IGludCB1dl9oID0gaCA+PiAxOworICBmb3IgKGJlc3RfdXYgPSBiZXN0X3V2X2Jhc2UsIGogPSAwOyBqIDwgcGljdHVyZS0+aGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljdHVyZS0+d2lkdGg7ICsraSkgeworICAgICAgY29uc3QgaW50IG9mZiA9IChpID4+IDEpOworICAgICAgY29uc3QgaW50IFcgPSBiZXN0X3lbaV07CisgICAgICBjb25zdCBpbnQgciA9IGJlc3RfdXZbb2ZmICsgMCAqIHV2X3ddICsgVzsKKyAgICAgIGNvbnN0IGludCBnID0gYmVzdF91dltvZmYgKyAxICogdXZfd10gKyBXOworICAgICAgY29uc3QgaW50IGIgPSBiZXN0X3V2W29mZiArIDIgKiB1dl93XSArIFc7CisgICAgICBkc3RfeVtpXSA9IENvbnZlcnRSR0JUb1kociwgZywgYik7CisgICAgfQorICAgIGJlc3RfeSArPSB3OworICAgIGJlc3RfdXYgKz0gKGogJiAxKSAqIDMgKiB1dl93OworICAgIGRzdF95ICs9IHBpY3R1cmUtPnlfc3RyaWRlOworICB9CisgIGZvciAoYmVzdF91diA9IGJlc3RfdXZfYmFzZSwgaiA9IDA7IGogPCB1dl9oOyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdXZfdzsgKytpKSB7CisgICAgICBjb25zdCBpbnQgb2ZmID0gaTsKKyAgICAgIGNvbnN0IGludCByID0gYmVzdF91dltvZmYgKyAwICogdXZfd107CisgICAgICBjb25zdCBpbnQgZyA9IGJlc3RfdXZbb2ZmICsgMSAqIHV2X3ddOworICAgICAgY29uc3QgaW50IGIgPSBiZXN0X3V2W29mZiArIDIgKiB1dl93XTsKKyAgICAgIGRzdF91W2ldID0gQ29udmVydFJHQlRvVShyLCBnLCBiKTsKKyAgICAgIGRzdF92W2ldID0gQ29udmVydFJHQlRvVihyLCBnLCBiKTsKKyAgICB9CisgICAgYmVzdF91diArPSAzICogdXZfdzsKKyAgICBkc3RfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgZHN0X3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBmdW5jdGlvbgorCisjZGVmaW5lIFNBRkVfQUxMT0MoVywgSCwgVCkgKChUKilXZWJQU2FmZU1hbGxvYygoVykgKiAoSCksIHNpemVvZihUKSkpCisKK3N0YXRpYyBpbnQgUHJlcHJvY2Vzc0FSR0IoY29uc3QgdWludDhfdCogcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICAvLyB3ZSBleHBhbmQgdGhlIHJpZ2h0L2JvdHRvbSBib3JkZXIgaWYgbmVlZGVkCisgIGNvbnN0IGludCB3ID0gKHBpY3R1cmUtPndpZHRoICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IGggPSAocGljdHVyZS0+aGVpZ2h0ICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IHV2X3cgPSB3ID4+IDE7CisgIGNvbnN0IGludCB1dl9oID0gaCA+PiAxOworICB1aW50NjRfdCBwcmV2X2RpZmZfeV9zdW0gPSB+MDsKKyAgaW50IGosIGl0ZXI7CisKKyAgLy8gVE9ETyhza2FsKTogYWxsb2NhdGUgb25lIGJpZyBtZW1vcnkgY2h1bmsuIEJ1dCBmb3Igbm93LCBpdCdzIGVhc2llcgorICAvLyBmb3IgdmFsZ3JpbmQgZGVidWdnaW5nIHRvIGhhdmUgc2V2ZXJhbCBjaHVua3MuCisgIGZpeGVkX3lfdCogY29uc3QgdG1wX2J1ZmZlciA9IFNBRkVfQUxMT0ModyAqIDMsIDIsIGZpeGVkX3lfdCk7ICAgLy8gc2NyYXRjaAorICBmaXhlZF95X3QqIGNvbnN0IGJlc3RfeV9iYXNlID0gU0FGRV9BTExPQyh3LCBoLCBmaXhlZF95X3QpOworICBmaXhlZF95X3QqIGNvbnN0IHRhcmdldF95X2Jhc2UgPSBTQUZFX0FMTE9DKHcsIGgsIGZpeGVkX3lfdCk7CisgIGZpeGVkX3lfdCogY29uc3QgYmVzdF9yZ2JfeSA9IFNBRkVfQUxMT0ModywgMiwgZml4ZWRfeV90KTsKKyAgZml4ZWRfdCogY29uc3QgYmVzdF91dl9iYXNlID0gU0FGRV9BTExPQyh1dl93ICogMywgdXZfaCwgZml4ZWRfdCk7CisgIGZpeGVkX3QqIGNvbnN0IHRhcmdldF91dl9iYXNlID0gU0FGRV9BTExPQyh1dl93ICogMywgdXZfaCwgZml4ZWRfdCk7CisgIGZpeGVkX3QqIGNvbnN0IGJlc3RfcmdiX3V2ID0gU0FGRV9BTExPQyh1dl93ICogMywgMSwgZml4ZWRfdCk7CisgIGZpeGVkX3lfdCogYmVzdF95ID0gYmVzdF95X2Jhc2U7CisgIGZpeGVkX3lfdCogdGFyZ2V0X3kgPSB0YXJnZXRfeV9iYXNlOworICBmaXhlZF90KiBiZXN0X3V2ID0gYmVzdF91dl9iYXNlOworICBmaXhlZF90KiB0YXJnZXRfdXYgPSB0YXJnZXRfdXZfYmFzZTsKKyAgY29uc3QgdWludDY0X3QgZGlmZl95X3RocmVzaG9sZCA9ICh1aW50NjRfdCkoMy4wICogdyAqIGgpOworICBpbnQgb2s7CisKKyAgaWYgKGJlc3RfeV9iYXNlID09IE5VTEwgfHwgYmVzdF91dl9iYXNlID09IE5VTEwgfHwKKyAgICAgIHRhcmdldF95X2Jhc2UgPT0gTlVMTCB8fCB0YXJnZXRfdXZfYmFzZSA9PSBOVUxMIHx8CisgICAgICBiZXN0X3JnYl95ID09IE5VTEwgfHwgYmVzdF9yZ2JfdXYgPT0gTlVMTCB8fAorICAgICAgdG1wX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgb2sgPSBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgIGdvdG8gRW5kOworICB9CisgIGFzc2VydChwaWN0dXJlLT53aWR0aCA+PSBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbik7CisgIGFzc2VydChwaWN0dXJlLT5oZWlnaHQgPj0ga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24pOworCisgIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVigpOworCisgIC8vIEltcG9ydCBSR0Igc2FtcGxlcyB0byBXL1JHQiByZXByZXNlbnRhdGlvbi4KKyAgZm9yIChqID0gMDsgaiA8IHBpY3R1cmUtPmhlaWdodDsgaiArPSAyKSB7CisgICAgY29uc3QgaW50IGlzX2xhc3Rfcm93ID0gKGogPT0gcGljdHVyZS0+aGVpZ2h0IC0gMSk7CisgICAgZml4ZWRfeV90KiBjb25zdCBzcmMxID0gdG1wX2J1ZmZlciArIDAgKiB3OworICAgIGZpeGVkX3lfdCogY29uc3Qgc3JjMiA9IHRtcF9idWZmZXIgKyAzICogdzsKKworICAgIC8vIHByZXBhcmUgdHdvIHJvd3Mgb2YgaW5wdXQKKyAgICBJbXBvcnRPbmVSb3cocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgcGljdHVyZS0+d2lkdGgsIHNyYzEpOworICAgIGlmICghaXNfbGFzdF9yb3cpIHsKKyAgICAgIEltcG9ydE9uZVJvdyhyX3B0ciArIHJnYl9zdHJpZGUsIGdfcHRyICsgcmdiX3N0cmlkZSwgYl9wdHIgKyByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHN0ZXAsIHBpY3R1cmUtPndpZHRoLCBzcmMyKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5KHNyYzIsIHNyYzEsIDMgKiB3ICogc2l6ZW9mKCpzcmMyKSk7CisgICAgfQorICAgIFN0b3JlR3JheShzcmMxLCBiZXN0X3kgKyAwLCB3KTsKKyAgICBTdG9yZUdyYXkoc3JjMiwgYmVzdF95ICsgdywgdyk7CisKKyAgICBVcGRhdGVXKHNyYzEsIHRhcmdldF95LCB3KTsKKyAgICBVcGRhdGVXKHNyYzIsIHRhcmdldF95ICsgdywgdyk7CisgICAgVXBkYXRlQ2hyb21hKHNyYzEsIHNyYzIsIHRhcmdldF91diwgdXZfdyk7CisgICAgbWVtY3B5KGJlc3RfdXYsIHRhcmdldF91diwgMyAqIHV2X3cgKiBzaXplb2YoKmJlc3RfdXYpKTsKKyAgICBiZXN0X3kgKz0gMiAqIHc7CisgICAgYmVzdF91diArPSAzICogdXZfdzsKKyAgICB0YXJnZXRfeSArPSAyICogdzsKKyAgICB0YXJnZXRfdXYgKz0gMyAqIHV2X3c7CisgICAgcl9wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgZ19wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgYl9wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgIH0KKworICAvLyBJdGVyYXRlIGFuZCByZXNvbHZlIGNsaXBwaW5nIGNvbmZsaWN0cy4KKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGtOdW1JdGVyYXRpb25zOyArK2l0ZXIpIHsKKyAgICBjb25zdCBmaXhlZF90KiBjdXJfdXYgPSBiZXN0X3V2X2Jhc2U7CisgICAgY29uc3QgZml4ZWRfdCogcHJldl91diA9IGJlc3RfdXZfYmFzZTsKKyAgICB1aW50NjRfdCBkaWZmX3lfc3VtID0gMDsKKworICAgIGJlc3RfeSA9IGJlc3RfeV9iYXNlOworICAgIGJlc3RfdXYgPSBiZXN0X3V2X2Jhc2U7CisgICAgdGFyZ2V0X3kgPSB0YXJnZXRfeV9iYXNlOworICAgIHRhcmdldF91diA9IHRhcmdldF91dl9iYXNlOworICAgIGZvciAoaiA9IDA7IGogPCBoOyBqICs9IDIpIHsKKyAgICAgIGZpeGVkX3lfdCogY29uc3Qgc3JjMSA9IHRtcF9idWZmZXIgKyAwICogdzsKKyAgICAgIGZpeGVkX3lfdCogY29uc3Qgc3JjMiA9IHRtcF9idWZmZXIgKyAzICogdzsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgZml4ZWRfdCogY29uc3QgbmV4dF91diA9IGN1cl91diArICgoaiA8IGggLSAyKSA/IDMgKiB1dl93IDogMCk7CisgICAgICAgIEludGVycG9sYXRlVHdvUm93cyhiZXN0X3ksIHByZXZfdXYsIGN1cl91diwgbmV4dF91diwgdywgc3JjMSwgc3JjMik7CisgICAgICAgIHByZXZfdXYgPSBjdXJfdXY7CisgICAgICAgIGN1cl91diA9IG5leHRfdXY7CisgICAgICB9CisKKyAgICAgIFVwZGF0ZVcoc3JjMSwgYmVzdF9yZ2JfeSArIDAgKiB3LCB3KTsKKyAgICAgIFVwZGF0ZVcoc3JjMiwgYmVzdF9yZ2JfeSArIDEgKiB3LCB3KTsKKyAgICAgIFVwZGF0ZUNocm9tYShzcmMxLCBzcmMyLCBiZXN0X3JnYl91diwgdXZfdyk7CisKKyAgICAgIC8vIHVwZGF0ZSB0d28gcm93cyBvZiBZIGFuZCBvbmUgcm93IG9mIFJHQgorICAgICAgZGlmZl95X3N1bSArPSBXZWJQU2hhcnBZVVZVcGRhdGVZKHRhcmdldF95LCBiZXN0X3JnYl95LCBiZXN0X3ksIDIgKiB3KTsKKyAgICAgIFdlYlBTaGFycFlVVlVwZGF0ZVJHQih0YXJnZXRfdXYsIGJlc3RfcmdiX3V2LCBiZXN0X3V2LCAzICogdXZfdyk7CisKKyAgICAgIGJlc3RfeSArPSAyICogdzsKKyAgICAgIGJlc3RfdXYgKz0gMyAqIHV2X3c7CisgICAgICB0YXJnZXRfeSArPSAyICogdzsKKyAgICAgIHRhcmdldF91diArPSAzICogdXZfdzsKKyAgICB9CisgICAgLy8gdGVzdCBleGl0IGNvbmRpdGlvbgorICAgIGlmIChpdGVyID4gMCkgeworICAgICAgaWYgKGRpZmZfeV9zdW0gPCBkaWZmX3lfdGhyZXNob2xkKSBicmVhazsKKyAgICAgIGlmIChkaWZmX3lfc3VtID4gcHJldl9kaWZmX3lfc3VtKSBicmVhazsKKyAgICB9CisgICAgcHJldl9kaWZmX3lfc3VtID0gZGlmZl95X3N1bTsKKyAgfQorICAvLyBmaW5hbCByZWNvbnN0cnVjdGlvbgorICBvayA9IENvbnZlcnRXUkdCVG9ZVVYoYmVzdF95X2Jhc2UsIGJlc3RfdXZfYmFzZSwgcGljdHVyZSk7CisKKyBFbmQ6CisgIFdlYlBTYWZlRnJlZShiZXN0X3lfYmFzZSk7CisgIFdlYlBTYWZlRnJlZShiZXN0X3V2X2Jhc2UpOworICBXZWJQU2FmZUZyZWUodGFyZ2V0X3lfYmFzZSk7CisgIFdlYlBTYWZlRnJlZSh0YXJnZXRfdXZfYmFzZSk7CisgIFdlYlBTYWZlRnJlZShiZXN0X3JnYl95KTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfcmdiX3V2KTsKKyAgV2ViUFNhZmVGcmVlKHRtcF9idWZmZXIpOworICByZXR1cm4gb2s7Cit9CisjdW5kZWYgU0FGRV9BTExPQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIkZhc3QiIHJlZ3VsYXIgUkdCLT5ZVVYKKworI2RlZmluZSBTVU00KHB0ciwgc3RlcCkgTGluZWFyVG9HYW1tYSggICAgICAgICAgICAgICAgICAgICBcCisgICAgR2FtbWFUb0xpbmVhcigocHRyKVswXSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpWyhzdGVwKV0pICsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdhbW1hVG9MaW5lYXIoKHB0cilbcmdiX3N0cmlkZV0pICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgR2FtbWFUb0xpbmVhcigocHRyKVtyZ2Jfc3RyaWRlICsgKHN0ZXApXSksIDApICAgICAgICAgIFwKKworI2RlZmluZSBTVU0yKHB0cikgXAorICAgIExpbmVhclRvR2FtbWEoR2FtbWFUb0xpbmVhcigocHRyKVswXSkgKyBHYW1tYVRvTGluZWFyKChwdHIpW3JnYl9zdHJpZGVdKSwgMSkKKworI2RlZmluZSBTVU0yQUxQSEEocHRyKSAoKHB0cilbMF0gKyAocHRyKVtyZ2Jfc3RyaWRlXSkKKyNkZWZpbmUgU1VNNEFMUEhBKHB0cikgKFNVTTJBTFBIQShwdHIpICsgU1VNMkFMUEhBKChwdHIpICsgNCkpCisKKyNpZiBkZWZpbmVkKFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFKQorCitzdGF0aWMgY29uc3QgaW50IGtBbHBoYUZpeCA9IDE5OworLy8gRm9sbG93aW5nIHRhYmxlIGlzICgxIDw8IGtBbHBoYUZpeCkgLyBhLiBUaGUgKHYgKiBrSW52QWxwaGFbYV0pID4+IGtBbHBoYUZpeAorLy8gZm9ybXVsYSBpcyB0aGVuIGVxdWFsIHRvIHYgLyBhIGluIG1vc3QgKDk5LjYlKSBjYXNlcy4gTm90ZSB0aGF0IHRoaXMgdGFibGUKKy8vIGFuZCBjb25zdGFudCBhcmUgYWRqdXN0ZWQgdmVyeSB0aWdodGx5IHRvIGZpdCAzMmIgYXJpdGhtZXRpYy4KKy8vIEluIHBhcnRpY3VsYXIsIHRoZXkgdXNlIHRoZSBmYWN0IHRoYXQgdGhlIG9wZXJhbmRzIGZvciAndiAvIGEnIGFyZSBhY3R1YWxseQorLy8gZGVyaXZlZCBhcyB2ID0gKGEwLnAwICsgYTEucDEgKyBhMi5wMiArIGEzLnAzKSBhbmQgYSA9IGEwICsgYTEgKyBhMiArIGEzCisvLyB3aXRoIGFpIGluIFswLi4yNTVdIGFuZCBwaSBpbiBbMC4uMTw8a0dhbW1hRml4KS4gVGhlIGNvbnN0cmFpbnQgdG8gYXZvaWQKKy8vIG92ZXJmbG93IGlzOiBrR2FtbWFGaXggKyBrQWxwaGFGaXggPD0gMzEuCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0ludkFscGhhWzQgKiAweGZmICsgMV0gPSB7CisgIDAsICAvKiBhbHBoYSA9IDAgKi8KKyAgNTI0Mjg4LCAyNjIxNDQsIDE3NDc2MiwgMTMxMDcyLCAxMDQ4NTcsIDg3MzgxLCA3NDg5OCwgNjU1MzYsCisgIDU4MjU0LCA1MjQyOCwgNDc2NjIsIDQzNjkwLCA0MDMyOSwgMzc0NDksIDM0OTUyLCAzMjc2OCwKKyAgMzA4NDAsIDI5MTI3LCAyNzU5NCwgMjYyMTQsIDI0OTY2LCAyMzgzMSwgMjI3OTUsIDIxODQ1LAorICAyMDk3MSwgMjAxNjQsIDE5NDE4LCAxODcyNCwgMTgwNzgsIDE3NDc2LCAxNjkxMiwgMTYzODQsCisgIDE1ODg3LCAxNTQyMCwgMTQ5NzksIDE0NTYzLCAxNDE2OSwgMTM3OTcsIDEzNDQzLCAxMzEwNywKKyAgMTI3ODcsIDEyNDgzLCAxMjE5MiwgMTE5MTUsIDExNjUwLCAxMTM5NywgMTExNTUsIDEwOTIyLAorICAxMDY5OSwgMTA0ODUsIDEwMjgwLCAxMDA4MiwgOTg5MiwgOTcwOSwgOTUzMiwgOTM2MiwKKyAgOTE5OCwgOTAzOSwgODg4NiwgODczOCwgODU5NCwgODQ1NiwgODMyMiwgODE5MiwKKyAgODA2NSwgNzk0MywgNzgyNSwgNzcxMCwgNzU5OCwgNzQ4OSwgNzM4NCwgNzI4MSwKKyAgNzE4MiwgNzA4NCwgNjk5MCwgNjg5OCwgNjgwOCwgNjcyMSwgNjYzNiwgNjU1MywKKyAgNjQ3MiwgNjM5MywgNjMxNiwgNjI0MSwgNjE2OCwgNjA5NiwgNjAyNiwgNTk1NywKKyAgNTg5MCwgNTgyNSwgNTc2MSwgNTY5OCwgNTYzNywgNTU3NywgNTUxOCwgNTQ2MSwKKyAgNTQwNSwgNTM0OSwgNTI5NSwgNTI0MiwgNTE5MCwgNTE0MCwgNTA5MCwgNTA0MSwKKyAgNDk5MywgNDk0NiwgNDg5OSwgNDg1NCwgNDgwOSwgNDc2NiwgNDcyMywgNDY4MSwKKyAgNDYzOSwgNDU5OSwgNDU1OSwgNDUxOSwgNDQ4MSwgNDQ0MywgNDQwNSwgNDM2OSwKKyAgNDMzMiwgNDI5NywgNDI2MiwgNDIyOCwgNDE5NCwgNDE2MSwgNDEyOCwgNDA5NiwKKyAgNDA2NCwgNDAzMiwgNDAwMiwgMzk3MSwgMzk0MiwgMzkxMiwgMzg4MywgMzg1NSwKKyAgMzgyNiwgMzc5OSwgMzc3MSwgMzc0NCwgMzcxOCwgMzY5MiwgMzY2NiwgMzY0MCwKKyAgMzYxNSwgMzU5MSwgMzU2NiwgMzU0MiwgMzUxOCwgMzQ5NSwgMzQ3MiwgMzQ0OSwKKyAgMzQyNiwgMzQwNCwgMzM4MiwgMzM2MCwgMzMzOSwgMzMxOCwgMzI5NywgMzI3NiwKKyAgMzI1NiwgMzIzNiwgMzIxNiwgMzE5NiwgMzE3NywgMzE1OCwgMzEzOSwgMzEyMCwKKyAgMzEwMiwgMzA4NCwgMzA2NiwgMzA0OCwgMzAzMCwgMzAxMywgMjk5NSwgMjk3OCwKKyAgMjk2MiwgMjk0NSwgMjkyOCwgMjkxMiwgMjg5NiwgMjg4MCwgMjg2NCwgMjg0OSwKKyAgMjgzMywgMjgxOCwgMjgwMywgMjc4OCwgMjc3NCwgMjc1OSwgMjc0NCwgMjczMCwKKyAgMjcxNiwgMjcwMiwgMjY4OCwgMjY3NCwgMjY2MSwgMjY0NywgMjYzNCwgMjYyMSwKKyAgMjYwOCwgMjU5NSwgMjU4MiwgMjU3MCwgMjU1NywgMjU0NSwgMjUzMiwgMjUyMCwKKyAgMjUwOCwgMjQ5NiwgMjQ4NCwgMjQ3MywgMjQ2MSwgMjQ0OSwgMjQzOCwgMjQyNywKKyAgMjQxNiwgMjQwNCwgMjM5NCwgMjM4MywgMjM3MiwgMjM2MSwgMjM1MSwgMjM0MCwKKyAgMjMzMCwgMjMxOSwgMjMwOSwgMjI5OSwgMjI4OSwgMjI3OSwgMjI2OSwgMjI1OSwKKyAgMjI1MCwgMjI0MCwgMjIzMSwgMjIyMSwgMjIxMiwgMjIwMiwgMjE5MywgMjE4NCwKKyAgMjE3NSwgMjE2NiwgMjE1NywgMjE0OCwgMjEzOSwgMjEzMSwgMjEyMiwgMjExNCwKKyAgMjEwNSwgMjA5NywgMjA4OCwgMjA4MCwgMjA3MiwgMjA2NCwgMjA1NiwgMjA0OCwKKyAgMjA0MCwgMjAzMiwgMjAyNCwgMjAxNiwgMjAwOCwgMjAwMSwgMTk5MywgMTk4NSwKKyAgMTk3OCwgMTk3MSwgMTk2MywgMTk1NiwgMTk0OSwgMTk0MSwgMTkzNCwgMTkyNywKKyAgMTkyMCwgMTkxMywgMTkwNiwgMTg5OSwgMTg5MiwgMTg4NSwgMTg3OSwgMTg3MiwKKyAgMTg2NSwgMTg1OSwgMTg1MiwgMTg0NiwgMTgzOSwgMTgzMywgMTgyNiwgMTgyMCwKKyAgMTgxNCwgMTgwNywgMTgwMSwgMTc5NSwgMTc4OSwgMTc4MywgMTc3NywgMTc3MSwKKyAgMTc2NSwgMTc1OSwgMTc1MywgMTc0NywgMTc0MSwgMTczNiwgMTczMCwgMTcyNCwKKyAgMTcxOCwgMTcxMywgMTcwNywgMTcwMiwgMTY5NiwgMTY5MSwgMTY4NSwgMTY4MCwKKyAgMTY3NSwgMTY2OSwgMTY2NCwgMTY1OSwgMTY1MywgMTY0OCwgMTY0MywgMTYzOCwKKyAgMTYzMywgMTYyOCwgMTYyMywgMTYxOCwgMTYxMywgMTYwOCwgMTYwMywgMTU5OCwKKyAgMTU5MywgMTU4OCwgMTU4MywgMTU3OSwgMTU3NCwgMTU2OSwgMTU2NSwgMTU2MCwKKyAgMTU1NSwgMTU1MSwgMTU0NiwgMTU0MiwgMTUzNywgMTUzMywgMTUyOCwgMTUyNCwKKyAgMTUxOSwgMTUxNSwgMTUxMCwgMTUwNiwgMTUwMiwgMTQ5NywgMTQ5MywgMTQ4OSwKKyAgMTQ4NSwgMTQ4MSwgMTQ3NiwgMTQ3MiwgMTQ2OCwgMTQ2NCwgMTQ2MCwgMTQ1NiwKKyAgMTQ1MiwgMTQ0OCwgMTQ0NCwgMTQ0MCwgMTQzNiwgMTQzMiwgMTQyOCwgMTQyNCwKKyAgMTQyMCwgMTQxNiwgMTQxMywgMTQwOSwgMTQwNSwgMTQwMSwgMTM5OCwgMTM5NCwKKyAgMTM5MCwgMTM4NywgMTM4MywgMTM3OSwgMTM3NiwgMTM3MiwgMTM2OCwgMTM2NSwKKyAgMTM2MSwgMTM1OCwgMTM1NCwgMTM1MSwgMTM0NywgMTM0NCwgMTM0MCwgMTMzNywKKyAgMTMzNCwgMTMzMCwgMTMyNywgMTMyMywgMTMyMCwgMTMxNywgMTMxNCwgMTMxMCwKKyAgMTMwNywgMTMwNCwgMTMwMCwgMTI5NywgMTI5NCwgMTI5MSwgMTI4OCwgMTI4NSwKKyAgMTI4MSwgMTI3OCwgMTI3NSwgMTI3MiwgMTI2OSwgMTI2NiwgMTI2MywgMTI2MCwKKyAgMTI1NywgMTI1NCwgMTI1MSwgMTI0OCwgMTI0NSwgMTI0MiwgMTIzOSwgMTIzNiwKKyAgMTIzMywgMTIzMCwgMTIyNywgMTIyNCwgMTIyMiwgMTIxOSwgMTIxNiwgMTIxMywKKyAgMTIxMCwgMTIwOCwgMTIwNSwgMTIwMiwgMTE5OSwgMTE5NywgMTE5NCwgMTE5MSwKKyAgMTE4OCwgMTE4NiwgMTE4MywgMTE4MCwgMTE3OCwgMTE3NSwgMTE3MiwgMTE3MCwKKyAgMTE2NywgMTE2NSwgMTE2MiwgMTE1OSwgMTE1NywgMTE1NCwgMTE1MiwgMTE0OSwKKyAgMTE0NywgMTE0NCwgMTE0MiwgMTEzOSwgMTEzNywgMTEzNCwgMTEzMiwgMTEyOSwKKyAgMTEyNywgMTEyNSwgMTEyMiwgMTEyMCwgMTExNywgMTExNSwgMTExMywgMTExMCwKKyAgMTEwOCwgMTEwNiwgMTEwMywgMTEwMSwgMTA5OSwgMTA5NiwgMTA5NCwgMTA5MiwKKyAgMTA4OSwgMTA4NywgMTA4NSwgMTA4MywgMTA4MSwgMTA3OCwgMTA3NiwgMTA3NCwKKyAgMTA3MiwgMTA2OSwgMTA2NywgMTA2NSwgMTA2MywgMTA2MSwgMTA1OSwgMTA1NywKKyAgMTA1NCwgMTA1MiwgMTA1MCwgMTA0OCwgMTA0NiwgMTA0NCwgMTA0MiwgMTA0MCwKKyAgMTAzOCwgMTAzNiwgMTAzNCwgMTAzMiwgMTAzMCwgMTAyOCwgMTAyNiwgMTAyNCwKKyAgMTAyMiwgMTAyMCwgMTAxOCwgMTAxNiwgMTAxNCwgMTAxMiwgMTAxMCwgMTAwOCwKKyAgMTAwNiwgMTAwNCwgMTAwMiwgMTAwMCwgOTk4LCA5OTYsIDk5NCwgOTkyLAorICA5OTEsIDk4OSwgOTg3LCA5ODUsIDk4MywgOTgxLCA5NzksIDk3OCwKKyAgOTc2LCA5NzQsIDk3MiwgOTcwLCA5NjksIDk2NywgOTY1LCA5NjMsCisgIDk2MSwgOTYwLCA5NTgsIDk1NiwgOTU0LCA5NTMsIDk1MSwgOTQ5LAorICA5NDgsIDk0NiwgOTQ0LCA5NDIsIDk0MSwgOTM5LCA5MzcsIDkzNiwKKyAgOTM0LCA5MzIsIDkzMSwgOTI5LCA5MjcsIDkyNiwgOTI0LCA5MjMsCisgIDkyMSwgOTE5LCA5MTgsIDkxNiwgOTE0LCA5MTMsIDkxMSwgOTEwLAorICA5MDgsIDkwNywgOTA1LCA5MDMsIDkwMiwgOTAwLCA4OTksIDg5NywKKyAgODk2LCA4OTQsIDg5MywgODkxLCA4OTAsIDg4OCwgODg3LCA4ODUsCisgIDg4NCwgODgyLCA4ODEsIDg3OSwgODc4LCA4NzYsIDg3NSwgODczLAorICA4NzIsIDg3MCwgODY5LCA4NjgsIDg2NiwgODY1LCA4NjMsIDg2MiwKKyAgODYwLCA4NTksIDg1OCwgODU2LCA4NTUsIDg1MywgODUyLCA4NTEsCisgIDg0OSwgODQ4LCA4NDYsIDg0NSwgODQ0LCA4NDIsIDg0MSwgODQwLAorICA4MzgsIDgzNywgODM2LCA4MzQsIDgzMywgODMyLCA4MzAsIDgyOSwKKyAgODI4LCA4MjYsIDgyNSwgODI0LCA4MjMsIDgyMSwgODIwLCA4MTksCisgIDgxNywgODE2LCA4MTUsIDgxNCwgODEyLCA4MTEsIDgxMCwgODA5LAorICA4MDcsIDgwNiwgODA1LCA4MDQsIDgwMiwgODAxLCA4MDAsIDc5OSwKKyAgNzk4LCA3OTYsIDc5NSwgNzk0LCA3OTMsIDc5MSwgNzkwLCA3ODksCisgIDc4OCwgNzg3LCA3ODYsIDc4NCwgNzgzLCA3ODIsIDc4MSwgNzgwLAorICA3NzksIDc3NywgNzc2LCA3NzUsIDc3NCwgNzczLCA3NzIsIDc3MSwKKyAgNzY5LCA3NjgsIDc2NywgNzY2LCA3NjUsIDc2NCwgNzYzLCA3NjIsCisgIDc2MCwgNzU5LCA3NTgsIDc1NywgNzU2LCA3NTUsIDc1NCwgNzUzLAorICA3NTIsIDc1MSwgNzUwLCA3NDgsIDc0NywgNzQ2LCA3NDUsIDc0NCwKKyAgNzQzLCA3NDIsIDc0MSwgNzQwLCA3MzksIDczOCwgNzM3LCA3MzYsCisgIDczNSwgNzM0LCA3MzMsIDczMiwgNzMxLCA3MzAsIDcyOSwgNzI4LAorICA3MjcsIDcyNiwgNzI1LCA3MjQsIDcyMywgNzIyLCA3MjEsIDcyMCwKKyAgNzE5LCA3MTgsIDcxNywgNzE2LCA3MTUsIDcxNCwgNzEzLCA3MTIsCisgIDcxMSwgNzEwLCA3MDksIDcwOCwgNzA3LCA3MDYsIDcwNSwgNzA0LAorICA3MDMsIDcwMiwgNzAxLCA3MDAsIDY5OSwgNjk5LCA2OTgsIDY5NywKKyAgNjk2LCA2OTUsIDY5NCwgNjkzLCA2OTIsIDY5MSwgNjkwLCA2ODksCisgIDY4OCwgNjg4LCA2ODcsIDY4NiwgNjg1LCA2ODQsIDY4MywgNjgyLAorICA2ODEsIDY4MCwgNjgwLCA2NzksIDY3OCwgNjc3LCA2NzYsIDY3NSwKKyAgNjc0LCA2NzMsIDY3MywgNjcyLCA2NzEsIDY3MCwgNjY5LCA2NjgsCisgIDY2NywgNjY3LCA2NjYsIDY2NSwgNjY0LCA2NjMsIDY2MiwgNjYxLAorICA2NjEsIDY2MCwgNjU5LCA2NTgsIDY1NywgNjU3LCA2NTYsIDY1NSwKKyAgNjU0LCA2NTMsIDY1MiwgNjUyLCA2NTEsIDY1MCwgNjQ5LCA2NDgsCisgIDY0OCwgNjQ3LCA2NDYsIDY0NSwgNjQ0LCA2NDQsIDY0MywgNjQyLAorICA2NDEsIDY0MCwgNjQwLCA2MzksIDYzOCwgNjM3LCA2MzcsIDYzNiwKKyAgNjM1LCA2MzQsIDYzMywgNjMzLCA2MzIsIDYzMSwgNjMwLCA2MzAsCisgIDYyOSwgNjI4LCA2MjcsIDYyNywgNjI2LCA2MjUsIDYyNCwgNjI0LAorICA2MjMsIDYyMiwgNjIxLCA2MjEsIDYyMCwgNjE5LCA2MTgsIDYxOCwKKyAgNjE3LCA2MTYsIDYxNiwgNjE1LCA2MTQsIDYxMywgNjEzLCA2MTIsCisgIDYxMSwgNjExLCA2MTAsIDYwOSwgNjA4LCA2MDgsIDYwNywgNjA2LAorICA2MDYsIDYwNSwgNjA0LCA2MDQsIDYwMywgNjAyLCA2MDEsIDYwMSwKKyAgNjAwLCA1OTksIDU5OSwgNTk4LCA1OTcsIDU5NywgNTk2LCA1OTUsCisgIDU5NSwgNTk0LCA1OTMsIDU5MywgNTkyLCA1OTEsIDU5MSwgNTkwLAorICA1ODksIDU4OSwgNTg4LCA1ODcsIDU4NywgNTg2LCA1ODUsIDU4NSwKKyAgNTg0LCA1ODMsIDU4MywgNTgyLCA1ODEsIDU4MSwgNTgwLCA1NzksCisgIDU3OSwgNTc4LCA1NzgsIDU3NywgNTc2LCA1NzYsIDU3NSwgNTc0LAorICA1NzQsIDU3MywgNTcyLCA1NzIsIDU3MSwgNTcxLCA1NzAsIDU2OSwKKyAgNTY5LCA1NjgsIDU2OCwgNTY3LCA1NjYsIDU2NiwgNTY1LCA1NjQsCisgIDU2NCwgNTYzLCA1NjMsIDU2MiwgNTYxLCA1NjEsIDU2MCwgNTYwLAorICA1NTksIDU1OCwgNTU4LCA1NTcsIDU1NywgNTU2LCA1NTUsIDU1NSwKKyAgNTU0LCA1NTQsIDU1MywgNTUzLCA1NTIsIDU1MSwgNTUxLCA1NTAsCisgIDU1MCwgNTQ5LCA1NDgsIDU0OCwgNTQ3LCA1NDcsIDU0NiwgNTQ2LAorICA1NDUsIDU0NCwgNTQ0LCA1NDMsIDU0MywgNTQyLCA1NDIsIDU0MSwKKyAgNTQxLCA1NDAsIDUzOSwgNTM5LCA1MzgsIDUzOCwgNTM3LCA1MzcsCisgIDUzNiwgNTM2LCA1MzUsIDUzNCwgNTM0LCA1MzMsIDUzMywgNTMyLAorICA1MzIsIDUzMSwgNTMxLCA1MzAsIDUzMCwgNTI5LCA1MjksIDUyOCwKKyAgNTI3LCA1MjcsIDUyNiwgNTI2LCA1MjUsIDUyNSwgNTI0LCA1MjQsCisgIDUyMywgNTIzLCA1MjIsIDUyMiwgNTIxLCA1MjEsIDUyMCwgNTIwLAorICA1MTksIDUxOSwgNTE4LCA1MTgsIDUxNywgNTE3LCA1MTYsIDUxNiwKKyAgNTE1LCA1MTUsIDUxNCwgNTE0Cit9OworCisvLyBOb3RlIHRoYXQgTGluZWFyVG9HYW1tYSgpIGV4cGVjdHMgdGhlIHZhbHVlcyB0byBiZSBwcmVtdWx0aXBsaWVkIGJ5IDQsCisvLyBzbyB3ZSBpbmNvcnBvcmF0ZSB0aGlzIGZhY3RvciA0IGluc2lkZSB0aGUgRElWSURFX0JZX0FMUEhBIG1hY3JvIGRpcmVjdGx5LgorI2RlZmluZSBESVZJREVfQllfQUxQSEEoc3VtLCBhKSAgKCgoc3VtKSAqIGtJbnZBbHBoYVsoYSldKSA+PiAoa0FscGhhRml4IC0gMikpCisKKyNlbHNlCisKKyNkZWZpbmUgRElWSURFX0JZX0FMUEhBKHN1bSwgYSkgKDQgKiAoc3VtKSAvIChhKSkKKworI2VuZGlmICAvLyBVU0VfSU5WRVJTRV9BTFBIQV9UQUJMRQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IExpbmVhclRvR2FtbWFXZWlnaHRlZChjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsX2EsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUpIHsKKyAgY29uc3QgdWludDMyX3Qgc3VtID0KKyAgICAgIGFfcHRyWzBdICogR2FtbWFUb0xpbmVhcihzcmNbMF0pICsKKyAgICAgIGFfcHRyW3N0ZXBdICogR2FtbWFUb0xpbmVhcihzcmNbc3RlcF0pICsKKyAgICAgIGFfcHRyW3JnYl9zdHJpZGVdICogR2FtbWFUb0xpbmVhcihzcmNbcmdiX3N0cmlkZV0pICsKKyAgICAgIGFfcHRyW3JnYl9zdHJpZGUgKyBzdGVwXSAqIEdhbW1hVG9MaW5lYXIoc3JjW3JnYl9zdHJpZGUgKyBzdGVwXSk7CisgIGFzc2VydCh0b3RhbF9hID4gMCAmJiB0b3RhbF9hIDw9IDQgKiAweGZmKTsKKyNpZiBkZWZpbmVkKFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFKQorICBhc3NlcnQoKHVpbnQ2NF90KXN1bSAqIGtJbnZBbHBoYVt0b3RhbF9hXSA8ICgodWludDY0X3QpMSA8PCAzMikpOworI2VuZGlmCisgIHJldHVybiBMaW5lYXJUb0dhbW1hKERJVklERV9CWV9BTFBIQShzdW0sIHRvdGFsX2EpLCAwKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJvd1RvWShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmFuZG9tKiBjb25zdCByZykgeworICBpbnQgaSwgajsKKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCB3aWR0aDsgaSArPSAxLCBqICs9IHN0ZXApIHsKKyAgICBkc3RfeVtpXSA9IFJHQlRvWShyX3B0cltqXSwgZ19wdHJbal0sIGJfcHRyW2pdLCByZyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWNjdW11bGF0ZVJHQkEoY29uc3QgdWludDhfdCogY29uc3Qgcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCB3aWR0aCkgeworICBpbnQgaSwgajsKKyAgLy8gd2UgbG9vcCBvdmVyIDJ4MiBibG9ja3MgYW5kIHByb2R1Y2Ugb25lIFIvRy9CL0EgdmFsdWUgZm9yIGVhY2guCisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgKHdpZHRoID4+IDEpOyBpICs9IDEsIGogKz0gMiAqIDQsIGRzdCArPSA0KSB7CisgICAgY29uc3QgdWludDMyX3QgYSA9IFNVTTRBTFBIQShhX3B0ciArIGopOworICAgIGludCByLCBnLCBiOworICAgIGlmIChhID09IDQgKiAweGZmIHx8IGEgPT0gMCkgeworICAgICAgciA9IFNVTTQocl9wdHIgKyBqLCA0KTsKKyAgICAgIGcgPSBTVU00KGdfcHRyICsgaiwgNCk7CisgICAgICBiID0gU1VNNChiX3B0ciArIGosIDQpOworICAgIH0gZWxzZSB7CisgICAgICByID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKHJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCA0LCByZ2Jfc3RyaWRlKTsKKyAgICAgIGcgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQoZ19wdHIgKyBqLCBhX3B0ciArIGosIGEsIDQsIHJnYl9zdHJpZGUpOworICAgICAgYiA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChiX3B0ciArIGosIGFfcHRyICsgaiwgYSwgNCwgcmdiX3N0cmlkZSk7CisgICAgfQorICAgIGRzdFswXSA9IHI7CisgICAgZHN0WzFdID0gZzsKKyAgICBkc3RbMl0gPSBiOworICAgIGRzdFszXSA9IGE7CisgIH0KKyAgaWYgKHdpZHRoICYgMSkgeworICAgIGNvbnN0IHVpbnQzMl90IGEgPSAydSAqIFNVTTJBTFBIQShhX3B0ciArIGopOworICAgIGludCByLCBnLCBiOworICAgIGlmIChhID09IDQgKiAweGZmIHx8IGEgPT0gMCkgeworICAgICAgciA9IFNVTTIocl9wdHIgKyBqKTsKKyAgICAgIGcgPSBTVU0yKGdfcHRyICsgaik7CisgICAgICBiID0gU1VNMihiX3B0ciArIGopOworICAgIH0gZWxzZSB7CisgICAgICByID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKHJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCAwLCByZ2Jfc3RyaWRlKTsKKyAgICAgIGcgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQoZ19wdHIgKyBqLCBhX3B0ciArIGosIGEsIDAsIHJnYl9zdHJpZGUpOworICAgICAgYiA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChiX3B0ciArIGosIGFfcHRyICsgaiwgYSwgMCwgcmdiX3N0cmlkZSk7CisgICAgfQorICAgIGRzdFswXSA9IHI7CisgICAgZHN0WzFdID0gZzsKKyAgICBkc3RbMl0gPSBiOworICAgIGRzdFszXSA9IGE7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWNjdW11bGF0ZVJHQihjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCB3aWR0aCkgeworICBpbnQgaSwgajsKKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkgKz0gMSwgaiArPSAyICogc3RlcCwgZHN0ICs9IDQpIHsKKyAgICBkc3RbMF0gPSBTVU00KHJfcHRyICsgaiwgc3RlcCk7CisgICAgZHN0WzFdID0gU1VNNChnX3B0ciArIGosIHN0ZXApOworICAgIGRzdFsyXSA9IFNVTTQoYl9wdHIgKyBqLCBzdGVwKTsKKyAgfQorICBpZiAod2lkdGggJiAxKSB7CisgICAgZHN0WzBdID0gU1VNMihyX3B0ciArIGopOworICAgIGRzdFsxXSA9IFNVTTIoZ19wdHIgKyBqKTsKKyAgICBkc3RbMl0gPSBTVU0yKGJfcHRyICsgaik7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJvd3NUb1VWKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0X3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0X3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAxLCByZ2IgKz0gNCkgeworICAgIGNvbnN0IGludCByID0gcmdiWzBdLCBnID0gcmdiWzFdLCBiID0gcmdiWzJdOworICAgIGRzdF91W2ldID0gUkdCVG9VKHIsIGcsIGIsIHJnKTsKKyAgICBkc3RfdltpXSA9IFJHQlRvVihyLCBnLCBiLCByZyk7CisgIH0KK30KKworc3RhdGljIGludCBJbXBvcnRZVVZBRnJvbVJHQkEoY29uc3QgdWludDhfdCogcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgICAgICAgICAvLyBieXRlcyBwZXIgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLCAgIC8vIGJ5dGVzIHBlciBzY2FubGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGl0aGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIGludCB5OworICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IENoZWNrTm9uT3BhcXVlKGFfcHRyLCB3aWR0aCwgaGVpZ2h0LCBzdGVwLCByZ2Jfc3RyaWRlKTsKKyAgY29uc3QgaW50IGlzX3JnYiA9IChyX3B0ciA8IGJfcHRyKTsgIC8vIG90aGVyd2lzZSBpdCdzIGJncgorCisgIHBpY3R1cmUtPmNvbG9yc3BhY2UgPSBoYXNfYWxwaGEgPyBXRUJQX1lVVjQyMEEgOiBXRUJQX1lVVjQyMDsKKyAgcGljdHVyZS0+dXNlX2FyZ2IgPSAwOworCisgIC8vIGRpc2FibGUgc21hcnQgY29udmVyc2lvbiBpZiBzb3VyY2UgaXMgdG9vIHNtYWxsIChvdmVya2lsbCkuCisgIGlmICh3aWR0aCA8IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uIHx8CisgICAgICBoZWlnaHQgPCBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbikgeworICAgIHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbiA9IDA7CisgIH0KKworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2NZVVZBKHBpY3R1cmUsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGhhc19hbHBoYSkgeworICAgIGFzc2VydChzdGVwID09IDQpOworI2lmIGRlZmluZWQoVVNFX0dBTU1BX0NPTVBSRVNTSU9OKSAmJiBkZWZpbmVkKFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFKQorICAgIGFzc2VydChrQWxwaGFGaXggKyBrR2FtbWFGaXggPD0gMzEpOworI2VuZGlmCisgIH0KKworICBpZiAodXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uKSB7CisgICAgSW5pdEdhbW1hVGFibGVzUygpOworICAgIGlmICghUHJlcHJvY2Vzc0FSR0Iocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgcmdiX3N0cmlkZSwgcGljdHVyZSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoaGFzX2FscGhhKSB7CisgICAgICBXZWJQRXh0cmFjdEFscGhhKGFfcHRyLCByZ2Jfc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLT5hLCBwaWN0dXJlLT5hX3N0cmlkZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IGludCB1dl93aWR0aCA9ICh3aWR0aCArIDEpID4+IDE7CisgICAgaW50IHVzZV9kc3AgPSAoc3RlcCA9PSAzKTsgIC8vIHVzZSBzcGVjaWFsIGZ1bmN0aW9uIGluIHRoaXMgY2FzZQorICAgIC8vIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBhY2N1bXVsYXRlZCBSL0cvQiB2YWx1ZXMgZHVyaW5nIGNvbnZlcnNpb24gdG8gVS9WCisgICAgdWludDE2X3QqIGNvbnN0IHRtcF9yZ2IgPQorICAgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKDQgKiB1dl93aWR0aCwgc2l6ZW9mKCp0bXBfcmdiKSk7CisgICAgdWludDhfdCogZHN0X3kgPSBwaWN0dXJlLT55OworICAgIHVpbnQ4X3QqIGRzdF91ID0gcGljdHVyZS0+dTsKKyAgICB1aW50OF90KiBkc3RfdiA9IHBpY3R1cmUtPnY7CisgICAgdWludDhfdCogZHN0X2EgPSBwaWN0dXJlLT5hOworCisgICAgVlA4UmFuZG9tIGJhc2Vfcmc7CisgICAgVlA4UmFuZG9tKiByZyA9IE5VTEw7CisgICAgaWYgKGRpdGhlcmluZyA+IDAuKSB7CisgICAgICBWUDhJbml0UmFuZG9tKCZiYXNlX3JnLCBkaXRoZXJpbmcpOworICAgICAgcmcgPSAmYmFzZV9yZzsKKyAgICAgIHVzZV9kc3AgPSAwOyAgIC8vIGNhbid0IHVzZSBkc3AgaW4gdGhpcyBjYXNlCisgICAgfQorICAgIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVigpOworICAgIEluaXRHYW1tYVRhYmxlcygpOworCisgICAgaWYgKHRtcF9yZ2IgPT0gTlVMTCkgcmV0dXJuIDA7ICAvLyBtYWxsb2MgZXJyb3IKKworICAgIC8vIERvd25zYW1wbGUgWS9VL1YgcGxhbmVzLCB0d28gcm93cyBhdCBhIHRpbWUKKyAgICBmb3IgKHkgPSAwOyB5IDwgKGhlaWdodCA+PiAxKTsgKyt5KSB7CisgICAgICBpbnQgcm93c19oYXZlX2FscGhhID0gaGFzX2FscGhhOworICAgICAgaWYgKHVzZV9kc3ApIHsKKyAgICAgICAgaWYgKGlzX3JnYikgeworICAgICAgICAgIFdlYlBDb252ZXJ0UkdCMjRUb1kocl9wdHIsIGRzdF95LCB3aWR0aCk7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSArIHBpY3R1cmUtPnlfc3RyaWRlLCB3aWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV2ViUENvbnZlcnRCR1IyNFRvWShiX3B0ciwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyICsgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29udmVydFJvd1RvWShyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCBkc3RfeSwgd2lkdGgsIHJnKTsKKyAgICAgICAgQ29udmVydFJvd1RvWShyX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgZ19wdHIgKyByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGJfcHRyICsgcmdiX3N0cmlkZSwgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RfeSArIHBpY3R1cmUtPnlfc3RyaWRlLCB3aWR0aCwgcmcpOworICAgICAgfQorICAgICAgZHN0X3kgKz0gMiAqIHBpY3R1cmUtPnlfc3RyaWRlOworICAgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgICByb3dzX2hhdmVfYWxwaGEgJj0gIVdlYlBFeHRyYWN0QWxwaGEoYV9wdHIsIHJnYl9zdHJpZGUsIHdpZHRoLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2EsIHBpY3R1cmUtPmFfc3RyaWRlKTsKKyAgICAgICAgZHN0X2EgKz0gMiAqIHBpY3R1cmUtPmFfc3RyaWRlOworICAgICAgfQorICAgICAgLy8gQ29sbGVjdCBhdmVyYWdlZCBSL0cvQigvQSkKKyAgICAgIGlmICghcm93c19oYXZlX2FscGhhKSB7CisgICAgICAgIEFjY3VtdWxhdGVSR0Iocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgcmdiX3N0cmlkZSwgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQkEocl9wdHIsIGdfcHRyLCBiX3B0ciwgYV9wdHIsIHJnYl9zdHJpZGUsIHRtcF9yZ2IsIHdpZHRoKTsKKyAgICAgIH0KKyAgICAgIC8vIENvbnZlcnQgdG8gVS9WCisgICAgICBpZiAocmcgPT0gTlVMTCkgeworICAgICAgICBXZWJQQ29udmVydFJHQkEzMlRvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93c1RvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCwgcmcpOworICAgICAgfQorICAgICAgZHN0X3UgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICAgICAgZHN0X3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICAgICAgcl9wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgICBiX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICAgIGdfcHRyICs9IDIgKiByZ2Jfc3RyaWRlOworICAgICAgaWYgKGhhc19hbHBoYSkgYV9wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgfQorICAgIGlmIChoZWlnaHQgJiAxKSB7ICAgIC8vIGV4dHJhIGxhc3Qgcm93CisgICAgICBpbnQgcm93X2hhc19hbHBoYSA9IGhhc19hbHBoYTsKKyAgICAgIGlmICh1c2VfZHNwKSB7CisgICAgICAgIGlmIChyX3B0ciA8IGJfcHRyKSB7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyLCBkc3RfeSwgd2lkdGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHN0ZXAsIGRzdF95LCB3aWR0aCwgcmcpOworICAgICAgfQorICAgICAgaWYgKHJvd19oYXNfYWxwaGEpIHsKKyAgICAgICAgcm93X2hhc19hbHBoYSAmPSAhV2ViUEV4dHJhY3RBbHBoYShhX3B0ciwgMCwgd2lkdGgsIDEsIGRzdF9hLCAwKTsKKyAgICAgIH0KKyAgICAgIC8vIENvbGxlY3QgYXZlcmFnZWQgUi9HL0IoL0EpCisgICAgICBpZiAoIXJvd19oYXNfYWxwaGEpIHsKKyAgICAgICAgLy8gQ29sbGVjdCBhdmVyYWdlZCBSL0cvQgorICAgICAgICBBY2N1bXVsYXRlUkdCKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHN0ZXAsIC8qIHJnYl9zdHJpZGUgPSAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgIHRtcF9yZ2IsIHdpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFjY3VtdWxhdGVSR0JBKHJfcHRyLCBnX3B0ciwgYl9wdHIsIGFfcHRyLCAvKiByZ2Jfc3RyaWRlID0gKi8gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfQorICAgICAgaWYgKHJnID09IE5VTEwpIHsKKyAgICAgICAgV2ViUENvbnZlcnRSR0JBMzJUb1VWKHRtcF9yZ2IsIGRzdF91LCBkc3RfdiwgdXZfd2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29udmVydFJvd3NUb1VWKHRtcF9yZ2IsIGRzdF91LCBkc3RfdiwgdXZfd2lkdGgsIHJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHRtcF9yZ2IpOworICB9CisgIHJldHVybiAxOworfQorCisjdW5kZWYgU1VNNAorI3VuZGVmIFNVTTIKKyN1bmRlZiBTVU00QUxQSEEKKyN1bmRlZiBTVU0yQUxQSEEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNhbGwgZm9yIEFSR0ItPllVVkEgY29udmVyc2lvbgorCitzdGF0aWMgaW50IFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpdGhlcmluZywgaW50IHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbikgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgfSBlbHNlIGlmICgoY29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0spICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhcmdiID0gKGNvbnN0IHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2I7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgYSA9IGFyZ2IgKyAoMCBeIEFMUEhBX09GRlNFVCk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgciA9IGFyZ2IgKyAoMSBeIEFMUEhBX09GRlNFVCk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgZyA9IGFyZ2IgKyAoMiBeIEFMUEhBX09GRlNFVCk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgYiA9IGFyZ2IgKyAoMyBeIEFMUEhBX09GRlNFVCk7CisKKyAgICBwaWN0dXJlLT5jb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjA7CisgICAgcmV0dXJuIEltcG9ydFlVVkFGcm9tUkdCQShyLCBnLCBiLCBhLCA0LCA0ICogcGljdHVyZS0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJpbmcsIHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbiwgcGljdHVyZSk7CisgIH0KK30KKworaW50IFdlYlBQaWN0dXJlQVJHQlRvWVVWQURpdGhlcmVkKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGl0aGVyaW5nKSB7CisgIHJldHVybiBQaWN0dXJlQVJHQlRvWVVWQShwaWN0dXJlLCBjb2xvcnNwYWNlLCBkaXRoZXJpbmcsIDApOworfQorCitpbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UpIHsKKyAgcmV0dXJuIFBpY3R1cmVBUkdCVG9ZVVZBKHBpY3R1cmUsIGNvbG9yc3BhY2UsIDAuZiwgMCk7Cit9CisKK2ludCBXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSkgeworICByZXR1cm4gUGljdHVyZUFSR0JUb1lVVkEocGljdHVyZSwgV0VCUF9ZVVY0MjAsIDAuZiwgMSk7Cit9CisvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQoraW50IFdlYlBQaWN0dXJlU21hcnRBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIHJldHVybiBXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQShwaWN0dXJlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNhbGwgZm9yIFlVVkEgLT4gQVJHQiBjb252ZXJzaW9uCisKK2ludCBXZWJQUGljdHVyZVlVVkFUb0FSR0IoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChwaWN0dXJlLT55ID09IE5VTEwgfHwgcGljdHVyZS0+dSA9PSBOVUxMIHx8IHBpY3R1cmUtPnYgPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgfQorICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpICYmIHBpY3R1cmUtPmEgPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgfQorICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLKSAhPSBXRUJQX1lVVjQyMCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7CisgIH0KKyAgLy8gQWxsb2NhdGUgYSBuZXcgYXJnYiBidWZmZXIgKGRpc2NhcmRpbmcgdGhlIHByZXZpb3VzIG9uZSkuCisgIGlmICghV2ViUFBpY3R1cmVBbGxvY0FSR0IocGljdHVyZSwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCkpIHJldHVybiAwOworICBwaWN0dXJlLT51c2VfYXJnYiA9IDE7CisKKyAgLy8gQ29udmVydAorICB7CisgICAgaW50IHk7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgYXJnYl9zdHJpZGUgPSA0ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgICAgdWludDhfdCogZHN0ID0gKHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2I7CisgICAgY29uc3QgdWludDhfdCAqY3VyX3UgPSBwaWN0dXJlLT51LCAqY3VyX3YgPSBwaWN0dXJlLT52LCAqY3VyX3kgPSBwaWN0dXJlLT55OworICAgIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyB1cHNhbXBsZSA9CisgICAgICAgIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihBTFBIQV9PRkZTRVQgPiAwKTsKKworICAgIC8vIEZpcnN0IHJvdywgd2l0aCByZXBsaWNhdGVkIHRvcCBzYW1wbGVzLgorICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgZHN0LCBOVUxMLCB3aWR0aCk7CisgICAgY3VyX3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7CisgICAgZHN0ICs9IGFyZ2Jfc3RyaWRlOworICAgIC8vIENlbnRlciByb3dzLgorICAgIGZvciAoeSA9IDE7IHkgKyAxIDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF91ID0gY3VyX3U7CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3BfdiA9IGN1cl92OworICAgICAgY3VyX3UgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICAgICAgY3VyX3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICAgICAgdXBzYW1wbGUoY3VyX3ksIGN1cl95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHRvcF91LCB0b3BfdiwgY3VyX3UsIGN1cl92LAorICAgICAgICAgICAgICAgZHN0LCBkc3QgKyBhcmdiX3N0cmlkZSwgd2lkdGgpOworICAgICAgY3VyX3kgKz0gMiAqIHBpY3R1cmUtPnlfc3RyaWRlOworICAgICAgZHN0ICs9IDIgKiBhcmdiX3N0cmlkZTsKKyAgICB9CisgICAgLy8gTGFzdCByb3cgKGlmIG5lZWRlZCksIHdpdGggcmVwbGljYXRlZCBib3R0b20gc2FtcGxlcy4KKyAgICBpZiAoaGVpZ2h0ID4gMSAmJiAhKGhlaWdodCAmIDEpKSB7CisgICAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIGRzdCwgTlVMTCwgd2lkdGgpOworICAgIH0KKyAgICAvLyBJbnNlcnQgYWxwaGEgdmFsdWVzIGlmIG5lZWRlZCwgaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWZhdWx0IDB4ZmYgb25lcy4KKyAgICBpZiAocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgeworICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX2RzdCA9IHBpY3R1cmUtPmFyZ2IgKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHBpY3R1cmUtPmEgKyB5ICogcGljdHVyZS0+YV9zdHJpZGU7CisgICAgICAgIGludCB4OworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgIGFyZ2JfZHN0W3hdID0gKGFyZ2JfZHN0W3hdICYgMHgwMGZmZmZmZnUpIHwgKCh1aW50MzJfdClzcmNbeF0gPDwgMjQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYXV0b21hdGljIGltcG9ydCAvIGNvbnZlcnNpb24KKworc3RhdGljIGludCBJbXBvcnQoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCBzd2FwX3JiLCBpbnQgaW1wb3J0X2FscGhhKSB7CisgIGludCB5OworICAvLyBzd2FwX3JiIC0+IGIsZyxyLGEgLCAhc3dhcF9yYiAtPiByLGcsYixhCisgIGNvbnN0IHVpbnQ4X3QqIHJfcHRyID0gcmdiICsgKHN3YXBfcmIgPyAyIDogMCk7CisgIGNvbnN0IHVpbnQ4X3QqIGdfcHRyID0gcmdiICsgMTsKKyAgY29uc3QgdWludDhfdCogYl9wdHIgPSByZ2IgKyAoc3dhcF9yYiA/IDAgOiAyKTsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisKKyAgaWYgKCFwaWN0dXJlLT51c2VfYXJnYikgeworICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyID0gaW1wb3J0X2FscGhhID8gcmdiICsgMyA6IE5VTEw7CisgICAgcmV0dXJuIEltcG9ydFlVVkFGcm9tUkdCQShyX3B0ciwgZ19wdHIsIGJfcHRyLCBhX3B0ciwgc3RlcCwgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuZiAvKiBubyBkaXRoZXJpbmcgKi8sIDAsIHBpY3R1cmUpOworICB9CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWN0dXJlKSkgcmV0dXJuIDA7CisKKyAgVlA4TERzcEluaXQoKTsKKyAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKworICBpZiAoaW1wb3J0X2FscGhhKSB7CisgICAgLy8gZHN0W10gYnl0ZSBvcmRlciBpcyB7YSxyLGcsYn0gZm9yIGJpZy1lbmRpYW4sIHtiLGcscixhfSBmb3IgbGl0dGxlIGVuZGlhbgorICAgIHVpbnQzMl90KiBkc3QgPSBwaWN0dXJlLT5hcmdiOworICAgIGNvbnN0IGludCBkb19jb3B5ID0gKEFMUEhBX09GRlNFVCA9PSAzKSAmJiBzd2FwX3JiOworICAgIGFzc2VydChzdGVwID09IDQpOworICAgIGlmIChkb19jb3B5KSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgcmdiLCB3aWR0aCAqIDQpOworICAgICAgICByZ2IgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICAgICAgLy8gQkdSQSBvciBSR0JBIGlucHV0IG9yZGVyLgorICAgICAgICBjb25zdCB1aW50OF90KiBhX3B0ciA9IHJnYiArIDM7CisgICAgICAgIFdlYlBQYWNrQVJHQihhX3B0ciwgcl9wdHIsIGdfcHRyLCBiX3B0ciwgd2lkdGgsIGRzdCk7CisgICAgICAgIHJfcHRyICs9IHJnYl9zdHJpZGU7CisgICAgICAgIGdfcHRyICs9IHJnYl9zdHJpZGU7CisgICAgICAgIGJfcHRyICs9IHJnYl9zdHJpZGU7CisjZWxzZQorICAgICAgICAvLyBSR0JBIGlucHV0IG9yZGVyLiBOZWVkIHRvIHN3YXAgUiBhbmQgQi4KKyAgICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBKChjb25zdCB1aW50MzJfdCopcmdiLCB3aWR0aCwgKHVpbnQ4X3QqKWRzdCk7CisjZW5kaWYKKyAgICAgICAgcmdiICs9IHJnYl9zdHJpZGU7CisgICAgICAgIGRzdCArPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QqIGRzdCA9IHBpY3R1cmUtPmFyZ2I7CisgICAgYXNzZXJ0KHN0ZXAgPj0gMyk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBXZWJQUGFja1JHQihyX3B0ciwgZ19wdHIsIGJfcHRyLCB3aWR0aCwgc3RlcCwgZHN0KTsKKyAgICAgIHJfcHRyICs9IHJnYl9zdHJpZGU7CisgICAgICBnX3B0ciArPSByZ2Jfc3RyaWRlOworICAgICAgYl9wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgIGRzdCArPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFB1YmxpYyBBUEkKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKworaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAxLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSQShXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYmEgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMSkKKyAgICAgICAgICAgICA6IDA7Cit9CisKKworaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSWChXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYmEgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMCkKKyAgICAgICAgICAgICA6IDA7Cit9CisKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0IoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2IgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2IsIHJnYl9zdHJpZGUsIDMsIDAsIDApCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAwLCAxKQorICAgICAgICAgICAgIDogMDsKK30KKworaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCWChXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYmEgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMCwgMCkKKyAgICAgICAgICAgICA6IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhZmJkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9lbmMuYwpAQCAtMCwwICsxLDMwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIGNsYXNzIGJhc2lzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQUGljdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBEdW1teVdyaXRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICAvLyBUaGUgZm9sbG93aW5nIGFyZSB0byBwcmV2ZW50ICd1bnVzZWQgdmFyaWFibGUnIGVycm9yIG1lc3NhZ2UuCisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljdHVyZTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSogcGljdHVyZSwgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gY2FsbGVyL3N5c3RlbSB2ZXJzaW9uIG1pc21hdGNoIQorICB9CisgIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKKyAgICBtZW1zZXQocGljdHVyZSwgMCwgc2l6ZW9mKCpwaWN0dXJlKSk7CisgICAgcGljdHVyZS0+d3JpdGVyID0gRHVtbXlXcml0ZXI7CisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19PSyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IE5VTEw7CisgIHBpY3R1cmUtPmFyZ2IgPSBOVUxMOworICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIHBpY3R1cmUtPm1lbW9yeV8gPSBOVUxMOworICBwaWN0dXJlLT55ID0gcGljdHVyZS0+dSA9IHBpY3R1cmUtPnYgPSBwaWN0dXJlLT5hID0gTlVMTDsKKyAgcGljdHVyZS0+eV9zdHJpZGUgPSBwaWN0dXJlLT51dl9zdHJpZGUgPSAwOworICBwaWN0dXJlLT5hX3N0cmlkZSA9IDA7Cit9CisKK3ZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IocGljdHVyZSk7CisgIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKHBpY3R1cmUpOworfQorCitpbnQgV2ViUFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICB2b2lkKiBtZW1vcnk7CisgIGNvbnN0IHVpbnQ2NF90IGFyZ2Jfc2l6ZSA9ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodDsKKworICBhc3NlcnQocGljdHVyZSAhPSBOVUxMKTsKKworICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IocGljdHVyZSk7CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OKTsKKyAgfQorICAvLyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgIG1lbW9yeSA9IFdlYlBTYWZlTWFsbG9jKGFyZ2Jfc2l6ZSArIFdFQlBfQUxJR05fQ1NULCBzaXplb2YoKnBpY3R1cmUtPmFyZ2IpKTsKKyAgaWYgKG1lbW9yeSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KKyAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gbWVtb3J5OworICBwaWN0dXJlLT5hcmdiID0gKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbW9yeSk7CisgIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlID0gd2lkdGg7CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFBpY3R1cmVBbGxvY1lVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBjb25zdCBXZWJQRW5jQ1NQIHV2X2NzcCA9CisgICAgICAoV2ViUEVuY0NTUCkoKGludClwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSyk7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSAoaW50KXBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQ7CisgIGNvbnN0IGludCB5X3N0cmlkZSA9IHdpZHRoOworICBjb25zdCBpbnQgdXZfd2lkdGggPSAoaW50KSgoKGludDY0X3Qpd2lkdGggKyAxKSA+PiAxKTsKKyAgY29uc3QgaW50IHV2X2hlaWdodCA9IChpbnQpKCgoaW50NjRfdCloZWlnaHQgKyAxKSA+PiAxKTsKKyAgY29uc3QgaW50IHV2X3N0cmlkZSA9IHV2X3dpZHRoOworICBpbnQgYV93aWR0aCwgYV9zdHJpZGU7CisgIHVpbnQ2NF90IHlfc2l6ZSwgdXZfc2l6ZSwgYV9zaXplLCB0b3RhbF9zaXplOworICB1aW50OF90KiBtZW07CisKKyAgYXNzZXJ0KHBpY3R1cmUgIT0gTlVMTCk7CisKKyAgV2ViUFNhZmVGcmVlKHBpY3R1cmUtPm1lbW9yeV8pOworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVyWVVWQShwaWN0dXJlKTsKKworICBpZiAodXZfY3NwICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfQorCisgIC8vIGFscGhhCisgIGFfd2lkdGggPSBoYXNfYWxwaGEgPyB3aWR0aCA6IDA7CisgIGFfc3RyaWRlID0gYV93aWR0aDsKKyAgeV9zaXplID0gKHVpbnQ2NF90KXlfc3RyaWRlICogaGVpZ2h0OworICB1dl9zaXplID0gKHVpbnQ2NF90KXV2X3N0cmlkZSAqIHV2X2hlaWdodDsKKyAgYV9zaXplID0gICh1aW50NjRfdClhX3N0cmlkZSAqIGhlaWdodDsKKworICB0b3RhbF9zaXplID0geV9zaXplICsgYV9zaXplICsgMiAqIHV2X3NpemU7CisKKyAgLy8gU2VjdXJpdHkgYW5kIHZhbGlkYXRpb24gY2hlY2tzCisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8ICAgICAgICAgICAvLyBsdW1hL2FscGhhIHBhcmFtIGVycm9yCisgICAgICB1dl93aWR0aCA8PSAwIHx8IHV2X2hlaWdodCA8PSAwKSB7ICAgICAvLyB1L3YgcGFyYW0gZXJyb3IKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OKTsKKyAgfQorICAvLyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgIG1lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbSkpOworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorCisgIC8vIEZyb20gbm93IG9uLCB3ZSdyZSBpbiB0aGUgY2xlYXIsIHdlIGNhbiBubyBsb25nZXIgZmFpbC4uLgorICBwaWN0dXJlLT5tZW1vcnlfID0gKHZvaWQqKW1lbTsKKyAgcGljdHVyZS0+eV9zdHJpZGUgID0geV9zdHJpZGU7CisgIHBpY3R1cmUtPnV2X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgcGljdHVyZS0+YV9zdHJpZGUgID0gYV9zdHJpZGU7CisKKyAgLy8gVE9ETyhza2FsKTogd2UgY291bGQgYWxpZ24gdGhlIHkvdS92IHBsYW5lcyBhbmQgYWRqdXN0IHN0cmlkZS4KKyAgcGljdHVyZS0+eSA9IG1lbTsKKyAgbWVtICs9IHlfc2l6ZTsKKworICBwaWN0dXJlLT51ID0gbWVtOworICBtZW0gKz0gdXZfc2l6ZTsKKyAgcGljdHVyZS0+diA9IG1lbTsKKyAgbWVtICs9IHV2X3NpemU7CisKKyAgaWYgKGFfc2l6ZSA+IDApIHsKKyAgICBwaWN0dXJlLT5hID0gbWVtOworICAgIG1lbSArPSBhX3NpemU7CisgIH0KKyAgKHZvaWQpbWVtOyAgLy8gbWFrZXMgdGhlIHN0YXRpYyBhbmFseXplciBoYXBweQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlQWxsb2MoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisKKyAgICBXZWJQUGljdHVyZUZyZWUocGljdHVyZSk7ICAgLy8gZXJhc2UgcHJldmlvdXMgYnVmZmVyCisKKyAgICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7CisgICAgICByZXR1cm4gV2ViUFBpY3R1cmVBbGxvY1lVVkEocGljdHVyZSwgd2lkdGgsIGhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBXZWJQUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUFBpY3R1cmVGcmVlKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5Xyk7CisgICAgV2ViUFNhZmVGcmVlKHBpY3R1cmUtPm1lbW9yeV9hcmdiXyk7CisgICAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMocGljdHVyZSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBNZW1vcnlXcml0ZXI6IFdyaXRlLXRvLW1lbW9yeQorCit2b2lkIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcikgeworICB3cml0ZXItPm1lbSA9IE5VTEw7CisgIHdyaXRlci0+c2l6ZSA9IDA7CisgIHdyaXRlci0+bWF4X3NpemUgPSAwOworfQorCitpbnQgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IHcgPSAoV2ViUE1lbW9yeVdyaXRlciopcGljdHVyZS0+Y3VzdG9tX3B0cjsKKyAgdWludDY0X3QgbmV4dF9zaXplOworICBpZiAodyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbmV4dF9zaXplID0gKHVpbnQ2NF90KXctPnNpemUgKyBkYXRhX3NpemU7CisgIGlmIChuZXh0X3NpemUgPiB3LT5tYXhfc2l6ZSkgeworICAgIHVpbnQ4X3QqIG5ld19tZW07CisgICAgdWludDY0X3QgbmV4dF9tYXhfc2l6ZSA9IDJVTEwgKiB3LT5tYXhfc2l6ZTsKKyAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IG5leHRfc2l6ZSkgbmV4dF9tYXhfc2l6ZSA9IG5leHRfc2l6ZTsKKyAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IDgxOTJVTEwpIG5leHRfbWF4X3NpemUgPSA4MTkyVUxMOworICAgIG5ld19tZW0gPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MobmV4dF9tYXhfc2l6ZSwgMSk7CisgICAgaWYgKG5ld19tZW0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICh3LT5zaXplID4gMCkgeworICAgICAgbWVtY3B5KG5ld19tZW0sIHctPm1lbSwgdy0+c2l6ZSk7CisgICAgfQorICAgIFdlYlBTYWZlRnJlZSh3LT5tZW0pOworICAgIHctPm1lbSA9IG5ld19tZW07CisgICAgLy8gZG93bi1jYXN0IGlzIG9rLCB0aGFua3MgdG8gV2ViUFNhZmVNYWxsb2MKKyAgICB3LT5tYXhfc2l6ZSA9IChzaXplX3QpbmV4dF9tYXhfc2l6ZTsKKyAgfQorICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgIG1lbWNweSh3LT5tZW0gKyB3LT5zaXplLCBkYXRhLCBkYXRhX3NpemUpOworICAgIHctPnNpemUgKz0gZGF0YV9zaXplOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIFdlYlBNZW1vcnlXcml0ZXJDbGVhcihXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpIHsKKyAgaWYgKHdyaXRlciAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKHdyaXRlci0+bWVtKTsKKyAgICB3cml0ZXItPm1lbSA9IE5VTEw7CisgICAgd3JpdGVyLT5zaXplID0gMDsKKyAgICB3cml0ZXItPm1heF9zaXplID0gMDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlc3QgaGlnaC1sZXZlbCBjYWxsczoKKwordHlwZWRlZiBpbnQgKCpJbXBvcnRlcikoV2ViUFBpY3R1cmUqIGNvbnN0LCBjb25zdCB1aW50OF90KiBjb25zdCwgaW50KTsKKworc3RhdGljIHNpemVfdCBFbmNvZGUoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgaW1wb3J0LCBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgaW50IGxvc3NsZXNzLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCkgeworICBXZWJQUGljdHVyZSBwaWM7CisgIFdlYlBDb25maWcgY29uZmlnOworICBXZWJQTWVtb3J5V3JpdGVyIHdydDsKKyAgaW50IG9rOworCisgIGlmIChvdXRwdXQgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKCFXZWJQQ29uZmlnUHJlc2V0KCZjb25maWcsIFdFQlBfUFJFU0VUX0RFRkFVTFQsIHF1YWxpdHlfZmFjdG9yKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmcGljKSkgeworICAgIHJldHVybiAwOyAgLy8gc2hvdWxkbid0IGhhcHBlbiwgZXhjZXB0IGlmIHN5c3RlbSBpbnN0YWxsYXRpb24gaXMgYnJva2VuCisgIH0KKworICBjb25maWcubG9zc2xlc3MgPSAhIWxvc3NsZXNzOworICBwaWMudXNlX2FyZ2IgPSAhIWxvc3NsZXNzOworICBwaWMud2lkdGggPSB3aWR0aDsKKyAgcGljLmhlaWdodCA9IGhlaWdodDsKKyAgcGljLndyaXRlciA9IFdlYlBNZW1vcnlXcml0ZTsKKyAgcGljLmN1c3RvbV9wdHIgPSAmd3J0OworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmd3J0KTsKKworICBvayA9IGltcG9ydCgmcGljLCByZ2JhLCBzdHJpZGUpICYmIFdlYlBFbmNvZGUoJmNvbmZpZywgJnBpYyk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljKTsKKyAgaWYgKCFvaykgeworICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmd3J0KTsKKyAgICAqb3V0cHV0ID0gTlVMTDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqb3V0cHV0ID0gd3J0Lm1lbTsKKyAgcmV0dXJuIHdydC5zaXplOworfQorCisjZGVmaW5lIEVOQ09ERV9GVU5DKE5BTUUsIElNUE9SVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzaXplX3QgTkFNRShjb25zdCB1aW50OF90KiBpbiwgaW50IHcsIGludCBoLCBpbnQgYnBzLCBmbG9hdCBxLCAgICAgICAgICBcCisgICAgICAgICAgICB1aW50OF90Kiogb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBFbmNvZGUoaW4sIHcsIGgsIGJwcywgSU1QT1JURVIsIHEsIDAsIG91dCk7ICAgICAgICAgICAgICAgICAgICBcCit9CisKK0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVSR0IsIFdlYlBQaWN0dXJlSW1wb3J0UkdCKQorRU5DT0RFX0ZVTkMoV2ViUEVuY29kZVJHQkEsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitFTkNPREVfRlVOQyhXZWJQRW5jb2RlQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUikKK0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVCR1JBLCBXZWJQUGljdHVyZUltcG9ydEJHUkEpCisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjdW5kZWYgRU5DT0RFX0ZVTkMKKworI2RlZmluZSBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFkgNzAuCisjZGVmaW5lIExPU1NMRVNTX0VOQ09ERV9GVU5DKE5BTUUsIElNUE9SVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3NpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgXAorICByZXR1cm4gRW5jb2RlKGluLCB3LCBoLCBicHMsIElNUE9SVEVSLCBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFksIDEsIG91dCk7ICBcCit9CisKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpCitMT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NSR0JBLCBXZWJQUGljdHVyZUltcG9ydFJHQkEpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUikKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSkKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBMT1NTTEVTU19FTkNPREVfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3BzbnJfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJmMGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3BzbnJfZW5jLmMKQEAgLTAsMCArMSwyNTggQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQUGljdHVyZSB0b29scyBmb3IgbWVhc3VyaW5nIGRpc3RvcnRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCisKKyNpZiAhKGRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKSB8fCBkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpKQorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKK3R5cGVkZWYgZG91YmxlICgqQWNjdW11bGF0ZUZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsLW1pbiBkaXN0b3J0aW9uCisvLworLy8gRm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSAqcmVmZXJlbmNlKiBwaWN0dXJlLCB3ZSBzZWFyY2ggZm9yIHRoZSBsb2NhbCBiZXN0CisvLyBtYXRjaCBpbiB0aGUgY29tcHJlc3NlZCBpbWFnZS4gVGhpcyBpcyBub3QgYSBzeW1tZXRyaWNhbCBtZWFzdXJlLgorCisjZGVmaW5lIFJBRElVUyAyICAvLyBzZWFyY2ggcmFkaXVzLiBTaG91bGRuJ3QgYmUgdG9vIGxhcmdlLgorCitzdGF0aWMgZG91YmxlIEFjY3VtdWxhdGVMU0lNKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICBpbnQgeCwgeTsKKyAgZG91YmxlIHRvdGFsX3NzZSA9IDAuOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgY29uc3QgaW50IHlfMCA9ICh5IC0gUkFESVVTIDwgMCkgPyAwIDogeSAtIFJBRElVUzsKKyAgICBjb25zdCBpbnQgeV8xID0gKHkgKyBSQURJVVMgKyAxID49IGgpID8gaCA6IHkgKyBSQURJVVMgKyAxOworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCB4XzAgPSAoeCAtIFJBRElVUyA8IDApID8gMCA6IHggLSBSQURJVVM7CisgICAgICBjb25zdCBpbnQgeF8xID0gKHggKyBSQURJVVMgKyAxID49IHcpID8gdyA6IHggKyBSQURJVVMgKyAxOworICAgICAgZG91YmxlIGJlc3Rfc3NlID0gMjU1LiAqIDI1NS47CisgICAgICBjb25zdCBkb3VibGUgdmFsdWUgPSAoZG91YmxlKXJlZlt5ICogcmVmX3N0cmlkZSArIHhdOworICAgICAgaW50IGksIGo7CisgICAgICBmb3IgKGogPSB5XzA7IGogPCB5XzE7ICsraikgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzID0gc3JjICsgaiAqIHNyY19zdHJpZGU7CisgICAgICAgIGZvciAoaSA9IHhfMDsgaSA8IHhfMTsgKytpKSB7CisgICAgICAgICAgY29uc3QgZG91YmxlIGRpZmYgPSBzW2ldIC0gdmFsdWU7CisgICAgICAgICAgY29uc3QgZG91YmxlIHNzZSA9IGRpZmYgKiBkaWZmOworICAgICAgICAgIGlmIChzc2UgPCBiZXN0X3NzZSkgYmVzdF9zc2UgPSBzc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRvdGFsX3NzZSArPSBiZXN0X3NzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NzZTsKK30KKyN1bmRlZiBSQURJVVMKKworc3RhdGljIGRvdWJsZSBBY2N1bXVsYXRlU1NFKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgaW50IHk7CisgIGRvdWJsZSB0b3RhbF9zc2UgPSAwLjsKKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIHRvdGFsX3NzZSArPSBWUDhBY2N1bXVsYXRlU1NFKHNyYywgcmVmLCB3KTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICByZWYgKz0gcmVmX3N0cmlkZTsKKyAgfQorICByZXR1cm4gdG90YWxfc3NlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlIEFjY3VtdWxhdGVTU0lNKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICBjb25zdCBpbnQgdzAgPSAodyA8IFZQOF9TU0lNX0tFUk5FTCkgPyB3IDogVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgdzEgPSB3IC0gVlA4X1NTSU1fS0VSTkVMIC0gMTsKKyAgY29uc3QgaW50IGgwID0gKGggPCBWUDhfU1NJTV9LRVJORUwpID8gaCA6IFZQOF9TU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IGgxID0gaCAtIFZQOF9TU0lNX0tFUk5FTCAtIDE7CisgIGludCB4LCB5OworICBkb3VibGUgc3VtID0gMC47CisgIGZvciAoeSA9IDA7IHkgPCBoMDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IHkgPCBoMTsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHcwOyArK3gpIHsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZChzcmMsIHNyY19zdHJpZGUsIHJlZiwgcmVmX3N0cmlkZSwgeCwgeSwgdywgaCk7CisgICAgfQorICAgIGZvciAoOyB4IDwgdzE7ICsreCkgeworICAgICAgY29uc3QgaW50IG9mZjEgPSB4IC0gVlA4X1NTSU1fS0VSTkVMICsgKHkgLSBWUDhfU1NJTV9LRVJORUwpICogc3JjX3N0cmlkZTsKKyAgICAgIGNvbnN0IGludCBvZmYyID0geCAtIFZQOF9TU0lNX0tFUk5FTCArICh5IC0gVlA4X1NTSU1fS0VSTkVMKSAqIHJlZl9zdHJpZGU7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldChzcmMgKyBvZmYxLCBzcmNfc3RyaWRlLCByZWYgKyBvZmYyLCByZWZfc3RyaWRlKTsKKyAgICB9CisgICAgZm9yICg7IHggPCB3OyArK3gpIHsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZChzcmMsIHNyY19zdHJpZGUsIHJlZiwgcmVmX3N0cmlkZSwgeCwgeSwgdywgaCk7CisgICAgfQorICB9CisgIGZvciAoOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3RvcnRpb24KKworLy8gTWF4IHZhbHVlIHJldHVybmVkIGluIGNhc2Ugb2YgZXhhY3Qgc2ltaWxhcml0eS4KK3N0YXRpYyBjb25zdCBkb3VibGUga01pbkRpc3RvcnRpb25fZEIgPSA5OS47CisKK3N0YXRpYyBkb3VibGUgR2V0UFNOUihkb3VibGUgdiwgZG91YmxlIHNpemUpIHsKKyAgcmV0dXJuICh2ID4gMC4gJiYgc2l6ZSA+IDAuKSA/IC00LjM0Mjk0NDggKiBsb2codiAvIChzaXplICogMjU1ICogMjU1LikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrTWluRGlzdG9ydGlvbl9kQjsKK30KKworc3RhdGljIGRvdWJsZSBHZXRMb2dTU0lNKGRvdWJsZSB2LCBkb3VibGUgc2l6ZSkgeworICB2ID0gKHNpemUgPiAwLikgPyB2IC8gc2l6ZSA6IDEuOworICByZXR1cm4gKHYgPCAxLikgPyAtMTAuMCAqIGxvZzEwKDEuIC0gdikgOiBrTWluRGlzdG9ydGlvbl9kQjsKK30KKworaW50IFdlYlBQbGFuZURpc3RvcnRpb24oY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgc2l6ZV90IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHNpemVfdCB4X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQqIGRpc3RvcnRpb24sIGZsb2F0KiByZXN1bHQpIHsKKyAgdWludDhfdCogYWxsb2NhdGVkID0gTlVMTDsKKyAgY29uc3QgQWNjdW11bGF0ZUZ1bmMgbWV0cmljID0gKHR5cGUgPT0gMCkgPyBBY2N1bXVsYXRlU1NFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMSkgPyBBY2N1bXVsYXRlU1NJTSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjdW11bGF0ZUxTSU07CisgIGlmIChzcmMgPT0gTlVMTCB8fCByZWYgPT0gTlVMTCB8fAorICAgICAgc3JjX3N0cmlkZSA8IHhfc3RlcCAqIHdpZHRoIHx8IHJlZl9zdHJpZGUgPCB4X3N0ZXAgKiB3aWR0aCB8fAorICAgICAgcmVzdWx0ID09IE5VTEwgfHwgZGlzdG9ydGlvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBWUDhTU0lNRHNwSW5pdCgpOworICBpZiAoeF9zdGVwICE9IDEpIHsgICAvLyBleHRyYWN0IGEgcGFja2VkIHBsYW5lIGlmIG5lZWRlZAorICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QqIHRtcDE7CisgICAgdWludDhfdCogdG1wMjsKKyAgICBhbGxvY2F0ZWQgPQorICAgICAgICAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoICogaGVpZ2h0LCBzaXplb2YoKmFsbG9jYXRlZCkpOworICAgIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgdG1wMSA9IGFsbG9jYXRlZDsKKyAgICB0bXAyID0gdG1wMSArIChzaXplX3Qpd2lkdGggKiBoZWlnaHQ7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICB0bXAxW3ggKyB5ICogd2lkdGhdID0gc3JjW3ggKiB4X3N0ZXAgKyB5ICogc3JjX3N0cmlkZV07CisgICAgICAgIHRtcDJbeCArIHkgKiB3aWR0aF0gPSByZWZbeCAqIHhfc3RlcCArIHkgKiByZWZfc3RyaWRlXTsKKyAgICAgIH0KKyAgICB9CisgICAgc3JjID0gdG1wMTsKKyAgICByZWYgPSB0bXAyOworICB9CisgICpkaXN0b3J0aW9uID0gKGZsb2F0KW1ldHJpYyhzcmMsIHdpZHRoLCByZWYsIHdpZHRoLCB3aWR0aCwgaGVpZ2h0KTsKKyAgV2ViUFNhZmVGcmVlKGFsbG9jYXRlZCk7CisKKyAgKnJlc3VsdCA9ICh0eXBlID09IDEpID8gKGZsb2F0KUdldExvZ1NTSU0oKmRpc3RvcnRpb24sIChkb3VibGUpd2lkdGggKiBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICA6IChmbG9hdClHZXRQU05SKCpkaXN0b3J0aW9uLCAoZG91YmxlKXdpZHRoICogaGVpZ2h0KTsKKyAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgQkxVRV9PRkZTRVQgMyAgIC8vIHVpbnQzMl90IDB4MDAwMDAwZmYgaXMgMHgwMCwwMCwwMCxmZiBpbiBtZW1vcnkKKyNlbHNlCisjZGVmaW5lIEJMVUVfT0ZGU0VUIDAgICAvLyB1aW50MzJfdCAweDAwMDAwMGZmIGlzIDB4ZmYsMDAsMDAsMDAgaW4gbWVtb3J5CisjZW5kaWYKKworaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbihjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQgcmVzdWx0c1s1XSkgeworICBpbnQgdywgaCwgYzsKKyAgaW50IG9rID0gMDsKKyAgV2ViUFBpY3R1cmUgcDAsIHAxOworICBkb3VibGUgdG90YWxfc2l6ZSA9IDAuLCB0b3RhbF9kaXN0b3J0aW9uID0gMC47CisgIGlmIChzcmMgPT0gTlVMTCB8fCByZWYgPT0gTlVMTCB8fAorICAgICAgc3JjLT53aWR0aCAhPSByZWYtPndpZHRoIHx8IHNyYy0+aGVpZ2h0ICE9IHJlZi0+aGVpZ2h0IHx8CisgICAgICByZXN1bHRzID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFZQOFNTSU1Ec3BJbml0KCk7CisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZwMCkgfHwgIVdlYlBQaWN0dXJlSW5pdCgmcDEpKSByZXR1cm4gMDsKKyAgdyA9IHNyYy0+d2lkdGg7CisgIGggPSBzcmMtPmhlaWdodDsKKyAgaWYgKCFXZWJQUGljdHVyZVZpZXcoc3JjLCAwLCAwLCB3LCBoLCAmcDApKSBnb3RvIEVycm9yOworICBpZiAoIVdlYlBQaWN0dXJlVmlldyhyZWYsIDAsIDAsIHcsIGgsICZwMSkpIGdvdG8gRXJyb3I7CisKKyAgLy8gV2UgYWx3YXlzIG1lYXN1cmUgZGlzdG9ydGlvbiBpbiBBUkdCIHNwYWNlLgorICBpZiAocDAudXNlX2FyZ2IgPT0gMCAmJiAhV2ViUFBpY3R1cmVZVVZBVG9BUkdCKCZwMCkpIGdvdG8gRXJyb3I7CisgIGlmIChwMS51c2VfYXJnYiA9PSAwICYmICFXZWJQUGljdHVyZVlVVkFUb0FSR0IoJnAxKSkgZ290byBFcnJvcjsKKyAgZm9yIChjID0gMDsgYyA8IDQ7ICsrYykgeworICAgIGZsb2F0IGRpc3RvcnRpb247CisgICAgY29uc3Qgc2l6ZV90IHN0cmlkZTAgPSA0ICogKHNpemVfdClwMC5hcmdiX3N0cmlkZTsKKyAgICBjb25zdCBzaXplX3Qgc3RyaWRlMSA9IDQgKiAoc2l6ZV90KXAxLmFyZ2Jfc3RyaWRlOworICAgIC8vIHJlc3VsdHMgYXJlIHJlcG9ydGVkIGFzIEJHUkEKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gYyBeIEJMVUVfT0ZGU0VUOworICAgIGlmICghV2ViUFBsYW5lRGlzdG9ydGlvbigoY29uc3QgdWludDhfdCopcDAuYXJnYiArIG9mZnNldCwgc3RyaWRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXAxLmFyZ2IgKyBvZmZzZXQsIHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIDQsIHR5cGUsICZkaXN0b3J0aW9uLCByZXN1bHRzICsgYykpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIHRvdGFsX2Rpc3RvcnRpb24gKz0gZGlzdG9ydGlvbjsKKyAgICB0b3RhbF9zaXplICs9IHcgKiBoOworICB9CisKKyAgcmVzdWx0c1s0XSA9ICh0eXBlID09IDEpID8gKGZsb2F0KUdldExvZ1NTSU0odG90YWxfZGlzdG9ydGlvbiwgdG90YWxfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGZsb2F0KUdldFBTTlIodG90YWxfZGlzdG9ydGlvbiwgdG90YWxfc2l6ZSk7CisgIG9rID0gMTsKKworIEVycm9yOgorICBXZWJQUGljdHVyZUZyZWUoJnAwKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwMSk7CisgIHJldHVybiBvazsKK30KKworI3VuZGVmIEJMVUVfT0ZGU0VUCisKKyNlbHNlICAvLyBkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK2ludCBXZWJQUGxhbmVEaXN0b3J0aW9uKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIHNpemVfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBzaXplX3QgeF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGZsb2F0KiBkaXN0b3J0aW9uLCBmbG9hdCogcmVzdWx0KSB7CisgICh2b2lkKXNyYzsKKyAgKHZvaWQpc3JjX3N0cmlkZTsKKyAgKHZvaWQpcmVmOworICAodm9pZClyZWZfc3RyaWRlOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICAodm9pZCl4X3N0ZXA7CisgICh2b2lkKXR5cGU7CisgIGlmIChkaXN0b3J0aW9uID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHJldHVybiAwOworICAqZGlzdG9ydGlvbiA9IDAuZjsKKyAgKnJlc3VsdCA9IDAuZjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZURpc3RvcnRpb24oY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgY29uc3QgV2ViUFBpY3R1cmUqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGZsb2F0IHJlc3VsdHNbNV0pIHsKKyAgaW50IGk7CisgICh2b2lkKXNyYzsKKyAgKHZvaWQpcmVmOworICAodm9pZCl0eXBlOworICBpZiAocmVzdWx0cyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgcmVzdWx0c1tpXSA9IDAuZjsKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3Jlc2NhbGVfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE2YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3Jlc2NhbGVfZW5jLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQUGljdHVyZSB0b29sczogY29weSwgY3JvcCwgcmVzY2FsaW5nIGFuZCB2aWV3LgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBIQUxWRSh4KSAoKCh4KSArIDEpID4+IDEpCisKKy8vIEdyYWIgdGhlICdzcGVjcycgKHdyaXRlciwgKm9wYXF1ZSwgd2lkdGgsIGhlaWdodC4uLikgZnJvbSAnc3JjJyBhbmQgY29weSB0aGVtCisvLyBpbnRvICdkc3QnLiBNYXJrICdkc3QnIGFzIG5vdCBvd25pbmcgYW55IG1lbW9yeS4KK3N0YXRpYyB2b2lkIFBpY3R1cmVHcmFiU3BlY3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICAqZHN0ID0gKnNyYzsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQWRqdXN0IHRvcC1sZWZ0IGNvcm5lciB0byBjaHJvbWEgc2FtcGxlIHBvc2l0aW9uLgorc3RhdGljIHZvaWQgU25hcFRvcExlZnRQb3NpdGlvbihjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQsIGludCogY29uc3QgdG9wKSB7CisgIGlmICghcGljLT51c2VfYXJnYikgeworICAgICpsZWZ0ICY9IH4xOworICAgICp0b3AgJj0gfjE7CisgIH0KK30KKworLy8gQWRqdXN0IHRvcC1sZWZ0IGNvcm5lciBhbmQgdmVyaWZ5IHRoYXQgdGhlIHN1Yi1yZWN0YW5nbGUgaXMgdmFsaWQuCitzdGF0aWMgaW50IEFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdCwgaW50KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBTbmFwVG9wTGVmdFBvc2l0aW9uKHBpYywgbGVmdCwgdG9wKTsKKyAgaWYgKCgqbGVmdCkgPCAwIHx8ICgqdG9wKSA8IDApIHJldHVybiAwOworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuIDA7CisgIGlmICgoKmxlZnQpICsgd2lkdGggPiBwaWMtPndpZHRoKSByZXR1cm4gMDsKKyAgaWYgKCgqdG9wKSArIGhlaWdodCA+IHBpYy0+aGVpZ2h0KSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUNvcHkoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgV2ViUFBpY3R1cmUqIGRzdCkgeworICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHJldHVybiAwOworICBpZiAoc3JjID09IGRzdCkgcmV0dXJuIDE7CisKKyAgUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhkc3QpKSByZXR1cm4gMDsKKworICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+eSwgc3JjLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGRzdC0+eSwgZHN0LT55X3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwgZHN0LT51LCBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIEhBTFZFKGRzdC0+d2lkdGgpLCBIQUxWRShkc3QtPmhlaWdodCkpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT52LCBzcmMtPnV2X3N0cmlkZSwgZHN0LT52LCBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIEhBTFZFKGRzdC0+d2lkdGgpLCBIQUxWRShkc3QtPmhlaWdodCkpOworICAgIGlmIChkc3QtPmEgIT0gTlVMTCkgIHsKKyAgICAgIFdlYlBDb3B5UGxhbmUoc3JjLT5hLCBzcmMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmEsIGRzdC0+YV9zdHJpZGUsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgV2ViUENvcHlQbGFuZSgoY29uc3QgdWludDhfdCopc3JjLT5hcmdiLCA0ICogc3JjLT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICh1aW50OF90Kilkc3QtPmFyZ2IsIDQgKiBkc3QtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgNCAqIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlSXNWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOworICBpZiAocGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICByZXR1cm4gKHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9PSBOVUxMKTsKKyAgfQorICByZXR1cm4gKHBpY3R1cmUtPm1lbW9yeV8gPT0gTlVMTCk7Cit9CisKK2ludCBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCkgeworICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHJldHVybiAwOworCisgIC8vIHZlcmlmeSByZWN0YW5nbGUgcG9zaXRpb24uCisgIGlmICghQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUoc3JjLCAmbGVmdCwgJnRvcCwgd2lkdGgsIGhlaWdodCkpIHJldHVybiAwOworCisgIGlmIChzcmMgIT0gZHN0KSB7ICAvLyBiZXdhcmUgb2YgYWxpYXNpbmchIFdlIGRvbid0IHdhbnQgdG8gbGVhayAnbWVtb3J5XycuCisgICAgUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7CisgIH0KKyAgZHN0LT53aWR0aCA9IHdpZHRoOworICBkc3QtPmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFzcmMtPnVzZV9hcmdiKSB7CisgICAgZHN0LT55ID0gc3JjLT55ICsgdG9wICogc3JjLT55X3N0cmlkZSArIGxlZnQ7CisgICAgZHN0LT51ID0gc3JjLT51ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7CisgICAgZHN0LT52ID0gc3JjLT52ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7CisgICAgZHN0LT55X3N0cmlkZSA9IHNyYy0+eV9zdHJpZGU7CisgICAgZHN0LT51dl9zdHJpZGUgPSBzcmMtPnV2X3N0cmlkZTsKKyAgICBpZiAoc3JjLT5hICE9IE5VTEwpIHsKKyAgICAgIGRzdC0+YSA9IHNyYy0+YSArIHRvcCAqIHNyYy0+YV9zdHJpZGUgKyBsZWZ0OworICAgICAgZHN0LT5hX3N0cmlkZSA9IHNyYy0+YV9zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGRzdC0+YXJnYiA9IHNyYy0+YXJnYiArIHRvcCAqIHNyYy0+YXJnYl9zdHJpZGUgKyBsZWZ0OworICAgIGRzdC0+YXJnYl9zdHJpZGUgPSBzcmMtPmFyZ2Jfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGljdHVyZSBjcm9wcGluZworCitpbnQgV2ViUFBpY3R1cmVDcm9wKFdlYlBQaWN0dXJlKiBwaWMsCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUFBpY3R1cmUgdG1wOworCisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmICghQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUocGljLCAmbGVmdCwgJnRvcCwgd2lkdGgsIGhlaWdodCkpIHJldHVybiAwOworCisgIFBpY3R1cmVHcmFiU3BlY3MocGljLCAmdG1wKTsKKyAgdG1wLndpZHRoID0gd2lkdGg7CisgIHRtcC5oZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgcmV0dXJuIDA7CisKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgaW50IHlfb2Zmc2V0ID0gdG9wICogcGljLT55X3N0cmlkZSArIGxlZnQ7CisgICAgY29uc3QgaW50IHV2X29mZnNldCA9ICh0b3AgLyAyKSAqIHBpYy0+dXZfc3RyaWRlICsgbGVmdCAvIDI7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnkgKyB5X29mZnNldCwgcGljLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC55LCB0bXAueV9zdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgIFdlYlBDb3B5UGxhbmUocGljLT51ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC51LCB0bXAudXZfc3RyaWRlLCBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCkpOworICAgIFdlYlBDb3B5UGxhbmUocGljLT52ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC52LCB0bXAudXZfc3RyaWRlLCBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCkpOworCisgICAgaWYgKHRtcC5hICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IGludCBhX29mZnNldCA9IHRvcCAqIHBpYy0+YV9zdHJpZGUgKyBsZWZ0OworICAgICAgV2ViUENvcHlQbGFuZShwaWMtPmEgKyBhX29mZnNldCwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgdG1wLmEsIHRtcC5hX3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9CisgICAgICAgIChjb25zdCB1aW50OF90KikocGljLT5hcmdiICsgdG9wICogcGljLT5hcmdiX3N0cmlkZSArIGxlZnQpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLCBwaWMtPmFyZ2Jfc3RyaWRlICogNCwgKHVpbnQ4X3QqKXRtcC5hcmdiLAorICAgICAgICAgICAgICAgICAgdG1wLmFyZ2Jfc3RyaWRlICogNCwgd2lkdGggKiA0LCBoZWlnaHQpOworICB9CisgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICAqcGljID0gdG1wOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBwaWN0dXJlIHJlc2NhbGVyCisKK3N0YXRpYyB2b2lkIFJlc2NhbGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZXJfdCogY29uc3Qgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKSB7CisgIFdlYlBSZXNjYWxlciByZXNjYWxlcjsKKyAgaW50IHkgPSAwOworICBXZWJQUmVzY2FsZXJJbml0KCZyZXNjYWxlciwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVscywgd29yayk7CisgIHdoaWxlICh5IDwgc3JjX2hlaWdodCkgeworICAgIHkgKz0gV2ViUFJlc2NhbGVySW1wb3J0KCZyZXNjYWxlciwgc3JjX2hlaWdodCAtIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgeSAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydCgmcmVzY2FsZXIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhTXVsdGlwbHlBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBpbnZlcnNlKSB7CisgIGFzc2VydChwaWMtPmFyZ2IgIT0gTlVMTCk7CisgIFdlYlBNdWx0QVJHQlJvd3MoKHVpbnQ4X3QqKXBpYy0+YXJnYiwgcGljLT5hcmdiX3N0cmlkZSAqIHNpemVvZigqcGljLT5hcmdiKSwKKyAgICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwgaW52ZXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhTXVsdGlwbHlZKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBpbnZlcnNlKSB7CisgIGlmIChwaWMtPmEgIT0gTlVMTCkgeworICAgIFdlYlBNdWx0Um93cyhwaWMtPnksIHBpYy0+eV9zdHJpZGUsIHBpYy0+YSwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgcGljLT53aWR0aCwgcGljLT5oZWlnaHQsIGludmVyc2UpOworICB9Cit9CisKK2ludCBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFdlYlBQaWN0dXJlIHRtcDsKKyAgaW50IHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0OworICByZXNjYWxlcl90KiB3b3JrOworCisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHByZXZfd2lkdGggPSBwaWMtPndpZHRoOworICBwcmV2X2hlaWdodCA9IHBpYy0+aGVpZ2h0OworICBpZiAoIVdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnMoCisgICAgICAgICAgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFBpY3R1cmVHcmFiU3BlY3MocGljLCAmdG1wKTsKKyAgdG1wLndpZHRoID0gd2lkdGg7CisgIHRtcC5oZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgcmV0dXJuIDA7CisKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgd29yayA9IChyZXNjYWxlcl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGgsIHNpemVvZigqd29yaykpOworICAgIGlmICh3b3JrID09IE5VTEwpIHsKKyAgICAgIFdlYlBQaWN0dXJlRnJlZSgmdG1wKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBJZiBwcmVzZW50LCB3ZSBuZWVkIHRvIHJlc2NhbGUgYWxwaGEgZmlyc3QgKGZvciBBbHBoYU11bHRpcGx5WSkuCisgICAgaWYgKHBpYy0+YSAhPSBOVUxMKSB7CisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgICAgUmVzY2FsZVBsYW5lKHBpYy0+YSwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsIHBpYy0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgdG1wLmEsIHdpZHRoLCBoZWlnaHQsIHRtcC5hX3N0cmlkZSwgd29yaywgMSk7CisgICAgfQorCisgICAgLy8gV2UgdGFrZSB0cmFuc3BhcmVuY3kgaW50byBhY2NvdW50IG9uIHRoZSBsdW1hIHBsYW5lIG9ubHkuIFRoYXQncyBub3QKKyAgICAvLyB0b3RhbGx5IGV4YWN0IGJsZW5kaW5nLCBidXQgc3RpbGwgaXMgYSBnb29kIGFwcHJveGltYXRpb24uCisgICAgQWxwaGFNdWx0aXBseVkocGljLCAwKTsKKyAgICBSZXNjYWxlUGxhbmUocGljLT55LCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnksIHdpZHRoLCBoZWlnaHQsIHRtcC55X3N0cmlkZSwgd29yaywgMSk7CisgICAgQWxwaGFNdWx0aXBseVkoJnRtcCwgMSk7CisKKyAgICBSZXNjYWxlUGxhbmUocGljLT51LAorICAgICAgICAgICAgICAgICBIQUxWRShwcmV2X3dpZHRoKSwgSEFMVkUocHJldl9oZWlnaHQpLCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnUsCisgICAgICAgICAgICAgICAgIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSwgdG1wLnV2X3N0cmlkZSwgd29yaywgMSk7CisgICAgUmVzY2FsZVBsYW5lKHBpYy0+diwKKyAgICAgICAgICAgICAgICAgSEFMVkUocHJldl93aWR0aCksIEhBTFZFKHByZXZfaGVpZ2h0KSwgcGljLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgIHRtcC52LAorICAgICAgICAgICAgICAgICBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCksIHRtcC51dl9zdHJpZGUsIHdvcmssIDEpOworICB9IGVsc2UgeworICAgIHdvcmsgPSAocmVzY2FsZXJfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoICogNCwgc2l6ZW9mKCp3b3JrKSk7CisgICAgaWYgKHdvcmsgPT0gTlVMTCkgeworICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEluIG9yZGVyIHRvIGNvcnJlY3RseSBpbnRlcnBvbGF0ZSBjb2xvcnMsIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGFscGhhCisgICAgLy8gd2VpZ2h0aW5nIGZpcnN0IChibGFjay1tYXR0aW5nKSwgc2NhbGUgdGhlIFJHQiB2YWx1ZXMsIGFuZCByZW1vdmUKKyAgICAvLyB0aGUgcHJlbXVsdGlwbGljYXRpb24gYWZ0ZXJ3YXJkICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsKS4KKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgIEFscGhhTXVsdGlwbHlBUkdCKHBpYywgMCk7CisgICAgUmVzY2FsZVBsYW5lKChjb25zdCB1aW50OF90KilwaWMtPmFyZ2IsIHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0LAorICAgICAgICAgICAgICAgICBwaWMtPmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXRtcC5hcmdiLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICB0bXAuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICB3b3JrLCA0KTsKKyAgICBBbHBoYU11bHRpcGx5QVJHQigmdG1wLCAxKTsKKyAgfQorICBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgV2ViUFNhZmVGcmVlKHdvcmspOworICAqcGljID0gdG1wOworICByZXR1cm4gMTsKK30KKworI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KSB7CisgICh2b2lkKXNyYzsKKyAgKHZvaWQpZHN0OworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBQaWN0dXJlSXNWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgICh2b2lkKXBpY3R1cmU7CisgIHJldHVybiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClsZWZ0OworICAodm9pZCl0b3A7CisgICh2b2lkKXdpZHRoOworICAodm9pZCloZWlnaHQ7CisgICh2b2lkKWRzdDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAodm9pZClwaWM7CisgICh2b2lkKWxlZnQ7CisgICh2b2lkKXRvcDsKKyAgKHZvaWQpd2lkdGg7CisgICh2b2lkKWhlaWdodDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpd2lkdGg7CisgICh2b2lkKWhlaWdodDsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfdG9vbHNfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfdG9vbHNfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkYzZjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYwpAQCAtMCwwICsxLDI3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzOiBhbHBoYSBoYW5kbGluZywgZXRjLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE1ha2VBUkdCMzIoaW50IHIsIGludCBnLCBpbnQgYikgeworICByZXR1cm4gKDB4ZmYwMDAwMDB1IHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlcjogY2xlYW4gdXAgZnVsbHkgdHJhbnNwYXJlbnQgYXJlYSB0byBoZWxwIGNvbXByZXNzaWJpbGl0eS4KKworI2RlZmluZSBTSVpFIDgKKyNkZWZpbmUgU0laRTIgKFNJWkUgLyAyKQorc3RhdGljIGludCBJc1RyYW5zcGFyZW50QVJHQkFyZWEoY29uc3QgdWludDMyX3QqIHB0ciwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKKyAgaW50IHksIHg7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7CisgICAgICBpZiAocHRyW3hdICYgMHhmZjAwMDAwMHUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIHB0ciArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEZsYXR0ZW4odWludDhfdCogcHRyLCBpbnQgdiwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBtZW1zZXQocHRyLCB2LCBzaXplKTsKKyAgICBwdHIgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZsYXR0ZW5BUkdCKHVpbnQzMl90KiBwdHIsIHVpbnQzMl90IHYsIGludCBzdHJpZGUsIGludCBzaXplKSB7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7ICsreCkgcHRyW3hdID0gdjsKKyAgICBwdHIgKz0gc3RyaWRlOworICB9Cit9CisKKy8vIFNtb290aGVuIHRoZSBsdW1hIGNvbXBvbmVudHMgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgd2hvbGUKKy8vIGJsb2NrIGlzIHRyYW5zcGFyZW50Lgorc3RhdGljIGludCBTbW9vdGhlbkJsb2NrKGNvbnN0IHVpbnQ4X3QqIGFfcHRyLCBpbnQgYV9zdHJpZGUsIHVpbnQ4X3QqIHlfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBzdW0gPSAwLCBjb3VudCA9IDA7CisgIGludCB4LCB5OworICBjb25zdCB1aW50OF90KiBhbHBoYV9wdHIgPSBhX3B0cjsKKyAgdWludDhfdCogbHVtYV9wdHIgPSB5X3B0cjsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgIGlmIChhbHBoYV9wdHJbeF0gIT0gMCkgeworICAgICAgICArK2NvdW50OworICAgICAgICBzdW0gKz0gbHVtYV9wdHJbeF07CisgICAgICB9CisgICAgfQorICAgIGFscGhhX3B0ciArPSBhX3N0cmlkZTsKKyAgICBsdW1hX3B0ciArPSB5X3N0cmlkZTsKKyAgfQorICBpZiAoY291bnQgPiAwICYmIGNvdW50IDwgd2lkdGggKiBoZWlnaHQpIHsKKyAgICBjb25zdCB1aW50OF90IGF2Z191OCA9ICh1aW50OF90KShzdW0gLyBjb3VudCk7CisgICAgYWxwaGFfcHRyID0gYV9wdHI7CisgICAgbHVtYV9wdHIgPSB5X3B0cjsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIGlmIChhbHBoYV9wdHJbeF0gPT0gMCkgbHVtYV9wdHJbeF0gPSBhdmdfdTg7CisgICAgICB9CisgICAgICBhbHBoYV9wdHIgKz0gYV9zdHJpZGU7CisgICAgICBsdW1hX3B0ciArPSB5X3N0cmlkZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudCA9PSAwKTsKK30KKwordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB4LCB5LCB3LCBoOworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgdyA9IHBpYy0+d2lkdGggLyBTSVpFOworICBoID0gcGljLT5oZWlnaHQgLyBTSVpFOworCisgIC8vIG5vdGU6IHdlIGlnbm9yZSB0aGUgbGVmdC1vdmVycyBvbiByaWdodC9ib3R0b20sIGV4Y2VwdCBmb3IgU21vb3RoZW5CbG9jaygpLgorICBpZiAocGljLT51c2VfYXJnYikgeworICAgIHVpbnQzMl90IGFyZ2JfdmFsdWUgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICAgIGludCBuZWVkX3Jlc2V0ID0gMTsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IG9mZiA9ICh5ICogcGljLT5hcmdiX3N0cmlkZSArIHgpICogU0laRTsKKyAgICAgICAgaWYgKElzVHJhbnNwYXJlbnRBUkdCQXJlYShwaWMtPmFyZ2IgKyBvZmYsIHBpYy0+YXJnYl9zdHJpZGUsIFNJWkUpKSB7CisgICAgICAgICAgaWYgKG5lZWRfcmVzZXQpIHsKKyAgICAgICAgICAgIGFyZ2JfdmFsdWUgPSBwaWMtPmFyZ2Jbb2ZmXTsKKyAgICAgICAgICAgIG5lZWRfcmVzZXQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGbGF0dGVuQVJHQihwaWMtPmFyZ2IgKyBvZmYsIGFyZ2JfdmFsdWUsIHBpYy0+YXJnYl9zdHJpZGUsIFNJWkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5lZWRfcmVzZXQgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICAgIGNvbnN0IGludCB5X3N0cmlkZSA9IHBpYy0+eV9zdHJpZGU7CisgICAgY29uc3QgaW50IHV2X3N0cmlkZSA9IHBpYy0+dXZfc3RyaWRlOworICAgIGNvbnN0IGludCBhX3N0cmlkZSA9IHBpYy0+YV9zdHJpZGU7CisgICAgdWludDhfdCogeV9wdHIgPSBwaWMtPnk7CisgICAgdWludDhfdCogdV9wdHIgPSBwaWMtPnU7CisgICAgdWludDhfdCogdl9wdHIgPSBwaWMtPnY7CisgICAgY29uc3QgdWludDhfdCogYV9wdHIgPSBwaWMtPmE7CisgICAgaW50IHZhbHVlc1szXSA9IHsgMCB9OworICAgIGlmIChhX3B0ciA9PSBOVUxMIHx8IHlfcHRyID09IE5VTEwgfHwgdV9wdHIgPT0gTlVMTCB8fCB2X3B0ciA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoeSA9IDA7IHkgKyBTSVpFIDw9IGhlaWdodDsgeSArPSBTSVpFKSB7CisgICAgICBpbnQgbmVlZF9yZXNldCA9IDE7CisgICAgICBmb3IgKHggPSAwOyB4ICsgU0laRSA8PSB3aWR0aDsgeCArPSBTSVpFKSB7CisgICAgICAgIGlmIChTbW9vdGhlbkJsb2NrKGFfcHRyICsgeCwgYV9zdHJpZGUsIHlfcHRyICsgeCwgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUsIFNJWkUpKSB7CisgICAgICAgICAgaWYgKG5lZWRfcmVzZXQpIHsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IHlfcHRyW3hdOworICAgICAgICAgICAgdmFsdWVzWzFdID0gdV9wdHJbeCA+PiAxXTsKKyAgICAgICAgICAgIHZhbHVlc1syXSA9IHZfcHRyW3ggPj4gMV07CisgICAgICAgICAgICBuZWVkX3Jlc2V0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgRmxhdHRlbih5X3B0ciArIHgsICAgICAgICB2YWx1ZXNbMF0sIHlfc3RyaWRlLCAgU0laRSk7CisgICAgICAgICAgRmxhdHRlbih1X3B0ciArICh4ID4+IDEpLCB2YWx1ZXNbMV0sIHV2X3N0cmlkZSwgU0laRTIpOworICAgICAgICAgIEZsYXR0ZW4odl9wdHIgKyAoeCA+PiAxKSwgdmFsdWVzWzJdLCB1dl9zdHJpZGUsIFNJWkUyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZWVkX3Jlc2V0ID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICBTbW9vdGhlbkJsb2NrKGFfcHRyICsgeCwgYV9zdHJpZGUsIHlfcHRyICsgeCwgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSB4LCBTSVpFKTsKKyAgICAgIH0KKyAgICAgIGFfcHRyICs9IFNJWkUgKiBhX3N0cmlkZTsKKyAgICAgIHlfcHRyICs9IFNJWkUgKiB5X3N0cmlkZTsKKyAgICAgIHVfcHRyICs9IFNJWkUyICogdXZfc3RyaWRlOworICAgICAgdl9wdHIgKz0gU0laRTIgKiB1dl9zdHJpZGU7CisgICAgfQorICAgIGlmICh5IDwgaGVpZ2h0KSB7CisgICAgICBjb25zdCBpbnQgc3ViX2hlaWdodCA9IGhlaWdodCAtIHk7CisgICAgICBmb3IgKHggPSAwOyB4ICsgU0laRSA8PSB3aWR0aDsgeCArPSBTSVpFKSB7CisgICAgICAgIFNtb290aGVuQmxvY2soYV9wdHIgKyB4LCBhX3N0cmlkZSwgeV9wdHIgKyB4LCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBTSVpFLCBzdWJfaGVpZ2h0KTsKKyAgICAgIH0KKyAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgU21vb3RoZW5CbG9jayhhX3B0ciArIHgsIGFfc3RyaWRlLCB5X3B0ciArIHgsIHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0geCwgc3ViX2hlaWdodCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBTSVpFCisjdW5kZWYgU0laRTIKKwordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYUxvc3NsZXNzKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgaW50IHgsIHksIHcsIGg7CisgIHVpbnQzMl90KiBhcmdiOworICBhc3NlcnQocGljICE9IE5VTEwgJiYgcGljLT51c2VfYXJnYik7CisgIHcgPSBwaWMtPndpZHRoOworICBoID0gcGljLT5oZWlnaHQ7CisgIGFyZ2IgPSBwaWMtPmFyZ2I7CisKKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGlmICgoYXJnYlt4XSAmIDB4ZmYwMDAwMDApID09IDApIHsKKyAgICAgICAgYXJnYlt4XSA9IDB4MDAwMDAwMDA7CisgICAgICB9CisgICAgfQorICAgIGFyZ2IgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmxlbmQgY29sb3IgYW5kIHJlbW92ZSB0cmFuc3BhcmVuY3kgaW5mbworCisjZGVmaW5lIEJMRU5EKFYwLCBWMSwgQUxQSEEpIFwKKyAgICAoKCgoVjApICogKDI1NSAtIChBTFBIQSkpICsgKFYxKSAqIChBTFBIQSkpICogMHgxMDEgKyAyNTYpID4+IDE2KQorI2RlZmluZSBCTEVORF8xMEJJVChWMCwgVjEsIEFMUEhBKSBcCisgICAgKCgoKFYwKSAqICgxMDIwIC0gKEFMUEhBKSkgKyAoVjEpICogKEFMUEhBKSkgKiAweDEwMSArIDEwMjQpID4+IDE4KQorCit2b2lkIFdlYlBCbGVuZEFscGhhKFdlYlBQaWN0dXJlKiBwaWMsIHVpbnQzMl90IGJhY2tncm91bmRfcmdiKSB7CisgIGNvbnN0IGludCByZWQgPSAoYmFja2dyb3VuZF9yZ2IgPj4gMTYpICYgMHhmZjsKKyAgY29uc3QgaW50IGdyZWVuID0gKGJhY2tncm91bmRfcmdiID4+IDgpICYgMHhmZjsKKyAgY29uc3QgaW50IGJsdWUgPSAoYmFja2dyb3VuZF9yZ2IgPj4gMCkgJiAweGZmOworICBpbnQgeCwgeTsKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm47CisgIGlmICghcGljLT51c2VfYXJnYikgeworICAgIGNvbnN0IGludCB1dl93aWR0aCA9IChwaWMtPndpZHRoID4+IDEpOyAgLy8gb21pdCBsYXN0IHBpeGVsIGR1cmluZyB1L3YgbG9vcAorICAgIGNvbnN0IGludCBZMCA9IFZQOFJHQlRvWShyZWQsIGdyZWVuLCBibHVlLCBZVVZfSEFMRik7CisgICAgLy8gVlA4UkdCVG9VL1YgZXhwZWN0cyB0aGUgdS92IHZhbHVlcyBzdW1tZWQgb3ZlciBmb3VyIHBpeGVscworICAgIGNvbnN0IGludCBVMCA9IFZQOFJHQlRvVSg0ICogcmVkLCA0ICogZ3JlZW4sIDQgKiBibHVlLCA0ICogWVVWX0hBTEYpOworICAgIGNvbnN0IGludCBWMCA9IFZQOFJHQlRvVig0ICogcmVkLCA0ICogZ3JlZW4sIDQgKiBibHVlLCA0ICogWVVWX0hBTEYpOworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBwaWMtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQ7CisgICAgaWYgKCFoYXNfYWxwaGEgfHwgcGljLT5hID09IE5VTEwpIHJldHVybjsgICAgLy8gbm90aGluZyB0byBkbworICAgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgICAvLyBMdW1hIGJsZW5kaW5nCisgICAgICB1aW50OF90KiBjb25zdCB5X3B0ciA9IHBpYy0+eSArIHkgKiBwaWMtPnlfc3RyaWRlOworICAgICAgdWludDhfdCogY29uc3QgYV9wdHIgPSBwaWMtPmEgKyB5ICogcGljLT5hX3N0cmlkZTsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGFscGhhID0gYV9wdHJbeF07CisgICAgICAgIGlmIChhbHBoYSA8IDB4ZmYpIHsKKyAgICAgICAgICB5X3B0clt4XSA9IEJMRU5EKFkwLCB5X3B0clt4XSwgYV9wdHJbeF0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBDaHJvbWEgYmxlbmRpbmcgZXZlcnkgZXZlbiBsaW5lCisgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHUgPSBwaWMtPnUgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgICB1aW50OF90KiBjb25zdCB2ID0gcGljLT52ICsgKHkgPj4gMSkgKiBwaWMtPnV2X3N0cmlkZTsKKyAgICAgICAgdWludDhfdCogY29uc3QgYV9wdHIyID0KKyAgICAgICAgICAgICh5ICsgMSA9PSBwaWMtPmhlaWdodCkgPyBhX3B0ciA6IGFfcHRyICsgcGljLT5hX3N0cmlkZTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHV2X3dpZHRoOyArK3gpIHsKKyAgICAgICAgICAvLyBBdmVyYWdlIGZvdXIgYWxwaGEgdmFsdWVzIGludG8gYSBzaW5nbGUgYmxlbmRpbmcgd2VpZ2h0LgorICAgICAgICAgIC8vIFRPRE8oc2thbCk6IG1pZ2h0IGxlYWQgdG8gdmlzaWJsZSBjb250b3VyaW5nLiBDYW4gd2UgZG8gYmV0dGVyPworICAgICAgICAgIGNvbnN0IGludCBhbHBoYSA9CisgICAgICAgICAgICAgIGFfcHRyWzIgKiB4ICsgMF0gKyBhX3B0clsyICogeCArIDFdICsKKyAgICAgICAgICAgICAgYV9wdHIyWzIgKiB4ICsgMF0gKyBhX3B0cjJbMiAqIHggKyAxXTsKKyAgICAgICAgICB1W3hdID0gQkxFTkRfMTBCSVQoVTAsIHVbeF0sIGFscGhhKTsKKyAgICAgICAgICB2W3hdID0gQkxFTkRfMTBCSVQoVjAsIHZbeF0sIGFscGhhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGljLT53aWR0aCAmIDEpIHsgICAvLyByaWdodG1vc3QgcGl4ZWwKKyAgICAgICAgICBjb25zdCBpbnQgYWxwaGEgPSAyICogKGFfcHRyWzIgKiB4ICsgMF0gKyBhX3B0cjJbMiAqIHggKyAwXSk7CisgICAgICAgICAgdVt4XSA9IEJMRU5EXzEwQklUKFUwLCB1W3hdLCBhbHBoYSk7CisgICAgICAgICAgdlt4XSA9IEJMRU5EXzEwQklUKFYwLCB2W3hdLCBhbHBoYSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1lbXNldChhX3B0ciwgMHhmZiwgcGljLT53aWR0aCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHVpbnQzMl90KiBhcmdiID0gcGljLT5hcmdiOworICAgIGNvbnN0IHVpbnQzMl90IGJhY2tncm91bmQgPSBNYWtlQVJHQjMyKHJlZCwgZ3JlZW4sIGJsdWUpOworICAgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgcGljLT53aWR0aDsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBhbHBoYSA9IChhcmdiW3hdID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGlmIChhbHBoYSAhPSAweGZmKSB7CisgICAgICAgICAgaWYgKGFscGhhID4gMCkgeworICAgICAgICAgICAgaW50IHIgPSAoYXJnYlt4XSA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgaW50IGcgPSAoYXJnYlt4XSA+PiAgOCkgJiAweGZmOworICAgICAgICAgICAgaW50IGIgPSAoYXJnYlt4XSA+PiAgMCkgJiAweGZmOworICAgICAgICAgICAgciA9IEJMRU5EKHJlZCwgciwgYWxwaGEpOworICAgICAgICAgICAgZyA9IEJMRU5EKGdyZWVuLCBnLCBhbHBoYSk7CisgICAgICAgICAgICBiID0gQkxFTkQoYmx1ZSwgYiwgYWxwaGEpOworICAgICAgICAgICAgYXJnYlt4XSA9IE1ha2VBUkdCMzIociwgZywgYik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ2JbeF0gPSBiYWNrZ3JvdW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICAgIH0KKyAgfQorfQorCisjdW5kZWYgQkxFTkQKKyN1bmRlZiBCTEVORF8xMEJJVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9wcmVkaWN0b3JfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjljZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9wcmVkaWN0b3JfZW5jLmMKQEAgLTAsMCArMSw3NzYgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm0gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorLy8gICAgICAgICAgVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorCisjZGVmaW5lIE1BWF9ESUZGX0NPU1QgKDFlMzBmKQorCitzdGF0aWMgY29uc3QgZmxvYXQga1NwYXRpYWxQcmVkaWN0b3JCaWFzID0gMTUuZjsKK3N0YXRpYyBjb25zdCBpbnQga1ByZWRMb3dFZmZvcnQgPSAxMTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWFza0FscGhhID0gMHhmZjAwMDAwMDsKKworLy8gTW9zdGx5IHVzZWQgdG8gcmVkdWNlIGNvZGUgc2l6ZSArIHJlYWRhYmlsaXR5CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldE1pbihpbnQgYSwgaW50IGIpIHsgcmV0dXJuIChhID4gYikgPyBiIDogYTsgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0aG9kcyB0byBjYWxjdWxhdGUgRW50cm9weSAoU2hhbm5vbikuCisKK3N0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdFNwYXRpYWwoY29uc3QgaW50IGNvdW50c1syNTZdLCBpbnQgd2VpZ2h0XzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBleHBfdmFsKSB7CisgIGNvbnN0IGludCBzaWduaWZpY2FudF9zeW1ib2xzID0gMjU2ID4+IDQ7CisgIGNvbnN0IGRvdWJsZSBleHBfZGVjYXlfZmFjdG9yID0gMC42OworICBkb3VibGUgYml0cyA9IHdlaWdodF8wICogY291bnRzWzBdOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IHNpZ25pZmljYW50X3N5bWJvbHM7ICsraSkgeworICAgIGJpdHMgKz0gZXhwX3ZhbCAqIChjb3VudHNbaV0gKyBjb3VudHNbMjU2IC0gaV0pOworICAgIGV4cF92YWwgKj0gZXhwX2RlY2F5X2ZhY3RvcjsKKyAgfQorICByZXR1cm4gKGZsb2F0KSgtMC4xICogYml0cyk7Cit9CisKK3N0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdFNwYXRpYWxIaXN0b2dyYW0oY29uc3QgaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aWxlWzRdWzI1Nl0pIHsKKyAgaW50IGk7CisgIGRvdWJsZSByZXR2YWwgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgZG91YmxlIGtFeHBWYWx1ZSA9IDAuOTQ7CisgICAgcmV0dmFsICs9IFByZWRpY3Rpb25Db3N0U3BhdGlhbCh0aWxlW2ldLCAxLCBrRXhwVmFsdWUpOworICAgIHJldHZhbCArPSBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSh0aWxlW2ldLCBhY2N1bXVsYXRlZFtpXSk7CisgIH0KKyAgcmV0dXJuIChmbG9hdClyZXR2YWw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUhpc3RvKGludCBoaXN0b19hcmdiWzRdWzI1Nl0sIHVpbnQzMl90IGFyZ2IpIHsKKyAgKytoaXN0b19hcmdiWzBdW2FyZ2IgPj4gMjRdOworICArK2hpc3RvX2FyZ2JbMV1bKGFyZ2IgPj4gMTYpICYgMHhmZl07CisgICsraGlzdG9fYXJnYlsyXVsoYXJnYiA+PiA4KSAmIDB4ZmZdOworICArK2hpc3RvX2FyZ2JbM11bYXJnYiAmIDB4ZmZdOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3BhdGlhbCB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0QmF0Y2goaW50IG1vZGUsIGludCB4X3N0YXJ0LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgY29uc3QgdWludDMyX3QqIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHVwcGVyLCB1aW50MzJfdCogb3V0KSB7CisgIGlmICh4X3N0YXJ0ID09IDApIHsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICAvLyBBUkdCX0JMQUNLLgorICAgICAgVlA4TFByZWRpY3RvcnNTdWJbMF0oY3VycmVudCwgTlVMTCwgMSwgb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVG9wIG9uZS4KKyAgICAgIFZQOExQcmVkaWN0b3JzU3ViWzJdKGN1cnJlbnQsIHVwcGVyLCAxLCBvdXQpOworICAgIH0KKyAgICArK3hfc3RhcnQ7CisgICAgKytvdXQ7CisgICAgLS1udW1fcGl4ZWxzOworICB9CisgIGlmICh5ID09IDApIHsKKyAgICAvLyBMZWZ0IG9uZS4KKyAgICBWUDhMUHJlZGljdG9yc1N1YlsxXShjdXJyZW50ICsgeF9zdGFydCwgTlVMTCwgbnVtX3BpeGVscywgb3V0KTsKKyAgfSBlbHNlIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Ylttb2RlXShjdXJyZW50ICsgeF9zdGFydCwgdXBwZXIgKyB4X3N0YXJ0LCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCk7CisgIH0KK30KKworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TWF4KGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGIgOiBhOyB9CisKK3N0YXRpYyBpbnQgTWF4RGlmZkJldHdlZW5QaXhlbHModWludDMyX3QgcDEsIHVpbnQzMl90IHAyKSB7CisgIGNvbnN0IGludCBkaWZmX2EgPSBhYnMoKGludCkocDEgPj4gMjQpIC0gKGludCkocDIgPj4gMjQpKTsKKyAgY29uc3QgaW50IGRpZmZfciA9IGFicygoaW50KSgocDEgPj4gMTYpICYgMHhmZikgLSAoaW50KSgocDIgPj4gMTYpICYgMHhmZikpOworICBjb25zdCBpbnQgZGlmZl9nID0gYWJzKChpbnQpKChwMSA+PiA4KSAmIDB4ZmYpIC0gKGludCkoKHAyID4+IDgpICYgMHhmZikpOworICBjb25zdCBpbnQgZGlmZl9iID0gYWJzKChpbnQpKHAxICYgMHhmZikgLSAoaW50KShwMiAmIDB4ZmYpKTsKKyAgcmV0dXJuIEdldE1heChHZXRNYXgoZGlmZl9hLCBkaWZmX3IpLCBHZXRNYXgoZGlmZl9nLCBkaWZmX2IpKTsKK30KKworc3RhdGljIGludCBNYXhEaWZmQXJvdW5kUGl4ZWwodWludDMyX3QgY3VycmVudCwgdWludDMyX3QgdXAsIHVpbnQzMl90IGRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LCB1aW50MzJfdCByaWdodCkgeworICBjb25zdCBpbnQgZGlmZl91cCA9IE1heERpZmZCZXR3ZWVuUGl4ZWxzKGN1cnJlbnQsIHVwKTsKKyAgY29uc3QgaW50IGRpZmZfZG93biA9IE1heERpZmZCZXR3ZWVuUGl4ZWxzKGN1cnJlbnQsIGRvd24pOworICBjb25zdCBpbnQgZGlmZl9sZWZ0ID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgbGVmdCk7CisgIGNvbnN0IGludCBkaWZmX3JpZ2h0ID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgcmlnaHQpOworICByZXR1cm4gR2V0TWF4KEdldE1heChkaWZmX3VwLCBkaWZmX2Rvd24pLCBHZXRNYXgoZGlmZl9sZWZ0LCBkaWZmX3JpZ2h0KSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKGFyZ2IgPj4gOCkgJiAweGZmOworICB1aW50MzJfdCByZWRfYmx1ZSA9IGFyZ2IgJiAweDAwZmYwMGZmdTsKKyAgcmVkX2JsdWUgKz0gKGdyZWVuIDw8IDE2KSB8IGdyZWVuOworICByZWRfYmx1ZSAmPSAweDAwZmYwMGZmdTsKKyAgcmV0dXJuIChhcmdiICYgMHhmZjAwZmYwMHUpIHwgcmVkX2JsdWU7Cit9CisKK3N0YXRpYyB2b2lkIE1heERpZmZzRm9yUm93KGludCB3aWR0aCwgaW50IHN0cmlkZSwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBtYXhfZGlmZnMsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIHVpbnQzMl90IGN1cnJlbnQsIHVwLCBkb3duLCBsZWZ0LCByaWdodDsKKyAgaW50IHg7CisgIGlmICh3aWR0aCA8PSAyKSByZXR1cm47CisgIGN1cnJlbnQgPSBhcmdiWzBdOworICByaWdodCA9IGFyZ2JbMV07CisgIGlmICh1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgICAgY3VycmVudCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkKGN1cnJlbnQpOworICAgIHJpZ2h0ID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQocmlnaHQpOworICB9CisgIC8vIG1heF9kaWZmc1swXSBhbmQgbWF4X2RpZmZzW3dpZHRoIC0gMV0gYXJlIG5ldmVyIHVzZWQuCisgIGZvciAoeCA9IDE7IHggPCB3aWR0aCAtIDE7ICsreCkgeworICAgIHVwID0gYXJnYlstc3RyaWRlICsgeF07CisgICAgZG93biA9IGFyZ2Jbc3RyaWRlICsgeF07CisgICAgbGVmdCA9IGN1cnJlbnQ7CisgICAgY3VycmVudCA9IHJpZ2h0OworICAgIHJpZ2h0ID0gYXJnYlt4ICsgMV07CisgICAgaWYgKHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgICAgIHVwID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQodXApOworICAgICAgZG93biA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkKGRvd24pOworICAgICAgcmlnaHQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZChyaWdodCk7CisgICAgfQorICAgIG1heF9kaWZmc1t4XSA9IE1heERpZmZBcm91bmRQaXhlbChjdXJyZW50LCB1cCwgZG93biwgbGVmdCwgcmlnaHQpOworICB9Cit9CisKKy8vIFF1YW50aXplIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFjdHVhbCBjb21wb25lbnQgdmFsdWUgYW5kIGl0cyBwcmVkaWN0aW9uCisvLyB0byBhIG11bHRpcGxlIG9mIHF1YW50aXphdGlvbiwgd29ya2luZyBtb2R1bG8gMjU2LCB0YWtpbmcgY2FyZSBub3QgdG8gY3Jvc3MKKy8vIGEgYm91bmRhcnkgKGluY2x1c2l2ZSB1cHBlciBsaW1pdCkuCitzdGF0aWMgdWludDhfdCBOZWFyTG9zc2xlc3NDb21wb25lbnQodWludDhfdCB2YWx1ZSwgdWludDhfdCBwcmVkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYm91bmRhcnksIGludCBxdWFudGl6YXRpb24pIHsKKyAgY29uc3QgaW50IHJlc2lkdWFsID0gKHZhbHVlIC0gcHJlZGljdCkgJiAweGZmOworICBjb25zdCBpbnQgYm91bmRhcnlfcmVzaWR1YWwgPSAoYm91bmRhcnkgLSBwcmVkaWN0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBsb3dlciA9IHJlc2lkdWFsICYgfihxdWFudGl6YXRpb24gLSAxKTsKKyAgY29uc3QgaW50IHVwcGVyID0gbG93ZXIgKyBxdWFudGl6YXRpb247CisgIC8vIFJlc29sdmUgdGllcyB0b3dhcmRzIGEgdmFsdWUgY2xvc2VyIHRvIHRoZSBwcmVkaWN0aW9uIChpLmUuIHRvd2FyZHMgbG93ZXIKKyAgLy8gaWYgdmFsdWUgY29tZXMgYWZ0ZXIgcHJlZGljdGlvbiBhbmQgdG93YXJkcyB1cHBlciBvdGhlcndpc2UpLgorICBjb25zdCBpbnQgYmlhcyA9ICgoYm91bmRhcnkgLSB2YWx1ZSkgJiAweGZmKSA8IGJvdW5kYXJ5X3Jlc2lkdWFsOworICBpZiAocmVzaWR1YWwgLSBsb3dlciA8IHVwcGVyIC0gcmVzaWR1YWwgKyBiaWFzKSB7CisgICAgLy8gbG93ZXIgaXMgY2xvc2VyIHRvIHJlc2lkdWFsIHRoYW4gdXBwZXIuCisgICAgaWYgKHJlc2lkdWFsID4gYm91bmRhcnlfcmVzaWR1YWwgJiYgbG93ZXIgPD0gYm91bmRhcnlfcmVzaWR1YWwpIHsKKyAgICAgIC8vIEhhbHZlIHF1YW50aXphdGlvbiBzdGVwIHRvIGF2b2lkIGNyb3NzaW5nIGJvdW5kYXJ5LiBUaGlzIG1pZHBvaW50IGlzCisgICAgICAvLyBvbiB0aGUgc2FtZSBzaWRlIG9mIGJvdW5kYXJ5IGFzIHJlc2lkdWFsIGJlY2F1c2UgbWlkcG9pbnQgPj0gcmVzaWR1YWwKKyAgICAgIC8vIChzaW5jZSBsb3dlciBpcyBjbG9zZXIgdGhhbiB1cHBlcikgYW5kIHJlc2lkdWFsIGlzIGFib3ZlIHRoZSBib3VuZGFyeS4KKyAgICAgIHJldHVybiBsb3dlciArIChxdWFudGl6YXRpb24gPj4gMSk7CisgICAgfQorICAgIHJldHVybiBsb3dlcjsKKyAgfSBlbHNlIHsKKyAgICAvLyB1cHBlciBpcyBjbG9zZXIgdG8gcmVzaWR1YWwgdGhhbiBsb3dlci4KKyAgICBpZiAocmVzaWR1YWwgPD0gYm91bmRhcnlfcmVzaWR1YWwgJiYgdXBwZXIgPiBib3VuZGFyeV9yZXNpZHVhbCkgeworICAgICAgLy8gSGFsdmUgcXVhbnRpemF0aW9uIHN0ZXAgdG8gYXZvaWQgY3Jvc3NpbmcgYm91bmRhcnkuIFRoaXMgbWlkcG9pbnQgaXMKKyAgICAgIC8vIG9uIHRoZSBzYW1lIHNpZGUgb2YgYm91bmRhcnkgYXMgcmVzaWR1YWwgYmVjYXVzZSBtaWRwb2ludCA8PSByZXNpZHVhbAorICAgICAgLy8gKHNpbmNlIHVwcGVyIGlzIGNsb3NlciB0aGFuIGxvd2VyKSBhbmQgcmVzaWR1YWwgaXMgYmVsb3cgdGhlIGJvdW5kYXJ5LgorICAgICAgcmV0dXJuIGxvd2VyICsgKHF1YW50aXphdGlvbiA+PiAxKTsKKyAgICB9CisgICAgcmV0dXJuIHVwcGVyICYgMHhmZjsKKyAgfQorfQorCisvLyBRdWFudGl6ZSBldmVyeSBjb21wb25lbnQgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIHBpeGVsIHZhbHVlIGFuZAorLy8gaXRzIHByZWRpY3Rpb24gdG8gYSBtdWx0aXBsZSBvZiBhIHF1YW50aXphdGlvbiAoYSBwb3dlciBvZiAyLCBub3QgbGFyZ2VyIHRoYW4KKy8vIG1heF9xdWFudGl6YXRpb24gd2hpY2ggaXMgYSBwb3dlciBvZiAyLCBzbWFsbGVyIHRoYW4gbWF4X2RpZmYpLiBUYWtlIGNhcmUgaWYKKy8vIHZhbHVlIGFuZCBwcmVkaWN0IGhhdmUgdW5kZXJnb25lIHN1YnRyYWN0IGdyZWVuLCB3aGljaCBtZWFucyB0aGF0IHJlZCBhbmQKKy8vIGJsdWUgYXJlIHJlcHJlc2VudGVkIGFzIG9mZnNldHMgZnJvbSBncmVlbi4KKyNkZWZpbmUgTkVBUl9MT1NTTEVTU19ESUZGKGEsIGIpICh1aW50OF90KSgoKChpbnQpKGEpIC0gKGludCkoYikpKSAmIDB4ZmYpCitzdGF0aWMgdWludDMyX3QgTmVhckxvc3NsZXNzKHVpbnQzMl90IHZhbHVlLCB1aW50MzJfdCBwcmVkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3F1YW50aXphdGlvbiwgaW50IG1heF9kaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICBpbnQgcXVhbnRpemF0aW9uOworICB1aW50OF90IG5ld19ncmVlbiA9IDA7CisgIHVpbnQ4X3QgZ3JlZW5fZGlmZiA9IDA7CisgIHVpbnQ4X3QgYSwgciwgZywgYjsKKyAgaWYgKG1heF9kaWZmIDw9IDIpIHsKKyAgICByZXR1cm4gVlA4TFN1YlBpeGVscyh2YWx1ZSwgcHJlZGljdCk7CisgIH0KKyAgcXVhbnRpemF0aW9uID0gbWF4X3F1YW50aXphdGlvbjsKKyAgd2hpbGUgKHF1YW50aXphdGlvbiA+PSBtYXhfZGlmZikgeworICAgIHF1YW50aXphdGlvbiA+Pj0gMTsKKyAgfQorICBpZiAoKHZhbHVlID4+IDI0KSA9PSAwIHx8ICh2YWx1ZSA+PiAyNCkgPT0gMHhmZikgeworICAgIC8vIFByZXNlcnZlIHRyYW5zcGFyZW5jeSBvZiBmdWxseSB0cmFuc3BhcmVudCBvciBmdWxseSBvcGFxdWUgcGl4ZWxzLgorICAgIGEgPSBORUFSX0xPU1NMRVNTX0RJRkYodmFsdWUgPj4gMjQsIHByZWRpY3QgPj4gMjQpOworICB9IGVsc2UgeworICAgIGEgPSBOZWFyTG9zc2xlc3NDb21wb25lbnQodmFsdWUgPj4gMjQsIHByZWRpY3QgPj4gMjQsIDB4ZmYsIHF1YW50aXphdGlvbik7CisgIH0KKyAgZyA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudCgodmFsdWUgPj4gOCkgJiAweGZmLCAocHJlZGljdCA+PiA4KSAmIDB4ZmYsIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uKTsKKyAgaWYgKHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgICAvLyBUaGUgZ3JlZW4gb2Zmc2V0IHdpbGwgYmUgYWRkZWQgdG8gcmVkIGFuZCBibHVlIGNvbXBvbmVudHMgZHVyaW5nIGRlY29kaW5nCisgICAgLy8gdG8gb2J0YWluIHRoZSBhY3R1YWwgcmVkIGFuZCBibHVlIHZhbHVlcy4KKyAgICBuZXdfZ3JlZW4gPSAoKHByZWRpY3QgPj4gOCkgKyBnKSAmIDB4ZmY7CisgICAgLy8gVGhlIGFtb3VudCBieSB3aGljaCBncmVlbiBoYXMgYmVlbiBhZGp1c3RlZCBkdXJpbmcgcXVhbnRpemF0aW9uLiBJdCBpcworICAgIC8vIHN1YnRyYWN0ZWQgZnJvbSByZWQgYW5kIGJsdWUgZm9yIGNvbXBlbnNhdGlvbiwgdG8gYXZvaWQgYWNjdW11bGF0aW5nIHR3bworICAgIC8vIHF1YW50aXphdGlvbiBlcnJvcnMgaW4gdGhlbS4KKyAgICBncmVlbl9kaWZmID0gTkVBUl9MT1NTTEVTU19ESUZGKG5ld19ncmVlbiwgdmFsdWUgPj4gOCk7CisgIH0KKyAgciA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudChORUFSX0xPU1NMRVNTX0RJRkYodmFsdWUgPj4gMTYsIGdyZWVuX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0ID4+IDE2KSAmIDB4ZmYsIDB4ZmYgLSBuZXdfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uKTsKKyAgYiA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudChORUFSX0xPU1NMRVNTX0RJRkYodmFsdWUsIGdyZWVuX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QgJiAweGZmLCAweGZmIC0gbmV3X2dyZWVuLCBxdWFudGl6YXRpb24pOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8ICgodWludDMyX3QpciA8PCAxNikgfCAoKHVpbnQzMl90KWcgPDwgOCkgfCBiOworfQorI3VuZGVmIE5FQVJfTE9TU0xFU1NfRElGRgorI2VuZGlmICAvLyAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisKKy8vIFN0b3JlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwaXhlbCBhbmQgaXRzIHByZWRpY3Rpb24gaW4gIm91dCIuCisvLyBJbiBjYXNlIG9mIGEgbG9zc3kgZW5jb2RpbmcsIHVwZGF0ZXMgdGhlIHNvdXJjZSBpbWFnZSB0byBhdm9pZCBwcm9wYWdhdGluZworLy8gdGhlIGRldmlhdGlvbiBmdXJ0aGVyIHRvIHBpeGVscyB3aGljaCBkZXBlbmQgb24gdGhlIGN1cnJlbnQgcGl4ZWwgZm9yIHRoZWlyCisvLyBwcmVkaWN0aW9ucy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldFJlc2lkdWFsKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdWludDMyX3QqIGNvbnN0IHVwcGVyX3JvdywKKyAgICB1aW50MzJfdCogY29uc3QgY3VycmVudF9yb3csIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcywgaW50IG1vZGUsCisgICAgaW50IHhfc3RhcnQsIGludCB4X2VuZCwgaW50IHksIGludCBtYXhfcXVhbnRpemF0aW9uLCBpbnQgZXhhY3QsCisgICAgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4sIHVpbnQzMl90KiBjb25zdCBvdXQpIHsKKyAgaWYgKGV4YWN0KSB7CisgICAgUHJlZGljdEJhdGNoKG1vZGUsIHhfc3RhcnQsIHksIHhfZW5kIC0geF9zdGFydCwgY3VycmVudF9yb3csIHVwcGVyX3JvdywKKyAgICAgICAgICAgICAgICAgb3V0KTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBWUDhMUHJlZGljdG9yRnVuYyBwcmVkX2Z1bmMgPSBWUDhMUHJlZGljdG9yc1ttb2RlXTsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSB4X3N0YXJ0OyB4IDwgeF9lbmQ7ICsreCkgeworICAgICAgdWludDMyX3QgcHJlZGljdDsKKyAgICAgIHVpbnQzMl90IHJlc2lkdWFsOworICAgICAgaWYgKHkgPT0gMCkgeworICAgICAgICBwcmVkaWN0ID0gKHggPT0gMCkgPyBBUkdCX0JMQUNLIDogY3VycmVudF9yb3dbeCAtIDFdOyAgLy8gTGVmdC4KKyAgICAgIH0gZWxzZSBpZiAoeCA9PSAwKSB7CisgICAgICAgIHByZWRpY3QgPSB1cHBlcl9yb3dbeF07ICAvLyBUb3AuCisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVkaWN0ID0gcHJlZF9mdW5jKGN1cnJlbnRfcm93W3ggLSAxXSwgdXBwZXJfcm93ICsgeCk7CisgICAgICB9CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICAgICAgaWYgKG1heF9xdWFudGl6YXRpb24gPT0gMSB8fCBtb2RlID09IDAgfHwgeSA9PSAwIHx8IHkgPT0gaGVpZ2h0IC0gMSB8fAorICAgICAgICAgIHggPT0gMCB8fCB4ID09IHdpZHRoIC0gMSkgeworICAgICAgICByZXNpZHVhbCA9IFZQOExTdWJQaXhlbHMoY3VycmVudF9yb3dbeF0sIHByZWRpY3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzaWR1YWwgPSBOZWFyTG9zc2xlc3MoY3VycmVudF9yb3dbeF0sIHByZWRpY3QsIG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmc1t4XSwgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc291cmNlIGltYWdlLgorICAgICAgICBjdXJyZW50X3Jvd1t4XSA9IFZQOExBZGRQaXhlbHMocHJlZGljdCwgcmVzaWR1YWwpOworICAgICAgICAvLyB4IGlzIG5ldmVyIDAgaGVyZSBzbyB3ZSBkbyBub3QgbmVlZCB0byB1cGRhdGUgdXBwZXJfcm93IGxpa2UgYmVsb3cuCisgICAgICB9CisjZWxzZQorICAgICAgKHZvaWQpbWF4X2RpZmZzOworICAgICAgKHZvaWQpaGVpZ2h0OworICAgICAgKHZvaWQpbWF4X3F1YW50aXphdGlvbjsKKyAgICAgICh2b2lkKXVzZWRfc3VidHJhY3RfZ3JlZW47CisgICAgICByZXNpZHVhbCA9IFZQOExTdWJQaXhlbHMoY3VycmVudF9yb3dbeF0sIHByZWRpY3QpOworI2VuZGlmCisgICAgICBpZiAoKGN1cnJlbnRfcm93W3hdICYga01hc2tBbHBoYSkgPT0gMCkgeworICAgICAgICAvLyBJZiBhbHBoYSBpcyAwLCBjbGVhbnVwIFJHQi4gV2UgY2FuIGNob29zZSB0aGUgUkdCIHZhbHVlcyBvZiB0aGUKKyAgICAgICAgLy8gcmVzaWR1YWwgZm9yIGJlc3QgY29tcHJlc3Npb24uIFRoZSBwcmVkaWN0aW9uIG9mIGFscGhhIGl0c2VsZiBjYW4gYmUKKyAgICAgICAgLy8gbm9uLXplcm8gYW5kIG11c3QgYmUga2VwdCB0aG91Z2guIFdlIGNob29zZSBSR0Igb2YgdGhlIHJlc2lkdWFsIHRvIGJlCisgICAgICAgIC8vIDAuCisgICAgICAgIHJlc2lkdWFsICY9IGtNYXNrQWxwaGE7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc291cmNlIGltYWdlLgorICAgICAgICBjdXJyZW50X3Jvd1t4XSA9IHByZWRpY3QgJiB+a01hc2tBbHBoYTsKKyAgICAgICAgLy8gVGhlIHByZWRpY3Rpb24gZm9yIHRoZSByaWdodG1vc3QgcGl4ZWwgaW4gYSByb3cgdXNlcyB0aGUgbGVmdG1vc3QKKyAgICAgICAgLy8gcGl4ZWwKKyAgICAgICAgLy8gaW4gdGhhdCByb3cgYXMgaXRzIHRvcC1yaWdodCBjb250ZXh0IHBpeGVsLiBIZW5jZSBpZiB3ZSBjaGFuZ2UgdGhlCisgICAgICAgIC8vIGxlZnRtb3N0IHBpeGVsIG9mIGN1cnJlbnRfcm93LCB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UgbXVzdCBiZQorICAgICAgICAvLyBhcHBsaWVkCisgICAgICAgIC8vIHRvIHVwcGVyX3JvdyBhcyB3ZWxsIHdoZXJlIHRvcC1yaWdodCBjb250ZXh0IGlzIGJlaW5nIHJlYWQgZnJvbS4KKyAgICAgICAgaWYgKHggPT0gMCAmJiB5ICE9IDApIHVwcGVyX3Jvd1t3aWR0aF0gPSBjdXJyZW50X3Jvd1swXTsKKyAgICAgIH0KKyAgICAgIG91dFt4IC0geF9zdGFydF0gPSByZXNpZHVhbDsKKyAgICB9CisgIH0KK30KKworLy8gUmV0dXJucyBiZXN0IHByZWRpY3RvciBhbmQgdXBkYXRlcyB0aGUgYWNjdW11bGF0ZWQgaGlzdG9ncmFtLgorLy8gSWYgbWF4X3F1YW50aXphdGlvbiA+IDEsIGFzc3VtZXMgdGhhdCBuZWFyIGxvc3NsZXNzIHByb2Nlc3Npbmcgd2lsbCBiZQorLy8gYXBwbGllZCwgcXVhbnRpemluZyByZXNpZHVhbHMgdG8gbXVsdGlwbGVzIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgdXAgdG8KKy8vIG1heF9xdWFudGl6YXRpb24gKHRoZSBhY3R1YWwgcXVhbnRpemF0aW9uIGxldmVsIGRlcGVuZHMgb24gc21vb3RobmVzcyBuZWFyCisvLyB0aGUgZ2l2ZW4gcGl4ZWwpLgorc3RhdGljIGludCBHZXRCZXN0UHJlZGljdG9yRm9yVGlsZShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3gsIGludCB0aWxlX3ksIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjdW11bGF0ZWRbNF1bMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcXVhbnRpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgbW9kZXMpIHsKKyAgY29uc3QgaW50IGtOdW1QcmVkTW9kZXMgPSAxNDsKKyAgY29uc3QgaW50IHN0YXJ0X3ggPSB0aWxlX3ggPDwgYml0czsKKyAgY29uc3QgaW50IHN0YXJ0X3kgPSB0aWxlX3kgPDwgYml0czsKKyAgY29uc3QgaW50IHRpbGVfc2l6ZSA9IDEgPDwgYml0czsKKyAgY29uc3QgaW50IG1heF95ID0gR2V0TWluKHRpbGVfc2l6ZSwgaGVpZ2h0IC0gc3RhcnRfeSk7CisgIGNvbnN0IGludCBtYXhfeCA9IEdldE1pbih0aWxlX3NpemUsIHdpZHRoIC0gc3RhcnRfeCk7CisgIC8vIFdoZXRoZXIgdGhlcmUgZXhpc3QgY29sdW1ucyBqdXN0IG91dHNpZGUgdGhlIHRpbGUuCisgIGNvbnN0IGludCBoYXZlX2xlZnQgPSAoc3RhcnRfeCA+IDApOworICAvLyBQb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgc3RyaXAgY292ZXJpbmcgdGhlIHRpbGUgYW5kIGFkamFjZW50IGNvbHVtbnMgaWYKKyAgLy8gdGhleSBleGlzdC4KKyAgY29uc3QgaW50IGNvbnRleHRfc3RhcnRfeCA9IHN0YXJ0X3ggLSBoYXZlX2xlZnQ7CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICBjb25zdCBpbnQgY29udGV4dF93aWR0aCA9IG1heF94ICsgaGF2ZV9sZWZ0ICsgKG1heF94IDwgd2lkdGggLSBzdGFydF94KTsKKyNlbmRpZgorICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKKyAgLy8gUHJlZGljdGlvbiBtb2RlcyBvZiB0aGUgbGVmdCBhbmQgYWJvdmUgbmVpZ2hib3IgdGlsZXMuCisgIGNvbnN0IGludCBsZWZ0X21vZGUgPSAodGlsZV94ID4gMCkgPworICAgICAgKG1vZGVzW3RpbGVfeSAqIHRpbGVzX3Blcl9yb3cgKyB0aWxlX3ggLSAxXSA+PiA4KSAmIDB4ZmYgOiAweGZmOworICBjb25zdCBpbnQgYWJvdmVfbW9kZSA9ICh0aWxlX3kgPiAwKSA/CisgICAgICAobW9kZXNbKHRpbGVfeSAtIDEpICogdGlsZXNfcGVyX3JvdyArIHRpbGVfeF0gPj4gOCkgJiAweGZmIDogMHhmZjsKKyAgLy8gVGhlIHdpZHRoIG9mIHVwcGVyX3JvdyBhbmQgY3VycmVudF9yb3cgaXMgb25lIHBpeGVsIGxhcmdlciB0aGFuIGltYWdlIHdpZHRoCisgIC8vIHRvIGFsbG93IHRoZSB0b3AgcmlnaHQgcGl4ZWwgdG8gcG9pbnQgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdworICAvLyB3aGVuIGF0IHRoZSByaWdodCBlZGdlLgorICB1aW50MzJfdCogdXBwZXJfcm93ID0gYXJnYl9zY3JhdGNoOworICB1aW50MzJfdCogY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aCArIDE7CisgIHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcyA9ICh1aW50OF90KikoY3VycmVudF9yb3cgKyB3aWR0aCArIDEpOworICBmbG9hdCBiZXN0X2RpZmYgPSBNQVhfRElGRl9DT1NUOworICBpbnQgYmVzdF9tb2RlID0gMDsKKyAgaW50IG1vZGU7CisgIGludCBoaXN0b19zdGFja18xWzRdWzI1Nl07CisgIGludCBoaXN0b19zdGFja18yWzRdWzI1Nl07CisgIC8vIE5lZWQgcG9pbnRlcnMgdG8gYmUgYWJsZSB0byBzd2FwIGFycmF5cy4KKyAgaW50ICgqaGlzdG9fYXJnYilbMjU2XSA9IGhpc3RvX3N0YWNrXzE7CisgIGludCAoKmJlc3RfaGlzdG8pWzI1Nl0gPSBoaXN0b19zdGFja18yOworICBpbnQgaSwgajsKKyAgdWludDMyX3QgcmVzaWR1YWxzWzEgPDwgTUFYX1RSQU5TRk9STV9CSVRTXTsKKyAgYXNzZXJ0KGJpdHMgPD0gTUFYX1RSQU5TRk9STV9CSVRTKTsKKyAgYXNzZXJ0KG1heF94IDw9ICgxIDw8IE1BWF9UUkFOU0ZPUk1fQklUUykpOworCisgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBrTnVtUHJlZE1vZGVzOyArK21vZGUpIHsKKyAgICBmbG9hdCBjdXJfZGlmZjsKKyAgICBpbnQgcmVsYXRpdmVfeTsKKyAgICBtZW1zZXQoaGlzdG9fYXJnYiwgMCwgc2l6ZW9mKGhpc3RvX3N0YWNrXzEpKTsKKyAgICBpZiAoc3RhcnRfeSA+IDApIHsKKyAgICAgIC8vIFJlYWQgdGhlIHJvdyBhYm92ZSB0aGUgdGlsZSB3aGljaCB3aWxsIGJlY29tZSB0aGUgZmlyc3QgdXBwZXJfcm93LgorICAgICAgLy8gSW5jbHVkZSBhIHBpeGVsIHRvIHRoZSBsZWZ0IGlmIGl0IGV4aXN0czsgaW5jbHVkZSBhIHBpeGVsIHRvIHRoZSByaWdodAorICAgICAgLy8gaW4gYWxsIGNhc2VzICh3cmFwcGluZyB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93IGlmIGl0IGRvZXMKKyAgICAgIC8vIG5vdCBleGlzdCkuCisgICAgICBtZW1jcHkoY3VycmVudF9yb3cgKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgYXJnYiArIChzdGFydF95IC0gMSkgKiB3aWR0aCArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBzaXplb2YoKmFyZ2IpICogKG1heF94ICsgaGF2ZV9sZWZ0ICsgMSkpOworICAgIH0KKyAgICBmb3IgKHJlbGF0aXZlX3kgPSAwOyByZWxhdGl2ZV95IDwgbWF4X3k7ICsrcmVsYXRpdmVfeSkgeworICAgICAgY29uc3QgaW50IHkgPSBzdGFydF95ICsgcmVsYXRpdmVfeTsKKyAgICAgIGludCByZWxhdGl2ZV94OworICAgICAgdWludDMyX3QqIHRtcCA9IHVwcGVyX3JvdzsKKyAgICAgIHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OworICAgICAgY3VycmVudF9yb3cgPSB0bXA7CisgICAgICAvLyBSZWFkIGN1cnJlbnRfcm93LiBJbmNsdWRlIGEgcGl4ZWwgdG8gdGhlIGxlZnQgaWYgaXQgZXhpc3RzOyBpbmNsdWRlIGEKKyAgICAgIC8vIHBpeGVsIHRvIHRoZSByaWdodCBpbiBhbGwgY2FzZXMgZXhjZXB0IGF0IHRoZSBib3R0b20gcmlnaHQgY29ybmVyIG9mCisgICAgICAvLyB0aGUgaW1hZ2UgKHdyYXBwaW5nIHRvIHRoZSBsZWZ0bW9zdCBwaXhlbCBvZiB0aGUgbmV4dCByb3cgaWYgaXQgZG9lcworICAgICAgLy8gbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHJvdykuCisgICAgICBtZW1jcHkoY3VycmVudF9yb3cgKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgYXJnYiArIHkgKiB3aWR0aCArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBzaXplb2YoKmFyZ2IpICogKG1heF94ICsgaGF2ZV9sZWZ0ICsgKHkgKyAxIDwgaGVpZ2h0KSkpOworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKyAgICAgIGlmIChtYXhfcXVhbnRpemF0aW9uID4gMSAmJiB5ID49IDEgJiYgeSArIDEgPCBoZWlnaHQpIHsKKyAgICAgICAgTWF4RGlmZnNGb3JSb3coY29udGV4dF93aWR0aCwgd2lkdGgsIGFyZ2IgKyB5ICogd2lkdGggKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmcyArIGNvbnRleHRfc3RhcnRfeCwgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisgICAgICB9CisjZW5kaWYKKworICAgICAgR2V0UmVzaWR1YWwod2lkdGgsIGhlaWdodCwgdXBwZXJfcm93LCBjdXJyZW50X3JvdywgbWF4X2RpZmZzLCBtb2RlLAorICAgICAgICAgICAgICAgICAgc3RhcnRfeCwgc3RhcnRfeCArIG1heF94LCB5LCBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwKKyAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4sIHJlc2lkdWFscyk7CisgICAgICBmb3IgKHJlbGF0aXZlX3ggPSAwOyByZWxhdGl2ZV94IDwgbWF4X3g7ICsrcmVsYXRpdmVfeCkgeworICAgICAgICBVcGRhdGVIaXN0byhoaXN0b19hcmdiLCByZXNpZHVhbHNbcmVsYXRpdmVfeF0pOworICAgICAgfQorICAgIH0KKyAgICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbSgKKyAgICAgICAgKGNvbnN0IGludCAoKilbMjU2XSlhY2N1bXVsYXRlZCwgKGNvbnN0IGludCAoKilbMjU2XSloaXN0b19hcmdiKTsKKyAgICAvLyBGYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIuCisgICAgaWYgKG1vZGUgPT0gbGVmdF9tb2RlKSBjdXJfZGlmZiAtPSBrU3BhdGlhbFByZWRpY3RvckJpYXM7CisgICAgaWYgKG1vZGUgPT0gYWJvdmVfbW9kZSkgY3VyX2RpZmYgLT0ga1NwYXRpYWxQcmVkaWN0b3JCaWFzOworCisgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICBpbnQgKCp0bXApWzI1Nl0gPSBoaXN0b19hcmdiOworICAgICAgaGlzdG9fYXJnYiA9IGJlc3RfaGlzdG87CisgICAgICBiZXN0X2hpc3RvID0gdG1wOworICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7CisgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKyAgICAgIGFjY3VtdWxhdGVkW2ldW2pdICs9IGJlc3RfaGlzdG9baV1bal07CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RfbW9kZTsKK30KKworLy8gQ29udmVydHMgcGl4ZWxzIG9mIHRoZSBpbWFnZSB0byByZXNpZHVhbHMgd2l0aCByZXNwZWN0IHRvIHByZWRpY3Rpb25zLgorLy8gSWYgbWF4X3F1YW50aXphdGlvbiA+IDEsIGFwcGxpZXMgbmVhciBsb3NzbGVzcyBwcm9jZXNzaW5nLCBxdWFudGl6aW5nCisvLyByZXNpZHVhbHMgdG8gbXVsdGlwbGVzIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgdXAgdG8gbWF4X3F1YW50aXphdGlvbgorLy8gKHRoZSBhY3R1YWwgcXVhbnRpemF0aW9uIGxldmVsIGRlcGVuZHMgb24gc21vb3RobmVzcyBuZWFyIHRoZSBnaXZlbiBwaXhlbCkuCitzdGF0aWMgdm9pZCBDb3B5SW1hZ2VXaXRoUHJlZGljdGlvbihpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywgdWludDMyX3QqIGNvbnN0IG1vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQsIGludCBtYXhfcXVhbnRpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKKyAgLy8gVGhlIHdpZHRoIG9mIHVwcGVyX3JvdyBhbmQgY3VycmVudF9yb3cgaXMgb25lIHBpeGVsIGxhcmdlciB0aGFuIGltYWdlIHdpZHRoCisgIC8vIHRvIGFsbG93IHRoZSB0b3AgcmlnaHQgcGl4ZWwgdG8gcG9pbnQgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdworICAvLyB3aGVuIGF0IHRoZSByaWdodCBlZGdlLgorICB1aW50MzJfdCogdXBwZXJfcm93ID0gYXJnYl9zY3JhdGNoOworICB1aW50MzJfdCogY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aCArIDE7CisgIHVpbnQ4X3QqIGN1cnJlbnRfbWF4X2RpZmZzID0gKHVpbnQ4X3QqKShjdXJyZW50X3JvdyArIHdpZHRoICsgMSk7CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICB1aW50OF90KiBsb3dlcl9tYXhfZGlmZnMgPSBjdXJyZW50X21heF9kaWZmcyArIHdpZHRoOworI2VuZGlmCisgIGludCB5OworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGludCB4OworICAgIHVpbnQzMl90KiBjb25zdCB0bXAzMiA9IHVwcGVyX3JvdzsKKyAgICB1cHBlcl9yb3cgPSBjdXJyZW50X3JvdzsKKyAgICBjdXJyZW50X3JvdyA9IHRtcDMyOworICAgIG1lbWNweShjdXJyZW50X3JvdywgYXJnYiArIHkgKiB3aWR0aCwKKyAgICAgICAgICAgc2l6ZW9mKCphcmdiKSAqICh3aWR0aCArICh5ICsgMSA8IGhlaWdodCkpKTsKKworICAgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgICBQcmVkaWN0QmF0Y2goa1ByZWRMb3dFZmZvcnQsIDAsIHksIHdpZHRoLCBjdXJyZW50X3JvdywgdXBwZXJfcm93LAorICAgICAgICAgICAgICAgICAgIGFyZ2IgKyB5ICogd2lkdGgpOworICAgIH0gZWxzZSB7CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICAgICAgaWYgKG1heF9xdWFudGl6YXRpb24gPiAxKSB7CisgICAgICAgIC8vIENvbXB1dGUgbWF4X2RpZmZzIGZvciB0aGUgbG93ZXIgcm93IG5vdywgYmVjYXVzZSB0aGF0IG5lZWRzIHRoZQorICAgICAgICAvLyBjb250ZW50cyBvZiBhcmdiIGZvciB0aGUgY3VycmVudCByb3csIHdoaWNoIHdlIHdpbGwgb3ZlcndyaXRlIHdpdGgKKyAgICAgICAgLy8gcmVzaWR1YWxzIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIG5leHQgcm93LgorICAgICAgICB1aW50OF90KiBjb25zdCB0bXA4ID0gY3VycmVudF9tYXhfZGlmZnM7CisgICAgICAgIGN1cnJlbnRfbWF4X2RpZmZzID0gbG93ZXJfbWF4X2RpZmZzOworICAgICAgICBsb3dlcl9tYXhfZGlmZnMgPSB0bXA4OworICAgICAgICBpZiAoeSArIDIgPCBoZWlnaHQpIHsKKyAgICAgICAgICBNYXhEaWZmc0ZvclJvdyh3aWR0aCwgd2lkdGgsIGFyZ2IgKyAoeSArIDEpICogd2lkdGgsIGxvd2VyX21heF9kaWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7KSB7CisgICAgICAgIGNvbnN0IGludCBtb2RlID0KKyAgICAgICAgICAgIChtb2Rlc1soeSA+PiBiaXRzKSAqIHRpbGVzX3Blcl9yb3cgKyAoeCA+PiBiaXRzKV0gPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgeF9lbmQgPSB4ICsgKDEgPDwgYml0cyk7CisgICAgICAgIGlmICh4X2VuZCA+IHdpZHRoKSB4X2VuZCA9IHdpZHRoOworICAgICAgICBHZXRSZXNpZHVhbCh3aWR0aCwgaGVpZ2h0LCB1cHBlcl9yb3csIGN1cnJlbnRfcm93LCBjdXJyZW50X21heF9kaWZmcywKKyAgICAgICAgICAgICAgICAgICAgbW9kZSwgeCwgeF9lbmQsIHksIG1heF9xdWFudGl6YXRpb24sIGV4YWN0LAorICAgICAgICAgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuLCBhcmdiICsgeSAqIHdpZHRoICsgeCk7CisgICAgICAgIHggPSB4X2VuZDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gRmluZHMgdGhlIGJlc3QgcHJlZGljdG9yIGZvciBlYWNoIHRpbGUsIGFuZCBjb252ZXJ0cyB0aGUgaW1hZ2UgdG8gcmVzaWR1YWxzCisvLyB3aXRoIHJlc3BlY3QgdG8gcHJlZGljdGlvbnMuIElmIG5lYXJfbG9zc2xlc3NfcXVhbGl0eSA8IDEwMCwgYXBwbGllcworLy8gbmVhciBsb3NzbGVzcyBwcm9jZXNzaW5nLCBzaGF2aW5nIG9mZiBtb3JlIGJpdHMgb2YgcmVzaWR1YWxzIGZvciBsb3dlcgorLy8gcXVhbGl0aWVzLgordm9pZCBWUDhMUmVzaWR1YWxJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBpbWFnZSwgaW50IG5lYXJfbG9zc2xlc3NfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKKyAgY29uc3QgaW50IHRpbGVzX3Blcl9jb2wgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOworICBpbnQgdGlsZV95OworICBpbnQgaGlzdG9bNF1bMjU2XTsKKyAgY29uc3QgaW50IG1heF9xdWFudGl6YXRpb24gPSAxIDw8IFZQOExOZWFyTG9zc2xlc3NCaXRzKG5lYXJfbG9zc2xlc3NfcXVhbGl0eSk7CisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHRpbGVzX3Blcl9yb3cgKiB0aWxlc19wZXJfY29sOyArK2kpIHsKKyAgICAgIGltYWdlW2ldID0gQVJHQl9CTEFDSyB8IChrUHJlZExvd0VmZm9ydCA8PCA4KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVtc2V0KGhpc3RvLCAwLCBzaXplb2YoaGlzdG8pKTsKKyAgICBmb3IgKHRpbGVfeSA9IDA7IHRpbGVfeSA8IHRpbGVzX3Blcl9jb2w7ICsrdGlsZV95KSB7CisgICAgICBpbnQgdGlsZV94OworICAgICAgZm9yICh0aWxlX3ggPSAwOyB0aWxlX3ggPCB0aWxlc19wZXJfcm93OyArK3RpbGVfeCkgeworICAgICAgICBjb25zdCBpbnQgcHJlZCA9IEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlKHdpZHRoLCBoZWlnaHQsIHRpbGVfeCwgdGlsZV95LAorICAgICAgICAgICAgYml0cywgaGlzdG8sIGFyZ2Jfc2NyYXRjaCwgYXJnYiwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsCisgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuLCBpbWFnZSk7CisgICAgICAgIGltYWdlW3RpbGVfeSAqIHRpbGVzX3Blcl9yb3cgKyB0aWxlX3hdID0gQVJHQl9CTEFDSyB8IChwcmVkIDw8IDgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uKHdpZHRoLCBoZWlnaHQsIGJpdHMsIGltYWdlLCBhcmdiX3NjcmF0Y2gsIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQsIG1heF9xdWFudGl6YXRpb24sIGV4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIHRyYW5zZm9ybSBmdW5jdGlvbnMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIE11bHRpcGxpZXJzQ2xlYXIoVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIG0tPmdyZWVuX3RvX3JlZF8gPSAwOworICBtLT5ncmVlbl90b19ibHVlXyA9IDA7CisgIG0tPnJlZF90b19ibHVlXyA9IDA7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbG9yQ29kZVRvTXVsdGlwbGllcnModWludDMyX3QgY29sb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIG0tPmdyZWVuX3RvX3JlZF8gID0gKGNvbG9yX2NvZGUgPj4gIDApICYgMHhmZjsKKyAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAoY29sb3JfY29kZSA+PiAgOCkgJiAweGZmOworICBtLT5yZWRfdG9fYmx1ZV8gICA9IChjb2xvcl9jb2RlID4+IDE2KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBNdWx0aXBsaWVyc1RvQ29sb3JDb2RlKAorICAgIGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSkgeworICByZXR1cm4gMHhmZjAwMDAwMHUgfAorICAgICAgICAgKCh1aW50MzJfdCkobS0+cmVkX3RvX2JsdWVfKSA8PCAxNikgfAorICAgICAgICAgKCh1aW50MzJfdCkobS0+Z3JlZW5fdG9fYmx1ZV8pIDw8IDgpIHwKKyAgICAgICAgIG0tPmdyZWVuX3RvX3JlZF87Cit9CisKK3N0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoY29uc3QgaW50IGFjY3VtdWxhdGVkWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb3VudHNbMjU2XSkgeworICAvLyBGYXZvciBsb3cgZW50cm9weSwgbG9jYWxseSBhbmQgZ2xvYmFsbHkuCisgIC8vIEZhdm9yIHNtYWxsIGFic29sdXRlIHZhbHVlcyBmb3IgUHJlZGljdGlvbkNvc3RTcGF0aWFsCisgIHN0YXRpYyBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMi40OworICByZXR1cm4gVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHkoY291bnRzLCBhY2N1bXVsYXRlZCkgKworICAgICAgICAgUHJlZGljdGlvbkNvc3RTcGF0aWFsKGNvdW50cywgMywga0V4cFZhbHVlKTsKK30KKworc3RhdGljIGZsb2F0IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgZ3JlZW5fdG9fcmVkLAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSkgeworICBpbnQgaGlzdG9bMjU2XSA9IHsgMCB9OworICBmbG9hdCBjdXJfZGlmZjsKKworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyhhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl90b19yZWQsIGhpc3RvKTsKKworICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihhY2N1bXVsYXRlZF9yZWRfaGlzdG8sIGhpc3RvKTsKKyAgaWYgKCh1aW50OF90KWdyZWVuX3RvX3JlZCA9PSBwcmV2X3guZ3JlZW5fdG9fcmVkXykgeworICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKKyAgfQorICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZfeS5ncmVlbl90b19yZWRfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmIChncmVlbl90b19yZWQgPT0gMCkgeworICAgIGN1cl9kaWZmIC09IDM7CisgIH0KKyAgcmV0dXJuIGN1cl9kaWZmOworfQorCitzdGF0aWMgdm9pZCBHZXRCZXN0R3JlZW5Ub1JlZCgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgcXVhbGl0eSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0sIFZQOExNdWx0aXBsaWVycyogY29uc3QgYmVzdF90eCkgeworICBjb25zdCBpbnQga01heEl0ZXJzID0gNCArICgoNyAqIHF1YWxpdHkpID4+IDgpOyAgLy8gaW4gcmFuZ2UgWzQuLjZdCisgIGludCBncmVlbl90b19yZWRfYmVzdCA9IDA7CisgIGludCBpdGVyLCBvZmZzZXQ7CisgIGZsb2F0IGJlc3RfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgZ3JlZW5fdG9fcmVkX2Jlc3QsIGFjY3VtdWxhdGVkX3JlZF9oaXN0byk7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBrTWF4SXRlcnM7ICsraXRlcikgeworICAgIC8vIENvbG9yVHJhbnNmb3JtRGVsdGEgaXMgYSAzLjUgYml0IGZpeGVkIHBvaW50LCBzbyAzMiBpcyBlcXVhbCB0bworICAgIC8vIG9uZSBpbiBjb2xvciBjb21wdXRhdGlvbi4gSGF2aW5nIGluaXRpYWwgZGVsdGEgaGVyZSBhcyAxIGlzIHN1ZmZpY2llbnQKKyAgICAvLyB0byBleHBsb3JlIHRoZSByYW5nZSBvZiAoLTIsIDIpLgorICAgIGNvbnN0IGludCBkZWx0YSA9IDMyID4+IGl0ZXI7CisgICAgLy8gVHJ5IGEgbmVnYXRpdmUgYW5kIGEgcG9zaXRpdmUgZGVsdGEgZnJvbSB0aGUgYmVzdCBrbm93biB2YWx1ZS4KKyAgICBmb3IgKG9mZnNldCA9IC1kZWx0YTsgb2Zmc2V0IDw9IGRlbHRhOyBvZmZzZXQgKz0gMiAqIGRlbHRhKSB7CisgICAgICBjb25zdCBpbnQgZ3JlZW5fdG9fcmVkX2N1ciA9IG9mZnNldCArIGdyZWVuX3RvX3JlZF9iZXN0OworICAgICAgY29uc3QgZmxvYXQgY3VyX2RpZmYgPSBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JSZWQoCisgICAgICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgZ3JlZW5fdG9fcmVkX2N1ciwgYWNjdW11bGF0ZWRfcmVkX2hpc3RvKTsKKyAgICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgeworICAgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKKyAgICAgICAgZ3JlZW5fdG9fcmVkX2Jlc3QgPSBncmVlbl90b19yZWRfY3VyOworICAgICAgfQorICAgIH0KKyAgfQorICBiZXN0X3R4LT5ncmVlbl90b19yZWRfID0gZ3JlZW5fdG9fcmVkX2Jlc3Q7Cit9CisKK3N0YXRpYyBmbG9hdCBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JCbHVlKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksCisgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwgY29uc3QgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSkgeworICBpbnQgaGlzdG9bMjU2XSA9IHsgMCB9OworICBmbG9hdCBjdXJfZGlmZjsKKworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMoYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBoaXN0byk7CisKKyAgY3VyX2RpZmYgPSBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywgaGlzdG8pOworICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2X3guZ3JlZW5fdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KWdyZWVuX3RvX2JsdWUgPT0gcHJldl95LmdyZWVuX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2X3gucmVkX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2X3kucmVkX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmIChncmVlbl90b19ibHVlID09IDApIHsKKyAgICBjdXJfZGlmZiAtPSAzOworICB9CisgIGlmIChyZWRfdG9fYmx1ZSA9PSAwKSB7CisgICAgY3VyX2RpZmYgLT0gMzsKKyAgfQorICByZXR1cm4gY3VyX2RpZmY7Cit9CisKKyNkZWZpbmUga0dyZWVuUmVkVG9CbHVlTnVtQXhpcyA4CisjZGVmaW5lIGtHcmVlblJlZFRvQmx1ZU1heEl0ZXJzIDcKK3N0YXRpYyB2b2lkIEdldEJlc3RHcmVlblJlZFRvQmx1ZSgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgcXVhbGl0eSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdLAorICAgIFZQOExNdWx0aXBsaWVycyogY29uc3QgYmVzdF90eCkgeworICBjb25zdCBpbnQ4X3Qgb2Zmc2V0W2tHcmVlblJlZFRvQmx1ZU51bUF4aXNdWzJdID0KKyAgICAgIHt7MCwgLTF9LCB7MCwgMX0sIHstMSwgMH0sIHsxLCAwfSwgey0xLCAtMX0sIHstMSwgMX0sIHsxLCAtMX0sIHsxLCAxfX07CisgIGNvbnN0IGludDhfdCBkZWx0YV9sdXRba0dyZWVuUmVkVG9CbHVlTWF4SXRlcnNdID0geyAxNiwgMTYsIDgsIDQsIDIsIDIsIDIgfTsKKyAgY29uc3QgaW50IGl0ZXJzID0KKyAgICAgIChxdWFsaXR5IDwgMjUpID8gMSA6IChxdWFsaXR5ID4gNTApID8ga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMgOiA0OworICBpbnQgZ3JlZW5fdG9fYmx1ZV9iZXN0ID0gMDsKKyAgaW50IHJlZF90b19ibHVlX2Jlc3QgPSAwOworICBpbnQgaXRlcjsKKyAgLy8gSW5pdGlhbCB2YWx1ZSBhdCBvcmlnaW46CisgIGZsb2F0IGJlc3RfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgICBhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LCBwcmV2X3gsIHByZXZfeSwKKyAgICAgIGdyZWVuX3RvX2JsdWVfYmVzdCwgcmVkX3RvX2JsdWVfYmVzdCwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0byk7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBpdGVyczsgKytpdGVyKSB7CisgICAgY29uc3QgaW50IGRlbHRhID0gZGVsdGFfbHV0W2l0ZXJdOworICAgIGludCBheGlzOworICAgIGZvciAoYXhpcyA9IDA7IGF4aXMgPCBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzOyArK2F4aXMpIHsKKyAgICAgIGNvbnN0IGludCBncmVlbl90b19ibHVlX2N1ciA9CisgICAgICAgICAgb2Zmc2V0W2F4aXNdWzBdICogZGVsdGEgKyBncmVlbl90b19ibHVlX2Jlc3Q7CisgICAgICBjb25zdCBpbnQgcmVkX3RvX2JsdWVfY3VyID0gb2Zmc2V0W2F4aXNdWzFdICogZGVsdGEgKyByZWRfdG9fYmx1ZV9iZXN0OworICAgICAgY29uc3QgZmxvYXQgY3VyX2RpZmYgPSBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JCbHVlKAorICAgICAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgICAgIGdyZWVuX3RvX2JsdWVfY3VyLCByZWRfdG9fYmx1ZV9jdXIsIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8pOworICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOworICAgICAgICBncmVlbl90b19ibHVlX2Jlc3QgPSBncmVlbl90b19ibHVlX2N1cjsKKyAgICAgICAgcmVkX3RvX2JsdWVfYmVzdCA9IHJlZF90b19ibHVlX2N1cjsKKyAgICAgIH0KKyAgICAgIGlmIChxdWFsaXR5IDwgMjUgJiYgaXRlciA9PSA0KSB7CisgICAgICAgIC8vIE9ubHkgYXhpcyBhbGlnbmVkIGRpZmZzIGZvciBsb3dlciBxdWFsaXR5LgorICAgICAgICBicmVhazsgIC8vIG5leHQgaXRlci4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlbHRhID09IDIgJiYgZ3JlZW5fdG9fYmx1ZV9iZXN0ID09IDAgJiYgcmVkX3RvX2JsdWVfYmVzdCA9PSAwKSB7CisgICAgICAvLyBGdXJ0aGVyIGl0ZXJhdGlvbnMgd291bGQgbm90IGhlbHAuCisgICAgICBicmVhazsgIC8vIG91dCBvZiBpdGVyLWxvb3AuCisgICAgfQorICB9CisgIGJlc3RfdHgtPmdyZWVuX3RvX2JsdWVfID0gZ3JlZW5fdG9fYmx1ZV9iZXN0OworICBiZXN0X3R4LT5yZWRfdG9fYmx1ZV8gPSByZWRfdG9fYmx1ZV9iZXN0OworfQorI3VuZGVmIGtHcmVlblJlZFRvQmx1ZU1heEl0ZXJzCisjdW5kZWYga0dyZWVuUmVkVG9CbHVlTnVtQXhpcworCitzdGF0aWMgVlA4TE11bHRpcGxpZXJzIEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUoCisgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCisgICAgVlA4TE11bHRpcGxpZXJzIHByZXZfeCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl95LAorICAgIGludCBxdWFsaXR5LCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0sCisgICAgY29uc3QgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSwKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgeworICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKKyAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOworICBjb25zdCBpbnQgdGlsZV94X29mZnNldCA9IHRpbGVfeCAqIG1heF90aWxlX3NpemU7CisgIGNvbnN0IGludCBhbGxfeF9tYXggPSBHZXRNaW4odGlsZV94X29mZnNldCArIG1heF90aWxlX3NpemUsIHhzaXplKTsKKyAgY29uc3QgaW50IGFsbF95X21heCA9IEdldE1pbih0aWxlX3lfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgeXNpemUpOworICBjb25zdCBpbnQgdGlsZV93aWR0aCA9IGFsbF94X21heCAtIHRpbGVfeF9vZmZzZXQ7CisgIGNvbnN0IGludCB0aWxlX2hlaWdodCA9IGFsbF95X21heCAtIHRpbGVfeV9vZmZzZXQ7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0aWxlX2FyZ2IgPSBhcmdiICsgdGlsZV95X29mZnNldCAqIHhzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aWxlX3hfb2Zmc2V0OworICBWUDhMTXVsdGlwbGllcnMgYmVzdF90eDsKKyAgTXVsdGlwbGllcnNDbGVhcigmYmVzdF90eCk7CisKKyAgR2V0QmVzdEdyZWVuVG9SZWQodGlsZV9hcmdiLCB4c2l6ZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHByZXZfeCwgcHJldl95LCBxdWFsaXR5LCBhY2N1bXVsYXRlZF9yZWRfaGlzdG8sICZiZXN0X3R4KTsKKyAgR2V0QmVzdEdyZWVuUmVkVG9CbHVlKHRpbGVfYXJnYiwgeHNpemUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksIHF1YWxpdHksIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmVzdF90eCk7CisgIHJldHVybiBiZXN0X3R4OworfQorCitzdGF0aWMgdm9pZCBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybShpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3gsIGludCB0aWxlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3RpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExNdWx0aXBsaWVycyBjb2xvcl90cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYikgeworICBjb25zdCBpbnQgeHNjYW4gPSBHZXRNaW4obWF4X3RpbGVfc2l6ZSwgeHNpemUgLSB0aWxlX3gpOworICBpbnQgeXNjYW4gPSBHZXRNaW4obWF4X3RpbGVfc2l6ZSwgeXNpemUgLSB0aWxlX3kpOworICBhcmdiICs9IHRpbGVfeSAqIHhzaXplICsgdGlsZV94OworICB3aGlsZSAoeXNjYW4tLSA+IDApIHsKKyAgICBWUDhMVHJhbnNmb3JtQ29sb3IoJmNvbG9yX3RyYW5zZm9ybSwgYXJnYiwgeHNjYW4pOworICAgIGFyZ2IgKz0geHNpemU7CisgIH0KK30KKwordm9pZCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBpbWFnZSkgeworICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKKyAgY29uc3QgaW50IHRpbGVfeHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgYml0cyk7CisgIGNvbnN0IGludCB0aWxlX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBiaXRzKTsKKyAgaW50IGFjY3VtdWxhdGVkX3JlZF9oaXN0b1syNTZdID0geyAwIH07CisgIGludCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvWzI1Nl0gPSB7IDAgfTsKKyAgaW50IHRpbGVfeCwgdGlsZV95OworICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBwcmV2X3k7CisgIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZfeSk7CisgIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZfeCk7CisgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZV95c2l6ZTsgKyt0aWxlX3kpIHsKKyAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVfeHNpemU7ICsrdGlsZV94KSB7CisgICAgICBpbnQgeTsKKyAgICAgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKKyAgICAgIGNvbnN0IGludCB0aWxlX3lfb2Zmc2V0ID0gdGlsZV95ICogbWF4X3RpbGVfc2l6ZTsKKyAgICAgIGNvbnN0IGludCBhbGxfeF9tYXggPSBHZXRNaW4odGlsZV94X29mZnNldCArIG1heF90aWxlX3NpemUsIHdpZHRoKTsKKyAgICAgIGNvbnN0IGludCBhbGxfeV9tYXggPSBHZXRNaW4odGlsZV95X29mZnNldCArIG1heF90aWxlX3NpemUsIGhlaWdodCk7CisgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeDsKKyAgICAgIGlmICh0aWxlX3kgIT0gMCkgeworICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlW29mZnNldCAtIHRpbGVfeHNpemVdLCAmcHJldl95KTsKKyAgICAgIH0KKyAgICAgIHByZXZfeCA9IEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUodGlsZV94LCB0aWxlX3ksIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeCwgcHJldl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZF9yZWRfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IpOworICAgICAgaW1hZ2Vbb2Zmc2V0XSA9IE11bHRpcGxpZXJzVG9Db2xvckNvZGUoJnByZXZfeCk7CisgICAgICBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3hfb2Zmc2V0LCB0aWxlX3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RpbGVfc2l6ZSwgcHJldl94LCBhcmdiKTsKKworICAgICAgLy8gR2F0aGVyIGFjY3VtdWxhdGVkIGhpc3RvZ3JhbSBkYXRhLgorICAgICAgZm9yICh5ID0gdGlsZV95X29mZnNldDsgeSA8IGFsbF95X21heDsgKyt5KSB7CisgICAgICAgIGludCBpeCA9IHkgKiB3aWR0aCArIHRpbGVfeF9vZmZzZXQ7CisgICAgICAgIGNvbnN0IGludCBpeF9lbmQgPSBpeCArIGFsbF94X21heCAtIHRpbGVfeF9vZmZzZXQ7CisgICAgICAgIGZvciAoOyBpeCA8IGl4X2VuZDsgKytpeCkgeworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IGFyZ2JbaXhdOworICAgICAgICAgIGlmIChpeCA+PSAyICYmCisgICAgICAgICAgICAgIHBpeCA9PSBhcmdiW2l4IC0gMl0gJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSAxXSkgeworICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXggPj0gd2lkdGggKyAyICYmCisgICAgICAgICAgICAgIGFyZ2JbaXggLSAyXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAyXSAmJgorICAgICAgICAgICAgICBhcmdiW2l4IC0gMV0gPT0gYXJnYltpeCAtIHdpZHRoIC0gMV0gJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSB3aWR0aF0pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gcmVwZWF0ZWQgcGl4ZWxzIGFyZSBoYW5kbGVkIGJ5IGJhY2t3YXJkIHJlZmVyZW5jZXMKKyAgICAgICAgICB9CisgICAgICAgICAgKythY2N1bXVsYXRlZF9yZWRfaGlzdG9bKHBpeCA+PiAxNikgJiAweGZmXTsKKyAgICAgICAgICArK2FjY3VtdWxhdGVkX2JsdWVfaGlzdG9bKHBpeCA+PiAwKSAmIDB4ZmZdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3F1YW50X2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9xdWFudF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFmZDRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9xdWFudF9lbmMuYwpAQCAtMCwwICsxLDEzNzcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIFF1YW50aXphdGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKKyNkZWZpbmUgRE9fVFJFTExJU19JNCAgMQorI2RlZmluZSBET19UUkVMTElTX0kxNiAxICAgLy8gbm90IGEgaHVnZSBnYWluLCBidXQgb2sgYXQgbG93IGJpdHJhdGUuCisjZGVmaW5lIERPX1RSRUxMSVNfVVYgIDAgICAvLyBkaXNhYmxlIHRyZWxsaXMgZm9yIFVWLiBSaXNreS4gTm90IHdvcnRoLgorI2RlZmluZSBVU0VfVERJU1RPIDEKKworI2RlZmluZSBNSURfQUxQSEEgNjQgICAgICAvLyBuZXV0cmFsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorI2RlZmluZSBNSU5fQUxQSEEgMzAgICAgICAvLyBsb3dlc3QgdXNhYmxlIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorI2RlZmluZSBNQVhfQUxQSEEgMTAwICAgICAvLyBoaWdoZXIgbWVhbmluZ2Z1bCB2YWx1ZSBmb3Igc3VzY2VwdGliaWxpdHkKKworI2RlZmluZSBTTlNfVE9fRFEgMC45ICAgICAvLyBTY2FsaW5nIGNvbnN0YW50IGJldHdlZW4gdGhlIHNucyB2YWx1ZSBhbmQgdGhlIFFQCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyLWxhdyBtb2R1bGF0aW9uLiBNdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiAxLgorCisvLyBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZzIGJlbG93IHdoaWNoIHdlIGNvbnNpZGVyIHRoZSBibG9jayB2ZXJ5IGZsYXQKKy8vIChhbmQgYXBwbHkgYSBwZW5hbHR5IHRvIGNvbXBsZXggcHJlZGljdGlvbnMpCisjZGVmaW5lIEZMQVRORVNTX0xJTUlUX0kxNiAxMCAgICAgIC8vIEkxNiBtb2RlCisjZGVmaW5lIEZMQVRORVNTX0xJTUlUX0k0ICAzICAgICAgIC8vIEk0IG1vZGUKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfVVYgIDIgICAgICAgLy8gVVYgbW9kZQorI2RlZmluZSBGTEFUTkVTU19QRU5BTFRZICAgMTQwICAgICAvLyByb3VnaGx5IH4xYml0IHBlciBibG9jaworCisjZGVmaW5lIE1VTFRfOEIoYSwgYikgKCgoYSkgKiAoYikgKyAxMjgpID4+IDgpCisKKyNkZWZpbmUgUkRfRElTVE9fTVVMVCAgICAgIDI1NiAgLy8gZGlzdG9ydGlvbiBtdWx0aXBsaWVyIChlcXVpdmFsZW50IG9mIGxhbWJkYSkKKworLy8gI2RlZmluZSBERUJVR19CTE9DSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChERUJVR19CTE9DSykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIFByaW50QmxvY2tJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IGludCBpc19pMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlfaW4gPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeV9vdXQgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHV2X2luID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHV2X291dCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgcHJpbnRmKCJTT1VSQ0UgLyBPVVRQVVQgLyBBQlMgREVMVEFcbiIpOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB5X2luW2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB5X291dFtpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICAgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlMWQgIiwgYWJzKHlfaW5baSArIGogKiBCUFNdIC0geV9vdXRbaSArIGogKiBCUFNdKSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuIik7ICAgLy8gbmV3bGluZSBiZWZvcmUgdGhlIFUvViBibG9jaworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9vdXRbaSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfb3V0W2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnModXZfb3V0W2kgKyBqICogQlBTXSAtIHV2X2luW2kgKyBqICogQlBTXSkpOworICAgIH0KKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlMWQgIiwgYWJzKHV2X291dFtpICsgaiAqIEJQU10gLSB1dl9pbltpICsgaiAqIEJQU10pKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigiXG5EOiVkIFNEOiVkIFI6JWQgSDolZCBuejoweCV4IHNjb3JlOiVkXG4iLAorICAgIChpbnQpcmQtPkQsIChpbnQpcmQtPlNELCAoaW50KXJkLT5SLCAoaW50KXJkLT5ILCAoaW50KXJkLT5ueiwKKyAgICAoaW50KXJkLT5zY29yZSk7CisgIGlmIChpc19pMTYpIHsKKyAgICBwcmludGYoIk1vZGU6ICVkXG4iLCByZC0+bW9kZV9pMTYpOworICAgIHByaW50ZigieV9kY19sZXZlbHM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHJkLT55X2RjX2xldmVsc1tpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiTW9kZXNbMTZdOiAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlZCAiLCByZC0+bW9kZXNfaTRbaV0pOworICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoInlfYWNfbGV2ZWxzOlxuIik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgZm9yIChpID0gaXNfaTE2ID8gMSA6IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiU0ZCAiLCByZC0+eV9hY19sZXZlbHNbal1baV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoInV2X2xldmVscyAobW9kZT0lZCk6XG4iLCByZC0+bW9kZV91dik7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlNGQgIiwgcmQtPnV2X2xldmVsc1tqXVtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorfQorCisjZW5kaWYgICAvLyBERUJVR19CTE9DSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBtLCBpbnQgTSkgeworICByZXR1cm4gdiA8IG0gPyBtIDogdiA+IE0gPyBNIDogdjsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ppZ3phZ1sxNl0gPSB7CisgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEY1RhYmxlWzEyOF0gPSB7CisgIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEwLAorICAxMSwgICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxNywKKyAgMTgsICAgMTksICAyMCwgIDIwLCAgMjEsICAyMSwgIDIyLCAgMjIsCisgIDIzLCAgIDIzLCAgMjQsICAyNSwgIDI1LCAgMjYsICAyNywgIDI4LAorICAyOSwgICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwKKyAgMzcsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLAorICA1MSwgICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwKKyAgNTksICAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsCisgIDY3LCAgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LAorICA3NSwgICA3NiwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwKKyAgODIsICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksCisgIDkxLCAgIDkzLCAgOTUsICA5NiwgIDk4LCAxMDAsIDEwMSwgMTAyLAorICAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwgMTE0LCAxMTYsIDExOCwKKyAgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAxMzYsCisgIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ4LCAxNTEsIDE1NCwgMTU3Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsCisgIDEyLCAgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LAorICAyMCwgICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywKKyAgMjgsICAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCisgIDM2LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAorICA0NCwgICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwKKyAgNTIsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNjAsCisgIDYyLCAgIDY0LCAgNjYsICA2OCwgIDcwLCAgNzIsICA3NCwgIDc2LAorICA3OCwgICA4MCwgIDgyLCAgODQsICA4NiwgIDg4LCAgOTAsICA5MiwKKyAgOTQsICAgOTYsICA5OCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsCisgIDExMCwgMTEyLCAxMTQsIDExNiwgMTE5LCAxMjIsIDEyNSwgMTI4LAorICAxMzEsIDEzNCwgMTM3LCAxNDAsIDE0MywgMTQ2LCAxNDksIDE1MiwKKyAgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsIDE3MCwgMTczLCAxNzcsCisgIDE4MSwgMTg1LCAxODksIDE5MywgMTk3LCAyMDEsIDIwNSwgMjA5LAorICAyMTMsIDIxNywgMjIxLCAyMjUsIDIyOSwgMjM0LCAyMzksIDI0NSwKKyAgMjQ5LCAyNTQsIDI1OSwgMjY0LCAyNjksIDI3NCwgMjc5LCAyODQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZTJbMTI4XSA9IHsKKyAgOCwgICAgIDgsICAgOSwgIDEwLCAgMTIsICAxMywgIDE1LCAgMTcsCisgIDE4LCAgIDIwLCAgMjEsICAyMywgIDI0LCAgMjYsICAyNywgIDI5LAorICAzMSwgICAzMiwgIDM0LCAgMzUsICAzNywgIDM4LCAgNDAsICA0MSwKKyAgNDMsICAgNDQsICA0NiwgIDQ4LCAgNDksICA1MSwgIDUyLCAgNTQsCisgIDU1LCAgIDU3LCAgNTgsICA2MCwgIDYyLCAgNjMsICA2NSwgIDY2LAorICA2OCwgICA2OSwgIDcxLCAgNzIsICA3NCwgIDc1LCAgNzcsICA3OSwKKyAgODAsICAgODIsICA4MywgIDg1LCAgODYsICA4OCwgIDg5LCAgOTMsCisgIDk2LCAgIDk5LCAxMDIsIDEwNSwgMTA4LCAxMTEsIDExNCwgMTE3LAorICAxMjAsIDEyNCwgMTI3LCAxMzAsIDEzMywgMTM2LCAxMzksIDE0MiwKKyAgMTQ1LCAxNDgsIDE1MSwgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsCisgIDE3MCwgMTczLCAxNzYsIDE3OSwgMTg0LCAxODksIDE5MywgMTk4LAorICAyMDMsIDIwNywgMjEyLCAyMTcsIDIyMSwgMjI2LCAyMzAsIDIzNSwKKyAgMjQwLCAyNDQsIDI0OSwgMjU0LCAyNTgsIDI2MywgMjY4LCAyNzQsCisgIDI4MCwgMjg2LCAyOTIsIDI5OSwgMzA1LCAzMTEsIDMxNywgMzIzLAorICAzMzAsIDMzNiwgMzQyLCAzNDgsIDM1NCwgMzYyLCAzNzAsIDM3OSwKKyAgMzg1LCAzOTMsIDQwMSwgNDA5LCA0MTYsIDQyNCwgNDMyLCA0NDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCaWFzTWF0cmljZXNbM11bMl0gPSB7ICAvLyBbbHVtYS1hYyxsdW1hLWRjLGNocm9tYV1bZGMsYWNdCisgIHsgOTYsIDExMCB9LCB7IDk2LCAxMDggfSwgeyAxMTAsIDExNSB9Cit9OworCisvLyBTaGFycGVuaW5nIGJ5IChzbGlnaHRseSkgcmFpc2luZyB0aGUgaGktZnJlcXVlbmN5IGNvZWZmcy4KKy8vIEhhY2staXNoIGJ1dCBoZWxwZnVsIGZvciBtaWQtYml0cmF0ZSByYW5nZS4gVXNlIHdpdGggY2FyZS4KKyNkZWZpbmUgU0hBUlBFTl9CSVRTIDExICAvLyBudW1iZXIgb2YgZGVzY2FsaW5nIGJpdHMgZm9yIHNoYXJwZW5pbmcgYmlhcworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZyZXFTaGFycGVuaW5nWzE2XSA9IHsKKyAgMCwgIDMwLCA2MCwgOTAsCisgIDMwLCA2MCwgOTAsIDkwLAorICA2MCwgOTAsIDkwLCA5MCwKKyAgOTAsIDkwLCA5MCwgOTAKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGluIFZQOE1hdHJpeAorCisvLyBSZXR1cm5zIHRoZSBhdmVyYWdlIHF1YW50aXplcgorc3RhdGljIGludCBFeHBhbmRNYXRyaXgoVlA4TWF0cml4KiBjb25zdCBtLCBpbnQgdHlwZSkgeworICBpbnQgaSwgc3VtOworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgY29uc3QgaW50IGlzX2FjX2NvZWZmID0gKGkgPiAwKTsKKyAgICBjb25zdCBpbnQgYmlhcyA9IGtCaWFzTWF0cmljZXNbdHlwZV1baXNfYWNfY29lZmZdOworICAgIG0tPmlxX1tpXSA9ICgxIDw8IFFGSVgpIC8gbS0+cV9baV07CisgICAgbS0+Ymlhc19baV0gPSBCSUFTKGJpYXMpOworICAgIC8vIHp0aHJlc2hfIGlzIHRoZSBleGFjdCB2YWx1ZSBzdWNoIHRoYXQgUVVBTlRESVYoY29lZmYsIGlRLCBCKSBpczoKKyAgICAvLyAgICogemVybyBpZiBjb2VmZiA8PSB6dGhyZXNoCisgICAgLy8gICAqIG5vbi16ZXJvIGlmIGNvZWZmID4genRocmVzaAorICAgIG0tPnp0aHJlc2hfW2ldID0gKCgxIDw8IFFGSVgpIC0gMSAtIG0tPmJpYXNfW2ldKSAvIG0tPmlxX1tpXTsKKyAgfQorICBmb3IgKGkgPSAyOyBpIDwgMTY7ICsraSkgeworICAgIG0tPnFfW2ldID0gbS0+cV9bMV07CisgICAgbS0+aXFfW2ldID0gbS0+aXFfWzFdOworICAgIG0tPmJpYXNfW2ldID0gbS0+Ymlhc19bMV07CisgICAgbS0+enRocmVzaF9baV0gPSBtLT56dGhyZXNoX1sxXTsKKyAgfQorICBmb3IgKHN1bSA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmICh0eXBlID09IDApIHsgIC8vIHdlIG9ubHkgdXNlIHNoYXJwZW5pbmcgZm9yIEFDIGx1bWEgY29lZmZzCisgICAgICBtLT5zaGFycGVuX1tpXSA9IChrRnJlcVNoYXJwZW5pbmdbaV0gKiBtLT5xX1tpXSkgPj4gU0hBUlBFTl9CSVRTOworICAgIH0gZWxzZSB7CisgICAgICBtLT5zaGFycGVuX1tpXSA9IDA7CisgICAgfQorICAgIHN1bSArPSBtLT5xX1tpXTsKKyAgfQorICByZXR1cm4gKHN1bSArIDgpID4+IDQ7Cit9CisKK3N0YXRpYyB2b2lkIENoZWNrTGFtYmRhVmFsdWUoaW50KiBjb25zdCB2KSB7IGlmICgqdiA8IDEpICp2ID0gMTsgfQorCitzdGF0aWMgdm9pZCBTZXR1cE1hdHJpY2VzKFZQOEVuY29kZXIqIGVuYykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRsYW1iZGFfc2NhbGUgPQorICAgIChlbmMtPm1ldGhvZF8gPj0gNCkgPyBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7CisgICAgVlA4U2VnbWVudEluZm8qIGNvbnN0IG0gPSAmZW5jLT5kcW1fW2ldOworICAgIGNvbnN0IGludCBxID0gbS0+cXVhbnRfOworICAgIGludCBxX2k0LCBxX2kxNiwgcV91djsKKyAgICBtLT55MV8ucV9bMF0gPSBrRGNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3kxX2RjXywgMCwgMTI3KV07CisgICAgbS0+eTFfLnFfWzFdID0ga0FjVGFibGVbY2xpcChxLCAgICAgICAgICAgICAgICAgIDAsIDEyNyldOworCisgICAgbS0+eTJfLnFfWzBdID0ga0RjVGFibGVbIGNsaXAocSArIGVuYy0+ZHFfeTJfZGNfLCAwLCAxMjcpXSAqIDI7CisgICAgbS0+eTJfLnFfWzFdID0ga0FjVGFibGUyW2NsaXAocSArIGVuYy0+ZHFfeTJfYWNfLCAwLCAxMjcpXTsKKworICAgIG0tPnV2Xy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfZGNfLCAwLCAxMTcpXTsKKyAgICBtLT51dl8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3V2X2FjXywgMCwgMTI3KV07CisKKyAgICBxX2k0ICA9IEV4cGFuZE1hdHJpeCgmbS0+eTFfLCAwKTsKKyAgICBxX2kxNiA9IEV4cGFuZE1hdHJpeCgmbS0+eTJfLCAxKTsKKyAgICBxX3V2ICA9IEV4cGFuZE1hdHJpeCgmbS0+dXZfLCAyKTsKKworICAgIG0tPmxhbWJkYV9pNF8gICAgICAgICAgPSAoMyAqIHFfaTQgKiBxX2k0KSA+PiA3OworICAgIG0tPmxhbWJkYV9pMTZfICAgICAgICAgPSAoMyAqIHFfaTE2ICogcV9pMTYpOworICAgIG0tPmxhbWJkYV91dl8gICAgICAgICAgPSAoMyAqIHFfdXYgKiBxX3V2KSA+PiA2OworICAgIG0tPmxhbWJkYV9tb2RlXyAgICAgICAgPSAoMSAqIHFfaTQgKiBxX2k0KSA+PiA3OworICAgIG0tPmxhbWJkYV90cmVsbGlzX2k0XyAgPSAoNyAqIHFfaTQgKiBxX2k0KSA+PiAzOworICAgIG0tPmxhbWJkYV90cmVsbGlzX2kxNl8gPSAocV9pMTYgKiBxX2kxNikgPj4gMjsKKyAgICBtLT5sYW1iZGFfdHJlbGxpc191dl8gID0gKHFfdXYgKiBxX3V2KSA8PCAxOworICAgIG0tPnRsYW1iZGFfICAgICAgICAgICAgPSAodGxhbWJkYV9zY2FsZSAqIHFfaTQpID4+IDU7CisKKyAgICAvLyBub25lIG9mIHRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgPCAxCisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX2k0Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX2kxNl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV91dl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV9tb2RlXyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX3RyZWxsaXNfaTRfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc19pMTZfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc191dl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPnRsYW1iZGFfKTsKKworICAgIG0tPm1pbl9kaXN0b18gPSAyMCAqIG0tPnkxXy5xX1swXTsgICAvLyBxdWFudGl6YXRpb24tYXdhcmUgbWluIGRpc3RvCisgICAgbS0+bWF4X2VkZ2VfICA9IDA7CisKKyAgICBtLT5pNF9wZW5hbHR5XyA9IDEwMDAgKiBxX2k0ICogcV9pNDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdGlhbGl6ZSBmaWx0ZXJpbmcgcGFyYW1ldGVycworCisvLyBWZXJ5IHNtYWxsIGZpbHRlci1zdHJlbmd0aCB2YWx1ZXMgaGF2ZSBjbG9zZSB0byBubyB2aXN1YWwgZWZmZWN0LiBTbyB3ZSBjYW4KKy8vIHNhdmUgYSBsaXR0bGUgZGVjb2RpbmctQ1BVIGJ5IHR1cm5pbmcgZmlsdGVyaW5nIG9mZiBmb3IgdGhlc2UuCisjZGVmaW5lIEZTVFJFTkdUSF9DVVRPRkYgMgorCitzdGF0aWMgdm9pZCBTZXR1cEZpbHRlclN0cmVuZ3RoKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgaTsKKyAgLy8gbGV2ZWwwIGlzIGluIFswLi41MDBdLiBVc2luZyAnLWYgNTAnIGFzIGZpbHRlcl9zdHJlbmd0aCBpcyBtaWQtZmlsdGVyaW5nLgorICBjb25zdCBpbnQgbGV2ZWwwID0gNSAqIGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3N0cmVuZ3RoOworICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgbSA9ICZlbmMtPmRxbV9baV07CisgICAgLy8gV2UgZm9jdXMgb24gdGhlIHF1YW50aXphdGlvbiBvZiBBQyBjb2VmZnMuCisgICAgY29uc3QgaW50IHFzdGVwID0ga0FjVGFibGVbY2xpcChtLT5xdWFudF8sIDAsIDEyNyldID4+IDI7CisgICAgY29uc3QgaW50IGJhc2Vfc3RyZW5ndGggPQorICAgICAgICBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18sIHFzdGVwKTsKKyAgICAvLyBTZWdtZW50cyB3aXRoIGxvd2VyIGNvbXBsZXhpdHkgKCdiZXRhJykgd2lsbCBiZSBsZXNzIGZpbHRlcmVkLgorICAgIGNvbnN0IGludCBmID0gYmFzZV9zdHJlbmd0aCAqIGxldmVsMCAvICgyNTYgKyBtLT5iZXRhXyk7CisgICAgbS0+ZnN0cmVuZ3RoXyA9IChmIDwgRlNUUkVOR1RIX0NVVE9GRikgPyAwIDogKGYgPiA2MykgPyA2MyA6IGY7CisgIH0KKyAgLy8gV2UgcmVjb3JkIHRoZSBpbml0aWFsIHN0cmVuZ3RoIChtYWlubHkgZm9yIHRoZSBjYXNlIG9mIDEtc2VnbWVudCBvbmx5KS4KKyAgZW5jLT5maWx0ZXJfaGRyXy5sZXZlbF8gPSBlbmMtPmRxbV9bMF0uZnN0cmVuZ3RoXzsKKyAgZW5jLT5maWx0ZXJfaGRyXy5zaW1wbGVfID0gKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3R5cGUgPT0gMCk7CisgIGVuYy0+ZmlsdGVyX2hkcl8uc2hhcnBuZXNzXyA9IGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3NoYXJwbmVzczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZTogaWYgeW91IGNoYW5nZSB0aGUgdmFsdWVzIGJlbG93LCByZW1lbWJlciB0aGF0IHRoZSBtYXggcmFuZ2UKKy8vIGFsbG93ZWQgYnkgdGhlIHN5bnRheCBmb3IgRFFfVVYgaXMgWy0xNiwxNl0uCisjZGVmaW5lIE1BWF9EUV9VViAoNikKKyNkZWZpbmUgTUlOX0RRX1VWICgtNCkKKworLy8gV2Ugd2FudCB0byBlbXVsYXRlIGpwZWctbGlrZSBiZWhhdmlvdXIgd2hlcmUgdGhlIGV4cGVjdGVkICJnb29kIiBxdWFsaXR5CisvLyBpcyBhcm91bmQgcT03NS4gSW50ZXJuYWxseSwgb3VyICJnb29kIiBtaWRkbGUgaXMgYXJvdW5kIGM9NTAuIFNvIHdlCisvLyBtYXAgYWNjb3JkaW5nbHkgdXNpbmcgbGluZWFyIHBpZWNlLXdpc2UgZnVuY3Rpb24KK3N0YXRpYyBkb3VibGUgUXVhbGl0eVRvQ29tcHJlc3Npb24oZG91YmxlIGMpIHsKKyAgY29uc3QgZG91YmxlIGxpbmVhcl9jID0gKGMgPCAwLjc1KSA/IGMgKiAoMi4gLyAzLikgOiAyLiAqIGMgLSAxLjsKKyAgLy8gVGhlIGZpbGUgc2l6ZSByb3VnaGx5IHNjYWxlcyBhcyBwb3cocXVhbnRpemVyLCAzLikuIEFjdHVhbGx5LCB0aGUKKyAgLy8gZXhwb25lbnQgaXMgc29tZXdoZXJlIGJldHdlZW4gMi44IGFuZCAzLjIsIGJ1dCB3ZSdyZSBtb3N0bHkgaW50ZXJlc3RlZAorICAvLyBpbiB0aGUgbWlkLXF1YW50IHJhbmdlLiBTbyB3ZSBzY2FsZSB0aGUgY29tcHJlc3NpYmlsaXR5IGludmVyc2VseSB0bworICAvLyB0aGlzIHBvd2VyLWxhdzogcXVhbnQgfj0gY29tcHJlc3Npb24gXiAxLzMuIFRoaXMgbGF3IGhvbGRzIHdlbGwgZm9yCisgIC8vIGxvdyBxdWFudC4gRmluZXIgbW9kZWxpbmcgZm9yIGhpZ2gtcXVhbnQgd291bGQgbWFrZSB1c2Ugb2Yga0FjVGFibGVbXQorICAvLyBtb3JlIGV4cGxpY2l0bHkuCisgIGNvbnN0IGRvdWJsZSB2ID0gcG93KGxpbmVhcl9jLCAxIC8gMy4pOworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oZG91YmxlIGMsIGRvdWJsZSBhbHBoYSkgeworICAvLyBXZSBtYXAgdGhlIGNvbXBsZXhpdHkgJ2FscGhhJyBhbmQgcXVhbGl0eSBzZXR0aW5nICdjJyB0byBhIGNvbXByZXNzaW9uCisgIC8vIGV4cG9uZW50IGVtcGlyaWNhbGx5IG1hdGNoZWQgdG8gdGhlIGNvbXByZXNzaW9uIGN1cnZlIG9mIGxpYmpwZWc2Yi4KKyAgLy8gT24gYXZlcmFnZSwgdGhlIFdlYlAgb3V0cHV0IHNpemUgd2lsbCBiZSByb3VnaGx5IHNpbWlsYXIgdG8gdGhhdCBvZiBhCisgIC8vIEpQRUcgZmlsZSBjb21wcmVzc2VkIHdpdGggc2FtZSBxdWFsaXR5IGZhY3Rvci4KKyAgY29uc3QgZG91YmxlIGFtaW4gPSAwLjMwOworICBjb25zdCBkb3VibGUgYW1heCA9IDAuODU7CisgIGNvbnN0IGRvdWJsZSBleHBfbWluID0gMC40OworICBjb25zdCBkb3VibGUgZXhwX21heCA9IDAuOTsKKyAgY29uc3QgZG91YmxlIHNsb3BlID0gKGV4cF9taW4gLSBleHBfbWF4KSAvIChhbWF4IC0gYW1pbik7CisgIC8vIExpbmVhcmx5IGludGVycG9sYXRlICdleHBuJyBmcm9tIGV4cF9taW4gdG8gZXhwX21heAorICAvLyBpbiB0aGUgW2FtaW4sIGFtYXhdIHJhbmdlLgorICBjb25zdCBkb3VibGUgZXhwbiA9IChhbHBoYSA+IGFtYXgpID8gZXhwX21pbgorICAgICAgICAgICAgICAgICAgICA6IChhbHBoYSA8IGFtaW4pID8gZXhwX21heAorICAgICAgICAgICAgICAgICAgICA6IGV4cF9tYXggKyBzbG9wZSAqIChhbHBoYSAtIGFtaW4pOworICBjb25zdCBkb3VibGUgdiA9IHBvdyhjLCBleHBuKTsKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgU2VnbWVudHNBcmVFcXVpdmFsZW50KGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMikgeworICByZXR1cm4gKFMxLT5xdWFudF8gPT0gUzItPnF1YW50XykgJiYgKFMxLT5mc3RyZW5ndGhfID09IFMyLT5mc3RyZW5ndGhfKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxpZnlTZWdtZW50cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IG1hcFtOVU1fTUJfU0VHTUVOVFNdID0geyAwLCAxLCAyLCAzIH07CisgIC8vICdudW1fc2VnbWVudHNfJyBpcyBwcmV2aW91c2x5IHZhbGlkYXRlZCBhbmQgPD0gTlVNX01CX1NFR01FTlRTLCBidXQgYW4KKyAgLy8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGEgc3B1cmlvdXMgd2FybmluZyBhYm91dCAnaScgZXhjZWVkaW5nCisgIC8vIGFycmF5IGJvdW5kcyBvZiAnZHFtXycgd2l0aCBzb21lIGNvbXBpbGVycyAobm90aWNlZCB3aXRoIGdjYy00LjkpLgorICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPCBOVU1fTUJfU0VHTUVOVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fTUJfU0VHTUVOVFM7CisgIGludCBudW1fZmluYWxfc2VnbWVudHMgPSAxOworICBpbnQgczEsIHMyOworICBmb3IgKHMxID0gMTsgczEgPCBudW1fc2VnbWVudHM7ICsrczEpIHsgICAgLy8gZmluZCBzaW1pbGFyIHNlZ21lbnRzCisgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxID0gJmVuYy0+ZHFtX1tzMV07CisgICAgaW50IGZvdW5kID0gMDsKKyAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgc2ltaWxhciBzZWdtZW50CisgICAgZm9yIChzMiA9IDA7IHMyIDwgbnVtX2ZpbmFsX3NlZ21lbnRzOyArK3MyKSB7CisgICAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzIgPSAmZW5jLT5kcW1fW3MyXTsKKyAgICAgIGlmIChTZWdtZW50c0FyZUVxdWl2YWxlbnQoUzEsIFMyKSkgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtYXBbczFdID0gczI7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgaWYgKG51bV9maW5hbF9zZWdtZW50cyAhPSBzMSkgeworICAgICAgICBlbmMtPmRxbV9bbnVtX2ZpbmFsX3NlZ21lbnRzXSA9IGVuYy0+ZHFtX1tzMV07CisgICAgICB9CisgICAgICArK251bV9maW5hbF9zZWdtZW50czsKKyAgICB9CisgIH0KKyAgaWYgKG51bV9maW5hbF9zZWdtZW50cyA8IG51bV9zZWdtZW50cykgeyAgLy8gUmVtYXAKKyAgICBpbnQgaSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICAgIHdoaWxlIChpLS0gPiAwKSBlbmMtPm1iX2luZm9fW2ldLnNlZ21lbnRfID0gbWFwW2VuYy0+bWJfaW5mb19baV0uc2VnbWVudF9dOworICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPSBudW1fZmluYWxfc2VnbWVudHM7CisgICAgLy8gUmVwbGljYXRlIHRoZSB0cmFpbGluZyBzZWdtZW50IGluZm9zIChpdCdzIG1vc3RseSBjb3NtZXRpY3MpCisgICAgZm9yIChpID0gbnVtX2ZpbmFsX3NlZ21lbnRzOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICAgIGVuYy0+ZHFtX1tpXSA9IGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHMgLSAxXTsKKyAgICB9CisgIH0KK30KKwordm9pZCBWUDhTZXRTZWdtZW50UGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcXVhbGl0eSkgeworICBpbnQgaTsKKyAgaW50IGRxX3V2X2FjLCBkcV91dl9kYzsKKyAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187CisgIGNvbnN0IGRvdWJsZSBhbXAgPSBTTlNfVE9fRFEgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMC4gLyAxMjguOworICBjb25zdCBkb3VibGUgUSA9IHF1YWxpdHkgLyAxMDAuOworICBjb25zdCBkb3VibGUgY19iYXNlID0gZW5jLT5jb25maWdfLT5lbXVsYXRlX2pwZWdfc2l6ZSA/CisgICAgICBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oUSwgZW5jLT5hbHBoYV8gLyAyNTUuKSA6CisgICAgICBRdWFsaXR5VG9Db21wcmVzc2lvbihRKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7CisgICAgLy8gV2UgbW9kdWxhdGUgdGhlIGJhc2UgY29lZmZpY2llbnQgdG8gYWNjb21tb2RhdGUgZm9yIHRoZSBxdWFudGl6YXRpb24KKyAgICAvLyBzdXNjZXB0aWJpbGl0eSBhbmQgYWxsb3cgZGVuc2VyIHNlZ21lbnRzIHRvIGJlIHF1YW50aXplZCBtb3JlLgorICAgIGNvbnN0IGRvdWJsZSBleHBuID0gMS4gLSBhbXAgKiBlbmMtPmRxbV9baV0uYWxwaGFfOworICAgIGNvbnN0IGRvdWJsZSBjID0gcG93KGNfYmFzZSwgZXhwbik7CisgICAgY29uc3QgaW50IHEgPSAoaW50KSgxMjcuICogKDEuIC0gYykpOworICAgIGFzc2VydChleHBuID4gMC4pOworICAgIGVuYy0+ZHFtX1tpXS5xdWFudF8gPSBjbGlwKHEsIDAsIDEyNyk7CisgIH0KKworICAvLyBwdXJlbHkgaW5kaWNhdGl2ZSBpbiB0aGUgYml0c3RyZWFtIChleGNlcHQgZm9yIHRoZSAxLXNlZ21lbnQgY2FzZSkKKyAgZW5jLT5iYXNlX3F1YW50XyA9IGVuYy0+ZHFtX1swXS5xdWFudF87CisKKyAgLy8gZmlsbC1pbiB2YWx1ZXMgZm9yIHRoZSB1bnVzZWQgc2VnbWVudHMgKHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpCisgIGZvciAoaSA9IG51bV9zZWdtZW50czsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7CisgICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGVuYy0+YmFzZV9xdWFudF87CisgIH0KKworICAvLyB1dl9hbHBoYV8gaXMgbm9ybWFsbHkgc3ByZWFkIGFyb3VuZCB+NjAuIFRoZSB1c2VmdWwgcmFuZ2UgaXMKKyAgLy8gdHlwaWNhbGx5IH4zMCAocXVpdGUgYmFkKSB0byB+MTAwIChvayB0byBkZWNpbWF0ZSBVViBtb3JlKS4KKyAgLy8gV2UgbWFwIGl0IHRvIHRoZSBzYWZlIG1heGltYWwgcmFuZ2Ugb2YgTUFYL01JTl9EUV9VViBmb3IgZHFfdXYuCisgIGRxX3V2X2FjID0gKGVuYy0+dXZfYWxwaGFfIC0gTUlEX0FMUEhBKSAqIChNQVhfRFFfVVYgLSBNSU5fRFFfVVYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNQVhfQUxQSEEgLSBNSU5fQUxQSEEpOworICAvLyB3ZSByZXNjYWxlIGJ5IHRoZSB1c2VyLWRlZmluZWQgc3RyZW5ndGggb2YgYWRhcHRhdGlvbgorICBkcV91dl9hYyA9IGRxX3V2X2FjICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7CisgIC8vIGFuZCBtYWtlIGl0IHNhZmUuCisgIGRxX3V2X2FjID0gY2xpcChkcV91dl9hYywgTUlOX0RRX1VWLCBNQVhfRFFfVVYpOworICAvLyBXZSBhbHNvIGJvb3N0IHRoZSBkYy11di1xdWFudCBhIGxpdHRsZSwgYmFzZWQgb24gc25zLXN0cmVuZ3RoLCBzaW5jZQorICAvLyBVL1YgY2hhbm5lbHMgYXJlIHF1aXRlIG1vcmUgcmVhY3RpdmUgdG8gaGlnaCBxdWFudHMgKGZsYXQgREMtYmxvY2tzCisgIC8vIHRlbmQgdG8gYXBwZWFyLCBhbmQgYXJlIHVucGxlYXNhbnQpLgorICBkcV91dl9kYyA9IC00ICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7CisgIGRxX3V2X2RjID0gY2xpcChkcV91dl9kYywgLTE1LCAxNSk7ICAgLy8gNGJpdC1zaWduZWQgbWF4IGFsbG93ZWQKKworICBlbmMtPmRxX3kxX2RjXyA9IDA7ICAgICAgIC8vIFRPRE8oc2thbCk6IGRxLWx1bQorICBlbmMtPmRxX3kyX2RjXyA9IDA7CisgIGVuYy0+ZHFfeTJfYWNfID0gMDsKKyAgZW5jLT5kcV91dl9kY18gPSBkcV91dl9kYzsKKyAgZW5jLT5kcV91dl9hY18gPSBkcV91dl9hYzsKKworICBTZXR1cEZpbHRlclN0cmVuZ3RoKGVuYyk7ICAgLy8gaW5pdGlhbGl6ZSBzZWdtZW50cycgZmlsdGVyaW5nLCBldmVudHVhbGx5CisKKyAgaWYgKG51bV9zZWdtZW50cyA+IDEpIFNpbXBsaWZ5U2VnbWVudHMoZW5jKTsKKworICBTZXR1cE1hdHJpY2VzKGVuYyk7ICAgICAgICAgLy8gZmluYWxpemUgcXVhbnRpemF0aW9uIG1hdHJpY2VzCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtIHRoZSBwcmVkaWN0aW9ucyBpbiBjYWNoZQorCisvLyBNdXN0IGJlIG9yZGVyZWQgdXNpbmcge0RDX1BSRUQsIFRNX1BSRUQsIFZfUFJFRCwgSF9QUkVEfSBhcyBpbmRleAorY29uc3QgdWludDE2X3QgVlA4STE2TW9kZU9mZnNldHNbNF0gPSB7IEkxNkRDMTYsIEkxNlRNMTYsIEkxNlZFMTYsIEkxNkhFMTYgfTsKK2NvbnN0IHVpbnQxNl90IFZQOFVWTW9kZU9mZnNldHNbNF0gPSB7IEM4REM4LCBDOFRNOCwgQzhWRTgsIEM4SEU4IH07CisKKy8vIE11c3QgYmUgaW5kZXhlZCB1c2luZyB7Ql9EQ19QUkVEIC0+IEJfSFVfUFJFRH0gYXMgaW5kZXgKK2NvbnN0IHVpbnQxNl90IFZQOEk0TW9kZU9mZnNldHNbTlVNX0JNT0RFU10gPSB7CisgIEk0REM0LCBJNFRNNCwgSTRWRTQsIEk0SEU0LCBJNFJENCwgSTRWUjQsIEk0TEQ0LCBJNFZMNCwgSTRIRDQsIEk0SFU0Cit9OworCit2b2lkIFZQOE1ha2VMdW1hMTZQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgbGVmdCA9IGl0LT54XyA/IGl0LT55X2xlZnRfIDogTlVMTDsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdG9wID0gaXQtPnlfID8gaXQtPnlfdG9wXyA6IE5VTEw7CisgIFZQOEVuY1ByZWRMdW1hMTYoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKK30KKwordm9pZCBWUDhNYWtlQ2hyb21hOFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gaXQtPnVfbGVmdF8gOiBOVUxMOworICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+eV8gPyBpdC0+dXZfdG9wXyA6IE5VTEw7CisgIFZQOEVuY1ByZWRDaHJvbWE4KGl0LT55dXZfcF8sIGxlZnQsIHRvcCk7Cit9CisKK3ZvaWQgVlA4TWFrZUludHJhNFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNQcmVkTHVtYTQoaXQtPnl1dl9wXywgaXQtPmk0X3RvcF8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemUKKworLy8gTGF5b3V0OgorLy8gKy0tLS0rLS0tLSsKKy8vIHxZWVlZfFVVVlZ8IDAKKy8vIHxZWVlZfFVVVlZ8IDQKKy8vIHxZWVlZfC4uLi58IDgKKy8vIHxZWVlZfC4uLi58IDEyCisvLyArLS0tLSstLS0tKworCitjb25zdCB1aW50MTZfdCBWUDhTY2FuWzE2XSA9IHsgIC8vIEx1bWEKKyAgMCArICAwICogQlBTLCAgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMsCisgIDAgKyAgNCAqIEJQUywgIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTLAorICAwICsgIDggKiBCUFMsICA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUywKKyAgMCArIDEyICogQlBTLCAgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgVlA4U2NhblVWWzQgKyA0XSA9IHsKKyAgMCArIDAgKiBCUFMsICAgNCArIDAgKiBCUFMsIDAgKyA0ICogQlBTLCAgNCArIDQgKiBCUFMsICAgIC8vIFUKKyAgOCArIDAgKiBCUFMsICAxMiArIDAgKiBCUFMsIDggKyA0ICogQlBTLCAxMiArIDQgKiBCUFMgICAgIC8vIFYKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaXN0b3J0aW9uIG1lYXN1cmVtZW50CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrV2VpZ2h0WVsxNl0gPSB7CisgIDM4LCAzMiwgMjAsIDksIDMyLCAyOCwgMTcsIDcsIDIwLCAxNywgMTAsIDQsIDksIDcsIDQsIDIKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrV2VpZ2h0VHJlbGxpc1sxNl0gPSB7CisjaWYgVVNFX1RESVNUTyA9PSAwCisgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisjZWxzZQorICAzMCwgMjcsIDE5LCAxMSwKKyAgMjcsIDI0LCAxNywgMTAsCisgIDE5LCAxNywgMTIsICA4LAorICAxMSwgMTAsICA4LCAgNgorI2VuZGlmCit9OworCisvLyBJbml0L0NvcHkgdGhlIGNvbW1vbiBmaWVsZHMgaW4gc2NvcmUuCitzdGF0aWMgdm9pZCBJbml0U2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICByZC0+RCAgPSAwOworICByZC0+U0QgPSAwOworICByZC0+UiAgPSAwOworICByZC0+SCAgPSAwOworICByZC0+bnogPSAwOworICByZC0+c2NvcmUgPSBNQVhfQ09TVDsKK30KKworc3RhdGljIHZvaWQgQ29weVNjb3JlKFZQOE1vZGVTY29yZSogY29uc3QgZHN0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHNyYykgeworICBkc3QtPkQgID0gc3JjLT5EOworICBkc3QtPlNEID0gc3JjLT5TRDsKKyAgZHN0LT5SICA9IHNyYy0+UjsKKyAgZHN0LT5IICA9IHNyYy0+SDsKKyAgZHN0LT5ueiA9IHNyYy0+bno7ICAgICAgLy8gbm90ZSB0aGF0IG56IGlzIG5vdCBhY2N1bXVsYXRlZCwgYnV0IGp1c3QgY29waWVkLgorICBkc3QtPnNjb3JlID0gc3JjLT5zY29yZTsKK30KKworc3RhdGljIHZvaWQgQWRkU2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCBkc3QsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3Qgc3JjKSB7CisgIGRzdC0+RCAgKz0gc3JjLT5EOworICBkc3QtPlNEICs9IHNyYy0+U0Q7CisgIGRzdC0+UiAgKz0gc3JjLT5SOworICBkc3QtPkggICs9IHNyYy0+SDsKKyAgZHN0LT5ueiB8PSBzcmMtPm56OyAgICAgLy8gaGVyZSwgbmV3IG56IGJpdHMgYXJlIGFjY3VtdWxhdGVkLgorICBkc3QtPnNjb3JlICs9IHNyYy0+c2NvcmU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQZXJmb3JtcyB0cmVsbGlzLW9wdGltaXplZCBxdWFudGl6YXRpb24uCisKKy8vIFRyZWxsaXMgbm9kZQordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQ4X3QgcHJldjsgICAgICAgICAgICAvLyBiZXN0IHByZXZpb3VzIG5vZGUKKyAgaW50OF90IHNpZ247ICAgICAgICAgICAgLy8gc2lnbiBvZiBjb2VmZl9pCisgIGludDE2X3QgbGV2ZWw7ICAgICAgICAgIC8vIGxldmVsCit9IE5vZGU7CisKKy8vIFNjb3JlIHN0YXRlCit0eXBlZGVmIHN0cnVjdCB7CisgIHNjb3JlX3Qgc2NvcmU7ICAgICAgICAgIC8vIHBhcnRpYWwgUkQgc2NvcmUKKyAgY29uc3QgdWludDE2X3QqIGNvc3RzOyAgLy8gc2hvcnRjdXQgdG8gY29zdCB0YWJsZXMKK30gU2NvcmVTdGF0ZTsKKworLy8gSWYgYSBjb2VmZmljaWVudCB3YXMgcXVhbnRpemVkIHRvIGEgdmFsdWUgUSAodXNpbmcgYSBuZXV0cmFsIGJpYXMpLAorLy8gd2UgdGVzdCBhbGwgYWx0ZXJuYXRlIHBvc3NpYmlsaXRpZXMgYmV0d2VlbiBbUS1NSU5fREVMVEEsIFErTUFYX0RFTFRBXQorLy8gV2UgZG9uJ3QgdGVzdCBuZWdhdGl2ZSB2YWx1ZXMgdGhvdWdoLgorI2RlZmluZSBNSU5fREVMVEEgMCAgIC8vIGhvdyBtdWNoIGxvd2VyIGxldmVsIHRvIHRyeQorI2RlZmluZSBNQVhfREVMVEEgMSAgIC8vIGhvdyBtdWNoIGhpZ2hlcgorI2RlZmluZSBOVU1fTk9ERVMgKE1JTl9ERUxUQSArIDEgKyBNQVhfREVMVEEpCisjZGVmaW5lIE5PREUobiwgbCkgKG5vZGVzWyhuKV1bKGwpICsgTUlOX0RFTFRBXSkKKyNkZWZpbmUgU0NPUkVfU1RBVEUobiwgbCkgKHNjb3JlX3N0YXRlc1tuXVsobCkgKyBNSU5fREVMVEFdKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTZXRSRFNjb3JlKGludCBsYW1iZGEsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgcmQtPnNjb3JlID0gKHJkLT5SICsgcmQtPkgpICogbGFtYmRhICsgUkRfRElTVE9fTVVMVCAqIChyZC0+RCArIHJkLT5TRCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBzY29yZV90IFJEU2NvcmVUcmVsbGlzKGludCBsYW1iZGEsIHNjb3JlX3QgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3QgZGlzdG9ydGlvbikgeworICByZXR1cm4gcmF0ZSAqIGxhbWJkYSArIFJEX0RJU1RPX01VTFQgKiBkaXN0b3J0aW9uOworfQorCitzdGF0aWMgaW50IFRyZWxsaXNRdWFudGl6ZUJsb2NrKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0eDAsIGludCBjb2VmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhbWJkYSkgeworICBjb25zdCBQcm9iYUFycmF5KiBjb25zdCBwcm9iYXMgPSBlbmMtPnByb2JhXy5jb2VmZnNfW2NvZWZmX3R5cGVdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPQorICAgICAgKENvc3RBcnJheVB0cillbmMtPnByb2JhXy5yZW1hcHBlZF9jb3N0c19bY29lZmZfdHlwZV07CisgIGNvbnN0IGludCBmaXJzdCA9IChjb2VmZl90eXBlID09IDApID8gMSA6IDA7CisgIE5vZGUgbm9kZXNbMTZdW05VTV9OT0RFU107CisgIFNjb3JlU3RhdGUgc2NvcmVfc3RhdGVzWzJdW05VTV9OT0RFU107CisgIFNjb3JlU3RhdGUqIHNzX2N1ciA9ICZTQ09SRV9TVEFURSgwLCBNSU5fREVMVEEpOworICBTY29yZVN0YXRlKiBzc19wcmV2ID0gJlNDT1JFX1NUQVRFKDEsIE1JTl9ERUxUQSk7CisgIGludCBiZXN0X3BhdGhbM10gPSB7LTEsIC0xLCAtMX07ICAgLy8gc3RvcmUgYmVzdC1sYXN0L2Jlc3QtbGV2ZWwvYmVzdC1wcmV2aW91cworICBzY29yZV90IGJlc3Rfc2NvcmU7CisgIGludCBuLCBtLCBwLCBsYXN0OworCisgIHsKKyAgICBzY29yZV90IGNvc3Q7CisgICAgY29uc3QgaW50IHRocmVzaCA9IG10eC0+cV9bMV0gKiBtdHgtPnFfWzFdIC8gNDsKKyAgICBjb25zdCBpbnQgbGFzdF9wcm9iYSA9IHByb2Jhc1tWUDhFbmNCYW5kc1tmaXJzdF1dW2N0eDBdWzBdOworCisgICAgLy8gY29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgaW50ZXJlc3RpbmcgY29lZmZpY2llbnQKKyAgICBsYXN0ID0gZmlyc3QgLSAxOworICAgIGZvciAobiA9IDE1OyBuID49IGZpcnN0OyAtLW4pIHsKKyAgICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKKyAgICAgIGNvbnN0IGludCBlcnIgPSBpbltqXSAqIGluW2pdOworICAgICAgaWYgKGVyciA+IHRocmVzaCkgeworICAgICAgICBsYXN0ID0gbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZ28gaW5zcGVjdCB1cCB0byBuID0gMTYgY29lZmZzLiBXZSBjYW4ganVzdCBnbyB1cAorICAgIC8vIHRvIGxhc3QgKyAxIChpbmNsdXNpdmUpIHdpdGhvdXQgbG9zaW5nIG11Y2guCisgICAgaWYgKGxhc3QgPCAxNSkgKytsYXN0OworCisgICAgLy8gY29tcHV0ZSAnc2tpcCcgc2NvcmUuIFRoaXMgaXMgdGhlIG1heCBzY29yZSBvbmUgY2FuIGRvLgorICAgIGNvc3QgPSBWUDhCaXRDb3N0KDAsIGxhc3RfcHJvYmEpOworICAgIGJlc3Rfc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGNvc3QsIDApOworCisgICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2Ugbm9kZS4KKyAgICBmb3IgKG0gPSAtTUlOX0RFTFRBOyBtIDw9IE1BWF9ERUxUQTsgKyttKSB7CisgICAgICBjb25zdCBzY29yZV90IHJhdGUgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgbGFzdF9wcm9iYSkgOiAwOworICAgICAgc3NfY3VyW21dLnNjb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCByYXRlLCAwKTsKKyAgICAgIHNzX2N1clttXS5jb3N0cyA9IGNvc3RzW2ZpcnN0XVtjdHgwXTsKKyAgICB9CisgIH0KKworICAvLyB0cmF2ZXJzZSB0cmVsbGlzLgorICBmb3IgKG4gPSBmaXJzdDsgbiA8PSBsYXN0OyArK24pIHsKKyAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07CisgICAgY29uc3QgdWludDMyX3QgUSAgPSBtdHgtPnFfW2pdOworICAgIGNvbnN0IHVpbnQzMl90IGlRID0gbXR4LT5pcV9bal07CisgICAgY29uc3QgdWludDMyX3QgQiA9IEJJQVMoMHgwMCk7ICAgICAvLyBuZXV0cmFsIGJpYXMKKyAgICAvLyBub3RlOiBpdCdzIGltcG9ydGFudCB0byB0YWtlIHNpZ24gb2YgdGhlIF9vcmlnaW5hbF8gY29lZmYsCisgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zaWRlciBsZXZlbCA8IDAgYWZ0ZXJ3YXJkLgorICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7CisgICAgY29uc3QgdWludDMyX3QgY29lZmYwID0gKHNpZ24gPyAtaW5bal0gOiBpbltqXSkgKyBtdHgtPnNoYXJwZW5fW2pdOworICAgIGludCBsZXZlbDAgPSBRVUFOVERJVihjb2VmZjAsIGlRLCBCKTsKKyAgICBpbnQgdGhyZXNoX2xldmVsID0gUVVBTlRESVYoY29lZmYwLCBpUSwgQklBUygweDgwKSk7CisgICAgaWYgKHRocmVzaF9sZXZlbCA+IE1BWF9MRVZFTCkgdGhyZXNoX2xldmVsID0gTUFYX0xFVkVMOworICAgIGlmIChsZXZlbDAgPiBNQVhfTEVWRUwpIGxldmVsMCA9IE1BWF9MRVZFTDsKKworICAgIHsgICAvLyBTd2FwIGN1cnJlbnQgYW5kIHByZXZpb3VzIHNjb3JlIHN0YXRlcworICAgICAgU2NvcmVTdGF0ZSogY29uc3QgdG1wID0gc3NfY3VyOworICAgICAgc3NfY3VyID0gc3NfcHJldjsKKyAgICAgIHNzX3ByZXYgPSB0bXA7CisgICAgfQorCisgICAgLy8gdGVzdCBhbGwgYWx0ZXJuYXRlIGxldmVsIHZhbHVlcyBhcm91bmQgbGV2ZWwwLgorICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKKyAgICAgIE5vZGUqIGNvbnN0IGN1ciA9ICZOT0RFKG4sIG0pOworICAgICAgaW50IGxldmVsID0gbGV2ZWwwICsgbTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAobGV2ZWwgPiAyKSA/IDIgOiBsZXZlbDsKKyAgICAgIGNvbnN0IGludCBiYW5kID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgc2NvcmVfdCBiYXNlX3Njb3JlOworICAgICAgc2NvcmVfdCBiZXN0X2N1cl9zY29yZSA9IE1BWF9DT1NUOworICAgICAgaW50IGJlc3RfcHJldiA9IDA7ICAgLy8gZGVmYXVsdCwgaW4gY2FzZQorCisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBNQVhfQ09TVDsKKyAgICAgIHNzX2N1clttXS5jb3N0cyA9IGNvc3RzW24gKyAxXVtjdHhdOworICAgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IHRocmVzaF9sZXZlbCkgeworICAgICAgICAvLyBOb2RlIGlzIGRlYWQuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIC8vIENvbXB1dGUgZGVsdGFfZXJyb3IgPSBob3cgbXVjaCBjb2RpbmcgdGhpcyBsZXZlbCB3aWxsCisgICAgICAgIC8vIHN1YnRyYWN0IHRvIG1heF9lcnJvciBhcyBkaXN0b3J0aW9uLgorICAgICAgICAvLyBIZXJlLCBkaXN0b3J0aW9uID0gc3VtIG9mICh8Y29lZmZfaXwgLSBsZXZlbF9pICogUV9pKV4yCisgICAgICAgIGNvbnN0IGludCBuZXdfZXJyb3IgPSBjb2VmZjAgLSBsZXZlbCAqIFE7CisgICAgICAgIGNvbnN0IGludCBkZWx0YV9lcnJvciA9CisgICAgICAgICAgICBrV2VpZ2h0VHJlbGxpc1tqXSAqIChuZXdfZXJyb3IgKiBuZXdfZXJyb3IgLSBjb2VmZjAgKiBjb2VmZjApOworICAgICAgICBiYXNlX3Njb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCAwLCBkZWx0YV9lcnJvcik7CisgICAgICB9CisKKyAgICAgIC8vIEluc3BlY3QgYWxsIHBvc3NpYmxlIG5vbi1kZWFkIHByZWRlY2Vzc29ycy4gUmV0YWluIG9ubHkgdGhlIGJlc3Qgb25lLgorICAgICAgZm9yIChwID0gLU1JTl9ERUxUQTsgcCA8PSBNQVhfREVMVEE7ICsrcCkgeworICAgICAgICAvLyBEZWFkIG5vZGVzICh3aXRoIHNzX3ByZXZbcF0uc2NvcmUgPj0gTUFYX0NPU1QpIGFyZSBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGVsaW1pbmF0ZWQgc2luY2UgdGhlaXIgc2NvcmUgY2FuJ3QgYmUgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdC4KKyAgICAgICAgY29uc3Qgc2NvcmVfdCBjb3N0ID0gVlA4TGV2ZWxDb3N0KHNzX3ByZXZbcF0uY29zdHMsIGxldmVsKTsKKyAgICAgICAgLy8gRXhhbWluZSBub2RlIGFzc3VtaW5nIGl0J3MgYSBub24tdGVybWluYWwgb25lLgorICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0KKyAgICAgICAgICAgIGJhc2Vfc2NvcmUgKyBzc19wcmV2W3BdLnNjb3JlICsgUkRTY29yZVRyZWxsaXMobGFtYmRhLCBjb3N0LCAwKTsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9jdXJfc2NvcmUpIHsKKyAgICAgICAgICBiZXN0X2N1cl9zY29yZSA9IHNjb3JlOworICAgICAgICAgIGJlc3RfcHJldiA9IHA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFN0b3JlIGJlc3QgZmluZGluZyBpbiBjdXJyZW50IG5vZGUuCisgICAgICBjdXItPnNpZ24gPSBzaWduOworICAgICAgY3VyLT5sZXZlbCA9IGxldmVsOworICAgICAgY3VyLT5wcmV2ID0gYmVzdF9wcmV2OworICAgICAgc3NfY3VyW21dLnNjb3JlID0gYmVzdF9jdXJfc2NvcmU7CisKKyAgICAgIC8vIE5vdywgcmVjb3JkIGJlc3QgdGVybWluYWwgbm9kZSAoYW5kIHRodXMgYmVzdCBlbnRyeSBpbiB0aGUgZ3JhcGgpLgorICAgICAgaWYgKGxldmVsICE9IDApIHsKKyAgICAgICAgY29uc3Qgc2NvcmVfdCBsYXN0X3Bvc19jb3N0ID0KKyAgICAgICAgICAgIChuIDwgMTUpID8gVlA4Qml0Q29zdCgwLCBwcm9iYXNbYmFuZF1bY3R4XVswXSkgOiAwOworICAgICAgICBjb25zdCBzY29yZV90IGxhc3RfcG9zX3Njb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBsYXN0X3Bvc19jb3N0LCAwKTsKKyAgICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IGJlc3RfY3VyX3Njb3JlICsgbGFzdF9wb3Nfc2NvcmU7CisgICAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgYmVzdF9wYXRoWzBdID0gbjsgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0IGVvYiBwb3NpdGlvbgorICAgICAgICAgIGJlc3RfcGF0aFsxXSA9IG07ICAgICAgICAgICAgICAgICAgICAgLy8gYmVzdCBub2RlIGluZGV4CisgICAgICAgICAgYmVzdF9wYXRoWzJdID0gYmVzdF9wcmV2OyAgICAgICAgICAgICAvLyBiZXN0IHByZWRlY2Vzc29yCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGcmVzaCBzdGFydAorICBtZW1zZXQoaW4gKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCppbikpOworICBtZW1zZXQob3V0ICsgZmlyc3QsIDAsICgxNiAtIGZpcnN0KSAqIHNpemVvZigqb3V0KSk7CisgIGlmIChiZXN0X3BhdGhbMF0gPT0gLTEpIHsKKyAgICByZXR1cm4gMDsgICAvLyBza2lwIQorICB9CisKKyAgeworICAgIC8vIFVud2luZCB0aGUgYmVzdCBwYXRoLgorICAgIC8vIE5vdGU6IGJlc3QtcHJldiBvbiB0ZXJtaW5hbCBub2RlIGlzIG5vdCBuZWNlc3NhcmlseSBlcXVhbCB0byB0aGUKKyAgICAvLyBiZXN0X3ByZXYgZm9yIG5vbi10ZXJtaW5hbC4gU28gd2UgcGF0Y2ggYmVzdF9wYXRoWzJdIGluLgorICAgIGludCBueiA9IDA7CisgICAgaW50IGJlc3Rfbm9kZSA9IGJlc3RfcGF0aFsxXTsKKyAgICBuID0gYmVzdF9wYXRoWzBdOworICAgIE5PREUobiwgYmVzdF9ub2RlKS5wcmV2ID0gYmVzdF9wYXRoWzJdOyAgIC8vIGZvcmNlIGJlc3QtcHJldiBmb3IgdGVybWluYWwKKworICAgIGZvciAoOyBuID49IGZpcnN0OyAtLW4pIHsKKyAgICAgIGNvbnN0IE5vZGUqIGNvbnN0IG5vZGUgPSAmTk9ERShuLCBiZXN0X25vZGUpOworICAgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgICAgb3V0W25dID0gbm9kZS0+c2lnbiA/IC1ub2RlLT5sZXZlbCA6IG5vZGUtPmxldmVsOworICAgICAgbnogfD0gbm9kZS0+bGV2ZWw7CisgICAgICBpbltqXSA9IG91dFtuXSAqIG10eC0+cV9bal07CisgICAgICBiZXN0X25vZGUgPSBub2RlLT5wcmV2OworICAgIH0KKyAgICByZXR1cm4gKG56ICE9IDApOworICB9Cit9CisKKyN1bmRlZiBOT0RFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQZXJmb3JtczogZGlmZmVyZW5jZSwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgYmFjay10cmFuc2Zvcm0sIGFkZAorLy8gYWxsIGF0IG9uY2UuIE91dHB1dCBpcyB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jayBpbiAqeXV2X291dCwgYW5kIHRoZQorLy8gcXVhbnRpemVkIGxldmVscyBpbiAqbGV2ZWxzLgorCitzdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgeXV2X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STE2TW9kZU9mZnNldHNbbW9kZV07CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkZfRU5DOworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGludCBueiA9IDA7CisgIGludCBuOworICBpbnQxNl90IHRtcFsxNl1bMTZdLCBkY190bXBbMTZdOworCisgIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7CisgICAgVlA4RlRyYW5zZm9ybTIoc3JjICsgVlA4U2NhbltuXSwgcmVmICsgVlA4U2NhbltuXSwgdG1wW25dKTsKKyAgfQorICBWUDhGVHJhbnNmb3JtV0hUKHRtcFswXSwgZGNfdG1wKTsKKyAgbnogfD0gVlA4RW5jUXVhbnRpemVCbG9ja1dIVChkY190bXAsIHJkLT55X2RjX2xldmVscywgJmRxbS0+eTJfKSA8PCAyNDsKKworICBpZiAoRE9fVFJFTExJU19JMTYgJiYgaXQtPmRvX3RyZWxsaXNfKSB7CisgICAgaW50IHgsIHk7CisgICAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworICAgIGZvciAoeSA9IDAsIG4gPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4LCArK24pIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgICBjb25zdCBpbnQgbm9uX3plcm8gPQorICAgICAgICAgICAgVHJlbGxpc1F1YW50aXplQmxvY2soZW5jLCB0bXBbbl0sIHJkLT55X2FjX2xldmVsc1tuXSwgY3R4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRxbS0+eTFfLCBkcW0tPmxhbWJkYV90cmVsbGlzX2kxNl8pOworICAgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IG5vbl96ZXJvOworICAgICAgICByZC0+eV9hY19sZXZlbHNbbl1bMF0gPSAwOworICAgICAgICBueiB8PSBub25femVybyA8PCBuOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4gKz0gMikgeworICAgICAgLy8gWmVyby1vdXQgdGhlIGZpcnN0IGNvZWZmLCBzbyB0aGF0OiBhKSBueiBpcyBjb3JyZWN0IGJlbG93LCBhbmQKKyAgICAgIC8vIGIpIGZpbmRpbmcgJ2xhc3QnIG5vbi16ZXJvIGNvZWZmcyBpbiBTZXRSZXNpZHVhbENvZWZmcygpIGlzIHNpbXBsaWZpZWQuCisgICAgICB0bXBbbl1bMF0gPSB0bXBbbiArIDFdWzBdID0gMDsKKyAgICAgIG56IHw9IFZQOEVuY1F1YW50aXplMkJsb2Nrcyh0bXBbbl0sIHJkLT55X2FjX2xldmVsc1tuXSwgJmRxbS0+eTFfKSA8PCBuOworICAgICAgYXNzZXJ0KHJkLT55X2FjX2xldmVsc1tuICsgMF1bMF0gPT0gMCk7CisgICAgICBhc3NlcnQocmQtPnlfYWNfbGV2ZWxzW24gKyAxXVswXSA9PSAwKTsKKyAgICB9CisgIH0KKworICAvLyBUcmFuc2Zvcm0gYmFjaworICBWUDhUcmFuc2Zvcm1XSFQoZGNfdG1wLCB0bXBbMF0pOworICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4gKz0gMikgeworICAgIFZQOElUcmFuc2Zvcm0ocmVmICsgVlA4U2NhbltuXSwgdG1wW25dLCB5dXZfb3V0ICsgVlA4U2NhbltuXSwgMSk7CisgIH0KKworICByZXR1cm4gbno7Cit9CisKK3N0YXRpYyBpbnQgUmVjb25zdHJ1Y3RJbnRyYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGxldmVsc1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgeXV2X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJNE1vZGVPZmZzZXRzW21vZGVdOworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGludCBueiA9IDA7CisgIGludDE2X3QgdG1wWzE2XTsKKworICBWUDhGVHJhbnNmb3JtKHNyYywgcmVmLCB0bXApOworICBpZiAoRE9fVFJFTExJU19JNCAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKKyAgICBjb25zdCBpbnQgeCA9IGl0LT5pNF8gJiAzLCB5ID0gaXQtPmk0XyA+PiAyOworICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKKyAgICBueiA9IFRyZWxsaXNRdWFudGl6ZUJsb2NrKGVuYywgdG1wLCBsZXZlbHMsIGN0eCwgMywgJmRxbS0+eTFfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHFtLT5sYW1iZGFfdHJlbGxpc19pNF8pOworICB9IGVsc2UgeworICAgIG56ID0gVlA4RW5jUXVhbnRpemVCbG9jayh0bXAsIGxldmVscywgJmRxbS0+eTFfKTsKKyAgfQorICBWUDhJVHJhbnNmb3JtKHJlZiwgdG1wLCB5dXZfb3V0LCAwKTsKKyAgcmV0dXJuIG56OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gREMtZXJyb3IgZGlmZnVzaW9uCisKKy8vIERpZmZ1c2lvbiB3ZWlnaHRzLiBXZSB1bmRlci1jb3JyZWN0IGEgYml0ICgxNS8xNnRoIG9mIHRoZSBlcnJvciBpcyBhY3R1YWxseQorLy8gZGlmZnVzZWQpIHRvIGF2b2lkICdyYWluYm93JyBjaGVzc2JvYXJkIHBhdHRlcm4gb2YgYmxvY2tzIGF0IHF+PTAuCisjZGVmaW5lIEMxIDcgICAgLy8gZnJhY3Rpb24gb2YgZXJyb3Igc2VudCB0byB0aGUgNHg0IGJsb2NrIGJlbG93CisjZGVmaW5lIEMyIDggICAgLy8gZnJhY3Rpb24gb2YgZXJyb3Igc2VudCB0byB0aGUgNHg0IGJsb2NrIG9uIHRoZSByaWdodAorI2RlZmluZSBEU0hJRlQgNAorI2RlZmluZSBEU0NBTEUgMSAgIC8vIHN0b3JhZ2UgZGVzY2FsaW5nLCBuZWVkZWQgdG8gbWFrZSB0aGUgZXJyb3IgZml0IGludDhfdAorCisvLyBRdWFudGl6ZSBhcyB1c3VhbCwgYnV0IGFsc28gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBxdWFudGl6YXRpb24gZXJyb3IuCisvLyBFcnJvciBpcyBhbHJlYWR5IGRpdmlkZWQgYnkgRFNISUZULgorc3RhdGljIGludCBRdWFudGl6ZVNpbmdsZShpbnQxNl90KiBjb25zdCB2LCBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgViA9ICp2OworICBjb25zdCBpbnQgc2lnbiA9IChWIDwgMCk7CisgIGlmIChzaWduKSBWID0gLVY7CisgIGlmIChWID4gKGludCltdHgtPnp0aHJlc2hfWzBdKSB7CisgICAgY29uc3QgaW50IHFWID0gUVVBTlRESVYoViwgbXR4LT5pcV9bMF0sIG10eC0+Ymlhc19bMF0pICogbXR4LT5xX1swXTsKKyAgICBjb25zdCBpbnQgZXJyID0gKFYgLSBxVik7CisgICAgKnYgPSBzaWduID8gLXFWIDogcVY7CisgICAgcmV0dXJuIChzaWduID8gLWVyciA6IGVycikgPj4gRFNDQUxFOworICB9CisgICp2ID0gMDsKKyAgcmV0dXJuIChzaWduID8gLVYgOiBWKSA+PiBEU0NBTEU7Cit9CisKK3N0YXRpYyB2b2lkIENvcnJlY3REQ1ZhbHVlcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB0bXBbXVsxNl0sIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgLy8gICAgICAgICB8IHRvcFswXSB8IHRvcFsxXQorICAvLyAtLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0KKyAgLy8gbGVmdFswXSB8IHRtcFswXSAgIHRtcFsxXSAgPC0+ICAgZXJyMCBlcnIxCisgIC8vIGxlZnRbMV0gfCB0bXBbMl0gICB0bXBbM10gICAgICAgIGVycjIgZXJyMworICAvLworICAvLyBGaW5hbCBlcnJvcnMge2VycjEsZXJyMixlcnIzfSBhcmUgcHJlc2VydmVkIGFuZCBsYXRlciByZXN0b3JlZAorICAvLyBhcyB0b3BbXS9sZWZ0W10gb24gdGhlIG5leHQgYmxvY2suCisgIGludCBjaDsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDE7ICsrY2gpIHsKKyAgICBjb25zdCBpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT50b3BfZGVycl9baXQtPnhfXVtjaF07CisgICAgY29uc3QgaW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPmxlZnRfZGVycl9bY2hdOworICAgIGludDE2X3QgKCogY29uc3QgYylbMTZdID0gJnRtcFtjaCAqIDRdOworICAgIGludCBlcnIwLCBlcnIxLCBlcnIyLCBlcnIzOworICAgIGNbMF1bMF0gKz0gKEMxICogdG9wWzBdICsgQzIgKiBsZWZ0WzBdKSA+PiAoRFNISUZUIC0gRFNDQUxFKTsKKyAgICBlcnIwID0gUXVhbnRpemVTaW5nbGUoJmNbMF1bMF0sIG10eCk7CisgICAgY1sxXVswXSArPSAoQzEgKiB0b3BbMV0gKyBDMiAqIGVycjApID4+IChEU0hJRlQgLSBEU0NBTEUpOworICAgIGVycjEgPSBRdWFudGl6ZVNpbmdsZSgmY1sxXVswXSwgbXR4KTsKKyAgICBjWzJdWzBdICs9IChDMSAqIGVycjAgKyBDMiAqIGxlZnRbMV0pID4+IChEU0hJRlQgLSBEU0NBTEUpOworICAgIGVycjIgPSBRdWFudGl6ZVNpbmdsZSgmY1syXVswXSwgbXR4KTsKKyAgICBjWzNdWzBdICs9IChDMSAqIGVycjEgKyBDMiAqIGVycjIpID4+IChEU0hJRlQgLSBEU0NBTEUpOworICAgIGVycjMgPSBRdWFudGl6ZVNpbmdsZSgmY1szXVswXSwgbXR4KTsKKyAgICAvLyBlcnJvciAnZXJyJyBpcyBib3VuZGVkIGJ5IG10eC0+cV9bMF0gd2hpY2ggaXMgMTMyIGF0IG1heC4gSGVuY2UKKyAgICAvLyBlcnIgPj4gRFNDQUxFIHdpbGwgZml0IGluIGFuIGludDhfdCB0eXBlIGlmIERTQ0FMRT49MS4KKyAgICBhc3NlcnQoYWJzKGVycjEpIDw9IDEyNyAmJiBhYnMoZXJyMikgPD0gMTI3ICYmIGFicyhlcnIzKSA8PSAxMjcpOworICAgIHJkLT5kZXJyW2NoXVswXSA9IChpbnQ4X3QpZXJyMTsKKyAgICByZC0+ZGVycltjaF1bMV0gPSAoaW50OF90KWVycjI7CisgICAgcmQtPmRlcnJbY2hdWzJdID0gKGludDhfdCllcnIzOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlRGlmZnVzaW9uRXJyb3JzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IGNoOworICBmb3IgKGNoID0gMDsgY2ggPD0gMTsgKytjaCkgeworICAgIGludDhfdCogY29uc3QgdG9wID0gaXQtPnRvcF9kZXJyX1tpdC0+eF9dW2NoXTsKKyAgICBpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+bGVmdF9kZXJyX1tjaF07CisgICAgbGVmdFswXSA9IHJkLT5kZXJyW2NoXVswXTsgICAgICAgICAgICAvLyByZXN0b3JlIGVycjEKKyAgICBsZWZ0WzFdID0gMyAqIHJkLT5kZXJyW2NoXVsyXSA+PiAyOyAgIC8vICAgICAuLi4gMy80dGggb2YgZXJyMworICAgIHRvcFswXSAgPSByZC0+ZGVycltjaF1bMV07ICAgICAgICAgICAgLy8gICAgIC4uLiBlcnIyCisgICAgdG9wWzFdICA9IHJkLT5kZXJyW2NoXVsyXSAtIGxlZnRbMV07ICAvLyAgICAgLi4uIDEvNHRoIG9mIGVycjMuCisgIH0KK30KKworI3VuZGVmIEMxCisjdW5kZWYgQzIKKyN1bmRlZiBEU0hJRlQKKyN1bmRlZiBEU0NBTEUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBSZWNvbnN0cnVjdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LCBpbnQgbW9kZSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV07CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgVV9PRkZfRU5DOworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGludCBueiA9IDA7CisgIGludCBuOworICBpbnQxNl90IHRtcFs4XVsxNl07CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgIFZQOEZUcmFuc2Zvcm0yKHNyYyArIFZQOFNjYW5VVltuXSwgcmVmICsgVlA4U2NhblVWW25dLCB0bXBbbl0pOworICB9CisgIGlmIChpdC0+dG9wX2RlcnJfICE9IE5VTEwpIENvcnJlY3REQ1ZhbHVlcyhpdCwgJmRxbS0+dXZfLCB0bXAsIHJkKTsKKworICBpZiAoRE9fVFJFTExJU19VViAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKKyAgICBpbnQgY2gsIHgsIHk7CisgICAgZm9yIChjaCA9IDAsIG4gPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gsICsrbikgeworICAgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgICBjb25zdCBpbnQgbm9uX3plcm8gPQorICAgICAgICAgICAgICBUcmVsbGlzUXVhbnRpemVCbG9jayhlbmMsIHRtcFtuXSwgcmQtPnV2X2xldmVsc1tuXSwgY3R4LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT51dl8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfdXZfKTsKKyAgICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IG5vbl96ZXJvOworICAgICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgICAgbnogfD0gVlA4RW5jUXVhbnRpemUyQmxvY2tzKHRtcFtuXSwgcmQtPnV2X2xldmVsc1tuXSwgJmRxbS0+dXZfKSA8PCBuOworICAgIH0KKyAgfQorCisgIGZvciAobiA9IDA7IG4gPCA4OyBuICs9IDIpIHsKKyAgICBWUDhJVHJhbnNmb3JtKHJlZiArIFZQOFNjYW5VVltuXSwgdG1wW25dLCB5dXZfb3V0ICsgVlA4U2NhblVWW25dLCAxKTsKKyAgfQorICByZXR1cm4gKG56IDw8IDE2KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJELW9wdCBkZWNpc2lvbi4gUmVjb25zdHJ1Y3QgZWFjaCBtb2RlcywgZXZhbHVlIGRpc3RvcnRpb24gYW5kIGJpdC1jb3N0LgorLy8gUGljayB0aGUgbW9kZSBpcyBsb3dlciBSRC1jb3N0ID0gUmF0ZSArIGxhbWJkYSAqIERpc3RvcnRpb24uCisKK3N0YXRpYyB2b2lkIFN0b3JlTWF4RGVsdGEoVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSwgY29uc3QgaW50MTZfdCBEQ3NbMTZdKSB7CisgIC8vIFdlIGxvb2sgYXQgdGhlIGZpcnN0IHRocmVlIEFDIGNvZWZmaWNpZW50cyB0byBkZXRlcm1pbmUgd2hhdCBpcyB0aGUgYXZlcmFnZQorICAvLyBkZWx0YSBiZXR3ZWVuIGVhY2ggc3ViLTR4NCBibG9jay4KKyAgY29uc3QgaW50IHYwID0gYWJzKERDc1sxXSk7CisgIGNvbnN0IGludCB2MSA9IGFicyhEQ3NbMl0pOworICBjb25zdCBpbnQgdjIgPSBhYnMoRENzWzRdKTsKKyAgaW50IG1heF92ID0gKHYxID4gdjApID8gdjEgOiB2MDsKKyAgbWF4X3YgPSAodjIgPiBtYXhfdikgPyB2MiA6IG1heF92OworICBpZiAobWF4X3YgPiBkcW0tPm1heF9lZGdlXykgZHFtLT5tYXhfZWRnZV8gPSBtYXhfdjsKK30KKworc3RhdGljIHZvaWQgU3dhcE1vZGVTY29yZShWUDhNb2RlU2NvcmUqKiBhLCBWUDhNb2RlU2NvcmUqKiBiKSB7CisgIFZQOE1vZGVTY29yZSogY29uc3QgdG1wID0gKmE7CisgICphID0gKmI7CisgICpiID0gdG1wOworfQorCitzdGF0aWMgdm9pZCBTd2FwUHRyKHVpbnQ4X3QqKiBhLCB1aW50OF90KiogYikgeworICB1aW50OF90KiBjb25zdCB0bXAgPSAqYTsKKyAgKmEgPSAqYjsKKyAgKmIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIFN3YXBPdXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFN3YXBQdHIoJml0LT55dXZfb3V0XywgJml0LT55dXZfb3V0Ml8pOworfQorCitzdGF0aWMgc2NvcmVfdCBJc0ZsYXQoY29uc3QgaW50MTZfdCogbGV2ZWxzLCBpbnQgbnVtX2Jsb2Nrcywgc2NvcmVfdCB0aHJlc2gpIHsKKyAgc2NvcmVfdCBzY29yZSA9IDA7CisgIHdoaWxlIChudW1fYmxvY2tzLS0gPiAwKSB7ICAgICAgLy8gVE9ETyhza2FsKTogcmVmaW5lIHBvc2l0aW9uYWwgc2NvcmluZz8KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTY7ICsraSkgeyAgICAvLyBvbWl0IERDLCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gQUMKKyAgICAgIHNjb3JlICs9IChsZXZlbHNbaV0gIT0gMCk7CisgICAgICBpZiAoc2NvcmUgPiB0aHJlc2gpIHJldHVybiAwOworICAgIH0KKyAgICBsZXZlbHMgKz0gMTY7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFBpY2tCZXN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogcmQpIHsKKyAgY29uc3QgaW50IGtOdW1CbG9ja3MgPSAxNjsKKyAgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZpdC0+ZW5jXy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV9pMTZfOworICBjb25zdCBpbnQgdGxhbWJkYSA9IGRxbS0+dGxhbWJkYV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkZfRU5DOworICBWUDhNb2RlU2NvcmUgcmRfdG1wOworICBWUDhNb2RlU2NvcmUqIHJkX2N1ciA9ICZyZF90bXA7CisgIFZQOE1vZGVTY29yZSogcmRfYmVzdCA9IHJkOworICBpbnQgbW9kZTsKKworICByZC0+bW9kZV9pMTYgPSAtMTsKKyAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKKyAgICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQzsgIC8vIHNjcmF0Y2ggYnVmZmVyCisgICAgcmRfY3VyLT5tb2RlX2kxNiA9IG1vZGU7CisKKyAgICAvLyBSZWNvbnN0cnVjdAorICAgIHJkX2N1ci0+bnogPSBSZWNvbnN0cnVjdEludHJhMTYoaXQsIHJkX2N1ciwgdG1wX2RzdCwgbW9kZSk7CisKKyAgICAvLyBNZWFzdXJlIFJELXNjb3JlCisgICAgcmRfY3VyLT5EID0gVlA4U1NFMTZ4MTYoc3JjLCB0bXBfZHN0KTsKKyAgICByZF9jdXItPlNEID0KKyAgICAgICAgdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvMTZ4MTYoc3JjLCB0bXBfZHN0LCBrV2VpZ2h0WSkpIDogMDsKKyAgICByZF9jdXItPkggPSBWUDhGaXhlZENvc3RzSTE2W21vZGVdOworICAgIHJkX2N1ci0+UiA9IFZQOEdldENvc3RMdW1hMTYoaXQsIHJkX2N1cik7CisgICAgaWYgKG1vZGUgPiAwICYmCisgICAgICAgIElzRmxhdChyZF9jdXItPnlfYWNfbGV2ZWxzWzBdLCBrTnVtQmxvY2tzLCBGTEFUTkVTU19MSU1JVF9JMTYpKSB7CisgICAgICAvLyBwZW5hbHR5IHRvIGF2b2lkIGZsYXQgYXJlYSB0byBiZSBtaXNwcmVkaWN0ZWQgYnkgY29tcGxleCBtb2RlCisgICAgICByZF9jdXItPlIgKz0gRkxBVE5FU1NfUEVOQUxUWSAqIGtOdW1CbG9ja3M7CisgICAgfQorCisgICAgLy8gU2luY2Ugd2UgYWx3YXlzIGV4YW1pbmUgSW50cmExNiBmaXJzdCwgd2UgY2FuIG92ZXJ3cml0ZSAqcmQgZGlyZWN0bHkuCisgICAgU2V0UkRTY29yZShsYW1iZGEsIHJkX2N1cik7CisgICAgaWYgKG1vZGUgPT0gMCB8fCByZF9jdXItPnNjb3JlIDwgcmRfYmVzdC0+c2NvcmUpIHsKKyAgICAgIFN3YXBNb2RlU2NvcmUoJnJkX2N1ciwgJnJkX2Jlc3QpOworICAgICAgU3dhcE91dChpdCk7CisgICAgfQorICB9CisgIGlmIChyZF9iZXN0ICE9IHJkKSB7CisgICAgbWVtY3B5KHJkLCByZF9iZXN0LCBzaXplb2YoKnJkKSk7CisgIH0KKyAgU2V0UkRTY29yZShkcW0tPmxhbWJkYV9tb2RlXywgcmQpOyAgIC8vIGZpbmFsaXplIHNjb3JlIGZvciBtb2RlIGRlY2lzaW9uLgorICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgcmQtPm1vZGVfaTE2KTsKKworICAvLyB3ZSBoYXZlIGEgYmxvY2t5IG1hY3JvYmxvY2sgKG9ubHkgRENzIGFyZSBub24temVybykgd2l0aCBmYWlybHkgaGlnaAorICAvLyBkaXN0b3J0aW9uLCByZWNvcmQgbWF4IGRlbHRhIHNvIHdlIGNhbiBsYXRlciBhZGp1c3QgdGhlIG1pbmltYWwgZmlsdGVyaW5nCisgIC8vIHN0cmVuZ3RoIG5lZWRlZCB0byBzbW9vdGggdGhlc2UgYmxvY2tzIG91dC4KKyAgaWYgKChyZC0+bnogJiAweDEwMGZmZmYpID09IDB4MTAwMDAwMCAmJiByZC0+RCA+IGRxbS0+bWluX2Rpc3RvXykgeworICAgIFN0b3JlTWF4RGVsdGEoZHFtLCByZC0+eV9kY19sZXZlbHMpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHJldHVybiB0aGUgY29zdCBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdXJyb3VuZGluZyBwcmVkaWN0aW9uIG1vZGVzLgorc3RhdGljIGNvbnN0IHVpbnQxNl90KiBHZXRDb3N0TW9kZUk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG1vZGVzWzE2XSkgeworICBjb25zdCBpbnQgcHJlZHNfdyA9IGl0LT5lbmNfLT5wcmVkc193XzsKKyAgY29uc3QgaW50IHggPSAoaXQtPmk0XyAmIDMpLCB5ID0gaXQtPmk0XyA+PiAyOworICBjb25zdCBpbnQgbGVmdCA9ICh4ID09IDApID8gaXQtPnByZWRzX1t5ICogcHJlZHNfdyAtIDFdIDogbW9kZXNbaXQtPmk0XyAtIDFdOworICBjb25zdCBpbnQgdG9wID0gKHkgPT0gMCkgPyBpdC0+cHJlZHNfWy1wcmVkc193ICsgeF0gOiBtb2Rlc1tpdC0+aTRfIC0gNF07CisgIHJldHVybiBWUDhGaXhlZENvc3RzSTRbdG9wXVtsZWZ0XTsKK30KKworc3RhdGljIGludCBQaWNrQmVzdEludHJhNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2k0XzsKKyAgY29uc3QgaW50IHRsYW1iZGEgPSBkcW0tPnRsYW1iZGFfOworICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMwID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IGJlc3RfYmxvY2tzID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQzsKKyAgaW50IHRvdGFsX2hlYWRlcl9iaXRzID0gMDsKKyAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7CisKKyAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBJbml0U2NvcmUoJnJkX2Jlc3QpOworICByZF9iZXN0LkggPSAyMTE7ICAvLyAnMjExJyBpcyB0aGUgdmFsdWUgb2YgVlA4Qml0Q29zdCgwLCAxNDUpCisgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9iZXN0KTsKKyAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKKyAgZG8geworICAgIGNvbnN0IGludCBrTnVtQmxvY2tzID0gMTsKKyAgICBWUDhNb2RlU2NvcmUgcmRfaTQ7CisgICAgaW50IG1vZGU7CisgICAgaW50IGJlc3RfbW9kZSA9IC0xOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHNyYzAgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBtb2RlX2Nvc3RzID0gR2V0Q29zdE1vZGVJNChpdCwgcmQtPm1vZGVzX2k0KTsKKyAgICB1aW50OF90KiBiZXN0X2Jsb2NrID0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X3BfICsgSTRUTVA7ICAgIC8vIHNjcmF0Y2ggYnVmZmVyLgorCisgICAgSW5pdFNjb3JlKCZyZF9pNCk7CisgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7CisgICAgICBWUDhNb2RlU2NvcmUgcmRfdG1wOworICAgICAgaW50MTZfdCB0bXBfbGV2ZWxzWzE2XTsKKworICAgICAgLy8gUmVjb25zdHJ1Y3QKKyAgICAgIHJkX3RtcC5ueiA9CisgICAgICAgICAgUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHRtcF9sZXZlbHMsIHNyYywgdG1wX2RzdCwgbW9kZSkgPDwgaXQtPmk0XzsKKworICAgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQorICAgICAgcmRfdG1wLkQgPSBWUDhTU0U0eDQoc3JjLCB0bXBfZHN0KTsKKyAgICAgIHJkX3RtcC5TRCA9CisgICAgICAgICAgdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvNHg0KHNyYywgdG1wX2RzdCwga1dlaWdodFkpKQorICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgcmRfdG1wLkggPSBtb2RlX2Nvc3RzW21vZGVdOworCisgICAgICAvLyBBZGQgZmxhdG5lc3MgcGVuYWx0eQorICAgICAgaWYgKG1vZGUgPiAwICYmIElzRmxhdCh0bXBfbGV2ZWxzLCBrTnVtQmxvY2tzLCBGTEFUTkVTU19MSU1JVF9JNCkpIHsKKyAgICAgICAgcmRfdG1wLlIgPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJkX3RtcC5SID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gZWFybHktb3V0IGNoZWNrCisgICAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkX3RtcCk7CisgICAgICBpZiAoYmVzdF9tb2RlID49IDAgJiYgcmRfdG1wLnNjb3JlID49IHJkX2k0LnNjb3JlKSBjb250aW51ZTsKKworICAgICAgLy8gZmluaXNoIGNvbXB1dGluZyBzY29yZQorICAgICAgcmRfdG1wLlIgKz0gVlA4R2V0Q29zdEx1bWE0KGl0LCB0bXBfbGV2ZWxzKTsKKyAgICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdG1wKTsKKworICAgICAgaWYgKGJlc3RfbW9kZSA8IDAgfHwgcmRfdG1wLnNjb3JlIDwgcmRfaTQuc2NvcmUpIHsKKyAgICAgICAgQ29weVNjb3JlKCZyZF9pNCwgJnJkX3RtcCk7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIFN3YXBQdHIoJnRtcF9kc3QsICZiZXN0X2Jsb2NrKTsKKyAgICAgICAgbWVtY3B5KHJkX2Jlc3QueV9hY19sZXZlbHNbaXQtPmk0X10sIHRtcF9sZXZlbHMsCisgICAgICAgICAgICAgICBzaXplb2YocmRfYmVzdC55X2FjX2xldmVsc1tpdC0+aTRfXSkpOworICAgICAgfQorICAgIH0KKyAgICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCAmcmRfaTQpOworICAgIEFkZFNjb3JlKCZyZF9iZXN0LCAmcmRfaTQpOworICAgIGlmIChyZF9iZXN0LnNjb3JlID49IHJkLT5zY29yZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRvdGFsX2hlYWRlcl9iaXRzICs9IChpbnQpcmRfaTQuSDsgICAvLyA8LSBlcXVhbCB0byBtb2RlX2Nvc3RzW2Jlc3RfbW9kZV07CisgICAgaWYgKHRvdGFsX2hlYWRlcl9iaXRzID4gZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gQ29weSBzZWxlY3RlZCBzYW1wbGVzIGlmIG5vdCBpbiB0aGUgcmlnaHQgcGxhY2UgYWxyZWFkeS4KKyAgICBpZiAoYmVzdF9ibG9jayAhPSBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pIHsKKyAgICAgIFZQOENvcHk0eDQoYmVzdF9ibG9jaywgYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dKTsKKyAgICB9CisgICAgcmQtPm1vZGVzX2k0W2l0LT5pNF9dID0gYmVzdF9tb2RlOworICAgIGl0LT50b3BfbnpfW2l0LT5pNF8gJiAzXSA9IGl0LT5sZWZ0X256X1tpdC0+aTRfID4+IDJdID0gKHJkX2k0Lm56ID8gMSA6IDApOworICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBiZXN0X2Jsb2NrcykpOworCisgIC8vIGZpbmFsaXplIHN0YXRlCisgIENvcHlTY29yZShyZCwgJnJkX2Jlc3QpOworICBWUDhTZXRJbnRyYTRNb2RlKGl0LCByZC0+bW9kZXNfaTQpOworICBTd2FwT3V0KGl0KTsKKyAgbWVtY3B5KHJkLT55X2FjX2xldmVscywgcmRfYmVzdC55X2FjX2xldmVscywgc2l6ZW9mKHJkLT55X2FjX2xldmVscykpOworICByZXR1cm4gMTsgICAvLyBzZWxlY3QgaW50cmE0eDQgb3ZlciBpbnRyYTE2eDE2Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFBpY2tCZXN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIGNvbnN0IGludCBrTnVtQmxvY2tzID0gODsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZpdC0+ZW5jXy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV91dl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgVV9PRkZfRU5DOworICB1aW50OF90KiB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFVfT0ZGX0VOQzsgIC8vIHNjcmF0Y2ggYnVmZmVyCisgIHVpbnQ4X3QqIGRzdDAgPSBpdC0+eXV2X291dF8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIGRzdCA9IGRzdDA7CisgIFZQOE1vZGVTY29yZSByZF9iZXN0OworICBpbnQgbW9kZTsKKworICByZC0+bW9kZV91diA9IC0xOworICBJbml0U2NvcmUoJnJkX2Jlc3QpOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgIFZQOE1vZGVTY29yZSByZF91djsKKworICAgIC8vIFJlY29uc3RydWN0CisgICAgcmRfdXYubnogPSBSZWNvbnN0cnVjdFVWKGl0LCAmcmRfdXYsIHRtcF9kc3QsIG1vZGUpOworCisgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQorICAgIHJkX3V2LkQgID0gVlA4U1NFMTZ4OChzcmMsIHRtcF9kc3QpOworICAgIHJkX3V2LlNEID0gMDsgICAgLy8gbm90IGNhbGxpbmcgVERpc3RvIGhlcmU6IGl0IHRlbmRzIHRvIGZsYXR0ZW4gYXJlYXMuCisgICAgcmRfdXYuSCAgPSBWUDhGaXhlZENvc3RzVVZbbW9kZV07CisgICAgcmRfdXYuUiAgPSBWUDhHZXRDb3N0VVYoaXQsICZyZF91dik7CisgICAgaWYgKG1vZGUgPiAwICYmIElzRmxhdChyZF91di51dl9sZXZlbHNbMF0sIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX1VWKSkgeworICAgICAgcmRfdXYuUiArPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICB9CisKKyAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkX3V2KTsKKyAgICBpZiAobW9kZSA9PSAwIHx8IHJkX3V2LnNjb3JlIDwgcmRfYmVzdC5zY29yZSkgeworICAgICAgQ29weVNjb3JlKCZyZF9iZXN0LCAmcmRfdXYpOworICAgICAgcmQtPm1vZGVfdXYgPSBtb2RlOworICAgICAgbWVtY3B5KHJkLT51dl9sZXZlbHMsIHJkX3V2LnV2X2xldmVscywgc2l6ZW9mKHJkLT51dl9sZXZlbHMpKTsKKyAgICAgIGlmIChpdC0+dG9wX2RlcnJfICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KHJkLT5kZXJyLCByZF91di5kZXJyLCBzaXplb2YocmRfdXYuZGVycikpOworICAgICAgfQorICAgICAgU3dhcFB0cigmZHN0LCAmdG1wX2RzdCk7CisgICAgfQorICB9CisgIFZQOFNldEludHJhVVZNb2RlKGl0LCByZC0+bW9kZV91dik7CisgIEFkZFNjb3JlKHJkLCAmcmRfYmVzdCk7CisgIGlmIChkc3QgIT0gZHN0MCkgeyAgIC8vIGNvcHkgMTZ4OCBibG9jayBpZiBuZWVkZWQKKyAgICBWUDhDb3B5MTZ4OChkc3QsIGRzdDApOworICB9CisgIGlmIChpdC0+dG9wX2RlcnJfICE9IE5VTEwpIHsgIC8vIHN0b3JlIGRpZmZ1c2lvbiBlcnJvcnMgZm9yIG5leHQgYmxvY2sKKyAgICBTdG9yZURpZmZ1c2lvbkVycm9ycyhpdCwgcmQpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaW5hbCByZWNvbnN0cnVjdGlvbiBhbmQgcXVhbnRpemF0aW9uLgorCitzdGF0aWMgdm9pZCBTaW1wbGVRdWFudGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IGludCBpc19pMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGludCBueiA9IDA7CisKKyAgaWYgKGlzX2kxNikgeworICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCByZCwgaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DLCBpdC0+cHJlZHNfWzBdKTsKKyAgfSBlbHNlIHsKKyAgICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICAgIGRvIHsKKyAgICAgIGNvbnN0IGludCBtb2RlID0KKyAgICAgICAgICBpdC0+cHJlZHNfWyhpdC0+aTRfICYgMykgKyAoaXQtPmk0XyA+PiAyKSAqIGVuYy0+cHJlZHNfd19dOworICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgICAgdWludDhfdCogY29uc3QgZHN0ID0gaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7CisgICAgICBueiB8PSBSZWNvbnN0cnVjdEludHJhNChpdCwgcmQtPnlfYWNfbGV2ZWxzW2l0LT5pNF9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG1vZGUpIDw8IGl0LT5pNF87CisgICAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DKSk7CisgIH0KKworICBueiB8PSBSZWNvbnN0cnVjdFVWKGl0LCByZCwgaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DLCBpdC0+bWJfLT51dl9tb2RlXyk7CisgIHJkLT5ueiA9IG56OworfQorCisvLyBSZWZpbmUgaW50cmExNi9pbnRyYTQgc3ViLW1vZGVzIGJhc2VkIG9uIGRpc3RvcnRpb24gb25seSAobm90IHJhdGUpLgorc3RhdGljIHZvaWQgUmVmaW5lVXNpbmdEaXN0b3J0aW9uKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJ5X2JvdGhfbW9kZXMsIGludCByZWZpbmVfdXZfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIHNjb3JlX3QgYmVzdF9zY29yZSA9IE1BWF9DT1NUOworICBpbnQgbnogPSAwOworICBpbnQgbW9kZTsKKyAgaW50IGlzX2kxNiA9IHRyeV9ib3RoX21vZGVzIHx8IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgLy8gU29tZSBlbXBpcmljIGNvbnN0YW50cywgb2YgYXBwcm94aW1hdGUgb3JkZXIgb2YgbWFnbml0dWRlLgorICBjb25zdCBpbnQgbGFtYmRhX2RfaTE2ID0gMTA2OworICBjb25zdCBpbnQgbGFtYmRhX2RfaTQgPSAxMTsKKyAgY29uc3QgaW50IGxhbWJkYV9kX3V2ID0gMTIwOworICBzY29yZV90IHNjb3JlX2k0ID0gZHFtLT5pNF9wZW5hbHR5XzsKKyAgc2NvcmVfdCBpNF9iaXRfc3VtID0gMDsKKyAgY29uc3Qgc2NvcmVfdCBiaXRfbGltaXQgPSB0cnlfYm90aF9tb2RlcyA/IGl0LT5lbmNfLT5tYl9oZWFkZXJfbGltaXRfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNQVhfQ09TVDsgIC8vIG5vIGVhcmx5LW91dCBhbGxvd2VkCisKKyAgaWYgKGlzX2kxNikgeyAgIC8vIEZpcnN0LCBldmFsdWF0ZSBJbnRyYTE2IGRpc3RvcnRpb24KKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSAoc2NvcmVfdClWUDhTU0UxNngxNihzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Rml4ZWRDb3N0c0kxNlttb2RlXSAqIGxhbWJkYV9kX2kxNjsKKyAgICAgIGlmIChtb2RlID4gMCAmJiBWUDhGaXhlZENvc3RzSTE2W21vZGVdID4gYml0X2xpbWl0KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICB9CisgICAgfQorICAgIFZQOFNldEludHJhMTZNb2RlKGl0LCBiZXN0X21vZGUpOworICAgIC8vIHdlJ2xsIHJlY29uc3RydWN0IGxhdGVyLCBpZiBpMTYgbW9kZSBhY3R1YWxseSBnZXRzIHNlbGVjdGVkCisgIH0KKworICAvLyBOZXh0LCBldmFsdWF0ZSBJbnRyYTQKKyAgaWYgKHRyeV9ib3RoX21vZGVzIHx8ICFpc19pMTYpIHsKKyAgICAvLyBXZSBkb24ndCBldmFsdWF0ZSB0aGUgcmF0ZSBoZXJlLCBidXQganVzdCBhY2NvdW50IGZvciBpdCB0aHJvdWdoIGEKKyAgICAvLyBjb25zdGFudCBwZW5hbHR5IChpNCBtb2RlIHVzdWFsbHkgbmVlZHMgbW9yZSBiaXRzIGNvbXBhcmVkIHRvIGkxNikuCisgICAgaXNfaTE2ID0gMDsKKyAgICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICAgIGRvIHsKKyAgICAgIGludCBiZXN0X2k0X21vZGUgPSAtMTsKKyAgICAgIHNjb3JlX3QgYmVzdF9pNF9zY29yZSA9IE1BWF9DT1NUOworICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IG1vZGVfY29zdHMgPSBHZXRDb3N0TW9kZUk0KGl0LCByZC0+bW9kZXNfaTQpOworCisgICAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9CTU9ERVM7ICsrbW9kZSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IFZQOFNTRTR4NChzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtb2RlX2Nvc3RzW21vZGVdICogbGFtYmRhX2RfaTQ7CisgICAgICAgIGlmIChzY29yZSA8IGJlc3RfaTRfc2NvcmUpIHsKKyAgICAgICAgICBiZXN0X2k0X21vZGUgPSBtb2RlOworICAgICAgICAgIGJlc3RfaTRfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaTRfYml0X3N1bSArPSBtb2RlX2Nvc3RzW2Jlc3RfaTRfbW9kZV07CisgICAgICByZC0+bW9kZXNfaTRbaXQtPmk0X10gPSBiZXN0X2k0X21vZGU7CisgICAgICBzY29yZV9pNCArPSBiZXN0X2k0X3Njb3JlOworICAgICAgaWYgKHNjb3JlX2k0ID49IGJlc3Rfc2NvcmUgfHwgaTRfYml0X3N1bSA+IGJpdF9saW1pdCkgeworICAgICAgICAvLyBJbnRyYTQgd29uJ3QgYmUgYmV0dGVyIHRoYW4gSW50cmExNi4gQmFpbCBvdXQgYW5kIHBpY2sgSW50cmExNi4KKyAgICAgICAgaXNfaTE2ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeyAgLy8gcmVjb25zdHJ1Y3QgcGFydGlhbCBibG9jayBpbnNpZGUgeXV2X291dDJfIGJ1ZmZlcgorICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICAgIG56IHw9IFJlY29uc3RydWN0SW50cmE0KGl0LCByZC0+eV9hY19sZXZlbHNbaXQtPmk0X10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgdG1wX2RzdCwgYmVzdF9pNF9tb2RlKSA8PCBpdC0+aTRfOworICAgICAgfQorICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfb3V0Ml8gKyBZX09GRl9FTkMpKTsKKyAgfQorCisgIC8vIEZpbmFsIHJlY29uc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gd2hpY2ggbW9kZSBpcyBzZWxlY3RlZC4KKyAgaWYgKCFpc19pMTYpIHsKKyAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCByZC0+bW9kZXNfaTQpOworICAgIFN3YXBPdXQoaXQpOworICAgIGJlc3Rfc2NvcmUgPSBzY29yZV9pNDsKKyAgfSBlbHNlIHsKKyAgICBueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQywgaXQtPnByZWRzX1swXSk7CisgIH0KKworICAvLyAuLi4gYW5kIFVWIQorICBpZiAocmVmaW5lX3V2X21vZGUpIHsKKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgc2NvcmVfdCBiZXN0X3V2X3Njb3JlID0gTUFYX0NPU1Q7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhVVk1vZGVPZmZzZXRzW21vZGVdOworICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IFZQOFNTRTE2eDgoc3JjLCByZWYpICogUkRfRElTVE9fTVVMVAorICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEZpeGVkQ29zdHNVVlttb2RlXSAqIGxhbWJkYV9kX3V2OworICAgICAgaWYgKHNjb3JlIDwgYmVzdF91dl9zY29yZSkgeworICAgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgICAgICBiZXN0X3V2X3Njb3JlID0gc2NvcmU7CisgICAgICB9CisgICAgfQorICAgIFZQOFNldEludHJhVVZNb2RlKGl0LCBiZXN0X21vZGUpOworICB9CisgIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRl9FTkMsIGl0LT5tYl8tPnV2X21vZGVfKTsKKworICByZC0+bnogPSBuejsKKyAgcmQtPnNjb3JlID0gYmVzdF9zY29yZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2ludCBWUDhEZWNpbWF0ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQsCisgICAgICAgICAgICAgICAgVlA4UkRMZXZlbCByZF9vcHQpIHsKKyAgaW50IGlzX3NraXBwZWQ7CisgIGNvbnN0IGludCBtZXRob2QgPSBpdC0+ZW5jXy0+bWV0aG9kXzsKKworICBJbml0U2NvcmUocmQpOworCisgIC8vIFdlIGNhbiBwZXJmb3JtIHByZWRpY3Rpb25zIGZvciBMdW1hMTZ4MTYgYW5kIENocm9tYTh4OCBhbHJlYWR5LgorICAvLyBMdW1hNHg0IHByZWRpY3Rpb25zIG5lZWRzIHRvIGJlIGRvbmUgYXMtd2UtZ28uCisgIFZQOE1ha2VMdW1hMTZQcmVkcyhpdCk7CisgIFZQOE1ha2VDaHJvbWE4UHJlZHMoaXQpOworCisgIGlmIChyZF9vcHQgPiBSRF9PUFRfTk9ORSkgeworICAgIGl0LT5kb190cmVsbGlzXyA9IChyZF9vcHQgPj0gUkRfT1BUX1RSRUxMSVNfQUxMKTsKKyAgICBQaWNrQmVzdEludHJhMTYoaXQsIHJkKTsKKyAgICBpZiAobWV0aG9kID49IDIpIHsKKyAgICAgIFBpY2tCZXN0SW50cmE0KGl0LCByZCk7CisgICAgfQorICAgIFBpY2tCZXN0VVYoaXQsIHJkKTsKKyAgICBpZiAocmRfb3B0ID09IFJEX09QVF9UUkVMTElTKSB7ICAgLy8gZmluaXNoIG9mZiB3aXRoIHRyZWxsaXMtb3B0aW0gbm93CisgICAgICBpdC0+ZG9fdHJlbGxpc18gPSAxOworICAgICAgU2ltcGxlUXVhbnRpemUoaXQsIHJkKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGhldXJpc3RpY2FsbHkgZGVjaWRlZCBpbnRyYTE2IC8gaW50cmE0LgorICAgIC8vIEZvciBtZXRob2QgPj0gMiwgcGljayB0aGUgYmVzdCBpbnRyYTQvaW50cmExNiBiYXNlZCBvbiBTU0UgKH50YWQgc2xvd2VyKS4KKyAgICAvLyBGb3IgbWV0aG9kIDw9IDEsIHdlIGRvbid0IHJlLWV4YW1pbmUgdGhlIGRlY2lzaW9uIGJ1dCBqdXN0IGdvIGFoZWFkIHdpdGgKKyAgICAvLyBxdWFudGl6YXRpb24vcmVjb25zdHJ1Y3Rpb24uCisgICAgUmVmaW5lVXNpbmdEaXN0b3J0aW9uKGl0LCAobWV0aG9kID49IDIpLCAobWV0aG9kID49IDEpLCByZCk7CisgIH0KKyAgaXNfc2tpcHBlZCA9IChyZC0+bnogPT0gMCk7CisgIFZQOFNldFNraXAoaXQsIGlzX3NraXBwZWQpOworICByZXR1cm4gaXNfc2tpcHBlZDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9zeW50YXguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvc3ludGF4X2VuYy5jCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9zeW50YXguYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9zeW50YXhfZW5jLmMKaW5kZXggYTRlOTRlNS4uYTllNWE2YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3N5bnRheC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvc3ludGF4X2VuYy5jCkBAIC0xMSwyMCArMTEsMTIgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgogCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIgIC8vIFJJRkYgY29uc3RhbnRzCi0jaW5jbHVkZSAiLi4vd2VicC9tdXhfdHlwZXMuaCIgICAgICAgICAvLyBBTFBIQV9GTEFHCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIgIC8vIFJJRkYgY29uc3RhbnRzCisjaW5jbHVkZSAic3JjL3dlYnAvbXV4X3R5cGVzLmgiICAgICAgICAgLy8gQUxQSEFfRkxBRworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEhlbHBlciBmdW5jdGlvbnMKQEAgLTQ4LDcgKzQwLDcgQEAKICAgdWludDhfdCByaWZmW1JJRkZfSEVBREVSX1NJWkVdID0gewogICAgICdSJywgJ0knLCAnRicsICdGJywgMCwgMCwgMCwgMCwgJ1cnLCAnRScsICdCJywgJ1AnCiAgIH07Ci0gIFNCX0RDSEVDSyhyaWZmX3NpemUgPT0gKHVpbnQzMl90KXJpZmZfc2l6ZSk7CisgIGFzc2VydChyaWZmX3NpemUgPT0gKHVpbnQzMl90KXJpZmZfc2l6ZSk7CiAgIFB1dExFMzIocmlmZiArIFRBR19TSVpFLCAodWludDMyX3QpcmlmZl9zaXplKTsKICAgaWYgKCFwaWMtPndyaXRlcihyaWZmLCBzaXplb2YocmlmZiksIHBpYykpIHsKICAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CkBAIC02Myw5ICs1NSw5IEBACiAgIH07CiAgIHVpbnQzMl90IGZsYWdzID0gMDsKIAotICBTQl9EQ0hFQ0soSXNWUDhYTmVlZGVkKGVuYykpOwotICBTQl9EQ0hFQ0socGljLT53aWR0aCA+PSAxICYmIHBpYy0+aGVpZ2h0ID49IDEpOwotICBTQl9EQ0hFQ0socGljLT53aWR0aCA8PSBNQVhfQ0FOVkFTX1NJWkUgJiYgcGljLT5oZWlnaHQgPD0gTUFYX0NBTlZBU19TSVpFKTsKKyAgYXNzZXJ0KElzVlA4WE5lZWRlZChlbmMpKTsKKyAgYXNzZXJ0KHBpYy0+d2lkdGggPj0gMSAmJiBwaWMtPmhlaWdodCA+PSAxKTsKKyAgYXNzZXJ0KHBpYy0+d2lkdGggPD0gTUFYX0NBTlZBU19TSVpFICYmIHBpYy0+aGVpZ2h0IDw9IE1BWF9DQU5WQVNfU0laRSk7CiAKICAgaWYgKGVuYy0+aGFzX2FscGhhXykgewogICAgIGZsYWdzIHw9IEFMUEhBX0ZMQUc7CkBAIC04Nyw3ICs3OSw3IEBACiAgICAgJ0EnLCAnTCcsICdQJywgJ0gnCiAgIH07CiAKLSAgU0JfRENIRUNLKGVuYy0+aGFzX2FscGhhXyk7CisgIGFzc2VydChlbmMtPmhhc19hbHBoYV8pOwogCiAgIC8vIEFscGhhIGNodW5rIGhlYWRlci4KICAgUHV0TEUzMihhbHBoYV9jaHVua19oZHIgKyBUQUdfU0laRSwgZW5jLT5hbHBoYV9kYXRhX3NpemVfKTsKQEAgLTExMiw3ICsxMDQsNyBAQAogICB1aW50OF90IHZwOF9jaHVua19oZHJbQ0hVTktfSEVBREVSX1NJWkVdID0gewogICAgICdWJywgJ1AnLCAnOCcsICcgJwogICB9OwotICBTQl9EQ0hFQ0sodnA4X3NpemUgPT0gKHVpbnQzMl90KXZwOF9zaXplKTsKKyAgYXNzZXJ0KHZwOF9zaXplID09ICh1aW50MzJfdCl2cDhfc2l6ZSk7CiAgIFB1dExFMzIodnA4X2NodW5rX2hkciArIFRBR19TSVpFLCAodWludDMyX3QpdnA4X3NpemUpOwogICBpZiAoIXBpYy0+d3JpdGVyKHZwOF9jaHVua19oZHIsIHNpemVvZih2cDhfY2h1bmtfaGRyKSwgcGljKSkgewogICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKQEAgLTE5NCw4ICsxODYsOCBAQAogLy8gU2VnbWVudGF0aW9uIGhlYWRlcgogc3RhdGljIHZvaWQgUHV0U2VnbWVudEhlYWRlcihWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgY29uc3QgVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+c2VnbWVudF9oZHJfOwotICBjb25zdCBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87CisgIGNvbnN0IFZQOEVuY1NlZ21lbnRIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPnNlZ21lbnRfaGRyXzsKKyAgY29uc3QgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwogICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgKGhkci0+bnVtX3NlZ21lbnRzXyA+IDEpKSkgewogICAgIC8vIFdlIGFsd2F5cyAndXBkYXRlJyB0aGUgcXVhbnQgYW5kIGZpbHRlciBzdHJlbmd0aCB2YWx1ZXMKICAgICBjb25zdCBpbnQgdXBkYXRlX2RhdGEgPSAxOwpAQCAtMjA1LDE2ICsxOTcsMTYgQEAKICAgICAgIC8vIHdlIGFsd2F5cyB1c2UgYWJzb2x1dGUgdmFsdWVzLCBub3QgcmVsYXRpdmUgb25lcwogICAgICAgVlA4UHV0Qml0VW5pZm9ybShidywgMSk7ICAgLy8gKHNlZ21lbnRfZmVhdHVyZV9tb2RlID0gMS4gUGFyYWdyYXBoIDkuMy4pCiAgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKLSAgICAgICAgVlA4UHV0U2lnbmVkVmFsdWUoYncsIGVuYy0+ZHFtX1tzXS5xdWFudF8sIDcpOworICAgICAgICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxbV9bc10ucXVhbnRfLCA3KTsKICAgICAgIH0KICAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcW1fW3NdLmZzdHJlbmd0aF8sIDYpOworICAgICAgICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXywgNik7CiAgICAgICB9CiAgICAgfQogICAgIGlmIChoZHItPnVwZGF0ZV9tYXBfKSB7CiAgICAgICBmb3IgKHMgPSAwOyBzIDwgMzsgKytzKSB7CiAgICAgICAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCAocHJvYmEtPnNlZ21lbnRzX1tzXSAhPSAyNTV1KSkpIHsKLSAgICAgICAgICBWUDhQdXRWYWx1ZShidywgcHJvYmEtPnNlZ21lbnRzX1tzXSwgOCk7CisgICAgICAgICAgVlA4UHV0Qml0cyhidywgcHJvYmEtPnNlZ21lbnRzX1tzXSwgOCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0yMjMsMjAgKzIxNSwyMCBAQAogCiAvLyBGaWx0ZXJpbmcgcGFyYW1ldGVycyBoZWFkZXIKIHN0YXRpYyB2b2lkIFB1dEZpbHRlckhlYWRlcihWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4RW5jRmlsdGVySGVhZGVyKiBjb25zdCBoZHIpIHsKICAgY29uc3QgaW50IHVzZV9sZl9kZWx0YSA9IChoZHItPmk0eDRfbGZfZGVsdGFfICE9IDApOwogICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBoZHItPnNpbXBsZV8pOwotICBWUDhQdXRWYWx1ZShidywgaGRyLT5sZXZlbF8sIDYpOwotICBWUDhQdXRWYWx1ZShidywgaGRyLT5zaGFycG5lc3NfLCAzKTsKKyAgVlA4UHV0Qml0cyhidywgaGRyLT5sZXZlbF8sIDYpOworICBWUDhQdXRCaXRzKGJ3LCBoZHItPnNoYXJwbmVzc18sIDMpOwogICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgdXNlX2xmX2RlbHRhKSkgewogICAgIC8vICcwJyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgaTR4NF9sZl9kZWx0YV8gYXQgZnJhbWUgIzAuCiAgICAgY29uc3QgaW50IG5lZWRfdXBkYXRlID0gKGhkci0+aTR4NF9sZl9kZWx0YV8gIT0gMCk7CiAgICAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIG5lZWRfdXBkYXRlKSkgewogICAgICAgLy8gd2UgZG9uJ3QgdXNlIHJlZl9sZl9kZWx0YSA9PiBlbWl0IGZvdXIgMCBiaXRzCi0gICAgICBWUDhQdXRWYWx1ZShidywgMCwgNCk7CisgICAgICBWUDhQdXRCaXRzKGJ3LCAwLCA0KTsKICAgICAgIC8vIHdlIHVzZSBtb2RlX2xmX2RlbHRhIGZvciBpNHg0Ci0gICAgICBWUDhQdXRTaWduZWRWYWx1ZShidywgaGRyLT5pNHg0X2xmX2RlbHRhXywgNik7Ci0gICAgICBWUDhQdXRWYWx1ZShidywgMCwgMyk7ICAgIC8vIGFsbCBvdGhlcnMgdW51c2VkCisgICAgICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBoZHItPmk0eDRfbGZfZGVsdGFfLCA2KTsKKyAgICAgIFZQOFB1dEJpdHMoYncsIDAsIDMpOyAgICAvLyBhbGwgb3RoZXJzIHVudXNlZAogICAgIH0KICAgfQogfQpAQCAtMjQ0LDEyICsyMzYsMTIgQEAKIC8vIE5vbWluYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMKIHN0YXRpYyB2b2lkIFB1dFF1YW50KFZQOEJpdFdyaXRlciogY29uc3QgYncsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHV0VmFsdWUoYncsIGVuYy0+YmFzZV9xdWFudF8sIDcpOwotICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcV95MV9kY18sIDQpOwotICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcV95Ml9kY18sIDQpOwotICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcV95Ml9hY18sIDQpOwotICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcV91dl9kY18sIDQpOwotICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcV91dl9hY18sIDQpOworICBWUDhQdXRCaXRzKGJ3LCBlbmMtPmJhc2VfcXVhbnRfLCA3KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV95MV9kY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3kyX2RjXywgNCk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfeTJfYWNfLCA0KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV91dl9kY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3V2X2FjXywgNCk7CiB9CiAKIC8vIFBhcnRpdGlvbiBzaXplcwpAQCAtMjcxLDYwICsyNjMsMjMgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0KLSNkZWZpbmUgS1RSQUlMRVJfU0laRSA4Ci0KLXN0YXRpYyBpbnQgV3JpdGVFeHRlbnNpb25zKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICB1aW50OF90IGJ1ZmZlcltLVFJBSUxFUl9TSVpFXTsKLSAgVlA4Qml0V3JpdGVyKiBjb25zdCBidyA9ICZlbmMtPmJ3XzsKLSAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLQotICAvLyBMYXllciAoYnl0ZXMgMC4uMykKLSAgUHV0TEUyNChidWZmZXIgKyAwLCBlbmMtPmxheWVyX2RhdGFfc2l6ZV8pOwotICBidWZmZXJbM10gPSBlbmMtPnBpY18tPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICBpZiAoZW5jLT5sYXllcl9kYXRhX3NpemVfID4gMCkgewotICAgIFNCX0RDSEVDSyhlbmMtPnVzZV9sYXllcl8pOwotICAgIC8vIGFwcGVuZCBsYXllciBkYXRhIHRvIGxhc3QgcGFydGl0aW9uCi0gICAgaWYgKCFWUDhCaXRXcml0ZXJBcHBlbmQoJmVuYy0+cGFydHNfW2VuYy0+bnVtX3BhcnRzXyAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+bGF5ZXJfZGF0YV8sIGVuYy0+bGF5ZXJfZGF0YV9zaXplXykpIHsKLSAgICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfQklUU1RSRUFNX09VVF9PRl9NRU1PUlkpOwotICAgIH0KLSAgfQotCi0gIGJ1ZmZlcltLVFJBSUxFUl9TSVpFIC0gMV0gPSAweDAxOyAgLy8gbWFya2VyCi0gIGlmICghVlA4Qml0V3JpdGVyQXBwZW5kKGJ3LCBidWZmZXIsIEtUUkFJTEVSX1NJWkUpKSB7Ci0gICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9CSVRTVFJFQU1fT1VUX09GX01FTU9SWSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZiAgICAvKiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUyAqLwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgc2l6ZV90IEdlbmVyYXRlUGFydGl0aW9uMChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKK3N0YXRpYyBpbnQgR2VuZXJhdGVQYXJ0aXRpb24wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewogICBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gJmVuYy0+YndfOwogICBjb25zdCBpbnQgbWJfc2l6ZSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwogICB1aW50NjRfdCBwb3MxLCBwb3MyLCBwb3MzOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGNvbnN0IGludCBuZWVkX2V4dGVuc2lvbnMgPSBlbmMtPnVzZV9sYXllcl87Ci0jZW5kaWYKIAogICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgVlA4Qml0V3JpdGVySW5pdChidywgbWJfc2l6ZSAqIDcgLyA4KTsgICAgICAgIC8vIH43IGJpdHMgcGVyIG1hY3JvYmxvY2sKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBuZWVkX2V4dGVuc2lvbnMpOyAgIC8vIGV4dGVuc2lvbnMKLSNlbHNlCisgIGlmICghVlA4Qml0V3JpdGVySW5pdChidywgbWJfc2l6ZSAqIDcgLyA4KSkgeyAgICAgICAgLy8gfjcgYml0cyBwZXIgbWFjcm9ibG9jaworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KICAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gY29sb3JzcGFjZQotI2VuZGlmCiAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIDApOyAgIC8vIGNsYW1wIHR5cGUKIAogICBQdXRTZWdtZW50SGVhZGVyKGJ3LCBlbmMpOwogICBQdXRGaWx0ZXJIZWFkZXIoYncsICZlbmMtPmZpbHRlcl9oZHJfKTsKLSAgVlA4UHV0VmFsdWUoYncsIGVuYy0+bnVtX3BhcnRzXyA9PSA4ID8gMyA6Ci0gICAgICAgICAgICAgICAgICBlbmMtPm51bV9wYXJ0c18gPT0gNCA/IDIgOgotICAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDIgPyAxIDogMCwgMik7CisgIFZQOFB1dEJpdHMoYncsIGVuYy0+bnVtX3BhcnRzXyA9PSA4ID8gMyA6CisgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSA0ID8gMiA6CisgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSAyID8gMSA6IDAsIDIpOwogICBQdXRRdWFudChidywgZW5jKTsKICAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gbm8gcHJvYmEgdXBkYXRlCiAgIFZQOFdyaXRlUHJvYmFzKGJ3LCAmZW5jLT5wcm9iYV8pOwpAQCAtMzMyLDIxICsyODcsMjMgQEAKICAgVlA4Q29kZUludHJhTW9kZXMoZW5jKTsKICAgVlA4Qml0V3JpdGVyRmluaXNoKGJ3KTsKIAotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGlmIChuZWVkX2V4dGVuc2lvbnMgJiYgIVdyaXRlRXh0ZW5zaW9ucyhlbmMpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSNlbmRpZgotCiAgIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwogCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQogICBpZiAoZW5jLT5waWNfLT5zdGF0cykgewogICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1swXSA9IChpbnQpKChwb3MyIC0gcG9zMSArIDcpID4+IDMpOwogICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1sxXSA9IChpbnQpKChwb3MzIC0gcG9zMiArIDcpID4+IDMpOwogICAgIGVuYy0+cGljXy0+c3RhdHMtPmFscGhhX2RhdGFfc2l6ZSA9IChpbnQpZW5jLT5hbHBoYV9kYXRhX3NpemVfOwotICAgIGVuYy0+cGljXy0+c3RhdHMtPmxheWVyX2RhdGFfc2l6ZSA9IChpbnQpZW5jLT5sYXllcl9kYXRhX3NpemVfOwogICB9Ci0gIHJldHVybiAhYnctPmVycm9yXzsKKyNlbHNlCisgICh2b2lkKXBvczE7CisgICh2b2lkKXBvczI7CisgICh2b2lkKXBvczM7CisjZW5kaWYKKyAgaWYgKGJ3LT5lcnJvcl8pIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IoZW5jLT5waWNfLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICB9CisgIHJldHVybiAxOwogfQogCiB2b2lkIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewpAQCAtMzY4LDcgKzMyNSw4IEBACiAgIGludCBwOwogCiAgIC8vIFBhcnRpdGlvbiAjMCB3aXRoIGhlYWRlciBhbmQgcGFydGl0aW9uIHNpemVzCi0gIG9rID0gISFHZW5lcmF0ZVBhcnRpdGlvbjAoZW5jKTsKKyAgb2sgPSBHZW5lcmF0ZVBhcnRpdGlvbjAoZW5jKTsKKyAgaWYgKCFvaykgcmV0dXJuIDA7CiAKICAgLy8gQ29tcHV0ZSBWUDggc2l6ZQogICB2cDhfc2l6ZSA9IFZQOF9GUkFNRV9IRUFERVJfU0laRSArCkBAIC00MTAsOCArMzY4LDcgQEAKICAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CiAgICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmID0gVlA4Qml0V3JpdGVyQnVmKGVuYy0+cGFydHNfICsgcCk7CiAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBWUDhCaXRXcml0ZXJTaXplKGVuYy0+cGFydHNfICsgcCk7Ci0gICAgaWYgKHNpemUpCi0gICAgICBvayA9IG9rICYmIHBpYy0+d3JpdGVyKGJ1Ziwgc2l6ZSwgcGljKTsKKyAgICBpZiAoc2l6ZSkgb2sgPSBvayAmJiBwaWMtPndyaXRlcihidWYsIHNpemUsIHBpYyk7CiAgICAgVlA4Qml0V3JpdGVyV2lwZU91dChlbmMtPnBhcnRzXyArIHApOyAgICAvLyB3aWxsIGZyZWUgdGhlIGludGVybmFsIGJ1ZmZlci4KICAgICBvayA9IG9rICYmIFdlYlBSZXBvcnRQcm9ncmVzcyhwaWMsIGVuYy0+cGVyY2VudF8gKyBwZXJjZW50X3Blcl9wYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmMtPnBlcmNlbnRfKTsKQEAgLTQyOSw2ICszODYsMyBAQAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdG9rZW5fZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3Rva2VuX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjYyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3Rva2VuX2VuYy5jCkBAIC0wLDAgKzEsMjY4IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgorLy8KKy8vICBBICd0b2tlbicgaXMgYSBiaXQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvYmFiaWxpdHksIGVpdGhlciBmaXhlZAorLy8gb3IgYSBsYXRlci10by1iZS1kZXRlcm1pbmVkIGFmdGVyIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNvbGxlY3RlZC4KKy8vIEZvciBkeW5hbWljIHByb2JhYmlsaXR5LCB3ZSBqdXN0IHJlY29yZCB0aGUgc2xvdCBpZCAoaWR4KSBmb3IgdGhlIHByb2JhYmlsaXR5CisvLyB2YWx1ZSBpbiB0aGUgZmluYWwgcHJvYmFiaWxpdHkgYXJyYXkgKHVpbnQ4X3QqIHByb2JhcyBpbiBWUDhFbWl0VG9rZW5zKS4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKKy8vIHdlIHVzZSBwYWdlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBtZW1jcHkoKQorI2RlZmluZSBNSU5fUEFHRV9TSVpFIDgxOTIgICAgICAgICAgLy8gbWluaW11bSBudW1iZXIgb2YgdG9rZW4gcGVyIHBhZ2UKKyNkZWZpbmUgRklYRURfUFJPQkFfQklUICgxdSA8PCAxNCkKKwordHlwZWRlZiB1aW50MTZfdCB0b2tlbl90OyAgLy8gYml0ICMxNTogYml0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQgIzE0OiBmbGFncyBmb3IgY29uc3RhbnQgcHJvYmEgb3IgaWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRzICMwLi4xMzogc2xvdCBvciBjb25zdGFudCBwcm9iYQorc3RydWN0IFZQOFRva2VucyB7CisgIFZQOFRva2VucyogbmV4dF87ICAgICAgICAvLyBwb2ludGVyIHRvIG5leHQgcGFnZQorfTsKKy8vIFRva2VuIGRhdGEgaXMgbG9jYXRlZCBpbiBtZW1vcnkganVzdCBhZnRlciB0aGUgbmV4dF8gZmllbGQuCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcmV0dXJuIHRoZWlyIGFkZHJlc3MgYW5kIGhpZGUgdGhlIHRyaWNrLgorI2RlZmluZSBUT0tFTl9EQVRBKHApICgoY29uc3QgdG9rZW5fdCopJihwKVsxXSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBWUDhUQnVmZmVySW5pdChWUDhUQnVmZmVyKiBjb25zdCBiLCBpbnQgcGFnZV9zaXplKSB7CisgIGItPnRva2Vuc18gPSBOVUxMOworICBiLT5wYWdlc18gPSBOVUxMOworICBiLT5sYXN0X3BhZ2VfID0gJmItPnBhZ2VzXzsKKyAgYi0+bGVmdF8gPSAwOworICBiLT5wYWdlX3NpemVfID0gKHBhZ2Vfc2l6ZSA8IE1JTl9QQUdFX1NJWkUpID8gTUlOX1BBR0VfU0laRSA6IHBhZ2Vfc2l6ZTsKKyAgYi0+ZXJyb3JfID0gMDsKK30KKwordm9pZCBWUDhUQnVmZmVyQ2xlYXIoVlA4VEJ1ZmZlciogY29uc3QgYikgeworICBpZiAoYiAhPSBOVUxMKSB7CisgICAgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICAgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICAgIFZQOFRva2VucyogY29uc3QgbmV4dCA9IHAtPm5leHRfOworICAgICAgV2ViUFNhZmVGcmVlKHApOworICAgICAgcCA9IG5leHQ7CisgICAgfQorICAgIFZQOFRCdWZmZXJJbml0KGIsIGItPnBhZ2Vfc2l6ZV8pOworICB9Cit9CisKK3N0YXRpYyBpbnQgVEJ1ZmZlck5ld1BhZ2UoVlA4VEJ1ZmZlciogY29uc3QgYikgeworICBWUDhUb2tlbnMqIHBhZ2UgPSBOVUxMOworICBpZiAoIWItPmVycm9yXykgeworICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKCpwYWdlKSArIGItPnBhZ2Vfc2l6ZV8gKiBzaXplb2YodG9rZW5fdCk7CisgICAgcGFnZSA9IChWUDhUb2tlbnMqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemUpOworICB9CisgIGlmIChwYWdlID09IE5VTEwpIHsKKyAgICBiLT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIHBhZ2UtPm5leHRfID0gTlVMTDsKKworICAqYi0+bGFzdF9wYWdlXyA9IHBhZ2U7CisgIGItPmxhc3RfcGFnZV8gPSAmcGFnZS0+bmV4dF87CisgIGItPmxlZnRfID0gYi0+cGFnZV9zaXplXzsKKyAgYi0+dG9rZW5zXyA9ICh0b2tlbl90KilUT0tFTl9EQVRBKHBhZ2UpOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBUT0tFTl9JRCh0LCBiLCBjdHgpIFwKKyAgICAoTlVNX1BST0JBUyAqICgoY3R4KSArIE5VTV9DVFggKiAoKGIpICsgTlVNX0JBTkRTICogKHQpKSkpCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBZGRUb2tlbihWUDhUQnVmZmVyKiBjb25zdCBiLCB1aW50MzJfdCBiaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvYmFfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7CisgIGFzc2VydChwcm9iYV9pZHggPCBGSVhFRF9QUk9CQV9CSVQpOworICBhc3NlcnQoYml0IDw9IDEpOworICBpZiAoYi0+bGVmdF8gPiAwIHx8IFRCdWZmZXJOZXdQYWdlKGIpKSB7CisgICAgY29uc3QgaW50IHNsb3QgPSAtLWItPmxlZnRfOworICAgIGItPnRva2Vuc19bc2xvdF0gPSAoYml0IDw8IDE1KSB8IHByb2JhX2lkeDsKKyAgfQorICBWUDhSZWNvcmRTdGF0cyhiaXQsIHN0YXRzKTsKKyAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkQ29uc3RhbnRUb2tlbihWUDhUQnVmZmVyKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXQsIHVpbnQzMl90IHByb2JhKSB7CisgIGFzc2VydChwcm9iYSA8IDI1Nik7CisgIGFzc2VydChiaXQgPD0gMSk7CisgIGlmIChiLT5sZWZ0XyA+IDAgfHwgVEJ1ZmZlck5ld1BhZ2UoYikpIHsKKyAgICBjb25zdCBpbnQgc2xvdCA9IC0tYi0+bGVmdF87CisgICAgYi0+dG9rZW5zX1tzbG90XSA9IChiaXQgPDwgMTUpIHwgRklYRURfUFJPQkFfQklUIHwgcHJvYmE7CisgIH0KK30KKworaW50IFZQOFJlY29yZENvZWZmVG9rZW5zKGludCBjdHgsIGNvbnN0IHN0cnVjdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgeworICBjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMgPSByZXMtPmNvZWZmczsKKyAgY29uc3QgaW50IGNvZWZmX3R5cGUgPSByZXMtPmNvZWZmX3R5cGU7CisgIGNvbnN0IGludCBsYXN0ID0gcmVzLT5sYXN0OworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIHVpbnQzMl90IGJhc2VfaWQgPSBUT0tFTl9JRChjb2VmZl90eXBlLCBuLCBjdHgpOworICAvLyBzaG91bGQgYmUgc3RhdHNbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBwcm9iYV90KiBzID0gcmVzLT5zdGF0c1tuXVtjdHhdOworICBpZiAoIUFkZFRva2VuKHRva2VucywgbGFzdCA+PSAwLCBiYXNlX2lkICsgMCwgcyArIDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB3aGlsZSAobiA8IDE2KSB7CisgICAgY29uc3QgaW50IGMgPSBjb2VmZnNbbisrXTsKKyAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOworICAgIGNvbnN0IHVpbnQzMl90IHYgPSBzaWduID8gLWMgOiBjOworICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ICE9IDAsIGJhc2VfaWQgKyAxLCBzICsgMSkpIHsKKyAgICAgIGJhc2VfaWQgPSBUT0tFTl9JRChjb2VmZl90eXBlLCBWUDhFbmNCYW5kc1tuXSwgMCk7ICAvLyBjdHg9MAorICAgICAgcyA9IHJlcy0+c3RhdHNbVlA4RW5jQmFuZHNbbl1dWzBdOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gMSwgYmFzZV9pZCArIDIsIHMgKyAyKSkgeworICAgICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCAxKTsgIC8vIGN0eD0xCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gNCwgYmFzZV9pZCArIDMsIHMgKyAzKSkgeworICAgICAgICBpZiAoQWRkVG9rZW4odG9rZW5zLCB2ICE9IDIsIGJhc2VfaWQgKyA0LCBzICsgNCkpIHsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIHYgPT0gNCwgYmFzZV9pZCArIDUsIHMgKyA1KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gMTAsIGJhc2VfaWQgKyA2LCBzICsgNikpIHsKKyAgICAgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiA2LCBiYXNlX2lkICsgNywgcyArIDcpKSB7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHYgPT0gNiwgMTU5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA+PSA5LCAxNjUpOworICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhKHYgJiAxKSwgMTQ1KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG1hc2s7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKKyAgICAgICAgdWludDMyX3QgcmVzaWR1ZSA9IHYgLSAzOworICAgICAgICBpZiAocmVzaWR1ZSA8ICg4IDw8IDEpKSB7ICAgICAgICAgIC8vIFZQOENhdDMgICgzYikKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyA4LCBzICsgOCk7CisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOSwgcyArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMCk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMjsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQzOworICAgICAgICB9IGVsc2UgaWYgKHJlc2lkdWUgPCAoOCA8PCAyKSkgeyAgIC8vIFZQOENhdDQgICg0YikKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyA4LCBzICsgOCk7CisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAxLCBiYXNlX2lkICsgOSwgcyArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMSk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMzsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ0OworICAgICAgICB9IGVsc2UgaWYgKHJlc2lkdWUgPCAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA4LCBzICsgOCk7CisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgMTAsIHMgKyA5KTsKKyAgICAgICAgICByZXNpZHVlIC09ICg4IDw8IDIpOworICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyAxMCwgcyArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMyk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMTA7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobWFzaykgeworICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhIShyZXNpZHVlICYgbWFzayksICp0YWIrKyk7CisgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCAyKTsgIC8vIGN0eD0yCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMl07CisgICAgfQorICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCBzaWduLCAxMjgpOworICAgIGlmIChuID09IDE2IHx8ICFBZGRUb2tlbih0b2tlbnMsIG4gPD0gbGFzdCwgYmFzZV9pZCArIDAsIHMgKyAwKSkgeworICAgICAgcmV0dXJuIDE7ICAgLy8gRU9CCisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisjdW5kZWYgVE9LRU5fSUQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmFsIGNvZGluZyBwYXNzLCB3aXRoIGtub3duIHByb2JhYmlsaXRpZXMKKworaW50IFZQOEVtaXRUb2tlbnMoVlA4VEJ1ZmZlciogY29uc3QgYiwgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcywgaW50IGZpbmFsX3Bhc3MpIHsKKyAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICBhc3NlcnQoIWItPmVycm9yXyk7CisgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKKyAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOworICAgIGludCBuID0gYi0+cGFnZV9zaXplXzsKKyAgICBjb25zdCB0b2tlbl90KiBjb25zdCB0b2tlbnMgPSBUT0tFTl9EQVRBKHApOworICAgIHdoaWxlIChuLS0gPiBOKSB7CisgICAgICBjb25zdCB0b2tlbl90IHRva2VuID0gdG9rZW5zW25dOworICAgICAgY29uc3QgaW50IGJpdCA9ICh0b2tlbiA+PiAxNSkgJiAxOworICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7CisgICAgICAgIFZQOFB1dEJpdChidywgYml0LCB0b2tlbiAmIDB4ZmZ1KTsgIC8vIGNvbnN0YW50IHByb2JhCisgICAgICB9IGVsc2UgeworICAgICAgICBWUDhQdXRCaXQoYncsIGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZmluYWxfcGFzcykgV2ViUFNhZmVGcmVlKCh2b2lkKilwKTsKKyAgICBwID0gbmV4dDsKKyAgfQorICBpZiAoZmluYWxfcGFzcykgYi0+cGFnZXNfID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFNpemUgZXN0aW1hdGlvbgorc2l6ZV90IFZQOEVzdGltYXRlVG9rZW5TaXplKFZQOFRCdWZmZXIqIGNvbnN0IGIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcykgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKKyAgYXNzZXJ0KCFiLT5lcnJvcl8pOworICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgY29uc3QgVlA4VG9rZW5zKiBjb25zdCBuZXh0ID0gcC0+bmV4dF87CisgICAgY29uc3QgaW50IE4gPSAobmV4dCA9PSBOVUxMKSA/IGItPmxlZnRfIDogMDsKKyAgICBpbnQgbiA9IGItPnBhZ2Vfc2l6ZV87CisgICAgY29uc3QgdG9rZW5fdCogY29uc3QgdG9rZW5zID0gVE9LRU5fREFUQShwKTsKKyAgICB3aGlsZSAobi0tID4gTikgeworICAgICAgY29uc3QgdG9rZW5fdCB0b2tlbiA9IHRva2Vuc1tuXTsKKyAgICAgIGNvbnN0IGludCBiaXQgPSB0b2tlbiAmICgxIDw8IDE1KTsKKyAgICAgIGlmICh0b2tlbiAmIEZJWEVEX1BST0JBX0JJVCkgeworICAgICAgICBzaXplICs9IFZQOEJpdENvc3QoYml0LCB0b2tlbiAmIDB4ZmZ1KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdChiaXQsIHByb2Jhc1t0b2tlbiAmIDB4M2ZmZnVdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCA9IG5leHQ7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbHNlICAgICAvLyBESVNBQkxFX1RPS0VOX0JVRkZFUgorCit2b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIsIGludCBwYWdlX3NpemUpIHsKKyAgKHZvaWQpYjsKKyAgKHZvaWQpcGFnZV9zaXplOworfQordm9pZCBWUDhUQnVmZmVyQ2xlYXIoVlA4VEJ1ZmZlciogY29uc3QgYikgeworICAodm9pZCliOworfQorCisjZW5kaWYgICAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90cmVlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3RyZWVfZW5jLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3RyZWUuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90cmVlX2VuYy5jCmluZGV4IDMxZGY3MWYuLmFmYjA1NDMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90cmVlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90cmVlX2VuYy5jCkBAIC03LDIwICs3LDE1IEBACiAvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwotLy8gVG9rZW4gcHJvYmFiaWxpdGllcworLy8gQ29kaW5nIG9mIHRva2VuIHByb2JhYmlsaXRpZXMsIGludHJhIG1vZGVzIGFuZCBzZWdtZW50cy4KIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbmRpZgogCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIERlZmF1bHQgcHJvYmFiaWxpdGllcwpAQCAtMjgsNyArMjMsNiBAQAogLy8gUGFyYWdyYXBoIDEzLjUKIGNvbnN0IHVpbnQ4X3QKICAgVlA4Q29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKLSAgLy8gZ2VuZXJlYXRlZCB1c2luZyB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKCkgaW4gZW50cm9weS5jOjEyOQogICB7IHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAogICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAogICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CkBAIC0xNjQsMTAgKzE1OCwxMCBAQAogfTsKIAogdm9pZCBWUDhEZWZhdWx0UHJvYmFzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmFzID0gJmVuYy0+cHJvYmFfOworICBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmFzID0gJmVuYy0+cHJvYmFfOwogICBwcm9iYXMtPnVzZV9za2lwX3Byb2JhXyA9IDA7Ci0gIFNiTWVtb3J5U2V0KHByb2Jhcy0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmFzLT5zZWdtZW50c18pKTsKLSAgU2JNZW1vcnlDb3B5KHByb2Jhcy0+Y29lZmZzXywgVlA4Q29lZmZzUHJvYmEwLCBzaXplb2YoVlA4Q29lZmZzUHJvYmEwKSk7CisgIG1lbXNldChwcm9iYXMtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2Jhcy0+c2VnbWVudHNfKSk7CisgIG1lbWNweShwcm9iYXMtPmNvZWZmc18sIFZQOENvZWZmc1Byb2JhMCwgc2l6ZW9mKFZQOENvZWZmc1Byb2JhMCkpOwogICAvLyBOb3RlOiB3ZSBjb3VsZCBoYXJkLWNvZGUgdGhlIGxldmVsX2Nvc3RzXyBjb3JyZXNwb25kaW5nIHRvIFZQOENvZWZmc1Byb2JhMCwKICAgLy8gYnV0IHRoYXQncyB+MTFrIG9mIHN0YXRpYyBkYXRhLiBCZXR0ZXIgY2FsbCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCkgbGF0ZXIuCiAgIHByb2Jhcy0+ZGlydHlfID0gMTsKQEAgLTMyNSw3ICszMTksNyBAQAogICBWUDhFbmNJdGVyYXRvciBpdDsKICAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKICAgZG8gewotICAgIGNvbnN0IFZQOE1CSW5mbyogbWIgPSBpdC5tYl87CisgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9IGl0Lm1iXzsKICAgICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGl0LnByZWRzXzsKICAgICBpZiAoZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKICAgICAgIFB1dFNlZ21lbnQoYncsIG1iLT5zZWdtZW50XywgZW5jLT5wcm9iYV8uc2VnbWVudHNfKTsKQEAgLTM1MCw3ICszNDQsNyBAQAogICAgICAgfQogICAgIH0KICAgICBQdXRVVk1vZGUoYncsIG1iLT51dl9tb2RlXyk7Ci0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQsIDApKTsKKyAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCkpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDkyLDcgKzQ4Niw3IEBACiAgIH0KIH07CiAKLXZvaWQgVlA4V3JpdGVQcm9iYXMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgY29uc3QgVlA4UHJvYmEqIGNvbnN0IHByb2Jhcykgewordm9pZCBWUDhXcml0ZVByb2JhcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmFzKSB7CiAgIGludCB0LCBiLCBjLCBwOwogICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKICAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKQEAgLTUwMSwxNyArNDk1LDE0IEBACiAgICAgICAgICAgY29uc3QgdWludDhfdCBwMCA9IHByb2Jhcy0+Y29lZmZzX1t0XVtiXVtjXVtwXTsKICAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlID0gKHAwICE9IFZQOENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXSk7CiAgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgdXBkYXRlLCBWUDhDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXSkpIHsKLSAgICAgICAgICAgIFZQOFB1dFZhbHVlKGJ3LCBwMCwgOCk7CisgICAgICAgICAgICBWUDhQdXRCaXRzKGJ3LCBwMCwgOCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCBwcm9iYXMtPnVzZV9za2lwX3Byb2JhXykpIHsKLSAgICBWUDhQdXRWYWx1ZShidywgcHJvYmFzLT5za2lwX3Byb2JhXywgOCk7CisgICAgVlA4UHV0Qml0cyhidywgcHJvYmFzLT5za2lwX3Byb2JhXywgOCk7CiAgIH0KIH0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdnA4ZW5jaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhpX2VuYy5oCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhlbmNpLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4aV9lbmMuaAppbmRleCBmZTM3MTQwLi42NGRiZmE0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdnA4ZW5jaS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4aV9lbmMuaApAQCAtMTEsMjEgKzExLDIwIEBACiAvLwogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAotI2lmbmRlZiBXRUJQX0VOQ19WUDhFTkNJX0hfCi0jZGVmaW5lIFdFQlBfRU5DX1ZQOEVOQ0lfSF8KKyNpZm5kZWYgV0VCUF9FTkNfVlA4SV9FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfVlA4SV9FTkNfSF8KIAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQorI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKICNpbmNsdWRlIDxzdHJpbmcuaD4gICAgIC8vIGZvciBtZW1jcHkoKQogI2VuZGlmCi0jaW5jbHVkZSAiLi4vd2VicC9lbmNvZGUuaCIKLSNpbmNsdWRlICIuLi9kc3AvZHNwLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvYml0X3dyaXRlci5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3RocmVhZC5oIgorI2luY2x1ZGUgInNyYy9kZWMvY29tbW9uX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKQEAgLTMzLDM2ICszMiwxMSBAQAogLy8gVmFyaW91cyBkZWZpbmVzIGFuZCBlbnVtcwogCiAvLyB2ZXJzaW9uIG51bWJlcnMKLSNkZWZpbmUgRU5DX01BSl9WRVJTSU9OIDAKLSNkZWZpbmUgRU5DX01JTl9WRVJTSU9OIDMKLSNkZWZpbmUgRU5DX1JFVl9WRVJTSU9OIDEKKyNkZWZpbmUgRU5DX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgRU5DX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgRU5DX1JFVl9WRVJTSU9OIDAKIAotLy8gaW50cmEgcHJlZGljdGlvbiBtb2RlcwotZW51bSB7IEJfRENfUFJFRCA9IDAsICAgLy8gNHg0IG1vZGVzCi0gICAgICAgQl9UTV9QUkVEID0gMSwKLSAgICAgICBCX1ZFX1BSRUQgPSAyLAotICAgICAgIEJfSEVfUFJFRCA9IDMsCi0gICAgICAgQl9SRF9QUkVEID0gNCwKLSAgICAgICBCX1ZSX1BSRUQgPSA1LAotICAgICAgIEJfTERfUFJFRCA9IDYsCi0gICAgICAgQl9WTF9QUkVEID0gNywKLSAgICAgICBCX0hEX1BSRUQgPSA4LAotICAgICAgIEJfSFVfUFJFRCA9IDksCi0gICAgICAgTlVNX0JNT0RFUyA9IEJfSFVfUFJFRCArIDEgLSBCX0RDX1BSRUQsICAvLyA9IDEwCi0KLSAgICAgICAvLyBMdW1hMTYgb3IgVVYgbW9kZXMKLSAgICAgICBEQ19QUkVEID0gQl9EQ19QUkVELCBWX1BSRUQgPSBCX1ZFX1BSRUQsCi0gICAgICAgSF9QUkVEID0gQl9IRV9QUkVELCBUTV9QUkVEID0gQl9UTV9QUkVELAotICAgICAgIE5VTV9QUkVEX01PREVTID0gNAotICAgICB9OwotCi1lbnVtIHsgTlVNX01CX1NFR01FTlRTID0gNCwKLSAgICAgICBNQVhfTlVNX1BBUlRJVElPTlMgPSA4LAotICAgICAgIE5VTV9UWVBFUyA9IDQsICAgLy8gMDogaTE2LUFDLCAgMTogaTE2LURDLCAgMjpjaHJvbWEtQUMsICAzOmk0LUFDCi0gICAgICAgTlVNX0JBTkRTID0gOCwKLSAgICAgICBOVU1fQ1RYID0gMywKLSAgICAgICBOVU1fUFJPQkFTID0gMTEsCi0gICAgICAgTUFYX0xGX0xFVkVMUyA9IDY0LCAgICAgICAvLyBNYXhpbXVtIGxvb3AgZmlsdGVyIGxldmVsCitlbnVtIHsgTUFYX0xGX0xFVkVMUyA9IDY0LCAgICAgICAvLyBNYXhpbXVtIGxvb3AgZmlsdGVyIGxldmVsCiAgICAgICAgTUFYX1ZBUklBQkxFX0xFVkVMID0gNjcsICAvLyBsYXN0IChpbmNsdXNpdmUpIGxldmVsIHdpdGggdmFyaWFibGUgY29zdAogICAgICAgIE1BWF9MRVZFTCA9IDIwNDcgICAgICAgICAgLy8gbWF4IGxldmVsIChub3RlOiBtYXggY29kYWJsZSBpcyAyMDQ3ICsgNjcpCiAgICAgIH07CkBAIC03NCwxMTggKzQ4LDgzIEBACiAgIFJEX09QVF9UUkVMTElTX0FMTCA9IDMgICAvLyB0cmVsbGlzLXF1YW50IGZvciBldmVyeSBzY29yaW5nIChtdWNoIHNsb3dlcikKIH0gVlA4UkRMZXZlbDsKIAotLy8gWVVWLWNhY2hlIHBhcmFtZXRlcnMuIENhY2hlIGlzIDE2LXBpeGVscyB3aWRlLgotLy8gVGhlIG9yaWdpbmFsIG9yIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgVlA4U2NhbltdCisvLyBZVVYtY2FjaGUgcGFyYW1ldGVycy4gQ2FjaGUgaXMgMzItYnl0ZXMgd2lkZSAoPSBvbmUgY2FjaGVsaW5lKS4KKy8vIFRoZSBvcmlnaW5hbCBvciByZWNvbnN0cnVjdGVkIHNhbXBsZXMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIFZQOFNjYW5bXS4KIC8vIFRoZSBwcmVkaWN0ZWQgYmxvY2tzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBvZmZzZXRzIHRvIHl1dl9wXyBhbmQKLS8vIHRoZSBhcnJheXMgVlA4Kk1vZGVPZmZzZXRzW107Ci0vLyAgICAgICAgICstLS0tKyAgICAgIFlVViBTYW1wbGVzIGFyZWEuIFNlZSBWUDhTY2FuW10gZm9yIGFjY2Vzc2luZyB0aGUgYmxvY2tzLgotLy8gIFlfT0ZGICB8WVlZWXwgPC0gb3JpZ2luYWwgc2FtcGxlcyAgKGVuYy0+eXV2X2luXykKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICBVX09GRiAgfFVVVlZ8IFZfT0ZGICAoPVVfT0ZGICsgOCkKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyAgICAgICAgICstLS0tKwotLy8gIFlfT0ZGICB8WVlZWXwgPC0gY29tcHJlc3NlZC9kZWNvZGVkIHNhbXBsZXMgICgneXV2X291dF8nKQotLy8gICAgICAgICB8WVlZWXwgICAgVGhlcmUgYXJlIHR3byBidWZmZXJzIGxpa2UgdGhpcyAoJ3l1dl9vdXRfJy8neXV2X291dDJfJykKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gIFVfT0ZGICB8VVVWVnwgVl9PRkYKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyAgICAgICAgICB4MiAoZm9yIHl1dl9vdXQyXykKLS8vICAgICAgICAgKy0tLS0rICAgICBQcmVkaWN0aW9uIGFyZWEgKCd5dXZfcF8nLCBzaXplID0gUFJFRF9TSVpFKQotLy8gSTE2REMxNiB8WVlZWXwgIEludHJhMTYgcHJlZGljdGlvbnMgKDE2eDE2IGJsb2NrIGVhY2gpCi0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyBJMTZUTTE2IHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gSTE2VkUxNiB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vIEkxNkhFMTYgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgICstLS0tKyAgQ2hyb21hIFUvViBwcmVkaWN0aW9ucyAoMTZ4OCBibG9jayBlYWNoKQotLy8gQzhEQzggICB8VVVWVnwKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyBDOFRNOCAgIHxVVVZWfAotLy8gICAgICAgICB8VVVWVnwKLS8vIEM4VkU4ICAgfFVVVlZ8Ci0vLyAgICAgICAgIHxVVVZWfAotLy8gQzhIRTggICB8VVVWVnwKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyAgICAgICAgICstLS0tKyAgSW50cmEgNHg0IHByZWRpY3Rpb25zICg0eDQgYmxvY2sgZWFjaCkKLS8vICAgICAgICAgfFlZWVl8IEk0REM0IEk0VE00IEk0VkU0IEk0SEU0Ci0vLyAgICAgICAgIHxZWVlZfCBJNFJENCBJNFZSNCBJNExENCBJNFZMNAotLy8gICAgICAgICB8WVkuLnwgSTRIRDQgSTRIVTQgSTRUTVAKLS8vICAgICAgICAgKy0tLS0rCi0jZGVmaW5lIEJQUyAgICAgICAxNiAgIC8vIHRoaXMgaXMgdGhlIGNvbW1vbiBzdHJpZGUKLSNkZWZpbmUgWV9TSVpFICAgKEJQUyAqIDE2KQotI2RlZmluZSBVVl9TSVpFICAoQlBTICogOCkKLSNkZWZpbmUgWVVWX1NJWkUgKFlfU0laRSArIFVWX1NJWkUpCi0jZGVmaW5lIFBSRURfU0laRSAoNiAqIDE2ICogQlBTICsgMTIgKiBCUFMpCi0jZGVmaW5lIFlfT0ZGICAgICgwKQotI2RlZmluZSBVX09GRiAgICAoWV9TSVpFKQotI2RlZmluZSBWX09GRiAgICAoVV9PRkYgKyA4KQotI2RlZmluZSBBTElHTl9DU1QgMTUKLSNkZWZpbmUgRE9fQUxJR04oUFRSKSAoKHVpbnRwdHJfdCkoKFBUUikgKyBBTElHTl9DU1QpICYgfkFMSUdOX0NTVCkKKy8vIHRoZSBhcnJheXMgVlA4Kk1vZGVPZmZzZXRzW10uCisvLyAqIFlVViBTYW1wbGVzIGFyZWEgKHl1dl9pbl8veXV2X291dF8veXV2X291dDJfKQorLy8gICAoc2VlIFZQOFNjYW5bXSBmb3IgYWNjZXNzaW5nIHRoZSBibG9ja3MsIGFsb25nIHdpdGgKKy8vICAgWV9PRkZfRU5DL1VfT0ZGX0VOQy9WX09GRl9FTkMpOgorLy8gICAgICAgICAgICAgKy0tLS0rLS0tLSsKKy8vICBZX09GRl9FTkMgIHxZWVlZfFVVVlZ8CisvLyAgVV9PRkZfRU5DICB8WVlZWXxVVVZWfAorLy8gIFZfT0ZGX0VOQyAgfFlZWVl8Li4uLnwgPC0gMjUlIHdhc3RlZCBVL1YgYXJlYQorLy8gICAgICAgICAgICAgfFlZWVl8Li4uLnwKKy8vICAgICAgICAgICAgICstLS0tKy0tLS0rCisvLyAqIFByZWRpY3Rpb24gYXJlYSAoJ3l1dl9wXycsIHNpemUgPSBQUkVEX1NJWkVfRU5DKQorLy8gICBJbnRyYTE2IHByZWRpY3Rpb25zICgxNngxNiBibG9jayBlYWNoLCB0d28gcGVyIHJvdyk6CisvLyAgICAgICAgIHxJMTZEQzE2fEkxNlRNMTZ8CisvLyAgICAgICAgIHxJMTZWRTE2fEkxNkhFMTZ8CisvLyAgIENocm9tYSBVL1YgcHJlZGljdGlvbnMgKDE2eDggYmxvY2sgZWFjaCwgdHdvIHBlciByb3cpOgorLy8gICAgICAgICB8QzhEQzh8QzhUTTh8CisvLyAgICAgICAgIHxDOFZFOHxDOEhFOHwKKy8vICAgSW50cmEgNHg0IHByZWRpY3Rpb25zICg0eDQgYmxvY2sgZWFjaCkKKy8vICAgICAgICAgfEk0REM0IEk0VE00IEk0VkU0IEk0SEU0fEk0UkQ0IEk0VlI0IEk0TEQ0IEk0Vkw0fAorLy8gICAgICAgICB8STRIRDQgSTRIVTQgSTRUTVAgLi4uLi58Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi58IDwtIH4zMSUgd2FzdGVkCisjZGVmaW5lIFlVVl9TSVpFX0VOQyAoQlBTICogMTYpCisjZGVmaW5lIFBSRURfU0laRV9FTkMgKDMyICogQlBTICsgMTYgKiBCUFMgKyA4ICogQlBTKSAgIC8vIEkxNitDaHJvbWErSTQgcHJlZHMKKyNkZWZpbmUgWV9PRkZfRU5DICAgICgwKQorI2RlZmluZSBVX09GRl9FTkMgICAgKDE2KQorI2RlZmluZSBWX09GRl9FTkMgICAgKDE2ICsgOCkKIAotZXh0ZXJuIGNvbnN0IGludCBWUDhTY2FuWzE2ICsgNCArIDRdOyAgICAgICAgICAgLy8gaW4gcXVhbnQuYwotZXh0ZXJuIGNvbnN0IGludCBWUDhVVk1vZGVPZmZzZXRzWzRdOyAgICAgICAgICAgLy8gaW4gYW5hbHl6ZS5jCi1leHRlcm4gY29uc3QgaW50IFZQOEkxNk1vZGVPZmZzZXRzWzRdOwotZXh0ZXJuIGNvbnN0IGludCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOFNjYW5bMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOFVWTW9kZU9mZnNldHNbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4STE2TW9kZU9mZnNldHNbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4STRNb2RlT2Zmc2V0c1tOVU1fQk1PREVTXTsKIAogLy8gTGF5b3V0IG9mIHByZWRpY3Rpb24gYmxvY2tzCiAvLyBpbnRyYSAxNngxNgogI2RlZmluZSBJMTZEQzE2ICgwICogMTYgKiBCUFMpCi0jZGVmaW5lIEkxNlRNMTYgKDEgKiAxNiAqIEJQUykKLSNkZWZpbmUgSTE2VkUxNiAoMiAqIDE2ICogQlBTKQotI2RlZmluZSBJMTZIRTE2ICgzICogMTYgKiBCUFMpCisjZGVmaW5lIEkxNlRNMTYgKEkxNkRDMTYgKyAxNikKKyNkZWZpbmUgSTE2VkUxNiAoMSAqIDE2ICogQlBTKQorI2RlZmluZSBJMTZIRTE2IChJMTZWRTE2ICsgMTYpCiAvLyBjaHJvbWEgOHg4LCB0d28gVS9WIGJsb2NrcyBzaWRlIGJ5IHNpZGUgKGhlbmNlOiAxNng4IGVhY2gpCi0jZGVmaW5lIEM4REM4ICg0ICogMTYgKiBCUFMpCi0jZGVmaW5lIEM4VE04ICg0ICogMTYgKiBCUFMgKyA4ICogQlBTKQotI2RlZmluZSBDOFZFOCAoNSAqIDE2ICogQlBTKQotI2RlZmluZSBDOEhFOCAoNSAqIDE2ICogQlBTICsgOCAqIEJQUykKKyNkZWZpbmUgQzhEQzggKDIgKiAxNiAqIEJQUykKKyNkZWZpbmUgQzhUTTggKEM4REM4ICsgMSAqIDE2KQorI2RlZmluZSBDOFZFOCAoMiAqIDE2ICogQlBTICsgOCAqIEJQUykKKyNkZWZpbmUgQzhIRTggKEM4VkU4ICsgMSAqIDE2KQogLy8gaW50cmEgNHg0Ci0jZGVmaW5lIEk0REM0ICg2ICogMTYgKiBCUFMgKyAgMCkKLSNkZWZpbmUgSTRUTTQgKDYgKiAxNiAqIEJQUyArICA0KQotI2RlZmluZSBJNFZFNCAoNiAqIDE2ICogQlBTICsgIDgpCi0jZGVmaW5lIEk0SEU0ICg2ICogMTYgKiBCUFMgKyAxMikKLSNkZWZpbmUgSTRSRDQgKDYgKiAxNiAqIEJQUyArIDQgKiBCUFMgKyAgMCkKLSNkZWZpbmUgSTRWUjQgKDYgKiAxNiAqIEJQUyArIDQgKiBCUFMgKyAgNCkKLSNkZWZpbmUgSTRMRDQgKDYgKiAxNiAqIEJQUyArIDQgKiBCUFMgKyAgOCkKLSNkZWZpbmUgSTRWTDQgKDYgKiAxNiAqIEJQUyArIDQgKiBCUFMgKyAxMikKLSNkZWZpbmUgSTRIRDQgKDYgKiAxNiAqIEJQUyArIDggKiBCUFMgKyAgMCkKLSNkZWZpbmUgSTRIVTQgKDYgKiAxNiAqIEJQUyArIDggKiBCUFMgKyAgNCkKLSNkZWZpbmUgSTRUTVAgKDYgKiAxNiAqIEJQUyArIDggKiBCUFMgKyAgOCkKKyNkZWZpbmUgSTREQzQgKDMgKiAxNiAqIEJQUyArICAwKQorI2RlZmluZSBJNFRNNCAoSTREQzQgKyAgNCkKKyNkZWZpbmUgSTRWRTQgKEk0REM0ICsgIDgpCisjZGVmaW5lIEk0SEU0IChJNERDNCArIDEyKQorI2RlZmluZSBJNFJENCAoSTREQzQgKyAxNikKKyNkZWZpbmUgSTRWUjQgKEk0REM0ICsgMjApCisjZGVmaW5lIEk0TEQ0IChJNERDNCArIDI0KQorI2RlZmluZSBJNFZMNCAoSTREQzQgKyAyOCkKKyNkZWZpbmUgSTRIRDQgKDMgKiAxNiAqIEJQUyArIDQgKiBCUFMpCisjZGVmaW5lIEk0SFU0IChJNEhENCArIDQpCisjZGVmaW5lIEk0VE1QIChJNEhENCArIDgpCiAKIHR5cGVkZWYgaW50NjRfdCBzY29yZV90OyAgICAgLy8gdHlwZSB1c2VkIGZvciBzY29yZXMsIHJhdGUsIGRpc3RvcnRpb24KKy8vIE5vdGUgdGhhdCBNQVhfQ09TVCBpcyBub3QgdGhlIG1heGltdW0gYWxsb3dlZCBieSBzaXplb2Yoc2NvcmVfdCksCisvLyBpbiBvcmRlciB0byBhbGxvdyBvdmVyZmxvd2luZyBjb21wdXRhdGlvbnMuCiAjZGVmaW5lIE1BWF9DT1NUICgoc2NvcmVfdCkweDdmZmZmZmZmZmZmZmZmTEwpCiAKICNkZWZpbmUgUUZJWCAxNwogI2RlZmluZSBCSUFTKGIpICAoKGIpIDw8IChRRklYIC0gOCkpCiAvLyBGdW4gZmFjdDogdGhpcyBpcyB0aGUgX29ubHlfIGxpbmUgd2hlcmUgd2UncmUgYWN0dWFsbHkgYmVpbmcgbG9zc3kgYW5kCiAvLyBkaXNjYXJkaW5nIGJpdHMuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFFVQU5URElWKGludCBuLCBpbnQgaVEsIGludCBCKSB7Ci0gIHJldHVybiAobiAqIGlRICsgQikgPj4gUUZJWDsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUVVBTlRESVYodWludDMyX3QgbiwgdWludDMyX3QgaVEsIHVpbnQzMl90IEIpIHsKKyAgcmV0dXJuIChpbnQpKChuICogaVEgKyBCKSA+PiBRRklYKTsKIH0KIAotLy8gc2l6ZSBvZiBoaXN0b2dyYW0gdXNlZCBieSBDb2xsZWN0SGlzdG9ncmFtLgotI2RlZmluZSBNQVhfQ09FRkZfVEhSRVNIICAgMzEKLXR5cGVkZWYgc3RydWN0IFZQOEhpc3RvZ3JhbSBWUDhIaXN0b2dyYW07Ci1zdHJ1Y3QgVlA4SGlzdG9ncmFtIHsKLSAgLy8gVE9ETyhza2FsKTogd2Ugb25seSBuZWVkIHRvIHN0b3JlIHRoZSBtYXhfdmFsdWUgYW5kIGxhc3Rfbm9uX3plcm8gYWN0dWFsbHkuCi0gIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdOwotfTsKLQogLy8gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gcmVtb3ZlIHRva2VuLWJ1ZmZlciBjb2RlOgogLy8gI2RlZmluZSBESVNBQkxFX1RPS0VOX0JVRkZFUgogCisvLyBxdWFsaXR5IGJlbG93IHdoaWNoIGVycm9yLWRpZmZ1c2lvbiBpcyBlbmFibGVkCisjZGVmaW5lIEVSUk9SX0RJRkZVU0lPTl9RVUFMSVRZIDk4CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBIZWFkZXJzCiAKQEAgLTE5Myw2ICsxMzIsOCBAQAogdHlwZWRlZiB1aW50OF90IFByb2JhQXJyYXlbTlVNX0NUWF1bTlVNX1BST0JBU107CiB0eXBlZGVmIHByb2JhX3QgU3RhdHNBcnJheVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKIHR5cGVkZWYgdWludDE2X3QgQ29zdEFycmF5W05VTV9DVFhdW01BWF9WQVJJQUJMRV9MRVZFTCArIDFdOwordHlwZWRlZiBjb25zdCB1aW50MTZfdCogKCpDb3N0QXJyYXlQdHIpW05VTV9DVFhdOyAgIC8vIGZvciBlYXN5IGNhc3RpbmcKK3R5cGVkZWYgY29uc3QgdWludDE2X3QqIENvc3RBcnJheU1hcFsxNl1bTlVNX0NUWF07CiB0eXBlZGVmIGRvdWJsZSBMRlN0YXRzW05VTV9NQl9TRUdNRU5UU11bTUFYX0xGX0xFVkVMU107ICAvLyBmaWx0ZXIgc3RhdHMKIAogdHlwZWRlZiBzdHJ1Y3QgVlA4RW5jb2RlciBWUDhFbmNvZGVyOwpAQCAtMjAzLDE5ICsxNDQsMjAgQEAKICAgaW50IHVwZGF0ZV9tYXBfOyAgICAgICAgLy8gd2hldGhlciB0byB1cGRhdGUgdGhlIHNlZ21lbnQgbWFwIG9yIG5vdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwIGlmIHRoZXJlJ3Mgb25seSAxIHNlZ21lbnQuCiAgIGludCBzaXplXzsgICAgICAgICAgICAgIC8vIGJpdC1jb3N0IGZvciB0cmFuc21pdHRpbmcgdGhlIHNlZ21lbnQgbWFwCi19IFZQOFNlZ21lbnRIZWFkZXI7Cit9IFZQOEVuY1NlZ21lbnRIZWFkZXI7CiAKIC8vIFN0cnVjdCBjb2xsZWN0aW5nIGFsbCBmcmFtZS1wZXJzaXN0ZW50IHByb2JhYmlsaXRpZXMuCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHVpbnQ4X3Qgc2VnbWVudHNfWzNdOyAgICAgLy8gcHJvYmFiaWxpdGllcyBmb3Igc2VnbWVudCB0cmVlCiAgIHVpbnQ4X3Qgc2tpcF9wcm9iYV87ICAgICAgLy8gZmluYWwgcHJvYmFiaWxpdHkgb2YgYmVpbmcgc2tpcHBlZC4KLSAgUHJvYmFBcnJheSBjb2VmZnNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAvLyA5MjQgYnl0ZXMKKyAgUHJvYmFBcnJheSBjb2VmZnNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAvLyAxMDU2IGJ5dGVzCiAgIFN0YXRzQXJyYXkgc3RhdHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAgLy8gNDIyNCBieXRlcwotICBDb3N0QXJyYXkgbGV2ZWxfY29zdF9bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgIC8vIDExLjRrCisgIENvc3RBcnJheSBsZXZlbF9jb3N0X1tOVU1fVFlQRVNdW05VTV9CQU5EU107ICAgLy8gMTMwNTYgYnl0ZXMKKyAgQ29zdEFycmF5TWFwIHJlbWFwcGVkX2Nvc3RzX1tOVU1fVFlQRVNdOyAgICAgICAvLyAxNTM2IGJ5dGVzCiAgIGludCBkaXJ0eV87ICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgbmVlZCB0byBjYWxsIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoKQogICBpbnQgdXNlX3NraXBfcHJvYmFfOyAgICAgIC8vIE5vdGU6IHdlIGFsd2F5cyB1c2Ugc2tpcF9wcm9iYSBmb3Igbm93LgogICBpbnQgbmJfc2tpcF87ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBza2lwcGVkIGJsb2NrcwotfSBWUDhQcm9iYTsKK30gVlA4RW5jUHJvYmE7CiAKIC8vIEZpbHRlciBwYXJhbWV0ZXJzLiBOb3QgYWN0dWFsbHkgdXNlZCBpbiB0aGUgY29kZSAod2UgZG9uJ3QgcGVyZm9ybQogLy8gdGhlIGluLWxvb3AgZmlsdGVyaW5nKSwgYnV0IGZpbGxlZCBmcm9tIHVzZXIncyBjb25maWcKQEAgLTIyNCw3ICsxNjYsNyBAQAogICBpbnQgbGV2ZWxfOyAgICAgICAgICAgICAgLy8gYmFzZSBmaWx0ZXIgbGV2ZWwgWzAuLjYzXQogICBpbnQgc2hhcnBuZXNzXzsgICAgICAgICAgLy8gWzAuLjddCiAgIGludCBpNHg0X2xmX2RlbHRhXzsgICAgICAvLyBkZWx0YSBmaWx0ZXIgbGV2ZWwgZm9yIGk0eDQgcmVsYXRpdmUgdG8gaTE2eDE2Ci19IFZQOEZpbHRlckhlYWRlcjsKK30gVlA4RW5jRmlsdGVySGVhZGVyOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSW5mb3JtYXRpb25zIGFib3V0IHRoZSBtYWNyb2Jsb2Nrcy4KQEAgLTI0MSw4ICsxODMsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgVlA4TWF0cml4IHsKICAgdWludDE2X3QgcV9bMTZdOyAgICAgICAgLy8gcXVhbnRpemVyIHN0ZXBzCiAgIHVpbnQxNl90IGlxX1sxNl07ICAgICAgIC8vIHJlY2lwcm9jYWxzLCBmaXhlZCBwb2ludC4KLSAgdWludDE2X3QgYmlhc19bMTZdOyAgICAgLy8gcm91bmRpbmcgYmlhcwotICB1aW50MTZfdCB6dGhyZXNoX1sxNl07ICAvLyB2YWx1ZSB1bmRlciB3aGljaCBhIGNvZWZmaWNpZW50IGlzIHplcm9lZAorICB1aW50MzJfdCBiaWFzX1sxNl07ICAgICAvLyByb3VuZGluZyBiaWFzCisgIHVpbnQzMl90IHp0aHJlc2hfWzE2XTsgIC8vIHZhbHVlIGJlbG93IHdoaWNoIGEgY29lZmZpY2llbnQgaXMgemVyb2VkCiAgIHVpbnQxNl90IHNoYXJwZW5fWzE2XTsgIC8vIGZyZXF1ZW5jeSBib29zdGVycyBmb3Igc2xpZ2h0IHNoYXJwZW5pbmcKIH0gVlA4TWF0cml4OwogCkBAIC0yNTMsMTYgKzE5NSwyNCBAQAogICBpbnQgYmV0YV87ICAgICAgIC8vIGZpbHRlci1zdXNjZXB0aWJpbGl0eSwgcmFuZ2UgWzAsMjU1XS4KICAgaW50IHF1YW50XzsgICAgICAvLyBmaW5hbCBzZWdtZW50IHF1YW50aXplci4KICAgaW50IGZzdHJlbmd0aF87ICAvLyBmaW5hbCBpbi1sb29wIGZpbHRlcmluZyBzdHJlbmd0aAorICBpbnQgbWF4X2VkZ2VfOyAgIC8vIG1heCBlZGdlIGRlbHRhIChmb3IgZmlsdGVyaW5nIHN0cmVuZ3RoKQorICBpbnQgbWluX2Rpc3RvXzsgIC8vIG1pbmltdW0gZGlzdG9ydGlvbiByZXF1aXJlZCB0byB0cmlnZ2VyIGZpbHRlcmluZyByZWNvcmQKICAgLy8gcmVhY3Rpdml0aWVzCiAgIGludCBsYW1iZGFfaTE2XywgbGFtYmRhX2k0XywgbGFtYmRhX3V2XzsKICAgaW50IGxhbWJkYV9tb2RlXywgbGFtYmRhX3RyZWxsaXNfLCB0bGFtYmRhXzsKICAgaW50IGxhbWJkYV90cmVsbGlzX2kxNl8sIGxhbWJkYV90cmVsbGlzX2k0XywgbGFtYmRhX3RyZWxsaXNfdXZfOworCisgIC8vIGxhbWJkYSB2YWx1ZXMgZm9yIGRpc3RvcnRpb24tYmFzZWQgZXZhbHVhdGlvbgorICBzY29yZV90IGk0X3BlbmFsdHlfOyAgIC8vIHBlbmFsdHkgZm9yIHVzaW5nIEludHJhNAogfSBWUDhTZWdtZW50SW5mbzsKIAotLy8gSGFuZHkgdHJhbnNjaWVudCBzdHJ1Y3QgdG8gYWNjdW11bGF0ZSBzY29yZSBhbmQgaW5mbyBkdXJpbmcgUkQtb3B0aW1pemF0aW9uCit0eXBlZGVmIGludDhfdCBERXJyb3JbMiAvKiB1L3YgKi9dWzIgLyogdG9wIG9yIGxlZnQgKi9dOworCisvLyBIYW5keSB0cmFuc2llbnQgc3RydWN0IHRvIGFjY3VtdWxhdGUgc2NvcmUgYW5kIGluZm8gZHVyaW5nIFJELW9wdGltaXphdGlvbgogLy8gYW5kIG1vZGUgZXZhbHVhdGlvbi4KIHR5cGVkZWYgc3RydWN0IHsKLSAgc2NvcmVfdCBELCBTRCwgUiwgc2NvcmU7ICAgIC8vIERpc3RvcnRpb24sIHNwZWN0cmFsIGRpc3RvcnRpb24sIHJhdGUsIHNjb3JlLgorICBzY29yZV90IEQsIFNEOyAgICAgICAgICAgICAgLy8gRGlzdG9ydGlvbiwgc3BlY3RyYWwgZGlzdG9ydGlvbgorICBzY29yZV90IEgsIFIsIHNjb3JlOyAgICAgICAgLy8gaGVhZGVyIGJpdHMsIHJhdGUsIHNjb3JlLgogICBpbnQxNl90IHlfZGNfbGV2ZWxzWzE2XTsgICAgLy8gUXVhbnRpemVkIGxldmVscyBmb3IgbHVtYS1EQywgbHVtYS1BQywgY2hyb21hLgogICBpbnQxNl90IHlfYWNfbGV2ZWxzWzE2XVsxNl07CiAgIGludDE2X3QgdXZfbGV2ZWxzWzQgKyA0XVsxNl07CkBAIC0yNzAsMTggKzIyMCwxNyBAQAogICB1aW50OF90IG1vZGVzX2k0WzE2XTsgICAgICAgLy8gbW9kZSBudW1iZXJzIGZvciBpbnRyYTQgcHJlZGljdGlvbnMKICAgaW50IG1vZGVfdXY7ICAgICAgICAgICAgICAgIC8vIG1vZGUgbnVtYmVyIG9mIGNocm9tYSBwcmVkaWN0aW9uCiAgIHVpbnQzMl90IG56OyAgICAgICAgICAgICAgICAvLyBub24temVybyBibG9ja3MKKyAgaW50OF90IGRlcnJbMl1bM107ICAgICAgICAgIC8vIERDIGRpZmZ1c2lvbiBlcnJvcnMgZm9yIFUvViBmb3IgYmxvY2tzICMxLzIvMwogfSBWUDhNb2RlU2NvcmU7CiAKIC8vIEl0ZXJhdG9yIHN0cnVjdHVyZSB0byBpdGVyYXRlIHRocm91Z2ggbWFjcm9ibG9ja3MsIHBvaW50aW5nIHRvIHRoZQogLy8gcmlnaHQgbmVpZ2hib3VyaW5nIGRhdGEgKHNhbXBsZXMsIHByZWRpY3Rpb25zLCBjb250ZXh0cywgLi4uKQogdHlwZWRlZiBzdHJ1Y3QgewogICBpbnQgeF8sIHlfOyAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hY3JvYmxvY2sKLSAgaW50IHlfb2Zmc2V0XywgdXZfb2Zmc2V0XzsgICAgICAgLy8gb2Zmc2V0IHRvIHRoZSBsdW1hIC8gY2hyb21hIHBsYW5lcwotICBpbnQgeV9zdHJpZGVfLCB1dl9zdHJpZGVfOyAgICAgICAvLyByZXNwZWN0aXZlIHN0cmlkZXMKLSAgdWludDhfdCogICAgICB5dXZfaW5fOyAgICAgICAgICAgLy8gYm9ycm93ZWQgZnJvbSBlbmNfIChmb3Igbm93KQotICB1aW50OF90KiAgICAgIHl1dl9vdXRfOyAgICAgICAgICAvLyAnJwotICB1aW50OF90KiAgICAgIHl1dl9vdXQyXzsgICAgICAgICAvLyAnJwotICB1aW50OF90KiAgICAgIHl1dl9wXzsgICAgICAgICAgICAvLyAnJworICB1aW50OF90KiAgICAgIHl1dl9pbl87ICAgICAgICAgICAvLyBpbnB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dF87ICAgICAgICAgIC8vIG91dHB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dDJfOyAgICAgICAgIC8vIHNlY29uZGFyeSBidWZmZXIgc3dhcHBlZCB3aXRoIHl1dl9vdXRfLgorICB1aW50OF90KiAgICAgIHl1dl9wXzsgICAgICAgICAgICAvLyBzY3JhdGNoIGJ1ZmZlciBmb3IgcHJlZGljdGlvbgogICBWUDhFbmNvZGVyKiAgIGVuY187ICAgICAgICAgICAgICAvLyBiYWNrLXBvaW50ZXIKICAgVlA4TUJJbmZvKiAgICBtYl87ICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYWNyb2Jsb2NrCiAgIFZQOEJpdFdyaXRlciogYndfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYml0LXdyaXRlcgpAQCAtMjk3LDI0ICsyNDYsNDcgQEAKICAgdWludDY0X3QgICAgICB1dl9iaXRzXzsgICAgICAgICAgLy8gbWFjcm9ibG9jayBiaXQtY29zdCBmb3IgY2hyb21hCiAgIExGU3RhdHMqICAgICAgbGZfc3RhdHNfOyAgICAgICAgIC8vIGZpbHRlciBzdGF0cyAoYm9ycm93ZWQgZnJvbSBlbmNfKQogICBpbnQgICAgICAgICAgIGRvX3RyZWxsaXNfOyAgICAgICAvLyBpZiB0cnVlLCBwZXJmb3JtIGV4dHJhIGxldmVsIG9wdGltaXNhdGlvbgotICBpbnQgICAgICAgICAgIGRvbmVfOyAgICAgICAgICAgICAvLyB0cnVlIHdoZW4gc2NhbiBpcyBmaW5pc2hlZAorICBpbnQgICAgICAgICAgIGNvdW50X2Rvd25fOyAgICAgICAvLyBudW1iZXIgb2YgbWIgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkCisgIGludCAgICAgICAgICAgY291bnRfZG93bjBfOyAgICAgIC8vIHN0YXJ0aW5nIGNvdW50ZXIgdmFsdWUgKGZvciBwcm9ncmVzcykKICAgaW50ICAgICAgICAgICBwZXJjZW50MF87ICAgICAgICAgLy8gc2F2ZWQgaW5pdGlhbCBwcm9ncmVzcyBwZXJjZW50CisKKyAgREVycm9yICAgICAgICBsZWZ0X2RlcnJfOyAgICAgICAgLy8gbGVmdCBlcnJvciBkaWZmdXNpb24gKHUvdikKKyAgREVycm9yICAgICAgICp0b3BfZGVycl87ICAgICAgICAgLy8gdG9wIGRpZmZ1c2lvbiBlcnJvciAtIE5VTEwgaWYgZGlzYWJsZWQKKworICB1aW50OF90KiB5X2xlZnRfOyAgICAvLyBsZWZ0IGx1bWEgc2FtcGxlcyAoYWRkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byAxNSkuCisgIHVpbnQ4X3QqIHVfbGVmdF87ICAgIC8vIGxlZnQgdSBzYW1wbGVzIChhZGRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCisgIHVpbnQ4X3QqIHZfbGVmdF87ICAgIC8vIGxlZnQgdiBzYW1wbGVzIChhZGRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCisKKyAgdWludDhfdCogeV90b3BfOyAgICAgLy8gdG9wIGx1bWEgc2FtcGxlcyBhdCBwb3NpdGlvbiAneF8nCisgIHVpbnQ4X3QqIHV2X3RvcF87ICAgIC8vIHRvcCB1L3Ygc2FtcGxlcyBhdCBwb3NpdGlvbiAneF8nLCBwYWNrZWQgYXMgMTYgYnl0ZXMKKworICAvLyBtZW1vcnkgZm9yIHN0b3JpbmcgeS91L3ZfbGVmdF8KKyAgdWludDhfdCB5dXZfbGVmdF9tZW1fWzE3ICsgMTYgKyAxNiArIDggKyBXRUJQX0FMSUdOX0NTVF07CisgIC8vIG1lbW9yeSBmb3IgeXV2XyoKKyAgdWludDhfdCB5dXZfbWVtX1szICogWVVWX1NJWkVfRU5DICsgUFJFRF9TSVpFX0VOQyArIFdFQlBfQUxJR05fQ1NUXTsKIH0gVlA4RW5jSXRlcmF0b3I7CiAKICAgLy8gaW4gaXRlcmF0b3IuYwotLy8gbXVzdCBiZSBjYWxsZWQgZmlyc3QuCisvLyBtdXN0IGJlIGNhbGxlZCBmaXJzdAogdm9pZCBWUDhJdGVyYXRvckluaXQoVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwotLy8gcmVzdGFydCBhIHNjYW4uCisvLyByZXN0YXJ0IGEgc2Nhbgogdm9pZCBWUDhJdGVyYXRvclJlc2V0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci0vLyBpbXBvcnQgc2FtcGxlcyBmcm9tIHNvdXJjZQotdm9pZCBWUDhJdGVyYXRvckltcG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gcmVzZXQgaXRlcmF0b3IgcG9zaXRpb24gdG8gcm93ICd5Jwordm9pZCBWUDhJdGVyYXRvclNldFJvdyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCB5KTsKKy8vIHNldCBjb3VudCBkb3duICg9bnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gZ28pCit2b2lkIFZQOEl0ZXJhdG9yU2V0Q291bnREb3duKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGNvdW50X2Rvd24pOworLy8gcmV0dXJuIHRydWUgaWYgaXRlcmF0aW9uIGlzIGZpbmlzaGVkCitpbnQgVlA4SXRlcmF0b3JJc0RvbmUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKy8vIEltcG9ydCB1bmNvbXByZXNzZWQgc2FtcGxlcyBmcm9tIHNvdXJjZS4KKy8vIElmIHRtcF8zMiBpcyBub3QgTlVMTCwgaW1wb3J0IGJvdW5kYXJ5IHNhbXBsZXMgdG9vLgorLy8gdG1wXzMyIGlzIGEgMzItYnl0ZXMgc2NyYXRjaCBidWZmZXIgdGhhdCBtdXN0IGJlIGFsaWduZWQgaW4gbWVtb3J5Lgordm9pZCBWUDhJdGVyYXRvckltcG9ydChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIHVpbnQ4X3QqIHRtcF8zMik7CiAvLyBleHBvcnQgZGVjaW1hdGVkIHNhbXBsZXMKIHZvaWQgVlA4SXRlcmF0b3JFeHBvcnQoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIGdvIHRvIG5leHQgbWFjcm9ibG9jay4gUmV0dXJucyAhZG9uZV8uIElmICpibG9ja190b19zYXZlIGlzIG5vbi1udWxsLCB3aWxsCi0vLyBzYXZlIHRoZSBib3VuZGFyeSB2YWx1ZXMgdG8gdG9wXy9sZWZ0XyBhcnJheXMuIGJsb2NrX3RvX3NhdmUgY2FuIGJlCi0vLyBpdC0+eXV2X291dF8gb3IgaXQtPnl1dl9pbl8uCi1pbnQgVlA4SXRlcmF0b3JOZXh0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYmxvY2tfdG9fc2F2ZSk7CisvLyBnbyB0byBuZXh0IG1hY3JvYmxvY2suIFJldHVybnMgZmFsc2UgaWYgbm90IGZpbmlzaGVkLgoraW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gc2F2ZSB0aGUgeXV2X291dF8gYm91bmRhcnkgdmFsdWVzIHRvIHRvcF8vbGVmdF8gYXJyYXlzIGZvciBuZXh0IGl0ZXJhdGlvbnMuCit2b2lkIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CiAvLyBSZXBvcnQgcHJvZ3Jlc3Npb24gYmFzZWQgb24gbWFjcm9ibG9jayByb3dzLiBSZXR1cm4gMCBmb3IgdXNlci1hYm9ydCByZXF1ZXN0LgogaW50IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbmFsX2RlbHRhX3BlcmNlbnQpOwpAQCAtMzQ1LDEyICszMTcsMTQgQEAKICAgVlA4VG9rZW5zKiBwYWdlc187ICAgICAgICAvLyBmaXJzdCBwYWdlCiAgIFZQOFRva2VucyoqIGxhc3RfcGFnZV87ICAgLy8gbGFzdCBwYWdlCiAgIHVpbnQxNl90KiB0b2tlbnNfOyAgICAgICAgLy8gc2V0IHRvICgqbGFzdF9wYWdlXyktPnRva2Vuc18KLSAgaW50IGxlZnRfOyAgICAgICAgICAvLyBob3cgbWFueSBmcmVlIHRva2VucyBsZWZ0IGJlZm9yZSB0aGUgcGFnZSBpcyBmdWxsLgorICBpbnQgbGVmdF87ICAgICAgICAgICAgICAgIC8vIGhvdyBtYW55IGZyZWUgdG9rZW5zIGxlZnQgYmVmb3JlIHRoZSBwYWdlIGlzIGZ1bGwKKyAgaW50IHBhZ2Vfc2l6ZV87ICAgICAgICAgICAvLyBudW1iZXIgb2YgdG9rZW5zIHBlciBwYWdlCiAjZW5kaWYKICAgaW50IGVycm9yXzsgICAgICAgICAvLyB0cnVlIGluIGNhc2Ugb2YgbWFsbG9jIGVycm9yCiB9IFZQOFRCdWZmZXI7CiAKLXZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYik7ICAgIC8vIGluaXRpYWxpemUgYW4gZW1wdHkgYnVmZmVyCisvLyBpbml0aWFsaXplIGFuIGVtcHR5IGJ1ZmZlcgordm9pZCBWUDhUQnVmZmVySW5pdChWUDhUQnVmZmVyKiBjb25zdCBiLCBpbnQgcGFnZV9zaXplKTsKIHZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpOyAgIC8vIGRlLWFsbG9jYXRlIHBhZ2VzIG1lbW9yeQogCiAjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCkBAIC0zNjEsMTIgKzMzNSwxMSBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzLCBpbnQgZmluYWxfcGFzcyk7CiAKIC8vIHJlY29yZCB0aGUgY29kaW5nIG9mIGNvZWZmaWNpZW50cyB3aXRob3V0IGtub3dpbmcgdGhlIHByb2JhYmlsaXRpZXMgeWV0Ci1pbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgaW50IGNvZWZmX3R5cGUsIGludCBmaXJzdCwgaW50IGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAoraW50IFZQOFJlY29yZENvZWZmVG9rZW5zKGludCBjdHgsIGNvbnN0IHN0cnVjdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2Vucyk7CiAKLS8vIHVudXNlZCBmb3Igbm93Ci12b2lkIFZQOFRva2VuVG9TdGF0cyhjb25zdCBWUDhUQnVmZmVyKiBjb25zdCBiLCBwcm9iYV90KiBjb25zdCBzdGF0cyk7CisvLyBFc3RpbWF0ZSB0aGUgZmluYWwgY29kZWQgc2l6ZSBnaXZlbiBhIHNldCBvZiAncHJvYmFzJy4KK3NpemVfdCBWUDhFc3RpbWF0ZVRva2VuU2l6ZShWUDhUQnVmZmVyKiBjb25zdCBiLCBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMpOwogCiAjZW5kaWYgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgogCkBAIC0zNzgsOCArMzUxLDggQEAKICAgV2ViUFBpY3R1cmUqIHBpY187ICAgICAgICAgICAgLy8gaW5wdXQgLyBvdXRwdXQgcGljdHVyZQogCiAgIC8vIGhlYWRlcnMKLSAgVlA4RmlsdGVySGVhZGVyICAgZmlsdGVyX2hkcl87ICAgICAvLyBmaWx0ZXJpbmcgaW5mb3JtYXRpb24KLSAgVlA4U2VnbWVudEhlYWRlciAgc2VnbWVudF9oZHJfOyAgICAvLyBzZWdtZW50IGluZm9ybWF0aW9uCisgIFZQOEVuY0ZpbHRlckhlYWRlciAgIGZpbHRlcl9oZHJfOyAgICAgLy8gZmlsdGVyaW5nIGluZm9ybWF0aW9uCisgIFZQOEVuY1NlZ21lbnRIZWFkZXIgIHNlZ21lbnRfaGRyXzsgICAgLy8gc2VnbWVudCBpbmZvcm1hdGlvbgogCiAgIGludCBwcm9maWxlXzsgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4J3MgcHJvZmlsZSwgZGVkdWNlZCBmcm9tIENvbmZpZy4KIApAQCAtNDAzLDEyICszNzYsNiBAQAogICB1aW50MzJfdCBhbHBoYV9kYXRhX3NpemVfOwogICBXZWJQV29ya2VyIGFscGhhX3dvcmtlcl87CiAKLSAgLy8gZW5oYW5jZW1lbnQgbGF5ZXIKLSAgaW50IHVzZV9sYXllcl87Ci0gIFZQOEJpdFdyaXRlciBsYXllcl9id187Ci0gIHVpbnQ4X3QqIGxheWVyX2RhdGFfOwotICBzaXplX3QgbGF5ZXJfZGF0YV9zaXplXzsKLQogICAvLyBxdWFudGl6YXRpb24gaW5mbyAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKICAgVlA4U2VnbWVudEluZm8gZHFtX1tOVU1fTUJfU0VHTUVOVFNdOwogICBpbnQgYmFzZV9xdWFudF87ICAgICAgICAgICAgICAgICAvLyBub21pbmFsIHF1YW50aXplciB2YWx1ZS4gT25seSB1c2VkCkBAIC00MjEsMTcgKzM4OCwxOCBAQAogICBpbnQgZHFfdXZfZGNfLCBkcV91dl9hY187CiAKICAgLy8gcHJvYmFiaWxpdGllcyBhbmQgc3RhdGlzdGljcwotICBWUDhQcm9iYSBwcm9iYV87Ci0gIHVpbnQ2NF90IHNzZV9bNF07ICAgICAgICAvLyBzdW0gb2YgWS9VL1YvQSBzcXVhcmVkIGVycm9ycyBmb3IgYWxsIG1hY3JvYmxvY2tzCi0gIHVpbnQ2NF90IHNzZV9jb3VudF87ICAgICAvLyBwaXhlbCBjb3VudCBmb3IgdGhlIHNzZV9bXSBzdGF0cwotICBpbnQgICAgICBjb2RlZF9zaXplXzsKLSAgaW50ICAgICAgcmVzaWR1YWxfYnl0ZXNfWzNdWzRdOwotICBpbnQgICAgICBibG9ja19jb3VudF9bM107CisgIFZQOEVuY1Byb2JhIHByb2JhXzsKKyAgdWludDY0X3QgICAgc3NlX1s0XTsgICAgICAvLyBzdW0gb2YgWS9VL1YvQSBzcXVhcmVkIGVycm9ycyBmb3IgYWxsIG1hY3JvYmxvY2tzCisgIHVpbnQ2NF90ICAgIHNzZV9jb3VudF87ICAgLy8gcGl4ZWwgY291bnQgZm9yIHRoZSBzc2VfW10gc3RhdHMKKyAgaW50ICAgICAgICAgY29kZWRfc2l6ZV87CisgIGludCAgICAgICAgIHJlc2lkdWFsX2J5dGVzX1szXVs0XTsKKyAgaW50ICAgICAgICAgYmxvY2tfY291bnRfWzNdOwogCiAgIC8vIHF1YWxpdHkvc3BlZWQgc2V0dGluZ3MKICAgaW50IG1ldGhvZF87ICAgICAgICAgICAgICAgLy8gMD1mYXN0ZXN0LCA2PWJlc3Qvc2xvd2VzdC4KICAgVlA4UkRMZXZlbCByZF9vcHRfbGV2ZWxfOyAgLy8gRGVkdWNlZCBmcm9tIG1ldGhvZF8uCiAgIGludCBtYXhfaTRfaGVhZGVyX2JpdHNfOyAgIC8vIHBhcnRpdGlvbiAjMCBzYWZlbmVzcyBmYWN0b3IKKyAgaW50IG1iX2hlYWRlcl9saW1pdF87ICAgICAgLy8gcm91Z2ggbGltaXQgZm9yIGhlYWRlciBiaXRzIHBlciBNQgogICBpbnQgdGhyZWFkX2xldmVsXzsgICAgICAgICAvLyBkZXJpdmVkIGZyb20gY29uZmlnLT50aHJlYWRfbGV2ZWwKICAgaW50IGRvX3NlYXJjaF87ICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGNvbmZpZy0+dGFyZ2V0X1hYWAogICBpbnQgdXNlX3Rva2Vuc187ICAgICAgICAgICAvLyBpZiB0cnVlLCB1c2UgdG9rZW4gYnVmZmVyCkBAIC00NDAsMTggKzQwOCwxMSBAQAogICBWUDhNQkluZm8qIG1iX2luZm9fOyAgIC8vIGNvbnRleHR1YWwgbWFjcm9ibG9jayBpbmZvcyAobWJfd18gKyAxKQogICB1aW50OF90KiAgIHByZWRzXzsgICAgIC8vIHByZWRpY3Rpb25zIG1vZGVzOiAoNCptYl93KzEpICogKDQqbWJfaCsxKQogICB1aW50MzJfdCogIG56XzsgICAgICAgIC8vIG5vbi16ZXJvIGJpdCBjb250ZXh0OiBtYl93KzEKLSAgdWludDhfdCogICB5dXZfaW5fOyAgICAvLyBpbnB1dCBzYW1wbGVzCi0gIHVpbnQ4X3QqICAgeXV2X291dF87ICAgLy8gb3V0cHV0IHNhbXBsZXMKLSAgdWludDhfdCogICB5dXZfb3V0Ml87ICAvLyBzZWNvbmRhcnkgc2NyYXRjaCBvdXQtYnVmZmVyLiBzd2FwcGVkIHdpdGggeXV2X291dF8uCi0gIHVpbnQ4X3QqICAgeXV2X3BfOyAgICAgLy8gc2NyYXRjaCBidWZmZXIgZm9yIHByZWRpY3Rpb24KLSAgdWludDhfdCAgICp5X3RvcF87ICAgICAvLyB0b3AgbHVtYSBzYW1wbGVzLgotICB1aW50OF90ICAgKnV2X3RvcF87ICAgIC8vIHRvcCB1L3Ygc2FtcGxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVIGFuZCBWIGFyZSBwYWNrZWQgaW50byAxNiBwaXhlbHMgKDggVSArIDggVikKLSAgdWludDhfdCAgICp5X2xlZnRfOyAgICAvLyBsZWZ0IGx1bWEgc2FtcGxlcyAoYWRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDE1KS4KLSAgdWludDhfdCAgICp1X2xlZnRfOyAgICAvLyBsZWZ0IHUgc2FtcGxlcyAoYWRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCi0gIHVpbnQ4X3QgICAqdl9sZWZ0XzsgICAgLy8gbGVmdCB2IHNhbXBsZXMgKGFkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byA3KQotCi0gIExGU3RhdHMgICAqbGZfc3RhdHNfOyAgLy8gYXV0b2ZpbHRlciBzdGF0cyAoaWYgTlVMTCwgYXV0b2ZpbHRlciBpcyBvZmYpCisgIHVpbnQ4X3QqICAgeV90b3BfOyAgICAgLy8gdG9wIGx1bWEgc2FtcGxlcy4KKyAgdWludDhfdCogICB1dl90b3BfOyAgICAvLyB0b3AgdS92IHNhbXBsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVSBhbmQgViBhcmUgcGFja2VkIGludG8gMTYgYnl0ZXMgKDggVSArIDggVikKKyAgTEZTdGF0cyogICBsZl9zdGF0c187ICAvLyBhdXRvZmlsdGVyIHN0YXRzIChpZiBOVUxMLCBhdXRvZmlsdGVyIGlzIG9mZikKKyAgREVycm9yKiAgICB0b3BfZGVycl87ICAvLyBkaWZmdXNpb24gZXJyb3IgKE5VTEwgaWYgZGlzYWJsZWQpCiB9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDY0LDcgKzQyNSw3IEBACiAvLyBSZXNldCB0aGUgdG9rZW4gcHJvYmFiaWxpdGllcyB0byB0aGVpciBpbml0aWFsIChkZWZhdWx0KSB2YWx1ZXMKIHZvaWQgVlA4RGVmYXVsdFByb2JhcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwogLy8gV3JpdGUgdGhlIHRva2VuIHByb2JhYmlsaXRpZXMKLXZvaWQgVlA4V3JpdGVQcm9iYXMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgY29uc3QgVlA4UHJvYmEqIGNvbnN0IHByb2Jhcyk7Cit2b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMpOwogLy8gV3JpdGVzIHRoZSBwYXJ0aXRpb24gIzAgbW9kZXMgKHRoYXQgaXM6IGFsbCBpbnRyYSBtb2RlcykKIHZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKIApAQCAtNDc3LDcgKzQzOCw2IEBACiB2b2lkIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CiAKICAgLy8gaW4gZnJhbWUuYwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4RW5jQmFuZHNbMTYgKyAxXTsKIGV4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDNbXTsKIGV4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDRbXTsKIGV4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDVbXTsKQEAgLTUyMiwzNCArNDgyLDM5IEBACiBpbnQgVlA4RW5jRmluaXNoQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAvLyBmaW5hbGl6ZSBjb21wcmVzc2VkIGRhdGEKIGludCBWUDhFbmNEZWxldGVBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgIC8vIGRlbGV0ZSBjb21wcmVzc2VkIGRhdGEKIAotICAvLyBpbiBsYXllci5jCi12b2lkIFZQOEVuY0luaXRMYXllcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAgLy8gaW5pdCBldmVyeXRoaW5nCi12b2lkIFZQOEVuY0NvZGVMYXllckJsb2NrKFZQOEVuY0l0ZXJhdG9yKiBpdCk7ICAgLy8gY29kZSBvbmUgbW9yZSBtYWNyb2Jsb2NrCi1pbnQgVlA4RW5jRmluaXNoTGF5ZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAgLy8gZmluYWxpemUgY29kaW5nCi12b2lkIFZQOEVuY0RlbGV0ZUxheWVyKFZQOEVuY29kZXIqIGVuYyk7ICAgICAgICAgLy8gcmVjbGFpbSBtZW1vcnkKLQotICAvLyBpbiBmaWx0ZXIuYwotCi0vLyBTU0lNIHV0aWxzCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGRvdWJsZSB3LCB4bSwgeW0sIHh4bSwgeHltLCB5eW07Ci19IERpc3RvU3RhdHM7Ci12b2lkIFZQOFNTSU1BZGRTdGF0cyhjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzcmMsIERpc3RvU3RhdHMqIGNvbnN0IGRzdCk7Ci12b2lkIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFcsIGludCBILCBEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7Ci1kb3VibGUgVlA4U1NJTUdldChjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7Ci1kb3VibGUgVlA4U1NJTUdldFNxdWFyZWRFcnJvcihjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7Ci0KIC8vIGF1dG9maWx0ZXIKIHZvaWQgVlA4SW5pdEZpbHRlcihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwogdm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CiB2b2lkIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CiAKKy8vIHJldHVybnMgdGhlIGFwcHJveGltYXRlIGZpbHRlcmluZyBzdHJlbmd0aCBuZWVkZWQgdG8gc21vb3RoIGEgZWRnZQorLy8gc3RlcCBvZiAnZGVsdGEnLCBnaXZlbiBhIHNoYXJwbmVzcyBwYXJhbWV0ZXIgJ3NoYXJwbmVzcycuCitpbnQgVlA4RmlsdGVyU3RyZW5ndGhGcm9tRGVsdGEoaW50IHNoYXJwbmVzcywgaW50IGRlbHRhKTsKKworICAvLyBtaXNjIHV0aWxzIGZvciBwaWN0dXJlXyouYzoKKworLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgQVJHQi9ZVVZBIGJ1ZmZlciAoZG9lc24ndCBmcmVlIGFueXRoaW5nKS4KK3ZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpOworCisvLyBBbGxvY2F0ZXMgQVJHQiBidWZmZXIgb2YgZ2l2ZW4gZGltZW5zaW9uIChwcmV2aW91cyBvbmUgaXMgYWx3YXlzIGZyZWUnZCkuCisvLyBQcmVzZXJ2ZXMgdGhlIFlVVihBKSBidWZmZXIuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbSwKKy8vIG91dC1vZi1tZW1vcnkpLgoraW50IFdlYlBQaWN0dXJlQWxsb2NBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBBbGxvY2F0ZXMgWVVWQSBidWZmZXIgb2YgZ2l2ZW4gZGltZW5zaW9uIChwcmV2aW91cyBvbmUgaXMgYWx3YXlzIGZyZWUnZCkuCisvLyBVc2VzIHBpY3R1cmUtPmNzcCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhbHBoYSBidWZmZXIgaXMgbmVlZGVkLgorLy8gUHJlc2VydmVzIHRoZSBBUkdCIGJ1ZmZlci4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbSwgb3V0LW9mLW1lbW9yeSkuCitpbnQgV2ViUFBpY3R1cmVBbGxvY1lVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIENsZWFuLXVwIHRoZSBSR0Igc2FtcGxlcyB1bmRlciBmdWxseSB0cmFuc3BhcmVudCBhcmVhLCB0byBoZWxwIGxvc3NsZXNzCisvLyBjb21wcmVzc2liaWxpdHkgKG5vIGd1YXJhbnRlZSwgdGhvdWdoKS4gQXNzdW1lcyB0aGF0IHBpYy0+dXNlX2FyZ2IgaXMgdHJ1ZS4KK3ZvaWQgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWFMb3NzbGVzcyhXZWJQUGljdHVyZSogY29uc3QgcGljKTsKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvKiBXRUJQX0VOQ19WUDhFTkNJX0hfICovCisjZW5kaWYgIC8qIFdFQlBfRU5DX1ZQOElfRU5DX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGxfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGxfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmYTczMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bF9lbmMuYwpAQCAtMCwwICsxLDE5MTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBtYWluIGVudHJ5IGZvciB0aGUgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3I6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLyBNYXhpbXVtIG51bWJlciBvZiBoaXN0b2dyYW0gaW1hZ2VzIChzdWItYmxvY2tzKS4KKyNkZWZpbmUgTUFYX0hVRkZfSU1BR0VfU0laRSAgICAgICAyNjAwCisKKy8vIFBhbGV0dGUgcmVvcmRlcmluZyBmb3Igc21hbGxlciBzdW0gb2YgZGVsdGFzIChhbmQgZm9yIHNtYWxsZXIgc3RvcmFnZSkuCisKK3N0YXRpYyBpbnQgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgY29uc3QgdWludDMyX3QgYSA9IFdlYlBNZW1Ub1VpbnQzMigodWludDhfdCopcDEpOworICBjb25zdCB1aW50MzJfdCBiID0gV2ViUE1lbVRvVWludDMyKCh1aW50OF90KilwMik7CisgIGFzc2VydChhICE9IGIpOworICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSh1aW50MzJfdCB2KSB7CisgIHJldHVybiAodiA8PSAxMjgpID8gdiA6ICgyNTYgLSB2KTsKK30KKworLy8gQ29tcHV0ZXMgYSB2YWx1ZSB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhlIGVudHJvcHkgY3JlYXRlZCBieSB0aGUKKy8vIHBhbGV0dGUgZW50cnkgZGlmZi4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGxhc3QgJiAweGZmIGlzIGEgbm8tb3BlcmF0aW9uIGluIHRoZSBuZXh0IHN0YXRlbWVudCwgYnV0CisvLyByZW1vdmVkIGJ5IG1vc3QgY29tcGlsZXJzIGFuZCBpcyBoZXJlIG9ubHkgZm9yIHJlZ3VsYXJpdHkgb2YgdGhlIGNvZGUuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGFsZXR0ZUNvbG9yRGlzdGFuY2UodWludDMyX3QgY29sMSwgdWludDMyX3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCBkaWZmID0gVlA4TFN1YlBpeGVscyhjb2wxLCBjb2wyKTsKKyAgY29uc3QgaW50IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhID0gOTsKKyAgdWludDMyX3Qgc2NvcmU7CisgIHNjb3JlID0gIFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSgoZGlmZiA+PiAgMCkgJiAweGZmKTsKKyAgc2NvcmUgKz0gUGFsZXR0ZUNvbXBvbmVudERpc3RhbmNlKChkaWZmID4+ICA4KSAmIDB4ZmYpOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMTYpICYgMHhmZik7CisgIHNjb3JlICo9IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMjQpICYgMHhmZik7CisgIHJldHVybiBzY29yZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3dhcENvbG9yKHVpbnQzMl90KiBjb25zdCBjb2wxLCB1aW50MzJfdCogY29uc3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCB0bXAgPSAqY29sMTsKKyAgKmNvbDEgPSAqY29sMjsKKyAgKmNvbDIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIEdyZWVkeU1pbmltaXplRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgLy8gRmluZCBncmVlZGlseSBhbHdheXMgdGhlIGNsb3Nlc3QgY29sb3Igb2YgdGhlIHByZWRpY3RlZCBjb2xvciB0byBtaW5pbWl6ZQorICAvLyBkZWx0YXMgaW4gdGhlIHBhbGV0dGUuIFRoaXMgcmVkdWNlcyBzdG9yYWdlIG5lZWRzIHNpbmNlIHRoZQorICAvLyBwYWxldHRlIGlzIHN0b3JlZCB3aXRoIGRlbHRhIGVuY29kaW5nLgorICB1aW50MzJfdCBwcmVkaWN0ID0gMHgwMDAwMDAwMDsKKyAgaW50IGksIGs7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyArK2kpIHsKKyAgICBpbnQgYmVzdF9peCA9IGk7CisgICAgdWludDMyX3QgYmVzdF9zY29yZSA9IH4wVTsKKyAgICBmb3IgKGsgPSBpOyBrIDwgbnVtX2NvbG9yczsgKytrKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBjdXJfc2NvcmUgPSBQYWxldHRlQ29sb3JEaXN0YW5jZShwYWxldHRlW2tdLCBwcmVkaWN0KTsKKyAgICAgIGlmIChiZXN0X3Njb3JlID4gY3VyX3Njb3JlKSB7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBjdXJfc2NvcmU7CisgICAgICAgIGJlc3RfaXggPSBrOworICAgICAgfQorICAgIH0KKyAgICBTd2FwQ29sb3IoJnBhbGV0dGVbYmVzdF9peF0sICZwYWxldHRlW2ldKTsKKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorfQorCisvLyBUaGUgcGFsZXR0ZSBoYXMgYmVlbiBzb3J0ZWQgYnkgYWxwaGEuIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBvdGhlcgorLy8gY29tcG9uZW50cyBvZiB0aGUgcGFsZXR0ZSBoYXZlIGEgbW9ub3RvbmljIGRldmVsb3BtZW50IHdpdGggcmVnYXJkcyB0bworLy8gcG9zaXRpb24gaW4gdGhlIHBhbGV0dGUuIElmIGFsbCBoYXZlIG1vbm90b25pYyBkZXZlbG9wbWVudCwgdGhlcmUgaXMKKy8vIG5vIGJlbmVmaXQgdG8gcmUtb3JnYW5pemUgdGhlbSBncmVlZGlseS4gQSBtb25vdG9uaWMgZGV2ZWxvcG1lbnQKKy8vIHdvdWxkIGJlIHNwb3R0ZWQgaW4gZ3JlZW4tb25seSBzaXR1YXRpb25zIChsaWtlIGxvc3N5IGFscGhhKSBvciBncmF5LXNjYWxlCisvLyBpbWFnZXMuCitzdGF0aWMgaW50IFBhbGV0dGVIYXNOb25Nb25vdG9ub3VzRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgdWludDMyX3QgcHJlZGljdCA9IDB4MDAwMDAwOworICBpbnQgaTsKKyAgdWludDhfdCBzaWduX2ZvdW5kID0gMHgwMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHByZWRpY3QpOworICAgIGNvbnN0IHVpbnQ4X3QgcmQgPSAoZGlmZiA+PiAxNikgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgZ2QgPSAoZGlmZiA+PiAgOCkgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgYmQgPSAoZGlmZiA+PiAgMCkgJiAweGZmOworICAgIGlmIChyZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChyZCA8IDB4ODApID8gMSA6IDI7CisgICAgfQorICAgIGlmIChnZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChnZCA8IDB4ODApID8gOCA6IDE2OworICAgIH0KKyAgICBpZiAoYmQgIT0gMHgwMCkgeworICAgICAgc2lnbl9mb3VuZCB8PSAoYmQgPCAweDgwKSA/IDY0IDogMTI4OworICAgIH0KKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorICByZXR1cm4gKHNpZ25fZm91bmQgJiAoc2lnbl9mb3VuZCA8PCAxKSkgIT0gMDsgIC8vIHR3byBjb25zZXF1ZW50IHNpZ25zLgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFsZXR0ZQorCisvLyBJZiBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBpbWFnZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTUFYX1BBTEVUVEVfU0laRSwKKy8vIGNyZWF0ZXMgYSBwYWxldHRlIGFuZCByZXR1cm5zIHRydWUsIGVsc2UgcmV0dXJucyBmYWxzZS4KK3N0YXRpYyBpbnQgQW5hbHl6ZUFuZENyZWF0ZVBhbGV0dGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcGFsZXR0ZV9zaXplKSB7CisgIGNvbnN0IGludCBudW1fY29sb3JzID0gV2ViUEdldENvbG9yUGFsZXR0ZShwaWMsIHBhbGV0dGUpOworICBpZiAobnVtX2NvbG9ycyA+IE1BWF9QQUxFVFRFX1NJWkUpIHsKKyAgICAqcGFsZXR0ZV9zaXplID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqcGFsZXR0ZV9zaXplID0gbnVtX2NvbG9yczsKKyAgcXNvcnQocGFsZXR0ZSwgbnVtX2NvbG9ycywgc2l6ZW9mKCpwYWxldHRlKSwgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydCk7CisgIGlmICghbG93X2VmZm9ydCAmJiBQYWxldHRlSGFzTm9uTW9ub3Rvbm91c0RlbHRhcyhwYWxldHRlLCBudW1fY29sb3JzKSkgeworICAgIEdyZWVkeU1pbmltaXplRGVsdGFzKHBhbGV0dGUsIG51bV9jb2xvcnMpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBUaGVzZSBmaXZlIG1vZGVzIGFyZSBldmFsdWF0ZWQgYW5kIHRoZWlyIHJlc3BlY3RpdmUgZW50cm9weSBpcyBjb21wdXRlZC4KK3R5cGVkZWYgZW51bSB7CisgIGtEaXJlY3QgPSAwLAorICBrU3BhdGlhbCA9IDEsCisgIGtTdWJHcmVlbiA9IDIsCisgIGtTcGF0aWFsU3ViR3JlZW4gPSAzLAorICBrUGFsZXR0ZSA9IDQsCisgIGtOdW1FbnRyb3B5SXggPSA1Cit9IEVudHJvcHlJeDsKKwordHlwZWRlZiBlbnVtIHsKKyAga0hpc3RvQWxwaGEgPSAwLAorICBrSGlzdG9BbHBoYVByZWQsCisgIGtIaXN0b0dyZWVuLAorICBrSGlzdG9HcmVlblByZWQsCisgIGtIaXN0b1JlZCwKKyAga0hpc3RvUmVkUHJlZCwKKyAga0hpc3RvQmx1ZSwKKyAga0hpc3RvQmx1ZVByZWQsCisgIGtIaXN0b1JlZFN1YkdyZWVuLAorICBrSGlzdG9SZWRQcmVkU3ViR3JlZW4sCisgIGtIaXN0b0JsdWVTdWJHcmVlbiwKKyAga0hpc3RvQmx1ZVByZWRTdWJHcmVlbiwKKyAga0hpc3RvUGFsZXR0ZSwKKyAga0hpc3RvVG90YWwgIC8vIE11c3QgYmUgbGFzdC4KK30gSGlzdG9JeDsKKworc3RhdGljIHZvaWQgQWRkU2luZ2xlU3ViR3JlZW4oaW50IHAsIHVpbnQzMl90KiBjb25zdCByLCB1aW50MzJfdCogY29uc3QgYikgeworICBjb25zdCBpbnQgZ3JlZW4gPSBwID4+IDg7ICAvLyBUaGUgdXBwZXIgYml0cyBhcmUgbWFza2VkIGF3YXkgbGF0ZXIuCisgICsrclsoKHAgPj4gMTYpIC0gZ3JlZW4pICYgMHhmZl07CisgICsrYlsoKHAgPj4gIDApIC0gZ3JlZW4pICYgMHhmZl07Cit9CisKK3N0YXRpYyB2b2lkIEFkZFNpbmdsZSh1aW50MzJfdCBwLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhLCB1aW50MzJfdCogY29uc3QgciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZywgdWludDMyX3QqIGNvbnN0IGIpIHsKKyAgKythWyhwID4+IDI0KSAmIDB4ZmZdOworICArK3JbKHAgPj4gMTYpICYgMHhmZl07CisgICsrZ1socCA+PiAgOCkgJiAweGZmXTsKKyAgKytiWyhwID4+ICAwKSAmIDB4ZmZdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgSGFzaFBpeCh1aW50MzJfdCBwaXgpIHsKKyAgLy8gTm90ZSB0aGF0IG1hc2tpbmcgd2l0aCAweGZmZmZmZmZmdSBpcyBmb3IgcHJldmVudGluZyBhbgorICAvLyAndW5zaWduZWQgaW50IG92ZXJmbG93JyB3YXJuaW5nLiBEb2Vzbid0IGltcGFjdCB0aGUgY29tcGlsZWQgY29kZS4KKyAgcmV0dXJuICgoKCh1aW50NjRfdClwaXggKyAocGl4ID4+IDE5KSkgKiAweDM5YzVmYmE3dWxsKSAmIDB4ZmZmZmZmZmZ1KSA+PiAyNDsKK30KKworc3RhdGljIGludCBBbmFseXplRW50cm9weShjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfc2l6ZSwgaW50IHRyYW5zZm9ybV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyb3B5SXgqIGNvbnN0IG1pbl9lbnRyb3B5X2l4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybykgeworICAvLyBBbGxvY2F0ZSBoaXN0b2dyYW0gc2V0IHdpdGggY2FjaGVfYml0cyA9IDAuCisgIHVpbnQzMl90KiBoaXN0bzsKKworICBpZiAodXNlX3BhbGV0dGUgJiYgcGFsZXR0ZV9zaXplIDw9IDE2KSB7CisgICAgLy8gSW4gdGhlIGNhc2Ugb2Ygc21hbGwgcGFsZXR0ZXMsIHdlIHBhY2sgMiwgNCBvciA4IHBpeGVscyB0b2dldGhlci4gSW4KKyAgICAvLyBwcmFjdGljZSwgc21hbGwgcGFsZXR0ZXMgYXJlIGJldHRlciB0aGFuIGFueSBvdGhlciB0cmFuc2Zvcm0uCisgICAgKm1pbl9lbnRyb3B5X2l4ID0ga1BhbGV0dGU7CisgICAgKnJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IDE7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaGlzdG8gPSAodWludDMyX3QqKVdlYlBTYWZlQ2FsbG9jKGtIaXN0b1RvdGFsLCBzaXplb2YoKmhpc3RvKSAqIDI1Nik7CisgIGlmIChoaXN0byAhPSBOVUxMKSB7CisgICAgaW50IGksIHgsIHk7CisgICAgY29uc3QgdWludDMyX3QqIHByZXZfcm93ID0gTlVMTDsKKyAgICBjb25zdCB1aW50MzJfdCogY3Vycl9yb3cgPSBhcmdiOworICAgIHVpbnQzMl90IHBpeF9wcmV2ID0gYXJnYlswXTsgIC8vIFNraXAgdGhlIGZpcnN0IHBpeGVsLgorICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gY3Vycl9yb3dbeF07CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF9kaWZmID0gVlA4TFN1YlBpeGVscyhwaXgsIHBpeF9wcmV2KTsKKyAgICAgICAgcGl4X3ByZXYgPSBwaXg7CisgICAgICAgIGlmICgocGl4X2RpZmYgPT0gMCkgfHwgKHByZXZfcm93ICE9IE5VTEwgJiYgcGl4ID09IHByZXZfcm93W3hdKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFkZFNpbmdsZShwaXgsCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQWxwaGEgKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b1JlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0JsdWUgKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlKHBpeF9kaWZmLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0FscGhhUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvUmVkUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW5QcmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlUHJlZCAqIDI1Nl0pOworICAgICAgICBBZGRTaW5nbGVTdWJHcmVlbihwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRTdWJHcmVlbiAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlU3ViR3JlZW4gKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlU3ViR3JlZW4ocGl4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRQcmVkU3ViR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQmx1ZVByZWRTdWJHcmVlbiAqIDI1Nl0pOworICAgICAgICB7CisgICAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHBhbGV0dGUgYnkgdGhlIGVudHJvcHkgb2YgdGhlIG11bHRpcGxpY2F0aXZlIGhhc2guCisgICAgICAgICAgY29uc3QgdWludDMyX3QgaGFzaCA9IEhhc2hQaXgocGl4KTsKKyAgICAgICAgICArK2hpc3RvW2tIaXN0b1BhbGV0dGUgKiAyNTYgKyBoYXNoXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJldl9yb3cgPSBjdXJyX3JvdzsKKyAgICAgIGN1cnJfcm93ICs9IGFyZ2Jfc3RyaWRlOworICAgIH0KKyAgICB7CisgICAgICBkb3VibGUgZW50cm9weV9jb21wW2tIaXN0b1RvdGFsXTsKKyAgICAgIGRvdWJsZSBlbnRyb3B5W2tOdW1FbnRyb3B5SXhdOworICAgICAgaW50IGs7CisgICAgICBpbnQgbGFzdF9tb2RlX3RvX2FuYWx5emUgPSB1c2VfcGFsZXR0ZSA/IGtQYWxldHRlIDoga1NwYXRpYWxTdWJHcmVlbjsKKyAgICAgIGludCBqOworICAgICAgLy8gTGV0J3MgYWRkIG9uZSB6ZXJvIHRvIHRoZSBwcmVkaWN0ZWQgaGlzdG9ncmFtcy4gVGhlIHplcm9zIGFyZSByZW1vdmVkCisgICAgICAvLyB0b28gZWZmaWNpZW50bHkgYnkgdGhlIHBpeF9kaWZmID09IDAgY29tcGFyaXNvbiwgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAgLy8gemVyb3MgaXMgbGlrZWx5IHRvIGV4aXN0LgorICAgICAgKytoaXN0b1trSGlzdG9SZWRQcmVkU3ViR3JlZW4gKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9CbHVlUHJlZFN1YkdyZWVuICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvUmVkUHJlZCAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0dyZWVuUHJlZCAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0JsdWVQcmVkICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvQWxwaGFQcmVkICogMjU2XTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGtIaXN0b1RvdGFsOyArK2opIHsKKyAgICAgICAgZW50cm9weV9jb21wW2pdID0gVlA4TEJpdHNFbnRyb3B5KCZoaXN0b1tqICogMjU2XSwgMjU2KTsKKyAgICAgIH0KKyAgICAgIGVudHJvcHlba0RpcmVjdF0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVdOworICAgICAgZW50cm9weVtrU3BhdGlhbF0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFQcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b1JlZFByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvR3JlZW5QcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVQcmVkXTsKKyAgICAgIGVudHJvcHlba1N1YkdyZWVuXSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYV0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9SZWRTdWJHcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9HcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlU3ViR3JlZW5dOworICAgICAgZW50cm9weVtrU3BhdGlhbFN1YkdyZWVuXSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYVByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkUHJlZFN1YkdyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlUHJlZFN1YkdyZWVuXTsKKyAgICAgIGVudHJvcHlba1BhbGV0dGVdID0gZW50cm9weV9jb21wW2tIaXN0b1BhbGV0dGVdOworCisgICAgICAvLyBXaGVuIGluY2x1ZGluZyB0cmFuc2Zvcm1zLCB0aGVyZSBpcyBhbiBvdmVyaGVhZCBpbiBiaXRzIGZyb20KKyAgICAgIC8vIHN0b3JpbmcgdGhlbS4gVGhpcyBvdmVyaGVhZCBpcyBzbWFsbCBidXQgbWF0dGVycyBmb3Igc21hbGwgaW1hZ2VzLgorICAgICAgLy8gRm9yIHNwYXRpYWwsIHRoZXJlIGFyZSAxNCB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICBlbnRyb3B5W2tTcGF0aWFsXSArPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExGYXN0TG9nMigxNCk7CisgICAgICAvLyBGb3IgY29sb3IgdHJhbnNmb3JtczogMjQgYXMgb25seSAzIGNoYW5uZWxzIGFyZSBjb25zaWRlcmVkIGluIGEKKyAgICAgIC8vIENvbG9yVHJhbnNmb3JtRWxlbWVudC4KKyAgICAgIGVudHJvcHlba1NwYXRpYWxTdWJHcmVlbl0gKz0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybV9iaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEZhc3RMb2cyKDI0KTsKKyAgICAgIC8vIEZvciBwYWxldHRlcywgYWRkIHRoZSBjb3N0IG9mIHN0b3JpbmcgdGhlIHBhbGV0dGUuCisgICAgICAvLyBXZSBlbXBpcmljYWxseSBlc3RpbWF0ZSB0aGUgY29zdCBvZiBhIGNvbXByZXNzZWQgZW50cnkgYXMgOCBiaXRzLgorICAgICAgLy8gVGhlIHBhbGV0dGUgaXMgZGlmZmVyZW50aWFsLWNvZGVkIHdoZW4gY29tcHJlc3NlZCBoZW5jZSBhIG11Y2gKKyAgICAgIC8vIGxvd2VyIGNvc3QgdGhhbiBzaXplb2YodWludDMyX3QpKjguCisgICAgICBlbnRyb3B5W2tQYWxldHRlXSArPSBwYWxldHRlX3NpemUgKiA4OworCisgICAgICAqbWluX2VudHJvcHlfaXggPSBrRGlyZWN0OworICAgICAgZm9yIChrID0ga0RpcmVjdCArIDE7IGsgPD0gbGFzdF9tb2RlX3RvX2FuYWx5emU7ICsraykgeworICAgICAgICBpZiAoZW50cm9weVsqbWluX2VudHJvcHlfaXhdID4gZW50cm9weVtrXSkgeworICAgICAgICAgICptaW5fZW50cm9weV9peCA9IChFbnRyb3B5SXgpazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXNzZXJ0KChpbnQpKm1pbl9lbnRyb3B5X2l4IDw9IGxhc3RfbW9kZV90b19hbmFseXplKTsKKyAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAxOworICAgICAgLy8gTGV0J3MgY2hlY2sgaWYgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgY2hvc2VuIGVudHJvcHkgbW9kZSBoYXMKKyAgICAgIC8vIG5vbi16ZXJvIHJlZCBhbmQgYmx1ZSB2YWx1ZXMuIElmIGFsbCBhcmUgemVybywgd2UgY2FuIGxhdGVyIHNraXAKKyAgICAgIC8vIHRoZSBjcm9zcyBjb2xvciBvcHRpbWl6YXRpb24uCisgICAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtIaXN0b1BhaXJzWzVdWzJdID0geworICAgICAgICAgIHsga0hpc3RvUmVkLCBrSGlzdG9CbHVlIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWRQcmVkLCBrSGlzdG9CbHVlUHJlZCB9LAorICAgICAgICAgIHsga0hpc3RvUmVkU3ViR3JlZW4sIGtIaXN0b0JsdWVTdWJHcmVlbiB9LAorICAgICAgICAgIHsga0hpc3RvUmVkUHJlZFN1YkdyZWVuLCBrSGlzdG9CbHVlUHJlZFN1YkdyZWVuIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWQsIGtIaXN0b0JsdWUgfQorICAgICAgICB9OworICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgcmVkX2hpc3RvID0KKyAgICAgICAgICAgICZoaXN0b1syNTYgKiBrSGlzdG9QYWlyc1sqbWluX2VudHJvcHlfaXhdWzBdXTsKKyAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGJsdWVfaGlzdG8gPQorICAgICAgICAgICAgJmhpc3RvWzI1NiAqIGtIaXN0b1BhaXJzWyptaW5fZW50cm9weV9peF1bMV1dOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICBpZiAoKHJlZF9oaXN0b1tpXSB8IGJsdWVfaGlzdG9baV0pICE9IDApIHsKKyAgICAgICAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShoaXN0byk7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBHZXRIaXN0b0JpdHMoaW50IG1ldGhvZCwgaW50IHVzZV9wYWxldHRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgLy8gTWFrZSB0aWxlIHNpemUgYSBmdW5jdGlvbiBvZiBlbmNvZGluZyBtZXRob2QgKFJhbmdlOiAwIHRvIDYpLgorICBpbnQgaGlzdG9fYml0cyA9ICh1c2VfcGFsZXR0ZSA/IDkgOiA3KSAtIG1ldGhvZDsKKyAgd2hpbGUgKDEpIHsKKyAgICBjb25zdCBpbnQgaHVmZl9pbWFnZV9zaXplID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b19iaXRzKTsKKyAgICBpZiAoaHVmZl9pbWFnZV9zaXplIDw9IE1BWF9IVUZGX0lNQUdFX1NJWkUpIGJyZWFrOworICAgICsraGlzdG9fYml0czsKKyAgfQorICByZXR1cm4gKGhpc3RvX2JpdHMgPCBNSU5fSFVGRk1BTl9CSVRTKSA/IE1JTl9IVUZGTUFOX0JJVFMgOgorICAgICAgICAgKGhpc3RvX2JpdHMgPiBNQVhfSFVGRk1BTl9CSVRTKSA/IE1BWF9IVUZGTUFOX0JJVFMgOiBoaXN0b19iaXRzOworfQorCitzdGF0aWMgaW50IEdldFRyYW5zZm9ybUJpdHMoaW50IG1ldGhvZCwgaW50IGhpc3RvX2JpdHMpIHsKKyAgY29uc3QgaW50IG1heF90cmFuc2Zvcm1fYml0cyA9IChtZXRob2QgPCA0KSA/IDYgOiAobWV0aG9kID4gNCkgPyA0IDogNTsKKyAgY29uc3QgaW50IHJlcyA9CisgICAgICAoaGlzdG9fYml0cyA+IG1heF90cmFuc2Zvcm1fYml0cykgPyBtYXhfdHJhbnNmb3JtX2JpdHMgOiBoaXN0b19iaXRzOworICBhc3NlcnQocmVzIDw9IE1BWF9UUkFOU0ZPUk1fQklUUyk7CisgIHJldHVybiByZXM7Cit9CisKKy8vIFNldCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgaW4gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGNydW5jaGVyLgorI2RlZmluZSBDUlVOQ0hfQ09ORklHU19MWjc3X01BWCAyCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBlbnRyb3B5X2lkeF87CisgIGludCBsejc3c190eXBlc190b190cnlfW0NSVU5DSF9DT05GSUdTX0xaNzdfTUFYXTsKKyAgaW50IGx6NzdzX3R5cGVzX3RvX3RyeV9zaXplXzsKK30gQ3J1bmNoQ29uZmlnOworCisjZGVmaW5lIENSVU5DSF9DT05GSUdTX01BWCBrTnVtRW50cm9weUl4CisKK3N0YXRpYyBpbnQgRW5jb2RlckFuYWx5emUoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzW0NSVU5DSF9DT05GSUdTX01BWF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgY3J1bmNoX2NvbmZpZ3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCByZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8pIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcgPSBlbmMtPmNvbmZpZ187CisgIGNvbnN0IGludCBtZXRob2QgPSBjb25maWctPm1ldGhvZDsKKyAgY29uc3QgaW50IGxvd19lZmZvcnQgPSAoY29uZmlnLT5tZXRob2QgPT0gMCk7CisgIGludCBpOworICBpbnQgdXNlX3BhbGV0dGU7CisgIGludCBuX2x6NzdzOworICBhc3NlcnQocGljICE9IE5VTEwgJiYgcGljLT5hcmdiICE9IE5VTEwpOworCisgIHVzZV9wYWxldHRlID0KKyAgICAgIEFuYWx5emVBbmRDcmVhdGVQYWxldHRlKHBpYywgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+cGFsZXR0ZV8sICZlbmMtPnBhbGV0dGVfc2l6ZV8pOworCisgIC8vIEVtcGlyaWNhbCBiaXQgc2l6ZXMuCisgIGVuYy0+aGlzdG9fYml0c18gPSBHZXRIaXN0b0JpdHMobWV0aG9kLCB1c2VfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgIGVuYy0+dHJhbnNmb3JtX2JpdHNfID0gR2V0VHJhbnNmb3JtQml0cyhtZXRob2QsIGVuYy0+aGlzdG9fYml0c18pOworCisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgLy8gQW5hbHl6ZUVudHJvcHkgaXMgc29tZXdoYXQgc2xvdy4KKyAgICBjcnVuY2hfY29uZmlnc1swXS5lbnRyb3B5X2lkeF8gPSB1c2VfcGFsZXR0ZSA/IGtQYWxldHRlIDoga1NwYXRpYWxTdWJHcmVlbjsKKyAgICBuX2x6NzdzID0gMTsKKyAgICAqY3J1bmNoX2NvbmZpZ3Nfc2l6ZSA9IDE7CisgIH0gZWxzZSB7CisgICAgRW50cm9weUl4IG1pbl9lbnRyb3B5X2l4OworICAgIC8vIFRyeSBvdXQgbXVsdGlwbGUgTFo3NyBvbiBpbWFnZXMgd2l0aCBmZXcgY29sb3JzLgorICAgIG5fbHo3N3MgPSAoZW5jLT5wYWxldHRlX3NpemVfID4gMCAmJiBlbmMtPnBhbGV0dGVfc2l6ZV8gPD0gMTYpID8gMiA6IDE7CisgICAgaWYgKCFBbmFseXplRW50cm9weShwaWMtPmFyZ2IsIHdpZHRoLCBoZWlnaHQsIHBpYy0+YXJnYl9zdHJpZGUsIHVzZV9wYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5wYWxldHRlX3NpemVfLCBlbmMtPnRyYW5zZm9ybV9iaXRzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtaW5fZW50cm9weV9peCwgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtZXRob2QgPT0gNiAmJiBjb25maWctPnF1YWxpdHkgPT0gMTAwKSB7CisgICAgICAvLyBHbyBicnV0ZSBmb3JjZSBvbiBhbGwgdHJhbnNmb3Jtcy4KKyAgICAgICpjcnVuY2hfY29uZmlnc19zaXplID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtRW50cm9weUl4OyArK2kpIHsKKyAgICAgICAgaWYgKGkgIT0ga1BhbGV0dGUgfHwgdXNlX3BhbGV0dGUpIHsKKyAgICAgICAgICBhc3NlcnQoKmNydW5jaF9jb25maWdzX3NpemUgPCBDUlVOQ0hfQ09ORklHU19NQVgpOworICAgICAgICAgIGNydW5jaF9jb25maWdzWygqY3J1bmNoX2NvbmZpZ3Nfc2l6ZSkrK10uZW50cm9weV9pZHhfID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBPbmx5IGNob29zZSB0aGUgZ3Vlc3NlZCBiZXN0IHRyYW5zZm9ybS4KKyAgICAgICpjcnVuY2hfY29uZmlnc19zaXplID0gMTsKKyAgICAgIGNydW5jaF9jb25maWdzWzBdLmVudHJvcHlfaWR4XyA9IG1pbl9lbnRyb3B5X2l4OworICAgIH0KKyAgfQorICAvLyBGaWxsIGluIHRoZSBkaWZmZXJlbnQgTFo3N3MuCisgIGFzc2VydChuX2x6NzdzIDw9IENSVU5DSF9DT05GSUdTX0xaNzdfTUFYKTsKKyAgZm9yIChpID0gMDsgaSA8ICpjcnVuY2hfY29uZmlnc19zaXplOyArK2kpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgbl9sejc3czsgKytqKSB7CisgICAgICBjcnVuY2hfY29uZmlnc1tpXS5sejc3c190eXBlc190b190cnlfW2pdID0KKyAgICAgICAgICAoaiA9PSAwKSA/IGtMWjc3U3RhbmRhcmQgfCBrTFo3N1JMRSA6IGtMWjc3Qm94OworICAgIH0KKyAgICBjcnVuY2hfY29uZmlnc1tpXS5sejc3c190eXBlc190b190cnlfc2l6ZV8gPSBuX2x6NzdzOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEVuY29kZXJJbml0KFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCBpbnQgcGl4X2NudCA9IHdpZHRoICogaGVpZ2h0OworICAvLyB3ZSByb3VuZCB0aGUgYmxvY2sgc2l6ZSB1cCwgc28gd2UncmUgZ3VhcmFudGVlZCB0byBoYXZlCisgIC8vIGF0IG1vc3QgTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFIGJsb2NrcyB1c2VkOgorICBjb25zdCBpbnQgcmVmc19ibG9ja19zaXplID0gKHBpeF9jbnQgLSAxKSAvIE1BWF9SRUZTX0JMT0NLX1BFUl9JTUFHRSArIDE7CisgIGludCBpOworICBpZiAoIVZQOExIYXNoQ2hhaW5Jbml0KCZlbmMtPmhhc2hfY2hhaW5fLCBwaXhfY250KSkgcmV0dXJuIDA7CisKKyAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgVlA4TEJhY2t3YXJkUmVmc0luaXQoJmVuYy0+cmVmc19baV0sIHJlZnNfYmxvY2tfc2l6ZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgaW50IEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoCisgICAgY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG9ncmFtX2ltYWdlLAorICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgeworICBpbnQgaSwgazsKKyAgaW50IG9rID0gMDsKKyAgdWludDY0X3QgdG90YWxfbGVuZ3RoX3NpemUgPSAwOworICB1aW50OF90KiBtZW1fYnVmID0gTlVMTDsKKyAgY29uc3QgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gaGlzdG9ncmFtX2ltYWdlLT5zaXplOworICBpbnQgbWF4X251bV9zeW1ib2xzID0gMDsKKyAgdWludDhfdCogYnVmX3JsZSA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlKiBodWZmX3RyZWUgPSBOVUxMOworCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaGlzdG9ncmFtcyBhbmQgZ2V0IHRoZSBhZ2dyZWdhdGUgbnVtYmVyIG9mIGNvZGVzIHVzZWQuCisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbaV07CisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzWzUgKiBpXTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPQorICAgICAgICAgIChrID09IDApID8gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGhpc3RvLT5wYWxldHRlX2NvZGVfYml0c18pIDoKKyAgICAgICAgICAoayA9PSA0KSA/IE5VTV9ESVNUQU5DRV9DT0RFUyA6IDI1NjsKKyAgICAgIGNvZGVzW2tdLm51bV9zeW1ib2xzID0gbnVtX3N5bWJvbHM7CisgICAgICB0b3RhbF9sZW5ndGhfc2l6ZSArPSBudW1fc3ltYm9sczsKKyAgICB9CisgIH0KKworICAvLyBBbGxvY2F0ZSBhbmQgU2V0IEh1ZmZtYW4gY29kZXMuCisgIHsKKyAgICB1aW50MTZfdCogY29kZXM7CisgICAgdWludDhfdCogbGVuZ3RoczsKKyAgICBtZW1fYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKHRvdGFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpsZW5ndGhzKSArIHNpemVvZigqY29kZXMpKTsKKyAgICBpZiAobWVtX2J1ZiA9PSBOVUxMKSBnb3RvIEVuZDsKKworICAgIGNvZGVzID0gKHVpbnQxNl90KiltZW1fYnVmOworICAgIGxlbmd0aHMgPSAodWludDhfdCopJmNvZGVzW3RvdGFsX2xlbmd0aF9zaXplXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBiaXRfbGVuZ3RoID0gaHVmZm1hbl9jb2Rlc1tpXS5udW1fc3ltYm9sczsKKyAgICAgIGh1ZmZtYW5fY29kZXNbaV0uY29kZXMgPSBjb2RlczsKKyAgICAgIGh1ZmZtYW5fY29kZXNbaV0uY29kZV9sZW5ndGhzID0gbGVuZ3RoczsKKyAgICAgIGNvZGVzICs9IGJpdF9sZW5ndGg7CisgICAgICBsZW5ndGhzICs9IGJpdF9sZW5ndGg7CisgICAgICBpZiAobWF4X251bV9zeW1ib2xzIDwgYml0X2xlbmd0aCkgeworICAgICAgICBtYXhfbnVtX3N5bWJvbHMgPSBiaXRfbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJ1Zl9ybGUgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgbWF4X251bV9zeW1ib2xzKTsKKyAgaHVmZl90cmVlID0gKEh1ZmZtYW5UcmVlKilXZWJQU2FmZU1hbGxvYygzVUxMICogbWF4X251bV9zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZl90cmVlKSk7CisgIGlmIChidWZfcmxlID09IE5VTEwgfHwgaHVmZl90cmVlID09IE5VTEwpIGdvdG8gRW5kOworCisgIC8vIENyZWF0ZSBIdWZmbWFuIHRyZWVzLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07CisgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbaV07CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5saXRlcmFsXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAwKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPnJlZF8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgMSk7CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5ibHVlXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAyKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmFscGhhXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAzKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmRpc3RhbmNlXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyA0KTsKKyAgfQorICBvayA9IDE7CisgRW5kOgorICBXZWJQU2FmZUZyZWUoaHVmZl90cmVlKTsKKyAgV2ViUFNhZmVGcmVlKGJ1Zl9ybGUpOworICBpZiAoIW9rKSB7CisgICAgV2ViUFNhZmVGcmVlKG1lbV9idWYpOworICAgIG1lbXNldChodWZmbWFuX2NvZGVzLCAwLCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemUgKiBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50OF90KiBjb2RlX2xlbmd0aF9iaXRkZXB0aCkgeworICAvLyBSRkMgMTk1MSB3aWxsIGNhbG0geW91IGRvd24gaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHRoaXMgZnVubnkgc2VxdWVuY2UuCisgIC8vIFRoaXMgc2VxdWVuY2UgaXMgdHVuZWQgZnJvbSB0aGF0LCBidXQgbW9yZSB3ZWlnaHRlZCBmb3IgbG93ZXIgc3ltYm9sIGNvdW50LAorICAvLyBhbmQgbW9yZSBzcGlraW5nIGhpc3RvZ3JhbXMuCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdG9yYWdlT3JkZXJbQ09ERV9MRU5HVEhfQ09ERVNdID0geworICAgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgfTsKKyAgaW50IGk7CisgIC8vIFRocm93IGF3YXkgdHJhaWxpbmcgemVyb3M6CisgIGludCBjb2Rlc190b19zdG9yZSA9IENPREVfTEVOR1RIX0NPREVTOworICBmb3IgKDsgY29kZXNfdG9fc3RvcmUgPiA0OyAtLWNvZGVzX3RvX3N0b3JlKSB7CisgICAgaWYgKGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbY29kZXNfdG9fc3RvcmUgLSAxXV0gIT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFZQOExQdXRCaXRzKGJ3LCBjb2Rlc190b19zdG9yZSAtIDQsIDQpOworICBmb3IgKGkgPSAwOyBpIDwgY29kZXNfdG9fc3RvcmU7ICsraSkgeworICAgIFZQOExQdXRCaXRzKGJ3LCBjb2RlX2xlbmd0aF9iaXRkZXB0aFtrU3RvcmFnZU9yZGVyW2ldXSwgMyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbCgKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgeworICBpbnQgazsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChrID0gMDsgayA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHM7ICsraykgeworICAgIGlmIChodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1trXSAhPSAwKSB7CisgICAgICArK2NvdW50OworICAgICAgaWYgKGNvdW50ID4gMSkgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGsgPSAwOyBrIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9sczsgKytrKSB7CisgICAgaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNba10gPSAwOworICAgIGh1ZmZtYW5fY29kZS0+Y29kZXNba10gPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVUb0JpdE1hc2soCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgY29uc3QgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgdG9rZW5zLCBjb25zdCBpbnQgbnVtX3Rva2VucywKKyAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV90b2tlbnM7ICsraSkgeworICAgIGNvbnN0IGludCBpeCA9IHRva2Vuc1tpXS5jb2RlOworICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0gdG9rZW5zW2ldLmV4dHJhX2JpdHM7CisgICAgVlA4TFB1dEJpdHMoYncsIGh1ZmZtYW5fY29kZS0+Y29kZXNbaXhdLCBodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1tpeF0pOworICAgIHN3aXRjaCAoaXgpIHsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBleHRyYV9iaXRzLCAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE3OgorICAgICAgICBWUDhMUHV0Qml0cyhidywgZXh0cmFfYml0cywgMyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxODoKKyAgICAgICAgVlA4TFB1dEJpdHMoYncsIGV4dHJhX2JpdHMsIDcpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8gJ2h1ZmZfdHJlZScgYW5kICd0b2tlbnMnIGFyZSBwcmUtYWxsb2FjdGVkIGJ1ZmZlcnMuCitzdGF0aWMgdm9pZCBTdG9yZUZ1bGxIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpIHsKKyAgdWludDhfdCBjb2RlX2xlbmd0aF9iaXRkZXB0aFtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgdWludDE2X3QgY29kZV9sZW5ndGhfYml0ZGVwdGhfc3ltYm9sc1tDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgY29uc3QgaW50IG1heF90b2tlbnMgPSB0cmVlLT5udW1fc3ltYm9sczsKKyAgaW50IG51bV90b2tlbnM7CisgIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGU7CisgIGh1ZmZtYW5fY29kZS5udW1fc3ltYm9scyA9IENPREVfTEVOR1RIX0NPREVTOworICBodWZmbWFuX2NvZGUuY29kZV9sZW5ndGhzID0gY29kZV9sZW5ndGhfYml0ZGVwdGg7CisgIGh1ZmZtYW5fY29kZS5jb2RlcyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHM7CisKKyAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworICBudW1fdG9rZW5zID0gVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZSh0cmVlLCB0b2tlbnMsIG1heF90b2tlbnMpOworICB7CisgICAgdWludDMyX3QgaGlzdG9ncmFtW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICAgIHVpbnQ4X3QgYnVmX3JsZVtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rva2VuczsgKytpKSB7CisgICAgICArK2hpc3RvZ3JhbVt0b2tlbnNbaV0uY29kZV07CisgICAgfQorCisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvZ3JhbSwgNywgYnVmX3JsZSwgaHVmZl90cmVlLCAmaHVmZm1hbl9jb2RlKTsKKyAgfQorCisgIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKGJ3LCBjb2RlX2xlbmd0aF9iaXRkZXB0aCk7CisgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woJmh1ZmZtYW5fY29kZSk7CisgIHsKKyAgICBpbnQgdHJhaWxpbmdfemVyb19iaXRzID0gMDsKKyAgICBpbnQgdHJpbW1lZF9sZW5ndGggPSBudW1fdG9rZW5zOworICAgIGludCB3cml0ZV90cmltbWVkX2xlbmd0aDsKKyAgICBpbnQgbGVuZ3RoOworICAgIGludCBpID0gbnVtX3Rva2VuczsKKyAgICB3aGlsZSAoaS0tID4gMCkgeworICAgICAgY29uc3QgaW50IGl4ID0gdG9rZW5zW2ldLmNvZGU7CisgICAgICBpZiAoaXggPT0gMCB8fCBpeCA9PSAxNyB8fCBpeCA9PSAxOCkgeworICAgICAgICAtLXRyaW1tZWRfbGVuZ3RoOyAgIC8vIGRpc2NvdW50IHRyYWlsaW5nIHplcm9zCisgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSBjb2RlX2xlbmd0aF9iaXRkZXB0aFtpeF07CisgICAgICAgIGlmIChpeCA9PSAxNykgeworICAgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSAzOworICAgICAgICB9IGVsc2UgaWYgKGl4ID09IDE4KSB7CisgICAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IDc7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZV90cmltbWVkX2xlbmd0aCA9ICh0cmltbWVkX2xlbmd0aCA+IDEgJiYgdHJhaWxpbmdfemVyb19iaXRzID4gMTIpOworICAgIGxlbmd0aCA9IHdyaXRlX3RyaW1tZWRfbGVuZ3RoID8gdHJpbW1lZF9sZW5ndGggOiBudW1fdG9rZW5zOworICAgIFZQOExQdXRCaXRzKGJ3LCB3cml0ZV90cmltbWVkX2xlbmd0aCwgMSk7CisgICAgaWYgKHdyaXRlX3RyaW1tZWRfbGVuZ3RoKSB7CisgICAgICBpZiAodHJpbW1lZF9sZW5ndGggPT0gMikgeworICAgICAgICBWUDhMUHV0Qml0cyhidywgMCwgMyArIDIpOyAgICAgLy8gbmJpdHBhaXJzPTEsIHRyaW1tZWRfbGVuZ3RoPTIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBuYml0cyA9IEJpdHNMb2cyRmxvb3IodHJpbW1lZF9sZW5ndGggLSAyKTsKKyAgICAgICAgY29uc3QgaW50IG5iaXRwYWlycyA9IG5iaXRzIC8gMiArIDE7CisgICAgICAgIGFzc2VydCh0cmltbWVkX2xlbmd0aCA+IDIpOworICAgICAgICBhc3NlcnQobmJpdHBhaXJzIC0gMSA8IDgpOworICAgICAgICBWUDhMUHV0Qml0cyhidywgbmJpdHBhaXJzIC0gMSwgMyk7CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCB0cmltbWVkX2xlbmd0aCAtIDIsIG5iaXRwYWlycyAqIDIpOworICAgICAgfQorICAgIH0KKyAgICBTdG9yZUh1ZmZtYW5UcmVlVG9CaXRNYXNrKGJ3LCB0b2tlbnMsIGxlbmd0aCwgJmh1ZmZtYW5fY29kZSk7CisgIH0KK30KKworLy8gJ2h1ZmZfdHJlZScgYW5kICd0b2tlbnMnIGFyZSBwcmUtYWxsb2FjdGVkIGJ1ZmZlcnMuCitzdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7CisgIGludCBpOworICBpbnQgY291bnQgPSAwOworICBpbnQgc3ltYm9sc1syXSA9IHsgMCwgMCB9OworICBjb25zdCBpbnQga01heEJpdHMgPSA4OworICBjb25zdCBpbnQga01heFN5bWJvbCA9IDEgPDwga01heEJpdHM7CisKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGEgc21hbGwgdHJlZS4KKyAgZm9yIChpID0gMDsgaSA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHMgJiYgY291bnQgPCAzOyArK2kpIHsKKyAgICBpZiAoaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNbaV0gIT0gMCkgeworICAgICAgaWYgKGNvdW50IDwgMikgc3ltYm9sc1tjb3VudF0gPSBpOworICAgICAgKytjb3VudDsKKyAgICB9CisgIH0KKworICBpZiAoY291bnQgPT0gMCkgeyAgIC8vIGVtaXQgbWluaW1hbCB0cmVlIGZvciBlbXB0eSBjYXNlcworICAgIC8vIGJpdHM6IHNtYWxsIHRyZWUgbWFya2VyOiAxLCBjb3VudC0xOiAwLCBsYXJnZSA4LWJpdCBjb2RlOiAwLCBjb2RlOiAwCisgICAgVlA4TFB1dEJpdHMoYncsIDB4MDEsIDQpOworICB9IGVsc2UgaWYgKGNvdW50IDw9IDIgJiYgc3ltYm9sc1swXSA8IGtNYXhTeW1ib2wgJiYgc3ltYm9sc1sxXSA8IGtNYXhTeW1ib2wpIHsKKyAgICBWUDhMUHV0Qml0cyhidywgMSwgMSk7ICAvLyBTbWFsbCB0cmVlIG1hcmtlciB0byBlbmNvZGUgMSBvciAyIHN5bWJvbHMuCisgICAgVlA4TFB1dEJpdHMoYncsIGNvdW50IC0gMSwgMSk7CisgICAgaWYgKHN5bWJvbHNbMF0gPD0gMSkgeworICAgICAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOyAgLy8gQ29kZSBiaXQgZm9yIHNtYWxsICgxIGJpdCkgc3ltYm9sIHZhbHVlLgorICAgICAgVlA4TFB1dEJpdHMoYncsIHN5bWJvbHNbMF0sIDEpOworICAgIH0gZWxzZSB7CisgICAgICBWUDhMUHV0Qml0cyhidywgMSwgMSk7CisgICAgICBWUDhMUHV0Qml0cyhidywgc3ltYm9sc1swXSwgOCk7CisgICAgfQorICAgIGlmIChjb3VudCA9PSAyKSB7CisgICAgICBWUDhMUHV0Qml0cyhidywgc3ltYm9sc1sxXSwgOCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFN0b3JlRnVsbEh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgaHVmZm1hbl9jb2RlKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBXcml0ZUh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2luZGV4KSB7CisgIGNvbnN0IGludCBkZXB0aCA9IGNvZGUtPmNvZGVfbGVuZ3Roc1tjb2RlX2luZGV4XTsKKyAgY29uc3QgaW50IHN5bWJvbCA9IGNvZGUtPmNvZGVzW2NvZGVfaW5kZXhdOworICBWUDhMUHV0Qml0cyhidywgc3ltYm9sLCBkZXB0aCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdyaXRlSHVmZm1hbkNvZGVXaXRoRXh0cmFCaXRzKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZSwKKyAgICBpbnQgY29kZV9pbmRleCwKKyAgICBpbnQgYml0cywKKyAgICBpbnQgbl9iaXRzKSB7CisgIGNvbnN0IGludCBkZXB0aCA9IGNvZGUtPmNvZGVfbGVuZ3Roc1tjb2RlX2luZGV4XTsKKyAgY29uc3QgaW50IHN5bWJvbCA9IGNvZGUtPmNvZGVzW2NvZGVfaW5kZXhdOworICBWUDhMUHV0Qml0cyhidywgKGJpdHMgPDwgZGVwdGgpIHwgc3ltYm9sLCBkZXB0aCArIG5fYml0cyk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBTdG9yZUltYWdlVG9CaXRNYXNrKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgd2lkdGgsIGludCBoaXN0b19iaXRzLAorICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgY29uc3QgdWludDE2X3QqIGhpc3RvZ3JhbV9zeW1ib2xzLAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgeworICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpIDogMTsKKyAgY29uc3QgaW50IHRpbGVfbWFzayA9IChoaXN0b19iaXRzID09IDApID8gMCA6IC0oMSA8PCBoaXN0b19iaXRzKTsKKyAgLy8geCBhbmQgeSB0cmFjZSB0aGUgcG9zaXRpb24gaW4gdGhlIGltYWdlLgorICBpbnQgeCA9IDA7CisgIGludCB5ID0gMDsKKyAgaW50IHRpbGVfeCA9IHggJiB0aWxlX21hc2s7CisgIGludCB0aWxlX3kgPSB5ICYgdGlsZV9tYXNrOworICBpbnQgaGlzdG9ncmFtX2l4ID0gaGlzdG9ncmFtX3N5bWJvbHNbMF07CisgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gYy5jdXJfcG9zOworICAgIGlmICgodGlsZV94ICE9ICh4ICYgdGlsZV9tYXNrKSkgfHwgKHRpbGVfeSAhPSAoeSAmIHRpbGVfbWFzaykpKSB7CisgICAgICB0aWxlX3ggPSB4ICYgdGlsZV9tYXNrOworICAgICAgdGlsZV95ID0geSAmIHRpbGVfbWFzazsKKyAgICAgIGhpc3RvZ3JhbV9peCA9IGhpc3RvZ3JhbV9zeW1ib2xzWyh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggPj4gaGlzdG9fYml0cyldOworICAgICAgY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKKyAgICB9CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3JkZXJbXSA9IHsgMSwgMiwgMCwgMyB9OworICAgICAgaW50IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7CisgICAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5TGl0ZXJhbCh2LCBvcmRlcltrXSk7CisgICAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgaywgY29kZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChQaXhPckNvcHlJc0NhY2hlSWR4KHYpKSB7CisgICAgICBjb25zdCBpbnQgY29kZSA9IFBpeE9yQ29weUNhY2hlSWR4KHYpOworICAgICAgY29uc3QgaW50IGxpdGVyYWxfaXggPSAyNTYgKyBOVU1fTEVOR1RIX0NPREVTICsgY29kZTsKKyAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzLCBsaXRlcmFsX2l4KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGJpdHMsIG5fYml0czsKKyAgICAgIGludCBjb2RlOworCisgICAgICBjb25zdCBpbnQgZGlzdGFuY2UgPSBQaXhPckNvcHlEaXN0YW5jZSh2KTsKKyAgICAgIFZQOExQcmVmaXhFbmNvZGUodi0+bGVuLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOworICAgICAgV3JpdGVIdWZmbWFuQ29kZVdpdGhFeHRyYUJpdHMoYncsIGNvZGVzLCAyNTYgKyBjb2RlLCBiaXRzLCBuX2JpdHMpOworCisgICAgICAvLyBEb24ndCB3cml0ZSB0aGUgZGlzdGFuY2Ugd2l0aCB0aGUgZXh0cmEgYml0cyBjb2RlIHNpbmNlCisgICAgICAvLyB0aGUgZGlzdGFuY2UgY2FuIGJlIHVwIHRvIDE4IGJpdHMgb2YgZXh0cmEgYml0cywgYW5kIHRoZSBwcmVmaXgKKyAgICAgIC8vIDE1IGJpdHMsIHRvdGFsaW5nIHRvIDMzLCBhbmQgb3VyIFB1dEJpdHMgb25seSBzdXBwb3J0cyB1cCB0byAzMiBiaXRzLgorICAgICAgVlA4TFByZWZpeEVuY29kZShkaXN0YW5jZSwgJmNvZGUsICZuX2JpdHMsICZiaXRzKTsKKyAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgNCwgY29kZSk7CisgICAgICBWUDhMUHV0Qml0cyhidywgYml0cywgbl9iaXRzKTsKKyAgICB9CisgICAgeCArPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgd2hpbGUgKHggPj0gd2lkdGgpIHsKKyAgICAgIHggLT0gd2lkdGg7CisgICAgICArK3k7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKyAgcmV0dXJuIGJ3LT5lcnJvcl8gPyBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkgOiBWUDhfRU5DX09LOworfQorCisvLyBTcGVjaWFsIGNhc2Ugb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIGZvciBjYWNoZS1iaXRzPTAsIGhpc3RvX2JpdHM9MzEKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVJbWFnZU5vSHVmZm1hbihWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCkgeworICBpbnQgaTsKKyAgaW50IG1heF90b2tlbnMgPSAwOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBWUDhMQmFja3dhcmRSZWZzKiByZWZzOworICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMgPSBOVUxMOworICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2Rlc1s1XSA9IHsgeyAwLCBOVUxMLCBOVUxMIH0gfTsKKyAgY29uc3QgdWludDE2X3QgaGlzdG9ncmFtX3N5bWJvbHNbMV0gPSB7IDAgfTsgICAgLy8gb25seSBvbmUgdHJlZSwgb25lIHN5bWJvbAorICBpbnQgY2FjaGVfYml0cyA9IDA7CisgIFZQOExIaXN0b2dyYW1TZXQqIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUgPSAoSHVmZm1hblRyZWUqKVdlYlBTYWZlTWFsbG9jKAorICAgICAgICAzVUxMICogQ09ERV9MRU5HVEhfQ09ERVMsIHNpemVvZigqaHVmZl90cmVlKSk7CisgIGlmIChodWZmX3RyZWUgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgorICBpZiAoIVZQOExIYXNoQ2hhaW5GaWxsKGhhc2hfY2hhaW4sIHF1YWxpdHksIGFyZ2IsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICByZWZzID0gVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTFo3N1N0YW5kYXJkIHwga0xaNzdSTEUsICZjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluLCByZWZzX3RtcDEsIHJlZnNfdG1wMik7CisgIGlmIChyZWZzID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBoaXN0b2dyYW1faW1hZ2UgPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoMSwgY2FjaGVfYml0cyk7CisgIGlmIChoaXN0b2dyYW1faW1hZ2UgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlIGFuZCBzeW1ib2xzIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KKyAgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhyZWZzLCBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbMF0pOworCisgIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCisgIGFzc2VydChoaXN0b2dyYW1faW1hZ2UtPnNpemUgPT0gMSk7CisgIGlmICghR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcyhoaXN0b2dyYW1faW1hZ2UsIGh1ZmZtYW5fY29kZXMpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBObyBjb2xvciBjYWNoZSwgbm8gSHVmZm1hbiBpbWFnZS4KKyAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworCisgIC8vIEZpbmQgbWF4aW11bSBudW1iZXIgb2Ygc3ltYm9scyBmb3IgdGhlIGh1ZmZtYW4gdHJlZS1zZXQuCisgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgaWYgKG1heF90b2tlbnMgPCBjb2Rlcy0+bnVtX3N5bWJvbHMpIHsKKyAgICAgIG1heF90b2tlbnMgPSBjb2Rlcy0+bnVtX3N5bWJvbHM7CisgICAgfQorICB9CisKKyAgdG9rZW5zID0gKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKG1heF90b2tlbnMsIHNpemVvZigqdG9rZW5zKSk7CisgIGlmICh0b2tlbnMgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gU3RvcmUgSHVmZm1hbiBjb2Rlcy4KKyAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICBTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgY29kZXMpOworICAgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woY29kZXMpOworICB9CisKKyAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgorICBlcnIgPSBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgMCwgcmVmcywgaGlzdG9ncmFtX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9jb2Rlcyk7CisKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgIFdlYlBTYWZlRnJlZShodWZmX3RyZWUpOworICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlc1swXS5jb2Rlcyk7CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVJbWFnZUludGVybmFsKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzIHJlZnNfYXJyYXlbM10sIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsIGludCB1c2VfY2FjaGUsCisgICAgY29uc3QgQ3J1bmNoQ29uZmlnKiBjb25zdCBjb25maWcsIGludCogY2FjaGVfYml0cywgaW50IGhpc3RvZ3JhbV9iaXRzLAorICAgIHNpemVfdCBpbml0X2J5dGVfcG9zaXRpb24sIGludCogY29uc3QgaGRyX3NpemUsIGludCogY29uc3QgZGF0YV9zaXplKSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IHVpbnQzMl90IGhpc3RvZ3JhbV9pbWFnZV94eXNpemUgPQorICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSAqCisgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKTsKKyAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0gTlVMTDsKKyAgVlA4TEhpc3RvZ3JhbSogdG1wX2hpc3RvID0gTlVMTDsKKyAgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gMDsKKyAgc2l6ZV90IGJpdF9hcnJheV9zaXplID0gMDsKKyAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSA9IChIdWZmbWFuVHJlZSopV2ViUFNhZmVNYWxsb2MoCisgICAgICAzVUxMICogQ09ERV9MRU5HVEhfQ09ERVMsIHNpemVvZigqaHVmZl90cmVlKSk7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucyA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlQ29kZSogaHVmZm1hbl9jb2RlcyA9IE5VTEw7CisgIFZQOExCYWNrd2FyZFJlZnMqIHJlZnNfYmVzdDsKKyAgVlA4TEJhY2t3YXJkUmVmcyogcmVmc190bXA7CisgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyA9CisgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGhpc3RvZ3JhbV9pbWFnZV94eXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX3N5bWJvbHMpKTsKKyAgaW50IGx6NzdzX2lkeDsKKyAgVlA4TEJpdFdyaXRlciBid19pbml0ID0gKmJ3LCBid19iZXN0OworICBpbnQgaGRyX3NpemVfdG1wOworICBhc3NlcnQoaGlzdG9ncmFtX2JpdHMgPj0gTUlOX0hVRkZNQU5fQklUUyk7CisgIGFzc2VydChoaXN0b2dyYW1fYml0cyA8PSBNQVhfSFVGRk1BTl9CSVRTKTsKKyAgYXNzZXJ0KGhkcl9zaXplICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworCisgIGlmIChoaXN0b2dyYW1fc3ltYm9scyA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAodXNlX2NhY2hlKSB7CisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHplcm8sIGl0IGhhcyBiZWVuIHNldCBkdXJpbmcgdGhlCisgICAgLy8gcGFsZXR0ZSBhbmFseXNpcy4KKyAgICBpZiAoKmNhY2hlX2JpdHMgPT0gMCkgKmNhY2hlX2JpdHMgPSBNQVhfQ09MT1JfQ0FDSEVfQklUUzsKKyAgfSBlbHNlIHsKKyAgICAqY2FjaGVfYml0cyA9IDA7CisgIH0KKyAgLy8gJ2Jlc3RfcmVmcycgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgYmVzdCBiYWNrd2FyZCByZWZzIGFuZCBwb2ludHMgdG8gb25lCisgIC8vIG9mIHJlZnNfYXJyYXlbMF0gb3IgcmVmc19hcnJheVsxXS4KKyAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgorICBpZiAoaHVmZl90cmVlID09IE5VTEwgfHwKKyAgICAgICFWUDhMSGFzaENoYWluRmlsbChoYXNoX2NoYWluLCBxdWFsaXR5LCBhcmdiLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQpIHx8CisgICAgICAhVlA4TEJpdFdyaXRlckluaXQoJmJ3X2Jlc3QsIDApIHx8CisgICAgICAoY29uZmlnLT5sejc3c190eXBlc190b190cnlfc2l6ZV8gPiAxICYmCisgICAgICAgIVZQOExCaXRXcml0ZXJDbG9uZShidywgJmJ3X2Jlc3QpKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGZvciAobHo3N3NfaWR4ID0gMDsgbHo3N3NfaWR4IDwgY29uZmlnLT5sejc3c190eXBlc190b190cnlfc2l6ZV87CisgICAgICAgKytsejc3c19pZHgpIHsKKyAgICByZWZzX2Jlc3QgPSBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgICAgICB3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCBsb3dfZWZmb3J0LAorICAgICAgICBjb25maWctPmx6NzdzX3R5cGVzX3RvX3RyeV9bbHo3N3NfaWR4XSwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwKKyAgICAgICAgJnJlZnNfYXJyYXlbMF0sICZyZWZzX2FycmF5WzFdKTsKKyAgICBpZiAocmVmc19iZXN0ID09IE5VTEwpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIEtlZXAgdGhlIGJlc3QgcmVmZXJlbmNlcyBhc2lkZSBhbmQgdXNlIHRoZSBvdGhlciBlbGVtZW50IGZyb20gdGhlIGZpcnN0CisgICAgLy8gdHdvIGFzIGEgdGVtcG9yYXJ5IGZvciBsYXRlciB1c2FnZS4KKyAgICByZWZzX3RtcCA9ICZyZWZzX2FycmF5W3JlZnNfYmVzdCA9PSAmcmVmc19hcnJheVswXSA/IDEgOiAwXTsKKworICAgIGhpc3RvZ3JhbV9pbWFnZSA9CisgICAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2VfeHlzaXplLCAqY2FjaGVfYml0cyk7CisgICAgdG1wX2hpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKCpjYWNoZV9iaXRzKTsKKyAgICBpZiAoaGlzdG9ncmFtX2ltYWdlID09IE5VTEwgfHwgdG1wX2hpc3RvID09IE5VTEwpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlIGFuZCBzeW1ib2xzIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KKyAgICBpZiAoIVZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyh3aWR0aCwgaGVpZ2h0LCByZWZzX2Jlc3QsIHF1YWxpdHksIGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX2JpdHMsICpjYWNoZV9iaXRzLCBoaXN0b2dyYW1faW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2hpc3RvLCBoaXN0b2dyYW1fc3ltYm9scykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCisgICAgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBoaXN0b2dyYW1faW1hZ2UtPnNpemU7CisgICAgYml0X2FycmF5X3NpemUgPSA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7CisgICAgaHVmZm1hbl9jb2RlcyA9IChIdWZmbWFuVHJlZUNvZGUqKVdlYlBTYWZlQ2FsbG9jKGJpdF9hcnJheV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKKyAgICAvLyBOb3RlOiBzb21lIGhpc3RvZ3JhbV9pbWFnZSBlbnRyaWVzIG1heSBwb2ludCB0byB0bXBfaGlzdG9zW10sIHNvIHRoZQorICAgIC8vIGxhdHRlciBuZWVkIHRvIG91dGxpdmUgdGhlIGZvbGxvd2luZyBjYWxsIHRvIEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoKS4KKyAgICBpZiAoaHVmZm1hbl9jb2RlcyA9PSBOVUxMIHx8CisgICAgICAgICFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIEZyZWUgY29tYmluZWQgaGlzdG9ncmFtcy4KKyAgICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICAgIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7CisKKyAgICAvLyBGcmVlIHNjcmF0Y2ggaGlzdG9ncmFtcy4KKyAgICBWUDhMRnJlZUhpc3RvZ3JhbSh0bXBfaGlzdG8pOworICAgIHRtcF9oaXN0byA9IE5VTEw7CisKKyAgICAvLyBDb2xvciBDYWNoZSBwYXJhbWV0ZXJzLgorICAgIGlmICgqY2FjaGVfYml0cyA+IDApIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAxLCAxKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAqY2FjaGVfYml0cywgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAwLCAxKTsKKyAgICB9CisKKyAgICAvLyBIdWZmbWFuIGltYWdlICsgbWV0YSBodWZmbWFuLgorICAgIHsKKyAgICAgIGNvbnN0IGludCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UgPSAoaGlzdG9ncmFtX2ltYWdlX3NpemUgPiAxKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UsIDEpOworICAgICAgaWYgKHdyaXRlX2hpc3RvZ3JhbV9pbWFnZSkgeworICAgICAgICB1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtX2FyZ2IgPQorICAgICAgICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhoaXN0b2dyYW1faW1hZ2VfeHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhpc3RvZ3JhbV9hcmdiKSk7CisgICAgICAgIGludCBtYXhfaW5kZXggPSAwOworICAgICAgICB1aW50MzJfdCBpOworICAgICAgICBpZiAoaGlzdG9ncmFtX2FyZ2IgPT0gTlVMTCkgeworICAgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2VfeHlzaXplOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBpbnQgc3ltYm9sX2luZGV4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaV0gJiAweGZmZmY7CisgICAgICAgICAgaGlzdG9ncmFtX2FyZ2JbaV0gPSAoc3ltYm9sX2luZGV4IDw8IDgpOworICAgICAgICAgIGlmIChzeW1ib2xfaW5kZXggPj0gbWF4X2luZGV4KSB7CisgICAgICAgICAgICBtYXhfaW5kZXggPSBzeW1ib2xfaW5kZXggKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IG1heF9pbmRleDsKKworICAgICAgICBWUDhMUHV0Qml0cyhidywgaGlzdG9ncmFtX2JpdHMgLSAyLCAzKTsKKyAgICAgICAgZXJyID0gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oCisgICAgICAgICAgICBidywgaGlzdG9ncmFtX2FyZ2IsIGhhc2hfY2hhaW4sIHJlZnNfdG1wLCAmcmVmc19hcnJheVsyXSwKKyAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b2dyYW1fYml0cyksCisgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKSwgcXVhbGl0eSwgbG93X2VmZm9ydCk7CisgICAgICAgIFdlYlBTYWZlRnJlZShoaXN0b2dyYW1fYXJnYik7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdG9yZSBIdWZmbWFuIGNvZGVzLgorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IG1heF90b2tlbnMgPSAwOworICAgICAgLy8gRmluZCBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xzIGZvciB0aGUgaHVmZm1hbiB0cmVlLXNldC4KKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgICAgIGlmIChtYXhfdG9rZW5zIDwgY29kZXMtPm51bV9zeW1ib2xzKSB7CisgICAgICAgICAgbWF4X3Rva2VucyA9IGNvZGVzLT5udW1fc3ltYm9sczsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG9rZW5zID0gKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKG1heF90b2tlbnMsIHNpemVvZigqdG9rZW5zKSk7CisgICAgICBpZiAodG9rZW5zID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICAgICAgU3RvcmVIdWZmbWFuQ29kZShidywgaHVmZl90cmVlLCB0b2tlbnMsIGNvZGVzKTsKKyAgICAgICAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbChjb2Rlcyk7CisgICAgICB9CisgICAgfQorICAgIC8vIFN0b3JlIGFjdHVhbCBsaXRlcmFscy4KKyAgICBoZHJfc2l6ZV90bXAgPSAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gaW5pdF9ieXRlX3Bvc2l0aW9uKTsKKyAgICBlcnIgPSBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgaGlzdG9ncmFtX2JpdHMsIHJlZnNfYmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9zeW1ib2xzLCBodWZmbWFuX2NvZGVzKTsKKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzbWFsbGVzdCBpbWFnZSBzbyBmYXIuCisgICAgaWYgKGx6NzdzX2lkeCA9PSAwIHx8CisgICAgICAgIFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgPCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJmJ3X2Jlc3QpKSB7CisgICAgICAqaGRyX3NpemUgPSBoZHJfc2l6ZV90bXA7CisgICAgICAqZGF0YV9zaXplID0KKyAgICAgICAgICAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gaW5pdF9ieXRlX3Bvc2l0aW9uIC0gKmhkcl9zaXplKTsKKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBiaXQgd3JpdGVyIGZvciB0aGUgZm9sbG93aW5nIGl0ZXJhdGlvbiBpZiBhbnkuCisgICAgaWYgKGNvbmZpZy0+bHo3N3NfdHlwZXNfdG9fdHJ5X3NpemVfID4gMSkgVlA4TEJpdFdyaXRlclJlc2V0KCZid19pbml0LCBidyk7CisgICAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgICAgdG9rZW5zID0gTlVMTDsKKyAgICBpZiAoaHVmZm1hbl9jb2RlcyAhPSBOVUxMKSB7CisgICAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcy0+Y29kZXMpOworICAgICAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXMpOworICAgICAgaHVmZm1hbl9jb2RlcyA9IE5VTEw7CisgICAgfQorICB9CisgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgIFdlYlBTYWZlRnJlZShodWZmX3RyZWUpOworICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICBWUDhMRnJlZUhpc3RvZ3JhbSh0bXBfaGlzdG8pOworICBpZiAoaHVmZm1hbl9jb2RlcyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXMtPmNvZGVzKTsKKyAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcyk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGhpc3RvZ3JhbV9zeW1ib2xzKTsKKyAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJmJ3X2Jlc3QpOworICByZXR1cm4gZXJyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworCitzdGF0aWMgdm9pZCBBcHBseVN1YnRyYWN0R3JlZW4oVlA4TEVuY29kZXIqIGNvbnN0IGVuYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIFZQOExQdXRCaXRzKGJ3LCBUUkFOU0ZPUk1fUFJFU0VOVCwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBTVUJUUkFDVF9HUkVFTiwgMik7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQoZW5jLT5hcmdiXywgd2lkdGggKiBoZWlnaHQpOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQXBwbHlQcmVkaWN0RmlsdGVyKGNvbnN0IFZQOExFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IHByZWRfYml0cyA9IGVuYy0+dHJhbnNmb3JtX2JpdHNfOworICBjb25zdCBpbnQgdHJhbnNmb3JtX3dpZHRoID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHByZWRfYml0cyk7CisgIGNvbnN0IGludCB0cmFuc2Zvcm1faGVpZ2h0ID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBwcmVkX2JpdHMpOworICAvLyB3ZSBkaXNhYmxlIG5lYXItbG9zc2xlc3MgcXVhbnRpemF0aW9uIGlmIHBhbGV0dGUgaXMgdXNlZC4KKyAgY29uc3QgaW50IG5lYXJfbG9zc2xlc3Nfc3RyZW5ndGggPSBlbmMtPnVzZV9wYWxldHRlXyA/IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVuYy0+Y29uZmlnXy0+bmVhcl9sb3NzbGVzczsKKworICBWUDhMUmVzaWR1YWxJbWFnZSh3aWR0aCwgaGVpZ2h0LCBwcmVkX2JpdHMsIGxvd19lZmZvcnQsIGVuYy0+YXJnYl8sCisgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl9zY3JhdGNoXywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCisgICAgICAgICAgICAgICAgICAgIG5lYXJfbG9zc2xlc3Nfc3RyZW5ndGgsIGVuYy0+Y29uZmlnXy0+ZXhhY3QsCisgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgUFJFRElDVE9SX1RSQU5TRk9STSwgMik7CisgIGFzc2VydChwcmVkX2JpdHMgPj0gMik7CisgIFZQOExQdXRCaXRzKGJ3LCBwcmVkX2JpdHMgLSAyLCAzKTsKKyAgcmV0dXJuIEVuY29kZUltYWdlTm9IdWZmbWFuKAorICAgICAgYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLCAoVlA4TEhhc2hDaGFpbiopJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopJmVuYy0+cmVmc19bMF0sICAvLyBjYXN0IGNvbnN0IGF3YXkKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1sxXSwgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LAorICAgICAgcXVhbGl0eSwgbG93X2VmZm9ydCk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IGludCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKKyAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOworICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzKTsKKworICBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl8sIGVuYy0+dHJhbnNmb3JtX2RhdGFfKTsKKyAgVlA4TFB1dEJpdHMoYncsIFRSQU5TRk9STV9QUkVTRU5ULCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIENST1NTX0NPTE9SX1RSQU5TRk9STSwgMik7CisgIGFzc2VydChjY29sb3JfdHJhbnNmb3JtX2JpdHMgPj0gMik7CisgIFZQOExQdXRCaXRzKGJ3LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgLSAyLCAzKTsKKyAgcmV0dXJuIEVuY29kZUltYWdlTm9IdWZmbWFuKAorICAgICAgYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLCAoVlA4TEhhc2hDaGFpbiopJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopJmVuYy0+cmVmc19bMF0sICAvLyBjYXN0IGNvbnN0IGF3YXkKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1sxXSwgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LAorICAgICAgcXVhbGl0eSwgbG93X2VmZm9ydCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBXcml0ZVJpZmZIZWFkZXIoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSwgc2l6ZV90IHZwOGxfc2l6ZSkgeworICB1aW50OF90IHJpZmZbUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgVlA4TF9TSUdOQVRVUkVfU0laRV0gPSB7CisgICAgJ1InLCAnSScsICdGJywgJ0YnLCAwLCAwLCAwLCAwLCAnVycsICdFJywgJ0InLCAnUCcsCisgICAgJ1YnLCAnUCcsICc4JywgJ0wnLCAwLCAwLCAwLCAwLCBWUDhMX01BR0lDX0JZVEUsCisgIH07CisgIFB1dExFMzIocmlmZiArIFRBR19TSVpFLCAodWludDMyX3QpcmlmZl9zaXplKTsKKyAgUHV0TEUzMihyaWZmICsgUklGRl9IRUFERVJfU0laRSArIFRBR19TSVpFLCAodWludDMyX3QpdnA4bF9zaXplKTsKKyAgaWYgKCFwaWMtPndyaXRlcihyaWZmLCBzaXplb2YocmlmZiksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVJbWFnZVNpemUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aCAtIDE7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodCAtIDE7CisgIGFzc2VydCh3aWR0aCA8IFdFQlBfTUFYX0RJTUVOU0lPTiAmJiBoZWlnaHQgPCBXRUJQX01BWF9ESU1FTlNJT04pOworCisgIFZQOExQdXRCaXRzKGJ3LCB3aWR0aCwgVlA4TF9JTUFHRV9TSVpFX0JJVFMpOworICBWUDhMUHV0Qml0cyhidywgaGVpZ2h0LCBWUDhMX0lNQUdFX1NJWkVfQklUUyk7CisgIHJldHVybiAhYnctPmVycm9yXzsKK30KKworc3RhdGljIGludCBXcml0ZVJlYWxBbHBoYUFuZFZlcnNpb24oVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBoYXNfYWxwaGEpIHsKKyAgVlA4TFB1dEJpdHMoYncsIGhhc19hbHBoYSwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBWUDhMX1ZFUlNJT04sIFZQOExfVkVSU0lPTl9CSVRTKTsKKyAgcmV0dXJuICFidy0+ZXJyb3JfOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVJbWFnZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGNvZGVkX3NpemUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgd2VicGxsX2RhdGEgPSBWUDhMQml0V3JpdGVyRmluaXNoKGJ3KTsKKyAgY29uc3Qgc2l6ZV90IHdlYnBsbF9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKKyAgY29uc3Qgc2l6ZV90IHZwOGxfc2l6ZSA9IFZQOExfU0lHTkFUVVJFX1NJWkUgKyB3ZWJwbGxfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IHBhZCA9IHZwOGxfc2l6ZSAmIDE7CisgIGNvbnN0IHNpemVfdCByaWZmX3NpemUgPSBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgdnA4bF9zaXplICsgcGFkOworCisgIGVyciA9IFdyaXRlUmlmZkhlYWRlcihwaWMsIHJpZmZfc2l6ZSwgdnA4bF9zaXplKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIGlmICghcGljLT53cml0ZXIod2VicGxsX2RhdGEsIHdlYnBsbF9zaXplLCBwaWMpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmIChwYWQpIHsKKyAgICBjb25zdCB1aW50OF90IHBhZF9ieXRlWzFdID0geyAwIH07CisgICAgaWYgKCFwaWMtPndyaXRlcihwYWRfYnl0ZSwgMSwgcGljKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorICAqY29kZWRfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcmlmZl9zaXplOworICByZXR1cm4gVlA4X0VOQ19PSzsKKworIEVycm9yOgorICByZXR1cm4gZXJyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybUJ1ZmZlcihWUDhMRW5jb2RlciogY29uc3QgZW5jKSB7CisgIFdlYlBTYWZlRnJlZShlbmMtPnRyYW5zZm9ybV9tZW1fKTsKKyAgZW5jLT50cmFuc2Zvcm1fbWVtXyA9IE5VTEw7CisgIGVuYy0+dHJhbnNmb3JtX21lbV9zaXplXyA9IDA7Cit9CisKKy8vIEFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBhcmdiIChXIHggSCkgYnVmZmVyLCAyIHJvd3Mgb2YgY29udGV4dCBmb3IKKy8vIHByZWRpY3Rpb24gYW5kIHRyYW5zZm9ybSBkYXRhLgorLy8gRmxhZ3MgaW5mbHVlbmNpbmcgdGhlIG1lbW9yeSBhbGxvY2F0ZWQ6CisvLyAgZW5jLT50cmFuc2Zvcm1fYml0c18KKy8vICBlbmMtPnVzZV9wcmVkaWN0XywgZW5jLT51c2VfY3Jvc3NfY29sb3JfCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDY0X3QgaW1hZ2Vfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAvLyBWUDhMUmVzaWR1YWxJbWFnZSBuZWVkcyByb29tIGZvciAyIHNjYW5saW5lcyBvZiB1aW50MzIgcGl4ZWxzIHdpdGggYW4gZXh0cmEKKyAgLy8gcGl4ZWwgaW4gZWFjaCwgcGx1cyAyIHJlZ3VsYXIgc2NhbmxpbmVzIG9mIGJ5dGVzLgorICAvLyBUT0RPKHNrYWwpOiBDbGVhbiB1cCBieSB1c2luZyBhcml0aG1ldGljIGluIGJ5dGVzIGluc3RlYWQgb2Ygd29yZHMuCisgIGNvbnN0IHVpbnQ2NF90IGFyZ2Jfc2NyYXRjaF9zaXplID0KKyAgICAgIGVuYy0+dXNlX3ByZWRpY3RfCisgICAgICAgICAgPyAod2lkdGggKyAxKSAqIDIgKworICAgICAgICAgICAgKHdpZHRoICogMiArIHNpemVvZih1aW50MzJfdCkgLSAxKSAvIHNpemVvZih1aW50MzJfdCkKKyAgICAgICAgICA6IDA7CisgIGNvbnN0IHVpbnQ2NF90IHRyYW5zZm9ybV9kYXRhX3NpemUgPQorICAgICAgKGVuYy0+dXNlX3ByZWRpY3RfIHx8IGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykKKyAgICAgICAgICA/IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBlbmMtPnRyYW5zZm9ybV9iaXRzXykgKgorICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgZW5jLT50cmFuc2Zvcm1fYml0c18pCisgICAgICAgICAgOiAwOworICBjb25zdCB1aW50NjRfdCBtYXhfYWxpZ25tZW50X2luX3dvcmRzID0KKyAgICAgIChXRUJQX0FMSUdOX0NTVCArIHNpemVvZih1aW50MzJfdCkgLSAxKSAvIHNpemVvZih1aW50MzJfdCk7CisgIGNvbnN0IHVpbnQ2NF90IG1lbV9zaXplID0KKyAgICAgIGltYWdlX3NpemUgKyBtYXhfYWxpZ25tZW50X2luX3dvcmRzICsKKyAgICAgIGFyZ2Jfc2NyYXRjaF9zaXplICsgbWF4X2FsaWdubWVudF9pbl93b3JkcyArCisgICAgICB0cmFuc2Zvcm1fZGF0YV9zaXplOworICB1aW50MzJfdCogbWVtID0gZW5jLT50cmFuc2Zvcm1fbWVtXzsKKyAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbV9zaXplID4gZW5jLT50cmFuc2Zvcm1fbWVtX3NpemVfKSB7CisgICAgQ2xlYXJUcmFuc2Zvcm1CdWZmZXIoZW5jKTsKKyAgICBtZW0gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKG1lbV9zaXplLCBzaXplb2YoKm1lbSkpOworICAgIGlmIChtZW0gPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgZW5jLT50cmFuc2Zvcm1fbWVtXyA9IG1lbTsKKyAgICBlbmMtPnRyYW5zZm9ybV9tZW1fc2l6ZV8gPSAoc2l6ZV90KW1lbV9zaXplOworICAgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyTm9uZTsKKyAgfQorICBlbmMtPmFyZ2JfID0gbWVtOworICBtZW0gPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtICsgaW1hZ2Vfc2l6ZSk7CisgIGVuYy0+YXJnYl9zY3JhdGNoXyA9IG1lbTsKKyAgbWVtID0gKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSArIGFyZ2Jfc2NyYXRjaF9zaXplKTsKKyAgZW5jLT50cmFuc2Zvcm1fZGF0YV8gPSBtZW07CisKKyAgZW5jLT5jdXJyZW50X3dpZHRoXyA9IHdpZHRoOworIEVycm9yOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgTWFrZUlucHV0SW1hZ2VDb3B5KFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBpbnQgeTsKKyAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCB3aWR0aCwgaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyOworICBpZiAoZW5jLT5hcmdiX2NvbnRlbnRfID09IGtFbmNvZGVyQVJHQikgcmV0dXJuIFZQOF9FTkNfT0s7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIG1lbWNweShlbmMtPmFyZ2JfICsgeSAqIHdpZHRoLAorICAgICAgICAgICBwaWN0dXJlLT5hcmdiICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqZW5jLT5hcmdiXykpOworICB9CisgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyQVJHQjsKKyAgYXNzZXJ0KGVuYy0+Y3VycmVudF93aWR0aF8gPT0gd2lkdGgpOworICByZXR1cm4gVlA4X0VOQ19PSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBTZWFyY2hDb2xvck5vSWR4KGNvbnN0IHVpbnQzMl90IHNvcnRlZFtdLCB1aW50MzJfdCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGkpIHsKKyAgaW50IGxvdyA9IDA7CisgIGlmIChzb3J0ZWRbbG93XSA9PSBjb2xvcikgcmV0dXJuIGxvdzsgIC8vIGxvb3AgaW52YXJpYW50OiBzb3J0ZWRbbG93XSAhPSBjb2xvcgorICB3aGlsZSAoMSkgeworICAgIGNvbnN0IGludCBtaWQgPSAobG93ICsgaGkpID4+IDE7CisgICAgaWYgKHNvcnRlZFttaWRdID09IGNvbG9yKSB7CisgICAgICByZXR1cm4gbWlkOworICAgIH0gZWxzZSBpZiAoc29ydGVkW21pZF0gPCBjb2xvcikgeworICAgICAgbG93ID0gbWlkOworICAgIH0gZWxzZSB7CisgICAgICBoaSA9IG1pZDsKKyAgICB9CisgIH0KK30KKworI2RlZmluZSBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVggNAorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VhcmNoQ29sb3JHcmVlZHkoY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIHsKKyAgKHZvaWQpcGFsZXR0ZV9zaXplOworICBhc3NlcnQocGFsZXR0ZV9zaXplIDwgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYKTsKKyAgYXNzZXJ0KDMgPT0gQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYIC0gMSk7CisgIGlmIChjb2xvciA9PSBwYWxldHRlWzBdKSByZXR1cm4gMDsKKyAgaWYgKGNvbG9yID09IHBhbGV0dGVbMV0pIHJldHVybiAxOworICBpZiAoY29sb3IgPT0gcGFsZXR0ZVsyXSkgcmV0dXJuIDI7CisgIHJldHVybiAzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXBwbHlQYWxldHRlSGFzaDAodWludDMyX3QgY29sb3IpIHsKKyAgLy8gRm9jdXMgb24gdGhlIGdyZWVuIGNvbG9yLgorICByZXR1cm4gKGNvbG9yID4+IDgpICYgMHhmZjsKK30KKworI2RlZmluZSBQQUxFVFRFX0lOVl9TSVpFX0JJVFMgMTEKKyNkZWZpbmUgUEFMRVRURV9JTlZfU0laRSAoMSA8PCBQQUxFVFRFX0lOVl9TSVpFX0JJVFMpCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBcHBseVBhbGV0dGVIYXNoMSh1aW50MzJfdCBjb2xvcikgeworICAvLyBGb3JnZXQgYWJvdXQgYWxwaGEuCisgIHJldHVybiAoKHVpbnQzMl90KSgoY29sb3IgJiAweDAwZmZmZmZmdSkgKiA0MjIyMjQ0MDcxdWxsKSkgPj4KKyAgICAgICAgICgzMiAtIFBBTEVUVEVfSU5WX1NJWkVfQklUUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBcHBseVBhbGV0dGVIYXNoMih1aW50MzJfdCBjb2xvcikgeworICAvLyBGb3JnZXQgYWJvdXQgYWxwaGEuCisgIHJldHVybiAoKHVpbnQzMl90KSgoY29sb3IgJiAweDAwZmZmZmZmdSkgKiAoKDF1bGwgPDwgMzEpIC0gMSkpKSA+PgorICAgICAgICAgKDMyIC0gUEFMRVRURV9JTlZfU0laRV9CSVRTKTsKK30KKworLy8gU29ydCBwYWxldHRlIGluIGluY3JlYXNpbmcgb3JkZXIgYW5kIHByZXBhcmUgYW4gaW52ZXJzZSBtYXBwaW5nIGFycmF5Lgorc3RhdGljIHZvaWQgUHJlcGFyZU1hcFRvUGFsZXR0ZShjb25zdCB1aW50MzJfdCBwYWxldHRlW10sIGludCBudW1fY29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzb3J0ZWRbXSwgdWludDMyX3QgaWR4X21hcFtdKSB7CisgIGludCBpOworICBtZW1jcHkoc29ydGVkLCBwYWxldHRlLCBudW1fY29sb3JzICogc2l6ZW9mKCpzb3J0ZWQpKTsKKyAgcXNvcnQoc29ydGVkLCBudW1fY29sb3JzLCBzaXplb2YoKnNvcnRlZCksIFBhbGV0dGVDb21wYXJlQ29sb3JzRm9yUXNvcnQpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgKytpKSB7CisgICAgaWR4X21hcFtTZWFyY2hDb2xvck5vSWR4KHNvcnRlZCwgcGFsZXR0ZVtpXSwgbnVtX2NvbG9ycyldID0gaTsKKyAgfQorfQorCisvLyBVc2UgMSBwaXhlbCBjYWNoZSBmb3IgQVJHQiBwaXhlbHMuCisjZGVmaW5lIEFQUExZX1BBTEVUVEVfRk9SKENPTE9SX0lOREVYKSBkbyB7ICAgICAgICAgXAorICB1aW50MzJfdCBwcmV2X3BpeCA9IHBhbGV0dGVbMF07ICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgcHJldl9pZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IHNyY1t4XTsgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocGl4ICE9IHByZXZfcGl4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmV2X2lkeCA9IENPTE9SX0lOREVYOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJldl9waXggPSBwaXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG1wX3Jvd1t4XSA9IHByZXZfaWR4OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TEJ1bmRsZUNvbG9yTWFwKHRtcF9yb3csIHdpZHRoLCB4Yml0cywgZHN0KTsgXAorICAgIHNyYyArPSBzcmNfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gUmVtYXAgYXJnYiB2YWx1ZXMgaW4gc3JjW10gdG8gcGFja2VkIHBhbGV0dGVzIGVudHJpZXMgaW4gZHN0W10KKy8vIHVzaW5nICdyb3cnIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzaXplICd3aWR0aCcuCisvLyBXZSBhc3N1bWUgdGhhdCBhbGwgc3JjW10gdmFsdWVzIGhhdmUgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBwYWxldHRlLgorLy8gTm90ZTogc3JjW10gY2FuIGJlIHRoZSBzYW1lIGFzIGRzdFtdCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQXBwbHlQYWxldHRlKGNvbnN0IHVpbnQzMl90KiBzcmMsIHVpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIHVpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwYWxldHRlLCBpbnQgcGFsZXR0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4Yml0cykgeworICAvLyBUT0RPKHNrYWwpOiB0aGlzIHRtcCBidWZmZXIgaXMgbm90IG5lZWRlZCBpZiBWUDhMQnVuZGxlQ29sb3JNYXAoKSBjYW4gYmUKKyAgLy8gbWFkZSB0byB3b3JrIGluLXBsYWNlLgorICB1aW50OF90KiBjb25zdCB0bXBfcm93ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHdpZHRoLCBzaXplb2YoKnRtcF9yb3cpKTsKKyAgaW50IHgsIHk7CisKKyAgaWYgKHRtcF9yb3cgPT0gTlVMTCkgcmV0dXJuIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKworICBpZiAocGFsZXR0ZV9zaXplIDwgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYKSB7CisgICAgQVBQTFlfUEFMRVRURV9GT1IoU2VhcmNoQ29sb3JHcmVlZHkocGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCBwaXgpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50MTZfdCBidWZmZXJbUEFMRVRURV9JTlZfU0laRV07CisgICAgdWludDMyX3QgKCpjb25zdCBoYXNoX2Z1bmN0aW9uc1tdKSh1aW50MzJfdCkgPSB7CisgICAgICAgIEFwcGx5UGFsZXR0ZUhhc2gwLCBBcHBseVBhbGV0dGVIYXNoMSwgQXBwbHlQYWxldHRlSGFzaDIKKyAgICB9OworCisgICAgLy8gVHJ5IHRvIGZpbmQgYSBwZXJmZWN0IGhhc2ggZnVuY3Rpb24gYWJsZSB0byBnbyBmcm9tIGEgY29sb3IgdG8gYW4gaW5kZXgKKyAgICAvLyB3aXRoaW4gMSA8PCBQQUxFVFRFX0lOVl9TSVpFX0JJVFMgaW4gb3JkZXIgdG8gYnVpbGQgYSBoYXNoIG1hcCB0byBnbworICAgIC8vIGZyb20gY29sb3IgdG8gaW5kZXggaW4gcGFsZXR0ZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBpbnQgdXNlX0xVVCA9IDE7CisgICAgICAvLyBTZXQgZWFjaCBlbGVtZW50IGluIGJ1ZmZlciB0byBtYXggdWludDE2X3QuCisgICAgICBtZW1zZXQoYnVmZmVyLCAweGZmLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgcGFsZXR0ZV9zaXplOyArK2opIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgaW5kID0gaGFzaF9mdW5jdGlvbnNbaV0ocGFsZXR0ZVtqXSk7CisgICAgICAgIGlmIChidWZmZXJbaW5kXSAhPSAweGZmZmZ1KSB7CisgICAgICAgICAgdXNlX0xVVCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmZmVyW2luZF0gPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodXNlX0xVVCkgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gwKHBpeCldKTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMSkgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gxKHBpeCldKTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMikgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gyKHBpeCldKTsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgaWR4X21hcFtNQVhfUEFMRVRURV9TSVpFXTsKKyAgICAgIHVpbnQzMl90IHBhbGV0dGVfc29ydGVkW01BWF9QQUxFVFRFX1NJWkVdOworICAgICAgUHJlcGFyZU1hcFRvUGFsZXR0ZShwYWxldHRlLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfc29ydGVkLCBpZHhfbWFwKTsKKyAgICAgIEFQUExZX1BBTEVUVEVfRk9SKAorICAgICAgICAgIGlkeF9tYXBbU2VhcmNoQ29sb3JOb0lkeChwYWxldHRlX3NvcnRlZCwgcGl4LCBwYWxldHRlX3NpemUpXSk7CisgICAgfQorICB9CisgIFdlYlBTYWZlRnJlZSh0bXBfcm93KTsKKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisjdW5kZWYgQVBQTFlfUEFMRVRURV9GT1IKKyN1bmRlZiBQQUxFVFRFX0lOVl9TSVpFX0JJVFMKKyN1bmRlZiBQQUxFVFRFX0lOVl9TSVpFCisjdW5kZWYgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYCisKKy8vIE5vdGU6IEV4cGVjdHMgImVuYy0+cGFsZXR0ZV8iIHRvIGJlIHNldCBwcm9wZXJseS4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBNYXBJbWFnZUZyb21QYWxldHRlKFZQOExFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGxhY2UpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSA9IGVuYy0+cGFsZXR0ZV87CisgIGNvbnN0IHVpbnQzMl90KiBzcmMgPSBpbl9wbGFjZSA/IGVuYy0+YXJnYl8gOiBwaWMtPmFyZ2I7CisgIGNvbnN0IGludCBzcmNfc3RyaWRlID0gaW5fcGxhY2UgPyBlbmMtPmN1cnJlbnRfd2lkdGhfIDogcGljLT5hcmdiX3N0cmlkZTsKKyAgY29uc3QgaW50IHBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKKyAgaW50IHhiaXRzOworCisgIC8vIFJlcGxhY2UgZWFjaCBpbnB1dCBwaXhlbCBieSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgaW5kZXguCisgIC8vIFRoaXMgaXMgZG9uZSBsaW5lIGJ5IGxpbmUuCisgIGlmIChwYWxldHRlX3NpemUgPD0gNCkgeworICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAyKSA/IDMgOiAyOworICB9IGVsc2UgeworICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAxNikgPyAxIDogMDsKKyAgfQorCisgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHhiaXRzKSwgaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyOworCisgIGVyciA9IEFwcGx5UGFsZXR0ZShzcmMsIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBlbmMtPmFyZ2JfLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCB3aWR0aCwgaGVpZ2h0LCB4Yml0cyk7CisgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyUGFsZXR0ZTsKKyAgcmV0dXJuIGVycjsKK30KKworLy8gU2F2ZSBwYWxldHRlX1tdIHRvIGJpdHN0cmVhbS4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVQYWxldHRlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IGk7CisgIHVpbnQzMl90IHRtcF9wYWxldHRlW01BWF9QQUxFVFRFX1NJWkVdOworICBjb25zdCBpbnQgcGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSA9IGVuYy0+cGFsZXR0ZV87CisgIFZQOExQdXRCaXRzKGJ3LCBUUkFOU0ZPUk1fUFJFU0VOVCwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0sIDIpOworICBhc3NlcnQocGFsZXR0ZV9zaXplID49IDEgJiYgcGFsZXR0ZV9zaXplIDw9IE1BWF9QQUxFVFRFX1NJWkUpOworICBWUDhMUHV0Qml0cyhidywgcGFsZXR0ZV9zaXplIC0gMSwgOCk7CisgIGZvciAoaSA9IHBhbGV0dGVfc2l6ZSAtIDE7IGkgPj0gMTsgLS1pKSB7CisgICAgdG1wX3BhbGV0dGVbaV0gPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHBhbGV0dGVbaSAtIDFdKTsKKyAgfQorICB0bXBfcGFsZXR0ZVswXSA9IHBhbGV0dGVbMF07CisgIHJldHVybiBFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgdG1wX3BhbGV0dGUsICZlbmMtPmhhc2hfY2hhaW5fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYy0+cmVmc19bMF0sICZlbmMtPnJlZnNfWzFdLCBwYWxldHRlX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAvKiBxdWFsaXR5ICovLCBsb3dfZWZmb3J0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExFbmNvZGVyCisKK3N0YXRpYyBWUDhMRW5jb2RlciogVlA4TEVuY29kZXJOZXcoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBWUDhMRW5jb2RlciogY29uc3QgZW5jID0gKFZQOExFbmNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmVuYykpOworICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVuYy0+Y29uZmlnXyA9IGNvbmZpZzsKKyAgZW5jLT5waWNfID0gcGljdHVyZTsKKyAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworCisgIFZQOExFbmNEc3BJbml0KCk7CisKKyAgcmV0dXJuIGVuYzsKK30KKworc3RhdGljIHZvaWQgVlA4TEVuY29kZXJEZWxldGUoVlA4TEVuY29kZXIqIGVuYykgeworICBpZiAoZW5jICE9IE5VTEwpIHsKKyAgICBpbnQgaTsKKyAgICBWUDhMSGFzaENoYWluQ2xlYXIoJmVuYy0+aGFzaF9jaGFpbl8pOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIFZQOExCYWNrd2FyZFJlZnNDbGVhcigmZW5jLT5yZWZzX1tpXSk7CisgICAgQ2xlYXJUcmFuc2Zvcm1CdWZmZXIoZW5jKTsKKyAgICBXZWJQU2FmZUZyZWUoZW5jKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxsCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnXzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmVfOworICBWUDhMQml0V3JpdGVyKiBid187CisgIFZQOExFbmNvZGVyKiBlbmNfOworICBpbnQgdXNlX2NhY2hlXzsKKyAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzX1tDUlVOQ0hfQ09ORklHU19NQVhdOworICBpbnQgbnVtX2NydW5jaF9jb25maWdzXzsKKyAgaW50IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVyb187CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycl87CisgIFdlYlBBdXhTdGF0cyogc3RhdHNfOworfSBTdHJlYW1FbmNvZGVDb250ZXh0OworCitzdGF0aWMgaW50IEVuY29kZVN0cmVhbUhvb2sodm9pZCogaW5wdXQsIHZvaWQqIGRhdGEyKSB7CisgIFN0cmVhbUVuY29kZUNvbnRleHQqIGNvbnN0IHBhcmFtcyA9IChTdHJlYW1FbmNvZGVDb250ZXh0KilpbnB1dDsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnID0gcGFyYW1zLT5jb25maWdfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSA9IHBhcmFtcy0+cGljdHVyZV87CisgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gcGFyYW1zLT5id187CisgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSBwYXJhbXMtPmVuY187CisgIGNvbnN0IGludCB1c2VfY2FjaGUgPSBwYXJhbXMtPnVzZV9jYWNoZV87CisgIGNvbnN0IENydW5jaENvbmZpZyogY29uc3QgY3J1bmNoX2NvbmZpZ3MgPSBwYXJhbXMtPmNydW5jaF9jb25maWdzXzsKKyAgY29uc3QgaW50IG51bV9jcnVuY2hfY29uZmlncyA9IHBhcmFtcy0+bnVtX2NydW5jaF9jb25maWdzXzsKKyAgY29uc3QgaW50IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IHBhcmFtcy0+cmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvXzsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwYXJhbXMtPnN0YXRzXzsKKyNlbmRpZgorICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCBpbnQgcXVhbGl0eSA9IChpbnQpY29uZmlnLT5xdWFsaXR5OworICBjb25zdCBpbnQgbG93X2VmZm9ydCA9IChjb25maWctPm1ldGhvZCA9PSAwKTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworI2VuZGlmCisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIGNvbnN0IHNpemVfdCBieXRlX3Bvc2l0aW9uID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGludCB1c2VfbmVhcl9sb3NzbGVzcyA9IDA7CisjZW5kaWYKKyAgaW50IGhkcl9zaXplID0gMDsKKyAgaW50IGRhdGFfc2l6ZSA9IDA7CisgIGludCB1c2VfZGVsdGFfcGFsZXR0ZSA9IDA7CisgIGludCBpZHg7CisgIHNpemVfdCBiZXN0X3NpemUgPSAwOworICBWUDhMQml0V3JpdGVyIGJ3X2luaXQgPSAqYncsIGJ3X2Jlc3Q7CisgICh2b2lkKWRhdGEyOworCisgIGlmICghVlA4TEJpdFdyaXRlckluaXQoJmJ3X2Jlc3QsIDApIHx8CisgICAgICAobnVtX2NydW5jaF9jb25maWdzID4gMSAmJiAhVlA4TEJpdFdyaXRlckNsb25lKGJ3LCAmYndfYmVzdCkpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jcnVuY2hfY29uZmlnczsgKytpZHgpIHsKKyAgICBjb25zdCBpbnQgZW50cm9weV9pZHggPSBjcnVuY2hfY29uZmlnc1tpZHhdLmVudHJvcHlfaWR4XzsKKyAgICBlbmMtPnVzZV9wYWxldHRlXyA9IChlbnRyb3B5X2lkeCA9PSBrUGFsZXR0ZSk7CisgICAgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fID0KKyAgICAgICAgKGVudHJvcHlfaWR4ID09IGtTdWJHcmVlbikgfHwgKGVudHJvcHlfaWR4ID09IGtTcGF0aWFsU3ViR3JlZW4pOworICAgIGVuYy0+dXNlX3ByZWRpY3RfID0KKyAgICAgICAgKGVudHJvcHlfaWR4ID09IGtTcGF0aWFsKSB8fCAoZW50cm9weV9pZHggPT0ga1NwYXRpYWxTdWJHcmVlbik7CisgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA/IDAgOiBlbmMtPnVzZV9wcmVkaWN0XzsKKyAgICB9CisgICAgLy8gUmVzZXQgYW55IHBhcmFtZXRlciBpbiB0aGUgZW5jb2RlciB0aGF0IGlzIHNldCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLgorICAgIGVuYy0+Y2FjaGVfYml0c18gPSAwOworICAgIFZQOExCYWNrd2FyZFJlZnNDbGVhcigmZW5jLT5yZWZzX1swXSk7CisgICAgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKCZlbmMtPnJlZnNfWzFdKTsKKworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKyAgICAvLyBBcHBseSBuZWFyLWxvc3NsZXNzIHByZXByb2Nlc3NpbmcuCisgICAgdXNlX25lYXJfbG9zc2xlc3MgPSAoY29uZmlnLT5uZWFyX2xvc3NsZXNzIDwgMTAwKSAmJiAhZW5jLT51c2VfcGFsZXR0ZV8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFlbmMtPnVzZV9wcmVkaWN0XzsKKyAgICBpZiAodXNlX25lYXJfbG9zc2xlc3MpIHsKKyAgICAgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgd2lkdGgsIGhlaWdodCk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgICBpZiAoKGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2Rlck5lYXJMb3NzbGVzcykgJiYKKyAgICAgICAgICAhVlA4QXBwbHlOZWFyTG9zc2xlc3MocGljdHVyZSwgY29uZmlnLT5uZWFyX2xvc3NsZXNzLCBlbmMtPmFyZ2JfKSkgeworICAgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBlbmMtPmFyZ2JfY29udGVudF8gPSBrRW5jb2Rlck5lYXJMb3NzbGVzczsKKyAgICB9IGVsc2UgeworICAgICAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworICAgIH0KKyNlbHNlCisgICAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworI2VuZGlmCisKKyAgICAvLyBFbmNvZGUgcGFsZXR0ZQorICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgeworICAgICAgZXJyID0gRW5jb2RlUGFsZXR0ZShidywgbG93X2VmZm9ydCwgZW5jKTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIGVyciA9IE1hcEltYWdlRnJvbVBhbGV0dGUoZW5jLCB1c2VfZGVsdGFfcGFsZXR0ZSk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgICAvLyBJZiB1c2luZyBhIGNvbG9yIGNhY2hlLCBkbyBub3QgaGF2ZSBpdCBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAgICAvLyBjb2xvcnMuCisgICAgICBpZiAodXNlX2NhY2hlICYmIGVuYy0+cGFsZXR0ZV9zaXplXyA8ICgxIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSkgeworICAgICAgICBlbmMtPmNhY2hlX2JpdHNfID0gQml0c0xvZzJGbG9vcihlbmMtPnBhbGV0dGVfc2l6ZV8pICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCF1c2VfZGVsdGFfcGFsZXR0ZSkgeworICAgICAgLy8gSW4gY2FzZSBpbWFnZSBpcyBub3QgcGFja2VkLgorICAgICAgaWYgKGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2Rlck5lYXJMb3NzbGVzcyAmJgorICAgICAgICAgIGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2RlclBhbGV0dGUpIHsKKyAgICAgICAgZXJyID0gTWFrZUlucHV0SW1hZ2VDb3B5KGVuYyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIC8vIEFwcGx5IHRyYW5zZm9ybXMgYW5kIHdyaXRlIHRyYW5zZm9ybSBkYXRhLgorCisgICAgICBpZiAoZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fKSB7CisgICAgICAgIEFwcGx5U3VidHJhY3RHcmVlbihlbmMsIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgYncpOworICAgICAgfQorCisgICAgICBpZiAoZW5jLT51c2VfcHJlZGljdF8pIHsKKyAgICAgICAgZXJyID0gQXBwbHlQcmVkaWN0RmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fLCBidyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgeworICAgICAgICBlcnIgPSBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfZWZmb3J0LCBidyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBWUDhMUHV0Qml0cyhidywgIVRSQU5TRk9STV9QUkVTRU5ULCAxKTsgIC8vIE5vIG1vcmUgdHJhbnNmb3Jtcy4KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBFbmNvZGUgYW5kIHdyaXRlIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZS4KKyAgICBlcnIgPSBFbmNvZGVJbWFnZUludGVybmFsKGJ3LCBlbmMtPmFyZ2JfLCAmZW5jLT5oYXNoX2NoYWluXywgZW5jLT5yZWZzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgcXVhbGl0eSwgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9jYWNoZSwgJmNydW5jaF9jb25maWdzW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jLT5jYWNoZV9iaXRzXywgZW5jLT5oaXN0b19iaXRzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcG9zaXRpb24sICZoZHJfc2l6ZSwgJmRhdGFfc2l6ZSk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgICAgLy8gSWYgd2UgYXJlIGJldHRlciB0aGFuIHdoYXQgd2UgYWxyZWFkeSBoYXZlLgorICAgIGlmIChpZHggPT0gMCB8fCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIDwgYmVzdF9zaXplKSB7CisgICAgICBiZXN0X3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpOworICAgICAgLy8gU3RvcmUgdGhlIEJpdFdyaXRlci4KKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0cy4KKyAgICAgIGlmIChzdGF0cyAhPSBOVUxMKSB7CisgICAgICAgIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyA9IDA7CisgICAgICAgIGlmIChlbmMtPnVzZV9wcmVkaWN0Xykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDE7CisgICAgICAgIGlmIChlbmMtPnVzZV9jcm9zc19jb2xvcl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAyOworICAgICAgICBpZiAoZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gNDsKKyAgICAgICAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gODsKKyAgICAgICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzID0gZW5jLT5oaXN0b19iaXRzXzsKKyAgICAgICAgc3RhdHMtPnRyYW5zZm9ybV9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187CisgICAgICAgIHN0YXRzLT5jYWNoZV9iaXRzID0gZW5jLT5jYWNoZV9iaXRzXzsKKyAgICAgICAgc3RhdHMtPnBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KShiZXN0X3NpemUgLSBieXRlX3Bvc2l0aW9uKTsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX2hkcl9zaXplID0gaGRyX3NpemU7CisgICAgICAgIHN0YXRzLT5sb3NzbGVzc19kYXRhX3NpemUgPSBkYXRhX3NpemU7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIGJpdCB3cml0ZXIgZm9yIHRoZSBmb2xsb3dpbmcgaXRlcmF0aW9uIGlmIGFueS4KKyAgICBpZiAobnVtX2NydW5jaF9jb25maWdzID4gMSkgVlA4TEJpdFdyaXRlclJlc2V0KCZid19pbml0LCBidyk7CisgIH0KKyAgVlA4TEJpdFdyaXRlclN3YXAoJmJ3X2Jlc3QsIGJ3KTsKKworRXJyb3I6CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZid19iZXN0KTsKKyAgcGFyYW1zLT5lcnJfID0gZXJyOworICAvLyBUaGUgaG9vayBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCisgIHJldHVybiAoZXJyID09IFZQOF9FTkNfT0spOworfQorCitXZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3X21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfY2FjaGUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgVlA4TEVuY29kZXIqIGNvbnN0IGVuY19tYWluID0gVlA4TEVuY29kZXJOZXcoY29uZmlnLCBwaWN0dXJlKTsKKyAgVlA4TEVuY29kZXIqIGVuY19zaWRlID0gTlVMTDsKKyAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzW0NSVU5DSF9DT05GSUdTX01BWF07CisgIGludCBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiwgbnVtX2NydW5jaF9jb25maWdzX3NpZGUgPSAwOworICBpbnQgaWR4OworICBpbnQgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID0gMDsKKyAgV2ViUFdvcmtlciB3b3JrZXJfbWFpbiwgd29ya2VyX3NpZGU7CisgIFN0cmVhbUVuY29kZUNvbnRleHQgcGFyYW1zX21haW4sIHBhcmFtc19zaWRlOworICAvLyBUaGUgbWFpbiB0aHJlYWQgdXNlcyBwaWN0dXJlLT5zdGF0cywgdGhlIHNpZGUgdGhyZWFkIHVzZXMgc3RhdHNfc2lkZS4KKyAgV2ViUEF1eFN0YXRzIHN0YXRzX3NpZGU7CisgIFZQOExCaXRXcml0ZXIgYndfc2lkZTsKKyAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd29ya2VyX2ludGVyZmFjZSA9IFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKTsKKyAgaW50IG9rX21haW47CisKKyAgLy8gQW5hbHl6ZSBpbWFnZSAoZW50cm9weSwgbnVtX3BhbGV0dGVzIGV0YykKKyAgaWYgKGVuY19tYWluID09IE5VTEwgfHwKKyAgICAgICFFbmNvZGVyQW5hbHl6ZShlbmNfbWFpbiwgY3J1bmNoX2NvbmZpZ3MsICZudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSB8fAorICAgICAgIUVuY29kZXJJbml0KGVuY19tYWluKSB8fCAhVlA4TEJpdFdyaXRlckluaXQoJmJ3X3NpZGUsIDApKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBTcGxpdCB0aGUgY29uZmlncyBiZXR3ZWVuIHRoZSBtYWluIGFuZCBzaWRlIHRocmVhZHMgKGlmIGFueSkuCisgIGlmIChjb25maWctPnRocmVhZF9sZXZlbCA+IDApIHsKKyAgICBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSA9IG51bV9jcnVuY2hfY29uZmlnc19tYWluIC8gMjsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jcnVuY2hfY29uZmlnc19zaWRlOyArK2lkeCkgeworICAgICAgcGFyYW1zX3NpZGUuY3J1bmNoX2NvbmZpZ3NfW2lkeF0gPQorICAgICAgICAgIGNydW5jaF9jb25maWdzW251bV9jcnVuY2hfY29uZmlnc19tYWluIC0gbnVtX2NydW5jaF9jb25maWdzX3NpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIGlkeF07CisgICAgfQorICAgIHBhcmFtc19zaWRlLm51bV9jcnVuY2hfY29uZmlnc18gPSBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZTsKKyAgfQorICBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiAtPSBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZTsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbjsgKytpZHgpIHsKKyAgICBwYXJhbXNfbWFpbi5jcnVuY2hfY29uZmlnc19baWR4XSA9IGNydW5jaF9jb25maWdzW2lkeF07CisgIH0KKyAgcGFyYW1zX21haW4ubnVtX2NydW5jaF9jb25maWdzXyA9IG51bV9jcnVuY2hfY29uZmlnc19tYWluOworCisgIC8vIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB0aHJlYWQgd29ya2Vycy4KKyAgeworICAgIGNvbnN0IGludCBwYXJhbXNfc2l6ZSA9IChudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSA+IDApID8gMiA6IDE7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwYXJhbXNfc2l6ZTsgKytpZHgpIHsKKyAgICAgIC8vIENyZWF0ZSB0aGUgcGFyYW1ldGVycyBmb3IgZWFjaCB3b3JrZXIuCisgICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAoaWR4ID09IDApID8gJndvcmtlcl9tYWluIDogJndvcmtlcl9zaWRlOworICAgICAgU3RyZWFtRW5jb2RlQ29udGV4dCogY29uc3QgcGFyYW0gPQorICAgICAgICAgIChpZHggPT0gMCkgPyAmcGFyYW1zX21haW4gOiAmcGFyYW1zX3NpZGU7CisgICAgICBwYXJhbS0+Y29uZmlnXyA9IGNvbmZpZzsKKyAgICAgIHBhcmFtLT5waWN0dXJlXyA9IHBpY3R1cmU7CisgICAgICBwYXJhbS0+dXNlX2NhY2hlXyA9IHVzZV9jYWNoZTsKKyAgICAgIHBhcmFtLT5yZWRfYW5kX2JsdWVfYWx3YXlzX3plcm9fID0gcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvOworICAgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICAgIHBhcmFtLT5zdGF0c18gPSBwaWN0dXJlLT5zdGF0czsKKyAgICAgICAgcGFyYW0tPmJ3XyA9IGJ3X21haW47CisgICAgICAgIHBhcmFtLT5lbmNfID0gZW5jX21haW47CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJhbS0+c3RhdHNfID0gKHBpY3R1cmUtPnN0YXRzID09IE5VTEwpID8gTlVMTCA6ICZzdGF0c19zaWRlOworICAgICAgICAvLyBDcmVhdGUgYSBzaWRlIGJpdCB3cml0ZXIuCisgICAgICAgIGlmICghVlA4TEJpdFdyaXRlckNsb25lKGJ3X21haW4sICZid19zaWRlKSkgeworICAgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIHBhcmFtLT5id18gPSAmYndfc2lkZTsKKyAgICAgICAgLy8gQ3JlYXRlIGEgc2lkZSBlbmNvZGVyLgorICAgICAgICBlbmNfc2lkZSA9IFZQOExFbmNvZGVyTmV3KGNvbmZpZywgcGljdHVyZSk7CisgICAgICAgIGlmIChlbmNfc2lkZSA9PSBOVUxMIHx8ICFFbmNvZGVySW5pdChlbmNfc2lkZSkpIHsKKyAgICAgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb3B5IHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIGNvbXB1dGVkIGZvciB0aGUgbWFpbiBlbmNvZGVyLgorICAgICAgICBlbmNfc2lkZS0+aGlzdG9fYml0c18gPSBlbmNfbWFpbi0+aGlzdG9fYml0c187CisgICAgICAgIGVuY19zaWRlLT50cmFuc2Zvcm1fYml0c18gPSBlbmNfbWFpbi0+dHJhbnNmb3JtX2JpdHNfOworICAgICAgICBlbmNfc2lkZS0+cGFsZXR0ZV9zaXplXyA9IGVuY19tYWluLT5wYWxldHRlX3NpemVfOworICAgICAgICBtZW1jcHkoZW5jX3NpZGUtPnBhbGV0dGVfLCBlbmNfbWFpbi0+cGFsZXR0ZV8sCisgICAgICAgICAgICAgICBzaXplb2YoZW5jX21haW4tPnBhbGV0dGVfKSk7CisgICAgICAgIHBhcmFtLT5lbmNfID0gZW5jX3NpZGU7CisgICAgICB9CisgICAgICAvLyBDcmVhdGUgdGhlIHdvcmtlcnMuCisgICAgICB3b3JrZXJfaW50ZXJmYWNlLT5Jbml0KHdvcmtlcik7CisgICAgICB3b3JrZXItPmRhdGExID0gcGFyYW07CisgICAgICB3b3JrZXItPmRhdGEyID0gTlVMTDsKKyAgICAgIHdvcmtlci0+aG9vayA9IEVuY29kZVN0cmVhbUhvb2s7CisgICAgfQorICB9CisKKyAgLy8gU3RhcnQgdGhlIHNlY29uZCB0aHJlYWQgaWYgbmVlZGVkLgorICBpZiAobnVtX2NydW5jaF9jb25maWdzX3NpZGUgIT0gMCkgeworICAgIGlmICghd29ya2VyX2ludGVyZmFjZS0+UmVzZXQoJndvcmtlcl9zaWRlKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIC8vIFRoaXMgbGluZSBpcyBoZXJlIGFuZCBub3QgaW4gdGhlIHBhcmFtIGluaXRpYWxpemF0aW9uIGFib3ZlIHRvIHJlbW92ZSBhCisgICAgLy8gQ2xhbmcgc3RhdGljIGFuYWx5emVyIHdhcm5pbmcuCisgICAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKKyAgICAgIG1lbWNweSgmc3RhdHNfc2lkZSwgcGljdHVyZS0+c3RhdHMsIHNpemVvZihzdGF0c19zaWRlKSk7CisgICAgfQorI2VuZGlmCisgICAgLy8gVGhpcyBsaW5lIGlzIG9ubHkgdXNlZnVsIHRvIHJlbW92ZSBhIENsYW5nIHN0YXRpYyBhbmFseXplciB3YXJuaW5nLgorICAgIHBhcmFtc19zaWRlLmVycl8gPSBWUDhfRU5DX09LOworICAgIHdvcmtlcl9pbnRlcmZhY2UtPkxhdW5jaCgmd29ya2VyX3NpZGUpOworICB9CisgIC8vIEV4ZWN1dGUgdGhlIG1haW4gdGhyZWFkLgorICB3b3JrZXJfaW50ZXJmYWNlLT5FeGVjdXRlKCZ3b3JrZXJfbWFpbik7CisgIG9rX21haW4gPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZ3b3JrZXJfbWFpbik7CisgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmd29ya2VyX21haW4pOworICBpZiAobnVtX2NydW5jaF9jb25maWdzX3NpZGUgIT0gMCkgeworICAgIC8vIFdhaXQgZm9yIHRoZSBzZWNvbmQgdGhyZWFkLgorICAgIGNvbnN0IGludCBva19zaWRlID0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmd29ya2VyX3NpZGUpOworICAgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmd29ya2VyX3NpZGUpOworICAgIGlmICghb2tfbWFpbiB8fCAhb2tfc2lkZSkgeworICAgICAgZXJyID0gb2tfbWFpbiA/IHBhcmFtc19zaWRlLmVycl8gOiBwYXJhbXNfbWFpbi5lcnJfOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKFZQOExCaXRXcml0ZXJOdW1CeXRlcygmYndfc2lkZSkgPCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYndfbWFpbikpIHsKKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3X21haW4sICZid19zaWRlKTsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocGljdHVyZS0+c3RhdHMsICZzdGF0c19zaWRlLCBzaXplb2YoKnBpY3R1cmUtPnN0YXRzKSk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFva19tYWluKSB7CisgICAgICBlcnIgPSBwYXJhbXNfbWFpbi5lcnJfOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKworRXJyb3I6CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZid19zaWRlKTsKKyAgVlA4TEVuY29kZXJEZWxldGUoZW5jX21haW4pOworICBWUDhMRW5jb2RlckRlbGV0ZShlbmNfc2lkZSk7CisgIHJldHVybiBlcnI7Cit9CisKKyN1bmRlZiBDUlVOQ0hfQ09ORklHU19NQVgKKyN1bmRlZiBDUlVOQ0hfQ09ORklHU19MWjc3X01BWAorCitpbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIGludCBoYXNfYWxwaGE7CisgIHNpemVfdCBjb2RlZF9zaXplOworICBpbnQgcGVyY2VudCA9IDA7CisgIGludCBpbml0aWFsX3NpemU7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIFZQOExCaXRXcml0ZXIgYnc7CisKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVI7CisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgZXJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgLy8gSW5pdGlhbGl6ZSBCaXRXcml0ZXIgd2l0aCBzaXplIGNvcnJlc3BvbmRpbmcgdG8gMTYgYnBwIHRvIHBob3RvIGltYWdlcyBhbmQKKyAgLy8gOCBicHAgZm9yIGdyYXBoaWNhbCBpbWFnZXMuCisgIGluaXRpYWxfc2l6ZSA9IChjb25maWctPmltYWdlX2hpbnQgPT0gV0VCUF9ISU5UX0dSQVBIKSA/CisgICAgICB3aWR0aCAqIGhlaWdodCA6IHdpZHRoICogaGVpZ2h0ICogMjsKKyAgaWYgKCFWUDhMQml0V3JpdGVySW5pdCgmYncsIGluaXRpYWxfc2l6ZSkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEsICZwZXJjZW50KSkgeworIFVzZXJBYm9ydDoKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQ7CisgICAgZ290byBFcnJvcjsKKyAgfQorICAvLyBSZXNldCBzdGF0cyAoZm9yIHB1cmUgbG9zc2xlc3MgY29kaW5nKQorICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWN0dXJlLT5zdGF0czsKKyAgICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgICBzdGF0cy0+UFNOUlswXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbMV0gPSA5OS5mOworICAgIHN0YXRzLT5QU05SWzJdID0gOTkuZjsKKyAgICBzdGF0cy0+UFNOUlszXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbNF0gPSA5OS5mOworICB9CisKKyAgLy8gV3JpdGUgaW1hZ2Ugc2l6ZS4KKyAgaWYgKCFXcml0ZUltYWdlU2l6ZShwaWN0dXJlLCAmYncpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBoYXNfYWxwaGEgPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShwaWN0dXJlKTsKKyAgLy8gV3JpdGUgdGhlIG5vbi10cml2aWFsIEFscGhhIGZsYWcgYW5kIGxvc3NsZXNzIHZlcnNpb24uCisgIGlmICghV3JpdGVSZWFsQWxwaGFBbmRWZXJzaW9uKCZidywgaGFzX2FscGhhKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgNSwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBFbmNvZGUgbWFpbiBpbWFnZSBzdHJlYW0uCisgIGVyciA9IFZQOExFbmNvZGVTdHJlYW0oY29uZmlnLCBwaWN0dXJlLCAmYncsIDEgLyp1c2VfY2FjaGUqLyk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCA5MCwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBGaW5pc2ggdGhlIFJJRkYgY2h1bmsuCisgIGVyciA9IFdyaXRlSW1hZ2UocGljdHVyZSwgJmJ3LCAmY29kZWRfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCAxMDAsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7CisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIC8vIFNhdmUgc2l6ZS4KKyAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKKyAgICBwaWN0dXJlLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KWNvZGVkX3NpemU7CisgICAgcGljdHVyZS0+c3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KWNvZGVkX3NpemU7CisgIH0KKyNlbmRpZgorCisgIGlmIChwaWN0dXJlLT5leHRyYV9pbmZvICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgbWJfdyA9ICh3aWR0aCArIDE1KSA+PiA0OworICAgIGNvbnN0IGludCBtYl9oID0gKGhlaWdodCArIDE1KSA+PiA0OworICAgIG1lbXNldChwaWN0dXJlLT5leHRyYV9pbmZvLCAwLCBtYl93ICogbWJfaCAqIHNpemVvZigqcGljdHVyZS0+ZXh0cmFfaW5mbykpOworICB9CisKKyBFcnJvcjoKKyAgaWYgKGJ3LmVycm9yXykgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICBWUDhMQml0V3JpdGVyV2lwZU91dCgmYncpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhsaV9lbmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bGlfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4YTRhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bGlfZW5jLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBMb3NzbGVzcyBlbmNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0VOQ19WUDhMSV9FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfVlA4TElfRU5DX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKy8vIEVpdGhlciBXRUJQX05FQVJfTE9TU0xFU1MgaXMgZGVmaW5lZCBhcyAwIGluIGNvbmZpZy5oIHdoZW4gY29tcGlsaW5nIHRvCisvLyBkaXNhYmxlIG5lYXItbG9zc2xlc3MsIG9yIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyNpZm5kZWYgV0VCUF9ORUFSX0xPU1NMRVNTCisjZGVmaW5lIFdFQlBfTkVBUl9MT1NTTEVTUyAxCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBtYXhpbXVtIHZhbHVlIG9mIHRyYW5zZm9ybV9iaXRzXyBpbiBWUDhMRW5jb2Rlci4KKyNkZWZpbmUgTUFYX1RSQU5TRk9STV9CSVRTIDYKKwordHlwZWRlZiBlbnVtIHsKKyAga0VuY29kZXJOb25lID0gMCwKKyAga0VuY29kZXJBUkdCLAorICBrRW5jb2Rlck5lYXJMb3NzbGVzcywKKyAga0VuY29kZXJQYWxldHRlCit9IFZQOExFbmNvZGVyQVJHQkNvbnRlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnXzsgICAgICAvLyB1c2VyIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlcnMKKyAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY187ICAgICAgICAvLyBpbnB1dCBwaWN0dXJlLgorCisgIHVpbnQzMl90KiBhcmdiXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybWVkIGFyZ2IgaW1hZ2UgZGF0YS4KKyAgVlA4TEVuY29kZXJBUkdCQ29udGVudCBhcmdiX2NvbnRlbnRfOyAgLy8gQ29udGVudCB0eXBlIG9mIHRoZSBhcmdiIGJ1ZmZlci4KKyAgdWludDMyX3QqIGFyZ2Jfc2NyYXRjaF87ICAgICAgICAgICAgICAgLy8gU2NyYXRjaCBtZW1vcnkgZm9yIGFyZ2Igcm93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNlZCBmb3IgcHJlZGljdGlvbikuCisgIHVpbnQzMl90KiB0cmFuc2Zvcm1fZGF0YV87ICAgICAgICAgICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciB0cmFuc2Zvcm0gZGF0YS4KKyAgdWludDMyX3QqIHRyYW5zZm9ybV9tZW1fOyAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IGFsbG9jYXRlZCBtZW1vcnkuCisgIHNpemVfdCAgICB0cmFuc2Zvcm1fbWVtX3NpemVfOyAgICAgICAgIC8vIEN1cnJlbnRseSBhbGxvY2F0ZWQgbWVtb3J5IHNpemUuCisKKyAgaW50ICAgICAgIGN1cnJlbnRfd2lkdGhfOyAgICAgICAvLyBDb3JyZXNwb25kcyB0byBwYWNrZWQgaW1hZ2Ugd2lkdGguCisKKyAgLy8gRW5jb2RpbmcgcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gcXVhbGl0eSBwYXJhbWV0ZXIuCisgIGludCBoaXN0b19iaXRzXzsKKyAgaW50IHRyYW5zZm9ybV9iaXRzXzsgICAgLy8gPD0gTUFYX1RSQU5TRk9STV9CSVRTLgorICBpbnQgY2FjaGVfYml0c187ICAgICAgICAvLyBJZiBlcXVhbCB0byAwLCBkb24ndCB1c2UgY29sb3IgY2FjaGUuCisKKyAgLy8gRW5jb2RpbmcgcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gaW1hZ2UgY2hhcmFjdGVyaXN0aWNzLgorICBpbnQgdXNlX2Nyb3NzX2NvbG9yXzsKKyAgaW50IHVzZV9zdWJ0cmFjdF9ncmVlbl87CisgIGludCB1c2VfcHJlZGljdF87CisgIGludCB1c2VfcGFsZXR0ZV87CisgIGludCBwYWxldHRlX3NpemVfOworICB1aW50MzJfdCBwYWxldHRlX1tNQVhfUEFMRVRURV9TSVpFXTsKKworICAvLyBTb21lICdzY3JhdGNoJyAocG90ZW50aWFsbHkgbGFyZ2UpIG9iamVjdHMuCisgIHN0cnVjdCBWUDhMQmFja3dhcmRSZWZzIHJlZnNfWzNdOyAgLy8gQmFja3dhcmQgUmVmcyBhcnJheSBmb3IgdGVtcG9yYXJpZXMuCisgIFZQOExIYXNoQ2hhaW4gaGFzaF9jaGFpbl87ICAgICAgICAgLy8gSGFzaENoYWluIGRhdGEgZm9yIGNvbnN0cnVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIHJlZmVyZW5jZXMuCit9IFZQOExFbmNvZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBFbmNvZGVzIHRoZSBwaWN0dXJlLgorLy8gUmV0dXJucyAwIGlmIGNvbmZpZyBvciBwaWN0dXJlIGlzIE5VTEwgb3IgcGljdHVyZSBkb2Vzbid0IGhhdmUgdmFsaWQgYXJnYgorLy8gaW5wdXQuCitpbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpOworCisvLyBFbmNvZGVzIHRoZSBtYWluIGltYWdlIHN0cmVhbSB1c2luZyB0aGUgc3VwcGxpZWQgYml0IHdyaXRlci4KKy8vIElmICd1c2VfY2FjaGUnIGlzIGZhbHNlLCBkaXNhYmxlcyB0aGUgdXNlIG9mIGNvbG9yIGNhY2hlLgorV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IHVzZV9jYWNoZSk7CisKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisvLyBpbiBuZWFyX2xvc3NsZXNzLmMKKy8vIE5lYXIgbG9zc2xlc3MgcHJlcHJvY2Vzc2luZyBpbiBSR0IgY29sb3Itc3BhY2UuCitpbnQgVlA4QXBwbHlOZWFyTG9zc2xlc3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX2RzdCk7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltYWdlIHRyYW5zZm9ybXMgaW4gcHJlZGljdG9yLmMuCisKK3ZvaWQgVlA4TFJlc2lkdWFsSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgaW1hZ2UsIGludCBuZWFyX2xvc3NsZXNzLCBpbnQgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKwordm9pZCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBpbWFnZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0VOQ19WUDhMSV9FTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy93ZWJwZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3dlYnBfZW5jLmMKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3dlYnBlbmMuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy93ZWJwX2VuYy5jCmluZGV4IGFlNGZiM2IuLmQ1NTg2NTIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy93ZWJwZW5jLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy93ZWJwX2VuYy5jCkBAIC0xMiw4ICsxMiwxMCBAQAogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAjZWxzZQogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjEsMTYgKzIzLDEzIEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4bGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCiAKIC8vICNkZWZpbmUgUFJJTlRfTUVNT1JZX0lORk8KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KICNpZmRlZiBQUklOVF9NRU1PUllfSU5GTwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjZW5kaWYKQEAgLTQyLDQzICs0MSwxOCBAQAogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUFBpY3R1cmUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbnQgRHVtbXlXcml0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgLy8gVGhlIGZvbGxvd2luZyBhcmUgdG8gcHJldmVudCAndW51c2VkIHZhcmlhYmxlJyBlcnJvciBtZXNzYWdlLgotICAodm9pZClkYXRhOwotICAodm9pZClkYXRhX3NpemU7Ci0gICh2b2lkKXBpY3R1cmU7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgIC8vIGNhbGxlci9zeXN0ZW0gdmVyc2lvbiBtaXNtYXRjaCEKLSAgfQotICBpZiAocGljdHVyZSAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlTZXQocGljdHVyZSwgMCwgc2l6ZW9mKCpwaWN0dXJlKSk7Ci0gICAgcGljdHVyZS0+d3JpdGVyID0gRHVtbXlXcml0ZXI7Ci0gICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19PSyk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWUDhFbmNvZGVyCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOFNlZ21lbnRIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPnNlZ21lbnRfaGRyXzsKKyAgVlA4RW5jU2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+c2VnbWVudF9oZHJfOwogICBoZHItPm51bV9zZWdtZW50c18gPSBlbmMtPmNvbmZpZ18tPnNlZ21lbnRzOwogICBoZHItPnVwZGF0ZV9tYXBfICA9IChoZHItPm51bV9zZWdtZW50c18gPiAxKTsKICAgaGRyLT5zaXplXyA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIFJlc2V0RmlsdGVySGVhZGVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPmZpbHRlcl9oZHJfOworICBWUDhFbmNGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPmZpbHRlcl9oZHJfOwogICBoZHItPnNpbXBsZV8gPSAxOwogICBoZHItPmxldmVsXyA9IDA7CiAgIGhkci0+c2hhcnBuZXNzXyA9IDA7CkBAIC0xMDgsMTEgKzgyLDEzIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwogLy8gZHluYW1pYyBwcm9iYSAgICAgfCB+IHwgeCB8IHggfCB4IHwgeCB8IHggfCB4IHwKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0vLyBmYXN0IG1vZGUgYW5hbHlzaXN8ICAgfCAgIHwgICB8ICAgfCB4IHwgeCB8IHggfAorLy8gZmFzdCBtb2RlIGFuYWx5c2lzfFt4XXxbeF18ICAgfCAgIHwgeCB8IHggfCB4IHwKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCiAvLyBiYXNpYyByZC1vcHQgICAgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8IHggfAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vIGRpc3RvLXNjb3JlIGk0LzE2IHwgICB8ICAgfCB4IHwgICB8ICAgfCAgIHwgICB8CisvLyBkaXN0by1yZWZpbmUgaTQvMTZ8IHggfCB4IHwgeCB8ICAgfCAgIHwgICB8ICAgfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGRpc3RvLXJlZmluZSB1diAgIHwgICB8IHggfCB4IHwgICB8ICAgfCAgIHwgICB8CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwogLy8gcmQtb3B0IGk0LzE2ICAgICAgfCAgIHwgICB8IH4gfCB4IHwgeCB8IHggfCB4IHwKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCkBAIC0xMzYsMTIgKzExMiwxNiBAQAogICAgICAgMjU2ICogMTYgKiAxNiAqICAgICAgICAgICAgICAgICAvLyB1cHBlciBib3VuZDogdXAgdG8gMTZiaXQgcGVyIDR4NCBibG9jawogICAgICAgKGxpbWl0ICogbGltaXQpIC8gKDEwMCAqIDEwMCk7ICAvLyAuLi4gbW9kdWxhdGVkIHdpdGggYSBxdWFkcmF0aWMgY3VydmUuCiAKKyAgLy8gcGFydGl0aW9uMCA9IDUxMmsgbWF4LgorICBlbmMtPm1iX2hlYWRlcl9saW1pdF8gPQorICAgICAgKHNjb3JlX3QpMjU2ICogNTEwICogOCAqIDEwMjQgLyAoZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8pOworCiAgIGVuYy0+dGhyZWFkX2xldmVsXyA9IGNvbmZpZy0+dGhyZWFkX2xldmVsOwogCiAgIGVuYy0+ZG9fc2VhcmNoXyA9IChjb25maWctPnRhcmdldF9zaXplID4gMCB8fCBjb25maWctPnRhcmdldF9QU05SID4gMCk7CiAgIGlmICghY29uZmlnLT5sb3dfbWVtb3J5KSB7CiAjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0gICAgZW5jLT51c2VfdG9rZW5zXyA9IChtZXRob2QgPj0gMykgJiYgIWVuYy0+ZG9fc2VhcmNoXzsKKyAgICBlbmMtPnVzZV90b2tlbnNfID0gKGVuYy0+cmRfb3B0X2xldmVsXyA+PSBSRF9PUFRfQkFTSUMpOyAgLy8gbmVlZCByZCBzdGF0cwogI2VuZGlmCiAgICAgaWYgKGVuYy0+dXNlX3Rva2Vuc18pIHsKICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9IDE7ICAgLy8gZG9lc24ndCB3b3JrIHdpdGggbXVsdGktcGFydGl0aW9uCkBAIC0xNTIsNzUgKzEzMiw3NCBAQAogLy8gTWVtb3J5IHNjYWxpbmcgd2l0aCBkaW1lbnNpb25zOgogLy8gIG1lbW9yeSAoYnl0ZXMpIH49IDIuMjUgKiB3ICsgMC4wNjI1ICogdyAqIGgKIC8vCi0vLyBUeXBpY2FsIG1lbW9yeSBmb290cHJpbnQgKDc2OHg1MTAgcGljdHVyZSkKLS8vIE1lbW9yeSB1c2VkOgotLy8gICAgICAgICAgICAgIGVuY29kZXI6IDMzOTE5Ci0vLyAgICAgICAgICBibG9jayBjYWNoZTogMjg4MAotLy8gICAgICAgICAgICAgICAgIGluZm86IDMwNzIKLS8vICAgICAgICAgICAgICAgIHByZWRzOiAyNDg5NwotLy8gICAgICAgICAgdG9wIHNhbXBsZXM6IDE2MjMKLS8vICAgICAgICAgICAgIG5vbi16ZXJvOiAxOTYKLS8vICAgICAgICAgICAgIGxmLXN0YXRzOiAyMDQ4Ci0vLyAgICAgICAgICAgICAgICB0b3RhbDogNjg2MzUKLS8vIFRyYW5zY2llbnQgb2JqZWN0IHNpemVzOgotLy8gICAgICAgVlA4RW5jSXRlcmF0b3I6IDM1MgotLy8gICAgICAgICBWUDhNb2RlU2NvcmU6IDkxMgotLy8gICAgICAgVlA4U2VnbWVudEluZm86IDUzMgotLy8gICAgICAgICAgICAgVlA4UHJvYmE6IDMxMDMyCisvLyBUeXBpY2FsIG1lbW9yeSBmb290cHJpbnQgKDYxNHg0NDAgcGljdHVyZSkKKy8vICAgICAgICAgICAgICBlbmNvZGVyOiAyMjExMQorLy8gICAgICAgICAgICAgICAgIGluZm86IDQzNjgKKy8vICAgICAgICAgICAgICAgIHByZWRzOiAxNzc0MQorLy8gICAgICAgICAgdG9wIHNhbXBsZXM6IDEyNjMKKy8vICAgICAgICAgICAgIG5vbi16ZXJvOiAxNzUKKy8vICAgICAgICAgICAgIGxmLXN0YXRzOiAwCisvLyAgICAgICAgICAgICAgICB0b3RhbDogNDU2NTgKKy8vIFRyYW5zaWVudCBvYmplY3Qgc2l6ZXM6CisvLyAgICAgICBWUDhFbmNJdGVyYXRvcjogMzM2MAorLy8gICAgICAgICBWUDhNb2RlU2NvcmU6IDg3MgorLy8gICAgICAgVlA4U2VnbWVudEluZm86IDczMgorLy8gICAgICAgICAgVlA4RW5jUHJvYmE6IDE4MzUyCiAvLyAgICAgICAgICAgICAgTEZTdGF0czogMjA0OAotLy8gUGljdHVyZSBzaXplICh5dXYpOiA1ODk4MjQKKy8vIFBpY3R1cmUgc2l6ZSAoeXV2KTogNDE5MzI4CiAKIHN0YXRpYyBWUDhFbmNvZGVyKiBJbml0VlA4RW5jb2Rlcihjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgVlA4RW5jb2RlciogZW5jOwogICBjb25zdCBpbnQgdXNlX2ZpbHRlciA9CiAgICAgICAoY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPiAwKSB8fCAoY29uZmlnLT5hdXRvZmlsdGVyID4gMCk7CiAgIGNvbnN0IGludCBtYl93ID0gKHBpY3R1cmUtPndpZHRoICsgMTUpID4+IDQ7CiAgIGNvbnN0IGludCBtYl9oID0gKHBpY3R1cmUtPmhlaWdodCArIDE1KSA+PiA0OwogICBjb25zdCBpbnQgcHJlZHNfdyA9IDQgKiBtYl93ICsgMTsKICAgY29uc3QgaW50IHByZWRzX2ggPSA0ICogbWJfaCArIDE7Ci0gIGNvbnN0IHNpemVfdCBwcmVkc19zaXplID0gcHJlZHNfdyAqIHByZWRzX2ggKiBzaXplb2YodWludDhfdCk7CisgIGNvbnN0IHNpemVfdCBwcmVkc19zaXplID0gcHJlZHNfdyAqIHByZWRzX2ggKiBzaXplb2YoKmVuYy0+cHJlZHNfKTsKICAgY29uc3QgaW50IHRvcF9zdHJpZGUgPSBtYl93ICogMTY7Ci0gIGNvbnN0IHNpemVfdCBuel9zaXplID0gKG1iX3cgKyAxKSAqIHNpemVvZih1aW50MzJfdCk7Ci0gIGNvbnN0IHNpemVfdCBjYWNoZV9zaXplID0gKDMgKiBZVVZfU0laRSArIFBSRURfU0laRSkgKiBzaXplb2YodWludDhfdCk7Ci0gIGNvbnN0IHNpemVfdCBpbmZvX3NpemUgPSBtYl93ICogbWJfaCAqIHNpemVvZihWUDhNQkluZm8pOwotICBjb25zdCBzaXplX3Qgc2FtcGxlc19zaXplID0gKDIgKiB0b3Bfc3RyaWRlICsgICAgICAgICAvLyB0b3AtbHVtYS91L3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArIDE2ICsgMTYgKyA4ICsgMSArICAgLy8gbGVmdCB5L3UvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBBTElHTl9DU1QpICAgICAgICAgICAvLyBhbGlnbiBhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZih1aW50OF90KTsKKyAgY29uc3Qgc2l6ZV90IG56X3NpemUgPSAobWJfdyArIDEpICogc2l6ZW9mKCplbmMtPm56XykgKyBXRUJQX0FMSUdOX0NTVDsKKyAgY29uc3Qgc2l6ZV90IGluZm9fc2l6ZSA9IG1iX3cgKiBtYl9oICogc2l6ZW9mKCplbmMtPm1iX2luZm9fKTsKKyAgY29uc3Qgc2l6ZV90IHNhbXBsZXNfc2l6ZSA9CisgICAgICAyICogdG9wX3N0cmlkZSAqIHNpemVvZigqZW5jLT55X3RvcF8pICAvLyB0b3AtbHVtYS91L3YKKyAgICAgICsgV0VCUF9BTElHTl9DU1Q7ICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWduIGFsbAogICBjb25zdCBzaXplX3QgbGZfc3RhdHNfc2l6ZSA9Ci0gICAgICBjb25maWctPmF1dG9maWx0ZXIgPyBzaXplb2YoTEZTdGF0cykgKyBBTElHTl9DU1QgOiAwOwotICBWUDhFbmNvZGVyKiBlbmM7CisgICAgICBjb25maWctPmF1dG9maWx0ZXIgPyBzaXplb2YoKmVuYy0+bGZfc3RhdHNfKSArIFdFQlBfQUxJR05fQ1NUIDogMDsKKyAgY29uc3Qgc2l6ZV90IHRvcF9kZXJyX3NpemUgPQorICAgICAgKGNvbmZpZy0+cXVhbGl0eSA8PSBFUlJPUl9ESUZGVVNJT05fUVVBTElUWSB8fCBjb25maWctPnBhc3MgPiAxKSA/CisgICAgICAgICAgbWJfdyAqIHNpemVvZigqZW5jLT50b3BfZGVycl8pIDogMDsKICAgdWludDhfdCogbWVtOwotICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXNpemVvZihWUDhFbmNvZGVyKSAgIC8vIG1haW4gc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgKyBBTElHTl9DU1QgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgYWxpZ25tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZV9zaXplICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBjYWNoZXMKLSAgICAgICAgICAgICAgICAgICAgICArIGluZm9fc2l6ZSAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlcyBpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgKyBwcmVkc19zaXplICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBtb2RlcwotICAgICAgICAgICAgICAgICAgICAgICsgc2FtcGxlc19zaXplICAgICAgICAgICAgICAgICAgIC8vIHRvcC9sZWZ0IHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgICArIG56X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2VmZiBjb250ZXh0IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICArIGxmX3N0YXRzX3NpemU7ICAgICAgICAgICAgICAgICAvLyBhdXRvZmlsdGVyIHN0YXRzCisgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpc2l6ZW9mKCplbmMpICAgLy8gbWFpbiBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICArIFdFQlBfQUxJR05fQ1NUICAgICAgICAgICAvLyBjYWNoZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICArIGluZm9fc2l6ZSAgICAgICAgICAgICAgICAvLyBtb2RlcyBpbmZvCisgICAgICAgICAgICAgICAgICAgICAgKyBwcmVkc19zaXplICAgICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBtb2RlcworICAgICAgICAgICAgICAgICAgICAgICsgc2FtcGxlc19zaXplICAgICAgICAgICAgIC8vIHRvcC9sZWZ0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICArIHRvcF9kZXJyX3NpemUgICAgICAgICAgICAvLyB0b3AgZGlmZnVzaW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgKyBuel9zaXplICAgICAgICAgICAgICAgICAgLy8gY29lZmYgY29udGV4dCBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgKyBsZl9zdGF0c19zaXplOyAgICAgICAgICAgLy8gYXV0b2ZpbHRlciBzdGF0cwogCiAjaWZkZWYgUFJJTlRfTUVNT1JZX0lORk8KICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgIHByaW50ZigiTWVtb3J5IHVzZWQ6XG4iCiAgICAgICAgICAiICAgICAgICAgICAgIGVuY29kZXI6ICVsZFxuIgotICAgICAgICAgIiAgICAgICAgIGJsb2NrIGNhY2hlOiAlbGRcbiIKICAgICAgICAgICIgICAgICAgICAgICAgICAgaW5mbzogJWxkXG4iCiAgICAgICAgICAiICAgICAgICAgICAgICAgcHJlZHM6ICVsZFxuIgogICAgICAgICAgIiAgICAgICAgIHRvcCBzYW1wbGVzOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgdG9wIGRpZmZ1c2lvbjogJWxkXG4iCiAgICAgICAgICAiICAgICAgICAgICAgbm9uLXplcm86ICVsZFxuIgogICAgICAgICAgIiAgICAgICAgICAgIGxmLXN0YXRzOiAlbGRcbiIKICAgICAgICAgICIgICAgICAgICAgICAgICB0b3RhbDogJWxkXG4iLAotICAgICAgICAgc2l6ZW9mKFZQOEVuY29kZXIpICsgQUxJR05fQ1NULCBjYWNoZV9zaXplLCBpbmZvX3NpemUsCi0gICAgICAgICBwcmVkc19zaXplLCBzYW1wbGVzX3NpemUsIG56X3NpemUsIGxmX3N0YXRzX3NpemUsIHNpemUpOwotICBwcmludGYoIlRyYW5zY2llbnQgb2JqZWN0IHNpemVzOlxuIgorICAgICAgICAgc2l6ZW9mKCplbmMpICsgV0VCUF9BTElHTl9DU1QsIGluZm9fc2l6ZSwKKyAgICAgICAgIHByZWRzX3NpemUsIHNhbXBsZXNfc2l6ZSwgdG9wX2RlcnJfc2l6ZSwgbnpfc2l6ZSwgbGZfc3RhdHNfc2l6ZSwgc2l6ZSk7CisgIHByaW50ZigiVHJhbnNpZW50IG9iamVjdCBzaXplczpcbiIKICAgICAgICAgICIgICAgICBWUDhFbmNJdGVyYXRvcjogJWxkXG4iCiAgICAgICAgICAiICAgICAgICBWUDhNb2RlU2NvcmU6ICVsZFxuIgogICAgICAgICAgIiAgICAgIFZQOFNlZ21lbnRJbmZvOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgICAgICBWUDhQcm9iYTogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgVlA4RW5jUHJvYmE6ICVsZFxuIgogICAgICAgICAgIiAgICAgICAgICAgICBMRlN0YXRzOiAlbGRcbiIsCiAgICAgICAgICBzaXplb2YoVlA4RW5jSXRlcmF0b3IpLCBzaXplb2YoVlA4TW9kZVNjb3JlKSwKLSAgICAgICAgIHNpemVvZihWUDhTZWdtZW50SW5mbyksIHNpemVvZihWUDhQcm9iYSksCisgICAgICAgICBzaXplb2YoVlA4U2VnbWVudEluZm8pLCBzaXplb2YoVlA4RW5jUHJvYmEpLAogICAgICAgICAgc2l6ZW9mKExGU3RhdHMpKTsKICAgcHJpbnRmKCJQaWN0dXJlIHNpemUgKHl1dik6ICVsZFxuIiwKICAgICAgICAgIG1iX3cgKiBtYl9oICogMzg0ICogc2l6ZW9mKHVpbnQ4X3QpKTsKQEAgLTIzMiw0MSArMjExLDI5IEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgZW5jID0gKFZQOEVuY29kZXIqKW1lbTsKLSAgbWVtID0gKHVpbnQ4X3QqKURPX0FMSUdOKG1lbSArIHNpemVvZigqZW5jKSk7Ci0gIFNiTWVtb3J5U2V0KGVuYywgMCwgc2l6ZW9mKCplbmMpKTsKKyAgbWVtID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04obWVtICsgc2l6ZW9mKCplbmMpKTsKKyAgbWVtc2V0KGVuYywgMCwgc2l6ZW9mKCplbmMpKTsKICAgZW5jLT5udW1fcGFydHNfID0gMSA8PCBjb25maWctPnBhcnRpdGlvbnM7CiAgIGVuYy0+bWJfd18gPSBtYl93OwogICBlbmMtPm1iX2hfID0gbWJfaDsKICAgZW5jLT5wcmVkc193XyA9IHByZWRzX3c7Ci0gIGVuYy0+eXV2X2luXyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBZVVZfU0laRTsKLSAgZW5jLT55dXZfb3V0XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBZVVZfU0laRTsKLSAgZW5jLT55dXZfb3V0Ml8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gWVVWX1NJWkU7Ci0gIGVuYy0+eXV2X3BfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IFBSRURfU0laRTsKICAgZW5jLT5tYl9pbmZvXyA9IChWUDhNQkluZm8qKW1lbTsKICAgbWVtICs9IGluZm9fc2l6ZTsKLSAgZW5jLT5wcmVkc18gPSAoKHVpbnQ4X3QqKW1lbSkgKyAxICsgZW5jLT5wcmVkc193XzsKLSAgbWVtICs9IHByZWRzX3cgKiBwcmVkc19oICogc2l6ZW9mKHVpbnQ4X3QpOwotICBlbmMtPm56XyA9IDEgKyAodWludDMyX3QqKW1lbTsKKyAgZW5jLT5wcmVkc18gPSBtZW0gKyAxICsgZW5jLT5wcmVkc193XzsKKyAgbWVtICs9IHByZWRzX3NpemU7CisgIGVuYy0+bnpfID0gMSArICh1aW50MzJfdCopV0VCUF9BTElHTihtZW0pOwogICBtZW0gKz0gbnpfc2l6ZTsKLSAgZW5jLT5sZl9zdGF0c18gPSBsZl9zdGF0c19zaXplID8gKExGU3RhdHMqKURPX0FMSUdOKG1lbSkgOiBOVUxMOworICBlbmMtPmxmX3N0YXRzXyA9IGxmX3N0YXRzX3NpemUgPyAoTEZTdGF0cyopV0VCUF9BTElHTihtZW0pIDogTlVMTDsKICAgbWVtICs9IGxmX3N0YXRzX3NpemU7CiAKICAgLy8gdG9wIHNhbXBsZXMgKGFsbCAxNi1hbGlnbmVkKQotICBtZW0gPSAodWludDhfdCopRE9fQUxJR04obWVtKTsKLSAgZW5jLT55X3RvcF8gPSAodWludDhfdCopbWVtOworICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0pOworICBlbmMtPnlfdG9wXyA9IG1lbTsKICAgZW5jLT51dl90b3BfID0gZW5jLT55X3RvcF8gKyB0b3Bfc3RyaWRlOwogICBtZW0gKz0gMiAqIHRvcF9zdHJpZGU7Ci0gIG1lbSA9ICh1aW50OF90KilET19BTElHTihtZW0gKyAxKTsKLSAgZW5jLT55X2xlZnRfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDE2ICsgMTY7Ci0gIGVuYy0+dV9sZWZ0XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSAxNjsKLSAgZW5jLT52X2xlZnRfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDg7CisgIGVuYy0+dG9wX2RlcnJfID0gdG9wX2RlcnJfc2l6ZSA/IChERXJyb3IqKW1lbSA6IE5VTEw7CisgIG1lbSArPSB0b3BfZGVycl9zaXplOworICBhc3NlcnQobWVtIDw9ICh1aW50OF90KillbmMgKyBzaXplKTsKIAogICBlbmMtPmNvbmZpZ18gPSBjb25maWc7CiAgIGVuYy0+cHJvZmlsZV8gPSB1c2VfZmlsdGVyID8gKChjb25maWctPmZpbHRlcl90eXBlID09IDEpID8gMCA6IDEpIDogMjsKQEAgLTI3OSwxMyArMjQ2LDE1IEBACiAgIFJlc2V0U2VnbWVudEhlYWRlcihlbmMpOwogICBSZXNldEZpbHRlckhlYWRlcihlbmMpOwogICBSZXNldEJvdW5kYXJ5UHJlZGljdGlvbnMoZW5jKTsKLQorICBWUDhFbmNEc3BDb3N0SW5pdCgpOwogICBWUDhFbmNJbml0QWxwaGEoZW5jKTsKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICBWUDhFbmNJbml0TGF5ZXIoZW5jKTsKLSNlbmRpZgogCi0gIFZQOFRCdWZmZXJJbml0KCZlbmMtPnRva2Vuc18pOworICAvLyBsb3dlciBxdWFsaXR5IG1lYW5zIHNtYWxsZXIgb3V0cHV0IC0+IHdlIG1vZHVsYXRlIGEgbGl0dGxlIHRoZSBwYWdlCisgIC8vIHNpemUgYmFzZWQgb24gcXVhbGl0eS4gVGhpcyBpcyBqdXN0IGEgY3J1ZGUgMXJzdC1vcmRlciBwcmVkaWN0aW9uLgorICB7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSAxLmYgKyBjb25maWctPnF1YWxpdHkgKiA1LmYgLyAxMDAuZjsgIC8vIGluIFsxLDZdCisgICAgVlA4VEJ1ZmZlckluaXQoJmVuYy0+dG9rZW5zXywgKGludCkobWJfdyAqIG1iX2ggKiA0ICogc2NhbGUpKTsKKyAgfQogICByZXR1cm4gZW5jOwogfQogCkBAIC0yOTMsMTkgKzI2MiwxNyBAQAogICBpbnQgb2sgPSAxOwogICBpZiAoZW5jICE9IE5VTEwpIHsKICAgICBvayA9IFZQOEVuY0RlbGV0ZUFscGhhKGVuYyk7Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBWUDhFbmNEZWxldGVMYXllcihlbmMpOwotI2VuZGlmCiAgICAgVlA4VEJ1ZmZlckNsZWFyKCZlbmMtPnRva2Vuc18pOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShlbmMpOworICAgIFdlYlBTYWZlRnJlZShlbmMpOwogICB9CiAgIHJldHVybiBvazsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKIHN0YXRpYyBkb3VibGUgR2V0UFNOUih1aW50NjRfdCBlcnIsIHVpbnQ2NF90IHNpemUpIHsKLSAgcmV0dXJuIGVyciA/IDEwLiAqIGxvZzEwKDI1NS4gKiAyNTUuICogc2l6ZSAvIGVycikgOiA5OS47CisgIHJldHVybiAoZXJyID4gMCAmJiBzaXplID4gMCkgPyAxMC4gKiBsb2cxMCgyNTUuICogMjU1LiAqIHNpemUgLyBlcnIpIDogOTkuOwogfQogCiBzdGF0aWMgdm9pZCBGaW5hbGl6ZVBTTlIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CkBAIC0zMTgsOCArMjg1LDEwIEBACiAgIHN0YXRzLT5QU05SWzNdID0gKGZsb2F0KUdldFBTTlIoc3NlWzBdICsgc3NlWzFdICsgc3NlWzJdLCBzaXplICogMyAvIDIpOwogICBzdGF0cy0+UFNOUls0XSA9IChmbG9hdClHZXRQU05SKHNzZVszXSwgc2l6ZSk7CiB9CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKIAogc3RhdGljIHZvaWQgU3RvcmVTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCiAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBlbmMtPnBpY18tPnN0YXRzOwogICBpZiAoc3RhdHMgIT0gTlVMTCkgewogICAgIGludCBpLCBzOwpAQCAtMzM2LDEzICszMDUsMTUgQEAKICAgICAgIHN0YXRzLT5ibG9ja19jb3VudFtpXSA9IGVuYy0+YmxvY2tfY291bnRfW2ldOwogICAgIH0KICAgfQorI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQogICBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCAxMDAsICZlbmMtPnBlcmNlbnRfKTsgIC8vIGRvbmUhCisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKIH0KIAogaW50IFdlYlBFbmNvZGluZ1NldEVycm9yKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3IpIHsKLSAgU0JfRENIRUNLKChpbnQpZXJyb3IgPCBWUDhfRU5DX0VSUk9SX0xBU1QpOwotICBTQl9EQ0hFQ0soKGludCllcnJvciA+PSBWUDhfRU5DX09LKTsKKyAgYXNzZXJ0KChpbnQpZXJyb3IgPCBWUDhfRU5DX0VSUk9SX0xBU1QpOworICBhc3NlcnQoKGludCllcnJvciA+PSBWUDhfRU5DX09LKTsKICAgKChXZWJQUGljdHVyZSopcGljKS0+ZXJyb3JfY29kZSA9IGVycm9yOwogICByZXR1cm4gMDsKIH0KQEAgLTM2MywyNiArMzM0LDUwIEBACiAKIGludCBXZWJQRW5jb2RlKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZywgV2ViUFBpY3R1cmUqIHBpYykgewogICBpbnQgb2sgPSAwOworICBpZiAocGljID09IE5VTEwpIHJldHVybiAwOwogCi0gIGlmIChwaWMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX09LKTsgIC8vIGFsbCBvayBzbyBmYXIKLSAgaWYgKGNvbmZpZyA9PSBOVUxMKSAgLy8gYmFkIHBhcmFtcworICBpZiAoY29uZmlnID09IE5VTEwpIHsgIC8vIGJhZCBwYXJhbXMKICAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKLSAgaWYgKCFXZWJQVmFsaWRhdGVDb25maWcoY29uZmlnKSkKKyAgfQorICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZyhjb25maWcpKSB7CiAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOwotICBpZiAocGljLT53aWR0aCA8PSAwIHx8IHBpYy0+aGVpZ2h0IDw9IDApCisgIH0KKyAgaWYgKHBpYy0+d2lkdGggPD0gMCB8fCBwaWMtPmhlaWdodCA8PSAwKSB7CiAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OKTsKLSAgaWYgKHBpYy0+d2lkdGggPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgcGljLT5oZWlnaHQgPiBXRUJQX01BWF9ESU1FTlNJT04pCisgIH0KKyAgaWYgKHBpYy0+d2lkdGggPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgcGljLT5oZWlnaHQgPiBXRUJQX01BWF9ESU1FTlNJT04pIHsKICAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CiAKLSAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgU2JNZW1vcnlTZXQocGljLT5zdGF0cywgMCwgc2l6ZW9mKCpwaWMtPnN0YXRzKSk7CisgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIG1lbXNldChwaWMtPnN0YXRzLCAwLCBzaXplb2YoKnBpYy0+c3RhdHMpKTsKIAogICBpZiAoIWNvbmZpZy0+bG9zc2xlc3MpIHsKICAgICBWUDhFbmNvZGVyKiBlbmMgPSBOVUxMOwotICAgIGlmIChwaWMtPnkgPT0gTlVMTCB8fCBwaWMtPnUgPT0gTlVMTCB8fCBwaWMtPnYgPT0gTlVMTCkgeworCisgICAgaWYgKHBpYy0+dXNlX2FyZ2IgfHwgcGljLT55ID09IE5VTEwgfHwgcGljLT51ID09IE5VTEwgfHwgcGljLT52ID09IE5VTEwpIHsKICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIFlVVkEgc2FtcGxlcy4KLSAgICAgIGlmICghV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKHBpYywgV0VCUF9ZVVY0MjApKSByZXR1cm4gMDsKKyAgICAgIGlmIChjb25maWctPnVzZV9zaGFycF95dXYgfHwgKGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmIDQpKSB7CisgICAgICAgIGlmICghV2ViUFBpY3R1cmVTaGFycEFSR0JUb1lVVkEocGljKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBkaXRoZXJpbmcgPSAwLmY7CisgICAgICAgIGlmIChjb25maWctPnByZXByb2Nlc3NpbmcgJiAyKSB7CisgICAgICAgICAgY29uc3QgZmxvYXQgeCA9IGNvbmZpZy0+cXVhbGl0eSAvIDEwMC5mOworICAgICAgICAgIGNvbnN0IGZsb2F0IHgyID0geCAqIHg7CisgICAgICAgICAgLy8gc2xvd2x5IGRlY3JlYXNpbmcgZnJvbSBtYXggZGl0aGVyaW5nIGF0IGxvdyBxdWFsaXR5IChxLT4wKQorICAgICAgICAgIC8vIHRvIDAuNSBkaXRoZXJpbmcgYW1wbGl0dWRlIGF0IGhpZ2ggcXVhbGl0eSAocS0+MTAwKQorICAgICAgICAgIGRpdGhlcmluZyA9IDEuMGYgKyAoMC41ZiAtIDEuMGYpICogeDIgKiB4MjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVdlYlBQaWN0dXJlQVJHQlRvWVVWQURpdGhlcmVkKHBpYywgV0VCUF9ZVVY0MjAsIGRpdGhlcmluZykpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghY29uZmlnLT5leGFjdCkgeworICAgICAgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEocGljKTsKICAgICB9CiAKICAgICBlbmMgPSBJbml0VlA4RW5jb2Rlcihjb25maWcsIHBpYyk7CkBAIC0zOTgsOSArMzkzLDYgQEAKICAgICAgIG9rID0gb2sgJiYgVlA4RW5jVG9rZW5Mb29wKGVuYyk7CiAgICAgfQogICAgIG9rID0gb2sgJiYgVlA4RW5jRmluaXNoQWxwaGEoZW5jKTsKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgIG9rID0gb2sgJiYgVlA4RW5jRmluaXNoTGF5ZXIoZW5jKTsKLSNlbmRpZgogCiAgICAgb2sgPSBvayAmJiBWUDhFbmNXcml0ZShlbmMpOwogICAgIFN0b3JlU3RhdHMoZW5jKTsKQEAgLTQxNCwxMiArNDA2LDEyIEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBpZiAoIWNvbmZpZy0+ZXhhY3QpIHsKKyAgICAgIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhTG9zc2xlc3MocGljKTsKKyAgICB9CisKICAgICBvayA9IFZQOExFbmNvZGVJbWFnZShjb25maWcsIHBpYyk7ICAvLyBTZXRzIHBpYy0+ZXJyb3IgaW4gY2FzZSBvZiBwcm9ibGVtLgogICB9CiAKICAgcmV0dXJuIG9rOwogfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJ3ZWJwCitEZXNjcmlwdGlvbjogTGlicmFyeSBmb3IgdGhlIFdlYlAgZ3JhcGhpY3MgZm9ybWF0CitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sd2VicAorTGlicy5wcml2YXRlOiAtbG0gQFBUSFJFQURfQ0ZMQUdTQCBAUFRIUkVBRF9MSUJTQApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU0MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucmMKQEAgLTAsMCArMSw0MSBAQAorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjaW5jbHVkZSAid2lucmVzLmgiCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiAxLDAsMCwwCisgUFJPRFVDVFZFUlNJT04gMSwwLDAsMAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUsIEluYy4iCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImxpYndlYnAgRExMIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJ3ZWJwLmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTgiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJ3ZWJwLmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJXZWJQIEltYWdlIENvZGVjIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmNjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGlid2VicGRlY29kZXIKK0Rlc2NyaXB0aW9uOiBMaWJyYXJ5IGZvciB0aGUgV2ViUCBncmFwaGljcyBmb3JtYXQgKGRlY29kZSBvbmx5KQorVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbHdlYnBkZWNvZGVyCitMaWJzLnByaXZhdGU6IC1sbSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNACmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyZGVmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5yYwpAQCAtMCwwICsxLDQxIEBACisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIDEsMCwwLDAKKyBQUk9EVUNUVkVSU0lPTiAxLDAsMCwwCisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDFMCisjZWxzZQorIEZJTEVGTEFHUyAweDBMCisjZW5kaWYKKyBGSUxFT1MgMHg0MDAwNEwKKyBGSUxFVFlQRSAweDJMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIkdvb2dsZSwgSW5jLiIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAibGlid2VicGRlY29kZXIgRExMIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJ3ZWJwZGVjb2Rlci5kbGwiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE4IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGlid2VicGRlY29kZXIuZGxsIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIldlYlAgSW1hZ2UgRGVjb2RlciIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3YmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMiBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwbXV4LmxhCisKK2xpYndlYnBtdXhfbGFfU09VUkNFUyA9CitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gYW5pbV9lbmNvZGUuYworbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IGFuaW1pLmgKK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBtdXhlZGl0LmMKK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBtdXhpLmgKK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBtdXhpbnRlcm5hbC5jCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gbXV4cmVhZC5jCisKK2xpYndlYnBtdXhpbmNsdWRlX0hFQURFUlMgPQorbGlid2VicG11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL211eC5oCitsaWJ3ZWJwbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvbXV4X3R5cGVzLmgKK2xpYndlYnBtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC90eXBlcy5oCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitsaWJ3ZWJwbXV4X2xhX0xJQkFERCA9IC4uL2xpYndlYnAubGEKK2xpYndlYnBtdXhfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLXZlcnNpb24taW5mbyAzOjI6MCAtbG0KK2xpYndlYnBtdXhpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCitwa2djb25maWdfREFUQSA9IGxpYndlYnBtdXgucGMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbV9lbmNvZGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbV9lbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU5OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltX2VuY29kZS5jCkBAIC0wLDAgKzEsMTU4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBBbmltRW5jb2RlciBpbXBsZW1lbnRhdGlvbi4KKy8vCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgIC8vIGZvciBwb3coKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKworI2luY2x1ZGUgInNyYy9tdXgvYW5pbWkuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvbXV4LmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBFUlJPUl9TVFJfTUFYX0xFTkdUSCAxMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIHN0cnVjdHMuCisKKy8vIFN0b3JlcyBmcmFtZSByZWN0YW5nbGUgZGltZW5zaW9ucy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHhfb2Zmc2V0XywgeV9vZmZzZXRfLCB3aWR0aF8sIGhlaWdodF87Cit9IEZyYW1lUmVjdGFuZ2xlOworCisvLyBVc2VkIHRvIHN0b3JlIHR3byBjYW5kaWRhdGVzIG9mIGVuY29kZWQgZGF0YSBmb3IgYW4gYW5pbWF0aW9uIGZyYW1lLiBPbmUgb2YKKy8vIHRoZSB0d28gd2lsbCBiZSBjaG9zZW4gbGF0ZXIuCit0eXBlZGVmIHN0cnVjdCB7CisgIFdlYlBNdXhGcmFtZUluZm8gc3ViX2ZyYW1lXzsgIC8vIEVuY29kZWQgZnJhbWUgcmVjdGFuZ2xlLgorICBXZWJQTXV4RnJhbWVJbmZvIGtleV9mcmFtZV87ICAvLyBFbmNvZGVkIGZyYW1lIGlmIGl0IGlzIGEga2V5LWZyYW1lLgorICBpbnQgaXNfa2V5X2ZyYW1lXzsgICAgICAgICAgICAvLyBUcnVlIGlmICdrZXlfZnJhbWUnIGhhcyBiZWVuIGNob3Nlbi4KK30gRW5jb2RlZEZyYW1lOworCitzdHJ1Y3QgV2ViUEFuaW1FbmNvZGVyIHsKKyAgY29uc3QgaW50IGNhbnZhc193aWR0aF87ICAgICAgICAgICAgICAgICAgLy8gQ2FudmFzIHdpZHRoLgorICBjb25zdCBpbnQgY2FudmFzX2hlaWdodF87ICAgICAgICAgICAgICAgICAvLyBDYW52YXMgaGVpZ2h0LgorICBjb25zdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zIG9wdGlvbnNfOyAgICAvLyBHbG9iYWwgZW5jb2Rpbmcgb3B0aW9ucy4KKworICBGcmFtZVJlY3RhbmdsZSBwcmV2X3JlY3RfOyAgICAgICAgICAvLyBQcmV2aW91cyBXZWJQIGZyYW1lIHJlY3RhbmdsZS4KKyAgV2ViUENvbmZpZyBsYXN0X2NvbmZpZ187ICAgICAgICAgICAgLy8gQ2FjaGVkIGluIGNhc2UgYSByZS1lbmNvZGUgaXMgbmVlZGVkLgorICBXZWJQQ29uZmlnIGxhc3RfY29uZmlnX3JldmVyc2VkXzsgICAvLyBJZiAnbGFzdF9jb25maWdfJyB1c2VzIGxvc3NsZXNzLCB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY29uZmlnIHVzZXMgbG9zc3kgYW5kIHZpY2UgdmVyc2E7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdmFsaWQgaWYgJ29wdGlvbnNfLmFsbG93X21peGVkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0cnVlLgorCisgIFdlYlBQaWN0dXJlKiBjdXJyX2NhbnZhc187ICAgICAgICAgIC8vIE9ubHkgcG9pbnRlcjsgd2UgZG9uJ3Qgb3duIG1lbW9yeS4KKworICAvLyBDYW52YXMgYnVmZmVycy4KKyAgV2ViUFBpY3R1cmUgY3Vycl9jYW52YXNfY29weV87ICAgICAgLy8gUG9zc2libHkgbW9kaWZpZWQgY3VycmVudCBjYW52YXMuCisgIGludCBjdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXzsgICAgIC8vIFRydWUgaWYgcGl4ZWxzIGluICdjdXJyX2NhbnZhc19jb3B5XycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyIGZyb20gdGhvc2UgaW4gJ2N1cnJfY2FudmFzXycuCisKKyAgV2ViUFBpY3R1cmUgcHJldl9jYW52YXNfOyAgICAgICAgICAgLy8gUHJldmlvdXMgY2FudmFzLgorICBXZWJQUGljdHVyZSBwcmV2X2NhbnZhc19kaXNwb3NlZF87ICAvLyBQcmV2aW91cyBjYW52YXMgZGlzcG9zZWQgdG8gYmFja2dyb3VuZC4KKworICAvLyBFbmNvZGVkIGRhdGEuCisgIEVuY29kZWRGcmFtZSogZW5jb2RlZF9mcmFtZXNfOyAgICAgIC8vIEFycmF5IG9mIGVuY29kZWQgZnJhbWVzLgorICBzaXplX3Qgc2l6ZV87ICAgICAgICAgICAgIC8vIE51bWJlciBvZiBhbGxvY2F0ZWQgZnJhbWVzLgorICBzaXplX3Qgc3RhcnRfOyAgICAgICAgICAgIC8vIEZyYW1lIHN0YXJ0IGluZGV4LgorICBzaXplX3QgY291bnRfOyAgICAgICAgICAgIC8vIE51bWJlciBvZiB2YWxpZCBmcmFtZXMuCisgIHNpemVfdCBmbHVzaF9jb3VudF87ICAgICAgLy8gSWYgPjAsICdmbHVzaF9jb3VudCcgZnJhbWVzIHN0YXJ0aW5nIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnc3RhcnQnIGFyZSByZWFkeSB0byBiZSBhZGRlZCB0byBtdXguCisKKyAgLy8ga2V5LWZyYW1lIHJlbGF0ZWQuCisgIGludDY0X3QgYmVzdF9kZWx0YV87ICAgICAgLy8gbWluKGNhbnZhcyBzaXplIC0gZnJhbWUgc2l6ZSkgb3ZlciB0aGUgZnJhbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSBuZWdhdGl2ZSBpbiBjZXJ0YWluIGNhc2VzIGR1ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zcGFyZW50IHBpeGVscyBpbiBhIGZyYW1lLgorICBpbnQga2V5ZnJhbWVfOyAgICAgICAgICAgIC8vIEluZGV4IG9mIHNlbGVjdGVkIGtleS1mcmFtZSByZWxhdGl2ZSB0byAnc3RhcnRfJy4KKyAgaW50IGNvdW50X3NpbmNlX2tleV9mcmFtZV87ICAgICAvLyBGcmFtZXMgc2VlbiBzaW5jZSB0aGUgbGFzdCBrZXktZnJhbWUuCisKKyAgaW50IGZpcnN0X3RpbWVzdGFtcF87ICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IGZyYW1lLgorICBpbnQgcHJldl90aW1lc3RhbXBfOyAgICAgICAgICAgIC8vIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBhZGRlZCBmcmFtZS4KKyAgaW50IHByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF87ICAvLyBUcnVlIGlmIGl0J3Mgbm90IHlldCBkZWNpZGVkIGlmIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWUgd291bGQgYmUgYSBzdWItZnJhbWUgb3IgYSBrZXktZnJhbWUuCisKKyAgLy8gTWlzYy4KKyAgaW50IGlzX2ZpcnN0X2ZyYW1lXzsgIC8vIFRydWUgaWYgZmlyc3QgZnJhbWUgaXMgeWV0IHRvIGJlIGFkZGVkL2JlaW5nIGFkZGVkLgorICBpbnQgZ290X251bGxfZnJhbWVfOyAgLy8gVHJ1ZSBpZiBXZWJQQW5pbUVuY29kZXJBZGQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBhIE5VTEwgZnJhbWUuCisKKyAgc2l6ZV90IGluX2ZyYW1lX2NvdW50XzsgICAvLyBOdW1iZXIgb2YgaW5wdXQgZnJhbWVzIHByb2Nlc3NlZCBzbyBmYXIuCisgIHNpemVfdCBvdXRfZnJhbWVfY291bnRfOyAgLy8gTnVtYmVyIG9mIGZyYW1lcyBhZGRlZCB0byBtdXggc28gZmFyLiBUaGlzIG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBmcm9tICdpbl9mcmFtZV9jb3VudF8nIGR1ZSB0byBtZXJnaW5nLgorCisgIFdlYlBNdXgqIG11eF87ICAgICAgICAvLyBNdXhlciB0byBhc3NlbWJsZSB0aGUgV2ViUCBiaXRzdHJlYW0uCisgIGNoYXIgZXJyb3Jfc3RyX1tFUlJPUl9TVFJfTUFYX0xFTkdUSF07ICAvLyBFcnJvciBzdHJpbmcuIEVtcHR5IGlmIG5vIGVycm9yLgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgV2ViUEFuaW1FbmNvZGVyIG9iamVjdC4KKworI2RlZmluZSBERUxUQV9JTkZJTklUWSAgICAgICgxVUxMIDw8IDMyKQorI2RlZmluZSBLRVlGUkFNRV9OT05FICAgICAgICgtMSkKKworLy8gUmVzZXQgdGhlIGNvdW50ZXJzIGluIHRoZSBXZWJQQW5pbUVuY29kZXIuCitzdGF0aWMgdm9pZCBSZXNldENvdW50ZXJzKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jKSB7CisgIGVuYy0+c3RhcnRfID0gMDsKKyAgZW5jLT5jb3VudF8gPSAwOworICBlbmMtPmZsdXNoX2NvdW50XyA9IDA7CisgIGVuYy0+YmVzdF9kZWx0YV8gPSBERUxUQV9JTkZJTklUWTsKKyAgZW5jLT5rZXlmcmFtZV8gPSBLRVlGUkFNRV9OT05FOworfQorCitzdGF0aWMgdm9pZCBEaXNhYmxlS2V5ZnJhbWVzKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGNvbnN0IGVuY19vcHRpb25zKSB7CisgIGVuY19vcHRpb25zLT5rbWF4ID0gSU5UX01BWDsKKyAgZW5jX29wdGlvbnMtPmttaW4gPSBlbmNfb3B0aW9ucy0+a21heCAtIDE7Cit9CisKKyNkZWZpbmUgTUFYX0NBQ0hFRF9GUkFNRVMgMzAKKworc3RhdGljIHZvaWQgU2FuaXRpemVFbmNvZGVyT3B0aW9ucyhXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBjb25zdCBlbmNfb3B0aW9ucykgeworICBpbnQgcHJpbnRfd2FybmluZyA9IGVuY19vcHRpb25zLT52ZXJib3NlOworCisgIGlmIChlbmNfb3B0aW9ucy0+bWluaW1pemVfc2l6ZSkgeworICAgIERpc2FibGVLZXlmcmFtZXMoZW5jX29wdGlvbnMpOworICB9CisKKyAgaWYgKGVuY19vcHRpb25zLT5rbWF4ID09IDEpIHsgIC8vIEFsbCBmcmFtZXMgd2lsbCBiZSBrZXktZnJhbWVzLgorICAgIGVuY19vcHRpb25zLT5rbWluID0gMDsKKyAgICBlbmNfb3B0aW9ucy0+a21heCA9IDA7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGVuY19vcHRpb25zLT5rbWF4IDw9IDApIHsKKyAgICBEaXNhYmxlS2V5ZnJhbWVzKGVuY19vcHRpb25zKTsKKyAgICBwcmludF93YXJuaW5nID0gMDsKKyAgfQorCisgIGlmIChlbmNfb3B0aW9ucy0+a21pbiA+PSBlbmNfb3B0aW9ucy0+a21heCkgeworICAgIGVuY19vcHRpb25zLT5rbWluID0gZW5jX29wdGlvbnMtPmttYXggLSAxOworICAgIGlmIChwcmludF93YXJuaW5nKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFNldHRpbmcga21pbiA9ICVkLCBzbyB0aGF0IGttaW4gPCBrbWF4LlxuIiwKKyAgICAgICAgICAgICAgZW5jX29wdGlvbnMtPmttaW4pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQga21pbl9saW1pdCA9IGVuY19vcHRpb25zLT5rbWF4IC8gMiArIDE7CisgICAgaWYgKGVuY19vcHRpb25zLT5rbWluIDwga21pbl9saW1pdCAmJiBrbWluX2xpbWl0IDwgZW5jX29wdGlvbnMtPmttYXgpIHsKKyAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGVuYy5rZXlmcmFtZSArIGttaW4gPj0ga21heCBpcyBhbHdheXMgdHJ1ZS4gU28sIHdlCisgICAgICAvLyBjYW4gZmx1c2ggYWxsIHRoZSBmcmFtZXMgaW4gdGhlICdjb3VudF9zaW5jZV9rZXlfZnJhbWUgPT0ga21heCcgY2FzZS4KKyAgICAgIGVuY19vcHRpb25zLT5rbWluID0ga21pbl9saW1pdDsKKyAgICAgIGlmIChwcmludF93YXJuaW5nKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJXQVJOSU5HOiBTZXR0aW5nIGttaW4gPSAlZCwgc28gdGhhdCBrbWluID49IGttYXggLyAyICsgMS5cbiIsCisgICAgICAgICAgICAgICAgZW5jX29wdGlvbnMtPmttaW4pOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBMaW1pdCB0aGUgbWF4IG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgYWxsb2NhdGVkLgorICBpZiAoZW5jX29wdGlvbnMtPmttYXggLSBlbmNfb3B0aW9ucy0+a21pbiA+IE1BWF9DQUNIRURfRlJBTUVTKSB7CisgICAgZW5jX29wdGlvbnMtPmttaW4gPSBlbmNfb3B0aW9ucy0+a21heCAtIE1BWF9DQUNIRURfRlJBTUVTOworICAgIGlmIChwcmludF93YXJuaW5nKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgIldBUk5JTkc6IFNldHRpbmcga21pbiA9ICVkLCBzbyB0aGF0IGttYXggLSBrbWluIDw9ICVkLlxuIiwKKyAgICAgICAgICAgICAgZW5jX29wdGlvbnMtPmttaW4sIE1BWF9DQUNIRURfRlJBTUVTKTsKKyAgICB9CisgIH0KKyAgYXNzZXJ0KGVuY19vcHRpb25zLT5rbWluIDwgZW5jX29wdGlvbnMtPmttYXgpOworfQorCisjdW5kZWYgTUFYX0NBQ0hFRF9GUkFNRVMKKworc3RhdGljIHZvaWQgRGVmYXVsdEVuY29kZXJPcHRpb25zKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGNvbnN0IGVuY19vcHRpb25zKSB7CisgIGVuY19vcHRpb25zLT5hbmltX3BhcmFtcy5sb29wX2NvdW50ID0gMDsKKyAgZW5jX29wdGlvbnMtPmFuaW1fcGFyYW1zLmJnY29sb3IgPSAweGZmZmZmZmZmOyAgLy8gV2hpdGUuCisgIGVuY19vcHRpb25zLT5taW5pbWl6ZV9zaXplID0gMDsKKyAgRGlzYWJsZUtleWZyYW1lcyhlbmNfb3B0aW9ucyk7CisgIGVuY19vcHRpb25zLT5hbGxvd19taXhlZCA9IDA7CisgIGVuY19vcHRpb25zLT52ZXJib3NlID0gMDsKK30KKworaW50IFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogZW5jX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJpX3ZlcnNpb24pIHsKKyAgaWYgKGVuY19vcHRpb25zID09IE5VTEwgfHwKKyAgICAgIFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRShhYmlfdmVyc2lvbiwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRGVmYXVsdEVuY29kZXJPcHRpb25zKGVuY19vcHRpb25zKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFRoaXMgc3RhcnRpbmcgdmFsdWUgaXMgbW9yZSBmaXQgdG8gV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWFMb3NzbGVzcygpLgorI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAgIDB4MDAwMDAwMDAKKworc3RhdGljIHZvaWQgQ2xlYXJSZWN0YW5nbGUoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBqOworICBmb3IgKGogPSB0b3A7IGogPCB0b3AgKyBoZWlnaHQ7ICsraikgeworICAgIHVpbnQzMl90KiBjb25zdCBkc3QgPSBwaWN0dXJlLT5hcmdiICsgaiAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgIGludCBpOworICAgIGZvciAoaSA9IGxlZnQ7IGkgPCBsZWZ0ICsgd2lkdGg7ICsraSkgeworICAgICAgZHN0W2ldID0gVFJBTlNQQVJFTlRfQ09MT1I7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFdlYlBVdGlsQ2xlYXJQaWMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0KSB7CisgIGlmIChyZWN0ICE9IE5VTEwpIHsKKyAgICBDbGVhclJlY3RhbmdsZShwaWN0dXJlLCByZWN0LT54X29mZnNldF8sIHJlY3QtPnlfb2Zmc2V0XywKKyAgICAgICAgICAgICAgICAgICByZWN0LT53aWR0aF8sIHJlY3QtPmhlaWdodF8pOworICB9IGVsc2UgeworICAgIENsZWFyUmVjdGFuZ2xlKHBpY3R1cmUsIDAsIDAsIHBpY3R1cmUtPndpZHRoLCBwaWN0dXJlLT5oZWlnaHQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIE1hcmtOb0Vycm9yKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jKSB7CisgIGVuYy0+ZXJyb3Jfc3RyX1swXSA9ICdcMCc7ICAvLyBFbXB0eSBzdHJpbmcuCit9CisKK3N0YXRpYyB2b2lkIE1hcmtFcnJvcihXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywgY29uc3QgY2hhciogc3RyKSB7CisgIGlmIChzbnByaW50ZihlbmMtPmVycm9yX3N0cl8sIEVSUk9SX1NUUl9NQVhfTEVOR1RILCAiJXMuIiwgc3RyKSA8IDApIHsKKyAgICBhc3NlcnQoMCk7ICAvLyBGSVggTUUhCisgIH0KK30KKworc3RhdGljIHZvaWQgTWFya0Vycm9yMihXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyLCBpbnQgZXJyb3JfY29kZSkgeworICBpZiAoc25wcmludGYoZW5jLT5lcnJvcl9zdHJfLCBFUlJPUl9TVFJfTUFYX0xFTkdUSCwgIiVzOiAlZC4iLCBzdHIsCisgICAgICAgICAgICAgICBlcnJvcl9jb2RlKSA8IDApIHsKKyAgICBhc3NlcnQoMCk7ICAvLyBGSVggTUUhCisgIH0KK30KKworV2ViUEFuaW1FbmNvZGVyKiBXZWJQQW5pbUVuY29kZXJOZXdJbnRlcm5hbCgKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGVuY19vcHRpb25zLAorICAgIGludCBhYmlfdmVyc2lvbikgeworICBXZWJQQW5pbUVuY29kZXIqIGVuYzsKKworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGFiaV92ZXJzaW9uLCBXRUJQX01VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fAorICAgICAgKHdpZHRoICogKHVpbnQ2NF90KWhlaWdodCkgPj0gTUFYX0lNQUdFX0FSRUEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGVuYyA9IChXZWJQQW5pbUVuY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDEsIHNpemVvZigqZW5jKSk7CisgIGlmIChlbmMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIC8vIHNhbml0eSBpbml0cywgc28gd2UgY2FuIGNhbGwgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKCk6CisgIGVuYy0+ZW5jb2RlZF9mcmFtZXNfID0gTlVMTDsKKyAgZW5jLT5tdXhfID0gTlVMTDsKKyAgTWFya05vRXJyb3IoZW5jKTsKKworICAvLyBEaW1lbnNpb25zIGFuZCBvcHRpb25zLgorICAqKGludCopJmVuYy0+Y2FudmFzX3dpZHRoXyA9IHdpZHRoOworICAqKGludCopJmVuYy0+Y2FudmFzX2hlaWdodF8gPSBoZWlnaHQ7CisgIGlmIChlbmNfb3B0aW9ucyAhPSBOVUxMKSB7CisgICAgKihXZWJQQW5pbUVuY29kZXJPcHRpb25zKikmZW5jLT5vcHRpb25zXyA9ICplbmNfb3B0aW9uczsKKyAgICBTYW5pdGl6ZUVuY29kZXJPcHRpb25zKChXZWJQQW5pbUVuY29kZXJPcHRpb25zKikmZW5jLT5vcHRpb25zXyk7CisgIH0gZWxzZSB7CisgICAgRGVmYXVsdEVuY29kZXJPcHRpb25zKChXZWJQQW5pbUVuY29kZXJPcHRpb25zKikmZW5jLT5vcHRpb25zXyk7CisgIH0KKworICAvLyBDYW52YXMgYnVmZmVycy4KKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJmVuYy0+Y3Vycl9jYW52YXNfY29weV8pIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZlbmMtPnByZXZfY2FudmFzXykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJmVuYy0+cHJldl9jYW52YXNfZGlzcG9zZWRfKSkgeworICAgIGdvdG8gRXJyOworICB9CisgIGVuYy0+Y3Vycl9jYW52YXNfY29weV8ud2lkdGggPSB3aWR0aDsKKyAgZW5jLT5jdXJyX2NhbnZhc19jb3B5Xy5oZWlnaHQgPSBoZWlnaHQ7CisgIGVuYy0+Y3Vycl9jYW52YXNfY29weV8udXNlX2FyZ2IgPSAxOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJmVuYy0+Y3Vycl9jYW52YXNfY29weV8pIHx8CisgICAgICAhV2ViUFBpY3R1cmVDb3B5KCZlbmMtPmN1cnJfY2FudmFzX2NvcHlfLCAmZW5jLT5wcmV2X2NhbnZhc18pIHx8CisgICAgICAhV2ViUFBpY3R1cmVDb3B5KCZlbmMtPmN1cnJfY2FudmFzX2NvcHlfLCAmZW5jLT5wcmV2X2NhbnZhc19kaXNwb3NlZF8pKSB7CisgICAgZ290byBFcnI7CisgIH0KKyAgV2ViUFV0aWxDbGVhclBpYygmZW5jLT5wcmV2X2NhbnZhc18sIE5VTEwpOworICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0gMTsKKworICAvLyBFbmNvZGVkIGZyYW1lcy4KKyAgUmVzZXRDb3VudGVycyhlbmMpOworICAvLyBOb3RlOiBvbmUgZXh0cmEgc3RvcmFnZSBpcyBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLgorICBlbmMtPnNpemVfID0gZW5jLT5vcHRpb25zXy5rbWF4IC0gZW5jLT5vcHRpb25zXy5rbWluICsgMTsKKyAgLy8gV2UgbmVlZCBzcGFjZSBmb3IgYXQgbGVhc3QgMiBmcmFtZXMuIEJ1dCB3aGVuIGttaW4sIGttYXggYXJlIGJvdGggemVybywKKyAgLy8gZW5jLT5zaXplXyB3aWxsIGJlIDEuIFNvIHdlIGhhbmRsZSB0aGF0IHNwZWNpYWwgY2FzZSBiZWxvdy4KKyAgaWYgKGVuYy0+c2l6ZV8gPCAyKSBlbmMtPnNpemVfID0gMjsKKyAgZW5jLT5lbmNvZGVkX2ZyYW1lc18gPQorICAgICAgKEVuY29kZWRGcmFtZSopV2ViUFNhZmVDYWxsb2MoZW5jLT5zaXplXywgc2l6ZW9mKCplbmMtPmVuY29kZWRfZnJhbWVzXykpOworICBpZiAoZW5jLT5lbmNvZGVkX2ZyYW1lc18gPT0gTlVMTCkgZ290byBFcnI7CisKKyAgZW5jLT5tdXhfID0gV2ViUE11eE5ldygpOworICBpZiAoZW5jLT5tdXhfID09IE5VTEwpIGdvdG8gRXJyOworCisgIGVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXyA9IDA7CisgIGVuYy0+Zmlyc3RfdGltZXN0YW1wXyA9IDA7CisgIGVuYy0+cHJldl90aW1lc3RhbXBfID0gMDsKKyAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMDsKKyAgZW5jLT5pc19maXJzdF9mcmFtZV8gPSAxOworICBlbmMtPmdvdF9udWxsX2ZyYW1lXyA9IDA7CisKKyAgcmV0dXJuIGVuYzsgIC8vIEFsbCBPSy4KKworIEVycjoKKyAgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKGVuYyk7CisgIHJldHVybiBOVUxMOworfQorCisvLyBSZWxlYXNlIHRoZSBkYXRhIGNvbnRhaW5lZCBieSAnZW5jb2RlZF9mcmFtZScuCitzdGF0aWMgdm9pZCBGcmFtZVJlbGVhc2UoRW5jb2RlZEZyYW1lKiBjb25zdCBlbmNvZGVkX2ZyYW1lKSB7CisgIGlmIChlbmNvZGVkX2ZyYW1lICE9IE5VTEwpIHsKKyAgICBXZWJQRGF0YUNsZWFyKCZlbmNvZGVkX2ZyYW1lLT5zdWJfZnJhbWVfLmJpdHN0cmVhbSk7CisgICAgV2ViUERhdGFDbGVhcigmZW5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lXy5iaXRzdHJlYW0pOworICAgIG1lbXNldChlbmNvZGVkX2ZyYW1lLCAwLCBzaXplb2YoKmVuY29kZWRfZnJhbWUpKTsKKyAgfQorfQorCit2b2lkIFdlYlBBbmltRW5jb2RlckRlbGV0ZShXZWJQQW5pbUVuY29kZXIqIGVuYykgeworICBpZiAoZW5jICE9IE5VTEwpIHsKKyAgICBXZWJQUGljdHVyZUZyZWUoJmVuYy0+Y3Vycl9jYW52YXNfY29weV8pOworICAgIFdlYlBQaWN0dXJlRnJlZSgmZW5jLT5wcmV2X2NhbnZhc18pOworICAgIFdlYlBQaWN0dXJlRnJlZSgmZW5jLT5wcmV2X2NhbnZhc19kaXNwb3NlZF8pOworICAgIGlmIChlbmMtPmVuY29kZWRfZnJhbWVzXyAhPSBOVUxMKSB7CisgICAgICBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmMtPnNpemVfOyArK2kpIHsKKyAgICAgICAgRnJhbWVSZWxlYXNlKCZlbmMtPmVuY29kZWRfZnJhbWVzX1tpXSk7CisgICAgICB9CisgICAgICBXZWJQU2FmZUZyZWUoZW5jLT5lbmNvZGVkX2ZyYW1lc18pOworICAgIH0KKyAgICBXZWJQTXV4RGVsZXRlKGVuYy0+bXV4Xyk7CisgICAgV2ViUFNhZmVGcmVlKGVuYyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZyYW1lIGFkZGl0aW9uLgorCisvLyBSZXR1cm5zIGNhY2hlZCBmcmFtZSBhdCB0aGUgZ2l2ZW4gJ3Bvc2l0aW9uJy4KK3N0YXRpYyBFbmNvZGVkRnJhbWUqIEdldEZyYW1lKGNvbnN0IFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uKSB7CisgIGFzc2VydChlbmMtPnN0YXJ0XyArIHBvc2l0aW9uIDwgZW5jLT5zaXplXyk7CisgIHJldHVybiAmZW5jLT5lbmNvZGVkX2ZyYW1lc19bZW5jLT5zdGFydF8gKyBwb3NpdGlvbl07Cit9CisKK3R5cGVkZWYgaW50ICgqQ29tcGFyZVBpeGVsc0Z1bmMpKGNvbnN0IHVpbnQzMl90KiwgaW50LCBjb25zdCB1aW50MzJfdCosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50KTsKKworLy8gUmV0dXJucyB0cnVlIGlmICdsZW5ndGgnIG51bWJlciBvZiBwaXhlbHMgaW4gJ3NyYycgYW5kICdkc3QnIGFyZSBlcXVhbCwKKy8vIGFzc3VtaW5nIHRoZSBnaXZlbiBzdGVwIHNpemVzIGJldHdlZW4gcGl4ZWxzLgorLy8gJ21heF9hbGxvd2VkX2RpZmYnIGlzIHVudXNlZCBhbmQgb25seSB0aGVyZSB0byBhbGxvdyBmdW5jdGlvbiBwb2ludGVyIHVzZS4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQ29tcGFyZVBpeGVsc0xvc3NsZXNzKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIGludCBtYXhfYWxsb3dlZF9kaWZmKSB7CisgICh2b2lkKW1heF9hbGxvd2VkX2RpZmY7CisgIGFzc2VydChsZW5ndGggPiAwKTsKKyAgd2hpbGUgKGxlbmd0aC0tID4gMCkgeworICAgIGlmICgqc3JjICE9ICpkc3QpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzcmMgKz0gc3JjX3N0ZXA7CisgICAgZHN0ICs9IGRzdF9zdGVwOworICB9CisgIHJldHVybiAxOworfQorCisvLyBIZWxwZXIgdG8gY2hlY2sgaWYgZWFjaCBjaGFubmVsIGluICdzcmMnIGFuZCAnZHN0JyBpcyBhdCBtb3N0IG9mZiBieQorLy8gJ21heF9hbGxvd2VkX2RpZmYnLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhlbHNBcmVTaW1pbGFyKHVpbnQzMl90IHNyYywgdWludDMyX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYWxsb3dlZF9kaWZmKSB7CisgIGNvbnN0IGludCBzcmNfYSA9IChzcmMgPj4gMjQpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19yID0gKHNyYyA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgc3JjX2cgPSAoc3JjID4+IDgpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19iID0gKHNyYyA+PiAwKSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfYSA9IChkc3QgPj4gMjQpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9yID0gKGRzdCA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2cgPSAoZHN0ID4+IDgpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9iID0gKGRzdCA+PiAwKSAmIDB4ZmY7CisKKyAgcmV0dXJuIChzcmNfYSA9PSBkc3RfYSkgJiYKKyAgICAgICAgIChhYnMoc3JjX3IgLSBkc3RfcikgKiBkc3RfYSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpICYmCisgICAgICAgICAoYWJzKHNyY19nIC0gZHN0X2cpICogZHN0X2EgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKSAmJgorICAgICAgICAgKGFicyhzcmNfYiAtIGRzdF9iKSAqIGRzdF9hIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiAnbGVuZ3RoJyBudW1iZXIgb2YgcGl4ZWxzIGluICdzcmMnIGFuZCAnZHN0JyBhcmUgd2l0aGluIGFuCisvLyBlcnJvciBib3VuZCwgYXNzdW1pbmcgdGhlIGdpdmVuIHN0ZXAgc2l6ZXMgYmV0d2VlbiBwaXhlbHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IENvbXBhcmVQaXhlbHNMb3NzeShjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgbWF4X2FsbG93ZWRfZGlmZikgeworICBhc3NlcnQobGVuZ3RoID4gMCk7CisgIHdoaWxlIChsZW5ndGgtLSA+IDApIHsKKyAgICBpZiAoIVBpeGVsc0FyZVNpbWlsYXIoKnNyYywgKmRzdCwgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzcmMgKz0gc3JjX3N0ZXA7CisgICAgZHN0ICs9IGRzdF9zdGVwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IElzRW1wdHlSZWN0KGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0KSB7CisgIHJldHVybiAocmVjdC0+d2lkdGhfID09IDApIHx8IChyZWN0LT5oZWlnaHRfID09IDApOworfQorCitzdGF0aWMgaW50IFF1YWxpdHlUb01heERpZmYoZmxvYXQgcXVhbGl0eSkgeworICBjb25zdCBkb3VibGUgdmFsID0gcG93KHF1YWxpdHkgLyAxMDAuLCAwLjUpOworICBjb25zdCBkb3VibGUgbWF4X2RpZmYgPSAzMSAqICgxIC0gdmFsKSArIDEgKiB2YWw7CisgIHJldHVybiAoaW50KShtYXhfZGlmZiArIDAuNSk7Cit9CisKKy8vIEFzc3VtZXMgdGhhdCBhbiBpbml0aWFsIHZhbGlkIGd1ZXNzIG9mIGNoYW5nZSByZWN0YW5nbGUgJ3JlY3QnIGlzIHBhc3NlZC4KK3N0YXRpYyB2b2lkIE1pbmltaXplQ2hhbmdlUmVjdGFuZ2xlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbG9zc2xlc3MsIGZsb2F0IHF1YWxpdHkpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IENvbXBhcmVQaXhlbHNGdW5jIGNvbXBhcmVfcGl4ZWxzID0KKyAgICAgIGlzX2xvc3NsZXNzID8gQ29tcGFyZVBpeGVsc0xvc3NsZXNzIDogQ29tcGFyZVBpeGVsc0xvc3N5OworICBjb25zdCBpbnQgbWF4X2FsbG93ZWRfZGlmZl9sb3NzeSA9IFF1YWxpdHlUb01heERpZmYocXVhbGl0eSk7CisgIGNvbnN0IGludCBtYXhfYWxsb3dlZF9kaWZmID0gaXNfbG9zc2xlc3MgPyAwIDogbWF4X2FsbG93ZWRfZGlmZl9sb3NzeTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXyA8PSBkc3QtPndpZHRoKTsKKyAgYXNzZXJ0KHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF8gPD0gZHN0LT5oZWlnaHQpOworCisgIC8vIExlZnQgYm91bmRhcnkuCisgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0XzsgaSA8IHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXzsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19hcmdiID0KKyAgICAgICAgJnNyYy0+YXJnYltyZWN0LT55X29mZnNldF8gKiBzcmMtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdF9hcmdiID0KKyAgICAgICAgJmRzdC0+YXJnYltyZWN0LT55X29mZnNldF8gKiBkc3QtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgaWYgKGNvbXBhcmVfcGl4ZWxzKHNyY19hcmdiLCBzcmMtPmFyZ2Jfc3RyaWRlLCBkc3RfYXJnYiwgZHN0LT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+aGVpZ2h0XywgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgIC0tcmVjdC0+d2lkdGhfOyAgLy8gUmVkdW5kYW50IGNvbHVtbi4KKyAgICAgICsrcmVjdC0+eF9vZmZzZXRfOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHJlY3QtPndpZHRoXyA9PSAwKSBnb3RvIE5vQ2hhbmdlOworCisgIC8vIFJpZ2h0IGJvdW5kYXJ5LgorICBmb3IgKGkgPSByZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF8gLSAxOyBpID49IHJlY3QtPnhfb2Zmc2V0XzsgLS1pKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19hcmdiID0KKyAgICAgICAgJnNyYy0+YXJnYltyZWN0LT55X29mZnNldF8gKiBzcmMtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdF9hcmdiID0KKyAgICAgICAgJmRzdC0+YXJnYltyZWN0LT55X29mZnNldF8gKiBkc3QtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgaWYgKGNvbXBhcmVfcGl4ZWxzKHNyY19hcmdiLCBzcmMtPmFyZ2Jfc3RyaWRlLCBkc3RfYXJnYiwgZHN0LT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+aGVpZ2h0XywgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgIC0tcmVjdC0+d2lkdGhfOyAgLy8gUmVkdW5kYW50IGNvbHVtbi4KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZWN0LT53aWR0aF8gPT0gMCkgZ290byBOb0NoYW5nZTsKKworICAvLyBUb3AgYm91bmRhcnkuCisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0XzsgaiA8IHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF87ICsraikgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfYXJnYiA9CisgICAgICAgICZzcmMtPmFyZ2JbaiAqIHNyYy0+YXJnYl9zdHJpZGUgKyByZWN0LT54X29mZnNldF9dOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3RfYXJnYiA9CisgICAgICAgICZkc3QtPmFyZ2JbaiAqIGRzdC0+YXJnYl9zdHJpZGUgKyByZWN0LT54X29mZnNldF9dOworICAgIGlmIChjb21wYXJlX3BpeGVscyhzcmNfYXJnYiwgMSwgZHN0X2FyZ2IsIDEsIHJlY3QtPndpZHRoXywKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgIC0tcmVjdC0+aGVpZ2h0XzsgIC8vIFJlZHVuZGFudCByb3cuCisgICAgICArK3JlY3QtPnlfb2Zmc2V0XzsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZWN0LT5oZWlnaHRfID09IDApIGdvdG8gTm9DaGFuZ2U7CisKKyAgLy8gQm90dG9tIGJvdW5kYXJ5LgorICBmb3IgKGogPSByZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfIC0gMTsgaiA+PSByZWN0LT55X29mZnNldF87IC0taikgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfYXJnYiA9CisgICAgICAgICZzcmMtPmFyZ2JbaiAqIHNyYy0+YXJnYl9zdHJpZGUgKyByZWN0LT54X29mZnNldF9dOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3RfYXJnYiA9CisgICAgICAgICZkc3QtPmFyZ2JbaiAqIGRzdC0+YXJnYl9zdHJpZGUgKyByZWN0LT54X29mZnNldF9dOworICAgIGlmIChjb21wYXJlX3BpeGVscyhzcmNfYXJnYiwgMSwgZHN0X2FyZ2IsIDEsIHJlY3QtPndpZHRoXywKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgIC0tcmVjdC0+aGVpZ2h0XzsgIC8vIFJlZHVuZGFudCByb3cuCisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVjdC0+aGVpZ2h0XyA9PSAwKSBnb3RvIE5vQ2hhbmdlOworCisgIGlmIChJc0VtcHR5UmVjdChyZWN0KSkgeworIE5vQ2hhbmdlOgorICAgIHJlY3QtPnhfb2Zmc2V0XyA9IDA7CisgICAgcmVjdC0+eV9vZmZzZXRfID0gMDsKKyAgICByZWN0LT53aWR0aF8gPSAwOworICAgIHJlY3QtPmhlaWdodF8gPSAwOworICB9Cit9CisKKy8vIFNuYXAgcmVjdGFuZ2xlIHRvIGV2ZW4gb2Zmc2V0cyAoYW5kIGFkanVzdCBkaW1lbnNpb25zIGlmIG5lZWRlZCkuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTbmFwVG9FdmVuT2Zmc2V0cyhGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCkgeworICByZWN0LT53aWR0aF8gKz0gKHJlY3QtPnhfb2Zmc2V0XyAmIDEpOworICByZWN0LT5oZWlnaHRfICs9IChyZWN0LT55X29mZnNldF8gJiAxKTsKKyAgcmVjdC0+eF9vZmZzZXRfICY9IH4xOworICByZWN0LT55X29mZnNldF8gJj0gfjE7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNob3VsZF90cnlfOyAgICAgICAgICAgICAgIC8vIFNob3VsZCB0cnkgdGhpcyBzZXQgb2YgcGFyYW1ldGVycy4KKyAgaW50IGVtcHR5X3JlY3RfYWxsb3dlZF87ICAgICAgIC8vIEZyYW1lIHdpdGggZW1wdHkgcmVjdGFuZ2xlIGNhbiBiZSBza2lwcGVkLgorICBGcmFtZVJlY3RhbmdsZSByZWN0X2xsXzsgICAgICAgLy8gRnJhbWUgcmVjdGFuZ2xlIGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKyAgV2ViUFBpY3R1cmUgc3ViX2ZyYW1lX2xsXzsgICAgIC8vIFN1Yi1mcmFtZSBwaWMgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorICBGcmFtZVJlY3RhbmdsZSByZWN0X2xvc3N5XzsgICAgLy8gRnJhbWUgcmVjdGFuZ2xlIGZvciBsb3NzeSBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIGJlIHNtYWxsZXIgdGhhbiByZWN0X2xsXyBhcyBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggc21hbGwgZGlmZnMgY2FuIGJlIGlnbm9yZWQuCisgIFdlYlBQaWN0dXJlIHN1Yl9mcmFtZV9sb3NzeV87ICAvLyBTdWItZnJhbWUgcGljIGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbi4KK30gU3ViRnJhbWVQYXJhbXM7CisKK3N0YXRpYyBpbnQgU3ViRnJhbWVQYXJhbXNJbml0KFN1YkZyYW1lUGFyYW1zKiBjb25zdCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvdWxkX3RyeSwgaW50IGVtcHR5X3JlY3RfYWxsb3dlZCkgeworICBwYXJhbXMtPnNob3VsZF90cnlfID0gc2hvdWxkX3RyeTsKKyAgcGFyYW1zLT5lbXB0eV9yZWN0X2FsbG93ZWRfID0gZW1wdHlfcmVjdF9hbGxvd2VkOworICBpZiAoIVdlYlBQaWN0dXJlSW5pdCgmcGFyYW1zLT5zdWJfZnJhbWVfbGxfKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmcGFyYW1zLT5zdWJfZnJhbWVfbG9zc3lfKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBTdWJGcmFtZVBhcmFtc0ZyZWUoU3ViRnJhbWVQYXJhbXMqIGNvbnN0IHBhcmFtcykgeworICBXZWJQUGljdHVyZUZyZWUoJnBhcmFtcy0+c3ViX2ZyYW1lX2xsXyk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGFyYW1zLT5zdWJfZnJhbWVfbG9zc3lfKTsKK30KKworLy8gR2l2ZW4gcHJldmlvdXMgYW5kIGN1cnJlbnQgY2FudmFzLCBwaWNrcyB0aGUgb3B0aW1hbCByZWN0YW5nbGUgZm9yIHRoZQorLy8gY3VycmVudCBmcmFtZSBiYXNlZCBvbiAnaXNfbG9zc2xlc3MnIGFuZCBvdGhlciBwYXJhbWV0ZXJzLiBBc3N1bWVzIHRoYXQgdGhlCisvLyBpbml0aWFsIGd1ZXNzICdyZWN0JyBpcyB2YWxpZC4KK3N0YXRpYyBpbnQgR2V0U3ViUmVjdChjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzLCBpbnQgaXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpc19maXJzdF9mcmFtZSwgaW50IGVtcHR5X3JlY3RfYWxsb3dlZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbG9zc2xlc3MsIGZsb2F0IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHN1Yl9mcmFtZSkgeworICBpZiAoIWlzX2tleV9mcmFtZSB8fCBpc19maXJzdF9mcmFtZSkgeyAgLy8gT3B0aW1pemUgZnJhbWUgcmVjdGFuZ2xlLgorICAgIC8vIE5vdGU6IFRoaXMgYmVoYXZlcyBhcyBleHBlY3RlZCBmb3IgZmlyc3QgZnJhbWUsIGFzICdwcmV2X2NhbnZhcycgaXMKKyAgICAvLyBpbml0aWFsaXplZCB0byBhIGZ1bGx5IHRyYW5zcGFyZW50IGNhbnZhcyBpbiB0aGUgYmVnaW5uaW5nLgorICAgIE1pbmltaXplQ2hhbmdlUmVjdGFuZ2xlKHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sb3NzbGVzcywgcXVhbGl0eSk7CisgIH0KKworICBpZiAoSXNFbXB0eVJlY3QocmVjdCkpIHsKKyAgICBpZiAoZW1wdHlfcmVjdF9hbGxvd2VkKSB7ICAvLyBObyBuZWVkIHRvIGdldCAnc3ViX2ZyYW1lJy4KKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIGEgMXgxIHJlY3RhbmdsZS4KKyAgICAgIHJlY3QtPndpZHRoXyA9IDE7CisgICAgICByZWN0LT5oZWlnaHRfID0gMTsKKyAgICAgIGFzc2VydChyZWN0LT54X29mZnNldF8gPT0gMCk7CisgICAgICBhc3NlcnQocmVjdC0+eV9vZmZzZXRfID09IDApOworICAgIH0KKyAgfQorCisgIFNuYXBUb0V2ZW5PZmZzZXRzKHJlY3QpOworICByZXR1cm4gV2ViUFBpY3R1cmVWaWV3KGN1cnJfY2FudmFzLCByZWN0LT54X29mZnNldF8sIHJlY3QtPnlfb2Zmc2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT53aWR0aF8sIHJlY3QtPmhlaWdodF8sIHN1Yl9mcmFtZSk7Cit9CisKKy8vIFBpY2tzIG9wdGltYWwgZnJhbWUgcmVjdGFuZ2xlIGZvciBib3RoIGxvc3NsZXNzIGFuZCBsb3NzeSBjb21wcmVzc2lvbi4gVGhlCisvLyBpbml0aWFsIGd1ZXNzIGZvciBmcmFtZSByZWN0YW5nbGVzIHdpbGwgYmUgdGhlIGZ1bGwgY2FudmFzLgorc3RhdGljIGludCBHZXRTdWJSZWN0cyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcywgaW50IGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2ZpcnN0X2ZyYW1lLCBmbG9hdCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBTdWJGcmFtZVBhcmFtcyogY29uc3QgcGFyYW1zKSB7CisgIC8vIExvc3NsZXNzIGZyYW1lIHJlY3RhbmdsZS4KKyAgcGFyYW1zLT5yZWN0X2xsXy54X29mZnNldF8gPSAwOworICBwYXJhbXMtPnJlY3RfbGxfLnlfb2Zmc2V0XyA9IDA7CisgIHBhcmFtcy0+cmVjdF9sbF8ud2lkdGhfID0gY3Vycl9jYW52YXMtPndpZHRoOworICBwYXJhbXMtPnJlY3RfbGxfLmhlaWdodF8gPSBjdXJyX2NhbnZhcy0+aGVpZ2h0OworICBpZiAoIUdldFN1YlJlY3QocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCBpc19rZXlfZnJhbWUsIGlzX2ZpcnN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lbXB0eV9yZWN0X2FsbG93ZWRfLCAxLCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgJnBhcmFtcy0+cmVjdF9sbF8sICZwYXJhbXMtPnN1Yl9mcmFtZV9sbF8pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gTG9zc3kgZnJhbWUgcmVjdGFuZ2xlLgorICBwYXJhbXMtPnJlY3RfbG9zc3lfID0gcGFyYW1zLT5yZWN0X2xsXzsgIC8vIHNlZWQgd2l0aCBsb3NzbGVzcyByZWN0LgorICByZXR1cm4gR2V0U3ViUmVjdChwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsIGlzX2tleV9mcmFtZSwgaXNfZmlyc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZW1wdHlfcmVjdF9hbGxvd2VkXywgMCwgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtcy0+cmVjdF9sb3NzeV8sICZwYXJhbXMtPnN1Yl9mcmFtZV9sb3NzeV8pOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBtaW5fdiwgaW50IG1heF92KSB7CisgIHJldHVybiAodiA8IG1pbl92KSA/IG1pbl92IDogKHYgPiBtYXhfdikgPyBtYXhfdiA6IHY7Cit9CisKK2ludCBXZWJQQW5pbUVuY29kZXJSZWZpbmVSZWN0KAorICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzLAorICAgIGludCBpc19sb3NzbGVzcywgZmxvYXQgcXVhbGl0eSwgaW50KiBjb25zdCB4X29mZnNldCwgaW50KiBjb25zdCB5X29mZnNldCwKKyAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgeworICBGcmFtZVJlY3RhbmdsZSByZWN0OworICBjb25zdCBpbnQgcmlnaHQgPSBjbGlwKCp4X29mZnNldCArICp3aWR0aCwgMCwgY3Vycl9jYW52YXMtPndpZHRoKTsKKyAgY29uc3QgaW50IGxlZnQgPSBjbGlwKCp4X29mZnNldCwgMCwgY3Vycl9jYW52YXMtPndpZHRoIC0gMSk7CisgIGNvbnN0IGludCBib3R0b20gPSBjbGlwKCp5X29mZnNldCArICpoZWlnaHQsIDAsIGN1cnJfY2FudmFzLT5oZWlnaHQpOworICBjb25zdCBpbnQgdG9wID0gY2xpcCgqeV9vZmZzZXQsIDAsIGN1cnJfY2FudmFzLT5oZWlnaHQgLSAxKTsKKyAgaWYgKHByZXZfY2FudmFzID09IE5VTEwgfHwgY3Vycl9jYW52YXMgPT0gTlVMTCB8fAorICAgICAgcHJldl9jYW52YXMtPndpZHRoICE9IGN1cnJfY2FudmFzLT53aWR0aCB8fAorICAgICAgcHJldl9jYW52YXMtPmhlaWdodCAhPSBjdXJyX2NhbnZhcy0+aGVpZ2h0IHx8CisgICAgICAhcHJldl9jYW52YXMtPnVzZV9hcmdiIHx8ICFjdXJyX2NhbnZhcy0+dXNlX2FyZ2IpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZWN0Lnhfb2Zmc2V0XyA9IGxlZnQ7CisgIHJlY3QueV9vZmZzZXRfID0gdG9wOworICByZWN0LndpZHRoXyA9IGNsaXAocmlnaHQgLSBsZWZ0LCAwLCBjdXJyX2NhbnZhcy0+d2lkdGggLSByZWN0Lnhfb2Zmc2V0Xyk7CisgIHJlY3QuaGVpZ2h0XyA9IGNsaXAoYm90dG9tIC0gdG9wLCAwLCBjdXJyX2NhbnZhcy0+aGVpZ2h0IC0gcmVjdC55X29mZnNldF8pOworICBNaW5pbWl6ZUNoYW5nZVJlY3RhbmdsZShwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsICZyZWN0LCBpc19sb3NzbGVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgIFNuYXBUb0V2ZW5PZmZzZXRzKCZyZWN0KTsKKyAgKnhfb2Zmc2V0ID0gcmVjdC54X29mZnNldF87CisgICp5X29mZnNldCA9IHJlY3QueV9vZmZzZXRfOworICAqd2lkdGggPSByZWN0LndpZHRoXzsKKyAgKmhlaWdodCA9IHJlY3QuaGVpZ2h0XzsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIERpc3Bvc2VGcmFtZVJlY3RhbmdsZShpbnQgZGlzcG9zZV9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzKSB7CisgIGFzc2VydChyZWN0ICE9IE5VTEwpOworICBpZiAoZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EKSB7CisgICAgV2ViUFV0aWxDbGVhclBpYyhjdXJyX2NhbnZhcywgcmVjdCk7CisgIH0KK30KKworc3RhdGljIHVpbnQzMl90IFJlY3RBcmVhKGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0KSB7CisgIHJldHVybiAodWludDMyX3QpcmVjdC0+d2lkdGhfICogcmVjdC0+aGVpZ2h0XzsKK30KKworc3RhdGljIGludCBJc0xvc3NsZXNzQmxlbmRpbmdQb3NzaWJsZShjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCkgeworICBpbnQgaSwgajsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydChyZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF8gPD0gZHN0LT53aWR0aCk7CisgIGFzc2VydChyZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfIDw9IGRzdC0+aGVpZ2h0KTsKKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXRfOyBqIDwgcmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XzsgKytqKSB7CisgICAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXRfOyBpIDwgcmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19waXhlbCA9IHNyYy0+YXJnYltqICogc3JjLT5hcmdiX3N0cmlkZSArIGldOworICAgICAgY29uc3QgdWludDMyX3QgZHN0X3BpeGVsID0gZHN0LT5hcmdiW2ogKiBkc3QtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgICBjb25zdCB1aW50MzJfdCBkc3RfYWxwaGEgPSBkc3RfcGl4ZWwgPj4gMjQ7CisgICAgICBpZiAoZHN0X2FscGhhICE9IDB4ZmYgJiYgc3JjX3BpeGVsICE9IGRzdF9waXhlbCkgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGlmIHdlIHVzZSBibGVuZGluZywgd2UgY2FuJ3QgYXR0YWluIHRoZSBkZXNpcmVkCisgICAgICAgIC8vICdkc3RfcGl4ZWwnIHZhbHVlIGZvciB0aGlzIHBpeGVsLiBTbywgYmxlbmRpbmcgaXMgbm90IHBvc3NpYmxlLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgSXNMb3NzeUJsZW5kaW5nUG9zc2libGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHkpIHsKKyAgY29uc3QgaW50IG1heF9hbGxvd2VkX2RpZmZfbG9zc3kgPSBRdWFsaXR5VG9NYXhEaWZmKHF1YWxpdHkpOworICBpbnQgaSwgajsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydChyZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF8gPD0gZHN0LT53aWR0aCk7CisgIGFzc2VydChyZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfIDw9IGRzdC0+aGVpZ2h0KTsKKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXRfOyBqIDwgcmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XzsgKytqKSB7CisgICAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXRfOyBpIDwgcmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19waXhlbCA9IHNyYy0+YXJnYltqICogc3JjLT5hcmdiX3N0cmlkZSArIGldOworICAgICAgY29uc3QgdWludDMyX3QgZHN0X3BpeGVsID0gZHN0LT5hcmdiW2ogKiBkc3QtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgICBjb25zdCB1aW50MzJfdCBkc3RfYWxwaGEgPSBkc3RfcGl4ZWwgPj4gMjQ7CisgICAgICBpZiAoZHN0X2FscGhhICE9IDB4ZmYgJiYKKyAgICAgICAgICAhUGl4ZWxzQXJlU2ltaWxhcihzcmNfcGl4ZWwsIGRzdF9waXhlbCwgbWF4X2FsbG93ZWRfZGlmZl9sb3NzeSkpIHsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSB1c2UgYmxlbmRpbmcsIHdlIGNhbid0IGF0dGFpbiB0aGUgZGVzaXJlZAorICAgICAgICAvLyAnZHN0X3BpeGVsJyB2YWx1ZSBmb3IgdGhpcyBwaXhlbC4gU28sIGJsZW5kaW5nIGlzIG5vdCBwb3NzaWJsZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBGb3IgcGl4ZWxzIGluICdyZWN0JywgcmVwbGFjZSB0aG9zZSBwaXhlbHMgaW4gJ2RzdCcgdGhhdCBhcmUgc2FtZSBhcyAnc3JjJyBieQorLy8gdHJhbnNwYXJlbnQgcGl4ZWxzLgorLy8gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBwaXhlbCBnZXRzIG1vZGlmaWVkLgorc3RhdGljIGludCBJbmNyZWFzZVRyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBpbnQgaSwgajsKKyAgaW50IG1vZGlmaWVkID0gMDsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMICYmIHJlY3QgIT0gTlVMTCk7CisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBmb3IgKGogPSByZWN0LT55X29mZnNldF87IGogPCByZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfOyArK2opIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgcHNyYyA9IHNyYy0+YXJnYiArIGogKiBzcmMtPmFyZ2Jfc3RyaWRlOworICAgIHVpbnQzMl90KiBjb25zdCBwZHN0ID0gZHN0LT5hcmdiICsgaiAqIGRzdC0+YXJnYl9zdHJpZGU7CisgICAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXRfOyBpIDwgcmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfOyArK2kpIHsKKyAgICAgIGlmIChwc3JjW2ldID09IHBkc3RbaV0gJiYgcGRzdFtpXSAhPSBUUkFOU1BBUkVOVF9DT0xPUikgeworICAgICAgICBwZHN0W2ldID0gVFJBTlNQQVJFTlRfQ09MT1I7CisgICAgICAgIG1vZGlmaWVkID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1vZGlmaWVkOworfQorCisjdW5kZWYgVFJBTlNQQVJFTlRfQ09MT1IKKworLy8gUmVwbGFjZSBzaW1pbGFyIGJsb2NrcyBvZiBwaXhlbHMgYnkgYSAnc2VlLXRocm91Z2gnIHRyYW5zcGFyZW50IGJsb2NrCisvLyB3aXRoIHVuaWZvcm0gYXZlcmFnZSBjb2xvci4KKy8vIEFzc3VtZXMgbG9zc3kgY29tcHJlc3Npb24gaXMgYmVpbmcgdXNlZC4KKy8vIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgcGl4ZWwgZ2V0cyBtb2RpZmllZC4KK3N0YXRpYyBpbnQgRmxhdHRlblNpbWlsYXJCbG9ja3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QsIGZsb2F0IHF1YWxpdHkpIHsKKyAgY29uc3QgaW50IG1heF9hbGxvd2VkX2RpZmZfbG9zc3kgPSBRdWFsaXR5VG9NYXhEaWZmKHF1YWxpdHkpOworICBpbnQgaSwgajsKKyAgaW50IG1vZGlmaWVkID0gMDsKKyAgY29uc3QgaW50IGJsb2NrX3NpemUgPSA4OworICBjb25zdCBpbnQgeV9zdGFydCA9IChyZWN0LT55X29mZnNldF8gKyBibG9ja19zaXplKSAmIH4oYmxvY2tfc2l6ZSAtIDEpOworICBjb25zdCBpbnQgeV9lbmQgPSAocmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XykgJiB+KGJsb2NrX3NpemUgLSAxKTsKKyAgY29uc3QgaW50IHhfc3RhcnQgPSAocmVjdC0+eF9vZmZzZXRfICsgYmxvY2tfc2l6ZSkgJiB+KGJsb2NrX3NpemUgLSAxKTsKKyAgY29uc3QgaW50IHhfZW5kID0gKHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXykgJiB+KGJsb2NrX3NpemUgLSAxKTsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMICYmIHJlY3QgIT0gTlVMTCk7CisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBhc3NlcnQoKGJsb2NrX3NpemUgJiAoYmxvY2tfc2l6ZSAtIDEpKSA9PSAwKTsgIC8vIG11c3QgYmUgYSBwb3dlciBvZiAyCisgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGJsb2NrIGFuZCBjb3VudCBzaW1pbGFyIHBpeGVscy4KKyAgZm9yIChqID0geV9zdGFydDsgaiA8IHlfZW5kOyBqICs9IGJsb2NrX3NpemUpIHsKKyAgICBmb3IgKGkgPSB4X3N0YXJ0OyBpIDwgeF9lbmQ7IGkgKz0gYmxvY2tfc2l6ZSkgeworICAgICAgaW50IGNudCA9IDA7CisgICAgICBpbnQgYXZnX3IgPSAwLCBhdmdfZyA9IDAsIGF2Z19iID0gMDsKKyAgICAgIGludCB4LCB5OworICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBzcmMgPSBzcmMtPmFyZ2IgKyBqICogc3JjLT5hcmdiX3N0cmlkZSArIGk7CisgICAgICB1aW50MzJfdCogY29uc3QgcGRzdCA9IGRzdC0+YXJnYiArIGogKiBkc3QtPmFyZ2Jfc3RyaWRlICsgaTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19zaXplOyArK3kpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJsb2NrX3NpemU7ICsreCkgeworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19waXhlbCA9IHBzcmNbeCArIHkgKiBzcmMtPmFyZ2Jfc3RyaWRlXTsKKyAgICAgICAgICBjb25zdCBpbnQgYWxwaGEgPSBzcmNfcGl4ZWwgPj4gMjQ7CisgICAgICAgICAgaWYgKGFscGhhID09IDB4ZmYgJiYKKyAgICAgICAgICAgICAgUGl4ZWxzQXJlU2ltaWxhcihzcmNfcGl4ZWwsIHBkc3RbeCArIHkgKiBkc3QtPmFyZ2Jfc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5KSkgeworICAgICAgICAgICAgKytjbnQ7CisgICAgICAgICAgICBhdmdfciArPSAoc3JjX3BpeGVsID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBhdmdfZyArPSAoc3JjX3BpeGVsID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGF2Z19iICs9IChzcmNfcGl4ZWwgPj4gMCkgJiAweGZmOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gSWYgd2UgaGF2ZSBhIGZ1bGx5IHNpbWlsYXIgYmxvY2ssIHdlIHJlcGxhY2UgaXQgd2l0aCBhbgorICAgICAgLy8gYXZlcmFnZSB0cmFuc3BhcmVudCBibG9jay4gVGhpcyBjb21wcmVzc2VzIGJldHRlciBpbiBsb3NzeSBtb2RlLgorICAgICAgaWYgKGNudCA9PSBibG9ja19zaXplICogYmxvY2tfc2l6ZSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xvciA9ICgweDAwICAgICAgICAgIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhdmdfciAvIGNudCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2Z19nIC8gY250KSA8PCAgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZnX2IgLyBjbnQpIDw8ICAwKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGJsb2NrX3NpemU7ICsreSkgeworICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBibG9ja19zaXplOyArK3gpIHsKKyAgICAgICAgICAgIHBkc3RbeCArIHkgKiBkc3QtPmFyZ2Jfc3RyaWRlXSA9IGNvbG9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtb2RpZmllZCA9IDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtb2RpZmllZDsKK30KKworc3RhdGljIGludCBFbmNvZGVGcmFtZShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IG1lbW9yeSkgeworICBwaWMtPnVzZV9hcmdiID0gMTsKKyAgcGljLT53cml0ZXIgPSBXZWJQTWVtb3J5V3JpdGU7CisgIHBpYy0+Y3VzdG9tX3B0ciA9IG1lbW9yeTsKKyAgaWYgKCFXZWJQRW5jb2RlKGNvbmZpZywgcGljKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLyBTdHJ1Y3QgcmVwcmVzZW50aW5nIGEgY2FuZGlkYXRlIGVuY29kZWQgZnJhbWUgaW5jbHVkaW5nIGl0cyBtZXRhZGF0YS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgV2ViUE1lbW9yeVdyaXRlciAgbWVtXzsKKyAgV2ViUE11eEZyYW1lSW5mbyAgaW5mb187CisgIEZyYW1lUmVjdGFuZ2xlICAgIHJlY3RfOworICBpbnQgICAgICAgICAgICAgICBldmFsdWF0ZV87ICAvLyBUcnVlIGlmIHRoaXMgY2FuZGlkYXRlIHNob3VsZCBiZSBldmFsdWF0ZWQuCit9IENhbmRpZGF0ZTsKKworLy8gR2VuZXJhdGVzIGEgY2FuZGlkYXRlIGVuY29kZWQgZnJhbWUgZ2l2ZW4gYSBwaWN0dXJlIGFuZCBtZXRhZGF0YS4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVDYW5kaWRhdGUoV2ViUFBpY3R1cmUqIGNvbnN0IHN1Yl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGVuY29kZXJfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2JsZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5kaWRhdGUqIGNvbnN0IGNhbmRpZGF0ZSkgeworICBXZWJQQ29uZmlnIGNvbmZpZyA9ICplbmNvZGVyX2NvbmZpZzsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3JfY29kZSA9IFZQOF9FTkNfT0s7CisgIGFzc2VydChjYW5kaWRhdGUgIT0gTlVMTCk7CisgIG1lbXNldChjYW5kaWRhdGUsIDAsIHNpemVvZigqY2FuZGlkYXRlKSk7CisKKyAgLy8gU2V0IGZyYW1lIHJlY3QgYW5kIGluZm8uCisgIGNhbmRpZGF0ZS0+cmVjdF8gPSAqcmVjdDsKKyAgY2FuZGlkYXRlLT5pbmZvXy5pZCA9IFdFQlBfQ0hVTktfQU5NRjsKKyAgY2FuZGlkYXRlLT5pbmZvXy54X29mZnNldCA9IHJlY3QtPnhfb2Zmc2V0XzsKKyAgY2FuZGlkYXRlLT5pbmZvXy55X29mZnNldCA9IHJlY3QtPnlfb2Zmc2V0XzsKKyAgY2FuZGlkYXRlLT5pbmZvXy5kaXNwb3NlX21ldGhvZCA9IFdFQlBfTVVYX0RJU1BPU0VfTk9ORTsgIC8vIFNldCBsYXRlci4KKyAgY2FuZGlkYXRlLT5pbmZvXy5ibGVuZF9tZXRob2QgPQorICAgICAgdXNlX2JsZW5kaW5nID8gV0VCUF9NVVhfQkxFTkQgOiBXRUJQX01VWF9OT19CTEVORDsKKyAgY2FuZGlkYXRlLT5pbmZvXy5kdXJhdGlvbiA9IDA7ICAvLyBTZXQgaW4gbmV4dCBjYWxsIHRvIFdlYlBBbmltRW5jb2RlckFkZCgpLgorCisgIC8vIEVuY29kZSBwaWN0dXJlLgorICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmY2FuZGlkYXRlLT5tZW1fKTsKKworICBpZiAoIWNvbmZpZy5sb3NzbGVzcyAmJiB1c2VfYmxlbmRpbmcpIHsKKyAgICAvLyBEaXNhYmxlIGZpbHRlcmluZyB0byBhdm9pZCBibG9ja2luZXNzIGluIHJlY29uc3RydWN0ZWQgZnJhbWVzIGF0IHRoZQorICAgIC8vIHRpbWUgb2YgZGVjb2RpbmcuCisgICAgY29uZmlnLmF1dG9maWx0ZXIgPSAwOworICAgIGNvbmZpZy5maWx0ZXJfc3RyZW5ndGggPSAwOworICB9CisgIGlmICghRW5jb2RlRnJhbWUoJmNvbmZpZywgc3ViX2ZyYW1lLCAmY2FuZGlkYXRlLT5tZW1fKSkgeworICAgIGVycm9yX2NvZGUgPSBzdWJfZnJhbWUtPmVycm9yX2NvZGU7CisgICAgZ290byBFcnI7CisgIH0KKworICBjYW5kaWRhdGUtPmV2YWx1YXRlXyA9IDE7CisgIHJldHVybiBlcnJvcl9jb2RlOworCisgRXJyOgorICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJmNhbmRpZGF0ZS0+bWVtXyk7CisgIHJldHVybiBlcnJvcl9jb2RlOworfQorCitzdGF0aWMgdm9pZCBDb3B5Q3VycmVudENhbnZhcyhXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYykgeworICBpZiAoZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXykgeworICAgIFdlYlBDb3B5UGl4ZWxzKGVuYy0+Y3Vycl9jYW52YXNfLCAmZW5jLT5jdXJyX2NhbnZhc19jb3B5Xyk7CisgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5Xy5wcm9ncmVzc19ob29rID0gZW5jLT5jdXJyX2NhbnZhc18tPnByb2dyZXNzX2hvb2s7CisgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5Xy51c2VyX2RhdGEgPSBlbmMtPmN1cnJfY2FudmFzXy0+dXNlcl9kYXRhOworICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPSAwOworICB9Cit9CisKK2VudW0geworICBMTF9ESVNQX05PTkUgPSAwLAorICBMTF9ESVNQX0JHLAorICBMT1NTWV9ESVNQX05PTkUsCisgIExPU1NZX0RJU1BfQkcsCisgIENBTkRJREFURV9DT1VOVAorfTsKKworI2RlZmluZSBNSU5fQ09MT1JTX0xPU1NZICAgICAzMSAgLy8gRG9uJ3QgdHJ5IGxvc3N5IGJlbG93IHRoaXMgdGhyZXNob2xkLgorI2RlZmluZSBNQVhfQ09MT1JTX0xPU1NMRVNTIDE5NCAgLy8gRG9uJ3QgdHJ5IGxvc3NsZXNzIGFib3ZlIHRoaXMgdGhyZXNob2xkLgorCisvLyBHZW5lcmF0ZXMgY2FuZGlkYXRlcyBmb3IgYSBnaXZlbiBkaXNwb3NlIG1ldGhvZCBnaXZlbiBwcmUtZmlsbGVkIHN1Yi1mcmFtZQorLy8gJ3BhcmFtcycuCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgR2VuZXJhdGVDYW5kaWRhdGVzKAorICAgIFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLCBDYW5kaWRhdGUgY2FuZGlkYXRlc1tDQU5ESURBVEVfQ09VTlRdLAorICAgIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZCwgaW50IGlzX2xvc3NsZXNzLCBpbnQgaXNfa2V5X2ZyYW1lLAorICAgIFN1YkZyYW1lUGFyYW1zKiBjb25zdCBwYXJhbXMsCisgICAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnX2xsLCBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWdfbG9zc3kpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3JfY29kZSA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IGludCBpc19kaXNwb3NlX25vbmUgPSAoZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9OT05FKTsKKyAgQ2FuZGlkYXRlKiBjb25zdCBjYW5kaWRhdGVfbGwgPQorICAgICAgaXNfZGlzcG9zZV9ub25lID8gJmNhbmRpZGF0ZXNbTExfRElTUF9OT05FXSA6ICZjYW5kaWRhdGVzW0xMX0RJU1BfQkddOworICBDYW5kaWRhdGUqIGNvbnN0IGNhbmRpZGF0ZV9sb3NzeSA9IGlzX2Rpc3Bvc2Vfbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmNhbmRpZGF0ZXNbTE9TU1lfRElTUF9OT05FXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmNhbmRpZGF0ZXNbTE9TU1lfRElTUF9CR107CisgIFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcyA9ICZlbmMtPmN1cnJfY2FudmFzX2NvcHlfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMgPQorICAgICAgaXNfZGlzcG9zZV9ub25lID8gJmVuYy0+cHJldl9jYW52YXNfIDogJmVuYy0+cHJldl9jYW52YXNfZGlzcG9zZWRfOworICBpbnQgdXNlX2JsZW5kaW5nX2xsLCB1c2VfYmxlbmRpbmdfbG9zc3k7CisgIGludCBldmFsdWF0ZV9sbCwgZXZhbHVhdGVfbG9zc3k7CisKKyAgQ29weUN1cnJlbnRDYW52YXMoZW5jKTsKKyAgdXNlX2JsZW5kaW5nX2xsID0KKyAgICAgICFpc19rZXlfZnJhbWUgJiYKKyAgICAgIElzTG9zc2xlc3NCbGVuZGluZ1Bvc3NpYmxlKHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgJnBhcmFtcy0+cmVjdF9sbF8pOworICB1c2VfYmxlbmRpbmdfbG9zc3kgPQorICAgICAgIWlzX2tleV9mcmFtZSAmJgorICAgICAgSXNMb3NzeUJsZW5kaW5nUG9zc2libGUocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCAmcGFyYW1zLT5yZWN0X2xvc3N5XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sb3NzeS0+cXVhbGl0eSk7CisKKyAgLy8gUGljayBjYW5kaWRhdGVzIHRvIGJlIHRyaWVkLgorICBpZiAoIWVuYy0+b3B0aW9uc18uYWxsb3dfbWl4ZWQpIHsKKyAgICBldmFsdWF0ZV9sbCA9IGlzX2xvc3NsZXNzOworICAgIGV2YWx1YXRlX2xvc3N5ID0gIWlzX2xvc3NsZXNzOworICB9IGVsc2UgaWYgKGVuYy0+b3B0aW9uc18ubWluaW1pemVfc2l6ZSkgeworICAgIGV2YWx1YXRlX2xsID0gMTsKKyAgICBldmFsdWF0ZV9sb3NzeSA9IDE7CisgIH0gZWxzZSB7ICAvLyBVc2UgYSBoZXVyaXN0aWMgZm9yIHRyeWluZyBsb3NzbGVzcyBhbmQvb3IgbG9zc3kgY29tcHJlc3Npb24uCisgICAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBXZWJQR2V0Q29sb3JQYWxldHRlKCZwYXJhbXMtPnN1Yl9mcmFtZV9sbF8sIE5VTEwpOworICAgIGV2YWx1YXRlX2xsID0gKG51bV9jb2xvcnMgPCBNQVhfQ09MT1JTX0xPU1NMRVNTKTsKKyAgICBldmFsdWF0ZV9sb3NzeSA9IChudW1fY29sb3JzID49IE1JTl9DT0xPUlNfTE9TU1kpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2FuZGlkYXRlcy4KKyAgaWYgKGV2YWx1YXRlX2xsKSB7CisgICAgQ29weUN1cnJlbnRDYW52YXMoZW5jKTsKKyAgICBpZiAodXNlX2JsZW5kaW5nX2xsKSB7CisgICAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0KKyAgICAgICAgICBJbmNyZWFzZVRyYW5zcGFyZW5jeShwcmV2X2NhbnZhcywgJnBhcmFtcy0+cmVjdF9sbF8sIGN1cnJfY2FudmFzKTsKKyAgICB9CisgICAgZXJyb3JfY29kZSA9IEVuY29kZUNhbmRpZGF0ZSgmcGFyYW1zLT5zdWJfZnJhbWVfbGxfLCAmcGFyYW1zLT5yZWN0X2xsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sbCwgdXNlX2JsZW5kaW5nX2xsLCBjYW5kaWRhdGVfbGwpOworICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIHJldHVybiBlcnJvcl9jb2RlOworICB9CisgIGlmIChldmFsdWF0ZV9sb3NzeSkgeworICAgIENvcHlDdXJyZW50Q2FudmFzKGVuYyk7CisgICAgaWYgKHVzZV9ibGVuZGluZ19sb3NzeSkgeworICAgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9CisgICAgICAgICAgRmxhdHRlblNpbWlsYXJCbG9ja3MocHJldl9jYW52YXMsICZwYXJhbXMtPnJlY3RfbG9zc3lfLCBjdXJyX2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbG9zc3ktPnF1YWxpdHkpOworICAgIH0KKyAgICBlcnJvcl9jb2RlID0KKyAgICAgICAgRW5jb2RlQ2FuZGlkYXRlKCZwYXJhbXMtPnN1Yl9mcmFtZV9sb3NzeV8sICZwYXJhbXMtPnJlY3RfbG9zc3lfLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2xvc3N5LCB1c2VfYmxlbmRpbmdfbG9zc3ksIGNhbmRpZGF0ZV9sb3NzeSk7CisgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgcmV0dXJuIGVycm9yX2NvZGU7CisgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9IDE7CisgIH0KKyAgcmV0dXJuIGVycm9yX2NvZGU7Cit9CisKKyN1bmRlZiBNSU5fQ09MT1JTX0xPU1NZCisjdW5kZWYgTUFYX0NPTE9SU19MT1NTTEVTUworCitzdGF0aWMgdm9pZCBHZXRFbmNvZGVkRGF0YShjb25zdCBXZWJQTWVtb3J5V3JpdGVyKiBjb25zdCBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3QgZW5jb2RlZF9kYXRhKSB7CisgIGVuY29kZWRfZGF0YS0+Ynl0ZXMgPSBtZW1vcnktPm1lbTsKKyAgZW5jb2RlZF9kYXRhLT5zaXplICA9IG1lbW9yeS0+c2l6ZTsKK30KKworLy8gU2V0cyBkaXNwb3NlIG1ldGhvZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUgdG8gYmUgJ2Rpc3Bvc2VfbWV0aG9kJy4KK3N0YXRpYyB2b2lkIFNldFByZXZpb3VzRGlzcG9zZU1ldGhvZChXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2QpIHsKKyAgY29uc3Qgc2l6ZV90IHBvc2l0aW9uID0gZW5jLT5jb3VudF8gLSAyOworICBFbmNvZGVkRnJhbWUqIGNvbnN0IHByZXZfZW5jX2ZyYW1lID0gR2V0RnJhbWUoZW5jLCBwb3NpdGlvbik7CisgIGFzc2VydChlbmMtPmNvdW50XyA+PSAyKTsgIC8vIEFzIGN1cnJlbnQgYW5kIHByZXZpb3VzIGZyYW1lcyBhcmUgaW4gZW5jLgorCisgIGlmIChlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8pIHsKKyAgICBhc3NlcnQoZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9OT05FKTsKKyAgICBwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kaXNwb3NlX21ldGhvZCA9IGRpc3Bvc2VfbWV0aG9kOworICAgIHByZXZfZW5jX2ZyYW1lLT5rZXlfZnJhbWVfLmRpc3Bvc2VfbWV0aG9kID0gZGlzcG9zZV9tZXRob2Q7CisgIH0gZWxzZSB7CisgICAgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgcHJldl9pbmZvID0gcHJldl9lbmNfZnJhbWUtPmlzX2tleV9mcmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZwcmV2X2VuY19mcmFtZS0+a2V5X2ZyYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJnByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfOworICAgIHByZXZfaW5mby0+ZGlzcG9zZV9tZXRob2QgPSBkaXNwb3NlX21ldGhvZDsKKyAgfQorfQorCitzdGF0aWMgaW50IEluY3JlYXNlUHJldmlvdXNEdXJhdGlvbihXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywgaW50IGR1cmF0aW9uKSB7CisgIGNvbnN0IHNpemVfdCBwb3NpdGlvbiA9IGVuYy0+Y291bnRfIC0gMTsKKyAgRW5jb2RlZEZyYW1lKiBjb25zdCBwcmV2X2VuY19mcmFtZSA9IEdldEZyYW1lKGVuYywgcG9zaXRpb24pOworICBpbnQgbmV3X2R1cmF0aW9uOworCisgIGFzc2VydChlbmMtPmNvdW50XyA+PSAxKTsKKyAgYXNzZXJ0KHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uID09CisgICAgICAgICBwcmV2X2VuY19mcmFtZS0+a2V5X2ZyYW1lXy5kdXJhdGlvbik7CisgIGFzc2VydChwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiA9PQorICAgICAgICAgKHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uICYgKE1BWF9EVVJBVElPTiAtIDEpKSk7CisgIGFzc2VydChkdXJhdGlvbiA9PSAoZHVyYXRpb24gJiAoTUFYX0RVUkFUSU9OIC0gMSkpKTsKKworICBuZXdfZHVyYXRpb24gPSBwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiArIGR1cmF0aW9uOworICBpZiAobmV3X2R1cmF0aW9uID49IE1BWF9EVVJBVElPTikgeyAgLy8gU3BlY2lhbCBjYXNlLgorICAgIC8vIFNlcGFyYXRlIG91dCBwcmV2aW91cyBmcmFtZSBmcm9tIGVhcmxpZXIgbWVyZ2VkIGZyYW1lcyB0byBhdm9pZCBvdmVyZmxvdy4KKyAgICAvLyBXZSBhZGQgYSAxeDEgdHJhbnNwYXJlbnQgZnJhbWUgZm9yIHRoZSBwcmV2aW91cyBmcmFtZSwgd2l0aCBibGVuZGluZyBvbi4KKyAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSByZWN0ID0geyAwLCAwLCAxLCAxIH07CisgICAgY29uc3QgdWludDhfdCBsb3NzbGVzc18xeDFfYnl0ZXNbXSA9IHsKKyAgICAgIDB4NTIsIDB4NDksIDB4NDYsIDB4NDYsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTcsIDB4NDUsIDB4NDIsIDB4NTAsCisgICAgICAweDU2LCAweDUwLCAweDM4LCAweDRjLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDJmLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgxMCwgMHg4OCwgMHg4OCwgMHgwOAorICAgIH07CisgICAgY29uc3QgV2ViUERhdGEgbG9zc2xlc3NfMXgxID0geworICAgICAgICBsb3NzbGVzc18xeDFfYnl0ZXMsIHNpemVvZihsb3NzbGVzc18xeDFfYnl0ZXMpCisgICAgfTsKKyAgICBjb25zdCB1aW50OF90IGxvc3N5XzF4MV9ieXRlc1tdID0geworICAgICAgMHg1MiwgMHg0OSwgMHg0NiwgMHg0NiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NywgMHg0NSwgMHg0MiwgMHg1MCwKKyAgICAgIDB4NTYsIDB4NTAsIDB4MzgsIDB4NTgsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQxLCAweDRjLCAweDUwLCAweDQ4LCAweDAyLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NiwgMHg1MCwgMHgzOCwgMHgyMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MzAsIDB4MDEsIDB4MDAsIDB4OWQsIDB4MDEsIDB4MmEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsCisgICAgICAweDM0LCAweDI1LCAweGE0LCAweDAwLCAweDAzLCAweDcwLCAweDAwLCAweGZlLCAweGZiLCAweGZkLCAweDUwLCAweDAwCisgICAgfTsKKyAgICBjb25zdCBXZWJQRGF0YSBsb3NzeV8xeDEgPSB7IGxvc3N5XzF4MV9ieXRlcywgc2l6ZW9mKGxvc3N5XzF4MV9ieXRlcykgfTsKKyAgICBjb25zdCBpbnQgY2FuX3VzZV9sb3NzbGVzcyA9CisgICAgICAgIChlbmMtPmxhc3RfY29uZmlnXy5sb3NzbGVzcyB8fCBlbmMtPm9wdGlvbnNfLmFsbG93X21peGVkKTsKKyAgICBFbmNvZGVkRnJhbWUqIGNvbnN0IGN1cnJfZW5jX2ZyYW1lID0gR2V0RnJhbWUoZW5jLCBlbmMtPmNvdW50Xyk7CisgICAgY3Vycl9lbmNfZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAwOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmlkID0gV0VCUF9DSFVOS19BTk1GOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLnhfb2Zmc2V0ID0gMDsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy55X29mZnNldCA9IDA7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZGlzcG9zZV9tZXRob2QgPSBXRUJQX01VWF9ESVNQT1NFX05PTkU7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uYmxlbmRfbWV0aG9kID0gV0VCUF9NVVhfQkxFTkQ7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBpZiAoIVdlYlBEYXRhQ29weShjYW5fdXNlX2xvc3NsZXNzID8gJmxvc3NsZXNzXzF4MSA6ICZsb3NzeV8xeDEsCisgICAgICAgICAgICAgICAgICAgICAgJmN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmJpdHN0cmVhbSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICArK2VuYy0+Y291bnRfOworICAgICsrZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfOworICAgIGVuYy0+Zmx1c2hfY291bnRfID0gZW5jLT5jb3VudF8gLSAxOworICAgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDA7CisgICAgZW5jLT5wcmV2X3JlY3RfID0gcmVjdDsKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIGNhc2UuCisgICAgLy8gSW5jcmVhc2UgZHVyYXRpb24gb2YgdGhlIHByZXZpb3VzIGZyYW1lIGJ5ICdkdXJhdGlvbicuCisgICAgcHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gPSBuZXdfZHVyYXRpb247CisgICAgcHJldl9lbmNfZnJhbWUtPmtleV9mcmFtZV8uZHVyYXRpb24gPSBuZXdfZHVyYXRpb247CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFBpY2sgdGhlIGNhbmRpZGF0ZSBlbmNvZGVkIGZyYW1lIHdpdGggc21hbGxlc3Qgc2l6ZSBhbmQgcmVsZWFzZSBvdGhlcgorLy8gY2FuZGlkYXRlcy4KKy8vIFRPRE8obGF0ZXIpOiBQZXJoYXBzIGEgcm91Z2ggU1NJTS9QU05SIHByb2R1Y2VkIGJ5IHRoZSBlbmNvZGVyIHNob3VsZAorLy8gYWxzbyBiZSBhIGNyaXRlcmlhLCBpbiBhZGRpdGlvbiB0byBzaXplcy4KK3N0YXRpYyB2b2lkIFBpY2tCZXN0Q2FuZGlkYXRlKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuZGlkYXRlKiBjb25zdCBjYW5kaWRhdGVzLCBpbnQgaXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlZEZyYW1lKiBjb25zdCBlbmNvZGVkX2ZyYW1lKSB7CisgIGludCBpOworICBpbnQgYmVzdF9pZHggPSAtMTsKKyAgc2l6ZV90IGJlc3Rfc2l6ZSA9IH4wOworICBmb3IgKGkgPSAwOyBpIDwgQ0FORElEQVRFX0NPVU5UOyArK2kpIHsKKyAgICBpZiAoY2FuZGlkYXRlc1tpXS5ldmFsdWF0ZV8pIHsKKyAgICAgIGNvbnN0IHNpemVfdCBjYW5kaWRhdGVfc2l6ZSA9IGNhbmRpZGF0ZXNbaV0ubWVtXy5zaXplOworICAgICAgaWYgKGNhbmRpZGF0ZV9zaXplIDwgYmVzdF9zaXplKSB7CisgICAgICAgIGJlc3RfaWR4ID0gaTsKKyAgICAgICAgYmVzdF9zaXplID0gY2FuZGlkYXRlX3NpemU7CisgICAgICB9CisgICAgfQorICB9CisgIGFzc2VydChiZXN0X2lkeCAhPSAtMSk7CisgIGZvciAoaSA9IDA7IGkgPCBDQU5ESURBVEVfQ09VTlQ7ICsraSkgeworICAgIGlmIChjYW5kaWRhdGVzW2ldLmV2YWx1YXRlXykgeworICAgICAgaWYgKGkgPT0gYmVzdF9pZHgpIHsKKyAgICAgICAgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgZHN0ID0gaXNfa2V5X2ZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmVuY29kZWRfZnJhbWUtPmtleV9mcmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmZW5jb2RlZF9mcmFtZS0+c3ViX2ZyYW1lXzsKKyAgICAgICAgKmRzdCA9IGNhbmRpZGF0ZXNbaV0uaW5mb187CisgICAgICAgIEdldEVuY29kZWREYXRhKCZjYW5kaWRhdGVzW2ldLm1lbV8sICZkc3QtPmJpdHN0cmVhbSk7CisgICAgICAgIGlmICghaXNfa2V5X2ZyYW1lKSB7CisgICAgICAgICAgLy8gTm90ZTogUHJldmlvdXMgZGlzcG9zZSBtZXRob2Qgb25seSBtYXR0ZXJzIGZvciBub24ta2V5ZnJhbWVzLgorICAgICAgICAgIC8vIEFsc28sIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IHByZXZpb3VzIGRpc3Bvc2UgbWV0aG9kIHRoYXQgd2FzCisgICAgICAgICAgLy8gc2VsZWN0ZWQgd2hlbiBhIG5vbiBrZXktZnJhbWUgd2FzIGFzc3VtZWQuCisgICAgICAgICAgY29uc3QgV2ViUE11eEFuaW1EaXNwb3NlIHByZXZfZGlzcG9zZV9tZXRob2QgPQorICAgICAgICAgICAgICAoYmVzdF9pZHggPT0gTExfRElTUF9OT05FIHx8IGJlc3RfaWR4ID09IExPU1NZX0RJU1BfTk9ORSkKKyAgICAgICAgICAgICAgICAgID8gV0VCUF9NVVhfRElTUE9TRV9OT05FCisgICAgICAgICAgICAgICAgICA6IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORDsKKyAgICAgICAgICBTZXRQcmV2aW91c0Rpc3Bvc2VNZXRob2QoZW5jLCBwcmV2X2Rpc3Bvc2VfbWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICBlbmMtPnByZXZfcmVjdF8gPSBjYW5kaWRhdGVzW2ldLnJlY3RfOyAgLy8gc2F2ZSBmb3IgbmV4dCBmcmFtZS4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmY2FuZGlkYXRlc1tpXS5tZW1fKTsKKyAgICAgICAgY2FuZGlkYXRlc1tpXS5ldmFsdWF0ZV8gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBEZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24sIHRyaWVzIGRpZmZlcmVudCBjb21wcmVzc2lvbnMKKy8vIChsb3NzeS9sb3NzbGVzcyksIGRpc3Bvc2UgbWV0aG9kcywgYmxlbmRpbmcgbWV0aG9kcyBldGMgdG8gZW5jb2RlIHRoZSBjdXJyZW50CisvLyBmcmFtZSBhbmQgb3V0cHV0cyB0aGUgYmVzdCBvbmUgaW4gJ2VuY29kZWRfZnJhbWUnLgorLy8gJ2ZyYW1lX3NraXBwZWQnIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBmcmFtZSBzaG91bGQgYWN0dWFsbHkgYmUgc2tpcHBlZC4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBTZXRGcmFtZShXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVkRnJhbWUqIGNvbnN0IGVuY29kZWRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBmcmFtZV9za2lwcGVkKSB7CisgIGludCBpOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzID0gJmVuYy0+Y3Vycl9jYW52YXNfY29weV87CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcyA9ICZlbmMtPnByZXZfY2FudmFzXzsKKyAgQ2FuZGlkYXRlIGNhbmRpZGF0ZXNbQ0FORElEQVRFX0NPVU5UXTsKKyAgY29uc3QgaW50IGlzX2xvc3NsZXNzID0gY29uZmlnLT5sb3NzbGVzczsKKyAgY29uc3QgaW50IGNvbnNpZGVyX2xvc3NsZXNzID0gaXNfbG9zc2xlc3MgfHwgZW5jLT5vcHRpb25zXy5hbGxvd19taXhlZDsKKyAgY29uc3QgaW50IGNvbnNpZGVyX2xvc3N5ID0gIWlzX2xvc3NsZXNzIHx8IGVuYy0+b3B0aW9uc18uYWxsb3dfbWl4ZWQ7CisgIGNvbnN0IGludCBpc19maXJzdF9mcmFtZSA9IGVuYy0+aXNfZmlyc3RfZnJhbWVfOworCisgIC8vIEZpcnN0IGZyYW1lIGNhbm5vdCBiZSBza2lwcGVkIGFzIHRoZXJlIGlzIG5vICdwcmV2aW91cyBmcmFtZScgdG8gbWVyZ2UgaXQKKyAgLy8gdG8uIFNvLCBlbXB0eSByZWN0YW5nbGUgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSBmaXJzdCBmcmFtZS4KKyAgY29uc3QgaW50IGVtcHR5X3JlY3RfYWxsb3dlZF9ub25lID0gIWlzX2ZpcnN0X2ZyYW1lOworCisgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgZXhhY3QgcGl4ZWwgbWF0Y2ggYmV0d2VlbiAnZGlzcG9zZWQgcHJldmlvdXMgY2FudmFzJyBhbmQKKyAgLy8gJ2N1cnJlbnQgY2FudmFzJywgd2UgY2FuJ3Qgc2tpcCBjdXJyZW50IGZyYW1lLCBhcyB0aGVyZSBtYXkgbm90IGJlIGV4YWN0CisgIC8vIHBpeGVsIG1hdGNoIGJldHdlZW4gJ3ByZXZpb3VzIGNhbnZhcycgYW5kICdjdXJyZW50IGNhbnZhcycuIFNvLCB3ZSBkb24ndAorICAvLyBhbGxvdyBlbXB0eSByZWN0YW5nbGUgaW4gdGhpcyBjYXNlLgorICBjb25zdCBpbnQgZW1wdHlfcmVjdF9hbGxvd2VkX2JnID0gMDsKKworICAvLyBJZiBjdXJyZW50IGZyYW1lIGlzIGEga2V5LWZyYW1lLCBkaXNwb3NlIG1ldGhvZCBvZiBwcmV2aW91cyBmcmFtZSBkb2Vzbid0CisgIC8vIG1hdHRlciwgc28gd2UgZG9uJ3QgdHJ5IGRpc3Bvc2UgdG8gYmFja2dyb3VuZC4KKyAgLy8gQWxzbywgaWYga2V5LWZyYW1lIGluc2VydGlvbiBpcyBvbiwgYW5kIHByZXZpb3VzIGZyYW1lIGNvdWxkIGJlIHBpY2tlZCBhcworICAvLyBlaXRoZXIgYSBzdWItZnJhbWUgb3IgYSBrZXktZnJhbWUsIHRoZW4gd2UgY2FuJ3QgYmUgc3VyZSBhYm91dCB3aGF0IGZyYW1lCisgIC8vIHJlY3RhbmdsZSB3b3VsZCBiZSBkaXNwb3NlZC4gSW4gdGhhdCBjYXNlIHRvbywgd2UgZG9uJ3QgdHJ5IGRpc3Bvc2UgdG8KKyAgLy8gYmFja2dyb3VuZC4KKyAgY29uc3QgaW50IGRpc3Bvc2VfYmdfcG9zc2libGUgPQorICAgICAgIWlzX2tleV9mcmFtZSAmJiAhZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfOworCisgIFN1YkZyYW1lUGFyYW1zIGRpc3Bvc2Vfbm9uZV9wYXJhbXM7CisgIFN1YkZyYW1lUGFyYW1zIGRpc3Bvc2VfYmdfcGFyYW1zOworCisgIFdlYlBDb25maWcgY29uZmlnX2xsID0gKmNvbmZpZzsKKyAgV2ViUENvbmZpZyBjb25maWdfbG9zc3kgPSAqY29uZmlnOworICBjb25maWdfbGwubG9zc2xlc3MgPSAxOworICBjb25maWdfbG9zc3kubG9zc2xlc3MgPSAwOworICBlbmMtPmxhc3RfY29uZmlnXyA9ICpjb25maWc7CisgIGVuYy0+bGFzdF9jb25maWdfcmV2ZXJzZWRfID0gY29uZmlnLT5sb3NzbGVzcyA/IGNvbmZpZ19sb3NzeSA6IGNvbmZpZ19sbDsKKyAgKmZyYW1lX3NraXBwZWQgPSAwOworCisgIGlmICghU3ViRnJhbWVQYXJhbXNJbml0KCZkaXNwb3NlX25vbmVfcGFyYW1zLCAxLCBlbXB0eV9yZWN0X2FsbG93ZWRfbm9uZSkgfHwKKyAgICAgICFTdWJGcmFtZVBhcmFtc0luaXQoJmRpc3Bvc2VfYmdfcGFyYW1zLCAwLCBlbXB0eV9yZWN0X2FsbG93ZWRfYmcpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworICB9CisKKyAgbWVtc2V0KGNhbmRpZGF0ZXMsIDAsIHNpemVvZihjYW5kaWRhdGVzKSk7CisKKyAgLy8gQ2hhbmdlLXJlY3RhbmdsZSBhc3N1bWluZyBwcmV2aW91cyBmcmFtZSB3YXMgRElTUE9TRV9OT05FLgorICBpZiAoIUdldFN1YlJlY3RzKHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgaXNfa2V5X2ZyYW1lLCBpc19maXJzdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25maWdfbG9zc3kucXVhbGl0eSwgJmRpc3Bvc2Vfbm9uZV9wYXJhbXMpKSB7CisgICAgZXJyb3JfY29kZSA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworICAgIGdvdG8gRXJyOworICB9CisKKyAgaWYgKChjb25zaWRlcl9sb3NzbGVzcyAmJiBJc0VtcHR5UmVjdCgmZGlzcG9zZV9ub25lX3BhcmFtcy5yZWN0X2xsXykpIHx8CisgICAgICAoY29uc2lkZXJfbG9zc3kgJiYgSXNFbXB0eVJlY3QoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMucmVjdF9sb3NzeV8pKSkgeworICAgIC8vIERvbid0IGVuY29kZSB0aGUgZnJhbWUgYXQgYWxsLiBJbnN0ZWFkLCB0aGUgZHVyYXRpb24gb2YgdGhlIHByZXZpb3VzCisgICAgLy8gZnJhbWUgd2lsbCBiZSBpbmNyZWFzZWQgbGF0ZXIuCisgICAgYXNzZXJ0KGVtcHR5X3JlY3RfYWxsb3dlZF9ub25lKTsKKyAgICAqZnJhbWVfc2tpcHBlZCA9IDE7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoZGlzcG9zZV9iZ19wb3NzaWJsZSkgeworICAgIC8vIENoYW5nZS1yZWN0YW5nbGUgYXNzdW1pbmcgcHJldmlvdXMgZnJhbWUgd2FzIERJU1BPU0VfQkFDS0dST1VORC4KKyAgICBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXNfZGlzcG9zZWQgPSAmZW5jLT5wcmV2X2NhbnZhc19kaXNwb3NlZF87CisgICAgV2ViUENvcHlQaXhlbHMocHJldl9jYW52YXMsIHByZXZfY2FudmFzX2Rpc3Bvc2VkKTsKKyAgICBEaXNwb3NlRnJhbWVSZWN0YW5nbGUoV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5ELCAmZW5jLT5wcmV2X3JlY3RfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2NhbnZhc19kaXNwb3NlZCk7CisKKyAgICBpZiAoIUdldFN1YlJlY3RzKHByZXZfY2FudmFzX2Rpc3Bvc2VkLCBjdXJyX2NhbnZhcywgaXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgaXNfZmlyc3RfZnJhbWUsIGNvbmZpZ19sb3NzeS5xdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2VfYmdfcGFyYW1zKSkgeworICAgICAgZXJyb3JfY29kZSA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworICAgICAgZ290byBFcnI7CisgICAgfQorICAgIGFzc2VydCghSXNFbXB0eVJlY3QoJmRpc3Bvc2VfYmdfcGFyYW1zLnJlY3RfbGxfKSk7CisgICAgYXNzZXJ0KCFJc0VtcHR5UmVjdCgmZGlzcG9zZV9iZ19wYXJhbXMucmVjdF9sb3NzeV8pKTsKKworICAgIGlmIChlbmMtPm9wdGlvbnNfLm1pbmltaXplX3NpemUpIHsgIC8vIFRyeSBib3RoIGRpc3Bvc2UgbWV0aG9kcy4KKyAgICAgIGRpc3Bvc2VfYmdfcGFyYW1zLnNob3VsZF90cnlfID0gMTsKKyAgICAgIGRpc3Bvc2Vfbm9uZV9wYXJhbXMuc2hvdWxkX3RyeV8gPSAxOworICAgIH0gZWxzZSBpZiAoKGlzX2xvc3NsZXNzICYmCisgICAgICAgICAgICAgICAgUmVjdEFyZWEoJmRpc3Bvc2VfYmdfcGFyYW1zLnJlY3RfbGxfKSA8CisgICAgICAgICAgICAgICAgICAgIFJlY3RBcmVhKCZkaXNwb3NlX25vbmVfcGFyYW1zLnJlY3RfbGxfKSkgfHwKKyAgICAgICAgICAgICAgICghaXNfbG9zc2xlc3MgJiYKKyAgICAgICAgICAgICAgICBSZWN0QXJlYSgmZGlzcG9zZV9iZ19wYXJhbXMucmVjdF9sb3NzeV8pIDwKKyAgICAgICAgICAgICAgICAgICAgUmVjdEFyZWEoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMucmVjdF9sb3NzeV8pKSkgeworICAgICAgZGlzcG9zZV9iZ19wYXJhbXMuc2hvdWxkX3RyeV8gPSAxOyAgLy8gUGljayBESVNQT1NFX0JBQ0tHUk9VTkQuCisgICAgICBkaXNwb3NlX25vbmVfcGFyYW1zLnNob3VsZF90cnlfID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoZGlzcG9zZV9ub25lX3BhcmFtcy5zaG91bGRfdHJ5XykgeworICAgIGVycm9yX2NvZGUgPSBHZW5lcmF0ZUNhbmRpZGF0ZXMoCisgICAgICAgIGVuYywgY2FuZGlkYXRlcywgV0VCUF9NVVhfRElTUE9TRV9OT05FLCBpc19sb3NzbGVzcywgaXNfa2V5X2ZyYW1lLAorICAgICAgICAmZGlzcG9zZV9ub25lX3BhcmFtcywgJmNvbmZpZ19sbCwgJmNvbmZpZ19sb3NzeSk7CisgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFcnI7CisgIH0KKworICBpZiAoZGlzcG9zZV9iZ19wYXJhbXMuc2hvdWxkX3RyeV8pIHsKKyAgICBhc3NlcnQoIWVuYy0+aXNfZmlyc3RfZnJhbWVfKTsKKyAgICBhc3NlcnQoZGlzcG9zZV9iZ19wb3NzaWJsZSk7CisgICAgZXJyb3JfY29kZSA9IEdlbmVyYXRlQ2FuZGlkYXRlcygKKyAgICAgICAgZW5jLCBjYW5kaWRhdGVzLCBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQsIGlzX2xvc3NsZXNzLCBpc19rZXlfZnJhbWUsCisgICAgICAgICZkaXNwb3NlX2JnX3BhcmFtcywgJmNvbmZpZ19sbCwgJmNvbmZpZ19sb3NzeSk7CisgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFcnI7CisgIH0KKworICBQaWNrQmVzdENhbmRpZGF0ZShlbmMsIGNhbmRpZGF0ZXMsIGlzX2tleV9mcmFtZSwgZW5jb2RlZF9mcmFtZSk7CisKKyAgZ290byBFbmQ7CisKKyBFcnI6CisgIGZvciAoaSA9IDA7IGkgPCBDQU5ESURBVEVfQ09VTlQ7ICsraSkgeworICAgIGlmIChjYW5kaWRhdGVzW2ldLmV2YWx1YXRlXykgeworICAgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZjYW5kaWRhdGVzW2ldLm1lbV8pOworICAgIH0KKyAgfQorCisgRW5kOgorICBTdWJGcmFtZVBhcmFtc0ZyZWUoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMpOworICBTdWJGcmFtZVBhcmFtc0ZyZWUoJmRpc3Bvc2VfYmdfcGFyYW1zKTsKKyAgcmV0dXJuIGVycm9yX2NvZGU7Cit9CisKKy8vIENhbGN1bGF0ZSB0aGUgcGVuYWx0eSBpbmN1cnJlZCBpZiB3ZSBlbmNvZGUgZ2l2ZW4gZnJhbWUgYXMgYSBrZXkgZnJhbWUKKy8vIGluc3RlYWQgb2YgYSBzdWItZnJhbWUuCitzdGF0aWMgaW50NjRfdCBLZXlGcmFtZVBlbmFsdHkoY29uc3QgRW5jb2RlZEZyYW1lKiBjb25zdCBlbmNvZGVkX2ZyYW1lKSB7CisgIHJldHVybiAoKGludDY0X3QpZW5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lXy5iaXRzdHJlYW0uc2l6ZSAtCisgICAgICAgICAgZW5jb2RlZF9mcmFtZS0+c3ViX2ZyYW1lXy5iaXRzdHJlYW0uc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgQ2FjaGVGcmFtZShXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IGZyYW1lX3NraXBwZWQgPSAwOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlID0gVlA4X0VOQ19PSzsKKyAgY29uc3Qgc2l6ZV90IHBvc2l0aW9uID0gZW5jLT5jb3VudF87CisgIEVuY29kZWRGcmFtZSogY29uc3QgZW5jb2RlZF9mcmFtZSA9IEdldEZyYW1lKGVuYywgcG9zaXRpb24pOworCisgICsrZW5jLT5jb3VudF87CisKKyAgaWYgKGVuYy0+aXNfZmlyc3RfZnJhbWVfKSB7ICAvLyBBZGQgdGhpcyBhcyBhIGtleS1mcmFtZS4KKyAgICBlcnJvcl9jb2RlID0gU2V0RnJhbWUoZW5jLCBjb25maWcsIDEsIGVuY29kZWRfZnJhbWUsICZmcmFtZV9za2lwcGVkKTsKKyAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVuZDsKKyAgICBhc3NlcnQoZnJhbWVfc2tpcHBlZCA9PSAwKTsgIC8vIEZpcnN0IGZyYW1lIGNhbid0IGJlIHNraXBwZWQsIGV2ZW4gaWYgZW1wdHkuCisgICAgYXNzZXJ0KHBvc2l0aW9uID09IDAgJiYgZW5jLT5jb3VudF8gPT0gMSk7CisgICAgZW5jb2RlZF9mcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDE7CisgICAgZW5jLT5mbHVzaF9jb3VudF8gPSAwOworICAgIGVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXyA9IDA7CisgICAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMDsKKyAgfSBlbHNlIHsKKyAgICArK2VuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXzsKKyAgICBpZiAoZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfIDw9IGVuYy0+b3B0aW9uc18ua21pbikgeworICAgICAgLy8gQWRkIHRoaXMgYXMgYSBmcmFtZSByZWN0YW5nbGUuCisgICAgICBlcnJvcl9jb2RlID0gU2V0RnJhbWUoZW5jLCBjb25maWcsIDAsIGVuY29kZWRfZnJhbWUsICZmcmFtZV9za2lwcGVkKTsKKyAgICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRW5kOworICAgICAgaWYgKGZyYW1lX3NraXBwZWQpIGdvdG8gU2tpcDsKKyAgICAgIGVuY29kZWRfZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAwOworICAgICAgZW5jLT5mbHVzaF9jb3VudF8gPSBlbmMtPmNvdW50XyAtIDE7CisgICAgICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpbnQ2NF90IGN1cnJfZGVsdGE7CisgICAgICBGcmFtZVJlY3RhbmdsZSBwcmV2X3JlY3Rfa2V5LCBwcmV2X3JlY3Rfc3ViOworCisgICAgICAvLyBBZGQgdGhpcyBhcyBhIGZyYW1lIHJlY3RhbmdsZSB0byBlbmMuCisgICAgICBlcnJvcl9jb2RlID0gU2V0RnJhbWUoZW5jLCBjb25maWcsIDAsIGVuY29kZWRfZnJhbWUsICZmcmFtZV9za2lwcGVkKTsKKyAgICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRW5kOworICAgICAgaWYgKGZyYW1lX3NraXBwZWQpIGdvdG8gU2tpcDsKKyAgICAgIHByZXZfcmVjdF9zdWIgPSBlbmMtPnByZXZfcmVjdF87CisKKworICAgICAgLy8gQWRkIHRoaXMgYXMgYSBrZXktZnJhbWUgdG8gZW5jLCB0b28uCisgICAgICBlcnJvcl9jb2RlID0gU2V0RnJhbWUoZW5jLCBjb25maWcsIDEsIGVuY29kZWRfZnJhbWUsICZmcmFtZV9za2lwcGVkKTsKKyAgICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRW5kOworICAgICAgYXNzZXJ0KGZyYW1lX3NraXBwZWQgPT0gMCk7ICAvLyBLZXktZnJhbWUgY2Fubm90IGJlIGFuIGVtcHR5IHJlY3RhbmdsZS4KKyAgICAgIHByZXZfcmVjdF9rZXkgPSBlbmMtPnByZXZfcmVjdF87CisKKyAgICAgIC8vIEFuYWx5emUgc2l6ZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gdmFyaWFudHMuCisgICAgICBjdXJyX2RlbHRhID0gS2V5RnJhbWVQZW5hbHR5KGVuY29kZWRfZnJhbWUpOworICAgICAgaWYgKGN1cnJfZGVsdGEgPD0gZW5jLT5iZXN0X2RlbHRhXykgeyAgLy8gUGljayB0aGlzIGFzIHRoZSBrZXktZnJhbWUuCisgICAgICAgIGlmIChlbmMtPmtleWZyYW1lXyAhPSBLRVlGUkFNRV9OT05FKSB7CisgICAgICAgICAgRW5jb2RlZEZyYW1lKiBjb25zdCBvbGRfa2V5ZnJhbWUgPSBHZXRGcmFtZShlbmMsIGVuYy0+a2V5ZnJhbWVfKTsKKyAgICAgICAgICBhc3NlcnQob2xkX2tleWZyYW1lLT5pc19rZXlfZnJhbWVfKTsKKyAgICAgICAgICBvbGRfa2V5ZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAwOworICAgICAgICB9CisgICAgICAgIGVuY29kZWRfZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAxOworICAgICAgICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAxOworICAgICAgICBlbmMtPmtleWZyYW1lXyA9IChpbnQpcG9zaXRpb247CisgICAgICAgIGVuYy0+YmVzdF9kZWx0YV8gPSBjdXJyX2RlbHRhOworICAgICAgICBlbmMtPmZsdXNoX2NvdW50XyA9IGVuYy0+Y291bnRfIC0gMTsgIC8vIFdlIGNhbiBmbHVzaCBwcmV2aW91cyBmcmFtZXMuCisgICAgICB9IGVsc2UgeworICAgICAgICBlbmNvZGVkX2ZyYW1lLT5pc19rZXlfZnJhbWVfID0gMDsKKyAgICAgICAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMDsKKyAgICAgIH0KKyAgICAgIC8vIE5vdGU6IFdlIG5lZWQgJz49JyBiZWxvdyBiZWNhdXNlIHdoZW4ga21pbiBhbmQga21heCBhcmUgYm90aCB6ZXJvLAorICAgICAgLy8gY291bnRfc2luY2Vfa2V5X2ZyYW1lIHdpbGwgYWx3YXlzIGJlID4ga21heC4KKyAgICAgIGlmIChlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV8gPj0gZW5jLT5vcHRpb25zXy5rbWF4KSB7CisgICAgICAgIGVuYy0+Zmx1c2hfY291bnRfID0gZW5jLT5jb3VudF8gLSAxOworICAgICAgICBlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV8gPSAwOworICAgICAgICBlbmMtPmtleWZyYW1lXyA9IEtFWUZSQU1FX05PTkU7CisgICAgICAgIGVuYy0+YmVzdF9kZWx0YV8gPSBERUxUQV9JTkZJTklUWTsKKyAgICAgIH0KKyAgICAgIGlmICghZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfKSB7CisgICAgICAgIGVuYy0+cHJldl9yZWN0XyA9CisgICAgICAgICAgICBlbmNvZGVkX2ZyYW1lLT5pc19rZXlfZnJhbWVfID8gcHJldl9yZWN0X2tleSA6IHByZXZfcmVjdF9zdWI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlIHByZXZpb3VzIHRvIHByZXZpb3VzIGFuZCBwcmV2aW91cyBjYW52YXNlcyBmb3IgbmV4dCBjYWxsLgorICBXZWJQQ29weVBpeGVscyhlbmMtPmN1cnJfY2FudmFzXywgJmVuYy0+cHJldl9jYW52YXNfKTsKKyAgZW5jLT5pc19maXJzdF9mcmFtZV8gPSAwOworCisgU2tpcDoKKyAgb2sgPSAxOworICArK2VuYy0+aW5fZnJhbWVfY291bnRfOworCisgRW5kOgorICBpZiAoIW9rIHx8IGZyYW1lX3NraXBwZWQpIHsKKyAgICBGcmFtZVJlbGVhc2UoZW5jb2RlZF9mcmFtZSk7CisgICAgLy8gV2UgcmVzZXQgc29tZSBjb3VudGVycywgYXMgdGhlIGZyYW1lIGFkZGl0aW9uIGZhaWxlZC93YXMgc2tpcHBlZC4KKyAgICAtLWVuYy0+Y291bnRfOworICAgIGlmICghZW5jLT5pc19maXJzdF9mcmFtZV8pIC0tZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfOworICAgIGlmICghb2spIHsKKyAgICAgIE1hcmtFcnJvcjIoZW5jLCAiRVJST1IgYWRkaW5nIGZyYW1lLiBXZWJQRW5jb2RpbmdFcnJvciIsIGVycm9yX2NvZGUpOworICAgIH0KKyAgfQorICBlbmMtPmN1cnJfY2FudmFzXy0+ZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7ICAgLy8gcmVwb3J0IGVycm9yX2NvZGUKKyAgYXNzZXJ0KG9rIHx8IGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSyk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBGbHVzaEZyYW1lcyhXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYykgeworICB3aGlsZSAoZW5jLT5mbHVzaF9jb3VudF8gPiAwKSB7CisgICAgV2ViUE11eEVycm9yIGVycjsKKyAgICBFbmNvZGVkRnJhbWUqIGNvbnN0IGN1cnIgPSBHZXRGcmFtZShlbmMsIDApOworICAgIGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGluZm8gPQorICAgICAgICBjdXJyLT5pc19rZXlfZnJhbWVfID8gJmN1cnItPmtleV9mcmFtZV8gOiAmY3Vyci0+c3ViX2ZyYW1lXzsKKyAgICBhc3NlcnQoZW5jLT5tdXhfICE9IE5VTEwpOworICAgIGVyciA9IFdlYlBNdXhQdXNoRnJhbWUoZW5jLT5tdXhfLCBpbmZvLCAxKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICBNYXJrRXJyb3IyKGVuYywgIkVSUk9SIGFkZGluZyBmcmFtZS4gV2ViUE11eEVycm9yIiwgZXJyKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZW5jLT5vcHRpb25zXy52ZXJib3NlKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIklORk86IEFkZGVkIGZyYW1lLiBvZmZzZXQ6JWQsJWQgZGlzcG9zZTolZCBibGVuZDolZFxuIiwKKyAgICAgICAgICAgICAgaW5mby0+eF9vZmZzZXQsIGluZm8tPnlfb2Zmc2V0LCBpbmZvLT5kaXNwb3NlX21ldGhvZCwKKyAgICAgICAgICAgICAgaW5mby0+YmxlbmRfbWV0aG9kKTsKKyAgICB9CisgICAgKytlbmMtPm91dF9mcmFtZV9jb3VudF87CisgICAgRnJhbWVSZWxlYXNlKGN1cnIpOworICAgICsrZW5jLT5zdGFydF87CisgICAgLS1lbmMtPmZsdXNoX2NvdW50XzsKKyAgICAtLWVuYy0+Y291bnRfOworICAgIGlmIChlbmMtPmtleWZyYW1lXyAhPSBLRVlGUkFNRV9OT05FKSAtLWVuYy0+a2V5ZnJhbWVfOworICB9CisKKyAgaWYgKGVuYy0+Y291bnRfID09IDEgJiYgZW5jLT5zdGFydF8gIT0gMCkgeworICAgIC8vIE1vdmUgZW5jLT5zdGFydCB0byBpbmRleCAwLgorICAgIGNvbnN0IGludCBlbmNfc3RhcnRfdG1wID0gKGludCllbmMtPnN0YXJ0XzsKKyAgICBFbmNvZGVkRnJhbWUgdGVtcCA9IGVuYy0+ZW5jb2RlZF9mcmFtZXNfWzBdOworICAgIGVuYy0+ZW5jb2RlZF9mcmFtZXNfWzBdID0gZW5jLT5lbmNvZGVkX2ZyYW1lc19bZW5jX3N0YXJ0X3RtcF07CisgICAgZW5jLT5lbmNvZGVkX2ZyYW1lc19bZW5jX3N0YXJ0X3RtcF0gPSB0ZW1wOworICAgIEZyYW1lUmVsZWFzZSgmZW5jLT5lbmNvZGVkX2ZyYW1lc19bZW5jX3N0YXJ0X3RtcF0pOworICAgIGVuYy0+c3RhcnRfID0gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworI3VuZGVmIERFTFRBX0lORklOSVRZCisjdW5kZWYgS0VZRlJBTUVfTk9ORQorCitpbnQgV2ViUEFuaW1FbmNvZGVyQWRkKFdlYlBBbmltRW5jb2RlciogZW5jLCBXZWJQUGljdHVyZSogZnJhbWUsIGludCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBDb25maWcqIGVuY29kZXJfY29uZmlnKSB7CisgIFdlYlBDb25maWcgY29uZmlnOworICBpbnQgb2s7CisKKyAgaWYgKGVuYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTWFya05vRXJyb3IoZW5jKTsKKworICBpZiAoIWVuYy0+aXNfZmlyc3RfZnJhbWVfKSB7CisgICAgLy8gTWFrZSBzdXJlIHRpbWVzdGFtcHMgYXJlIG5vbi1kZWNyZWFzaW5nIChpbnRlZ2VyIHdyYXAtYXJvdW5kIGlzIE9LKS4KKyAgICBjb25zdCB1aW50MzJfdCBwcmV2X2ZyYW1lX2R1cmF0aW9uID0KKyAgICAgICAgKHVpbnQzMl90KXRpbWVzdGFtcCAtIGVuYy0+cHJldl90aW1lc3RhbXBfOworICAgIGlmIChwcmV2X2ZyYW1lX2R1cmF0aW9uID49IE1BWF9EVVJBVElPTikgeworICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgZnJhbWUtPmVycm9yX2NvZGUgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKKyAgICAgIH0KKyAgICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUiBhZGRpbmcgZnJhbWU6IHRpbWVzdGFtcHMgbXVzdCBiZSBub24tZGVjcmVhc2luZyIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghSW5jcmVhc2VQcmV2aW91c0R1cmF0aW9uKGVuYywgKGludClwcmV2X2ZyYW1lX2R1cmF0aW9uKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGVuYy0+Zmlyc3RfdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsKKyAgfQorCisgIGlmIChmcmFtZSA9PSBOVUxMKSB7ICAvLyBTcGVjaWFsOiBsYXN0IGNhbGwuCisgICAgZW5jLT5nb3RfbnVsbF9mcmFtZV8gPSAxOworICAgIGVuYy0+cHJldl90aW1lc3RhbXBfID0gdGltZXN0YW1wOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGZyYW1lLT53aWR0aCAhPSBlbmMtPmNhbnZhc193aWR0aF8gfHwKKyAgICAgIGZyYW1lLT5oZWlnaHQgIT0gZW5jLT5jYW52YXNfaGVpZ2h0XykgeworICAgIGZyYW1lLT5lcnJvcl9jb2RlID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047CisgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SIGFkZGluZyBmcmFtZTogSW52YWxpZCBmcmFtZSBkaW1lbnNpb25zIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWZyYW1lLT51c2VfYXJnYikgeyAgLy8gQ29udmVydCBmcmFtZSBmcm9tIFlVVihBKSB0byBBUkdCLgorICAgIGlmIChlbmMtPm9wdGlvbnNfLnZlcmJvc2UpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogQ29udmVydGluZyBmcmFtZSBmcm9tIFlVVihBKSB0byBBUkdCIGZvcm1hdDsgIgorICAgICAgICAgICAgICAidGhpcyBpbmN1cnMgYSBzbWFsbCBsb3NzLlxuIik7CisgICAgfQorICAgIGlmICghV2ViUFBpY3R1cmVZVVZBVG9BUkdCKGZyYW1lKSkgeworICAgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SIGNvbnZlcnRpbmcgZnJhbWUgZnJvbSBZVVYoQSkgdG8gQVJHQiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGVuY29kZXJfY29uZmlnICE9IE5VTEwpIHsKKyAgICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZyhlbmNvZGVyX2NvbmZpZykpIHsKKyAgICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUiBhZGRpbmcgZnJhbWU6IEludmFsaWQgV2ViUENvbmZpZyIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbmZpZyA9ICplbmNvZGVyX2NvbmZpZzsKKyAgfSBlbHNlIHsKKyAgICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKyAgICBjb25maWcubG9zc2xlc3MgPSAxOworICB9CisgIGFzc2VydChlbmMtPmN1cnJfY2FudmFzXyA9PSBOVUxMKTsKKyAgZW5jLT5jdXJyX2NhbnZhc18gPSBmcmFtZTsgIC8vIFN0b3JlIHJlZmVyZW5jZS4KKyAgYXNzZXJ0KGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPT0gMSk7CisgIENvcHlDdXJyZW50Q2FudmFzKGVuYyk7CisKKyAgb2sgPSBDYWNoZUZyYW1lKGVuYywgJmNvbmZpZykgJiYgRmx1c2hGcmFtZXMoZW5jKTsKKworICBlbmMtPmN1cnJfY2FudmFzXyA9IE5VTEw7CisgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPSAxOworICBpZiAob2spIHsKKyAgICBlbmMtPnByZXZfdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXRzdHJlYW0gYXNzZW1ibHkuCisKK3N0YXRpYyBpbnQgRGVjb2RlRnJhbWVPbnRvQ2FudmFzKGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGNhbnZhcykgeworICBjb25zdCBXZWJQRGF0YSogY29uc3QgaW1hZ2UgPSAmZnJhbWUtPmJpdHN0cmVhbTsKKyAgV2ViUFBpY3R1cmUgc3ViX2ltYWdlOworICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgIFdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKTsKKyAgV2ViUFV0aWxDbGVhclBpYyhjYW52YXMsIE5VTEwpOworICBpZiAoV2ViUEdldEZlYXR1cmVzKGltYWdlLT5ieXRlcywgaW1hZ2UtPnNpemUsICZjb25maWcuaW5wdXQpICE9CisgICAgICBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFXZWJQUGljdHVyZVZpZXcoY2FudmFzLCBmcmFtZS0+eF9vZmZzZXQsIGZyYW1lLT55X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmlucHV0LndpZHRoLCBjb25maWcuaW5wdXQuaGVpZ2h0LCAmc3ViX2ltYWdlKSkgeworICAgIHJldHVybiAwOworICB9CisgIGNvbmZpZy5vdXRwdXQuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKyAgY29uZmlnLm91dHB1dC5jb2xvcnNwYWNlID0gTU9ERV9CR1JBOworICBjb25maWcub3V0cHV0LnUuUkdCQS5yZ2JhID0gKHVpbnQ4X3QqKXN1Yl9pbWFnZS5hcmdiOworICBjb25maWcub3V0cHV0LnUuUkdCQS5zdHJpZGUgPSBzdWJfaW1hZ2UuYXJnYl9zdHJpZGUgKiA0OworICBjb25maWcub3V0cHV0LnUuUkdCQS5zaXplID0gY29uZmlnLm91dHB1dC51LlJHQkEuc3RyaWRlICogc3ViX2ltYWdlLmhlaWdodDsKKworICBpZiAoV2ViUERlY29kZShpbWFnZS0+Ynl0ZXMsIGltYWdlLT5zaXplLCAmY29uZmlnKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRnJhbWVUb0Z1bGxDYW52YXMoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3QgZnVsbF9pbWFnZSkgeworICBXZWJQUGljdHVyZSogY29uc3QgY2FudmFzX2J1ZiA9ICZlbmMtPmN1cnJfY2FudmFzX2NvcHlfOworICBXZWJQTWVtb3J5V3JpdGVyIG1lbTEsIG1lbTI7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZtZW0xKTsKKyAgV2ViUE1lbW9yeVdyaXRlckluaXQoJm1lbTIpOworCisgIGlmICghRGVjb2RlRnJhbWVPbnRvQ2FudmFzKGZyYW1lLCBjYW52YXNfYnVmKSkgZ290byBFcnI7CisgIGlmICghRW5jb2RlRnJhbWUoJmVuYy0+bGFzdF9jb25maWdfLCBjYW52YXNfYnVmLCAmbWVtMSkpIGdvdG8gRXJyOworICBHZXRFbmNvZGVkRGF0YSgmbWVtMSwgZnVsbF9pbWFnZSk7CisKKyAgaWYgKGVuYy0+b3B0aW9uc18uYWxsb3dfbWl4ZWQpIHsKKyAgICBpZiAoIUVuY29kZUZyYW1lKCZlbmMtPmxhc3RfY29uZmlnX3JldmVyc2VkXywgY2FudmFzX2J1ZiwgJm1lbTIpKSBnb3RvIEVycjsKKyAgICBpZiAobWVtMi5zaXplIDwgbWVtMS5zaXplKSB7CisgICAgICBHZXRFbmNvZGVkRGF0YSgmbWVtMiwgZnVsbF9pbWFnZSk7CisgICAgICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJm1lbTEpOworICAgIH0gZWxzZSB7CisgICAgICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJm1lbTIpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKKworIEVycjoKKyAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZtZW0xKTsKKyAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZtZW0yKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENvbnZlcnQgYSBzaW5nbGUtZnJhbWUgYW5pbWF0aW9uIHRvIGEgbm9uLWFuaW1hdGVkIGltYWdlIGlmIGFwcHJvcHJpYXRlLgorLy8gVE9ETyh1cnZhbmcpOiBDYW4gd2UgcGljayBvbmUgb2YgdGhlIHR3byBoZXVyaXN0aWNhbGx5IChiYXNlZCBvbiBmcmFtZQorLy8gcmVjdGFuZ2xlIGFuZC9vciBwcmVzZW5jZSBvZiBhbHBoYSk/CitzdGF0aWMgV2ViUE11eEVycm9yIE9wdGltaXplU2luZ2xlRnJhbWUoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSkgeworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfT0s7CisgIGludCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisgIFdlYlBNdXhGcmFtZUluZm8gZnJhbWU7CisgIFdlYlBEYXRhIGZ1bGxfaW1hZ2U7CisgIFdlYlBEYXRhIHdlYnBfZGF0YTI7CisgIFdlYlBNdXgqIGNvbnN0IG11eCA9IFdlYlBNdXhDcmVhdGUod2VicF9kYXRhLCAwKTsKKyAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgIGFzc2VydChlbmMtPm91dF9mcmFtZV9jb3VudF8gPT0gMSk7CisgIFdlYlBEYXRhSW5pdCgmZnJhbWUuYml0c3RyZWFtKTsKKyAgV2ViUERhdGFJbml0KCZmdWxsX2ltYWdlKTsKKyAgV2ViUERhdGFJbml0KCZ3ZWJwX2RhdGEyKTsKKworICBlcnIgPSBXZWJQTXV4R2V0RnJhbWUobXV4LCAxLCAmZnJhbWUpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVuZDsKKyAgaWYgKGZyYW1lLmlkICE9IFdFQlBfQ0hVTktfQU5NRikgZ290byBFbmQ7ICAvLyBOb24tYW5pbWF0aW9uOiBub3RoaW5nIHRvIGRvLgorICBlcnIgPSBXZWJQTXV4R2V0Q2FudmFzU2l6ZShtdXgsICZjYW52YXNfd2lkdGgsICZjYW52YXNfaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFbmQ7CisgIGlmICghRnJhbWVUb0Z1bGxDYW52YXMoZW5jLCAmZnJhbWUsICZmdWxsX2ltYWdlKSkgeworICAgIGVyciA9IFdFQlBfTVVYX0JBRF9EQVRBOworICAgIGdvdG8gRW5kOworICB9CisgIGVyciA9IFdlYlBNdXhTZXRJbWFnZShtdXgsICZmdWxsX2ltYWdlLCAxKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFbmQ7CisgIGVyciA9IFdlYlBNdXhBc3NlbWJsZShtdXgsICZ3ZWJwX2RhdGEyKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFbmQ7CisKKyAgaWYgKHdlYnBfZGF0YTIuc2l6ZSA8IHdlYnBfZGF0YS0+c2l6ZSkgeyAgLy8gUGljayAnd2VicF9kYXRhMicgaWYgc21hbGxlci4KKyAgICBXZWJQRGF0YUNsZWFyKHdlYnBfZGF0YSk7CisgICAgKndlYnBfZGF0YSA9IHdlYnBfZGF0YTI7CisgICAgV2ViUERhdGFJbml0KCZ3ZWJwX2RhdGEyKTsKKyAgfQorCisgRW5kOgorICBXZWJQRGF0YUNsZWFyKCZmcmFtZS5iaXRzdHJlYW0pOworICBXZWJQRGF0YUNsZWFyKCZmdWxsX2ltYWdlKTsKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEyKTsKKyAgcmV0dXJuIGVycjsKK30KKworaW50IFdlYlBBbmltRW5jb2RlckFzc2VtYmxlKFdlYlBBbmltRW5jb2RlciogZW5jLCBXZWJQRGF0YSogd2VicF9kYXRhKSB7CisgIFdlYlBNdXgqIG11eDsKKyAgV2ViUE11eEVycm9yIGVycjsKKworICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNYXJrTm9FcnJvcihlbmMpOworCisgIGlmICh3ZWJwX2RhdGEgPT0gTlVMTCkgeworICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUiBhc3NlbWJsaW5nOiBOVUxMIGlucHV0Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZW5jLT5pbl9mcmFtZV9jb3VudF8gPT0gMCkgeworICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUjogTm8gZnJhbWVzIHRvIGFzc2VtYmxlIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWVuYy0+Z290X251bGxfZnJhbWVfICYmIGVuYy0+aW5fZnJhbWVfY291bnRfID4gMSAmJiBlbmMtPmNvdW50XyA+IDApIHsKKyAgICAvLyBzZXQgZHVyYXRpb24gb2YgdGhlIGxhc3QgZnJhbWUgdG8gYmUgYXZnIG9mIGR1cmF0aW9ucyBvZiBwcmV2aW91cyBmcmFtZXMuCisgICAgY29uc3QgZG91YmxlIGRlbHRhX3RpbWUgPQorICAgICAgICAodWludDMyX3QpZW5jLT5wcmV2X3RpbWVzdGFtcF8gLSBlbmMtPmZpcnN0X3RpbWVzdGFtcF87CisgICAgY29uc3QgaW50IGF2ZXJhZ2VfZHVyYXRpb24gPSAoaW50KShkZWx0YV90aW1lIC8gKGVuYy0+aW5fZnJhbWVfY291bnRfIC0gMSkpOworICAgIGlmICghSW5jcmVhc2VQcmV2aW91c0R1cmF0aW9uKGVuYywgYXZlcmFnZV9kdXJhdGlvbikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIEZsdXNoIGFueSByZW1haW5pbmcgZnJhbWVzLgorICBlbmMtPmZsdXNoX2NvdW50XyA9IGVuYy0+Y291bnRfOworICBpZiAoIUZsdXNoRnJhbWVzKGVuYykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFNldCBkZWZpbml0aXZlIGNhbnZhcyBzaXplLgorICBtdXggPSBlbmMtPm11eF87CisgIGVyciA9IFdlYlBNdXhTZXRDYW52YXNTaXplKG11eCwgZW5jLT5jYW52YXNfd2lkdGhfLCBlbmMtPmNhbnZhc19oZWlnaHRfKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgZXJyID0gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhtdXgsICZlbmMtPm9wdGlvbnNfLmFuaW1fcGFyYW1zKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgLy8gQXNzZW1ibGUgaW50byBhIFdlYlAgYml0c3RyZWFtLgorICBlcnIgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCB3ZWJwX2RhdGEpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICBpZiAoZW5jLT5vdXRfZnJhbWVfY291bnRfID09IDEpIHsKKyAgICBlcnIgPSBPcHRpbWl6ZVNpbmdsZUZyYW1lKGVuYywgd2VicF9kYXRhKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgfQorICByZXR1cm4gMTsKKworIEVycjoKKyAgTWFya0Vycm9yMihlbmMsICJFUlJPUiBhc3NlbWJsaW5nIFdlYlAiLCBlcnIpOworICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciogV2ViUEFuaW1FbmNvZGVyR2V0RXJyb3IoV2ViUEFuaW1FbmNvZGVyKiBlbmMpIHsKKyAgaWYgKGVuYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGVuYy0+ZXJyb3Jfc3RyXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbWkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg5OTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltaS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbnRlcm5hbCBoZWFkZXIgZm9yIGFuaW1hdGlvbiByZWxhdGVkIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IEh1aSBTdSAoaHVpc3VAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX01VWF9BTklNSV9IXworI2RlZmluZSBXRUJQX01VWF9BTklNSV9IXworCisjaW5jbHVkZSAic3JjL3dlYnAvbXV4LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gUGlja3MgdGhlIG9wdGltYWwgcmVjdGFuZ2xlIGJldHdlZW4gdHdvIHBpY3R1cmVzLCBzdGFydGluZyB3aXRoIGluaXRpYWwKKy8vIHZhbHVlcyBvZiBvZmZzZXRzIGFuZCBkaW1lbnNpb25zIHRoYXQgYXJlIHBhc3NlZCBpbi4gVGhlIGluaXRpYWwKKy8vIHZhbHVlcyB3aWxsIGJlIGNsaXBwZWQsIGlmIG5lY2Vzc2FyeSwgdG8gbWFrZSBzdXJlIHRoZSByZWN0YW5nbGUgaXMKKy8vIHdpdGhpbiB0aGUgY2FudmFzLiAidXNlX2FyZ2IiIG11c3QgYmUgdHJ1ZSBmb3IgYm90aCBwaWN0dXJlcy4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcyAtIChpbikgdHdvIGlucHV0IHBpY3R1cmVzIHRvIGNvbXBhcmUuCisvLyAgIGlzX2xvc3NsZXNzLCBxdWFsaXR5IC0gKGluKSBlbmNvZGluZyBzZXR0aW5ncy4KKy8vICAgeF9vZmZzZXQsIHlfb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0IC0gKGluL291dCkgcmVjdGFuZ2xlIGJldHdlZW4gdGhlIHR3bworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBwaWN0dXJlcy4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IFdlYlBBbmltRW5jb2RlclJlZmluZVJlY3QoCisgICAgY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICBjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzLAorICAgIGludCBpc19sb3NzbGVzcywgZmxvYXQgcXVhbGl0eSwgaW50KiBjb25zdCB4X29mZnNldCwgaW50KiBjb25zdCB5X29mZnNldCwKKyAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX01VWF9BTklNSV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucGMuaW4KQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYndlYnBtdXgKK0Rlc2NyaXB0aW9uOiBMaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgdGhlIFdlYlAgZ3JhcGhpY3MgZm9ybWF0IGNvbnRhaW5lcgorVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK1JlcXVpcmVzOiBsaWJ3ZWJwID49IDAuMi4wCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWx3ZWJwbXV4CitMaWJzLnByaXZhdGU6IC1sbQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnJjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjN2Q1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucmMKQEAgLTAsMCArMSw0MSBAQAorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjaW5jbHVkZSAid2lucmVzLmgiCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiAxLDAsMCwwCisgUFJPRFVDVFZFUlNJT04gMSwwLDAsMAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUsIEluYy4iCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImxpYndlYnBtdXggRExMIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJ3ZWJwbXV4LmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTgiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJ3ZWJwbXV4LmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJXZWJQIEltYWdlIE11eGVyIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGVkaXQuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4ZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMDI3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGVkaXQuYwpAQCAtMCwwICsxLDY1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNldCBhbmQgZGVsZXRlIEFQSXMgZm9yIG11eC4KKy8vCisvLyBBdXRob3JzOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorLy8gICAgICAgICAgVmlrYXMgKHZpa2FzYUBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL211eC9tdXhpLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWZlIG9mIGEgbXV4IG9iamVjdC4KKworc3RhdGljIHZvaWQgTXV4SW5pdChXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgbWVtc2V0KG11eCwgMCwgc2l6ZW9mKCptdXgpKTsKKyAgbXV4LT5jYW52YXNfd2lkdGhfID0gMDsgICAgIC8vIGp1c3QgdG8gYmUgZXhwbGljaXQKKyAgbXV4LT5jYW52YXNfaGVpZ2h0XyA9IDA7Cit9CisKK1dlYlBNdXgqIFdlYlBOZXdJbnRlcm5hbChpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIFdlYlBNdXgqIGNvbnN0IG11eCA9IChXZWJQTXV4KilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoV2ViUE11eCkpOworICAgIGlmIChtdXggIT0gTlVMTCkgTXV4SW5pdChtdXgpOworICAgIHJldHVybiBtdXg7CisgIH0KK30KKworLy8gRGVsZXRlIGFsbCBpbWFnZXMgaW4gJ3dwaV9saXN0Jy4KK3N0YXRpYyB2b2lkIERlbGV0ZUFsbEltYWdlcyhXZWJQTXV4SW1hZ2UqKiBjb25zdCB3cGlfbGlzdCkgeworICB3aGlsZSAoKndwaV9saXN0ICE9IE5VTEwpIHsKKyAgICAqd3BpX2xpc3QgPSBNdXhJbWFnZURlbGV0ZSgqd3BpX2xpc3QpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIE11eFJlbGVhc2UoV2ViUE11eCogY29uc3QgbXV4KSB7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIERlbGV0ZUFsbEltYWdlcygmbXV4LT5pbWFnZXNfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPnZwOHhfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPmljY3BfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPmFuaW1fKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPmV4aWZfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPnhtcF8pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+dW5rbm93bl8pOworfQorCit2b2lkIFdlYlBNdXhEZWxldGUoV2ViUE11eCogbXV4KSB7CisgIGlmIChtdXggIT0gTlVMTCkgeworICAgIE11eFJlbGVhc2UobXV4KTsKKyAgICBXZWJQU2FmZUZyZWUobXV4KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIG1ldGhvZChzKS4KKworLy8gSGFuZHkgTUFDUk8sIG1ha2VzIE11eFNldCgpIHZlcnkgc3ltbWV0cmljIHRvIE11eEdldCgpLgorI2RlZmluZSBTV0lUQ0hfSURfTElTVChJTkRFWCwgTElTVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGlkeCA9PSAoSU5ERVgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyID0gQ2h1bmtBc3NpZ25EYXRhKCZjaHVuaywgZGF0YSwgY29weV9kYXRhLCB0YWcpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVyciA9IENodW5rU2V0TnRoKCZjaHVuaywgKExJU1QpLCBudGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdGF0aWMgV2ViUE11eEVycm9yIE11eFNldChXZWJQTXV4KiBjb25zdCBtdXgsIHVpbnQzMl90IHRhZywgdWludDMyX3QgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEsIGludCBjb3B5X2RhdGEpIHsKKyAgV2ViUENodW5rIGNodW5rOworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfTk9UX0ZPVU5EOworICBjb25zdCBDSFVOS19JTkRFWCBpZHggPSBDaHVua0dldEluZGV4RnJvbVRhZyh0YWcpOworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBhc3NlcnQoIUlzV1BJKGtDaHVua3NbaWR4XS5pZCkpOworCisgIENodW5rSW5pdCgmY2h1bmspOworICBTV0lUQ0hfSURfTElTVChJRFhfVlA4WCwgICAgJm11eC0+dnA4eF8pOworICBTV0lUQ0hfSURfTElTVChJRFhfSUNDUCwgICAgJm11eC0+aWNjcF8pOworICBTV0lUQ0hfSURfTElTVChJRFhfQU5JTSwgICAgJm11eC0+YW5pbV8pOworICBTV0lUQ0hfSURfTElTVChJRFhfRVhJRiwgICAgJm11eC0+ZXhpZl8pOworICBTV0lUQ0hfSURfTElTVChJRFhfWE1QLCAgICAgJm11eC0+eG1wXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9VTktOT1dOLCAmbXV4LT51bmtub3duXyk7CisgIHJldHVybiBlcnI7Cit9CisjdW5kZWYgU1dJVENIX0lEX0xJU1QKKworLy8gQ3JlYXRlIGRhdGEgZm9yIGZyYW1lIGdpdmVuIGltYWdlIGRhdGEsIG9mZnNldHMgYW5kIGR1cmF0aW9uLgorc3RhdGljIFdlYlBNdXhFcnJvciBDcmVhdGVGcmFtZURhdGEoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBpbmZvLAorICAgIFdlYlBEYXRhKiBjb25zdCBmcmFtZSkgeworICB1aW50OF90KiBmcmFtZV9ieXRlczsKKyAgY29uc3Qgc2l6ZV90IGZyYW1lX3NpemUgPSBrQ2h1bmtzW0lEWF9BTk1GXS5zaXplOworCisgIGFzc2VydCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCAmJiBpbmZvLT5kdXJhdGlvbiA+PSAwKTsKKyAgYXNzZXJ0KGluZm8tPmRpc3Bvc2VfbWV0aG9kID09IChpbmZvLT5kaXNwb3NlX21ldGhvZCAmIDEpKTsKKyAgLy8gTm90ZTogYXNzZXJ0aW9uIG9uIHVwcGVyIGJvdW5kcyBpcyBkb25lIGluIFB1dExFMjQoKS4KKworICBmcmFtZV9ieXRlcyA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBmcmFtZV9zaXplKTsKKyAgaWYgKGZyYW1lX2J5dGVzID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisKKyAgUHV0TEUyNChmcmFtZV9ieXRlcyArIDAsIGluZm8tPnhfb2Zmc2V0IC8gMik7CisgIFB1dExFMjQoZnJhbWVfYnl0ZXMgKyAzLCBpbmZvLT55X29mZnNldCAvIDIpOworCisgIFB1dExFMjQoZnJhbWVfYnl0ZXMgKyA2LCB3aWR0aCAtIDEpOworICBQdXRMRTI0KGZyYW1lX2J5dGVzICsgOSwgaGVpZ2h0IC0gMSk7CisgIFB1dExFMjQoZnJhbWVfYnl0ZXMgKyAxMiwgaW5mby0+ZHVyYXRpb24pOworICBmcmFtZV9ieXRlc1sxNV0gPQorICAgICAgKGluZm8tPmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9OT19CTEVORCA/IDIgOiAwKSB8CisgICAgICAoaW5mby0+ZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EID8gMSA6IDApOworCisgIGZyYW1lLT5ieXRlcyA9IGZyYW1lX2J5dGVzOworICBmcmFtZS0+c2l6ZSA9IGZyYW1lX3NpemU7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8gT3V0cHV0cyBpbWFnZSBkYXRhIGdpdmVuIGEgYml0c3RyZWFtLiBUaGUgYml0c3RyZWFtIGNhbiBlaXRoZXIgYmUgYQorLy8gc2luZ2xlLWltYWdlIFdlYlAgZmlsZSBvciByYXcgVlA4L1ZQOEwgZGF0YS4KKy8vIEFsc28gb3V0cHV0cyAnaXNfbG9zc2xlc3MnIHRvIGJlIHRydWUgaWYgdGhlIGdpdmVuIGJpdHN0cmVhbSBpcyBsb3NzbGVzcy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgR2V0SW1hZ2VEYXRhKGNvbnN0IFdlYlBEYXRhKiBjb25zdCBiaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3QgaW1hZ2UsIFdlYlBEYXRhKiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaXNfbG9zc2xlc3MpIHsKKyAgV2ViUERhdGFJbml0KGFscGhhKTsgIC8vIERlZmF1bHQ6IG5vIGFscGhhLgorICBpZiAoYml0c3RyZWFtLT5zaXplIDwgVEFHX1NJWkUgfHwKKyAgICAgIG1lbWNtcChiaXRzdHJlYW0tPmJ5dGVzLCAiUklGRiIsIFRBR19TSVpFKSkgeworICAgIC8vIEl0IGlzIE5PVCB3ZWJwIGZpbGUgZGF0YS4gUmV0dXJuIGlucHV0IGRhdGEgYXMgaXMuCisgICAgKmltYWdlID0gKmJpdHN0cmVhbTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJdCBpcyB3ZWJwIGZpbGUgZGF0YS4gRXh0cmFjdCBpbWFnZSBkYXRhIGZyb20gaXQuCisgICAgY29uc3QgV2ViUE11eEltYWdlKiB3cGk7CisgICAgV2ViUE11eCogY29uc3QgbXV4ID0gV2ViUE11eENyZWF0ZShiaXRzdHJlYW0sIDApOworICAgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICAgIHdwaSA9IG11eC0+aW1hZ2VzXzsKKyAgICBhc3NlcnQod3BpICE9IE5VTEwgJiYgd3BpLT5pbWdfICE9IE5VTEwpOworICAgICppbWFnZSA9IHdwaS0+aW1nXy0+ZGF0YV87CisgICAgaWYgKHdwaS0+YWxwaGFfICE9IE5VTEwpIHsKKyAgICAgICphbHBoYSA9IHdwaS0+YWxwaGFfLT5kYXRhXzsKKyAgICB9CisgICAgV2ViUE11eERlbGV0ZShtdXgpOworICB9CisgICppc19sb3NzbGVzcyA9IFZQOExDaGVja1NpZ25hdHVyZShpbWFnZS0+Ynl0ZXMsIGltYWdlLT5zaXplKTsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitzdGF0aWMgV2ViUE11eEVycm9yIERlbGV0ZUNodW5rcyhXZWJQQ2h1bmsqKiBjaHVua19saXN0LCB1aW50MzJfdCB0YWcpIHsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX05PVF9GT1VORDsKKyAgYXNzZXJ0KGNodW5rX2xpc3QpOworICB3aGlsZSAoKmNodW5rX2xpc3QpIHsKKyAgICBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rID0gKmNodW5rX2xpc3Q7CisgICAgaWYgKGNodW5rLT50YWdfID09IHRhZykgeworICAgICAgKmNodW5rX2xpc3QgPSBDaHVua0RlbGV0ZShjaHVuayk7CisgICAgICBlcnIgPSBXRUJQX01VWF9PSzsKKyAgICB9IGVsc2UgeworICAgICAgY2h1bmtfbGlzdCA9ICZjaHVuay0+bmV4dF87CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4RGVsZXRlQWxsTmFtZWREYXRhKFdlYlBNdXgqIGNvbnN0IG11eCwgdWludDMyX3QgdGFnKSB7CisgIGNvbnN0IFdlYlBDaHVua0lkIGlkID0gQ2h1bmtHZXRJZEZyb21UYWcodGFnKTsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgaWYgKElzV1BJKGlkKSkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIHJldHVybiBEZWxldGVDaHVua3MoTXV4R2V0Q2h1bmtMaXN0RnJvbUlkKG11eCwgaWQpLCB0YWcpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2V0IEFQSShzKS4KKworV2ViUE11eEVycm9yIFdlYlBNdXhTZXRDaHVuayhXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGF0YSogY2h1bmtfZGF0YSwgaW50IGNvcHlfZGF0YSkgeworICB1aW50MzJfdCB0YWc7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIGlmIChtdXggPT0gTlVMTCB8fCBmb3VyY2MgPT0gTlVMTCB8fCBjaHVua19kYXRhID09IE5VTEwgfHwKKyAgICAgIGNodW5rX2RhdGEtPmJ5dGVzID09IE5VTEwgfHwgY2h1bmtfZGF0YS0+c2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgdGFnID0gQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGZvdXJjYyk7CisKKyAgLy8gRGVsZXRlIGV4aXN0aW5nIGNodW5rKHMpIHdpdGggdGhlIHNhbWUgJ2ZvdXJjYycuCisgIGVyciA9IE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIHRhZyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0sgJiYgZXJyICE9IFdFQlBfTVVYX05PVF9GT1VORCkgcmV0dXJuIGVycjsKKworICAvLyBBZGQgdGhlIGdpdmVuIGNodW5rLgorICByZXR1cm4gTXV4U2V0KG11eCwgdGFnLCAxLCBjaHVua19kYXRhLCBjb3B5X2RhdGEpOworfQorCisvLyBDcmVhdGVzIGEgY2h1bmsgZnJvbSBnaXZlbiAnZGF0YScgYW5kIHNldHMgaXQgYXMgMXN0IGNodW5rIGluICdjaHVua19saXN0Jy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgQWRkRGF0YVRvQ2h1bmtMaXN0KAorICAgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhLCBpbnQgY29weV9kYXRhLCB1aW50MzJfdCB0YWcsCisgICAgV2ViUENodW5rKiogY2h1bmtfbGlzdCkgeworICBXZWJQQ2h1bmsgY2h1bms7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIENodW5rSW5pdCgmY2h1bmspOworICBlcnIgPSBDaHVua0Fzc2lnbkRhdGEoJmNodW5rLCBkYXRhLCBjb3B5X2RhdGEsIHRhZyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICBlcnIgPSBDaHVua1NldE50aCgmY2h1bmssIGNodW5rX2xpc3QsIDEpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworIEVycjoKKyAgQ2h1bmtSZWxlYXNlKCZjaHVuayk7CisgIHJldHVybiBlcnI7Cit9CisKKy8vIEV4dHJhY3RzIGltYWdlICYgYWxwaGEgZGF0YSBmcm9tIHRoZSBnaXZlbiBiaXRzdHJlYW0gYW5kIHRoZW4gc2V0cyB3cGkuYWxwaGFfCisvLyBhbmQgd3BpLmltZ18gYXBwcm9wcmlhdGVseS4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgU2V0QWxwaGFBbmRJbWFnZUNodW5rcygKKyAgICBjb25zdCBXZWJQRGF0YSogY29uc3QgYml0c3RyZWFtLCBpbnQgY29weV9kYXRhLCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBpbnQgaXNfbG9zc2xlc3MgPSAwOworICBXZWJQRGF0YSBpbWFnZSwgYWxwaGE7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBHZXRJbWFnZURhdGEoYml0c3RyZWFtLCAmaW1hZ2UsICZhbHBoYSwgJmlzX2xvc3NsZXNzKTsKKyAgY29uc3QgaW50IGltYWdlX3RhZyA9CisgICAgICBpc19sb3NzbGVzcyA/IGtDaHVua3NbSURYX1ZQOExdLnRhZyA6IGtDaHVua3NbSURYX1ZQOF0udGFnOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAoYWxwaGEuYnl0ZXMgIT0gTlVMTCkgeworICAgIGVyciA9IEFkZERhdGFUb0NodW5rTGlzdCgmYWxwaGEsIGNvcHlfZGF0YSwga0NodW5rc1tJRFhfQUxQSEFdLnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndwaS0+YWxwaGFfKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICB9CisgIGVyciA9IEFkZERhdGFUb0NodW5rTGlzdCgmaW1hZ2UsIGNvcHlfZGF0YSwgaW1hZ2VfdGFnLCAmd3BpLT5pbWdfKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgcmV0dXJuIE11eEltYWdlRmluYWxpemUod3BpKSA/IFdFQlBfTVVYX09LIDogV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhTZXRJbWFnZShXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBEYXRhKiBiaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKKyAgV2ViUE11eEltYWdlIHdwaTsKKyAgV2ViUE11eEVycm9yIGVycjsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAobXV4ID09IE5VTEwgfHwgYml0c3RyZWFtID09IE5VTEwgfHwgYml0c3RyZWFtLT5ieXRlcyA9PSBOVUxMIHx8CisgICAgICBiaXRzdHJlYW0tPnNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgaWYgKG11eC0+aW1hZ2VzXyAhPSBOVUxMKSB7CisgICAgLy8gT25seSBvbmUgJ3NpbXBsZSBpbWFnZScgY2FuIGJlIGFkZGVkIGluIG11eC4gU28sIHJlbW92ZSBwcmVzZW50IGltYWdlcy4KKyAgICBEZWxldGVBbGxJbWFnZXMoJm11eC0+aW1hZ2VzXyk7CisgIH0KKworICBNdXhJbWFnZUluaXQoJndwaSk7CisgIGVyciA9IFNldEFscGhhQW5kSW1hZ2VDaHVua3MoYml0c3RyZWFtLCBjb3B5X2RhdGEsICZ3cGkpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICAvLyBBZGQgdGhpcyBXZWJQTXV4SW1hZ2UgdG8gbXV4LgorICBlcnIgPSBNdXhJbWFnZVB1c2goJndwaSwgJm11eC0+aW1hZ2VzXyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIC8vIEFsbCBpcyB3ZWxsLgorICByZXR1cm4gV0VCUF9NVVhfT0s7CisKKyBFcnI6ICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICBNdXhJbWFnZVJlbGVhc2UoJndwaSk7CisgIHJldHVybiBlcnI7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4UHVzaEZyYW1lKFdlYlBNdXgqIG11eCwgY29uc3QgV2ViUE11eEZyYW1lSW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKKyAgV2ViUE11eEltYWdlIHdwaTsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGJpdHN0cmVhbSA9ICZpbmZvLT5iaXRzdHJlYW07CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKG11eCA9PSBOVUxMIHx8IGluZm8gPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgaWYgKGluZm8tPmlkICE9IFdFQlBfQ0hVTktfQU5NRikgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgaWYgKGJpdHN0cmVhbS0+Ynl0ZXMgPT0gTlVMTCB8fCBiaXRzdHJlYW0tPnNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgaWYgKG11eC0+aW1hZ2VzXyAhPSBOVUxMKSB7CisgICAgY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCBpbWFnZSA9IG11eC0+aW1hZ2VzXzsKKyAgICBjb25zdCB1aW50MzJfdCBpbWFnZV9pZCA9IChpbWFnZS0+aGVhZGVyXyAhPSBOVUxMKSA/CisgICAgICAgIENodW5rR2V0SWRGcm9tVGFnKGltYWdlLT5oZWFkZXJfLT50YWdfKSA6IFdFQlBfQ0hVTktfSU1BR0U7CisgICAgaWYgKGltYWdlX2lkICE9IGluZm8tPmlkKSB7CisgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsgIC8vIENvbmZsaWN0aW5nIGZyYW1lIHR5cGVzLgorICAgIH0KKyAgfQorCisgIE11eEltYWdlSW5pdCgmd3BpKTsKKyAgZXJyID0gU2V0QWxwaGFBbmRJbWFnZUNodW5rcyhiaXRzdHJlYW0sIGNvcHlfZGF0YSwgJndwaSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICBhc3NlcnQod3BpLmltZ18gIT0gTlVMTCk7ICAvLyBBcyBTZXRBbHBoYUFuZEltYWdlQ2h1bmtzKCkgd2FzIHN1Y2Nlc3NmdWwuCisKKyAgeworICAgIFdlYlBEYXRhIGZyYW1lOworICAgIGNvbnN0IHVpbnQzMl90IHRhZyA9IGtDaHVua3NbSURYX0FOTUZdLnRhZzsKKyAgICBXZWJQTXV4RnJhbWVJbmZvIHRtcCA9ICppbmZvOworICAgIHRtcC54X29mZnNldCAmPSB+MTsgIC8vIFNuYXAgb2Zmc2V0cyB0byBldmVuLgorICAgIHRtcC55X29mZnNldCAmPSB+MTsKKyAgICBpZiAodG1wLnhfb2Zmc2V0IDwgMCB8fCB0bXAueF9vZmZzZXQgPj0gTUFYX1BPU0lUSU9OX09GRlNFVCB8fAorICAgICAgICB0bXAueV9vZmZzZXQgPCAwIHx8IHRtcC55X29mZnNldCA+PSBNQVhfUE9TSVRJT05fT0ZGU0VUIHx8CisgICAgICAgICh0bXAuZHVyYXRpb24gPCAwIHx8IHRtcC5kdXJhdGlvbiA+PSBNQVhfRFVSQVRJT04pIHx8CisgICAgICAgIHRtcC5kaXNwb3NlX21ldGhvZCAhPSAodG1wLmRpc3Bvc2VfbWV0aG9kICYgMSkpIHsKKyAgICAgIGVyciA9IFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICBnb3RvIEVycjsKKyAgICB9CisgICAgZXJyID0gQ3JlYXRlRnJhbWVEYXRhKHdwaS53aWR0aF8sIHdwaS5oZWlnaHRfLCAmdG1wLCAmZnJhbWUpOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICAgIC8vIEFkZCBmcmFtZSBjaHVuayAod2l0aCBjb3B5X2RhdGEgPSAxKS4KKyAgICBlcnIgPSBBZGREYXRhVG9DaHVua0xpc3QoJmZyYW1lLCAxLCB0YWcsICZ3cGkuaGVhZGVyXyk7CisgICAgV2ViUERhdGFDbGVhcigmZnJhbWUpOyAgLy8gZnJhbWUgb3duZWQgYnkgd3BpLmhlYWRlcl8gbm93LgorICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICB9CisKKyAgLy8gQWRkIHRoaXMgV2ViUE11eEltYWdlIHRvIG11eC4KKyAgZXJyID0gTXV4SW1hZ2VQdXNoKCZ3cGksICZtdXgtPmltYWdlc18pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICAvLyBBbGwgaXMgd2VsbC4KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworCisgRXJyOiAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKyAgTXV4SW1hZ2VSZWxlYXNlKCZ3cGkpOworICByZXR1cm4gZXJyOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKSB7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIHVpbnQ4X3QgZGF0YVtBTklNX0NIVU5LX1NJWkVdOworICBjb25zdCBXZWJQRGF0YSBhbmltID0geyBkYXRhLCBBTklNX0NIVU5LX1NJWkUgfTsKKworICBpZiAobXV4ID09IE5VTEwgfHwgcGFyYW1zID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICBpZiAocGFyYW1zLT5sb29wX2NvdW50IDwgMCB8fCBwYXJhbXMtPmxvb3BfY291bnQgPj0gTUFYX0xPT1BfQ09VTlQpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8vIERlbGV0ZSBhbnkgZXhpc3RpbmcgQU5JTSBjaHVuayhzKS4KKyAgZXJyID0gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwga0NodW5rc1tJRFhfQU5JTV0udGFnKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSyAmJiBlcnIgIT0gV0VCUF9NVVhfTk9UX0ZPVU5EKSByZXR1cm4gZXJyOworCisgIC8vIFNldCB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMuCisgIFB1dExFMzIoZGF0YSwgcGFyYW1zLT5iZ2NvbG9yKTsKKyAgUHV0TEUxNihkYXRhICsgNCwgcGFyYW1zLT5sb29wX2NvdW50KTsKKyAgcmV0dXJuIE11eFNldChtdXgsIGtDaHVua3NbSURYX0FOSU1dLnRhZywgMSwgJmFuaW0sIDEpOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eFNldENhbnZhc1NpemUoV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBXZWJQTXV4RXJyb3IgZXJyOworICBpZiAobXV4ID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBpZiAod2lkdGggPCAwIHx8IGhlaWdodCA8IDAgfHwKKyAgICAgIHdpZHRoID4gTUFYX0NBTlZBU19TSVpFIHx8IGhlaWdodCA+IE1BWF9DQU5WQVNfU0laRSkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmICh3aWR0aCAqICh1aW50NjRfdCloZWlnaHQgPj0gTUFYX0lNQUdFX0FSRUEpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBpZiAoKHdpZHRoICogaGVpZ2h0KSA9PSAwICYmICh3aWR0aCB8IGhlaWdodCkgIT0gMCkgeworICAgIC8vIG9uZSBvZiB3aWR0aCAvIGhlaWdodCBpcyB6ZXJvLCBidXQgbm90IGJvdGggLT4gaW52YWxpZCEKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICAvLyBJZiB3ZSBhbHJlYWR5IGFzc2VtYmxlZCBhIFZQOFggY2h1bmssIGludmFsaWRhdGUgaXQuCisgIGVyciA9IE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIGtDaHVua3NbSURYX1ZQOFhdLnRhZyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0sgJiYgZXJyICE9IFdFQlBfTVVYX05PVF9GT1VORCkgcmV0dXJuIGVycjsKKworICBtdXgtPmNhbnZhc193aWR0aF8gPSB3aWR0aDsKKyAgbXV4LT5jYW52YXNfaGVpZ2h0XyA9IGhlaWdodDsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVsZXRlIEFQSShzKS4KKworV2ViUE11eEVycm9yIFdlYlBNdXhEZWxldGVDaHVuayhXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7CisgIGlmIChtdXggPT0gTlVMTCB8fCBmb3VyY2MgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIHJldHVybiBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoZm91cmNjKSk7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4RGVsZXRlRnJhbWUoV2ViUE11eCogbXV4LCB1aW50MzJfdCBudGgpIHsKKyAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgcmV0dXJuIE11eEltYWdlRGVsZXRlTnRoKCZtdXgtPmltYWdlc18sIG50aCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBc3NlbWJseSBvZiB0aGUgV2ViUCBSSUZGIGZpbGUuCisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgR2V0RnJhbWVJbmZvKAorICAgIGNvbnN0IFdlYlBDaHVuayogY29uc3QgZnJhbWVfY2h1bmssCisgICAgaW50KiBjb25zdCB4X29mZnNldCwgaW50KiBjb25zdCB5X29mZnNldCwgaW50KiBjb25zdCBkdXJhdGlvbikgeworICBjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSA9ICZmcmFtZV9jaHVuay0+ZGF0YV87CisgIGNvbnN0IHNpemVfdCBleHBlY3RlZF9kYXRhX3NpemUgPSBBTk1GX0NIVU5LX1NJWkU7CisgIGFzc2VydChmcmFtZV9jaHVuay0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpOworICBhc3NlcnQoZnJhbWVfY2h1bmsgIT0gTlVMTCk7CisgIGlmIChkYXRhLT5zaXplICE9IGV4cGVjdGVkX2RhdGFfc2l6ZSkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgKnhfb2Zmc2V0ID0gMiAqIEdldExFMjQoZGF0YS0+Ynl0ZXMgKyAwKTsKKyAgKnlfb2Zmc2V0ID0gMiAqIEdldExFMjQoZGF0YS0+Ynl0ZXMgKyAzKTsKKyAgKmR1cmF0aW9uID0gR2V0TEUyNChkYXRhLT5ieXRlcyArIDEyKTsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitzdGF0aWMgV2ViUE11eEVycm9yIEdldEltYWdlSW5mbyhjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgeF9vZmZzZXQsIGludCogY29uc3QgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpIHsKKyAgY29uc3QgV2ViUENodW5rKiBjb25zdCBmcmFtZV9jaHVuayA9IHdwaS0+aGVhZGVyXzsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgYXNzZXJ0KHdwaSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGZyYW1lX2NodW5rICE9IE5VTEwpOworCisgIC8vIEdldCBvZmZzZXRzIGFuZCBkdXJhdGlvbiBmcm9tIEFOTUYgY2h1bmsuCisgIGVyciA9IEdldEZyYW1lSW5mbyhmcmFtZV9jaHVuaywgeF9vZmZzZXQsIHlfb2Zmc2V0LCBkdXJhdGlvbik7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gR2V0IHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBWUDgvVlA4TCBjaHVuay4KKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHdwaS0+d2lkdGhfOworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSB3cGktPmhlaWdodF87CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8gUmV0dXJucyB0aGUgdGlnaHRlc3QgZGltZW5zaW9uIGZvciB0aGUgY2FudmFzIGNvbnNpZGVyaW5nIHRoZSBpbWFnZSBsaXN0Lgorc3RhdGljIFdlYlBNdXhFcnJvciBHZXRBZGp1c3RlZENhbnZhc1NpemUoY29uc3QgV2ViUE11eCogY29uc3QgbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpIHsKKyAgV2ViUE11eEltYWdlKiB3cGkgPSBOVUxMOworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBhc3NlcnQod2lkdGggIT0gTlVMTCAmJiBoZWlnaHQgIT0gTlVMTCk7CisKKyAgd3BpID0gbXV4LT5pbWFnZXNfOworICBhc3NlcnQod3BpICE9IE5VTEwpOworICBhc3NlcnQod3BpLT5pbWdfICE9IE5VTEwpOworCisgIGlmICh3cGktPm5leHRfICE9IE5VTEwpIHsKKyAgICBpbnQgbWF4X3ggPSAwLCBtYXhfeSA9IDA7CisgICAgLy8gaWYgd2UgaGF2ZSBhIGNoYWluIG9mIHdwaSdzLCBoZWFkZXJfIGlzIG5lY2Vzc2FyaWx5IHNldAorICAgIGFzc2VydCh3cGktPmhlYWRlcl8gIT0gTlVMTCk7CisgICAgLy8gQWdncmVnYXRlIHRoZSBib3VuZGluZyBib3ggZm9yIGFuaW1hdGlvbiBmcmFtZXMuCisgICAgZm9yICg7IHdwaSAhPSBOVUxMOyB3cGkgPSB3cGktPm5leHRfKSB7CisgICAgICBpbnQgeF9vZmZzZXQgPSAwLCB5X29mZnNldCA9IDAsIGR1cmF0aW9uID0gMCwgdyA9IDAsIGggPSAwOworICAgICAgY29uc3QgV2ViUE11eEVycm9yIGVyciA9IEdldEltYWdlSW5mbyh3cGksICZ4X29mZnNldCwgJnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sICZ3LCAmaCk7CisgICAgICBjb25zdCBpbnQgbWF4X3hfcG9zID0geF9vZmZzZXQgKyB3OworICAgICAgY29uc3QgaW50IG1heF95X3BvcyA9IHlfb2Zmc2V0ICsgaDsKKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgICAgICBhc3NlcnQoeF9vZmZzZXQgPCBNQVhfUE9TSVRJT05fT0ZGU0VUKTsKKyAgICAgIGFzc2VydCh5X29mZnNldCA8IE1BWF9QT1NJVElPTl9PRkZTRVQpOworCisgICAgICBpZiAobWF4X3hfcG9zID4gbWF4X3gpIG1heF94ID0gbWF4X3hfcG9zOworICAgICAgaWYgKG1heF95X3BvcyA+IG1heF95KSBtYXhfeSA9IG1heF95X3BvczsKKyAgICB9CisgICAgKndpZHRoID0gbWF4X3g7CisgICAgKmhlaWdodCA9IG1heF95OworICB9IGVsc2UgeworICAgIC8vIEZvciBhIHNpbmdsZSBpbWFnZSwgY2FudmFzIGRpbWVuc2lvbnMgYXJlIHNhbWUgYXMgaW1hZ2UgZGltZW5zaW9ucy4KKyAgICAqd2lkdGggPSB3cGktPndpZHRoXzsKKyAgICAqaGVpZ2h0ID0gd3BpLT5oZWlnaHRfOworICB9CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8gVlA4WCBmb3JtYXQ6CisvLyBUb3RhbCBTaXplIDogMTAsCisvLyBGbGFncyAgOiA0IGJ5dGVzLAorLy8gV2lkdGggIDogMyBieXRlcywKKy8vIEhlaWdodCA6IDMgYnl0ZXMuCitzdGF0aWMgV2ViUE11eEVycm9yIENyZWF0ZVZQOFhDaHVuayhXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX09LOworICB1aW50MzJfdCBmbGFncyA9IDA7CisgIGludCB3aWR0aCA9IDA7CisgIGludCBoZWlnaHQgPSAwOworICB1aW50OF90IGRhdGFbVlA4WF9DSFVOS19TSVpFXTsKKyAgY29uc3QgV2ViUERhdGEgdnA4eCA9IHsgZGF0YSwgVlA4WF9DSFVOS19TSVpFIH07CisgIGNvbnN0IFdlYlBNdXhJbWFnZSogaW1hZ2VzID0gTlVMTDsKKworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBpbWFnZXMgPSBtdXgtPmltYWdlc187ICAvLyBGaXJzdCBpbWFnZS4KKyAgaWYgKGltYWdlcyA9PSBOVUxMIHx8IGltYWdlcy0+aW1nXyA9PSBOVUxMIHx8CisgICAgICBpbWFnZXMtPmltZ18tPmRhdGFfLmJ5dGVzID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8vIElmIFZQOFggY2h1bmsocykgaXMoYXJlKSBhbHJlYWR5IHByZXNlbnQsIHJlbW92ZSB0aGVtIChhbmQgbGF0ZXIgYWRkIG5ldworICAvLyBWUDhYIGNodW5rIHdpdGggdXBkYXRlZCBmbGFncykuCisgIGVyciA9IE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIGtDaHVua3NbSURYX1ZQOFhdLnRhZyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0sgJiYgZXJyICE9IFdFQlBfTVVYX05PVF9GT1VORCkgcmV0dXJuIGVycjsKKworICAvLyBTZXQgZmxhZ3MuCisgIGlmIChtdXgtPmljY3BfICE9IE5VTEwgJiYgbXV4LT5pY2NwXy0+ZGF0YV8uYnl0ZXMgIT0gTlVMTCkgeworICAgIGZsYWdzIHw9IElDQ1BfRkxBRzsKKyAgfQorICBpZiAobXV4LT5leGlmXyAhPSBOVUxMICYmIG11eC0+ZXhpZl8tPmRhdGFfLmJ5dGVzICE9IE5VTEwpIHsKKyAgICBmbGFncyB8PSBFWElGX0ZMQUc7CisgIH0KKyAgaWYgKG11eC0+eG1wXyAhPSBOVUxMICYmIG11eC0+eG1wXy0+ZGF0YV8uYnl0ZXMgIT0gTlVMTCkgeworICAgIGZsYWdzIHw9IFhNUF9GTEFHOworICB9CisgIGlmIChpbWFnZXMtPmhlYWRlcl8gIT0gTlVMTCkgeworICAgIGlmIChpbWFnZXMtPmhlYWRlcl8tPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKSB7CisgICAgICAvLyBUaGlzIGlzIGFuIGltYWdlIHdpdGggYW5pbWF0aW9uLgorICAgICAgZmxhZ3MgfD0gQU5JTUFUSU9OX0ZMQUc7CisgICAgfQorICB9CisgIGlmIChNdXhJbWFnZUNvdW50KGltYWdlcywgV0VCUF9DSFVOS19BTFBIQSkgPiAwKSB7CisgICAgZmxhZ3MgfD0gQUxQSEFfRkxBRzsgIC8vIFNvbWUgaW1hZ2VzIGhhdmUgYW4gYWxwaGEgY2hhbm5lbC4KKyAgfQorCisgIGVyciA9IEdldEFkanVzdGVkQ2FudmFzU2l6ZShtdXgsICZ3aWR0aCwgJmhlaWdodCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBpZiAod2lkdGggPiBNQVhfQ0FOVkFTX1NJWkUgfHwgaGVpZ2h0ID4gTUFYX0NBTlZBU19TSVpFKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpZiAobXV4LT5jYW52YXNfd2lkdGhfICE9IDAgfHwgbXV4LT5jYW52YXNfaGVpZ2h0XyAhPSAwKSB7CisgICAgaWYgKHdpZHRoID4gbXV4LT5jYW52YXNfd2lkdGhfIHx8IGhlaWdodCA+IG11eC0+Y2FudmFzX2hlaWdodF8pIHsKKyAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgIH0KKyAgICB3aWR0aCA9IG11eC0+Y2FudmFzX3dpZHRoXzsKKyAgICBoZWlnaHQgPSBtdXgtPmNhbnZhc19oZWlnaHRfOworICB9CisKKyAgaWYgKGZsYWdzID09IDAgJiYgbXV4LT51bmtub3duXyA9PSBOVUxMKSB7CisgICAgLy8gRm9yIHNpbXBsZSBmaWxlIGZvcm1hdCwgVlA4WCBjaHVuayBzaG91bGQgbm90IGJlIGFkZGVkLgorICAgIHJldHVybiBXRUJQX01VWF9PSzsKKyAgfQorCisgIGlmIChNdXhIYXNBbHBoYShpbWFnZXMpKSB7CisgICAgLy8gVGhpcyBtZWFucyBzb21lIGZyYW1lcyBleHBsaWNpdGx5L2ltcGxpY2l0bHkgY29udGFpbiBhbHBoYS4KKyAgICAvLyBOb3RlOiBUaGlzICdmbGFncycgdXBkYXRlIG11c3QgTk9UIGJlIGRvbmUgZm9yIGEgbG9zc2xlc3MgaW1hZ2UKKyAgICAvLyB3aXRob3V0IGEgVlA4WCBjaHVuayEKKyAgICBmbGFncyB8PSBBTFBIQV9GTEFHOworICB9CisKKyAgUHV0TEUzMihkYXRhICsgMCwgZmxhZ3MpOyAgIC8vIFZQOFggY2h1bmsgZmxhZ3MuCisgIFB1dExFMjQoZGF0YSArIDQsIHdpZHRoIC0gMSk7ICAgLy8gY2FudmFzIHdpZHRoLgorICBQdXRMRTI0KGRhdGEgKyA3LCBoZWlnaHQgLSAxKTsgIC8vIGNhbnZhcyBoZWlnaHQuCisKKyAgcmV0dXJuIE11eFNldChtdXgsIGtDaHVua3NbSURYX1ZQOFhdLnRhZywgMSwgJnZwOHgsIDEpOworfQorCisvLyBDbGVhbnMgdXAgJ211eCcgYnkgcmVtb3ZpbmcgYW55IHVubmVjZXNzYXJ5IGNodW5rcy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4Q2xlYW51cChXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgaW50IG51bV9mcmFtZXM7CisgIGludCBudW1fYW5pbV9jaHVua3M7CisKKyAgLy8gSWYgd2UgaGF2ZSBhbiBpbWFnZSB3aXRoIGEgc2luZ2xlIGZyYW1lLCBhbmQgaXRzIHJlY3RhbmdsZQorICAvLyBjb3ZlcnMgdGhlIHdob2xlIGNhbnZhcywgY29udmVydCBpdCB0byBhIG5vbi1hbmltYXRlZCBpbWFnZQorICAvLyAodG8gYXZvaWQgd3JpdGluZyBBTk1GIGNodW5rIHVubmVjZXNzYXJpbHkpLgorICBXZWJQTXV4RXJyb3IgZXJyID0gV2ViUE11eE51bUNodW5rcyhtdXgsIGtDaHVua3NbSURYX0FOTUZdLmlkLCAmbnVtX2ZyYW1lcyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChudW1fZnJhbWVzID09IDEpIHsKKyAgICBXZWJQTXV4SW1hZ2UqIGZyYW1lID0gTlVMTDsKKyAgICBlcnIgPSBNdXhJbWFnZUdldE50aCgoY29uc3QgV2ViUE11eEltYWdlKiopJm11eC0+aW1hZ2VzXywgMSwgJmZyYW1lKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsgIC8vIFdlIGtub3cgdGhhdCBvbmUgZnJhbWUgZG9lcyBleGlzdC4KKyAgICBhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisgICAgaWYgKGZyYW1lLT5oZWFkZXJfICE9IE5VTEwgJiYKKyAgICAgICAgKChtdXgtPmNhbnZhc193aWR0aF8gPT0gMCAmJiBtdXgtPmNhbnZhc19oZWlnaHRfID09IDApIHx8CisgICAgICAgICAoZnJhbWUtPndpZHRoXyA9PSBtdXgtPmNhbnZhc193aWR0aF8gJiYKKyAgICAgICAgICBmcmFtZS0+aGVpZ2h0XyA9PSBtdXgtPmNhbnZhc19oZWlnaHRfKSkpIHsKKyAgICAgIGFzc2VydChmcmFtZS0+aGVhZGVyXy0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpOworICAgICAgQ2h1bmtEZWxldGUoZnJhbWUtPmhlYWRlcl8pOyAgLy8gUmVtb3ZlcyBBTk1GIGNodW5rLgorICAgICAgZnJhbWUtPmhlYWRlcl8gPSBOVUxMOworICAgICAgbnVtX2ZyYW1lcyA9IDA7CisgICAgfQorICB9CisgIC8vIFJlbW92ZSBBTklNIGNodW5rIGlmIHRoaXMgaXMgYSBub24tYW5pbWF0ZWQgaW1hZ2UuCisgIGVyciA9IFdlYlBNdXhOdW1DaHVua3MobXV4LCBrQ2h1bmtzW0lEWF9BTklNXS5pZCwgJm51bV9hbmltX2NodW5rcyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChudW1fYW5pbV9jaHVua3MgPj0gMSAmJiBudW1fZnJhbWVzID09IDApIHsKKyAgICBlcnIgPSBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCBrQ2h1bmtzW0lEWF9BTklNXS50YWcpOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLyBUb3RhbCBzaXplIG9mIGEgbGlzdCBvZiBpbWFnZXMuCitzdGF0aWMgc2l6ZV90IEltYWdlTGlzdERpc2tTaXplKGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpX2xpc3QpIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICB3aGlsZSAod3BpX2xpc3QgIT0gTlVMTCkgeworICAgIHNpemUgKz0gTXV4SW1hZ2VEaXNrU2l6ZSh3cGlfbGlzdCk7CisgICAgd3BpX2xpc3QgPSB3cGlfbGlzdC0+bmV4dF87CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIFdyaXRlIG91dCB0aGUgZ2l2ZW4gbGlzdCBvZiBpbWFnZXMgaW50byAnZHN0Jy4KK3N0YXRpYyB1aW50OF90KiBJbWFnZUxpc3RFbWl0KGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpX2xpc3QsIHVpbnQ4X3QqIGRzdCkgeworICB3aGlsZSAod3BpX2xpc3QgIT0gTlVMTCkgeworICAgIGRzdCA9IE11eEltYWdlRW1pdCh3cGlfbGlzdCwgZHN0KTsKKyAgICB3cGlfbGlzdCA9IHdwaV9saXN0LT5uZXh0XzsKKyAgfQorICByZXR1cm4gZHN0OworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEFzc2VtYmxlKFdlYlBNdXgqIG11eCwgV2ViUERhdGEqIGFzc2VtYmxlZF9kYXRhKSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHVpbnQ4X3QqIGRzdCA9IE5VTEw7CisgIFdlYlBNdXhFcnJvciBlcnI7CisKKyAgaWYgKGFzc2VtYmxlZF9kYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICAvLyBDbGVhbiB1cCByZXR1cm5lZCBkYXRhLCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICBtZW1zZXQoYXNzZW1ibGVkX2RhdGEsIDAsIHNpemVvZigqYXNzZW1ibGVkX2RhdGEpKTsKKworICBpZiAobXV4ID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8vIEZpbmFsaXplIG11eC4KKyAgZXJyID0gTXV4Q2xlYW51cChtdXgpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBlcnIgPSBDcmVhdGVWUDhYQ2h1bmsobXV4KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBBbGxvY2F0ZSBkYXRhLgorICBzaXplID0gQ2h1bmtMaXN0RGlza1NpemUobXV4LT52cDh4XykgKyBDaHVua0xpc3REaXNrU2l6ZShtdXgtPmljY3BfKQorICAgICAgICsgQ2h1bmtMaXN0RGlza1NpemUobXV4LT5hbmltXykgKyBJbWFnZUxpc3REaXNrU2l6ZShtdXgtPmltYWdlc18pCisgICAgICAgKyBDaHVua0xpc3REaXNrU2l6ZShtdXgtPmV4aWZfKSArIENodW5rTGlzdERpc2tTaXplKG11eC0+eG1wXykKKyAgICAgICArIENodW5rTGlzdERpc2tTaXplKG11eC0+dW5rbm93bl8pICsgUklGRl9IRUFERVJfU0laRTsKKworICBkYXRhID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemUpOworICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworCisgIC8vIEVtaXQgaGVhZGVyICYgY2h1bmtzLgorICBkc3QgPSBNdXhFbWl0UmlmZkhlYWRlcihkYXRhLCBzaXplKTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPnZwOHhfLCBkc3QpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+aWNjcF8sIGRzdCk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT5hbmltXywgZHN0KTsKKyAgZHN0ID0gSW1hZ2VMaXN0RW1pdChtdXgtPmltYWdlc18sIGRzdCk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT5leGlmXywgZHN0KTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPnhtcF8sIGRzdCk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT51bmtub3duXywgZHN0KTsKKyAgYXNzZXJ0KGRzdCA9PSBkYXRhICsgc2l6ZSk7CisKKyAgLy8gVmFsaWRhdGUgbXV4LgorICBlcnIgPSBNdXhWYWxpZGF0ZShtdXgpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgV2ViUFNhZmVGcmVlKGRhdGEpOworICAgIGRhdGEgPSBOVUxMOworICAgIHNpemUgPSAwOworICB9CisKKyAgLy8gRmluYWxpemUgZGF0YS4KKyAgYXNzZW1ibGVkX2RhdGEtPmJ5dGVzID0gZGF0YTsKKyAgYXNzZW1ibGVkX2RhdGEtPnNpemUgPSBzaXplOworCisgIHJldHVybiBlcnI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGkuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTFlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGkuaApAQCAtMCwwICsxLDIzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEludGVybmFsIGhlYWRlciBmb3IgbXV4IGxpYnJhcnkuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfTVVYX01VWElfSF8KKyNkZWZpbmUgV0VCUF9NVVhfTVVYSV9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvbXV4LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluZXMgYW5kIGNvbnN0YW50cy4KKworI2RlZmluZSBNVVhfTUFKX1ZFUlNJT04gMQorI2RlZmluZSBNVVhfTUlOX1ZFUlNJT04gMAorI2RlZmluZSBNVVhfUkVWX1ZFUlNJT04gMAorCisvLyBDaHVuayBvYmplY3QuCit0eXBlZGVmIHN0cnVjdCBXZWJQQ2h1bmsgV2ViUENodW5rOworc3RydWN0IFdlYlBDaHVuayB7CisgIHVpbnQzMl90ICAgICAgICB0YWdfOworICBpbnQgICAgICAgICAgICAgb3duZXJfOyAgLy8gVHJ1ZSBpZiAqZGF0YV8gbWVtb3J5IGlzIG93bmVkIGludGVybmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWUDhYLCBBTklNLCBhbmQgb3RoZXIgaW50ZXJuYWxseSBjcmVhdGVkIGNodW5rcworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBBTk1GIGFyZSBhbHdheXMgb3duZWQuCisgIFdlYlBEYXRhICAgICAgICBkYXRhXzsKKyAgV2ViUENodW5rKiAgICAgIG5leHRfOworfTsKKworLy8gTXV4SW1hZ2Ugb2JqZWN0LiBTdG9yZSBhIGZ1bGwgV2ViUCBpbWFnZSAoaW5jbHVkaW5nIEFOTUYgY2h1bmssIEFMUEgKKy8vIGNodW5rIGFuZCBWUDgvVlA4TCBjaHVuayksCit0eXBlZGVmIHN0cnVjdCBXZWJQTXV4SW1hZ2UgV2ViUE11eEltYWdlOworc3RydWN0IFdlYlBNdXhJbWFnZSB7CisgIFdlYlBDaHVuayogIGhlYWRlcl87ICAgICAgLy8gQ29ycmVzcG9uZHMgdG8gV0VCUF9DSFVOS19BTk1GLgorICBXZWJQQ2h1bmsqICBhbHBoYV87ICAgICAgIC8vIENvcnJlc3BvbmRzIHRvIFdFQlBfQ0hVTktfQUxQSEEuCisgIFdlYlBDaHVuayogIGltZ187ICAgICAgICAgLy8gQ29ycmVzcG9uZHMgdG8gV0VCUF9DSFVOS19JTUFHRS4KKyAgV2ViUENodW5rKiAgdW5rbm93bl87ICAgICAvLyBDb3JyZXNwb25kcyB0byBXRUJQX0NIVU5LX1VOS05PV04uCisgIGludCAgICAgICAgIHdpZHRoXzsKKyAgaW50ICAgICAgICAgaGVpZ2h0XzsKKyAgaW50ICAgICAgICAgaGFzX2FscGhhXzsgICAvLyBUaHJvdWdoIEFMUEggY2h1bmsgb3IgYXMgcGFydCBvZiBWUDhMLgorICBpbnQgICAgICAgICBpc19wYXJ0aWFsXzsgIC8vIFRydWUgaWYgb25seSBzb21lIG9mIHRoZSBjaHVua3MgYXJlIGZpbGxlZC4KKyAgV2ViUE11eEltYWdlKiBuZXh0XzsKK307CisKKy8vIE1haW4gbXV4IG9iamVjdC4gU3RvcmVzIGRhdGEgY2h1bmtzLgorc3RydWN0IFdlYlBNdXggeworICBXZWJQTXV4SW1hZ2UqICAgaW1hZ2VzXzsKKyAgV2ViUENodW5rKiAgICAgIGljY3BfOworICBXZWJQQ2h1bmsqICAgICAgZXhpZl87CisgIFdlYlBDaHVuayogICAgICB4bXBfOworICBXZWJQQ2h1bmsqICAgICAgYW5pbV87CisgIFdlYlBDaHVuayogICAgICB2cDh4XzsKKworICBXZWJQQ2h1bmsqICAgICAgdW5rbm93bl87CisgIGludCAgICAgICAgICAgICBjYW52YXNfd2lkdGhfOworICBpbnQgICAgICAgICAgICAgY2FudmFzX2hlaWdodF87Cit9OworCisvLyBDSFVOS19JTkRFWCBlbnVtOiB1c2VkIGZvciBpbmRleGluZyB3aXRoaW4gJ2tDaHVua3MnIChkZWZpbmVkIGJlbG93KSBvbmx5LgorLy8gTm90ZTogdGhlIHJlYXNvbiBmb3IgaGF2aW5nIHR3byBlbnVtcyAoJ1dlYlBDaHVua0lkJyBhbmQgJ0NIVU5LX0lOREVYJykgaXMgdG8KKy8vIGFsbG93IHR3byBkaWZmZXJlbnQgY2h1bmtzIHRvIGhhdmUgdGhlIHNhbWUgaWQgKGUuZy4gV2ViUENodW5rSWQKKy8vICdXRUJQX0NIVU5LX0lNQUdFJyBjYW4gY29ycmVzcG9uZCB0byBDSFVOS19JTkRFWCAnSURYX1ZQOCcgb3IgJ0lEWF9WUDhMJykuCit0eXBlZGVmIGVudW0geworICBJRFhfVlA4WCA9IDAsCisgIElEWF9JQ0NQLAorICBJRFhfQU5JTSwKKyAgSURYX0FOTUYsCisgIElEWF9BTFBIQSwKKyAgSURYX1ZQOCwKKyAgSURYX1ZQOEwsCisgIElEWF9FWElGLAorICBJRFhfWE1QLAorICBJRFhfVU5LTk9XTiwKKworICBJRFhfTklMLAorICBJRFhfTEFTVF9DSFVOSworfSBDSFVOS19JTkRFWDsKKworI2RlZmluZSBOSUxfVEFHIDB4MDAwMDAwMDB1ICAvLyBUbyBzaWduYWwgdm9pZCBjaHVuay4KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCAgICAgIHRhZzsKKyAgV2ViUENodW5rSWQgICBpZDsKKyAgdWludDMyX3QgICAgICBzaXplOworfSBDaHVua0luZm87CisKK2V4dGVybiBjb25zdCBDaHVua0luZm8ga0NodW5rc1tJRFhfTEFTVF9DSFVOS107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBvYmplY3QgbWFuYWdlbWVudC4KKworLy8gSW5pdGlhbGl6ZS4KK3ZvaWQgQ2h1bmtJbml0KFdlYlBDaHVuayogY29uc3QgY2h1bmspOworCisvLyBHZXQgY2h1bmsgaW5kZXggZnJvbSBjaHVuayB0YWcuIFJldHVybnMgSURYX1VOS05PV04gaWYgbm90IGZvdW5kLgorQ0hVTktfSU5ERVggQ2h1bmtHZXRJbmRleEZyb21UYWcodWludDMyX3QgdGFnKTsKKworLy8gR2V0IGNodW5rIGlkIGZyb20gY2h1bmsgdGFnLiBSZXR1cm5zIFdFQlBfQ0hVTktfVU5LTk9XTiBpZiBub3QgZm91bmQuCitXZWJQQ2h1bmtJZCBDaHVua0dldElkRnJvbVRhZyh1aW50MzJfdCB0YWcpOworCisvLyBDb252ZXJ0IGEgZm91cmNjIHN0cmluZyB0byBhIHRhZy4KK3VpbnQzMl90IENodW5rR2V0VGFnRnJvbUZvdXJDQyhjb25zdCBjaGFyIGZvdXJjY1s0XSk7CisKKy8vIEdldCBjaHVuayBpbmRleCBmcm9tIGZvdXJjYy4gUmV0dXJucyBJRFhfVU5LTk9XTiBpZiBnaXZlbiBmb3VyY2MgaXMgdW5rbm93bi4KK0NIVU5LX0lOREVYIENodW5rR2V0SW5kZXhGcm9tRm91ckNDKGNvbnN0IGNoYXIgZm91cmNjWzRdKTsKKworLy8gU2VhcmNoIGZvciBudGggY2h1bmsgd2l0aCBnaXZlbiAndGFnJyBpbiB0aGUgY2h1bmsgbGlzdC4KKy8vIG50aCA9IDAgbWVhbnMgImxhc3Qgb2YgdGhlIGxpc3QiLgorV2ViUENodW5rKiBDaHVua1NlYXJjaExpc3QoV2ViUENodW5rKiBmaXJzdCwgdWludDMyX3QgbnRoLCB1aW50MzJfdCB0YWcpOworCisvLyBGaWxsIHRoZSBjaHVuayB3aXRoIHRoZSBnaXZlbiBkYXRhLgorV2ViUE11eEVycm9yIENodW5rQXNzaWduRGF0YShXZWJQQ2h1bmsqIGNodW5rLCBjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSwgdWludDMyX3QgdGFnKTsKKworLy8gU2V0cyAnY2h1bmsnIGF0IG50aCBwb3NpdGlvbiBpbiB0aGUgJ2NodW5rX2xpc3QnLgorLy8gbnRoID0gMCBoYXMgdGhlIHNwZWNpYWwgbWVhbmluZyAibGFzdCBvZiB0aGUgbGlzdCIuCisvLyBPbiBzdWNjZXNzIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBmcm9tICdjaHVuaycgdG8gdGhlICdjaHVua19saXN0Jy4KK1dlYlBNdXhFcnJvciBDaHVua1NldE50aChXZWJQQ2h1bmsqIGNodW5rLCBXZWJQQ2h1bmsqKiBjaHVua19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG50aCk7CisKKy8vIFJlbGVhc2VzIGNodW5rIGFuZCByZXR1cm5zIGNodW5rLT5uZXh0Xy4KK1dlYlBDaHVuayogQ2h1bmtSZWxlYXNlKFdlYlBDaHVuayogY29uc3QgY2h1bmspOworCisvLyBEZWxldGVzIGdpdmVuIGNodW5rICYgcmV0dXJucyBjaHVuay0+bmV4dF8uCitXZWJQQ2h1bmsqIENodW5rRGVsZXRlKFdlYlBDaHVuayogY29uc3QgY2h1bmspOworCisvLyBEZWxldGVzIGFsbCBjaHVua3MgaW4gdGhlIGdpdmVuIGNodW5rIGxpc3QuCit2b2lkIENodW5rTGlzdERlbGV0ZShXZWJQQ2h1bmsqKiBjb25zdCBjaHVua19saXN0KTsKKworLy8gUmV0dXJucyBzaXplIG9mIHRoZSBjaHVuayBpbmNsdWRpbmcgY2h1bmsgaGVhZGVyIGFuZCBwYWRkaW5nIGJ5dGUgKGlmIGFueSkuCitzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFNpemVXaXRoUGFkZGluZyhzaXplX3QgY2h1bmtfc2l6ZSkgeworICByZXR1cm4gQ0hVTktfSEVBREVSX1NJWkUgKyAoKGNodW5rX3NpemUgKyAxKSAmIH4xVSk7Cit9CisKKy8vIFNpemUgb2YgYSBjaHVuayBpbmNsdWRpbmcgaGVhZGVyIGFuZCBwYWRkaW5nLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBDaHVua0Rpc2tTaXplKGNvbnN0IFdlYlBDaHVuayogY2h1bmspIHsKKyAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IGNodW5rLT5kYXRhXy5zaXplOworICBTQl9EQ0hFQ0soZGF0YV9zaXplIDwgTUFYX0NIVU5LX1BBWUxPQUQpOworICByZXR1cm4gU2l6ZVdpdGhQYWRkaW5nKGRhdGFfc2l6ZSk7Cit9CisKKy8vIFRvdGFsIHNpemUgb2YgYSBsaXN0IG9mIGNodW5rcy4KK3NpemVfdCBDaHVua0xpc3REaXNrU2l6ZShjb25zdCBXZWJQQ2h1bmsqIGNodW5rX2xpc3QpOworCisvLyBXcml0ZSBvdXQgdGhlIGdpdmVuIGxpc3Qgb2YgY2h1bmtzIGludG8gJ2RzdCcuCit1aW50OF90KiBDaHVua0xpc3RFbWl0KGNvbnN0IFdlYlBDaHVuayogY2h1bmtfbGlzdCwgdWludDhfdCogZHN0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIG9iamVjdCBtYW5hZ2VtZW50LgorCisvLyBJbml0aWFsaXplLgordm9pZCBNdXhJbWFnZUluaXQoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpOworCisvLyBSZWxlYXNlcyBpbWFnZSAnd3BpJyBhbmQgcmV0dXJucyB3cGktPm5leHQuCitXZWJQTXV4SW1hZ2UqIE11eEltYWdlUmVsZWFzZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSk7CisKKy8vIERlbGV0ZSBpbWFnZSAnd3BpJyBhbmQgcmV0dXJuIHRoZSBuZXh0IGltYWdlIGluIHRoZSBsaXN0IG9yIE5VTEwuCisvLyAnd3BpJyBjYW4gYmUgTlVMTC4KK1dlYlBNdXhJbWFnZSogTXV4SW1hZ2VEZWxldGUoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpOworCisvLyBDb3VudCBudW1iZXIgb2YgaW1hZ2VzIG1hdGNoaW5nIHRoZSBnaXZlbiB0YWcgaWQgaW4gdGhlICd3cGlfbGlzdCcuCisvLyBJZiBpZCA9PSBXRUJQX0NIVU5LX05JTCwgYWxsIGltYWdlcyB3aWxsIGJlIG1hdGNoZWQuCitpbnQgTXV4SW1hZ2VDb3VudChjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaV9saXN0LCBXZWJQQ2h1bmtJZCBpZCk7CisKKy8vIFVwZGF0ZSB3aWR0aC9oZWlnaHQvaGFzX2FscGhhIGluZm8gZnJvbSBjaHVua3Mgd2l0aGluIHdwaS4KKy8vIEFsc28gcmVtb3ZlIEFMUEggY2h1bmsgaWYgbm90IG5lZWRlZC4KK2ludCBNdXhJbWFnZUZpbmFsaXplKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKTsKKworLy8gQ2hlY2sgaWYgZ2l2ZW4gSUQgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgcmVsYXRlZCBjaHVuay4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgSXNXUEkoV2ViUENodW5rSWQgaWQpIHsKKyAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgV0VCUF9DSFVOS19BTk1GOgorICAgIGNhc2UgV0VCUF9DSFVOS19BTFBIQToKKyAgICBjYXNlIFdFQlBfQ0hVTktfSU1BR0U6ICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8gUHVzaGVzICd3cGknIGF0IHRoZSBlbmQgb2YgJ3dwaV9saXN0Jy4KK1dlYlBNdXhFcnJvciBNdXhJbWFnZVB1c2goY29uc3QgV2ViUE11eEltYWdlKiB3cGksIFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0KTsKKworLy8gRGVsZXRlIG50aCBpbWFnZSBpbiB0aGUgaW1hZ2UgbGlzdC4KK1dlYlBNdXhFcnJvciBNdXhJbWFnZURlbGV0ZU50aChXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCwgdWludDMyX3QgbnRoKTsKKworLy8gR2V0IG50aCBpbWFnZSBpbiB0aGUgaW1hZ2UgbGlzdC4KK1dlYlBNdXhFcnJvciBNdXhJbWFnZUdldE50aChjb25zdCBXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCwgdWludDMyX3QgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhJbWFnZSoqIHdwaSk7CisKKy8vIFRvdGFsIHNpemUgb2YgdGhlIGdpdmVuIGltYWdlLgorc2l6ZV90IE11eEltYWdlRGlza1NpemUoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGkpOworCisvLyBXcml0ZSBvdXQgdGhlIGdpdmVuIGltYWdlIGludG8gJ2RzdCcuCit1aW50OF90KiBNdXhJbWFnZUVtaXQoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksIHVpbnQ4X3QqIGRzdCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgbWV0aG9kcyBmb3IgbXV4LgorCisvLyBDaGVja3MgaWYgdGhlIGdpdmVuIGltYWdlIGxpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGltYWdlIHdpdGggYWxwaGEuCitpbnQgTXV4SGFzQWxwaGEoY29uc3QgV2ViUE11eEltYWdlKiBpbWFnZXMpOworCisvLyBXcml0ZSBvdXQgUklGRiBoZWFkZXIgaW50byAnZGF0YScsIGdpdmVuIHRvdGFsIGRhdGEgc2l6ZSAnc2l6ZScuCit1aW50OF90KiBNdXhFbWl0UmlmZkhlYWRlcih1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKy8vIFJldHVybnMgdGhlIGxpc3Qgd2hlcmUgY2h1bmsgd2l0aCBnaXZlbiBJRCBpcyB0byBiZSBpbnNlcnRlZCBpbiBtdXguCitXZWJQQ2h1bmsqKiBNdXhHZXRDaHVua0xpc3RGcm9tSWQoY29uc3QgV2ViUE11eCogbXV4LCBXZWJQQ2h1bmtJZCBpZCk7CisKKy8vIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gbXV4IG9iamVjdC4KK1dlYlBNdXhFcnJvciBNdXhWYWxpZGF0ZShjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9NVVhfTVVYSV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpbnRlcm5hbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpbnRlcm5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MTIyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGludGVybmFsLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbnRlcm5hbCBvYmplY3RzIGFuZCB1dGlscyBmb3IgbXV4LgorLy8KKy8vIEF1dGhvcnM6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaWthcyAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL211eC9tdXhpLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgVU5ERUZJTkVEX0NIVU5LX1NJWkUgKCh1aW50MzJfdCkoLTEpKQorCitjb25zdCBDaHVua0luZm8ga0NodW5rc1tdID0geworICB7IE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdYJyksICBXRUJQX0NIVU5LX1ZQOFgsICAgIFZQOFhfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdJJywgJ0MnLCAnQycsICdQJyksICBXRUJQX0NIVU5LX0lDQ1AsICAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ0EnLCAnTicsICdJJywgJ00nKSwgIFdFQlBfQ0hVTktfQU5JTSwgICAgQU5JTV9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ0EnLCAnTicsICdNJywgJ0YnKSwgIFdFQlBfQ0hVTktfQU5NRiwgICAgQU5NRl9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ0EnLCAnTCcsICdQJywgJ0gnKSwgIFdFQlBfQ0hVTktfQUxQSEEsICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpLCAgV0VCUF9DSFVOS19JTUFHRSwgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdMJyksICBXRUJQX0NIVU5LX0lNQUdFLCAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ0UnLCAnWCcsICdJJywgJ0YnKSwgIFdFQlBfQ0hVTktfRVhJRiwgICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnWCcsICdNJywgJ1AnLCAnICcpLCAgV0VCUF9DSFVOS19YTVAsICAgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE5JTF9UQUcsICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NIVU5LX1VOS05PV04sIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisKKyAgeyBOSUxfVEFHLCAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DSFVOS19OSUwsICAgICBVTkRFRklORURfQ0hVTktfU0laRSB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEdldE11eFZlcnNpb24odm9pZCkgeworICByZXR1cm4gKE1VWF9NQUpfVkVSU0lPTiA8PCAxNikgfCAoTVVYX01JTl9WRVJTSU9OIDw8IDgpIHwgTVVYX1JFVl9WRVJTSU9OOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIGNodW5rIG9iamVjdC4KKwordm9pZCBDaHVua0luaXQoV2ViUENodW5rKiBjb25zdCBjaHVuaykgeworICBhc3NlcnQoY2h1bmspOworICBtZW1zZXQoY2h1bmssIDAsIHNpemVvZigqY2h1bmspKTsKKyAgY2h1bmstPnRhZ18gPSBOSUxfVEFHOworfQorCitXZWJQQ2h1bmsqIENodW5rUmVsZWFzZShXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKSB7CisgIFdlYlBDaHVuayogbmV4dDsKKyAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOworICBpZiAoY2h1bmstPm93bmVyXykgeworICAgIFdlYlBEYXRhQ2xlYXIoJmNodW5rLT5kYXRhXyk7CisgIH0KKyAgbmV4dCA9IGNodW5rLT5uZXh0XzsKKyAgQ2h1bmtJbml0KGNodW5rKTsKKyAgcmV0dXJuIG5leHQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBtaXNjIG1ldGhvZHMuCisKK0NIVU5LX0lOREVYIENodW5rR2V0SW5kZXhGcm9tVGFnKHVpbnQzMl90IHRhZykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsga0NodW5rc1tpXS50YWcgIT0gTklMX1RBRzsgKytpKSB7CisgICAgaWYgKHRhZyA9PSBrQ2h1bmtzW2ldLnRhZykgcmV0dXJuIChDSFVOS19JTkRFWClpOworICB9CisgIHJldHVybiBJRFhfVU5LTk9XTjsKK30KKworV2ViUENodW5rSWQgQ2h1bmtHZXRJZEZyb21UYWcodWludDMyX3QgdGFnKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBrQ2h1bmtzW2ldLnRhZyAhPSBOSUxfVEFHOyArK2kpIHsKKyAgICBpZiAodGFnID09IGtDaHVua3NbaV0udGFnKSByZXR1cm4ga0NodW5rc1tpXS5pZDsKKyAgfQorICByZXR1cm4gV0VCUF9DSFVOS19VTktOT1dOOworfQorCit1aW50MzJfdCBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoY29uc3QgY2hhciBmb3VyY2NbNF0pIHsKKyAgcmV0dXJuIE1LRk9VUkNDKGZvdXJjY1swXSwgZm91cmNjWzFdLCBmb3VyY2NbMl0sIGZvdXJjY1szXSk7Cit9CisKK0NIVU5LX0lOREVYIENodW5rR2V0SW5kZXhGcm9tRm91ckNDKGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7CisgIGNvbnN0IHVpbnQzMl90IHRhZyA9IENodW5rR2V0VGFnRnJvbUZvdXJDQyhmb3VyY2MpOworICByZXR1cm4gQ2h1bmtHZXRJbmRleEZyb21UYWcodGFnKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIHNlYXJjaCBtZXRob2RzLgorCisvLyBSZXR1cm5zIG5leHQgY2h1bmsgaW4gdGhlIGNodW5rIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gdGFnLgorc3RhdGljIFdlYlBDaHVuayogQ2h1bmtTZWFyY2hOZXh0SW5MaXN0KFdlYlBDaHVuayogY2h1bmssIHVpbnQzMl90IHRhZykgeworICB3aGlsZSAoY2h1bmsgIT0gTlVMTCAmJiBjaHVuay0+dGFnXyAhPSB0YWcpIHsKKyAgICBjaHVuayA9IGNodW5rLT5uZXh0XzsKKyAgfQorICByZXR1cm4gY2h1bms7Cit9CisKK1dlYlBDaHVuayogQ2h1bmtTZWFyY2hMaXN0KFdlYlBDaHVuayogZmlyc3QsIHVpbnQzMl90IG50aCwgdWludDMyX3QgdGFnKSB7CisgIHVpbnQzMl90IGl0ZXIgPSBudGg7CisgIGZpcnN0ID0gQ2h1bmtTZWFyY2hOZXh0SW5MaXN0KGZpcnN0LCB0YWcpOworICBpZiAoZmlyc3QgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgd2hpbGUgKC0taXRlciAhPSAwKSB7CisgICAgV2ViUENodW5rKiBuZXh0X2NodW5rID0gQ2h1bmtTZWFyY2hOZXh0SW5MaXN0KGZpcnN0LT5uZXh0XywgdGFnKTsKKyAgICBpZiAobmV4dF9jaHVuayA9PSBOVUxMKSBicmVhazsKKyAgICBmaXJzdCA9IG5leHRfY2h1bms7CisgIH0KKyAgcmV0dXJuICgobnRoID4gMCkgJiYgKGl0ZXIgPiAwKSkgPyBOVUxMIDogZmlyc3Q7Cit9CisKKy8vIE91dHB1dHMgYSBwb2ludGVyIHRvICdwcmV2X2NodW5rLT5uZXh0XycsCisvLyAgIHdoZXJlICdwcmV2X2NodW5rJyBpcyB0aGUgcG9pbnRlciB0byB0aGUgY2h1bmsgYXQgcG9zaXRpb24gKG50aCAtIDEpLgorLy8gUmV0dXJucyB0cnVlIGlmIG50aCBjaHVuayB3YXMgZm91bmQuCitzdGF0aWMgaW50IENodW5rU2VhcmNoTGlzdFRvU2V0KFdlYlBDaHVuayoqIGNodW5rX2xpc3QsIHVpbnQzMl90IG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rKioqIGNvbnN0IGxvY2F0aW9uKSB7CisgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgYXNzZXJ0KGNodW5rX2xpc3QgIT0gTlVMTCk7CisgICpsb2NhdGlvbiA9IGNodW5rX2xpc3Q7CisKKyAgd2hpbGUgKCpjaHVua19saXN0ICE9IE5VTEwpIHsKKyAgICBXZWJQQ2h1bmsqIGNvbnN0IGN1cl9jaHVuayA9ICpjaHVua19saXN0OworICAgICsrY291bnQ7CisgICAgaWYgKGNvdW50ID09IG50aCkgcmV0dXJuIDE7ICAvLyBGb3VuZC4KKyAgICBjaHVua19saXN0ID0gJmN1cl9jaHVuay0+bmV4dF87CisgICAgKmxvY2F0aW9uID0gY2h1bmtfbGlzdDsKKyAgfQorCisgIC8vICpjaHVua19saXN0IGlzIG9rIHRvIGJlIE5VTEwgaWYgYWRkaW5nIGF0IGxhc3QgbG9jYXRpb24uCisgIHJldHVybiAobnRoID09IDAgfHwgKGNvdW50ID09IG50aCAtIDEpKSA/IDEgOiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgd3JpdGVyIG1ldGhvZHMuCisKK1dlYlBNdXhFcnJvciBDaHVua0Fzc2lnbkRhdGEoV2ViUENodW5rKiBjaHVuaywgY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEsIHVpbnQzMl90IHRhZykgeworICAvLyBGb3IgaW50ZXJuYWxseSBhbGxvY2F0ZWQgY2h1bmtzLCBhbHdheXMgY29weSBkYXRhICYgbWFrZSBpdCBvd25lciBvZiBkYXRhLgorICBpZiAodGFnID09IGtDaHVua3NbSURYX1ZQOFhdLnRhZyB8fCB0YWcgPT0ga0NodW5rc1tJRFhfQU5JTV0udGFnKSB7CisgICAgY29weV9kYXRhID0gMTsKKyAgfQorCisgIENodW5rUmVsZWFzZShjaHVuayk7CisKKyAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgIGlmIChjb3B5X2RhdGEpIHsgICAgICAgIC8vIENvcHkgZGF0YS4KKyAgICAgIGlmICghV2ViUERhdGFDb3B5KGRhdGEsICZjaHVuay0+ZGF0YV8pKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworICAgICAgY2h1bmstPm93bmVyXyA9IDE7ICAgIC8vIENodW5rIGlzIG93bmVyIG9mIGRhdGEuCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29weSBkYXRhLgorICAgICAgY2h1bmstPmRhdGFfID0gKmRhdGE7CisgICAgfQorICB9CisgIGNodW5rLT50YWdfID0gdGFnOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK1dlYlBNdXhFcnJvciBDaHVua1NldE50aChXZWJQQ2h1bmsqIGNodW5rLCBXZWJQQ2h1bmsqKiBjaHVua19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG50aCkgeworICBXZWJQQ2h1bmsqIG5ld19jaHVuazsKKworICBpZiAoIUNodW5rU2VhcmNoTGlzdFRvU2V0KGNodW5rX2xpc3QsIG50aCwgJmNodW5rX2xpc3QpKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKKyAgfQorCisgIG5ld19jaHVuayA9IChXZWJQQ2h1bmsqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemVvZigqbmV3X2NodW5rKSk7CisgIGlmIChuZXdfY2h1bmsgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKyAgKm5ld19jaHVuayA9ICpjaHVuazsKKyAgY2h1bmstPm93bmVyXyA9IDA7CisgIG5ld19jaHVuay0+bmV4dF8gPSAqY2h1bmtfbGlzdDsKKyAgKmNodW5rX2xpc3QgPSBuZXdfY2h1bms7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGRlbGV0aW9uIG1ldGhvZChzKS4KKworV2ViUENodW5rKiBDaHVua0RlbGV0ZShXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKSB7CisgIFdlYlBDaHVuayogY29uc3QgbmV4dCA9IENodW5rUmVsZWFzZShjaHVuayk7CisgIFdlYlBTYWZlRnJlZShjaHVuayk7CisgIHJldHVybiBuZXh0OworfQorCit2b2lkIENodW5rTGlzdERlbGV0ZShXZWJQQ2h1bmsqKiBjb25zdCBjaHVua19saXN0KSB7CisgIHdoaWxlICgqY2h1bmtfbGlzdCAhPSBOVUxMKSB7CisgICAgKmNodW5rX2xpc3QgPSBDaHVua0RlbGV0ZSgqY2h1bmtfbGlzdCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIHNlcmlhbGl6YXRpb24gbWV0aG9kcy4KKworc3RhdGljIHVpbnQ4X3QqIENodW5rRW1pdChjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3Qgc2l6ZV90IGNodW5rX3NpemUgPSBjaHVuay0+ZGF0YV8uc2l6ZTsKKyAgYXNzZXJ0KGNodW5rKTsKKyAgYXNzZXJ0KGNodW5rLT50YWdfICE9IE5JTF9UQUcpOworICBQdXRMRTMyKGRzdCArIDAsIGNodW5rLT50YWdfKTsKKyAgUHV0TEUzMihkc3QgKyBUQUdfU0laRSwgKHVpbnQzMl90KWNodW5rX3NpemUpOworICBhc3NlcnQoY2h1bmtfc2l6ZSA9PSAodWludDMyX3QpY2h1bmtfc2l6ZSk7CisgIG1lbWNweShkc3QgKyBDSFVOS19IRUFERVJfU0laRSwgY2h1bmstPmRhdGFfLmJ5dGVzLCBjaHVua19zaXplKTsKKyAgaWYgKGNodW5rX3NpemUgJiAxKQorICAgIGRzdFtDSFVOS19IRUFERVJfU0laRSArIGNodW5rX3NpemVdID0gMDsgIC8vIEFkZCBwYWRkaW5nLgorICByZXR1cm4gZHN0ICsgQ2h1bmtEaXNrU2l6ZShjaHVuayk7Cit9CisKK3VpbnQ4X3QqIENodW5rTGlzdEVtaXQoY29uc3QgV2ViUENodW5rKiBjaHVua19saXN0LCB1aW50OF90KiBkc3QpIHsKKyAgd2hpbGUgKGNodW5rX2xpc3QgIT0gTlVMTCkgeworICAgIGRzdCA9IENodW5rRW1pdChjaHVua19saXN0LCBkc3QpOworICAgIGNodW5rX2xpc3QgPSBjaHVua19saXN0LT5uZXh0XzsKKyAgfQorICByZXR1cm4gZHN0OworfQorCitzaXplX3QgQ2h1bmtMaXN0RGlza1NpemUoY29uc3QgV2ViUENodW5rKiBjaHVua19saXN0KSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgd2hpbGUgKGNodW5rX2xpc3QgIT0gTlVMTCkgeworICAgIHNpemUgKz0gQ2h1bmtEaXNrU2l6ZShjaHVua19saXN0KTsKKyAgICBjaHVua19saXN0ID0gY2h1bmtfbGlzdC0+bmV4dF87CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWZlIG9mIGEgTXV4SW1hZ2Ugb2JqZWN0LgorCit2b2lkIE11eEltYWdlSW5pdChXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBhc3NlcnQod3BpKTsKKyAgbWVtc2V0KHdwaSwgMCwgc2l6ZW9mKCp3cGkpKTsKK30KKworV2ViUE11eEltYWdlKiBNdXhJbWFnZVJlbGVhc2UoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgV2ViUE11eEltYWdlKiBuZXh0OworICBpZiAod3BpID09IE5VTEwpIHJldHVybiBOVUxMOworICBDaHVua0RlbGV0ZSh3cGktPmhlYWRlcl8pOworICBDaHVua0RlbGV0ZSh3cGktPmFscGhhXyk7CisgIENodW5rRGVsZXRlKHdwaS0+aW1nXyk7CisgIENodW5rTGlzdERlbGV0ZSgmd3BpLT51bmtub3duXyk7CisKKyAgbmV4dCA9IHdwaS0+bmV4dF87CisgIE11eEltYWdlSW5pdCh3cGkpOworICByZXR1cm4gbmV4dDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIHNlYXJjaCBtZXRob2RzLgorCisvLyBHZXQgYSByZWZlcmVuY2UgdG8gYXBwcm9wcmlhdGUgY2h1bmsgbGlzdCB3aXRoaW4gYW4gaW1hZ2UgZ2l2ZW4gY2h1bmsgdGFnLgorc3RhdGljIFdlYlBDaHVuayoqIEdldENodW5rTGlzdEZyb21JZChjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSWQgaWQpIHsKKyAgYXNzZXJ0KHdwaSAhPSBOVUxMKTsKKyAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgV0VCUF9DSFVOS19BTk1GOiAgcmV0dXJuIChXZWJQQ2h1bmsqKikmd3BpLT5oZWFkZXJfOworICAgIGNhc2UgV0VCUF9DSFVOS19BTFBIQTogcmV0dXJuIChXZWJQQ2h1bmsqKikmd3BpLT5hbHBoYV87CisgICAgY2FzZSBXRUJQX0NIVU5LX0lNQUdFOiByZXR1cm4gKFdlYlBDaHVuayoqKSZ3cGktPmltZ187CisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgIH0KK30KKworaW50IE11eEltYWdlQ291bnQoY29uc3QgV2ViUE11eEltYWdlKiB3cGlfbGlzdCwgV2ViUENodW5rSWQgaWQpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgY29uc3QgV2ViUE11eEltYWdlKiBjdXJyZW50OworICBmb3IgKGN1cnJlbnQgPSB3cGlfbGlzdDsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dF8pIHsKKyAgICBpZiAoaWQgPT0gV0VCUF9DSFVOS19OSUwpIHsKKyAgICAgICsrY291bnQ7ICAvLyBTcGVjaWFsIGNhc2U6IGNvdW50IGFsbCBpbWFnZXMuCisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IFdlYlBDaHVuayogY29uc3Qgd3BpX2NodW5rID0gKkdldENodW5rTGlzdEZyb21JZChjdXJyZW50LCBpZCk7CisgICAgICBpZiAod3BpX2NodW5rICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgV2ViUENodW5rSWQgd3BpX2NodW5rX2lkID0gQ2h1bmtHZXRJZEZyb21UYWcod3BpX2NodW5rLT50YWdfKTsKKyAgICAgICAgaWYgKHdwaV9jaHVua19pZCA9PSBpZCkgKytjb3VudDsgIC8vIENvdW50IGltYWdlcyB3aXRoIGEgbWF0Y2hpbmcgJ2lkJy4KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBPdXRwdXRzIGEgcG9pbnRlciB0byAncHJldl93cGktPm5leHRfJywKKy8vICAgd2hlcmUgJ3ByZXZfd3BpJyBpcyB0aGUgcG9pbnRlciB0byB0aGUgaW1hZ2UgYXQgcG9zaXRpb24gKG50aCAtIDEpLgorLy8gUmV0dXJucyB0cnVlIGlmIG50aCBpbWFnZSB3YXMgZm91bmQuCitzdGF0aWMgaW50IFNlYXJjaEltYWdlVG9HZXRPckRlbGV0ZShXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCwgdWludDMyX3QgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEltYWdlKioqIGNvbnN0IGxvY2F0aW9uKSB7CisgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgYXNzZXJ0KHdwaV9saXN0KTsKKyAgKmxvY2F0aW9uID0gd3BpX2xpc3Q7CisKKyAgaWYgKG50aCA9PSAwKSB7CisgICAgbnRoID0gTXV4SW1hZ2VDb3VudCgqd3BpX2xpc3QsIFdFQlBfQ0hVTktfTklMKTsKKyAgICBpZiAobnRoID09IDApIHJldHVybiAwOyAgLy8gTm90IGZvdW5kLgorICB9CisKKyAgd2hpbGUgKCp3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgV2ViUE11eEltYWdlKiBjb25zdCBjdXJfd3BpID0gKndwaV9saXN0OworICAgICsrY291bnQ7CisgICAgaWYgKGNvdW50ID09IG50aCkgcmV0dXJuIDE7ICAvLyBGb3VuZC4KKyAgICB3cGlfbGlzdCA9ICZjdXJfd3BpLT5uZXh0XzsKKyAgICAqbG9jYXRpb24gPSB3cGlfbGlzdDsKKyAgfQorICByZXR1cm4gMDsgIC8vIE5vdCBmb3VuZC4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIHdyaXRlciBtZXRob2RzLgorCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VQdXNoKGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpLCBXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCkgeworICBXZWJQTXV4SW1hZ2UqIG5ld193cGk7CisKKyAgd2hpbGUgKCp3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgV2ViUE11eEltYWdlKiBjb25zdCBjdXJfd3BpID0gKndwaV9saXN0OworICAgIGlmIChjdXJfd3BpLT5uZXh0XyA9PSBOVUxMKSBicmVhazsKKyAgICB3cGlfbGlzdCA9ICZjdXJfd3BpLT5uZXh0XzsKKyAgfQorCisgIG5ld193cGkgPSAoV2ViUE11eEltYWdlKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKm5ld193cGkpKTsKKyAgaWYgKG5ld193cGkgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKyAgKm5ld193cGkgPSAqd3BpOworICBuZXdfd3BpLT5uZXh0XyA9IE5VTEw7CisKKyAgaWYgKCp3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgKCp3cGlfbGlzdCktPm5leHRfID0gbmV3X3dwaTsKKyAgfSBlbHNlIHsKKyAgICAqd3BpX2xpc3QgPSBuZXdfd3BpOworICB9CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIGRlbGV0aW9uIG1ldGhvZHMuCisKK1dlYlBNdXhJbWFnZSogTXV4SW1hZ2VEZWxldGUoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgLy8gRGVsZXRlIHRoZSBjb21wb25lbnRzIG9mIHdwaS4gSWYgd3BpIGlzIE5VTEwgdGhpcyBpcyBhIG5vb3AuCisgIFdlYlBNdXhJbWFnZSogY29uc3QgbmV4dCA9IE11eEltYWdlUmVsZWFzZSh3cGkpOworICBXZWJQU2FmZUZyZWUod3BpKTsKKyAgcmV0dXJuIG5leHQ7Cit9CisKK1dlYlBNdXhFcnJvciBNdXhJbWFnZURlbGV0ZU50aChXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCwgdWludDMyX3QgbnRoKSB7CisgIGFzc2VydCh3cGlfbGlzdCk7CisgIGlmICghU2VhcmNoSW1hZ2VUb0dldE9yRGVsZXRlKHdwaV9saXN0LCBudGgsICZ3cGlfbGlzdCkpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworICB9CisgICp3cGlfbGlzdCA9IE11eEltYWdlRGVsZXRlKCp3cGlfbGlzdCk7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIHJlYWRlciBtZXRob2RzLgorCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VHZXROdGgoY29uc3QgV2ViUE11eEltYWdlKiogd3BpX2xpc3QsIHVpbnQzMl90IG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4SW1hZ2UqKiB3cGkpIHsKKyAgYXNzZXJ0KHdwaV9saXN0KTsKKyAgYXNzZXJ0KHdwaSk7CisgIGlmICghU2VhcmNoSW1hZ2VUb0dldE9yRGVsZXRlKChXZWJQTXV4SW1hZ2UqKil3cGlfbGlzdCwgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViUE11eEltYWdlKioqKSZ3cGlfbGlzdCkpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworICB9CisgICp3cGkgPSAoV2ViUE11eEltYWdlKikqd3BpX2xpc3Q7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE11eEltYWdlIHNlcmlhbGl6YXRpb24gbWV0aG9kcy4KKworLy8gU2l6ZSBvZiBhbiBpbWFnZS4KK3NpemVfdCBNdXhJbWFnZURpc2tTaXplKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgaWYgKHdwaS0+aGVhZGVyXyAhPSBOVUxMKSBzaXplICs9IENodW5rRGlza1NpemUod3BpLT5oZWFkZXJfKTsKKyAgaWYgKHdwaS0+YWxwaGFfICE9IE5VTEwpIHNpemUgKz0gQ2h1bmtEaXNrU2l6ZSh3cGktPmFscGhhXyk7CisgIGlmICh3cGktPmltZ18gIT0gTlVMTCkgc2l6ZSArPSBDaHVua0Rpc2tTaXplKHdwaS0+aW1nXyk7CisgIGlmICh3cGktPnVua25vd25fICE9IE5VTEwpIHNpemUgKz0gQ2h1bmtMaXN0RGlza1NpemUod3BpLT51bmtub3duXyk7CisgIHJldHVybiBzaXplOworfQorCisvLyBTcGVjaWFsIGNhc2UgYXMgQU5NRiBjaHVuayBlbmNhcHN1bGF0ZXMgb3RoZXIgaW1hZ2UgY2h1bmtzLgorc3RhdGljIHVpbnQ4X3QqIENodW5rRW1pdFNwZWNpYWwoY29uc3QgV2ViUENodW5rKiBjb25zdCBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdG90YWxfc2l6ZSwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHNpemVfdCBoZWFkZXJfc2l6ZSA9IGhlYWRlci0+ZGF0YV8uc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IG9mZnNldF90b19uZXh0ID0gdG90YWxfc2l6ZSAtIENIVU5LX0hFQURFUl9TSVpFOworICBhc3NlcnQoaGVhZGVyLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZyk7CisgIFB1dExFMzIoZHN0ICsgMCwgaGVhZGVyLT50YWdfKTsKKyAgUHV0TEUzMihkc3QgKyBUQUdfU0laRSwgKHVpbnQzMl90KW9mZnNldF90b19uZXh0KTsKKyAgYXNzZXJ0KGhlYWRlcl9zaXplID09ICh1aW50MzJfdCloZWFkZXJfc2l6ZSk7CisgIG1lbWNweShkc3QgKyBDSFVOS19IRUFERVJfU0laRSwgaGVhZGVyLT5kYXRhXy5ieXRlcywgaGVhZGVyX3NpemUpOworICBpZiAoaGVhZGVyX3NpemUgJiAxKSB7CisgICAgZHN0W0NIVU5LX0hFQURFUl9TSVpFICsgaGVhZGVyX3NpemVdID0gMDsgIC8vIEFkZCBwYWRkaW5nLgorICB9CisgIHJldHVybiBkc3QgKyBDaHVua0Rpc2tTaXplKGhlYWRlcik7Cit9CisKK3VpbnQ4X3QqIE11eEltYWdlRW1pdChjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwgdWludDhfdCogZHN0KSB7CisgIC8vIE9yZGVyaW5nIG9mIGNodW5rcyB0byBiZSBlbWl0dGVkIGlzIHN0cmljdGx5IGFzIGZvbGxvd3M6CisgIC8vIDEuIEFOTUYgY2h1bmsgKGlmIHByZXNlbnQpLgorICAvLyAyLiBBTFBIIGNodW5rIChpZiBwcmVzZW50KS4KKyAgLy8gMy4gVlA4L1ZQOEwgY2h1bmsuCisgIGFzc2VydCh3cGkpOworICBpZiAod3BpLT5oZWFkZXJfICE9IE5VTEwpIHsKKyAgICBkc3QgPSBDaHVua0VtaXRTcGVjaWFsKHdwaS0+aGVhZGVyXywgTXV4SW1hZ2VEaXNrU2l6ZSh3cGkpLCBkc3QpOworICB9CisgIGlmICh3cGktPmFscGhhXyAhPSBOVUxMKSBkc3QgPSBDaHVua0VtaXQod3BpLT5hbHBoYV8sIGRzdCk7CisgIGlmICh3cGktPmltZ18gIT0gTlVMTCkgZHN0ID0gQ2h1bmtFbWl0KHdwaS0+aW1nXywgZHN0KTsKKyAgaWYgKHdwaS0+dW5rbm93bl8gIT0gTlVMTCkgZHN0ID0gQ2h1bmtMaXN0RW1pdCh3cGktPnVua25vd25fLCBkc3QpOworICByZXR1cm4gZHN0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIG1ldGhvZHMgZm9yIG11eC4KKworaW50IE11eEhhc0FscGhhKGNvbnN0IFdlYlBNdXhJbWFnZSogaW1hZ2VzKSB7CisgIHdoaWxlIChpbWFnZXMgIT0gTlVMTCkgeworICAgIGlmIChpbWFnZXMtPmhhc19hbHBoYV8pIHJldHVybiAxOworICAgIGltYWdlcyA9IGltYWdlcy0+bmV4dF87CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQ4X3QqIE11eEVtaXRSaWZmSGVhZGVyKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKSB7CisgIFB1dExFMzIoZGF0YSArIDAsIE1LRk9VUkNDKCdSJywgJ0knLCAnRicsICdGJykpOworICBQdXRMRTMyKGRhdGEgKyBUQUdfU0laRSwgKHVpbnQzMl90KXNpemUgLSBDSFVOS19IRUFERVJfU0laRSk7CisgIGFzc2VydChzaXplID09ICh1aW50MzJfdClzaXplKTsKKyAgUHV0TEUzMihkYXRhICsgVEFHX1NJWkUgKyBDSFVOS19TSVpFX0JZVEVTLCBNS0ZPVVJDQygnVycsICdFJywgJ0InLCAnUCcpKTsKKyAgcmV0dXJuIGRhdGEgKyBSSUZGX0hFQURFUl9TSVpFOworfQorCitXZWJQQ2h1bmsqKiBNdXhHZXRDaHVua0xpc3RGcm9tSWQoY29uc3QgV2ViUE11eCogbXV4LCBXZWJQQ2h1bmtJZCBpZCkgeworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBXRUJQX0NIVU5LX1ZQOFg6ICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+dnA4eF87CisgICAgY2FzZSBXRUJQX0NIVU5LX0lDQ1A6ICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+aWNjcF87CisgICAgY2FzZSBXRUJQX0NIVU5LX0FOSU06ICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+YW5pbV87CisgICAgY2FzZSBXRUJQX0NIVU5LX0VYSUY6ICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+ZXhpZl87CisgICAgY2FzZSBXRUJQX0NIVU5LX1hNUDogICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+eG1wXzsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT51bmtub3duXzsKKyAgfQorfQorCitzdGF0aWMgaW50IElzTm90Q29tcGF0aWJsZShpbnQgZmVhdHVyZSwgaW50IG51bV9pdGVtcykgeworICByZXR1cm4gKGZlYXR1cmUgIT0gMCkgIT0gKG51bV9pdGVtcyA+IDApOworfQorCisjZGVmaW5lIE5PX0ZMQUcgKChXZWJQRmVhdHVyZUZsYWdzKTApCisKKy8vIFRlc3QgYmFzaWMgY29uc3RyYWludHM6CisvLyByZXRyaWV2YWwsIG1heGltdW0gbnVtYmVyIG9mIGNodW5rcyBieSBpbmRleCAodXNlIC0xIHRvIHNraXApCisvLyBhbmQgZmVhdHVyZSBpbmNvbXBhdGliaWxpdHkgKHVzZSBOT19GTEFHIHRvIHNraXApLgorLy8gT24gc3VjY2VzcyByZXR1cm5zIFdFQlBfTVVYX09LIGFuZCBzdG9yZXMgdGhlIGNodW5rIGNvdW50IGluICpudW0uCitzdGF0aWMgV2ViUE11eEVycm9yIFZhbGlkYXRlQ2h1bmsoY29uc3QgV2ViUE11eCogY29uc3QgbXV4LCBDSFVOS19JTkRFWCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEZlYXR1cmVGbGFncyBmZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZwOHhfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heCwgaW50KiBudW0pIHsKKyAgY29uc3QgV2ViUE11eEVycm9yIGVyciA9CisgICAgICBXZWJQTXV4TnVtQ2h1bmtzKG11eCwga0NodW5rc1tpZHhdLmlkLCBudW0pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAobWF4ID4gLTEgJiYgKm51bSA+IG1heCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIGlmIChmZWF0dXJlICE9IE5PX0ZMQUcgJiYgSXNOb3RDb21wYXRpYmxlKHZwOHhfZmxhZ3MgJiBmZWF0dXJlLCAqbnVtKSkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworV2ViUE11eEVycm9yIE11eFZhbGlkYXRlKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBpbnQgbnVtX2ljY3A7CisgIGludCBudW1fZXhpZjsKKyAgaW50IG51bV94bXA7CisgIGludCBudW1fYW5pbTsKKyAgaW50IG51bV9mcmFtZXM7CisgIGludCBudW1fdnA4eDsKKyAgaW50IG51bV9pbWFnZXM7CisgIGludCBudW1fYWxwaGE7CisgIHVpbnQzMl90IGZsYWdzOworICBXZWJQTXV4RXJyb3IgZXJyOworCisgIC8vIFZlcmlmeSBtdXggaXMgbm90IE5VTEwuCisgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgLy8gVmVyaWZ5IG11eCBoYXMgYXQgbGVhc3Qgb25lIGltYWdlLgorICBpZiAobXV4LT5pbWFnZXNfID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIGVyciA9IFdlYlBNdXhHZXRGZWF0dXJlcyhtdXgsICZmbGFncyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gQXQgbW9zdCBvbmUgY29sb3IgcHJvZmlsZSBjaHVuay4KKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9JQ0NQLCBJQ0NQX0ZMQUcsIGZsYWdzLCAxLCAmbnVtX2ljY3ApOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEF0IG1vc3Qgb25lIEVYSUYgbWV0YWRhdGEuCisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfRVhJRiwgRVhJRl9GTEFHLCBmbGFncywgMSwgJm51bV9leGlmKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBBdCBtb3N0IG9uZSBYTVAgbWV0YWRhdGEuCisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfWE1QLCBYTVBfRkxBRywgZmxhZ3MsIDEsICZudW1feG1wKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBBbmltYXRpb246IEFOSU1BVElPTl9GTEFHLCBBTklNIGNodW5rIGFuZCBBTk1GIGNodW5rKHMpIGFyZSBjb25zaXN0ZW50LgorICAvLyBBdCBtb3N0IG9uZSBBTklNIGNodW5rLgorICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX0FOSU0sIE5PX0ZMQUcsIGZsYWdzLCAxLCAmbnVtX2FuaW0pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX0FOTUYsIE5PX0ZMQUcsIGZsYWdzLCAtMSwgJm51bV9mcmFtZXMpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIHsKKyAgICBjb25zdCBpbnQgaGFzX2FuaW1hdGlvbiA9ICEhKGZsYWdzICYgQU5JTUFUSU9OX0ZMQUcpOworICAgIGlmIChoYXNfYW5pbWF0aW9uICYmIChudW1fYW5pbSA9PSAwIHx8IG51bV9mcmFtZXMgPT0gMCkpIHsKKyAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgIH0KKyAgICBpZiAoIWhhc19hbmltYXRpb24gJiYgKG51bV9hbmltID09IDEgfHwgbnVtX2ZyYW1lcyA+IDApKSB7CisgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9CisgICAgaWYgKCFoYXNfYW5pbWF0aW9uKSB7CisgICAgICBjb25zdCBXZWJQTXV4SW1hZ2UqIGltYWdlcyA9IG11eC0+aW1hZ2VzXzsKKyAgICAgIC8vIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBpbWFnZS4KKyAgICAgIGlmIChpbWFnZXMgPT0gTlVMTCB8fCBpbWFnZXMtPm5leHRfICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICB9CisgICAgICAvLyBTaXplIG11c3QgbWF0Y2guCisgICAgICBpZiAobXV4LT5jYW52YXNfd2lkdGhfID4gMCkgeworICAgICAgICBpZiAoaW1hZ2VzLT53aWR0aF8gIT0gbXV4LT5jYW52YXNfd2lkdGhfIHx8CisgICAgICAgICAgICBpbWFnZXMtPmhlaWdodF8gIT0gbXV4LT5jYW52YXNfaGVpZ2h0XykgeworICAgICAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVmVyaWZ5IGVpdGhlciBWUDhYIGNodW5rIGlzIHByZXNlbnQgT1IgdGhlcmUgaXMgb25seSBvbmUgZWxlbSBpbgorICAvLyBtdXgtPmltYWdlc18uCisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfVlA4WCwgTk9fRkxBRywgZmxhZ3MsIDEsICZudW1fdnA4eCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfVlA4LCBOT19GTEFHLCBmbGFncywgLTEsICZudW1faW1hZ2VzKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKG51bV92cDh4ID09IDAgJiYgbnVtX2ltYWdlcyAhPSAxKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICAvLyBBTFBIQV9GTEFHICYgYWxwaGEgY2h1bmsocykgYXJlIGNvbnNpc3RlbnQuCisgIC8vIE5vdGU6IEFMUEhBX0ZMQUcgY2FuIGJlIHNldCB3aGVuIHRoZXJlIGlzIGFjdHVhbGx5IG5vIEFscGhhIGRhdGEgcHJlc2VudC4KKyAgaWYgKE11eEhhc0FscGhhKG11eC0+aW1hZ2VzXykpIHsKKyAgICBpZiAobnVtX3ZwOHggPiAwKSB7CisgICAgICAvLyBWUDhYIGNodW5rIGlzIHByZXNlbnQsIHNvIGl0IHNob3VsZCBjb250YWluIEFMUEhBX0ZMQUcuCisgICAgICBpZiAoIShmbGFncyAmIEFMUEhBX0ZMQUcpKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVlA4WCBjaHVuayBpcyBub3QgcHJlc2VudCwgc28gQUxQSCBjaHVua3Mgc2hvdWxkIE5PVCBiZSBwcmVzZW50IGVpdGhlci4KKyAgICAgIGVyciA9IFdlYlBNdXhOdW1DaHVua3MobXV4LCBXRUJQX0NIVU5LX0FMUEhBLCAmbnVtX2FscGhhKTsKKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgICAgICBpZiAobnVtX2FscGhhID4gMCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisjdW5kZWYgTk9fRkxBRworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eHJlYWQuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4cmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTUyODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eHJlYWQuYwpAQCAtMCwwICsxLDUzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFJlYWQgQVBJcyBmb3IgbXV4LgorLy8KKy8vIEF1dGhvcnM6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaWthcyAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvbXV4L211eGkuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBtZXRob2QocykuCisKKy8vIEhhbmR5IE1BQ1JPLgorI2RlZmluZSBTV0lUQ0hfSURfTElTVChJTkRFWCwgTElTVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaWR4ID09IChJTkRFWCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IFdlYlBDaHVuayogY29uc3QgY2h1bmsgPSBDaHVua1NlYXJjaExpc3QoKExJU1QpLCBudGgsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NodW5rc1soSU5ERVgpXS50YWcpOyAgICAgXAorICAgIGlmIChjaHVuaykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKmRhdGEgPSBjaHVuay0+ZGF0YV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFdFQlBfTVVYX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4R2V0KGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCwgQ0hVTktfSU5ERVggaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnRoLCBXZWJQRGF0YSogY29uc3QgZGF0YSkgeworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBhc3NlcnQoIUlzV1BJKGtDaHVua3NbaWR4XS5pZCkpOworICBXZWJQRGF0YUluaXQoZGF0YSk7CisKKyAgU1dJVENIX0lEX0xJU1QoSURYX1ZQOFgsIG11eC0+dnA4eF8pOworICBTV0lUQ0hfSURfTElTVChJRFhfSUNDUCwgbXV4LT5pY2NwXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9BTklNLCBtdXgtPmFuaW1fKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0VYSUYsIG11eC0+ZXhpZl8pOworICBTV0lUQ0hfSURfTElTVChJRFhfWE1QLCBtdXgtPnhtcF8pOworICBhc3NlcnQoaWR4ICE9IElEWF9VTktOT1dOKTsKKyAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKK30KKyN1bmRlZiBTV0lUQ0hfSURfTElTVAorCisvLyBGaWxsIHRoZSBjaHVuayB3aXRoIHRoZSBnaXZlbiBkYXRhIChpbmNsdWRlcyBjaHVuayBoZWFkZXIgYnl0ZXMpLCBhZnRlciBzb21lCisvLyB2ZXJpZmljYXRpb25zLgorc3RhdGljIFdlYlBNdXhFcnJvciBDaHVua1ZlcmlmeUFuZEFzc2lnbihXZWJQQ2h1bmsqIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLCBpbnQgY29weV9kYXRhKSB7CisgIHVpbnQzMl90IGNodW5rX3NpemU7CisgIFdlYlBEYXRhIGNodW5rX2RhdGE7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKGRhdGFfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBOworICBjaHVua19zaXplID0gR2V0TEUzMihkYXRhICsgVEFHX1NJWkUpOworCisgIHsKKyAgICBjb25zdCBzaXplX3QgY2h1bmtfZGlza19zaXplID0gU2l6ZVdpdGhQYWRkaW5nKGNodW5rX3NpemUpOworICAgIGlmIChjaHVua19kaXNrX3NpemUgPiByaWZmX3NpemUpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgICBpZiAoY2h1bmtfZGlza19zaXplID4gZGF0YV9zaXplKSByZXR1cm4gV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBOworICB9CisKKyAgLy8gRGF0YSBhc3NpZ25tZW50LgorICBjaHVua19kYXRhLmJ5dGVzID0gZGF0YSArIENIVU5LX0hFQURFUl9TSVpFOworICBjaHVua19kYXRhLnNpemUgPSBjaHVua19zaXplOworICByZXR1cm4gQ2h1bmtBc3NpZ25EYXRhKGNodW5rLCAmY2h1bmtfZGF0YSwgY29weV9kYXRhLCBHZXRMRTMyKGRhdGEgKyAwKSk7Cit9CisKK2ludCBNdXhJbWFnZUZpbmFsaXplKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIGNvbnN0IFdlYlBDaHVuayogY29uc3QgaW1nID0gd3BpLT5pbWdfOworICBjb25zdCBXZWJQRGF0YSogY29uc3QgaW1hZ2UgPSAmaW1nLT5kYXRhXzsKKyAgY29uc3QgaW50IGlzX2xvc3NsZXNzID0gKGltZy0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9WUDhMXS50YWcpOworICBpbnQgdywgaDsKKyAgaW50IHZwOGxfaGFzX2FscGhhID0gMDsKKyAgY29uc3QgaW50IG9rID0gaXNfbG9zc2xlc3MgPworICAgICAgVlA4TEdldEluZm8oaW1hZ2UtPmJ5dGVzLCBpbWFnZS0+c2l6ZSwgJncsICZoLCAmdnA4bF9oYXNfYWxwaGEpIDoKKyAgICAgIFZQOEdldEluZm8oaW1hZ2UtPmJ5dGVzLCBpbWFnZS0+c2l6ZSwgaW1hZ2UtPnNpemUsICZ3LCAmaCk7CisgIGFzc2VydChpbWcgIT0gTlVMTCk7CisgIGlmIChvaykgeworICAgIC8vIElnbm9yZSBBTFBIIGNodW5rIGFjY29tcGFueWluZyBWUDhMLgorICAgIGlmIChpc19sb3NzbGVzcyAmJiAod3BpLT5hbHBoYV8gIT0gTlVMTCkpIHsKKyAgICAgIENodW5rRGVsZXRlKHdwaS0+YWxwaGFfKTsKKyAgICAgIHdwaS0+YWxwaGFfID0gTlVMTDsKKyAgICB9CisgICAgd3BpLT53aWR0aF8gPSB3OworICAgIHdwaS0+aGVpZ2h0XyA9IGg7CisgICAgd3BpLT5oYXNfYWxwaGFfID0gdnA4bF9oYXNfYWxwaGEgfHwgKHdwaS0+YWxwaGFfICE9IE5VTEwpOworICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBNdXhJbWFnZVBhcnNlKGNvbnN0IFdlYlBDaHVuayogY29uc3QgY2h1bmssIGludCBjb3B5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgY29uc3QgdWludDhfdCogYnl0ZXMgPSBjaHVuay0+ZGF0YV8uYnl0ZXM7CisgIHNpemVfdCBzaXplID0gY2h1bmstPmRhdGFfLnNpemU7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGxhc3QgPSBieXRlcyArIHNpemU7CisgIFdlYlBDaHVuayBzdWJjaHVuazsKKyAgc2l6ZV90IHN1YmNodW5rX3NpemU7CisgIENodW5rSW5pdCgmc3ViY2h1bmspOworCisgIGFzc2VydChjaHVuay0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpOworICBhc3NlcnQoIXdwaS0+aXNfcGFydGlhbF8pOworCisgIC8vIEFOTUYuCisgIHsKKyAgICBjb25zdCBzaXplX3QgaGRyX3NpemUgPSBBTk1GX0NIVU5LX1NJWkU7CisgICAgY29uc3QgV2ViUERhdGEgdGVtcCA9IHsgYnl0ZXMsIGhkcl9zaXplIH07CisgICAgLy8gRWFjaCBvZiBBTk1GIGNodW5rIGNvbnRhaW4gYSBoZWFkZXIgYXQgdGhlIGJlZ2lubmluZy4gU28sIGl0cyBzaXplIHNob3VsZAorICAgIC8vIGJlIGF0IGxlYXN0ICdoZHJfc2l6ZScuCisgICAgaWYgKHNpemUgPCBoZHJfc2l6ZSkgZ290byBGYWlsOworICAgIENodW5rQXNzaWduRGF0YSgmc3ViY2h1bmssICZ0ZW1wLCBjb3B5X2RhdGEsIGNodW5rLT50YWdfKTsKKyAgfQorICBDaHVua1NldE50aCgmc3ViY2h1bmssICZ3cGktPmhlYWRlcl8sIDEpOworICB3cGktPmlzX3BhcnRpYWxfID0gMTsgIC8vIFdhaXRpbmcgZm9yIEFMUEggYW5kL29yIFZQOC9WUDhMIGNodW5rcy4KKworICAvLyBSZXN0IG9mIHRoZSBjaHVua3MuCisgIHN1YmNodW5rX3NpemUgPSBDaHVua0Rpc2tTaXplKCZzdWJjaHVuaykgLSBDSFVOS19IRUFERVJfU0laRTsKKyAgYnl0ZXMgKz0gc3ViY2h1bmtfc2l6ZTsKKyAgc2l6ZSAtPSBzdWJjaHVua19zaXplOworCisgIHdoaWxlIChieXRlcyAhPSBsYXN0KSB7CisgICAgQ2h1bmtJbml0KCZzdWJjaHVuayk7CisgICAgaWYgKENodW5rVmVyaWZ5QW5kQXNzaWduKCZzdWJjaHVuaywgYnl0ZXMsIHNpemUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZGF0YSkgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisgICAgc3dpdGNoIChDaHVua0dldElkRnJvbVRhZyhzdWJjaHVuay50YWdfKSkgeworICAgICAgY2FzZSBXRUJQX0NIVU5LX0FMUEhBOgorICAgICAgICBpZiAod3BpLT5hbHBoYV8gIT0gTlVMTCkgZ290byBGYWlsOyAgLy8gQ29uc2VjdXRpdmUgQUxQSCBjaHVua3MuCisgICAgICAgIGlmIChDaHVua1NldE50aCgmc3ViY2h1bmssICZ3cGktPmFscGhhXywgMSkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRmFpbDsKKyAgICAgICAgd3BpLT5pc19wYXJ0aWFsXyA9IDE7ICAvLyBXYWl0aW5nIGZvciBhIFZQOCBjaHVuay4KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfSU1BR0U6CisgICAgICAgIGlmIChDaHVua1NldE50aCgmc3ViY2h1bmssICZ3cGktPmltZ18sIDEpICE9IFdFQlBfTVVYX09LKSBnb3RvIEZhaWw7CisgICAgICAgIGlmICghTXV4SW1hZ2VGaW5hbGl6ZSh3cGkpKSBnb3RvIEZhaWw7CisgICAgICAgIHdwaS0+aXNfcGFydGlhbF8gPSAwOyAgLy8gd3BpIGlzIGNvbXBsZXRlbHkgZmlsbGVkLgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19VTktOT1dOOgorICAgICAgICBpZiAod3BpLT5pc19wYXJ0aWFsXykgZ290byBGYWlsOyAgLy8gRW5jb3VudGVyZWQgYW4gdW5rbm93biBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWUgaW1hZ2UgY2h1bmtzLgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJnN1YmNodW5rLCAmd3BpLT51bmtub3duXywgMCkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRmFpbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdWJjaHVua19zaXplID0gQ2h1bmtEaXNrU2l6ZSgmc3ViY2h1bmspOworICAgIGJ5dGVzICs9IHN1YmNodW5rX3NpemU7CisgICAgc2l6ZSAtPSBzdWJjaHVua19zaXplOworICB9CisgIGlmICh3cGktPmlzX3BhcnRpYWxfKSBnb3RvIEZhaWw7CisgIHJldHVybiAxOworCisgRmFpbDoKKyAgQ2h1bmtSZWxlYXNlKCZzdWJjaHVuayk7CisgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ3JlYXRlIGEgbXV4IG9iamVjdCBmcm9tIFdlYlAtUklGRiBkYXRhLgorCitXZWJQTXV4KiBXZWJQTXV4Q3JlYXRlSW50ZXJuYWwoY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwgaW50IGNvcHlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgeworICBzaXplX3QgcmlmZl9zaXplOworICB1aW50MzJfdCB0YWc7CisgIGNvbnN0IHVpbnQ4X3QqIGVuZDsKKyAgV2ViUE11eCogbXV4ID0gTlVMTDsKKyAgV2ViUE11eEltYWdlKiB3cGkgPSBOVUxMOworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3Qgc2l6ZTsKKyAgV2ViUENodW5rIGNodW5rOworICBDaHVua0luaXQoJmNodW5rKTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiBOVUxMOyAgLy8gdmVyc2lvbiBtaXNtYXRjaAorICB9CisgIGlmIChiaXRzdHJlYW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgZGF0YSA9IGJpdHN0cmVhbS0+Ynl0ZXM7CisgIHNpemUgPSBiaXRzdHJlYW0tPnNpemU7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGlmIChzaXplIDwgUklGRl9IRUFERVJfU0laRSkgcmV0dXJuIE5VTEw7CisgIGlmIChHZXRMRTMyKGRhdGEgKyAwKSAhPSBNS0ZPVVJDQygnUicsICdJJywgJ0YnLCAnRicpIHx8CisgICAgICBHZXRMRTMyKGRhdGEgKyBDSFVOS19IRUFERVJfU0laRSkgIT0gTUtGT1VSQ0MoJ1cnLCAnRScsICdCJywgJ1AnKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbXV4ID0gV2ViUE11eE5ldygpOworICBpZiAobXV4ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIGlmIChzaXplIDwgUklGRl9IRUFERVJfU0laRSArIFRBR19TSVpFKSBnb3RvIEVycjsKKworICB0YWcgPSBHZXRMRTMyKGRhdGEgKyBSSUZGX0hFQURFUl9TSVpFKTsKKyAgaWYgKHRhZyAhPSBrQ2h1bmtzW0lEWF9WUDhdLnRhZyAmJgorICAgICAgdGFnICE9IGtDaHVua3NbSURYX1ZQOExdLnRhZyAmJgorICAgICAgdGFnICE9IGtDaHVua3NbSURYX1ZQOFhdLnRhZykgeworICAgIGdvdG8gRXJyOyAgLy8gRmlyc3QgY2h1bmsgc2hvdWxkIGJlIFZQOCwgVlA4TCBvciBWUDhYLgorICB9CisKKyAgcmlmZl9zaXplID0gU2l6ZVdpdGhQYWRkaW5nKEdldExFMzIoZGF0YSArIFRBR19TSVpFKSk7CisgIGlmIChyaWZmX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCB8fCByaWZmX3NpemUgPiBzaXplKSB7CisgICAgZ290byBFcnI7CisgIH0gZWxzZSB7CisgICAgaWYgKHJpZmZfc2l6ZSA8IHNpemUpIHsgIC8vIFJlZHVuZGFudCBkYXRhIGFmdGVyIGxhc3QgY2h1bmsuCisgICAgICBzaXplID0gcmlmZl9zaXplOyAgLy8gVG8gbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgYW55IGRhdGEgYmV5b25kIG11eF9zaXplLgorICAgIH0KKyAgfQorCisgIGVuZCA9IGRhdGEgKyBzaXplOworICBkYXRhICs9IFJJRkZfSEVBREVSX1NJWkU7CisgIHNpemUgLT0gUklGRl9IRUFERVJfU0laRTsKKworICB3cGkgPSAoV2ViUE11eEltYWdlKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKndwaSkpOworICBpZiAod3BpID09IE5VTEwpIGdvdG8gRXJyOworICBNdXhJbWFnZUluaXQod3BpKTsKKworICAvLyBMb29wIG92ZXIgY2h1bmtzLgorICB3aGlsZSAoZGF0YSAhPSBlbmQpIHsKKyAgICBzaXplX3QgZGF0YV9zaXplOworICAgIFdlYlBDaHVua0lkIGlkOworICAgIFdlYlBDaHVuayoqIGNodW5rX2xpc3Q7CisgICAgaWYgKENodW5rVmVyaWZ5QW5kQXNzaWduKCZjaHVuaywgZGF0YSwgc2l6ZSwgcmlmZl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2RhdGEpICE9IFdFQlBfTVVYX09LKSB7CisgICAgICBnb3RvIEVycjsKKyAgICB9CisgICAgZGF0YV9zaXplID0gQ2h1bmtEaXNrU2l6ZSgmY2h1bmspOworICAgIGlkID0gQ2h1bmtHZXRJZEZyb21UYWcoY2h1bmsudGFnXyk7CisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBXRUJQX0NIVU5LX0FMUEhBOgorICAgICAgICBpZiAod3BpLT5hbHBoYV8gIT0gTlVMTCkgZ290byBFcnI7ICAvLyBDb25zZWN1dGl2ZSBBTFBIIGNodW5rcy4KKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZjaHVuaywgJndwaS0+YWxwaGFfLCAxKSAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgICAgICAgIHdwaS0+aXNfcGFydGlhbF8gPSAxOyAgLy8gV2FpdGluZyBmb3IgYSBWUDggY2h1bmsuCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXRUJQX0NIVU5LX0lNQUdFOgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJmNodW5rLCAmd3BpLT5pbWdfLCAxKSAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgICAgICAgIGlmICghTXV4SW1hZ2VGaW5hbGl6ZSh3cGkpKSBnb3RvIEVycjsKKyAgICAgICAgd3BpLT5pc19wYXJ0aWFsXyA9IDA7ICAvLyB3cGkgaXMgY29tcGxldGVseSBmaWxsZWQuCisgUHVzaEltYWdlOgorICAgICAgICAvLyBBZGQgdGhpcyB0byBtdXgtPmltYWdlc18gbGlzdC4KKyAgICAgICAgaWYgKE11eEltYWdlUHVzaCh3cGksICZtdXgtPmltYWdlc18pICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgICAgICAgTXV4SW1hZ2VJbml0KHdwaSk7ICAvLyBSZXNldCBmb3IgcmVhZGluZyBuZXh0IGltYWdlLgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19BTk1GOgorICAgICAgICBpZiAod3BpLT5pc19wYXJ0aWFsXykgZ290byBFcnI7ICAvLyBQcmV2aW91cyB3cGkgaXMgc3RpbGwgaW5jb21wbGV0ZS4KKyAgICAgICAgaWYgKCFNdXhJbWFnZVBhcnNlKCZjaHVuaywgY29weV9kYXRhLCB3cGkpKSBnb3RvIEVycjsKKyAgICAgICAgQ2h1bmtSZWxlYXNlKCZjaHVuayk7CisgICAgICAgIGdvdG8gUHVzaEltYWdlOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6ICAvLyBBIG5vbi1pbWFnZSBjaHVuay4KKyAgICAgICAgaWYgKHdwaS0+aXNfcGFydGlhbF8pIGdvdG8gRXJyOyAgLy8gRW5jb3VudGVyZWQgYSBub24taW1hZ2UgY2h1bmsgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldHRpbmcgYWxsIGNodW5rcyBvZiBhbiBpbWFnZS4KKyAgICAgICAgY2h1bmtfbGlzdCA9IE11eEdldENodW5rTGlzdEZyb21JZChtdXgsIGlkKTsgIC8vIExpc3QgdG8gYWRkIHRoaXMgY2h1bmsuCisgICAgICAgIGlmIChDaHVua1NldE50aCgmY2h1bmssIGNodW5rX2xpc3QsIDApICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgICAgICAgaWYgKGlkID09IFdFQlBfQ0hVTktfVlA4WCkgeyAgLy8gZ3JhYiBnbG9iYWwgc3BlY3MKKyAgICAgICAgICBtdXgtPmNhbnZhc193aWR0aF8gPSBHZXRMRTI0KGRhdGEgKyAxMikgKyAxOworICAgICAgICAgIG11eC0+Y2FudmFzX2hlaWdodF8gPSBHZXRMRTI0KGRhdGEgKyAxNSkgKyAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkYXRhICs9IGRhdGFfc2l6ZTsKKyAgICBzaXplIC09IGRhdGFfc2l6ZTsKKyAgICBDaHVua0luaXQoJmNodW5rKTsKKyAgfQorCisgIC8vIEluY29tcGxldGUgaW1hZ2UuCisgIGlmICh3cGktPmlzX3BhcnRpYWxfKSBnb3RvIEVycjsKKworICAvLyBWYWxpZGF0ZSBtdXggaWYgY29tcGxldGUuCisgIGlmIChNdXhWYWxpZGF0ZShtdXgpICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICBNdXhJbWFnZURlbGV0ZSh3cGkpOworICByZXR1cm4gbXV4OyAgLy8gQWxsIE9LOworCisgRXJyOiAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKyAgQ2h1bmtSZWxlYXNlKCZjaHVuayk7CisgIE11eEltYWdlRGVsZXRlKHdwaSk7CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZXQgQVBJKHMpLgorCisvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4gbXV4IGhhcyBhIHNpbmdsZSBpbWFnZS4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgVmFsaWRhdGVGb3JTaW5nbGVJbWFnZShjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgY29uc3QgaW50IG51bV9pbWFnZXMgPSBNdXhJbWFnZUNvdW50KG11eC0+aW1hZ2VzXywgV0VCUF9DSFVOS19JTUFHRSk7CisgIGNvbnN0IGludCBudW1fZnJhbWVzID0gTXV4SW1hZ2VDb3VudChtdXgtPmltYWdlc18sIFdFQlBfQ0hVTktfQU5NRik7CisKKyAgaWYgKG51bV9pbWFnZXMgPT0gMCkgeworICAgIC8vIE5vIGltYWdlcyBpbiBtdXguCisgICAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKKyAgfSBlbHNlIGlmIChudW1faW1hZ2VzID09IDEgJiYgbnVtX2ZyYW1lcyA9PSAwKSB7CisgICAgLy8gVmFsaWQgY2FzZSAoc2luZ2xlIGltYWdlKS4KKyAgICByZXR1cm4gV0VCUF9NVVhfT0s7CisgIH0gZWxzZSB7CisgICAgLy8gRnJhbWUgY2FzZSBPUiBhbiBpbnZhbGlkIG11eC4KKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorfQorCisvLyBHZXQgdGhlIGNhbnZhcyB3aWR0aCwgaGVpZ2h0IGFuZCBmbGFncyBhZnRlciB2YWxpZGF0aW5nIHRoYXQgVlA4WC9WUDgvVlA4TAorLy8gY2h1bmsgYW5kIGNhbnZhcyBzaXplIGFyZSB2YWxpZC4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4R2V0Q2FudmFzSW5mbyhjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIHVpbnQzMl90KiBmbGFncykgeworICBpbnQgdywgaDsKKyAgdWludDMyX3QgZiA9IDA7CisgIFdlYlBEYXRhIGRhdGE7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisKKyAgLy8gQ2hlY2sgaWYgVlA4WCBjaHVuayBpcyBwcmVzZW50LgorICBpZiAoTXV4R2V0KG11eCwgSURYX1ZQOFgsIDEsICZkYXRhKSA9PSBXRUJQX01VWF9PSykgeworICAgIGlmIChkYXRhLnNpemUgPCBWUDhYX0NIVU5LX1NJWkUpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgICBmID0gR2V0TEUzMihkYXRhLmJ5dGVzICsgMCk7CisgICAgdyA9IEdldExFMjQoZGF0YS5ieXRlcyArIDQpICsgMTsKKyAgICBoID0gR2V0TEUyNChkYXRhLmJ5dGVzICsgNykgKyAxOworICB9IGVsc2UgeworICAgIGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpID0gbXV4LT5pbWFnZXNfOworICAgIC8vIEdyYWIgdXNlci1mb3JjZWQgY2FudmFzIHNpemUgYXMgZGVmYXVsdC4KKyAgICB3ID0gbXV4LT5jYW52YXNfd2lkdGhfOworICAgIGggPSBtdXgtPmNhbnZhc19oZWlnaHRfOworICAgIGlmICh3ID09IDAgJiYgaCA9PSAwICYmIFZhbGlkYXRlRm9yU2luZ2xlSW1hZ2UobXV4KSA9PSBXRUJQX01VWF9PSykgeworICAgICAgLy8gc2luZ2xlIGltYWdlIGFuZCBub3QgZm9yY2VkIGNhbnZhcyBzaXplID0+IHVzZSBkaW1lbnNpb24gb2YgZmlyc3QgZnJhbWUKKyAgICAgIGFzc2VydCh3cGkgIT0gTlVMTCk7CisgICAgICB3ID0gd3BpLT53aWR0aF87CisgICAgICBoID0gd3BpLT5oZWlnaHRfOworICAgIH0KKyAgICBpZiAod3BpICE9IE5VTEwpIHsKKyAgICAgIGlmICh3cGktPmhhc19hbHBoYV8pIGYgfD0gQUxQSEFfRkxBRzsKKyAgICB9CisgIH0KKyAgaWYgKHcgKiAodWludDY0X3QpaCA+PSBNQVhfSU1BR0VfQVJFQSkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworCisgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSB3OworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBoOworICBpZiAoZmxhZ3MgIT0gTlVMTCkgKmZsYWdzID0gZjsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEdldENhbnZhc1NpemUoY29uc3QgV2ViUE11eCogbXV4LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBpZiAobXV4ID09IE5VTEwgfHwgd2lkdGggPT0gTlVMTCB8fCBoZWlnaHQgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHJldHVybiBNdXhHZXRDYW52YXNJbmZvKG11eCwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4R2V0RmVhdHVyZXMoY29uc3QgV2ViUE11eCogbXV4LCB1aW50MzJfdCogZmxhZ3MpIHsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IGZsYWdzID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICByZXR1cm4gTXV4R2V0Q2FudmFzSW5mbyhtdXgsIE5VTEwsIE5VTEwsIGZsYWdzKTsKK30KKworc3RhdGljIHVpbnQ4X3QqIEVtaXRWUDhYQ2h1bmsodWludDhfdCogY29uc3QgZHN0LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCB1aW50MzJfdCBmbGFncykgeworICBjb25zdCBzaXplX3QgdnA4eF9zaXplID0gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkU7CisgIGFzc2VydCh3aWR0aCA+PSAxICYmIGhlaWdodCA+PSAxKTsKKyAgYXNzZXJ0KHdpZHRoIDw9IE1BWF9DQU5WQVNfU0laRSAmJiBoZWlnaHQgPD0gTUFYX0NBTlZBU19TSVpFKTsKKyAgYXNzZXJ0KHdpZHRoICogKHVpbnQ2NF90KWhlaWdodCA8IE1BWF9JTUFHRV9BUkVBKTsKKyAgUHV0TEUzMihkc3QsIE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdYJykpOworICBQdXRMRTMyKGRzdCArIFRBR19TSVpFLCBWUDhYX0NIVU5LX1NJWkUpOworICBQdXRMRTMyKGRzdCArIENIVU5LX0hFQURFUl9TSVpFLCBmbGFncyk7CisgIFB1dExFMjQoZHN0ICsgQ0hVTktfSEVBREVSX1NJWkUgKyA0LCB3aWR0aCAtIDEpOworICBQdXRMRTI0KGRzdCArIENIVU5LX0hFQURFUl9TSVpFICsgNywgaGVpZ2h0IC0gMSk7CisgIHJldHVybiBkc3QgKyB2cDh4X3NpemU7Cit9CisKKy8vIEFzc2VtYmxlIGEgc2luZ2xlIGltYWdlIFdlYlAgYml0c3RyZWFtIGZyb20gJ3dwaScuCitzdGF0aWMgV2ViUE11eEVycm9yIFN5bnRoZXNpemVCaXRzdHJlYW0oY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IGJpdHN0cmVhbSkgeworICB1aW50OF90KiBkc3Q7CisKKyAgLy8gQWxsb2NhdGUgZGF0YS4KKyAgY29uc3QgaW50IG5lZWRfdnA4eCA9ICh3cGktPmFscGhhXyAhPSBOVUxMKTsKKyAgY29uc3Qgc2l6ZV90IHZwOHhfc2l6ZSA9IG5lZWRfdnA4eCA/IENIVU5LX0hFQURFUl9TSVpFICsgVlA4WF9DSFVOS19TSVpFIDogMDsKKyAgY29uc3Qgc2l6ZV90IGFscGhhX3NpemUgPSBuZWVkX3ZwOHggPyBDaHVua0Rpc2tTaXplKHdwaS0+YWxwaGFfKSA6IDA7CisgIC8vIE5vdGU6IE5vIG5lZWQgdG8gb3V0cHV0IEFOTUYgY2h1bmsgZm9yIGEgc2luZ2xlIGltYWdlLgorICBjb25zdCBzaXplX3Qgc2l6ZSA9IFJJRkZfSEVBREVSX1NJWkUgKyB2cDh4X3NpemUgKyBhbHBoYV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICBDaHVua0Rpc2tTaXplKHdwaS0+aW1nXyk7CisgIHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZSk7CisgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisKKyAgLy8gTWFpbiBSSUZGIGhlYWRlci4KKyAgZHN0ID0gTXV4RW1pdFJpZmZIZWFkZXIoZGF0YSwgc2l6ZSk7CisKKyAgaWYgKG5lZWRfdnA4eCkgeworICAgIGRzdCA9IEVtaXRWUDhYQ2h1bmsoZHN0LCB3cGktPndpZHRoXywgd3BpLT5oZWlnaHRfLCBBTFBIQV9GTEFHKTsgIC8vIFZQOFguCisgICAgZHN0ID0gQ2h1bmtMaXN0RW1pdCh3cGktPmFscGhhXywgZHN0KTsgICAgICAgLy8gQUxQSC4KKyAgfQorCisgIC8vIEJpdHN0cmVhbS4KKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdCh3cGktPmltZ18sIGRzdCk7CisgIGFzc2VydChkc3QgPT0gZGF0YSArIHNpemUpOworCisgIC8vIE91dHB1dC4KKyAgYml0c3RyZWFtLT5ieXRlcyA9IGRhdGE7CisgIGJpdHN0cmVhbS0+c2l6ZSA9IHNpemU7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhHZXRDaHVuayhjb25zdCBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY2h1bmtfZGF0YSkgeworICBDSFVOS19JTkRFWCBpZHg7CisgIGlmIChtdXggPT0gTlVMTCB8fCBmb3VyY2MgPT0gTlVMTCB8fCBjaHVua19kYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBpZHggPSBDaHVua0dldEluZGV4RnJvbUZvdXJDQyhmb3VyY2MpOworICBpZiAoSXNXUEkoa0NodW5rc1tpZHhdLmlkKSkgeyAgICAgLy8gQW4gaW1hZ2UgY2h1bmsuCisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0gZWxzZSBpZiAoaWR4ICE9IElEWF9VTktOT1dOKSB7ICAvLyBBIGtub3duIGNodW5rIHR5cGUuCisgICAgcmV0dXJuIE11eEdldChtdXgsIGlkeCwgMSwgY2h1bmtfZGF0YSk7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiB1bmtub3duIGNodW5rIHR5cGUuCisgICAgY29uc3QgV2ViUENodW5rKiBjb25zdCBjaHVuayA9CisgICAgICAgIENodW5rU2VhcmNoTGlzdChtdXgtPnVua25vd25fLCAxLCBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoZm91cmNjKSk7CisgICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7CisgICAgKmNodW5rX2RhdGEgPSBjaHVuay0+ZGF0YV87CisgICAgcmV0dXJuIFdFQlBfTVVYX09LOworICB9Cit9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4R2V0SW1hZ2VJbnRlcm5hbChjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBpbmZvKSB7CisgIC8vIFNldCBzb21lIGRlZmF1bHRzIGZvciB1bnJlbGF0ZWQgZmllbGRzLgorICBpbmZvLT54X29mZnNldCA9IDA7CisgIGluZm8tPnlfb2Zmc2V0ID0gMDsKKyAgaW5mby0+ZHVyYXRpb24gPSAxOworICBpbmZvLT5kaXNwb3NlX21ldGhvZCA9IFdFQlBfTVVYX0RJU1BPU0VfTk9ORTsKKyAgaW5mby0+YmxlbmRfbWV0aG9kID0gV0VCUF9NVVhfQkxFTkQ7CisgIC8vIEV4dHJhY3QgZGF0YSBmb3IgcmVsYXRlZCBmaWVsZHMuCisgIGluZm8tPmlkID0gQ2h1bmtHZXRJZEZyb21UYWcod3BpLT5pbWdfLT50YWdfKTsKKyAgcmV0dXJuIFN5bnRoZXNpemVCaXRzdHJlYW0od3BpLCAmaW5mby0+Yml0c3RyZWFtKTsKK30KKworc3RhdGljIFdlYlBNdXhFcnJvciBNdXhHZXRGcmFtZUludGVybmFsKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGZyYW1lKSB7CisgIGNvbnN0IGludCBpc19mcmFtZSA9ICh3cGktPmhlYWRlcl8tPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKTsKKyAgY29uc3QgV2ViUERhdGEqIGZyYW1lX2RhdGE7CisgIGlmICghaXNfZnJhbWUpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICBhc3NlcnQod3BpLT5oZWFkZXJfICE9IE5VTEwpOyAgLy8gQWxyZWFkeSBjaGVja2VkIGJ5IFdlYlBNdXhHZXRGcmFtZSgpLgorICAvLyBHZXQgZnJhbWUgY2h1bmsuCisgIGZyYW1lX2RhdGEgPSAmd3BpLT5oZWFkZXJfLT5kYXRhXzsKKyAgaWYgKGZyYW1lX2RhdGEtPnNpemUgPCBrQ2h1bmtzW0lEWF9BTk1GXS5zaXplKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgIC8vIEV4dHJhY3QgaW5mby4KKyAgZnJhbWUtPnhfb2Zmc2V0ID0gMiAqIEdldExFMjQoZnJhbWVfZGF0YS0+Ynl0ZXMgKyAwKTsKKyAgZnJhbWUtPnlfb2Zmc2V0ID0gMiAqIEdldExFMjQoZnJhbWVfZGF0YS0+Ynl0ZXMgKyAzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4X3QgYml0cyA9IGZyYW1lX2RhdGEtPmJ5dGVzWzE1XTsKKyAgICBmcmFtZS0+ZHVyYXRpb24gPSBHZXRMRTI0KGZyYW1lX2RhdGEtPmJ5dGVzICsgMTIpOworICAgIGZyYW1lLT5kaXNwb3NlX21ldGhvZCA9CisgICAgICAgIChiaXRzICYgMSkgPyBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQgOiBXRUJQX01VWF9ESVNQT1NFX05PTkU7CisgICAgZnJhbWUtPmJsZW5kX21ldGhvZCA9IChiaXRzICYgMikgPyBXRUJQX01VWF9OT19CTEVORCA6IFdFQlBfTVVYX0JMRU5EOworICB9CisgIGZyYW1lLT5pZCA9IENodW5rR2V0SWRGcm9tVGFnKHdwaS0+aGVhZGVyXy0+dGFnXyk7CisgIHJldHVybiBTeW50aGVzaXplQml0c3RyZWFtKHdwaSwgJmZyYW1lLT5iaXRzdHJlYW0pOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEdldEZyYW1lKAorICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgdWludDMyX3QgbnRoLCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSkgeworICBXZWJQTXV4RXJyb3IgZXJyOworICBXZWJQTXV4SW1hZ2UqIHdwaTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAobXV4ID09IE5VTEwgfHwgZnJhbWUgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLy8gR2V0IHRoZSBudGggV2ViUE11eEltYWdlLgorICBlcnIgPSBNdXhJbWFnZUdldE50aCgoY29uc3QgV2ViUE11eEltYWdlKiopJm11eC0+aW1hZ2VzXywgbnRoLCAmd3BpKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBHZXQgZnJhbWUgaW5mby4KKyAgaWYgKHdwaS0+aGVhZGVyXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE11eEdldEltYWdlSW50ZXJuYWwod3BpLCBmcmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE11eEdldEZyYW1lSW50ZXJuYWwod3BpLCBmcmFtZSk7CisgIH0KK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEFuaW1QYXJhbXMqIHBhcmFtcykgeworICBXZWJQRGF0YSBhbmltOworICBXZWJQTXV4RXJyb3IgZXJyOworCisgIGlmIChtdXggPT0gTlVMTCB8fCBwYXJhbXMgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgZXJyID0gTXV4R2V0KG11eCwgSURYX0FOSU0sIDEsICZhbmltKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKGFuaW0uc2l6ZSA8IGtDaHVua3NbV0VCUF9DSFVOS19BTklNXS5zaXplKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgIHBhcmFtcy0+Ymdjb2xvciA9IEdldExFMzIoYW5pbS5ieXRlcyk7CisgIHBhcmFtcy0+bG9vcF9jb3VudCA9IEdldExFMTYoYW5pbS5ieXRlcyArIDQpOworCisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8gR2V0IGNodW5rIGluZGV4IGZyb20gY2h1bmsgaWQuIFJldHVybnMgSURYX05JTCBpZiBub3QgZm91bmQuCitzdGF0aWMgQ0hVTktfSU5ERVggQ2h1bmtHZXRJbmRleEZyb21JZChXZWJQQ2h1bmtJZCBpZCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsga0NodW5rc1tpXS5pZCAhPSBXRUJQX0NIVU5LX05JTDsgKytpKSB7CisgICAgaWYgKGlkID09IGtDaHVua3NbaV0uaWQpIHJldHVybiAoQ0hVTktfSU5ERVgpaTsKKyAgfQorICByZXR1cm4gSURYX05JTDsKK30KKworLy8gQ291bnQgbnVtYmVyIG9mIGNodW5rcyBtYXRjaGluZyAndGFnJyBpbiB0aGUgJ2NodW5rX2xpc3QnLgorLy8gSWYgdGFnID09IE5JTF9UQUcsIGFueSB0YWcgd2lsbCBiZSBtYXRjaGVkLgorc3RhdGljIGludCBDb3VudENodW5rcyhjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rX2xpc3QsIHVpbnQzMl90IHRhZykgeworICBpbnQgY291bnQgPSAwOworICBjb25zdCBXZWJQQ2h1bmsqIGN1cnJlbnQ7CisgIGZvciAoY3VycmVudCA9IGNodW5rX2xpc3Q7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHRfKSB7CisgICAgaWYgKHRhZyA9PSBOSUxfVEFHIHx8IGN1cnJlbnQtPnRhZ18gPT0gdGFnKSB7CisgICAgICBjb3VudCsrOyAgLy8gQ291bnQgY2h1bmtzIHdob3NlIHRhZ3MgbWF0Y2guCisgICAgfQorICB9CisgIHJldHVybiBjb3VudDsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhOdW1DaHVua3MoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSWQgaWQsIGludCogbnVtX2VsZW1lbnRzKSB7CisgIGlmIChtdXggPT0gTlVMTCB8fCBudW1fZWxlbWVudHMgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgaWYgKElzV1BJKGlkKSkgeworICAgICpudW1fZWxlbWVudHMgPSBNdXhJbWFnZUNvdW50KG11eC0+aW1hZ2VzXywgaWQpOworICB9IGVsc2UgeworICAgIFdlYlBDaHVuayogY29uc3QqIGNodW5rX2xpc3QgPSBNdXhHZXRDaHVua0xpc3RGcm9tSWQobXV4LCBpZCk7CisgICAgY29uc3QgQ0hVTktfSU5ERVggaWR4ID0gQ2h1bmtHZXRJbmRleEZyb21JZChpZCk7CisgICAgKm51bV9lbGVtZW50cyA9IENvdW50Q2h1bmtzKCpjaHVua19saXN0LCBrQ2h1bmtzW2lkeF0udGFnKTsKKyAgfQorCisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmIwZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTEgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbm9pbnN0X0xUTElCUkFSSUVTID0gbGlid2VicHV0aWxzLmxhCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIG5vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwdXRpbHNkZWNvZGUubGEKK2VuZGlmCisKK2NvbW1vbl9IRUFERVJTID0gLi4vd2VicC90eXBlcy5oCitjb21tb25kaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKKworbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vZHNwL2RzcC5oCitub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2RlY29kZS5oCitub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2VuY29kZS5oCitub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitDT01NT05fU09VUkNFUyA9CitDT01NT05fU09VUkNFUyArPSBiaXRfcmVhZGVyX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGJpdF9yZWFkZXJfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gYml0X3JlYWRlcl9pbmxfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gY29sb3JfY2FjaGVfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gY29sb3JfY2FjaGVfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gZW5kaWFuX2lubF91dGlscy5oCitDT01NT05fU09VUkNFUyArPSBmaWx0ZXJzX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGZpbHRlcnNfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gaHVmZm1hbl91dGlscy5jCitDT01NT05fU09VUkNFUyArPSBodWZmbWFuX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHF1YW50X2xldmVsc19kZWNfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oCitDT01NT05fU09VUkNFUyArPSByZXNjYWxlcl91dGlscy5jCitDT01NT05fU09VUkNFUyArPSByZXNjYWxlcl91dGlscy5oCitDT01NT05fU09VUkNFUyArPSByYW5kb21fdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gcmFuZG9tX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHRocmVhZF91dGlscy5jCitDT01NT05fU09VUkNFUyArPSB0aHJlYWRfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gdXRpbHMuaAorCitFTkNfU09VUkNFUyA9CitFTkNfU09VUkNFUyArPSBiaXRfd3JpdGVyX3V0aWxzLmMKK0VOQ19TT1VSQ0VTICs9IGJpdF93cml0ZXJfdXRpbHMuaAorRU5DX1NPVVJDRVMgKz0gaHVmZm1hbl9lbmNvZGVfdXRpbHMuYworRU5DX1NPVVJDRVMgKz0gaHVmZm1hbl9lbmNvZGVfdXRpbHMuaAorRU5DX1NPVVJDRVMgKz0gcXVhbnRfbGV2ZWxzX3V0aWxzLmMKK0VOQ19TT1VSQ0VTICs9IHF1YW50X2xldmVsc191dGlscy5oCisKK2xpYndlYnB1dGlsc19sYV9TT1VSQ0VTID0gJChDT01NT05fU09VUkNFUykgJChFTkNfU09VUkNFUykKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbGlid2VicHV0aWxzZGVjb2RlX2xhX1NPVVJDRVMgPSAkKENPTU1PTl9TT1VSQ0VTKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MGEzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oCkBAIC0wLDAgKzEsMTkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BlY2lmaWMgaW5saW5lZCBtZXRob2RzIGZvciBib29sZWFuIGRlY29kZXIgW1ZQOEdldEJpdCgpIC4uLl0KKy8vIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgYnkgdGhlIC5jIHNvdXJjZXMgdGhhdCBhY3R1YWxseSBuZWVkIHRvIGNhbGwKKy8vIHRoZXNlIG1ldGhvZHMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSU5MX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfQklUX1JFQURFUl9JTkxfVVRJTFNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gZm9yIG1lbWNweQorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVyaXZlZCB0eXBlIGxiaXRfdCA9IG5hdHVyYWwgdHlwZSBmb3IgbWVtb3J5IEkvTworCisjaWYgICAoQklUUyA+IDMyKQordHlwZWRlZiB1aW50NjRfdCBsYml0X3Q7CisjZWxpZiAoQklUUyA+IDE2KQordHlwZWRlZiB1aW50MzJfdCBsYml0X3Q7CisjZWxpZiAoQklUUyA+ICA4KQordHlwZWRlZiB1aW50MTZfdCBsYml0X3Q7CisjZWxzZQordHlwZWRlZiB1aW50OF90IGxiaXRfdDsKKyNlbmRpZgorCitleHRlcm4gY29uc3QgdWludDhfdCBrVlA4TG9nMlJhbmdlWzEyOF07CitleHRlcm4gY29uc3QgdWludDhfdCBrVlA4TmV3UmFuZ2VbMTI4XTsKKworLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgdGFpbCBieXRlLXJlYWRpbmcKK3ZvaWQgVlA4TG9hZEZpbmFsQnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbmxpbmVkIGNyaXRpY2FsIGZ1bmN0aW9ucworCisvLyBtYWtlcyBzdXJlIGJyLT52YWx1ZV8gaGFzIGF0IGxlYXN0IEJJVFMgYml0cyB3b3J0aCBvZiBkYXRhCitzdGF0aWMgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYgV0VCUF9JTkxJTkUKK3ZvaWQgVlA4TG9hZE5ld0J5dGVzKFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgU0JfRENIRUNLKGJyICE9IE5VTEwgJiYgYnItPmJ1Zl8gIT0gTlVMTCk7CisgIC8vIFJlYWQgJ0JJVFMnIGJpdHMgYXQgYSB0aW1lIGlmIHBvc3NpYmxlLgorICBpZiAoYnItPmJ1Zl8gPCBici0+YnVmX21heF8pIHsKKyAgICAvLyBjb252ZXJ0IG1lbW9yeSB0eXBlIHRvIHJlZ2lzdGVyIHR5cGUgKHdpdGggc29tZSB6ZXJvJ2luZyEpCisgICAgYml0X3QgYml0czsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHVuLWFsaWduZWQgcmVhZC4KKyAgICBsYml0X3QgaW5fYml0czsKKyAgICBsYml0X3QqIHBfYnVmXyA9IChsYml0X3QqKWJyLT5idWZfOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAiLnNldCAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIG1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAidWx3ICAgICVbaW5fYml0c10sIDAoJVtwX2J1Zl9dKSAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFtpbl9iaXRzXSI9ciIoaW5fYml0cykKKyAgICAgIDogW3BfYnVmX10iciIocF9idWZfKQorICAgICAgOiAibWVtb3J5IiwgImF0IgorICAgICk7CisjZWxzZQorICAgIGxiaXRfdCBpbl9iaXRzOworICAgIFNiTWVtb3J5Q29weSgmaW5fYml0cywgYnItPmJ1Zl8sIHNpemVvZihpbl9iaXRzKSk7CisjZW5kaWYKKyAgICBici0+YnVmXyArPSBCSVRTID4+IDM7CisjaWYgIWRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorI2lmIChCSVRTID4gMzIpCisgICAgYml0cyA9IEJTd2FwNjQoaW5fYml0cyk7CisgICAgYml0cyA+Pj0gNjQgLSBCSVRTOworI2VsaWYgKEJJVFMgPj0gMjQpCisgICAgYml0cyA9IEJTd2FwMzIoaW5fYml0cyk7CisgICAgYml0cyA+Pj0gKDMyIC0gQklUUyk7CisjZWxpZiAoQklUUyA9PSAxNikKKyAgICBiaXRzID0gQlN3YXAxNihpbl9iaXRzKTsKKyNlbHNlICAgLy8gQklUUyA9PSA4CisgICAgYml0cyA9IChiaXRfdClpbl9iaXRzOworI2VuZGlmICAvLyBCSVRTID4gMzIKKyNlbHNlICAgIC8vIFdPUkRTX0JJR0VORElBTgorICAgIGJpdHMgPSAoYml0X3QpaW5fYml0czsKKyAgICBpZiAoQklUUyAhPSA4ICogc2l6ZW9mKGJpdF90KSkgYml0cyA+Pj0gKDggKiBzaXplb2YoYml0X3QpIC0gQklUUyk7CisjZW5kaWYKKyAgICBici0+dmFsdWVfID0gYml0cyB8IChici0+dmFsdWVfIDw8IEJJVFMpOworICAgIGJyLT5iaXRzXyArPSBCSVRTOworICB9IGVsc2UgeworICAgIFZQOExvYWRGaW5hbEJ5dGVzKGJyKTsgICAgLy8gbm8gbmVlZCB0byBiZSBpbmxpbmVkCisgIH0KK30KKworLy8gUmVhZCBhIGJpdCB3aXRoIHByb2JhICdwcm9iJy4gU3BlZWQtY3JpdGljYWwgZnVuY3Rpb24hCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldEJpdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgcHJvYikgeworICAvLyBEb24ndCBtb3ZlIHRoaXMgZGVjbGFyYXRpb24hIEl0IG1ha2VzIGEgYmlnIHNwZWVkIGRpZmZlcmVuY2UgdG8gc3RvcmUKKyAgLy8gJ3JhbmdlJyAqYmVmb3JlKiBjYWxsaW5nIFZQOExvYWROZXdCeXRlcygpLCBldmVuIGlmIHRoaXMgZnVuY3Rpb24gZG9lc24ndAorICAvLyBhbHRlciBici0+cmFuZ2VfIHZhbHVlLgorICByYW5nZV90IHJhbmdlID0gYnItPnJhbmdlXzsKKyAgaWYgKGJyLT5iaXRzXyA8IDApIHsKKyAgICBWUDhMb2FkTmV3Qnl0ZXMoYnIpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgcG9zID0gYnItPmJpdHNfOworICAgIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAocmFuZ2UgKiBwcm9iKSA+PiA4OworICAgIGNvbnN0IHJhbmdlX3QgdmFsdWUgPSAocmFuZ2VfdCkoYnItPnZhbHVlXyA+PiBwb3MpOworICAgIGNvbnN0IGludCBiaXQgPSAodmFsdWUgPiBzcGxpdCk7CisgICAgaWYgKGJpdCkgeworICAgICAgcmFuZ2UgLT0gc3BsaXQ7CisgICAgICBici0+dmFsdWVfIC09IChiaXRfdCkoc3BsaXQgKyAxKSA8PCBwb3M7CisgICAgfSBlbHNlIHsKKyAgICAgIHJhbmdlID0gc3BsaXQgKyAxOworICAgIH0KKyAgICB7CisgICAgICBjb25zdCBpbnQgc2hpZnQgPSA3IF4gQml0c0xvZzJGbG9vcihyYW5nZSk7CisgICAgICByYW5nZSA8PD0gc2hpZnQ7CisgICAgICBici0+Yml0c18gLT0gc2hpZnQ7CisgICAgfQorICAgIGJyLT5yYW5nZV8gPSByYW5nZSAtIDE7CisgICAgcmV0dXJuIGJpdDsKKyAgfQorfQorCisvLyBzaW1wbGlmaWVkIHZlcnNpb24gb2YgVlA4R2V0Qml0KCkgZm9yIHByb2I9MHg4MCAobm90ZSBzaGlmdCBpcyBhbHdheXMgMSBoZXJlKQorc3RhdGljIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XIFdFQlBfSU5MSU5FCitpbnQgVlA4R2V0U2lnbmVkKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2KSB7CisgIGlmIChici0+Yml0c18gPCAwKSB7CisgICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IHBvcyA9IGJyLT5iaXRzXzsKKyAgICBjb25zdCByYW5nZV90IHNwbGl0ID0gYnItPnJhbmdlXyA+PiAxOworICAgIGNvbnN0IHJhbmdlX3QgdmFsdWUgPSAocmFuZ2VfdCkoYnItPnZhbHVlXyA+PiBwb3MpOworICAgIGNvbnN0IGludDMyX3QgbWFzayA9IChpbnQzMl90KShzcGxpdCAtIHZhbHVlKSA+PiAzMTsgIC8vIC0xIG9yIDAKKyAgICBici0+Yml0c18gLT0gMTsKKyAgICBici0+cmFuZ2VfICs9IG1hc2s7CisgICAgYnItPnJhbmdlXyB8PSAxOworICAgIGJyLT52YWx1ZV8gLT0gKGJpdF90KSgoc3BsaXQgKyAxKSAmIG1hc2spIDw8IHBvczsKKyAgICByZXR1cm4gKHYgXiBtYXNrKSAtIG1hc2s7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXRBbHQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpIHsKKyAgLy8gRG9uJ3QgbW92ZSB0aGlzIGRlY2xhcmF0aW9uISBJdCBtYWtlcyBhIGJpZyBzcGVlZCBkaWZmZXJlbmNlIHRvIHN0b3JlCisgIC8vICdyYW5nZScgKmJlZm9yZSogY2FsbGluZyBWUDhMb2FkTmV3Qnl0ZXMoKSwgZXZlbiBpZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAgLy8gYWx0ZXIgYnItPnJhbmdlXyB2YWx1ZS4KKyAgcmFuZ2VfdCByYW5nZSA9IGJyLT5yYW5nZV87CisgIGlmIChici0+Yml0c18gPCAwKSB7CisgICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IHBvcyA9IGJyLT5iaXRzXzsKKyAgICBjb25zdCByYW5nZV90IHNwbGl0ID0gKHJhbmdlICogcHJvYikgPj4gODsKKyAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKKyAgICBpbnQgYml0OyAgLy8gRG9uJ3QgdXNlICdjb25zdCBpbnQgYml0ID0gKHZhbHVlID4gc3BsaXQpOyIsIGl0J3Mgc2xvd2VyLgorICAgIGlmICh2YWx1ZSA+IHNwbGl0KSB7CisgICAgICByYW5nZSAtPSBzcGxpdCArIDE7CisgICAgICBici0+dmFsdWVfIC09IChiaXRfdCkoc3BsaXQgKyAxKSA8PCBwb3M7CisgICAgICBiaXQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICByYW5nZSA9IHNwbGl0OworICAgICAgYml0ID0gMDsKKyAgICB9CisgICAgaWYgKHJhbmdlIDw9IChyYW5nZV90KTB4N2UpIHsKKyAgICAgIGNvbnN0IGludCBzaGlmdCA9IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdOworICAgICAgcmFuZ2UgPSBrVlA4TmV3UmFuZ2VbcmFuZ2VdOworICAgICAgYnItPmJpdHNfIC09IHNoaWZ0OworICAgIH0KKyAgICBici0+cmFuZ2VfID0gcmFuZ2U7CisgICAgcmV0dXJuIGJpdDsKKyAgfQorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgIC8vIFdFQlBfVVRJTFNfQklUX1JFQURFUl9JTkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmJlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5jCkBAIC0wLDAgKzEsMjI2IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQm9vbGVhbiBkZWNvZGVyIG5vbi1pbmxpbmVkIG1ldGhvZHMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOEJpdFJlYWRlcgorCit2b2lkIFZQOEJpdFJlYWRlclNldEJ1ZmZlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICBici0+YnVmXyAgICAgPSBzdGFydDsKKyAgYnItPmJ1Zl9lbmRfID0gc3RhcnQgKyBzaXplOworICBici0+YnVmX21heF8gPQorICAgICAgKHNpemUgPj0gc2l6ZW9mKGxiaXRfdCkpID8gc3RhcnQgKyBzaXplIC0gc2l6ZW9mKGxiaXRfdCkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGFydDsKK30KKwordm9pZCBWUDhJbml0Qml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIHNpemVfdCBzaXplKSB7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KHN0YXJ0ICE9IE5VTEwpOworICBhc3NlcnQoc2l6ZSA8ICgxdSA8PCAzMSkpOyAgIC8vIGxpbWl0IGVuc3VyZWQgYnkgZm9ybWF0IGFuZCB1cHN0cmVhbSBjaGVja3MKKyAgYnItPnJhbmdlXyAgID0gMjU1IC0gMTsKKyAgYnItPnZhbHVlXyAgID0gMDsKKyAgYnItPmJpdHNfICAgID0gLTg7ICAgLy8gdG8gbG9hZCB0aGUgdmVyeSBmaXJzdCA4Yml0cworICBici0+ZW9mXyAgICAgPSAwOworICBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoYnIsIHN0YXJ0LCBzaXplKTsKKyAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKK30KKwordm9pZCBWUDhSZW1hcEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBwdHJkaWZmX3Qgb2Zmc2V0KSB7CisgIGlmIChici0+YnVmXyAhPSBOVUxMKSB7CisgICAgYnItPmJ1Zl8gKz0gb2Zmc2V0OworICAgIGJyLT5idWZfZW5kXyArPSBvZmZzZXQ7CisgICAgYnItPmJ1Zl9tYXhfICs9IG9mZnNldDsKKyAgfQorfQorCitjb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XSA9IHsKKyAgICAgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMAorfTsKKworLy8gcmFuZ2UgPSAoKHJhbmdlIC0gMSkgPDwga1ZQOExvZzJSYW5nZVtyYW5nZV0pICsgMQorY29uc3QgdWludDhfdCBrVlA4TmV3UmFuZ2VbMTI4XSA9IHsKKyAgMTI3LCAxMjcsIDE5MSwgMTI3LCAxNTksIDE5MSwgMjIzLCAxMjcsCisgIDE0MywgMTU5LCAxNzUsIDE5MSwgMjA3LCAyMjMsIDIzOSwgMTI3LAorICAxMzUsIDE0MywgMTUxLCAxNTksIDE2NywgMTc1LCAxODMsIDE5MSwKKyAgMTk5LCAyMDcsIDIxNSwgMjIzLCAyMzEsIDIzOSwgMjQ3LCAxMjcsCisgIDEzMSwgMTM1LCAxMzksIDE0MywgMTQ3LCAxNTEsIDE1NSwgMTU5LAorICAxNjMsIDE2NywgMTcxLCAxNzUsIDE3OSwgMTgzLCAxODcsIDE5MSwKKyAgMTk1LCAxOTksIDIwMywgMjA3LCAyMTEsIDIxNSwgMjE5LCAyMjMsCisgIDIyNywgMjMxLCAyMzUsIDIzOSwgMjQzLCAyNDcsIDI1MSwgMTI3LAorICAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywKKyAgMTQ1LCAxNDcsIDE0OSwgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksCisgIDE2MSwgMTYzLCAxNjUsIDE2NywgMTY5LCAxNzEsIDE3MywgMTc1LAorICAxNzcsIDE3OSwgMTgxLCAxODMsIDE4NSwgMTg3LCAxODksIDE5MSwKKyAgMTkzLCAxOTUsIDE5NywgMTk5LCAyMDEsIDIwMywgMjA1LCAyMDcsCisgIDIwOSwgMjExLCAyMTMsIDIxNSwgMjE3LCAyMTksIDIyMSwgMjIzLAorICAyMjUsIDIyNywgMjI5LCAyMzEsIDIzMywgMjM1LCAyMzcsIDIzOSwKKyAgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDksIDI1MSwgMjUzLCAxMjcKK307CisKK3ZvaWQgVlA4TG9hZEZpbmFsQnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgeworICBhc3NlcnQoYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKKyAgLy8gT25seSByZWFkIDhiaXRzIGF0IGEgdGltZQorICBpZiAoYnItPmJ1Zl8gPCBici0+YnVmX2VuZF8pIHsKKyAgICBici0+Yml0c18gKz0gODsKKyAgICBici0+dmFsdWVfID0gKGJpdF90KSgqYnItPmJ1Zl8rKykgfCAoYnItPnZhbHVlXyA8PCA4KTsKKyAgfSBlbHNlIGlmICghYnItPmVvZl8pIHsKKyAgICBici0+dmFsdWVfIDw8PSA4OworICAgIGJyLT5iaXRzXyArPSA4OworICAgIGJyLT5lb2ZfID0gMTsKKyAgfSBlbHNlIHsKKyAgICBici0+Yml0c18gPSAwOyAgLy8gVGhpcyBpcyB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdpdGggc2hpZnRzLgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaWdoZXItbGV2ZWwgY2FsbHMKKwordWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKKyAgdWludDMyX3QgdiA9IDA7CisgIHdoaWxlIChiaXRzLS0gPiAwKSB7CisgICAgdiB8PSBWUDhHZXRCaXQoYnIsIDB4ODApIDw8IGJpdHM7CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKK2ludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKKyAgY29uc3QgaW50IHZhbHVlID0gVlA4R2V0VmFsdWUoYnIsIGJpdHMpOworICByZXR1cm4gVlA4R2V0KGJyKSA/IC12YWx1ZSA6IHZhbHVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFJlYWRlcgorCisjZGVmaW5lIFZQOExfTE9HOF9XQklUUyA0ICAvLyBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIFZQOExfV0JJVFMgYml0cy4KKworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KQorI2RlZmluZSBWUDhMX1VTRV9GQVNUX0xPQUQKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0JpdE1hc2tbVlA4TF9NQVhfTlVNX0JJVF9SRUFEICsgMV0gPSB7CisgIDAsCisgIDB4MDAwMDAxLCAweDAwMDAwMywgMHgwMDAwMDcsIDB4MDAwMDBmLAorICAweDAwMDAxZiwgMHgwMDAwM2YsIDB4MDAwMDdmLCAweDAwMDBmZiwKKyAgMHgwMDAxZmYsIDB4MDAwM2ZmLCAweDAwMDdmZiwgMHgwMDBmZmYsCisgIDB4MDAxZmZmLCAweDAwM2ZmZiwgMHgwMDdmZmYsIDB4MDBmZmZmLAorICAweDAxZmZmZiwgMHgwM2ZmZmYsIDB4MDdmZmZmLCAweDBmZmZmZiwKKyAgMHgxZmZmZmYsIDB4M2ZmZmZmLCAweDdmZmZmZiwgMHhmZmZmZmYKK307CisKK3ZvaWQgVlA4TEluaXRCaXRSZWFkZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CisgIHNpemVfdCBpOworICB2cDhsX3ZhbF90IHZhbHVlID0gMDsKKyAgYXNzZXJ0KGJyICE9IE5VTEwpOworICBhc3NlcnQoc3RhcnQgIT0gTlVMTCk7CisgIGFzc2VydChsZW5ndGggPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgorCisgIGJyLT5sZW5fID0gbGVuZ3RoOworICBici0+dmFsXyA9IDA7CisgIGJyLT5iaXRfcG9zXyA9IDA7CisgIGJyLT5lb3NfID0gMDsKKworICBpZiAobGVuZ3RoID4gc2l6ZW9mKGJyLT52YWxfKSkgeworICAgIGxlbmd0aCA9IHNpemVvZihici0+dmFsXyk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgdmFsdWUgfD0gKHZwOGxfdmFsX3Qpc3RhcnRbaV0gPDwgKDggKiBpKTsKKyAgfQorICBici0+dmFsXyA9IHZhbHVlOworICBici0+cG9zXyA9IGxlbmd0aDsKKyAgYnItPmJ1Zl8gPSBzdGFydDsKK30KKwordm9pZCBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1Ziwgc2l6ZV90IGxlbikgeworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChidWYgIT0gTlVMTCk7CisgIGFzc2VydChsZW4gPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgorICBici0+YnVmXyA9IGJ1ZjsKKyAgYnItPmxlbl8gPSBsZW47CisgIC8vIHBvc18gPiBsZW5fIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgcGFyYW0gZXJyb3IuCisgIGJyLT5lb3NfID0gKGJyLT5wb3NfID4gYnItPmxlbl8pIHx8IFZQOExJc0VuZE9mU3RyZWFtKGJyKTsKK30KKworc3RhdGljIHZvaWQgVlA4TFNldEVuZE9mU3RyZWFtKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGJyLT5lb3NfID0gMTsKKyAgYnItPmJpdF9wb3NfID0gMDsgIC8vIFRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aCBzaGlmdHMuCit9CisKKy8vIElmIG5vdCBhdCBFT1MsIHJlbG9hZCB1cCB0byBWUDhMX0xCSVRTIGJ5dGUtYnktYnl0ZQorc3RhdGljIHZvaWQgU2hpZnRCeXRlcyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICB3aGlsZSAoYnItPmJpdF9wb3NfID49IDggJiYgYnItPnBvc18gPCBici0+bGVuXykgeworICAgIGJyLT52YWxfID4+PSA4OworICAgIGJyLT52YWxfIHw9ICgodnA4bF92YWxfdClici0+YnVmX1tici0+cG9zX10pIDw8IChWUDhMX0xCSVRTIC0gOCk7CisgICAgKytici0+cG9zXzsKKyAgICBici0+Yml0X3Bvc18gLT0gODsKKyAgfQorICBpZiAoVlA4TElzRW5kT2ZTdHJlYW0oYnIpKSB7CisgICAgVlA4TFNldEVuZE9mU3RyZWFtKGJyKTsKKyAgfQorfQorCit2b2lkIFZQOExEb0ZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgYXNzZXJ0KGJyLT5iaXRfcG9zXyA+PSBWUDhMX1dCSVRTKTsKKyNpZiBkZWZpbmVkKFZQOExfVVNFX0ZBU1RfTE9BRCkKKyAgaWYgKGJyLT5wb3NfICsgc2l6ZW9mKGJyLT52YWxfKSA8IGJyLT5sZW5fKSB7CisgICAgYnItPnZhbF8gPj49IFZQOExfV0JJVFM7CisgICAgYnItPmJpdF9wb3NfIC09IFZQOExfV0JJVFM7CisgICAgYnItPnZhbF8gfD0gKHZwOGxfdmFsX3QpSFRvTEUzMihXZWJQTWVtVG9VaW50MzIoYnItPmJ1Zl8gKyBici0+cG9zXykpIDw8CisgICAgICAgICAgICAgICAgKFZQOExfTEJJVFMgLSBWUDhMX1dCSVRTKTsKKyAgICBici0+cG9zXyArPSBWUDhMX0xPRzhfV0JJVFM7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKyAgU2hpZnRCeXRlcyhicik7ICAgICAgIC8vIFNsb3cgcGF0aC4KK30KKwordWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKSB7CisgIGFzc2VydChuX2JpdHMgPj0gMCk7CisgIC8vIEZsYWcgYW4gZXJyb3IgaWYgZW5kX29mX3N0cmVhbSBvciBuX2JpdHMgaXMgbW9yZSB0aGFuIGFsbG93ZWQgbGltaXQuCisgIGlmICghYnItPmVvc18gJiYgbl9iaXRzIDw9IFZQOExfTUFYX05VTV9CSVRfUkVBRCkgeworICAgIGNvbnN0IHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpICYga0JpdE1hc2tbbl9iaXRzXTsKKyAgICBjb25zdCBpbnQgbmV3X2JpdHMgPSBici0+Yml0X3Bvc18gKyBuX2JpdHM7CisgICAgYnItPmJpdF9wb3NfID0gbmV3X2JpdHM7CisgICAgU2hpZnRCeXRlcyhicik7CisgICAgcmV0dXJuIHZhbDsKKyAgfSBlbHNlIHsKKyAgICBWUDhMU2V0RW5kT2ZTdHJlYW0oYnIpOworICAgIHJldHVybiAwOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU0ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaApAQCAtMCwwICsxLDE4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJvb2xlYW4gZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfQklUX1JFQURFUl9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9SRUFERVJfVVRJTFNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIF9ieXRlc3dhcF91bG9uZworI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gVGhlIEJvb2xlYW4gZGVjb2RlciBuZWVkcyB0byBtYWludGFpbiBpbmZpbml0ZSBwcmVjaXNpb24gb24gdGhlIHZhbHVlXyBmaWVsZC4KKy8vIEhvd2V2ZXIsIHNpbmNlIHJhbmdlXyBpcyBvbmx5IDhiaXQsIHdlIG9ubHkgbmVlZCBhbiBhY3RpdmUgd2luZG93IG9mIDggYml0cworLy8gZm9yIHZhbHVlXy4gTGVmdCBiaXRzIChNU0IpIGdldHMgemVyb2VkIGFuZCBzaGlmdGVkIGF3YXkgd2hlbiB2YWx1ZV8gZmFsbHMKKy8vIGJlbG93IDEyOCwgcmFuZ2VfIGlzIHVwZGF0ZWQsIGFuZCBmcmVzaCBiaXRzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIGFyZQorLy8gYnJvdWdodCBpbiBhcyBMU0IuIFRvIGF2b2lkIHJlYWRpbmcgdGhlIGZyZXNoIGJpdHMgb25lIGJ5IG9uZSAoc2xvdyksIHdlCisvLyBjYWNoZSBCSVRTIG9mIHRoZW0gYWhlYWQuIFRoZSB0b3RhbCBvZiAoQklUUyArIDgpIGJpdHMgbXVzdCBmaXQgaW50byBhCisvLyBuYXR1cmFsIHJlZ2lzdGVyICh3aXRoIHR5cGUgYml0X3QpLiBUbyBmZXRjaCBCSVRTIGJpdHMgZnJvbSBiaXRzdHJlYW0gd2UKKy8vIHVzZSBhIHR5cGUgbGJpdF90LgorLy8KKy8vIEJJVFMgY2FuIGJlIGFueSBtdWx0aXBsZSBvZiA4IGZyb20gOCB0byA1NiAoaW5jbHVzaXZlKS4KKy8vIFBpY2sgdmFsdWVzIHRoYXQgZml0IG5hdHVyYWwgcmVnaXN0ZXIgc2l6ZS4KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgICAgICAvLyB4ODYgMzJiaXQKKyNkZWZpbmUgQklUUyAyNAorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX1g2NCkgICAvLyB4ODYgNjRiaXQKKyNkZWZpbmUgQklUUyA1NgorI2VsaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgICAgICAvLyBBUk0KKyNkZWZpbmUgQklUUyAyNAorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgICAgICAgICAgICAgICAgICAgICAvLyBBUk0gNjRiaXQKKyNkZWZpbmUgQklUUyA1NgorI2VsaWYgZGVmaW5lZChfX21pcHNfXykgICAgICAgICAgICAgICAgICAgICAgICAvLyBNSVBTCisjZGVmaW5lIEJJVFMgMjQKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29uYWJsZSBkZWZhdWx0CisjZGVmaW5lIEJJVFMgMjQKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVyaXZlZCB0eXBlcyBhbmQgY29uc3RhbnRzOgorLy8gICBiaXRfdCA9IG5hdHVyYWwgcmVnaXN0ZXIgdHlwZSBmb3Igc3RvcmluZyAndmFsdWVfJyAod2hpY2ggaXMgQklUUys4IGJpdHMpCisvLyAgIHJhbmdlX3QgPSByZWdpc3RlciBmb3IgJ3JhbmdlXycgKHdoaWNoIGlzIDhiaXRzIG9ubHkpCisKKyNpZiAoQklUUyA+IDI0KQordHlwZWRlZiB1aW50NjRfdCBiaXRfdDsKKyNlbHNlCit0eXBlZGVmIHVpbnQzMl90IGJpdF90OworI2VuZGlmCisKK3R5cGVkZWYgdWludDMyX3QgcmFuZ2VfdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJpdHJlYWRlcgorCit0eXBlZGVmIHN0cnVjdCBWUDhCaXRSZWFkZXIgVlA4Qml0UmVhZGVyOworc3RydWN0IFZQOEJpdFJlYWRlciB7CisgIC8vIGJvb2xlYW4gZGVjb2RlciAgKGtlZXAgdGhlIGZpZWxkIG9yZGVyaW5nIGFzIGlzISkKKyAgYml0X3QgdmFsdWVfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUKKyAgcmFuZ2VfdCByYW5nZV87ICAgICAgICAgICAgIC8vIGN1cnJlbnQgcmFuZ2UgbWludXMgMS4gSW4gWzEyNywgMjU0XSBpbnRlcnZhbC4KKyAgaW50IGJpdHNfOyAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiB2YWxpZCBiaXRzIGxlZnQKKyAgLy8gcmVhZCBidWZmZXIKKyAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIG5leHQgYnl0ZSB0byBiZSByZWFkCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmRfOyAgICAvLyBlbmQgb2YgcmVhZCBidWZmZXIKKyAgY29uc3QgdWludDhfdCogYnVmX21heF87ICAgIC8vIG1heCBwYWNrZWQtcmVhZCBwb3NpdGlvbiBvbiBidWZmZXIKKyAgaW50IGVvZl87ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgaW5wdXQgaXMgZXhoYXVzdGVkCit9OworCisvLyBJbml0aWFsaXplIHRoZSBiaXQgcmVhZGVyIGFuZCB0aGUgYm9vbGVhbiBkZWNvZGVyLgordm9pZCBWUDhJbml0Qml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIHNpemVfdCBzaXplKTsKKy8vIFNldHMgdGhlIHdvcmtpbmcgcmVhZCBidWZmZXIuCit2b2lkIFZQOEJpdFJlYWRlclNldEJ1ZmZlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIHNpemVfdCBzaXplKTsKKworLy8gVXBkYXRlIGludGVybmFsIHBvaW50ZXJzIHRvIGRpc3BsYWNlIHRoZSBieXRlIGJ1ZmZlciBieSB0aGUKKy8vIHJlbGF0aXZlIG9mZnNldCAnb2Zmc2V0Jy4KK3ZvaWQgVlA4UmVtYXBCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgcHRyZGlmZl90IG9mZnNldCk7CisKKy8vIHJldHVybiB0aGUgbmV4dCB2YWx1ZSBtYWRlIG9mICdudW1fYml0cycgYml0cwordWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXQoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgeworICByZXR1cm4gVlA4R2V0VmFsdWUoYnIsIDEpOworfQorCisvLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgd2l0aCBzaWduLWV4dGVuc2lvbi4KK2ludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKKworLy8gYml0X3JlYWRlcl9pbmwuaCB3aWxsIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisvLyAgIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0Qml0KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBwcm9iKQorLy8gICBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldFNpZ25lZChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgdikKKy8vIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQgYnkgdGhlIC5jIGZpbGVzIHRoYXQgYWN0dWFsbHkgbmVlZCB0aGVtLgorLy8gVGhpcyBpcyB0byBhdm9pZCByZWNvbXBpbGluZyB0aGUgd2hvbGUgbGlicmFyeSB3aGVuZXZlciB0aGlzIGZpbGUgaXMgdG91Y2hlZCwKKy8vIGFuZCBhbHNvIGFsbG93aW5nIHBsYXRmb3JtLXNwZWNpZmljIGFkLWhvYyBoYWNrcy4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJpdHJlYWRlciBmb3IgbG9zc2xlc3MgZm9ybWF0CisKKy8vIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgKGluY2x1c2l2ZSkgdGhlIGJpdC1yZWFkZXIgY2FuIGhhbmRsZToKKyNkZWZpbmUgVlA4TF9NQVhfTlVNX0JJVF9SRUFEIDI0CisKKyNkZWZpbmUgVlA4TF9MQklUUyA2NCAgLy8gTnVtYmVyIG9mIGJpdHMgcHJlZmV0Y2hlZCAoPSBiaXQtc2l6ZSBvZiB2cDhsX3ZhbF90KS4KKyNkZWZpbmUgVlA4TF9XQklUUyAzMiAgLy8gTWluaW11bSBudW1iZXIgb2YgYnl0ZXMgcmVhZHkgYWZ0ZXIgVlA4TEZpbGxCaXRXaW5kb3cuCisKK3R5cGVkZWYgdWludDY0X3QgdnA4bF92YWxfdDsgIC8vIHJpZ2h0IG5vdywgdGhpcyBiaXQtcmVhZGVyIGNhbiBvbmx5IHVzZSA2NGJpdC4KKwordHlwZWRlZiBzdHJ1Y3QgeworICB2cDhsX3ZhbF90ICAgICB2YWxfOyAgICAgICAgLy8gcHJlLWZldGNoZWQgYml0cworICBjb25zdCB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW5wdXQgYnl0ZSBidWZmZXIKKyAgc2l6ZV90ICAgICAgICAgbGVuXzsgICAgICAgIC8vIGJ1ZmZlciBsZW5ndGgKKyAgc2l6ZV90ICAgICAgICAgcG9zXzsgICAgICAgIC8vIGJ5dGUgcG9zaXRpb24gaW4gYnVmXworICBpbnQgICAgICAgICAgICBiaXRfcG9zXzsgICAgLy8gY3VycmVudCBiaXQtcmVhZGluZyBwb3NpdGlvbiBpbiB2YWxfCisgIGludCAgICAgICAgICAgIGVvc187ICAgICAgICAvLyB0cnVlIGlmIGEgYml0IHdhcyByZWFkIHBhc3QgdGhlIGVuZCBvZiBidWZmZXIKK30gVlA4TEJpdFJlYWRlcjsKKwordm9pZCBWUDhMSW5pdEJpdFJlYWRlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOworCisvLyAgU2V0cyBhIG5ldyBkYXRhIGJ1ZmZlci4KK3ZvaWQgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCisvLyBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGZyb20gcmVhZCBidWZmZXIuCisvLyBGbGFncyBhbiBlcnJvciBpbiBjYXNlIGVuZF9vZl9zdHJlYW0gb3Igbl9iaXRzIGlzIG1vcmUgdGhhbiB0aGUgYWxsb3dlZCBsaW1pdAorLy8gb2YgVlA4TF9NQVhfTlVNX0JJVF9SRUFEIChpbmNsdXNpdmUpLgorLy8gRmxhZ3MgZW9zXyBpZiB0aGlzIHJlYWQgYXR0ZW1wdCBpcyBnb2luZyB0byBjcm9zcyB0aGUgcmVhZCBidWZmZXIuCit1aW50MzJfdCBWUDhMUmVhZEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCBuX2JpdHMpOworCisvLyBSZXR1cm4gdGhlIHByZWZldGNoZWQgYml0cywgc28gdGhleSBjYW4gYmUgbG9va2VkIHVwLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExQcmVmZXRjaEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoYnItPnZhbF8gPj4gKGJyLT5iaXRfcG9zXyAmIChWUDhMX0xCSVRTIC0gMSkpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBhdHRlbXB0IGF0IHJlYWRpbmcgYml0IHBhc3QgdGhlIGVuZCBvZgorLy8gdGhlIGJ1ZmZlci4gRG9lc24ndCBzZXQgYnItPmVvc18gZmxhZy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TElzRW5kT2ZTdHJlYW0oY29uc3QgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgU0JfRENIRUNLKGJyLT5wb3NfIDw9IGJyLT5sZW5fKTsKKyAgcmV0dXJuIGJyLT5lb3NfIHx8ICgoYnItPnBvc18gPT0gYnItPmxlbl8pICYmIChici0+Yml0X3Bvc18gPiBWUDhMX0xCSVRTKSk7Cit9CisKKy8vIEZvciBqdW1waW5nIG92ZXIgYSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYml0IHN0cmVhbSB3aGVuIGFjY2Vzc2VkIHdpdGgKKy8vIFZQOExQcmVmZXRjaEJpdHMgYW5kIFZQOExGaWxsQml0V2luZG93LgorLy8gVGhpcyBmdW5jdGlvbiBkb2VzICpub3QqIHNldCBici0+ZW9zXywgc2luY2UgaXQncyBzcGVlZC1jcml0aWNhbC4KKy8vIFVzZSB3aXRoIGV4dHJlbWUgY2FyZSEKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExTZXRCaXRQb3MoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2YWwpIHsKKyAgYnItPmJpdF9wb3NfID0gdmFsOworfQorCisvLyBBZHZhbmNlcyB0aGUgcmVhZCBidWZmZXIgYnkgNCBieXRlcyB0byBtYWtlIHJvb20gZm9yIHJlYWRpbmcgbmV4dCAzMiBiaXRzLgorLy8gU3BlZWQgY3JpdGljYWwsIGJ1dCBpbmZyZXF1ZW50IHBhcnQgb2YgdGhlIGNvZGUgY2FuIGJlIG5vbi1pbmxpbmVkLgorZXh0ZXJuIHZvaWQgVlA4TERvRmlsbEJpdFdpbmRvdyhWUDhMQml0UmVhZGVyKiBjb25zdCBicik7CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMRmlsbEJpdFdpbmRvdyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBpZiAoYnItPmJpdF9wb3NfID49IFZQOExfV0JJVFMpIFZQOExEb0ZpbGxCaXRXaW5kb3coYnIpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19CSVRfUkVBREVSX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y4NzFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuYwpAQCAtMCwwICsxLDM1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKy8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIG1lbWNweSgpCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOEJpdFdyaXRlcgorCitzdGF0aWMgaW50IEJpdFdyaXRlclJlc2l6ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXh0cmFfc2l6ZSkgeworICB1aW50OF90KiBuZXdfYnVmOworICBzaXplX3QgbmV3X3NpemU7CisgIGNvbnN0IHVpbnQ2NF90IG5lZWRlZF9zaXplXzY0YiA9ICh1aW50NjRfdClidy0+cG9zXyArIGV4dHJhX3NpemU7CisgIGNvbnN0IHNpemVfdCBuZWVkZWRfc2l6ZSA9IChzaXplX3QpbmVlZGVkX3NpemVfNjRiOworICBpZiAobmVlZGVkX3NpemVfNjRiICE9IG5lZWRlZF9zaXplKSB7CisgICAgYnctPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG5lZWRlZF9zaXplIDw9IGJ3LT5tYXhfcG9zXykgcmV0dXJuIDE7CisgIC8vIElmIHRoZSBmb2xsb3dpbmcgbGluZSB3cmFwcyBvdmVyIDMyYml0LCB0aGUgdGVzdCBqdXN0IGFmdGVyIHdpbGwgY2F0Y2ggaXQuCisgIG5ld19zaXplID0gMiAqIGJ3LT5tYXhfcG9zXzsKKyAgaWYgKG5ld19zaXplIDwgbmVlZGVkX3NpemUpIG5ld19zaXplID0gbmVlZGVkX3NpemU7CisgIGlmIChuZXdfc2l6ZSA8IDEwMjQpIG5ld19zaXplID0gMTAyNDsKKyAgbmV3X2J1ZiA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBuZXdfc2l6ZSk7CisgIGlmIChuZXdfYnVmID09IE5VTEwpIHsKKyAgICBidy0+ZXJyb3JfID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYnctPnBvc18gPiAwKSB7CisgICAgYXNzZXJ0KGJ3LT5idWZfICE9IE5VTEwpOworICAgIG1lbWNweShuZXdfYnVmLCBidy0+YnVmXywgYnctPnBvc18pOworICB9CisgIFdlYlBTYWZlRnJlZShidy0+YnVmXyk7CisgIGJ3LT5idWZfID0gbmV3X2J1ZjsKKyAgYnctPm1heF9wb3NfID0gbmV3X3NpemU7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBGbHVzaChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IGludCBzID0gOCArIGJ3LT5uYl9iaXRzXzsKKyAgY29uc3QgaW50MzJfdCBiaXRzID0gYnctPnZhbHVlXyA+PiBzOworICBhc3NlcnQoYnctPm5iX2JpdHNfID49IDApOworICBidy0+dmFsdWVfIC09IGJpdHMgPDwgczsKKyAgYnctPm5iX2JpdHNfIC09IDg7CisgIGlmICgoYml0cyAmIDB4ZmYpICE9IDB4ZmYpIHsKKyAgICBzaXplX3QgcG9zID0gYnctPnBvc187CisgICAgaWYgKCFCaXRXcml0ZXJSZXNpemUoYncsIGJ3LT5ydW5fICsgMSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGJpdHMgJiAweDEwMCkgeyAgLy8gb3ZlcmZsb3cgLT4gcHJvcGFnYXRlIGNhcnJ5IG92ZXIgcGVuZGluZyAweGZmJ3MKKyAgICAgIGlmIChwb3MgPiAwKSBidy0+YnVmX1twb3MgLSAxXSsrOworICAgIH0KKyAgICBpZiAoYnctPnJ1bl8gPiAwKSB7CisgICAgICBjb25zdCBpbnQgdmFsdWUgPSAoYml0cyAmIDB4MTAwKSA/IDB4MDAgOiAweGZmOworICAgICAgZm9yICg7IGJ3LT5ydW5fID4gMDsgLS1idy0+cnVuXykgYnctPmJ1Zl9bcG9zKytdID0gdmFsdWU7CisgICAgfQorICAgIGJ3LT5idWZfW3BvcysrXSA9IGJpdHM7CisgICAgYnctPnBvc18gPSBwb3M7CisgIH0gZWxzZSB7CisgICAgYnctPnJ1bl8rKzsgICAvLyBkZWxheSB3cml0aW5nIG9mIGJ5dGVzIDB4ZmYsIHBlbmRpbmcgZXZlbnR1YWwgY2FycnkuCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlbm9ybWFsaXphdGlvbgorCitzdGF0aWMgY29uc3QgdWludDhfdCBrTm9ybVsxMjhdID0geyAgLy8gcmVub3JtX3NpemVzW2ldID0gOCAtIGxvZzIoaSkKKyAgICAgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMAorfTsKKworLy8gcmFuZ2UgPSAoKHJhbmdlICsgMSkgPDwga1ZQOExvZzJSYW5nZVtyYW5nZV0pIC0gMQorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05ld1JhbmdlWzEyOF0gPSB7CisgIDEyNywgMTI3LCAxOTEsIDEyNywgMTU5LCAxOTEsIDIyMywgMTI3LCAxNDMsIDE1OSwgMTc1LCAxOTEsIDIwNywgMjIzLCAyMzksCisgIDEyNywgMTM1LCAxNDMsIDE1MSwgMTU5LCAxNjcsIDE3NSwgMTgzLCAxOTEsIDE5OSwgMjA3LCAyMTUsIDIyMywgMjMxLCAyMzksCisgIDI0NywgMTI3LCAxMzEsIDEzNSwgMTM5LCAxNDMsIDE0NywgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjcsIDE3MSwgMTc1LCAxNzksCisgIDE4MywgMTg3LCAxOTEsIDE5NSwgMTk5LCAyMDMsIDIwNywgMjExLCAyMTUsIDIxOSwgMjIzLCAyMjcsIDIzMSwgMjM1LCAyMzksCisgIDI0MywgMjQ3LCAyNTEsIDEyNywgMTI5LCAxMzEsIDEzMywgMTM1LCAxMzcsIDEzOSwgMTQxLCAxNDMsIDE0NSwgMTQ3LCAxNDksCisgIDE1MSwgMTUzLCAxNTUsIDE1NywgMTU5LCAxNjEsIDE2MywgMTY1LCAxNjcsIDE2OSwgMTcxLCAxNzMsIDE3NSwgMTc3LCAxNzksCisgIDE4MSwgMTgzLCAxODUsIDE4NywgMTg5LCAxOTEsIDE5MywgMTk1LCAxOTcsIDE5OSwgMjAxLCAyMDMsIDIwNSwgMjA3LCAyMDksCisgIDIxMSwgMjEzLCAyMTUsIDIxNywgMjE5LCAyMjEsIDIyMywgMjI1LCAyMjcsIDIyOSwgMjMxLCAyMzMsIDIzNSwgMjM3LCAyMzksCisgIDI0MSwgMjQzLCAyNDUsIDI0NywgMjQ5LCAyNTEsIDI1MywgMTI3Cit9OworCitpbnQgVlA4UHV0Qml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQsIGludCBwcm9iKSB7CisgIGNvbnN0IGludCBzcGxpdCA9IChidy0+cmFuZ2VfICogcHJvYikgPj4gODsKKyAgaWYgKGJpdCkgeworICAgIGJ3LT52YWx1ZV8gKz0gc3BsaXQgKyAxOworICAgIGJ3LT5yYW5nZV8gLT0gc3BsaXQgKyAxOworICB9IGVsc2UgeworICAgIGJ3LT5yYW5nZV8gPSBzcGxpdDsKKyAgfQorICBpZiAoYnctPnJhbmdlXyA8IDEyNykgeyAgIC8vIGVtaXQgJ3NoaWZ0JyBiaXRzIG91dCBhbmQgcmVub3JtYWxpemUKKyAgICBjb25zdCBpbnQgc2hpZnQgPSBrTm9ybVtidy0+cmFuZ2VfXTsKKyAgICBidy0+cmFuZ2VfID0ga05ld1JhbmdlW2J3LT5yYW5nZV9dOworICAgIGJ3LT52YWx1ZV8gPDw9IHNoaWZ0OworICAgIGJ3LT5uYl9iaXRzXyArPSBzaGlmdDsKKyAgICBpZiAoYnctPm5iX2JpdHNfID4gMCkgRmx1c2goYncpOworICB9CisgIHJldHVybiBiaXQ7Cit9CisKK2ludCBWUDhQdXRCaXRVbmlmb3JtKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQpIHsKKyAgY29uc3QgaW50IHNwbGl0ID0gYnctPnJhbmdlXyA+PiAxOworICBpZiAoYml0KSB7CisgICAgYnctPnZhbHVlXyArPSBzcGxpdCArIDE7CisgICAgYnctPnJhbmdlXyAtPSBzcGxpdCArIDE7CisgIH0gZWxzZSB7CisgICAgYnctPnJhbmdlXyA9IHNwbGl0OworICB9CisgIGlmIChidy0+cmFuZ2VfIDwgMTI3KSB7CisgICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKKyAgICBidy0+dmFsdWVfIDw8PSAxOworICAgIGJ3LT5uYl9iaXRzXyArPSAxOworICAgIGlmIChidy0+bmJfYml0c18gPiAwKSBGbHVzaChidyk7CisgIH0KKyAgcmV0dXJuIGJpdDsKK30KKwordm9pZCBWUDhQdXRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIHVpbnQzMl90IHZhbHVlLCBpbnQgbmJfYml0cykgeworICB1aW50MzJfdCBtYXNrOworICBhc3NlcnQobmJfYml0cyA+IDAgJiYgbmJfYml0cyA8IDMyKTsKKyAgZm9yIChtYXNrID0gMXUgPDwgKG5iX2JpdHMgLSAxKTsgbWFzazsgbWFzayA+Pj0gMSkgeworICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIHZhbHVlICYgbWFzayk7CisgIH0KK30KKwordm9pZCBWUDhQdXRTaWduZWRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB2YWx1ZSwgaW50IG5iX2JpdHMpIHsKKyAgaWYgKCFWUDhQdXRCaXRVbmlmb3JtKGJ3LCB2YWx1ZSAhPSAwKSkgcmV0dXJuOworICBpZiAodmFsdWUgPCAwKSB7CisgICAgVlA4UHV0Qml0cyhidywgKCgtdmFsdWUpIDw8IDEpIHwgMSwgbmJfYml0cyArIDEpOworICB9IGVsc2UgeworICAgIFZQOFB1dEJpdHMoYncsIHZhbHVlIDw8IDEsIG5iX2JpdHMgKyAxKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVlA4Qml0V3JpdGVySW5pdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSkgeworICBidy0+cmFuZ2VfICAgPSAyNTUgLSAxOworICBidy0+dmFsdWVfICAgPSAwOworICBidy0+cnVuXyAgICAgPSAwOworICBidy0+bmJfYml0c18gPSAtODsKKyAgYnctPnBvc18gICAgID0gMDsKKyAgYnctPm1heF9wb3NfID0gMDsKKyAgYnctPmVycm9yXyAgID0gMDsKKyAgYnctPmJ1Zl8gICAgID0gTlVMTDsKKyAgcmV0dXJuIChleHBlY3RlZF9zaXplID4gMCkgPyBCaXRXcml0ZXJSZXNpemUoYncsIGV4cGVjdGVkX3NpemUpIDogMTsKK30KKwordWludDhfdCogVlA4Qml0V3JpdGVyRmluaXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgVlA4UHV0Qml0cyhidywgMCwgOSAtIGJ3LT5uYl9iaXRzXyk7CisgIGJ3LT5uYl9iaXRzXyA9IDA7ICAgLy8gcGFkIHdpdGggemVyb2VzCisgIEZsdXNoKGJ3KTsKKyAgcmV0dXJuIGJ3LT5idWZfOworfQorCitpbnQgVlA4Qml0V3JpdGVyQXBwZW5kKFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBpZiAoYnctPm5iX2JpdHNfICE9IC04KSByZXR1cm4gMDsgICAvLyBGbHVzaCgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZAorICBpZiAoIUJpdFdyaXRlclJlc2l6ZShidywgc2l6ZSkpIHJldHVybiAwOworICBtZW1jcHkoYnctPmJ1Zl8gKyBidy0+cG9zXywgZGF0YSwgc2l6ZSk7CisgIGJ3LT5wb3NfICs9IHNpemU7CisgIHJldHVybiAxOworfQorCit2b2lkIFZQOEJpdFdyaXRlcldpcGVPdXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBpZiAoYncgIT0gTlVMTCkgeworICAgIFdlYlBTYWZlRnJlZShidy0+YnVmXyk7CisgICAgbWVtc2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExCaXRXcml0ZXIKKworLy8gVGhpcyBpcyB0aGUgbWluaW11bSBhbW91bnQgb2Ygc2l6ZSB0aGUgbWVtb3J5IGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGdyb3cKKy8vIHdoZW4gZXh0cmEgc3BhY2UgaXMgbmVlZGVkLgorI2RlZmluZSBNSU5fRVhUUkFfU0laRSAgKDMyNzY4VUxMKQorCisvLyBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KK3N0YXRpYyBpbnQgVlA4TEJpdFdyaXRlclJlc2l6ZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4dHJhX3NpemUpIHsKKyAgdWludDhfdCogYWxsb2NhdGVkX2J1ZjsKKyAgc2l6ZV90IGFsbG9jYXRlZF9zaXplOworICBjb25zdCBzaXplX3QgbWF4X2J5dGVzID0gYnctPmVuZF8gLSBidy0+YnVmXzsKKyAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IGJ3LT5jdXJfIC0gYnctPmJ1Zl87CisgIGNvbnN0IHVpbnQ2NF90IHNpemVfcmVxdWlyZWRfNjRiID0gKHVpbnQ2NF90KWN1cnJlbnRfc2l6ZSArIGV4dHJhX3NpemU7CisgIGNvbnN0IHNpemVfdCBzaXplX3JlcXVpcmVkID0gKHNpemVfdClzaXplX3JlcXVpcmVkXzY0YjsKKyAgaWYgKHNpemVfcmVxdWlyZWQgIT0gc2l6ZV9yZXF1aXJlZF82NGIpIHsKKyAgICBidy0+ZXJyb3JfID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobWF4X2J5dGVzID4gMCAmJiBzaXplX3JlcXVpcmVkIDw9IG1heF9ieXRlcykgcmV0dXJuIDE7CisgIGFsbG9jYXRlZF9zaXplID0gKDMgKiBtYXhfYnl0ZXMpID4+IDE7CisgIGlmIChhbGxvY2F0ZWRfc2l6ZSA8IHNpemVfcmVxdWlyZWQpIGFsbG9jYXRlZF9zaXplID0gc2l6ZV9yZXF1aXJlZDsKKyAgLy8gbWFrZSBhbGxvY2F0ZWQgc2l6ZSBtdWx0aXBsZSBvZiAxaworICBhbGxvY2F0ZWRfc2l6ZSA9ICgoKGFsbG9jYXRlZF9zaXplID4+IDEwKSArIDEpIDw8IDEwKTsKKyAgYWxsb2NhdGVkX2J1ZiA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBhbGxvY2F0ZWRfc2l6ZSk7CisgIGlmIChhbGxvY2F0ZWRfYnVmID09IE5VTEwpIHsKKyAgICBidy0+ZXJyb3JfID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoY3VycmVudF9zaXplID4gMCkgeworICAgIG1lbWNweShhbGxvY2F0ZWRfYnVmLCBidy0+YnVmXywgY3VycmVudF9zaXplKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoYnctPmJ1Zl8pOworICBidy0+YnVmXyA9IGFsbG9jYXRlZF9idWY7CisgIGJ3LT5jdXJfID0gYnctPmJ1Zl8gKyBjdXJyZW50X3NpemU7CisgIGJ3LT5lbmRfID0gYnctPmJ1Zl8gKyBhbGxvY2F0ZWRfc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBWUDhMQml0V3JpdGVySW5pdChWUDhMQml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4cGVjdGVkX3NpemUpIHsKKyAgbWVtc2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7CisgIHJldHVybiBWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCBleHBlY3RlZF9zaXplKTsKK30KKworaW50IFZQOExCaXRXcml0ZXJDbG9uZShjb25zdCBWUDhMQml0V3JpdGVyKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGRzdCkgeworICBjb25zdCBzaXplX3QgY3VycmVudF9zaXplID0gc3JjLT5jdXJfIC0gc3JjLT5idWZfOworICBhc3NlcnQoc3JjLT5jdXJfID49IHNyYy0+YnVmXyAmJiBzcmMtPmN1cl8gPD0gc3JjLT5lbmRfKTsKKyAgaWYgKCFWUDhMQml0V3JpdGVyUmVzaXplKGRzdCwgY3VycmVudF9zaXplKSkgcmV0dXJuIDA7CisgIG1lbWNweShkc3QtPmJ1Zl8sIHNyYy0+YnVmXywgY3VycmVudF9zaXplKTsKKyAgZHN0LT5iaXRzXyA9IHNyYy0+Yml0c187CisgIGRzdC0+dXNlZF8gPSBzcmMtPnVzZWRfOworICBkc3QtPmVycm9yXyA9IHNyYy0+ZXJyb3JfOworICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhMQml0V3JpdGVyV2lwZU91dChWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICBpZiAoYncgIT0gTlVMTCkgeworICAgIFdlYlBTYWZlRnJlZShidy0+YnVmXyk7CisgICAgbWVtc2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7CisgIH0KK30KKwordm9pZCBWUDhMQml0V3JpdGVyUmVzZXQoY29uc3QgVlA4TEJpdFdyaXRlciogY29uc3QgYndfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGJ3LT5iaXRzXyA9IGJ3X2luaXQtPmJpdHNfOworICBidy0+dXNlZF8gPSBid19pbml0LT51c2VkXzsKKyAgYnctPmN1cl8gPSBidy0+YnVmXyArIChid19pbml0LT5jdXJfIC0gYndfaW5pdC0+YnVmXyk7CisgIGFzc2VydChidy0+Y3VyXyA8PSBidy0+ZW5kXyk7CisgIGJ3LT5lcnJvcl8gPSBid19pbml0LT5lcnJvcl87Cit9CisKK3ZvaWQgVlA4TEJpdFdyaXRlclN3YXAoVlA4TEJpdFdyaXRlciogY29uc3Qgc3JjLCBWUDhMQml0V3JpdGVyKiBjb25zdCBkc3QpIHsKKyAgY29uc3QgVlA4TEJpdFdyaXRlciB0bXAgPSAqc3JjOworICAqc3JjID0gKmRzdDsKKyAgKmRzdCA9IHRtcDsKK30KKwordm9pZCBWUDhMUHV0Qml0c0ZsdXNoQml0cyhWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICAvLyBJZiBuZWVkZWQsIG1ha2Ugc29tZSByb29tIGJ5IGZsdXNoaW5nIHNvbWUgYml0cyBvdXQuCisgIGlmIChidy0+Y3VyXyArIFZQOExfV1JJVEVSX0JZVEVTID4gYnctPmVuZF8pIHsKKyAgICBjb25zdCB1aW50NjRfdCBleHRyYV9zaXplID0gKGJ3LT5lbmRfIC0gYnctPmJ1Zl8pICsgTUlOX0VYVFJBX1NJWkU7CisgICAgaWYgKGV4dHJhX3NpemUgIT0gKHNpemVfdClleHRyYV9zaXplIHx8CisgICAgICAgICFWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoc2l6ZV90KWV4dHJhX3NpemUpKSB7CisgICAgICBidy0+Y3VyXyA9IGJ3LT5idWZfOworICAgICAgYnctPmVycm9yXyA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgICoodnA4bF93dHlwZV90Kilidy0+Y3VyXyA9ICh2cDhsX3d0eXBlX3QpV1NXQVAoKHZwOGxfd3R5cGVfdClidy0+Yml0c18pOworICBidy0+Y3VyXyArPSBWUDhMX1dSSVRFUl9CWVRFUzsKKyAgYnctPmJpdHNfID4+PSBWUDhMX1dSSVRFUl9CSVRTOworICBidy0+dXNlZF8gLT0gVlA4TF9XUklURVJfQklUUzsKK30KKwordm9pZCBWUDhMUHV0Qml0c0ludGVybmFsKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCBiaXRzLCBpbnQgbl9iaXRzKSB7CisgIGFzc2VydChuX2JpdHMgPD0gMzIpOworICAvLyBUaGF0J3MgdGhlIG1heCB3ZSBjYW4gaGFuZGxlOgorICBhc3NlcnQoc2l6ZW9mKHZwOGxfd3R5cGVfdCkgPT0gMik7CisgIGlmIChuX2JpdHMgPiAwKSB7CisgICAgdnA4bF9hdHlwZV90IGxiaXRzID0gYnctPmJpdHNfOworICAgIGludCB1c2VkID0gYnctPnVzZWRfOworICAgIC8vIFNwZWNpYWwgY2FzZSBvZiBvdmVyZmxvdyBoYW5kbGluZyBmb3IgMzJiaXQgYWNjdW11bGF0b3IgKDItc3RlcHMgZmx1c2gpLgorI2lmIFZQOExfV1JJVEVSX0JJVFMgPT0gMTYKKyAgICBpZiAodXNlZCArIG5fYml0cyA+PSBWUDhMX1dSSVRFUl9NQVhfQklUUykgeworICAgICAgLy8gRmlsbCB1cCBhbGwgdGhlIFZQOExfV1JJVEVSX01BWF9CSVRTIHNvIGl0IGNhbiBiZSBmbHVzaGVkIG91dCBiZWxvdy4KKyAgICAgIGNvbnN0IGludCBzaGlmdCA9IFZQOExfV1JJVEVSX01BWF9CSVRTIC0gdXNlZDsKKyAgICAgIGxiaXRzIHw9ICh2cDhsX2F0eXBlX3QpYml0cyA8PCB1c2VkOworICAgICAgdXNlZCA9IFZQOExfV1JJVEVSX01BWF9CSVRTOworICAgICAgbl9iaXRzIC09IHNoaWZ0OworICAgICAgYml0cyA+Pj0gc2hpZnQ7CisgICAgICBhc3NlcnQobl9iaXRzIDw9IFZQOExfV1JJVEVSX01BWF9CSVRTKTsKKyAgICB9CisjZW5kaWYKKyAgICAvLyBJZiBuZWVkZWQsIG1ha2Ugc29tZSByb29tIGJ5IGZsdXNoaW5nIHNvbWUgYml0cyBvdXQuCisgICAgd2hpbGUgKHVzZWQgPj0gVlA4TF9XUklURVJfQklUUykgeworICAgICAgaWYgKGJ3LT5jdXJfICsgVlA4TF9XUklURVJfQllURVMgPiBidy0+ZW5kXykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBleHRyYV9zaXplID0gKGJ3LT5lbmRfIC0gYnctPmJ1Zl8pICsgTUlOX0VYVFJBX1NJWkU7CisgICAgICAgIGlmIChleHRyYV9zaXplICE9IChzaXplX3QpZXh0cmFfc2l6ZSB8fAorICAgICAgICAgICAgIVZQOExCaXRXcml0ZXJSZXNpemUoYncsIChzaXplX3QpZXh0cmFfc2l6ZSkpIHsKKyAgICAgICAgICBidy0+Y3VyXyA9IGJ3LT5idWZfOworICAgICAgICAgIGJ3LT5lcnJvcl8gPSAxOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKih2cDhsX3d0eXBlX3QqKWJ3LT5jdXJfID0gKHZwOGxfd3R5cGVfdClXU1dBUCgodnA4bF93dHlwZV90KWxiaXRzKTsKKyAgICAgIGJ3LT5jdXJfICs9IFZQOExfV1JJVEVSX0JZVEVTOworICAgICAgbGJpdHMgPj49IFZQOExfV1JJVEVSX0JJVFM7CisgICAgICB1c2VkIC09IFZQOExfV1JJVEVSX0JJVFM7CisgICAgfQorICAgIGJ3LT5iaXRzXyA9IGxiaXRzIHwgKCh2cDhsX2F0eXBlX3QpYml0cyA8PCB1c2VkKTsKKyAgICBidy0+dXNlZF8gPSB1c2VkICsgbl9iaXRzOworICB9Cit9CisKK3VpbnQ4X3QqIFZQOExCaXRXcml0ZXJGaW5pc2goVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgLy8gZmx1c2ggbGVmdG92ZXIgYml0cworICBpZiAoVlA4TEJpdFdyaXRlclJlc2l6ZShidywgKGJ3LT51c2VkXyArIDcpID4+IDMpKSB7CisgICAgd2hpbGUgKGJ3LT51c2VkXyA+IDApIHsKKyAgICAgICpidy0+Y3VyXysrID0gKHVpbnQ4X3QpYnctPmJpdHNfOworICAgICAgYnctPmJpdHNfID4+PSA4OworICAgICAgYnctPnVzZWRfIC09IDg7CisgICAgfQorICAgIGJ3LT51c2VkXyA9IDA7CisgIH0KKyAgcmV0dXJuIGJ3LT5idWZfOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmNTk3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCaXQgd3JpdGluZyBhbmQgYm9vbGVhbiBjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19CSVRfV1JJVEVSX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfQklUX1dSSVRFUl9VVElMU19IXworCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQml0LXdyaXRpbmcKKwordHlwZWRlZiBzdHJ1Y3QgVlA4Qml0V3JpdGVyIFZQOEJpdFdyaXRlcjsKK3N0cnVjdCBWUDhCaXRXcml0ZXIgeworICBpbnQzMl90ICByYW5nZV87ICAgICAgLy8gcmFuZ2UtMQorICBpbnQzMl90ICB2YWx1ZV87CisgIGludCAgICAgIHJ1bl87ICAgICAgICAvLyBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYml0cworICBpbnQgICAgICBuYl9iaXRzXzsgICAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgYml0cworICB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW50ZXJuYWwgYnVmZmVyLiBSZS1hbGxvY2F0ZWQgcmVndWxhcmx5LiBOb3Qgb3duZWQuCisgIHNpemVfdCAgIHBvc187CisgIHNpemVfdCAgIG1heF9wb3NfOworICBpbnQgICAgICBlcnJvcl87ICAgICAgLy8gdHJ1ZSBpbiBjYXNlIG9mIGVycm9yCit9OworCisvLyBJbml0aWFsaXplIHRoZSBvYmplY3QuIEFsbG9jYXRlcyBzb21lIGluaXRpYWwgbWVtb3J5IGJhc2VkIG9uIGV4cGVjdGVkX3NpemUuCitpbnQgVlA4Qml0V3JpdGVySW5pdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSk7CisvLyBGaW5hbGl6ZSB0aGUgYml0c3RyZWFtIGNvZGluZy4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KK3VpbnQ4X3QqIFZQOEJpdFdyaXRlckZpbmlzaChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFJlbGVhc2UgYW55IHBlbmRpbmcgbWVtb3J5IGFuZCB6ZXJvZXMgdGhlIG9iamVjdC4gTm90IGEgbWFuZGF0b3J5IGNhbGwuCisvLyBPbmx5IHVzZWZ1bCBpbiBjYXNlIG9mIGVycm9yLCB3aGVuIHRoZSBpbnRlcm5hbCBidWZmZXIgaGFzbid0IGJlZW4gZ3JhYmJlZCEKK3ZvaWQgVlA4Qml0V3JpdGVyV2lwZU91dChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKworaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYik7CitpbnQgVlA4UHV0Qml0VW5pZm9ybShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0KTsKK3ZvaWQgVlA4UHV0Qml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCB2YWx1ZSwgaW50IG5iX2JpdHMpOwordm9pZCBWUDhQdXRTaWduZWRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB2YWx1ZSwgaW50IG5iX2JpdHMpOworCisvLyBBcHBlbmRzIHNvbWUgYnl0ZXMgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4gRGF0YSBpcyBjb3BpZWQuCitpbnQgVlA4Qml0V3JpdGVyQXBwZW5kKFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8gcmV0dXJuIGFwcHJveGltYXRlIHdyaXRlIHBvc2l0aW9uIChpbiBiaXRzKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IFZQOEJpdFdyaXRlclBvcyhjb25zdCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IHVpbnQ2NF90IG5iX2JpdHMgPSA4ICsgYnctPm5iX2JpdHNfOyAgIC8vIGJ3LT5uYl9iaXRzXyBpcyA8PSAwLCBub3RlCisgIHJldHVybiAoYnctPnBvc18gKyBidy0+cnVuXykgKiA4ICsgbmJfYml0czsKK30KKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBWUDhCaXRXcml0ZXJCdWYoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICByZXR1cm4gYnctPmJ1Zl87Cit9CisvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOEJpdFdyaXRlclNpemUoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICByZXR1cm4gYnctPnBvc187Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMQml0V3JpdGVyCisKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KSAgIC8vIDY0Yml0Cit0eXBlZGVmIHVpbnQ2NF90IHZwOGxfYXR5cGVfdDsgICAvLyBhY2N1bXVsYXRvciB0eXBlCit0eXBlZGVmIHVpbnQzMl90IHZwOGxfd3R5cGVfdDsgICAvLyB3cml0aW5nIHR5cGUKKyNkZWZpbmUgV1NXQVAgSFRvTEUzMgorI2RlZmluZSBWUDhMX1dSSVRFUl9CWVRFUyAgICA0ICAgLy8gc2l6ZW9mKHZwOGxfd3R5cGVfdCkKKyNkZWZpbmUgVlA4TF9XUklURVJfQklUUyAgICAgMzIgIC8vIDggKiBzaXplb2YodnA4bF93dHlwZV90KQorI2RlZmluZSBWUDhMX1dSSVRFUl9NQVhfQklUUyA2NCAgLy8gOCAqIHNpemVvZih2cDhsX2F0eXBlX3QpCisjZWxzZQordHlwZWRlZiB1aW50MzJfdCB2cDhsX2F0eXBlX3Q7Cit0eXBlZGVmIHVpbnQxNl90IHZwOGxfd3R5cGVfdDsKKyNkZWZpbmUgV1NXQVAgSFRvTEUxNgorI2RlZmluZSBWUDhMX1dSSVRFUl9CWVRFUyAgICAyCisjZGVmaW5lIFZQOExfV1JJVEVSX0JJVFMgICAgIDE2CisjZGVmaW5lIFZQOExfV1JJVEVSX01BWF9CSVRTIDMyCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICB2cDhsX2F0eXBlX3QgYml0c187ICAgLy8gYml0IGFjY3VtdWxhdG9yCisgIGludCAgICAgICAgICB1c2VkXzsgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIGluIGFjY3VtdWxhdG9yCisgIHVpbnQ4X3QqICAgICBidWZfOyAgICAvLyBzdGFydCBvZiBidWZmZXIKKyAgdWludDhfdCogICAgIGN1cl87ICAgIC8vIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24KKyAgdWludDhfdCogICAgIGVuZF87ICAgIC8vIGVuZCBvZiBidWZmZXIKKworICAvLyBBZnRlciBhbGwgYml0cyBhcmUgd3JpdHRlbiAoVlA4TEJpdFdyaXRlckZpbmlzaCgpKSwgdGhlIGNhbGxlciBtdXN0IG9ic2VydmUKKyAgLy8gdGhlIHN0YXRlIG9mIGVycm9yXy4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IGEgbWVtb3J5IGFsbG9jYXRpb24KKyAgLy8gZmFpbHVyZSBoYXMgaGFwcGVuZWQgZHVyaW5nIGJpdCB3cml0aW5nLiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwKKyAgLy8gd3JpdGluZyBvZiBiaXRzLgorICBpbnQgZXJyb3JfOworfSBWUDhMQml0V3JpdGVyOworCitzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhjb25zdCBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICByZXR1cm4gKGJ3LT5jdXJfIC0gYnctPmJ1Zl8pICsgKChidy0+dXNlZF8gKyA3KSA+PiAzKTsKK30KKworLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgoraW50IFZQOExCaXRXcml0ZXJJbml0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSk7CisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCitpbnQgVlA4TEJpdFdyaXRlckNsb25lKGNvbnN0IFZQOExCaXRXcml0ZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgZHN0KTsKKy8vIEZpbmFsaXplIHRoZSBiaXRzdHJlYW0gY29kaW5nLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgordWludDhfdCogVlA4TEJpdFdyaXRlckZpbmlzaChWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7CisvLyBSZWxlYXNlIGFueSBwZW5kaW5nIG1lbW9yeSBhbmQgemVyb2VzIHRoZSBvYmplY3QuCit2b2lkIFZQOExCaXRXcml0ZXJXaXBlT3V0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFJlc2V0cyB0aGUgY3Vyc29yIG9mIHRoZSBCaXRXcml0ZXIgYncgdG8gd2hlbiBpdCB3YXMgbGlrZSBpbiBid19pbml0Lgordm9pZCBWUDhMQml0V3JpdGVyUmVzZXQoY29uc3QgVlA4TEJpdFdyaXRlciogY29uc3QgYndfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFN3YXBzIHRoZSBtZW1vcnkgaGVsZCBieSB0d28gQml0V3JpdGVycy4KK3ZvaWQgVlA4TEJpdFdyaXRlclN3YXAoVlA4TEJpdFdyaXRlciogY29uc3Qgc3JjLCBWUDhMQml0V3JpdGVyKiBjb25zdCBkc3QpOworCisvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgVlA4TFB1dEJpdHMgZmx1c2hpbmcgMzIgYml0cyBmcm9tIHRoZSB3cml0dGVuIHN0YXRlLgordm9pZCBWUDhMUHV0Qml0c0ZsdXNoQml0cyhWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7CisKKy8vIFB1dEJpdHMgaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBpbiB0aGUgMTYgYml0IHZwOGxfd3R5cGVfdCBjYXNlLgordm9pZCBWUDhMUHV0Qml0c0ludGVybmFsKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCBiaXRzLCBpbnQgbl9iaXRzKTsKKworLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgYml0cyBpbnRvIGJ5dGVzIGluIGluY3JlYXNpbmcgYWRkcmVzc2VzIChsaXR0bGUgZW5kaWFuKSwKKy8vIGFuZCB3aXRoaW4gYSBieXRlIGxlYXN0LXNpZ25pZmljYW50LWJpdCBmaXJzdC4KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIHdyaXRlIHVwIHRvIDMyIGJpdHMgaW4gb25lIGdvLCBidXQgVlA4TEJpdFJlYWRlciBjYW4gb25seQorLy8gcmVhZCAyNCBiaXRzIG1heCAoVlA4TF9NQVhfTlVNX0JJVF9SRUFEKS4KKy8vIFZQOExCaXRXcml0ZXIncyBlcnJvcl8gZmxhZyBpcyBzZXQgaW4gY2FzZSBvZiAgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHV0Qml0cyhWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdHMsIGludCBuX2JpdHMpIHsKKyAgaWYgKHNpemVvZih2cDhsX3d0eXBlX3QpID09IDQpIHsKKyAgICBpZiAobl9iaXRzID4gMCkgeworICAgICAgaWYgKGJ3LT51c2VkXyA+PSAzMikgeworICAgICAgICBWUDhMUHV0Qml0c0ZsdXNoQml0cyhidyk7CisgICAgICB9CisgICAgICBidy0+Yml0c18gfD0gKHZwOGxfYXR5cGVfdCliaXRzIDw8IGJ3LT51c2VkXzsKKyAgICAgIGJ3LT51c2VkXyArPSBuX2JpdHM7CisgICAgfQorICB9IGVsc2UgeworICAgIFZQOExQdXRCaXRzSW50ZXJuYWwoYncsIGJpdHMsIG5fYml0cyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfQklUX1dSSVRFUl9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jCmluZGV4IGE5YTBkMmEuLmVlNTQ4MTEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMKQEAgLTEyLDQxICsxMiw0NCBAQAogLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjZW5kaWYKLQotI2luY2x1ZGUgIi4vY29sb3JfY2FjaGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZQOExDb2xvckNhY2hlLgogCiBpbnQgVlA4TENvbG9yQ2FjaGVJbml0KFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywgaW50IGhhc2hfYml0cykgewogICBjb25zdCBpbnQgaGFzaF9zaXplID0gMSA8PCBoYXNoX2JpdHM7Ci0gIFNCX0RDSEVDSyhjYyAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGhhc2hfYml0cyA+IDApOworICBhc3NlcnQoY2MgIT0gTlVMTCk7CisgIGFzc2VydChoYXNoX2JpdHMgPiAwKTsKICAgY2MtPmNvbG9yc18gPSAodWludDMyX3QqKVdlYlBTYWZlQ2FsbG9jKCh1aW50NjRfdCloYXNoX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmNjLT5jb2xvcnNfKSk7CiAgIGlmIChjYy0+Y29sb3JzXyA9PSBOVUxMKSByZXR1cm4gMDsKICAgY2MtPmhhc2hfc2hpZnRfID0gMzIgLSBoYXNoX2JpdHM7CisgIGNjLT5oYXNoX2JpdHNfID0gaGFzaF9iaXRzOwogICByZXR1cm4gMTsKIH0KIAogdm9pZCBWUDhMQ29sb3JDYWNoZUNsZWFyKFZQOExDb2xvckNhY2hlKiBjb25zdCBjYykgewogICBpZiAoY2MgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjYy0+Y29sb3JzXyk7CisgICAgV2ViUFNhZmVGcmVlKGNjLT5jb2xvcnNfKTsKICAgICBjYy0+Y29sb3JzXyA9IE5VTEw7CiAgIH0KIH0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKK3ZvaWQgVlA4TENvbG9yQ2FjaGVDb3B5KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZSogY29uc3QgZHN0KSB7CisgIGFzc2VydChzcmMgIT0gTlVMTCk7CisgIGFzc2VydChkc3QgIT0gTlVMTCk7CisgIGFzc2VydChzcmMtPmhhc2hfYml0c18gPT0gZHN0LT5oYXNoX2JpdHNfKTsKKyAgbWVtY3B5KGRzdC0+Y29sb3JzXywgc3JjLT5jb2xvcnNfLAorICAgICAgICAgKChzaXplX3QpMXUgPDwgZHN0LT5oYXNoX2JpdHNfKSAqIHNpemVvZigqZHN0LT5jb2xvcnNfKSk7CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaAppbmRleCA0ODc2YmQ0Li40NGNhYzhjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oCkBAIC0xMiw0OCArMTIsNjIgQEAKIC8vIEF1dGhvcnM6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCiAvLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQogCi0jaWZuZGVmIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19DT0xPUl9DQUNIRV9IXwotCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgorI2lmbmRlZiBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfVVRJTFNfSF8KIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKIC8vIE1haW4gY29sb3IgY2FjaGUgc3RydWN0LgogdHlwZWRlZiBzdHJ1Y3QgewogICB1aW50MzJfdCAqY29sb3JzXzsgIC8vIGNvbG9yIGVudHJpZXMKLSAgaW50IGhhc2hfc2hpZnRfOyAgICAvLyBIYXNoIHNoaWZ0OiAzMiAtIGhhc2hfYml0cy4KKyAgaW50IGhhc2hfc2hpZnRfOyAgICAvLyBIYXNoIHNoaWZ0OiAzMiAtIGhhc2hfYml0c18uCisgIGludCBoYXNoX2JpdHNfOwogfSBWUDhMQ29sb3JDYWNoZTsKIAotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtIYXNoTXVsID0gMHgxZTM1YTdiZDsKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBrSGFzaE11bCA9IDB4MWUzNWE3YmR1bGw7CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEhhc2hQaXgodWludDMyX3QgYXJnYiwgaW50IHNoaWZ0KSB7CisgIHJldHVybiAoaW50KSgoKGFyZ2IgKiBrSGFzaE11bCkgJiAweGZmZmZmZmZmdSkgPj4gc2hpZnQpOworfQogCiBzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TENvbG9yQ2FjaGVMb29rdXAoCiAgICAgY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLCB1aW50MzJfdCBrZXkpIHsKLSAgU0JfRENIRUNLKGtleSA8PSAofjBVID4+IGNjLT5oYXNoX3NoaWZ0XykpOworICBTQl9EQ0hFQ0soKGtleSA+PiBjYy0+aGFzaF9iaXRzXykgPT0gMHUpOwogICByZXR1cm4gY2MtPmNvbG9yc19ba2V5XTsKIH0KIAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TENvbG9yQ2FjaGVTZXQoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5LCB1aW50MzJfdCBhcmdiKSB7CisgIFNCX0RDSEVDSygoa2V5ID4+IGNjLT5oYXNoX2JpdHNfKSA9PSAwdSk7CisgIGNjLT5jb2xvcnNfW2tleV0gPSBhcmdiOworfQorCiBzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMQ29sb3JDYWNoZUluc2VydChjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtleSA9IChrSGFzaE11bCAqIGFyZ2IpID4+IGNjLT5oYXNoX3NoaWZ0XzsKKyAgY29uc3QgaW50IGtleSA9IFZQOExIYXNoUGl4KGFyZ2IsIGNjLT5oYXNoX3NoaWZ0Xyk7CiAgIGNjLT5jb2xvcnNfW2tleV0gPSBhcmdiOwogfQogCiBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgcmV0dXJuIChrSGFzaE11bCAqIGFyZ2IpID4+IGNjLT5oYXNoX3NoaWZ0XzsKKyAgcmV0dXJuIFZQOExIYXNoUGl4KGFyZ2IsIGNjLT5oYXNoX3NoaWZ0Xyk7CiB9CiAKKy8vIFJldHVybiB0aGUga2V5IGlmIGNjIGNvbnRhaW5zIGFyZ2IsIGFuZCAtMSBvdGhlcndpc2UuCiBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExDb2xvckNhY2hlQ29udGFpbnMoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgY29uc3QgdWludDMyX3Qga2V5ID0gKGtIYXNoTXVsICogYXJnYikgPj4gY2MtPmhhc2hfc2hpZnRfOwotICByZXR1cm4gY2MtPmNvbG9yc19ba2V5XSA9PSBhcmdiOworICBjb25zdCBpbnQga2V5ID0gVlA4TEhhc2hQaXgoYXJnYiwgY2MtPmhhc2hfc2hpZnRfKTsKKyAgcmV0dXJuIChjYy0+Y29sb3JzX1trZXldID09IGFyZ2IpID8ga2V5IDogLTE7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MiwxMyArNzYsMTYgQEAKIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCiBpbnQgVlA4TENvbG9yQ2FjaGVJbml0KFZQOExDb2xvckNhY2hlKiBjb25zdCBjb2xvcl9jYWNoZSwgaW50IGhhc2hfYml0cyk7CiAKK3ZvaWQgVlA4TENvbG9yQ2FjaGVDb3B5KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZSogY29uc3QgZHN0KTsKKwogLy8gRGVsZXRlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byBjb2xvciBjYWNoZS4KIHZvaWQgVlA4TENvbG9yQ2FjaGVDbGVhcihWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUpOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotI2VuZGlmICAvLyBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX0hfCisjZW5kaWYgIC8vIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTlmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRW5kaWFuIHJlbGF0ZWQgZnVuY3Rpb25zLgorCisjaWZuZGVmIFdFQlBfVVRJTFNfRU5ESUFOX0lOTF9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0VORElBTl9JTkxfVVRJTFNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9ieXRlX3N3YXAuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyNkZWZpbmUgSFRvTEUzMiBCU3dhcDMyCisjZGVmaW5lIEhUb0xFMTYgQlN3YXAxNgorI2Vsc2UKKyNkZWZpbmUgSFRvTEUzMih4KSAoeCkKKyNkZWZpbmUgSFRvTEUxNih4KSAoeCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9DT05GSUdfSCkKKyNpZiBMT0NBTF9HQ0NfUFJFUkVRKDQsOCkgfHwgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYnN3YXAxNikKKyNkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQMTYKKyNlbmRpZgorI2lmIExPQ0FMX0dDQ19QUkVSRVEoNCwzKSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDMyKQorI2RlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVAzMgorI2VuZGlmCisjaWYgTE9DQUxfR0NDX1BSRVJFUSg0LDMpIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwNjQpCisjZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDY0CisjZW5kaWYKKyNlbmRpZiAgLy8gIUhBVkVfQ09ORklHX0gKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQxNl90IEJTd2FwMTYodWludDE2X3QgeCkgeworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICByZXR1cm4gU2JCeXRlU3dhcFUxNih4KTsKKyNlbHNlCisjaWYgZGVmaW5lZChIQVZFX0JVSUxUSU5fQlNXQVAxNikKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDE2KHgpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQoeCk7CisjZWxzZQorICAvLyBnY2Mgd2lsbCByZWNvZ25pemUgYSAncm9ydyAkOCwgLi4uJyBoZXJlOgorICByZXR1cm4gKHggPj4gOCkgfCAoKHggJiAweGZmKSA8PCA4KTsKKyNlbmRpZiAgLy8gSEFWRV9CVUlMVElOX0JTV0FQMTYKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBCU3dhcDMyKHVpbnQzMl90IHgpIHsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQnl0ZVN3YXBVMzIoeCk7CisjZWxzZQorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyX1IyKQorICB1aW50MzJfdCByZXQ7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ3c2JoICAgJVtyZXRdLCAlW3hdICAgICAgICAgIFxuXHQiCisgICAgInJvdHIgICAlW3JldF0sICVbcmV0XSwgIDE2ICAgXG5cdCIKKyAgICA6IFtyZXRdIj1yIihyZXQpCisgICAgOiBbeF0iciIoeCkKKyAgKTsKKyAgcmV0dXJuIHJldDsKKyNlbGlmIGRlZmluZWQoSEFWRV9CVUlMVElOX0JTV0FQMzIpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMih4KTsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyAgdWludDMyX3Qgc3dhcHBlZF9ieXRlczsKKyAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXAgJTAiIDogIj1yIihzd2FwcGVkX2J5dGVzKSA6ICIwIih4KSk7CisgIHJldHVybiBzd2FwcGVkX2J5dGVzOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuICh1aW50MzJfdClfYnl0ZXN3YXBfdWxvbmcoeCk7CisjZWxzZQorICByZXR1cm4gKHggPj4gMjQpIHwgKCh4ID4+IDgpICYgMHhmZjAwKSB8ICgoeCA8PCA4KSAmIDB4ZmYwMDAwKSB8ICh4IDw8IDI0KTsKKyNlbmRpZiAgLy8gSEFWRV9CVUlMVElOX0JTV0FQMzIKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50NjRfdCBCU3dhcDY0KHVpbnQ2NF90IHgpIHsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQnl0ZVN3YXBVNjQoeCk7CisjZWxzZQorI2lmIGRlZmluZWQoSEFWRV9CVUlMVElOX0JTV0FQNjQpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NCh4KTsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKyAgdWludDY0X3Qgc3dhcHBlZF9ieXRlczsKKyAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXBxICUwIiA6ICI9ciIoc3dhcHBlZF9ieXRlcykgOiAiMCIoeCkpOworICByZXR1cm4gc3dhcHBlZF9ieXRlczsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiAodWludDY0X3QpX2J5dGVzd2FwX3VpbnQ2NCh4KTsKKyNlbHNlICAvLyBnZW5lcmljIGNvZGUgZm9yIHN3YXBwaW5nIDY0LWJpdCB2YWx1ZXMgKHN1Z2dlc3RlZCBieSBiZGJAKQorICB4ID0gKCh4ICYgMHhmZmZmZmZmZjAwMDAwMDAwdWxsKSA+PiAzMikgfCAoKHggJiAweDAwMDAwMDAwZmZmZmZmZmZ1bGwpIDw8IDMyKTsKKyAgeCA9ICgoeCAmIDB4ZmZmZjAwMDBmZmZmMDAwMHVsbCkgPj4gMTYpIHwgKCh4ICYgMHgwMDAwZmZmZjAwMDBmZmZmdWxsKSA8PCAxNik7CisgIHggPSAoKHggJiAweGZmMDBmZjAwZmYwMGZmMDB1bGwpID4+ICA4KSB8ICgoeCAmIDB4MDBmZjAwZmYwMGZmMDBmZnVsbCkgPDwgIDgpOworICByZXR1cm4geDsKKyNlbmRpZiAgLy8gSEFWRV9CVUlMVElOX0JTV0FQNjQKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCit9CisKKyNlbmRpZiAgLy8gV0VCUF9VVElMU19FTkRJQU5fSU5MX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmMyYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuYwpAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZmlsdGVyIGVzdGltYXRpb24KKy8vCisvLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvZmlsdGVyc191dGlscy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVpY2sgZXN0aW1hdGUgb2YgYSBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBmaWx0ZXIgbW9kZSB0byB0cnkuCisKKyNkZWZpbmUgU01BWCAxNgorI2RlZmluZSBTRElGRihhLCBiKSAoYWJzKChhKSAtIChiKSkgPj4gNCkgICAvLyBTY29yaW5nIGRpZmYsIGluIFswLi5TTUFYKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgY29uc3QgaW50IGcgPSBhICsgYiAtIGM7CisgIHJldHVybiAoKGcgJiB+MHhmZikgPT0gMCkgPyBnIDogKGcgPCAwKSA/IDAgOiAyNTU7ICAvLyBjbGlwIHRvIDhiaXQKK30KKworV0VCUF9GSUxURVJfVFlQRSBXZWJQRXN0aW1hdGVCZXN0RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7CisgIGludCBpLCBqOworICBpbnQgYmluc1tXRUJQX0ZJTFRFUl9MQVNUXVtTTUFYXTsKKyAgbWVtc2V0KGJpbnMsIDAsIHNpemVvZihiaW5zKSk7CisKKyAgLy8gV2Ugb25seSBzYW1wbGUgZXZlcnkgb3RoZXIgcGl4ZWxzLiBUaGF0J3MgZW5vdWdoLgorICBmb3IgKGogPSAyOyBqIDwgaGVpZ2h0IC0gMTsgaiArPSAyKSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IGRhdGEgKyBqICogc3RyaWRlOworICAgIGludCBtZWFuID0gcFswXTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgd2lkdGggLSAxOyBpICs9IDIpIHsKKyAgICAgIGNvbnN0IGludCBkaWZmMCA9IFNESUZGKHBbaV0sIG1lYW4pOworICAgICAgY29uc3QgaW50IGRpZmYxID0gU0RJRkYocFtpXSwgcFtpIC0gMV0pOworICAgICAgY29uc3QgaW50IGRpZmYyID0gU0RJRkYocFtpXSwgcFtpIC0gd2lkdGhdKTsKKyAgICAgIGNvbnN0IGludCBncmFkX3ByZWQgPQorICAgICAgICAgIEdyYWRpZW50UHJlZGljdG9yKHBbaSAtIDFdLCBwW2kgLSB3aWR0aF0sIHBbaSAtIHdpZHRoIC0gMV0pOworICAgICAgY29uc3QgaW50IGRpZmYzID0gU0RJRkYocFtpXSwgZ3JhZF9wcmVkKTsKKyAgICAgIGJpbnNbV0VCUF9GSUxURVJfTk9ORV1bZGlmZjBdID0gMTsKKyAgICAgIGJpbnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF1bZGlmZjFdID0gMTsKKyAgICAgIGJpbnNbV0VCUF9GSUxURVJfVkVSVElDQUxdW2RpZmYyXSA9IDE7CisgICAgICBiaW5zW1dFQlBfRklMVEVSX0dSQURJRU5UXVtkaWZmM10gPSAxOworICAgICAgbWVhbiA9ICgzICogbWVhbiArIHBbaV0gKyAyKSA+PiAyOworICAgIH0KKyAgfQorICB7CisgICAgaW50IGZpbHRlcjsKKyAgICBXRUJQX0ZJTFRFUl9UWVBFIGJlc3RfZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsKKyAgICBpbnQgYmVzdF9zY29yZSA9IDB4N2ZmZmZmZmY7CisgICAgZm9yIChmaWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOyBmaWx0ZXIgPCBXRUJQX0ZJTFRFUl9MQVNUOyArK2ZpbHRlcikgeworICAgICAgaW50IHNjb3JlID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTTUFYOyArK2kpIHsKKyAgICAgICAgaWYgKGJpbnNbZmlsdGVyXVtpXSA+IDApIHsKKyAgICAgICAgICBzY29yZSArPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgYmVzdF9maWx0ZXIgPSAoV0VCUF9GSUxURVJfVFlQRSlmaWx0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiZXN0X2ZpbHRlcjsKKyAgfQorfQorCisjdW5kZWYgU01BWAorI3VuZGVmIFNESUZGCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTBmMmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycworLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX0ZJTFRFUlNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19GSUxURVJTX1VUSUxTX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gRmFzdCBlc3RpbWF0ZSBvZiBhIHBvdGVudGlhbGx5IGdvb2QgZmlsdGVyLgorV0VCUF9GSUxURVJfVFlQRSBXZWJQRXN0aW1hdGVCZXN0RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfRklMVEVSU19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jCmluZGV4IGI2NmRkNDEuLjZmM2IxYmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMKQEAgLTExLDE4ICsxMSwxMiBAQAogLy8KIC8vIEVudHJvcHkgZW5jb2RpbmcgKEh1ZmZtYW4pIGZvciB3ZWJwIGxvc3NsZXNzLgogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vaHVmZm1hbl9lbmNvZGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFV0aWwgZnVuY3Rpb24gdG8gb3B0aW1pemUgdGhlIHN5bWJvbCBtYXAgZm9yIFJMRSBjb2RpbmcKQEAgLTMzLDE0ICsyNywxNCBAQAogfQogCiAvLyBDaGFuZ2UgdGhlIHBvcHVsYXRpb24gY291bnRzIGluIGEgd2F5IHRoYXQgdGhlIGNvbnNlcXVlbnQKLS8vIEh1Zm1hbm4gdHJlZSBjb21wcmVzc2lvbiwgZXNwZWNpYWxseSBpdHMgUkxFLXBhcnQsIGdpdmUgc21hbGxlciBvdXRwdXQuCi1zdGF0aWMgaW50IE9wdGltaXplSHVmZm1hbkZvclJsZShpbnQgbGVuZ3RoLCBpbnQqIGNvbnN0IGNvdW50cykgewotICB1aW50OF90KiBnb29kX2Zvcl9ybGU7CisvLyBIdWZmbWFuIHRyZWUgY29tcHJlc3Npb24sIGVzcGVjaWFsbHkgaXRzIFJMRS1wYXJ0LCBnaXZlIHNtYWxsZXIgb3V0cHV0Lgorc3RhdGljIHZvaWQgT3B0aW1pemVIdWZmbWFuRm9yUmxlKGludCBsZW5ndGgsIHVpbnQ4X3QqIGNvbnN0IGdvb2RfZm9yX3JsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgY291bnRzKSB7CiAgIC8vIDEpIExldCdzIG1ha2UgdGhlIEh1ZmZtYW4gY29kZSBtb3JlIGNvbXBhdGlibGUgd2l0aCBybGUgZW5jb2RpbmcuCiAgIGludCBpOwogICBmb3IgKDsgbGVuZ3RoID49IDA7IC0tbGVuZ3RoKSB7CiAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gMTsgIC8vIEFsbCB6ZXJvcy4KKyAgICAgIHJldHVybjsgIC8vIEFsbCB6ZXJvcy4KICAgICB9CiAgICAgaWYgKGNvdW50c1tsZW5ndGggLSAxXSAhPSAwKSB7CiAgICAgICAvLyBOb3cgY291bnRzWzAuLmxlbmd0aCAtIDFdIGRvZXMgbm90IGhhdmUgdHJhaWxpbmcgemVyb3MuCkBAIC00OSwxNSArNDMsMTEgQEAKICAgfQogICAvLyAyKSBMZXQncyBtYXJrIGFsbCBwb3B1bGF0aW9uIGNvdW50cyB0aGF0IGFscmVhZHkgY2FuIGJlIGVuY29kZWQKICAgLy8gd2l0aCBhbiBybGUgY29kZS4KLSAgZ29vZF9mb3JfcmxlID0gKHVpbnQ4X3QqKVNiTWVtb3J5Q2FsbG9jKGxlbmd0aCwgMSk7Ci0gIGlmIChnb29kX2Zvcl9ybGUgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9CiAgIHsKICAgICAvLyBMZXQncyBub3Qgc3BvaWwgYW55IG9mIHRoZSBleGlzdGluZyBnb29kIHJsZSBjb2Rlcy4KICAgICAvLyBNYXJrIGFueSBzZXEgb2YgMCdzIHRoYXQgaXMgbG9uZ2VyIGFzIDUgYXMgYSBnb29kX2Zvcl9ybGUuCiAgICAgLy8gTWFyayBhbnkgc2VxIG9mIG5vbi0wJ3MgdGhhdCBpcyBsb25nZXIgYXMgNyBhcyBhIGdvb2RfZm9yX3JsZS4KLSAgICBpbnQgc3ltYm9sID0gY291bnRzWzBdOworICAgIHVpbnQzMl90IHN5bWJvbCA9IGNvdW50c1swXTsKICAgICBpbnQgc3RyaWRlID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgKytpKSB7CiAgICAgICBpZiAoaSA9PSBsZW5ndGggfHwgY291bnRzW2ldICE9IHN5bWJvbCkgewpAQCAtNzksMTcgKzY5LDE3IEBACiAgIH0KICAgLy8gMykgTGV0J3MgcmVwbGFjZSB0aG9zZSBwb3B1bGF0aW9uIGNvdW50cyB0aGF0IGxlYWQgdG8gbW9yZSBybGUgY29kZXMuCiAgIHsKLSAgICBpbnQgc3RyaWRlID0gMDsKLSAgICBpbnQgbGltaXQgPSBjb3VudHNbMF07Ci0gICAgaW50IHN1bSA9IDA7CisgICAgdWludDMyX3Qgc3RyaWRlID0gMDsKKyAgICB1aW50MzJfdCBsaW1pdCA9IGNvdW50c1swXTsKKyAgICB1aW50MzJfdCBzdW0gPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggKyAxOyArK2kpIHsKICAgICAgIGlmIChpID09IGxlbmd0aCB8fCBnb29kX2Zvcl9ybGVbaV0gfHwKICAgICAgICAgICAoaSAhPSAwICYmIGdvb2RfZm9yX3JsZVtpIC0gMV0pIHx8CiAgICAgICAgICAgIVZhbHVlc1Nob3VsZEJlQ29sbGFwc2VkVG9TdHJpZGVBdmVyYWdlKGNvdW50c1tpXSwgbGltaXQpKSB7CiAgICAgICAgIGlmIChzdHJpZGUgPj0gNCB8fCAoc3RyaWRlID49IDMgJiYgc3VtID09IDApKSB7Ci0gICAgICAgICAgaW50IGs7CisgICAgICAgICAgdWludDMyX3QgazsKICAgICAgICAgICAvLyBUaGUgc3RyaWRlIG11c3QgZW5kLCBjb2xsYXBzZSB3aGF0IHdlIGhhdmUsIGlmIHdlIGhhdmUgZW5vdWdoICg0KS4KLSAgICAgICAgICBpbnQgY291bnQgPSAoc3VtICsgc3RyaWRlIC8gMikgLyBzdHJpZGU7CisgICAgICAgICAgdWludDMyX3QgY291bnQgPSAoc3VtICsgc3RyaWRlIC8gMikgLyBzdHJpZGU7CiAgICAgICAgICAgaWYgKGNvdW50IDwgMSkgewogICAgICAgICAgICAgY291bnQgPSAxOwogICAgICAgICAgIH0KQEAgLTEyNSwxNyArMTE1LDggQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGdvb2RfZm9yX3JsZSk7Ci0gIHJldHVybiAxOwogfQogCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB0b3RhbF9jb3VudF87Ci0gIGludCB2YWx1ZV87Ci0gIGludCBwb29sX2luZGV4X2xlZnRfOwotICBpbnQgcG9vbF9pbmRleF9yaWdodF87Ci19IEh1ZmZtYW5UcmVlOwotCiAvLyBBIGNvbXBhcmVyIGZ1bmN0aW9uIGZvciB0d28gSHVmZm1hbiB0cmVlczogc29ydHMgZmlyc3QgYnkgJ3RvdGFsIGNvdW50JwogLy8gKG1vcmUgY29tZXMgZmlyc3QpLCBhbmQgdGhlbiBieSAndmFsdWUnIChtb3JlIGNvbWVzIGZpcnN0KS4KIHN0YXRpYyBpbnQgQ29tcGFyZUh1ZmZtYW5UcmVlcyhjb25zdCB2b2lkKiBwdHIxLCBjb25zdCB2b2lkKiBwdHIyKSB7CkBAIC0xNDYsNyArMTI3LDcgQEAKICAgfSBlbHNlIGlmICh0MS0+dG90YWxfY291bnRfIDwgdDItPnRvdGFsX2NvdW50XykgewogICAgIHJldHVybiAxOwogICB9IGVsc2UgewotICAgIFNCX0RDSEVDSyh0MS0+dmFsdWVfICE9IHQyLT52YWx1ZV8pOworICAgIGFzc2VydCh0MS0+dmFsdWVfICE9IHQyLT52YWx1ZV8pOwogICAgIHJldHVybiAodDEtPnZhbHVlXyA8IHQyLT52YWx1ZV8pID8gLTEgOiAxOwogICB9CiB9CkBAIC0xODEsMTIgKzE2MiwxMiBAQAogLy8gd2UgYXJlIG5vdCBwbGFubmluZyB0byB1c2UgdGhpcyB3aXRoIGV4dHJlbWVseSBsb25nIGJsb2Nrcy4KIC8vCiAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWZmbWFuX2NvZGluZwotc3RhdGljIGludCBHZW5lcmF0ZU9wdGltYWxUcmVlKGNvbnN0IGludCogY29uc3QgaGlzdG9ncmFtLCBpbnQgaGlzdG9ncmFtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyZWVfZGVwdGhfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYml0X2RlcHRocykgewotICBpbnQgY291bnRfbWluOworc3RhdGljIHZvaWQgR2VuZXJhdGVPcHRpbWFsVHJlZShjb25zdCB1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9ncmFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiB0cmVlLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYml0X2RlcHRocykgeworICB1aW50MzJfdCBjb3VudF9taW47CiAgIEh1ZmZtYW5UcmVlKiB0cmVlX3Bvb2w7Ci0gIEh1ZmZtYW5UcmVlKiB0cmVlOwogICBpbnQgdHJlZV9zaXplX29yaWcgPSAwOwogICBpbnQgaTsKIApAQCAtMTk3LDIyICsxNzgsMTYgQEAKICAgfQogCiAgIGlmICh0cmVlX3NpemVfb3JpZyA9PSAwKSB7ICAgLy8gcHJldHR5IG9wdGltYWwgYWxyZWFkeSEKLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm47CiAgIH0KIAotICAvLyAzICogdHJlZV9zaXplIGlzIGVub3VnaCB0byBjb3ZlciBhbGwgdGhlIG5vZGVzIHJlcHJlc2VudGluZyBhCi0gIC8vIHBvcHVsYXRpb24gYW5kIGFsbCB0aGUgaW5zZXJ0ZWQgbm9kZXMgY29tYmluaW5nIHR3byBleGlzdGluZyBub2Rlcy4KLSAgLy8gVGhlIHRyZWUgcG9vbCBuZWVkcyAyICogKHRyZWVfc2l6ZV9vcmlnIC0gMSkgZW50aXRpZXMsIGFuZCB0aGUKLSAgLy8gdHJlZSBuZWVkcyBleGFjdGx5IHRyZWVfc2l6ZV9vcmlnIGVudGl0aWVzLgotICB0cmVlID0gKEh1ZmZtYW5UcmVlKilXZWJQU2FmZU1hbGxvYygzVUxMICogdHJlZV9zaXplX29yaWcsIHNpemVvZigqdHJlZSkpOwotICBpZiAodHJlZSA9PSBOVUxMKSByZXR1cm4gMDsKICAgdHJlZV9wb29sID0gdHJlZSArIHRyZWVfc2l6ZV9vcmlnOwogCiAgIC8vIEZvciBibG9jayBzaXplcyB3aXRoIGxlc3MgdGhhbiA2NGsgc3ltYm9scyB3ZSBuZXZlciBuZWVkIHRvIGRvIGEKICAgLy8gc2Vjb25kIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AuCiAgIC8vIElmIHdlIGFjdHVhbGx5IHN0YXJ0IHJ1bm5pbmcgaW5zaWRlIHRoaXMgbG9vcCBhIGxvdCwgd2Ugd291bGQgcGVyaGFwcwogICAvLyBiZSBiZXR0ZXIgb2ZmIHdpdGggdGhlIEthdGFqYWluZW4gYWxnb3JpdGhtLgotICBTQl9EQ0hFQ0sodHJlZV9zaXplX29yaWcgPD0gKDEgPDwgKHRyZWVfZGVwdGhfbGltaXQgLSAxKSkpOworICBhc3NlcnQodHJlZV9zaXplX29yaWcgPD0gKDEgPDwgKHRyZWVfZGVwdGhfbGltaXQgLSAxKSkpOwogICBmb3IgKGNvdW50X21pbiA9IDE7IDsgY291bnRfbWluICo9IDIpIHsKICAgICBpbnQgdHJlZV9zaXplID0gdHJlZV9zaXplX29yaWc7CiAgICAgLy8gV2UgbmVlZCB0byBwYWNrIHRoZSBIdWZmbWFuIHRyZWUgaW4gdHJlZV9kZXB0aF9saW1pdCBiaXRzLgpAQCAtMjIxLDcgKzE5Niw3IEBACiAgICAgaW50IGo7CiAgICAgZm9yIChqID0gMDsgaiA8IGhpc3RvZ3JhbV9zaXplOyArK2opIHsKICAgICAgIGlmIChoaXN0b2dyYW1bal0gIT0gMCkgewotICAgICAgICBjb25zdCBpbnQgY291bnQgPQorICAgICAgICBjb25zdCB1aW50MzJfdCBjb3VudCA9CiAgICAgICAgICAgICAoaGlzdG9ncmFtW2pdIDwgY291bnRfbWluKSA/IGNvdW50X21pbiA6IGhpc3RvZ3JhbVtqXTsKICAgICAgICAgdHJlZVtpZHhdLnRvdGFsX2NvdW50XyA9IGNvdW50OwogICAgICAgICB0cmVlW2lkeF0udmFsdWVfID0gajsKQEAgLTIzMiwxMiArMjA3LDEyIEBACiAgICAgfQogCiAgICAgLy8gQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZS4KLSAgICBTYlN5c3RlbVNvcnQodHJlZSwgdHJlZV9zaXplLCBzaXplb2YoKnRyZWUpLCBDb21wYXJlSHVmZm1hblRyZWVzKTsKKyAgICBxc29ydCh0cmVlLCB0cmVlX3NpemUsIHNpemVvZigqdHJlZSksIENvbXBhcmVIdWZmbWFuVHJlZXMpOwogCiAgICAgaWYgKHRyZWVfc2l6ZSA+IDEpIHsgIC8vIE5vcm1hbCBjYXNlLgogICAgICAgaW50IHRyZWVfcG9vbF9zaXplID0gMDsKICAgICAgIHdoaWxlICh0cmVlX3NpemUgPiAxKSB7ICAvLyBGaW5pc2ggd2hlbiB3ZSBoYXZlIG9ubHkgb25lIHJvb3QuCi0gICAgICAgIGludCBjb3VudDsKKyAgICAgICAgdWludDMyX3QgY291bnQ7CiAgICAgICAgIHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSsrXSA9IHRyZWVbdHJlZV9zaXplIC0gMV07CiAgICAgICAgIHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSsrXSA9IHRyZWVbdHJlZV9zaXplIC0gMl07CiAgICAgICAgIGNvdW50ID0gdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplIC0gMV0udG90YWxfY291bnRfICsKQEAgLTI1MSw3ICsyMjYsNyBAQAogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgU2JNZW1vcnlNb3ZlKHRyZWUgKyAoayArIDEpLCB0cmVlICsgaywgKHRyZWVfc2l6ZSAtIGspICogc2l6ZW9mKCp0cmVlKSk7CisgICAgICAgICAgbWVtbW92ZSh0cmVlICsgKGsgKyAxKSwgdHJlZSArIGssICh0cmVlX3NpemUgLSBrKSAqIHNpemVvZigqdHJlZSkpOwogICAgICAgICAgIHRyZWVba10udG90YWxfY291bnRfID0gY291bnQ7CiAgICAgICAgICAgdHJlZVtrXS52YWx1ZV8gPSAtMTsKIApAQCAtMjc4LDggKzI1Myw2IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZSh0cmVlKTsKLSAgcmV0dXJuIDE7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yODgsNyArMjYxLDcgQEAKIHN0YXRpYyBIdWZmbWFuVHJlZVRva2VuKiBDb2RlUmVwZWF0ZWRWYWx1ZXMoaW50IHJlcGV0aXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSwgaW50IHByZXZfdmFsdWUpIHsKLSAgU0JfRENIRUNLKHZhbHVlIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKTsKKyAgYXNzZXJ0KHZhbHVlIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKTsKICAgaWYgKHZhbHVlICE9IHByZXZfdmFsdWUpIHsKICAgICB0b2tlbnMtPmNvZGUgPSB2YWx1ZTsKICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSAwOwpAQCAtMzU3LDcgKzMzMCw3IEBACiAgIGNvbnN0IGludCBkZXB0aF9zaXplID0gdHJlZS0+bnVtX3N5bWJvbHM7CiAgIGludCBwcmV2X3ZhbHVlID0gODsgIC8vIDggaXMgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHJsZS4KICAgaW50IGkgPSAwOwotICBTQl9EQ0hFQ0sodG9rZW5zICE9IE5VTEwpOworICBhc3NlcnQodG9rZW5zICE9IE5VTEwpOwogICB3aGlsZSAoaSA8IGRlcHRoX3NpemUpIHsKICAgICBjb25zdCBpbnQgdmFsdWUgPSB0cmVlLT5jb2RlX2xlbmd0aHNbaV07CiAgICAgaW50IGsgPSBpICsgMTsKQEAgLTM3MSw3ICszNDQsNyBAQAogICAgICAgcHJldl92YWx1ZSA9IHZhbHVlOwogICAgIH0KICAgICBpICs9IHJ1bnM7Ci0gICAgU0JfRENIRUNLKHRva2VucyA8PSBlbmRpbmdfdG9rZW4pOworICAgIGFzc2VydCh0b2tlbnMgPD0gZW5kaW5nX3Rva2VuKTsKICAgfQogICAodm9pZCllbmRpbmdfdG9rZW47ICAgIC8vIHN1cHByZXNzICd1bnVzZWQgdmFyaWFibGUnIHdhcm5pbmcKICAgcmV0dXJuIChpbnQpKHRva2VucyAtIHN0YXJ0aW5nX3Rva2VuKTsKQEAgLTQwNSwxMSArMzc4LDExIEBACiAgIHVpbnQzMl90IG5leHRfY29kZVtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdOwogICBpbnQgZGVwdGhfY291bnRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OwogCi0gIFNCX0RDSEVDSyh0cmVlICE9IE5VTEwpOworICBhc3NlcnQodHJlZSAhPSBOVUxMKTsKICAgbGVuID0gdHJlZS0+bnVtX3N5bWJvbHM7CiAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aCA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKLSAgICBTQl9EQ0hFQ0soY29kZV9sZW5ndGggPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOworICAgIGFzc2VydChjb2RlX2xlbmd0aCA8PSBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCk7CiAgICAgKytkZXB0aF9jb3VudFtjb2RlX2xlbmd0aF07CiAgIH0KICAgZGVwdGhfY291bnRbMF0gPSAwOyAgLy8gaWdub3JlIHVudXNlZCBzeW1ib2wKQEAgLTQzMCwxNyArNDAzLDE1IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWFpbiBlbnRyeSBwb2ludAogCi1pbnQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGludCogY29uc3QgaGlzdG9ncmFtLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKSB7Ci0gIGNvbnN0IGludCBudW1fc3ltYm9scyA9IHRyZWUtPm51bV9zeW1ib2xzOwotICBpZiAoIU9wdGltaXplSHVmZm1hbkZvclJsZShudW1fc3ltYm9scywgaGlzdG9ncmFtKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghR2VuZXJhdGVPcHRpbWFsVHJlZShoaXN0b2dyYW0sIG51bV9zeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9kZXB0aF9saW1pdCwgdHJlZS0+Y29kZV9sZW5ndGhzKSkgewotICAgIHJldHVybiAwOwotICB9Cit2b2lkIFZQOExDcmVhdGVIdWZmbWFuVHJlZSh1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJ1Zl9ybGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmX2NvZGUpIHsKKyAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gaHVmZl9jb2RlLT5udW1fc3ltYm9sczsKKyAgbWVtc2V0KGJ1Zl9ybGUsIDAsIG51bV9zeW1ib2xzICogc2l6ZW9mKCpidWZfcmxlKSk7CisgIE9wdGltaXplSHVmZm1hbkZvclJsZShudW1fc3ltYm9scywgYnVmX3JsZSwgaGlzdG9ncmFtKTsKKyAgR2VuZXJhdGVPcHRpbWFsVHJlZShoaXN0b2dyYW0sIG51bV9zeW1ib2xzLCBodWZmX3RyZWUsIHRyZWVfZGVwdGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgaHVmZl9jb2RlLT5jb2RlX2xlbmd0aHMpOwogICAvLyBDcmVhdGUgdGhlIGFjdHVhbCBiaXQgY29kZXMgZm9yIHRoZSBiaXQgbGVuZ3Rocy4KLSAgQ29udmVydEJpdERlcHRoc1RvU3ltYm9scyh0cmVlKTsKLSAgcmV0dXJuIDE7CisgIENvbnZlcnRCaXREZXB0aHNUb1N5bWJvbHMoaHVmZl9jb2RlKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuX2VuY29kZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuaAppbmRleCAwYjgxZjQ3Li4zZTY3NjNjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuX2VuY29kZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oCkBAIC0xMSwxMiArMTEsMTIgQEAKIC8vCiAvLyBFbnRyb3B5IGVuY29kaW5nIChIdWZmbWFuKSBmb3Igd2VicCBsb3NzbGVzcwogCi0jaWZuZGVmIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9IXworI2lmbmRlZiBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfVVRJTFNfSF8KIAotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCkBAIC0zMywxNyArMzMsMjggQEAKICAgdWludDE2X3QqIGNvZGVzOyAgICAgICAgIC8vIFN5bWJvbCBDb2Rlcy4KIH0gSHVmZm1hblRyZWVDb2RlOwogCisvLyBTdHJ1Y3QgdG8gcmVwcmVzZW50IHRoZSBIdWZmbWFuIHRyZWUuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHRvdGFsX2NvdW50XzsgICAvLyBTeW1ib2wgZnJlcXVlbmN5LgorICBpbnQgdmFsdWVfOyAgICAgICAgICAgICAgLy8gU3ltYm9sIHZhbHVlLgorICBpbnQgcG9vbF9pbmRleF9sZWZ0XzsgICAgLy8gSW5kZXggZm9yIHRoZSBsZWZ0IHN1Yi10cmVlLgorICBpbnQgcG9vbF9pbmRleF9yaWdodF87ICAgLy8gSW5kZXggZm9yIHRoZSByaWdodCBzdWItdHJlZS4KK30gSHVmZm1hblRyZWU7CisKIC8vIFR1cm4gdGhlIEh1ZmZtYW4gdHJlZSBpbnRvIGEgdG9rZW4gc2VxdWVuY2UuCiAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIHVzZWQuCiBpbnQgVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZShjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMsIGludCBtYXhfdG9rZW5zKTsKIAogLy8gQ3JlYXRlIGFuIG9wdGltaXplZCB0cmVlLCBhbmQgdG9rZW5pemUgaXQuCi1pbnQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGludCogY29uc3QgaGlzdG9ncmFtLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKTsKKy8vICdidWZfcmxlJyBhbmQgJ2h1ZmZfdHJlZScgYXJlIHByZS1hbGxvY2F0ZWQgYW5kIHRoZSAndHJlZScgaXMgdGhlIGNvbnN0cnVjdGVkCisvLyBodWZmbWFuIGNvZGUgdHJlZS4KK3ZvaWQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYnVmX3JsZSwgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSk7CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgIC8vIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8KKyNlbmRpZiAgLy8gV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2OTk2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX3V0aWxzLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGFuZCBsb29raW5nIHVwIEh1ZmZtYW4gdHJlZXMuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKy8vIEh1ZmZtYW4gZGF0YSByZWFkIHZpYSBEZWNvZGVJbWFnZVN0cmVhbSBpcyByZXByZXNlbnRlZCBpbiB0d28gKHJlZCBhbmQgZ3JlZW4pCisvLyBieXRlcy4KKyNkZWZpbmUgTUFYX0hUUkVFX0dST1VQUyAgICAweDEwMDAwCisKK0hUcmVlR3JvdXAqIFZQOExIdHJlZUdyb3Vwc05ldyhpbnQgbnVtX2h0cmVlX2dyb3VwcykgeworICBIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cHMgPQorICAgICAgKEhUcmVlR3JvdXAqKVdlYlBTYWZlTWFsbG9jKG51bV9odHJlZV9ncm91cHMsIHNpemVvZigqaHRyZWVfZ3JvdXBzKSk7CisgIGlmIChodHJlZV9ncm91cHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGFzc2VydChudW1faHRyZWVfZ3JvdXBzIDw9IE1BWF9IVFJFRV9HUk9VUFMpOworICByZXR1cm4gaHRyZWVfZ3JvdXBzOworfQorCit2b2lkIFZQOExIdHJlZUdyb3Vwc0ZyZWUoSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXBzKSB7CisgIGlmIChodHJlZV9ncm91cHMgIT0gTlVMTCkgeworICAgIFdlYlBTYWZlRnJlZShodHJlZV9ncm91cHMpOworICB9Cit9CisKKy8vIFJldHVybnMgcmV2ZXJzZShyZXZlcnNlKGtleSwgbGVuKSArIDEsIGxlbiksIHdoZXJlIHJldmVyc2Uoa2V5LCBsZW4pIGlzIHRoZQorLy8gYml0LXdpc2UgcmV2ZXJzYWwgb2YgdGhlIGxlbiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGtleS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXROZXh0S2V5KHVpbnQzMl90IGtleSwgaW50IGxlbikgeworICB1aW50MzJfdCBzdGVwID0gMSA8PCAobGVuIC0gMSk7CisgIHdoaWxlIChrZXkgJiBzdGVwKSB7CisgICAgc3RlcCA+Pj0gMTsKKyAgfQorICByZXR1cm4gc3RlcCA/IChrZXkgJiAoc3RlcCAtIDEpKSArIHN0ZXAgOiBrZXk7Cit9CisKKy8vIFN0b3JlcyBjb2RlIGluIHRhYmxlWzBdLCB0YWJsZVtzdGVwXSwgdGFibGVbMipzdGVwXSwgLi4uLCB0YWJsZVtlbmRdLgorLy8gQXNzdW1lcyB0aGF0IGVuZCBpcyBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHN0ZXAuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSZXBsaWNhdGVWYWx1ZShIdWZmbWFuQ29kZSogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5Db2RlIGNvZGUpIHsKKyAgYXNzZXJ0KGVuZCAlIHN0ZXAgPT0gMCk7CisgIGRvIHsKKyAgICBlbmQgLT0gc3RlcDsKKyAgICB0YWJsZVtlbmRdID0gY29kZTsKKyAgfSB3aGlsZSAoZW5kID4gMCk7Cit9CisKKy8vIFJldHVybnMgdGhlIHRhYmxlIHdpZHRoIG9mIHRoZSBuZXh0IDJuZCBsZXZlbCB0YWJsZS4gY291bnQgaXMgdGhlIGhpc3RvZ3JhbQorLy8gb2YgYml0IGxlbmd0aHMgZm9yIHRoZSByZW1haW5pbmcgc3ltYm9scywgbGVuIGlzIHRoZSBjb2RlIGxlbmd0aCBvZiB0aGUgbmV4dAorLy8gcHJvY2Vzc2VkIHN5bWJvbAorc3RhdGljIFdFQlBfSU5MSU5FIGludCBOZXh0VGFibGVCaXRTaXplKGNvbnN0IGludCogY29uc3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHJvb3RfYml0cykgeworICBpbnQgbGVmdCA9IDEgPDwgKGxlbiAtIHJvb3RfYml0cyk7CisgIHdoaWxlIChsZW4gPCBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCkgeworICAgIGxlZnQgLT0gY291bnRbbGVuXTsKKyAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKKyAgICArK2xlbjsKKyAgICBsZWZ0IDw8PSAxOworICB9CisgIHJldHVybiBsZW4gLSByb290X2JpdHM7Cit9CisKKy8vIHNvcnRlZFtjb2RlX2xlbmd0aHNfc2l6ZV0gaXMgYSBwcmUtYWxsb2NhdGVkIGFycmF5IGZvciBzb3J0aW5nIHN5bWJvbHMKKy8vIGJ5IGNvZGUgbGVuZ3RoLgorc3RhdGljIGludCBCdWlsZEh1ZmZtYW5UYWJsZShIdWZmbWFuQ29kZSogY29uc3Qgcm9vdF90YWJsZSwgaW50IHJvb3RfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvZGVfbGVuZ3Roc1tdLCBpbnQgY29kZV9sZW5ndGhzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNvcnRlZFtdKSB7CisgIEh1ZmZtYW5Db2RlKiB0YWJsZSA9IHJvb3RfdGFibGU7ICAvLyBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZQorICBpbnQgdG90YWxfc2l6ZSA9IDEgPDwgcm9vdF9iaXRzOyAgLy8gdG90YWwgc2l6ZSByb290IHRhYmxlICsgMm5kIGxldmVsIHRhYmxlCisgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGNvZGUgbGVuZ3RoCisgIGludCBzeW1ib2w7ICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW1ib2wgaW5kZXggaW4gb3JpZ2luYWwgb3Igc29ydGVkIHRhYmxlCisgIC8vIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aDoKKyAgaW50IGNvdW50W01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV0gPSB7IDAgfTsKKyAgLy8gb2Zmc2V0cyBpbiBzb3J0ZWQgdGFibGUgZm9yIGVhY2ggbGVuZ3RoOgorICBpbnQgb2Zmc2V0W01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV07CisKKyAgYXNzZXJ0KGNvZGVfbGVuZ3Roc19zaXplICE9IDApOworICBhc3NlcnQoY29kZV9sZW5ndGhzICE9IE5VTEwpOworICBhc3NlcnQocm9vdF90YWJsZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KHJvb3RfYml0cyA+IDApOworCisgIC8vIEJ1aWxkIGhpc3RvZ3JhbSBvZiBjb2RlIGxlbmd0aHMuCisgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7CisgICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICArK2NvdW50W2NvZGVfbGVuZ3Roc1tzeW1ib2xdXTsKKyAgfQorCisgIC8vIEVycm9yLCBhbGwgY29kZSBsZW5ndGhzIGFyZSB6ZXJvcy4KKyAgaWYgKGNvdW50WzBdID09IGNvZGVfbGVuZ3Roc19zaXplKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBHZW5lcmF0ZSBvZmZzZXRzIGludG8gc29ydGVkIHN5bWJvbCB0YWJsZSBieSBjb2RlIGxlbmd0aC4KKyAgb2Zmc2V0WzFdID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSDsgKytsZW4pIHsKKyAgICBpZiAoY291bnRbbGVuXSA+ICgxIDw8IGxlbikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvZmZzZXRbbGVuICsgMV0gPSBvZmZzZXRbbGVuXSArIGNvdW50W2xlbl07CisgIH0KKworICAvLyBTb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLgorICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgeworICAgIGNvbnN0IGludCBzeW1ib2xfY29kZV9sZW5ndGggPSBjb2RlX2xlbmd0aHNbc3ltYm9sXTsKKyAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiAwKSB7CisgICAgICBzb3J0ZWRbb2Zmc2V0W3N5bWJvbF9jb2RlX2xlbmd0aF0rK10gPSBzeW1ib2w7CisgICAgfQorICB9CisKKyAgLy8gU3BlY2lhbCBjYXNlIGNvZGUgd2l0aCBvbmx5IG9uZSB2YWx1ZS4KKyAgaWYgKG9mZnNldFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSF0gPT0gMSkgeworICAgIEh1ZmZtYW5Db2RlIGNvZGU7CisgICAgY29kZS5iaXRzID0gMDsKKyAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFswXTsKKyAgICBSZXBsaWNhdGVWYWx1ZSh0YWJsZSwgMSwgdG90YWxfc2l6ZSwgY29kZSk7CisgICAgcmV0dXJuIHRvdGFsX3NpemU7CisgIH0KKworICB7CisgICAgaW50IHN0ZXA7ICAgICAgICAgICAgICAvLyBzdGVwIHNpemUgdG8gcmVwbGljYXRlIHZhbHVlcyBpbiBjdXJyZW50IHRhYmxlCisgICAgdWludDMyX3QgbG93ID0gLTE7ICAgICAvLyBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5CisgICAgdWludDMyX3QgbWFzayA9IHRvdGFsX3NpemUgLSAxOyAgICAvLyBtYXNrIGZvciBsb3cgYml0cworICAgIHVpbnQzMl90IGtleSA9IDA7ICAgICAgLy8gcmV2ZXJzZWQgcHJlZml4IGNvZGUKKyAgICBpbnQgbnVtX25vZGVzID0gMTsgICAgIC8vIG51bWJlciBvZiBIdWZmbWFuIHRyZWUgbm9kZXMKKyAgICBpbnQgbnVtX29wZW4gPSAxOyAgICAgIC8vIG51bWJlciBvZiBvcGVuIGJyYW5jaGVzIGluIGN1cnJlbnQgdHJlZSBsZXZlbAorICAgIGludCB0YWJsZV9iaXRzID0gcm9vdF9iaXRzOyAgICAgICAgLy8ga2V5IGxlbmd0aCBvZiBjdXJyZW50IHRhYmxlCisgICAgaW50IHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX2JpdHM7ICAvLyBzaXplIG9mIGN1cnJlbnQgdGFibGUKKyAgICBzeW1ib2wgPSAwOworICAgIC8vIEZpbGwgaW4gcm9vdCB0YWJsZS4KKyAgICBmb3IgKGxlbiA9IDEsIHN0ZXAgPSAyOyBsZW4gPD0gcm9vdF9iaXRzOyArK2xlbiwgc3RlcCA8PD0gMSkgeworICAgICAgbnVtX29wZW4gPDw9IDE7CisgICAgICBudW1fbm9kZXMgKz0gbnVtX29wZW47CisgICAgICBudW1fb3BlbiAtPSBjb3VudFtsZW5dOworICAgICAgaWYgKG51bV9vcGVuIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBjb3VudFtsZW5dID4gMDsgLS1jb3VudFtsZW5dKSB7CisgICAgICAgIEh1ZmZtYW5Db2RlIGNvZGU7CisgICAgICAgIGNvZGUuYml0cyA9ICh1aW50OF90KWxlbjsKKyAgICAgICAgY29kZS52YWx1ZSA9ICh1aW50MTZfdClzb3J0ZWRbc3ltYm9sKytdOworICAgICAgICBSZXBsaWNhdGVWYWx1ZSgmdGFibGVba2V5XSwgc3RlcCwgdGFibGVfc2l6ZSwgY29kZSk7CisgICAgICAgIGtleSA9IEdldE5leHRLZXkoa2V5LCBsZW4pOworICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbGwgaW4gMm5kIGxldmVsIHRhYmxlcyBhbmQgYWRkIHBvaW50ZXJzIHRvIHJvb3QgdGFibGUuCisgICAgZm9yIChsZW4gPSByb290X2JpdHMgKyAxLCBzdGVwID0gMjsgbGVuIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIOworICAgICAgICAgKytsZW4sIHN0ZXAgPDw9IDEpIHsKKyAgICAgIG51bV9vcGVuIDw8PSAxOworICAgICAgbnVtX25vZGVzICs9IG51bV9vcGVuOworICAgICAgbnVtX29wZW4gLT0gY291bnRbbGVuXTsKKyAgICAgIGlmIChudW1fb3BlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBmb3IgKDsgY291bnRbbGVuXSA+IDA7IC0tY291bnRbbGVuXSkgeworICAgICAgICBIdWZmbWFuQ29kZSBjb2RlOworICAgICAgICBpZiAoKGtleSAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgIHRhYmxlICs9IHRhYmxlX3NpemU7CisgICAgICAgICAgdGFibGVfYml0cyA9IE5leHRUYWJsZUJpdFNpemUoY291bnQsIGxlbiwgcm9vdF9iaXRzKTsKKyAgICAgICAgICB0YWJsZV9zaXplID0gMSA8PCB0YWJsZV9iaXRzOworICAgICAgICAgIHRvdGFsX3NpemUgKz0gdGFibGVfc2l6ZTsKKyAgICAgICAgICBsb3cgPSBrZXkgJiBtYXNrOworICAgICAgICAgIHJvb3RfdGFibGVbbG93XS5iaXRzID0gKHVpbnQ4X3QpKHRhYmxlX2JpdHMgKyByb290X2JpdHMpOworICAgICAgICAgIHJvb3RfdGFibGVbbG93XS52YWx1ZSA9ICh1aW50MTZfdCkoKHRhYmxlIC0gcm9vdF90YWJsZSkgLSBsb3cpOworICAgICAgICB9CisgICAgICAgIGNvZGUuYml0cyA9ICh1aW50OF90KShsZW4gLSByb290X2JpdHMpOworICAgICAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFtzeW1ib2wrK107CisgICAgICAgIFJlcGxpY2F0ZVZhbHVlKCZ0YWJsZVtrZXkgPj4gcm9vdF9iaXRzXSwgc3RlcCwgdGFibGVfc2l6ZSwgY29kZSk7CisgICAgICAgIGtleSA9IEdldE5leHRLZXkoa2V5LCBsZW4pOworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRyZWUgaXMgZnVsbC4KKyAgICBpZiAobnVtX25vZGVzICE9IDIgKiBvZmZzZXRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEhdIC0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKKy8vIE1heGltdW0gY29kZV9sZW5ndGhzX3NpemUgaXMgMjMyOCAocmVhY2hlZCBmb3IgMTEtYml0IGNvbG9yX2NhY2hlX2JpdHMpLgorLy8gTW9yZSBjb21tb25seSwgdGhlIHZhbHVlIGlzIGFyb3VuZCB+MjgwLgorI2RlZmluZSBNQVhfQ09ERV9MRU5HVEhTX1NJWkUgXAorICAoKDEgPDwgTUFYX0NBQ0hFX0JJVFMpICsgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTKQorLy8gQ3V0LW9mZiB2YWx1ZSBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGVhcCBhbmQgc3RhY2sgYWxsb2NhdGlvbi4KKyNkZWZpbmUgU09SVEVEX1NJWkVfQ1VUT0ZGIDUxMgoraW50IFZQOExCdWlsZEh1ZmZtYW5UYWJsZShIdWZmbWFuQ29kZSogY29uc3Qgcm9vdF90YWJsZSwgaW50IHJvb3RfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvZGVfbGVuZ3Roc1tdLCBpbnQgY29kZV9sZW5ndGhzX3NpemUpIHsKKyAgaW50IHRvdGFsX3NpemU7CisgIGFzc2VydChjb2RlX2xlbmd0aHNfc2l6ZSA8PSBNQVhfQ09ERV9MRU5HVEhTX1NJWkUpOworICBpZiAoY29kZV9sZW5ndGhzX3NpemUgPD0gU09SVEVEX1NJWkVfQ1VUT0ZGKSB7CisgICAgLy8gdXNlIGxvY2FsIHN0YWNrLWFsbG9jYXRlZCBhcnJheS4KKyAgICB1aW50MTZfdCBzb3J0ZWRbU09SVEVEX1NJWkVfQ1VUT0ZGXTsKKyAgICB0b3RhbF9zaXplID0gQnVpbGRIdWZmbWFuVGFibGUocm9vdF90YWJsZSwgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2xlbmd0aHMsIGNvZGVfbGVuZ3Roc19zaXplLCBzb3J0ZWQpOworICB9IGVsc2UgeyAgIC8vIHJhcmUgY2FzZS4gVXNlIGhlYXAgYWxsb2NhdGlvbi4KKyAgICB1aW50MTZfdCogY29uc3Qgc29ydGVkID0KKyAgICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYyhjb2RlX2xlbmd0aHNfc2l6ZSwgc2l6ZW9mKCpzb3J0ZWQpKTsKKyAgICBpZiAoc29ydGVkID09IE5VTEwpIHJldHVybiAwOworICAgIHRvdGFsX3NpemUgPSBCdWlsZEh1ZmZtYW5UYWJsZShyb290X3RhYmxlLCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3RocywgY29kZV9sZW5ndGhzX3NpemUsIHNvcnRlZCk7CisgICAgV2ViUFNhZmVGcmVlKHNvcnRlZCk7CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFjNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhbmQgbG9va2luZyB1cCBIdWZmbWFuIHRyZWVzLgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX0hVRkZNQU5fVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19IVUZGTUFOX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBIVUZGTUFOX1RBQkxFX0JJVFMgICAgICA4CisjZGVmaW5lIEhVRkZNQU5fVEFCTEVfTUFTSyAgICAgICgoMSA8PCBIVUZGTUFOX1RBQkxFX0JJVFMpIC0gMSkKKworI2RlZmluZSBMRU5HVEhTX1RBQkxFX0JJVFMgICAgICA3CisjZGVmaW5lIExFTkdUSFNfVEFCTEVfTUFTSyAgICAgICgoMSA8PCBMRU5HVEhTX1RBQkxFX0JJVFMpIC0gMSkKKworCisvLyBIdWZmbWFuIGxvb2t1cCB0YWJsZSBlbnRyeQordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGJpdHM7ICAgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIGZvciB0aGlzIHN5bWJvbAorICB1aW50MTZfdCB2YWx1ZTsgICAvLyBzeW1ib2wgdmFsdWUgb3IgdGFibGUgb2Zmc2V0Cit9IEh1ZmZtYW5Db2RlOworCisvLyBsb25nIHZlcnNpb24gZm9yIGhvbGRpbmcgMzJiIHZhbHVlcwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgYml0czsgICAgICAgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIGZvciB0aGlzIHN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gaW1wb3NzaWJsZSB2YWx1ZSBpZiBub3QgYSBsaXRlcmFsIGNvZGUuCisgIHVpbnQzMl90IHZhbHVlOyAgIC8vIDMyYiBwYWNrZWQgQVJHQiB2YWx1ZSBpZiBsaXRlcmFsLAorICAgICAgICAgICAgICAgICAgICAvLyBvciBub24tbGl0ZXJhbCBzeW1ib2wgb3RoZXJ3aXNlCit9IEh1ZmZtYW5Db2RlMzI7CisKKyNkZWZpbmUgSFVGRk1BTl9QQUNLRURfQklUUyA2CisjZGVmaW5lIEhVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkUgKDF1IDw8IEhVRkZNQU5fUEFDS0VEX0JJVFMpCisKKy8vIEh1ZmZtYW4gdGFibGUgZ3JvdXAuCisvLyBJbmNsdWRlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOgorLy8gIC0gaXNfdHJpdmlhbF9saXRlcmFsOiBvbmUgY29tbW9uIGxpdGVyYWwgYmFzZSBmb3IgUkVEL0JMVUUvQUxQSEEgKG5vdCBHUkVFTikKKy8vICAtIGlzX3RyaXZpYWxfY29kZTogb25seSAxIGNvZGUgKG5vIGJpdCBpcyByZWFkIGZyb20gYml0c3RyZWFtKQorLy8gIC0gdXNlX3BhY2tlZF90YWJsZTogZmV3IGVub3VnaCBsaXRlcmFsIHN5bWJvbHMsIHNvIGFsbCB0aGUgYml0IGNvZGVzCisvLyAgICBjYW4gZml0IGludG8gYSBzbWFsbCBsb29rLXVwIHRhYmxlIHBhY2tlZF90YWJsZVtdCisvLyBUaGUgY29tbW9uIGxpdGVyYWwgYmFzZSwgaWYgYXBwbGljYWJsZSwgaXMgc3RvcmVkIGluICdsaXRlcmFsX2FyYicuCit0eXBlZGVmIHN0cnVjdCBIVHJlZUdyb3VwIEhUcmVlR3JvdXA7CitzdHJ1Y3QgSFRyZWVHcm91cCB7CisgIEh1ZmZtYW5Db2RlKiBodHJlZXNbSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXTsKKyAgaW50ICAgICAgaXNfdHJpdmlhbF9saXRlcmFsOyAgLy8gVHJ1ZSwgaWYgaHVmZm1hbiB0cmVlcyBmb3IgUmVkLCBCbHVlICYgQWxwaGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9scyBhcmUgdHJpdmlhbCAoaGF2ZSBhIHNpbmdsZSBjb2RlKS4KKyAgdWludDMyX3QgbGl0ZXJhbF9hcmI7ICAgICAgICAgLy8gSWYgaXNfdHJpdmlhbF9saXRlcmFsIGlzIHRydWUsIHRoaXMgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFSR0IgdmFsdWUgb2YgdGhlIHBpeGVsLCB3aXRoIEdyZWVuIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgc2V0IHRvIHplcm8uCisgIGludCBpc190cml2aWFsX2NvZGU7ICAgICAgICAgIC8vIHRydWUgaWYgaXNfdHJpdmlhbF9saXRlcmFsIHdpdGggb25seSBvbmUgY29kZQorICBpbnQgdXNlX3BhY2tlZF90YWJsZTsgICAgICAgICAvLyB1c2UgcGFja2VkIHRhYmxlIGJlbG93IGZvciBzaG9ydCBsaXRlcmFsIGNvZGUKKyAgLy8gdGFibGUgbWFwcGluZyBpbnB1dCBiaXRzIHRvIGEgcGFja2VkIHZhbHVlcywgb3IgZXNjYXBlIGNhc2UgdG8gbGl0ZXJhbCBjb2RlCisgIEh1ZmZtYW5Db2RlMzIgcGFja2VkX3RhYmxlW0hVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkVdOworfTsKKworLy8gQ3JlYXRlcyB0aGUgaW5zdGFuY2Ugb2YgSFRyZWVHcm91cCB3aXRoIHNwZWNpZmllZCBudW1iZXIgb2YgdHJlZS1ncm91cHMuCitIVHJlZUdyb3VwKiBWUDhMSHRyZWVHcm91cHNOZXcoaW50IG51bV9odHJlZV9ncm91cHMpOworCisvLyBSZWxlYXNlcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgSFRyZWVHcm91cC4KK3ZvaWQgVlA4TEh0cmVlR3JvdXBzRnJlZShIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cHMpOworCisvLyBCdWlsZHMgSHVmZm1hbiBsb29rdXAgdGFibGUgYXNzdW1pbmcgY29kZSBsZW5ndGhzIGFyZSBpbiBzeW1ib2wgb3JkZXIuCisvLyBUaGUgJ2NvZGVfbGVuZ3RocycgaXMgcHJlLWFsbG9jYXRlZCB0ZW1wb3JhcnkgbWVtb3J5IGJ1ZmZlciB1c2VkIGZvciBjcmVhdGluZworLy8gdGhlIGh1ZmZtYW4gdGFibGUuCisvLyBSZXR1cm5zIGJ1aWx0IHRhYmxlIHNpemUgb3IgMCBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHRyZWUgb3IKKy8vIG1lbW9yeSBlcnJvcikuCitpbnQgVlA4TEJ1aWxkSHVmZm1hblRhYmxlKEh1ZmZtYW5Db2RlKiBjb25zdCByb290X3RhYmxlLCBpbnQgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZV9sZW5ndGhzW10sIGludCBjb2RlX2xlbmd0aHNfc2l6ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX1VUSUxTX0hVRkZNQU5fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MThhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5jCkBAIC0wLDAgKzEsMjg1IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1wbGVtZW50IGdyYWRpZW50IHNtb290aGluZzogd2UgcmVwbGFjZSBhIGN1cnJlbnQgYWxwaGEgdmFsdWUgYnkgaXRzCisvLyBzdXJyb3VuZGluZyBhdmVyYWdlIGlmIGl0J3MgY2xvc2UgZW5vdWdoICh0aGF0IGlzOiB0aGUgY2hhbmdlIHdpbGwgYmUgbGVzcworLy8gdGhhbiB0aGUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBxdWFudGl6ZWQgbGV2ZWwpLgorLy8gV2UgdXNlIHNsaWRpbmcgd2luZG93IGZvciBjb21wdXRpbmcgdGhlIDJkIG1vdmluZyBhdmVyYWdlLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIG1lbXNldAorCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vICNkZWZpbmUgVVNFX0RJVEhFUklORyAgIC8vIHVuY29tbWVudCB0byBlbmFibGUgb3JkZXJlZCBkaXRoZXJpbmcgKG5vdCB2aXRhbCkKKworI2RlZmluZSBGSVggMTYgICAgIC8vIGZpeC1wb2ludCBwcmVjaXNpb24gZm9yIGF2ZXJhZ2luZworI2RlZmluZSBMRklYIDIgICAgIC8vIGV4dHJhIHByZWNpc2lvbiBmb3IgbG9vay11cCB0YWJsZQorI2RlZmluZSBMVVRfU0laRSAoKDEgPDwgKDggKyBMRklYKSkgLSAxKSAgLy8gbG9vay11cCB0YWJsZSBzaXplCisKKyNpZiBkZWZpbmVkKFVTRV9ESVRIRVJJTkcpCisKKyNkZWZpbmUgREZJWCA0ICAgICAgICAgICAvLyBleHRyYSBwcmVjaXNpb24gZm9yIG9yZGVyZWQgZGl0aGVyaW5nCisjZGVmaW5lIERTSVpFIDQgICAgICAgICAgLy8gZGl0aGVyaW5nIHNpemUgKG11c3QgYmUgYSBwb3dlciBvZiB0d28pCisvLyBjZi4gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcmRlcmVkX2RpdGhlcmluZworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga09yZGVyZWREaXRoZXJbRFNJWkVdW0RTSVpFXSA9IHsKKyAgeyAgMCwgIDgsICAyLCAxMCB9LCAgICAgLy8gY29lZmZpY2llbnRzIGFyZSBpbiBERklYIGZpeGVkLXBvaW50IHByZWNpc2lvbgorICB7IDEyLCAgNCwgMTQsICA2IH0sCisgIHsgIDMsIDExLCAgMSwgIDkgfSwKKyAgeyAxNSwgIDcsIDEzLCAgNSB9Cit9OworCisjZWxzZQorI2RlZmluZSBERklYIDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB3aWR0aF8sIGhlaWdodF87ICAvLyBkaW1lbnNpb24KKyAgaW50IHN0cmlkZV87ICAgICAgICAgIC8vIHN0cmlkZSBpbiBieXRlcworICBpbnQgcm93XzsgICAgICAgICAgICAgLy8gY3VycmVudCBpbnB1dCByb3cgYmVpbmcgcHJvY2Vzc2VkCisgIHVpbnQ4X3QqIHNyY187ICAgICAgICAvLyBpbnB1dCBwb2ludGVyCisgIHVpbnQ4X3QqIGRzdF87ICAgICAgICAvLyBvdXRwdXQgcG9pbnRlcgorCisgIGludCByYWRpdXNfOyAgICAgICAgICAvLyBmaWx0ZXIgcmFkaXVzICg9ZGVsYXkpCisgIGludCBzY2FsZV87ICAgICAgICAgICAvLyBub3JtYWxpemF0aW9uIGZhY3RvciwgaW4gRklYIGJpdHMgcHJlY2lzaW9uCisKKyAgdm9pZCogbWVtXzsgICAgICAgICAgIC8vIGFsbCBtZW1vcnkKKworICAvLyB2YXJpb3VzIHNjcmF0Y2ggYnVmZmVycworICB1aW50MTZfdCogc3RhcnRfOworICB1aW50MTZfdCogY3VyXzsKKyAgdWludDE2X3QqIGVuZF87CisgIHVpbnQxNl90KiB0b3BfOworICB1aW50MTZfdCogYXZlcmFnZV87CisKKyAgLy8gaW5wdXQgbGV2ZWxzIGRpc3RyaWJ1dGlvbgorICBpbnQgbnVtX2xldmVsc187ICAgICAgIC8vIG51bWJlciBvZiBxdWFudGl6ZWQgbGV2ZWxzCisgIGludCBtaW5fLCBtYXhfOyAgICAgICAgLy8gbWluIGFuZCBtYXggbGV2ZWwgdmFsdWVzCisgIGludCBtaW5fbGV2ZWxfZGlzdF87ICAgLy8gc21hbGxlc3QgZGlzdGFuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgbGV2ZWxzCisKKyAgaW50MTZfdCogY29ycmVjdGlvbl87ICAvLyBzaXplID0gMSArIDIqTFVUX1NJWkUgIC0+IH40ayBtZW1vcnkKK30gU21vb3RoUGFyYW1zOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENMSVBfOGJfTUFTSyAoaW50KSh+MFUgPDwgKDggKyBERklYKSkKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGNsaXBfOGIoaW50IHYpIHsKKyAgcmV0dXJuICghKHYgJiBDTElQXzhiX01BU0spKSA/ICh1aW50OF90KSh2ID4+IERGSVgpIDogKHYgPCAwKSA/IDB1IDogMjU1dTsKK30KKyN1bmRlZiBDTElQXzhiX01BU0sKKworLy8gdmVydGljYWwgYWNjdW11bGF0aW9uCitzdGF0aWMgdm9pZCBWRmlsdGVyKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBjb25zdCB1aW50OF90KiBzcmMgPSBwLT5zcmNfOworICBjb25zdCBpbnQgdyA9IHAtPndpZHRoXzsKKyAgdWludDE2X3QqIGNvbnN0IGN1ciA9IHAtPmN1cl87CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB0b3AgPSBwLT50b3BfOworICB1aW50MTZfdCogY29uc3Qgb3V0ID0gcC0+ZW5kXzsKKyAgdWludDE2X3Qgc3VtID0gMDsgICAgICAgICAgICAgICAvLyBhbGwgYXJpdGhtZXRpYyBpcyBtb2R1bG8gMTZiaXQKKyAgaW50IHg7CisKKyAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgIHVpbnQxNl90IG5ld192YWx1ZTsKKyAgICBzdW0gKz0gc3JjW3hdOworICAgIG5ld192YWx1ZSA9IHRvcFt4XSArIHN1bTsKKyAgICBvdXRbeF0gPSBuZXdfdmFsdWUgLSBjdXJbeF07ICAvLyB2ZXJ0aWNhbCBzdW0gb2YgJ3InIHBpeGVscy4KKyAgICBjdXJbeF0gPSBuZXdfdmFsdWU7CisgIH0KKyAgLy8gbW92ZSBpbnB1dCBwb2ludGVycyBvbmUgcm93IGRvd24KKyAgcC0+dG9wXyA9IHAtPmN1cl87CisgIHAtPmN1cl8gKz0gdzsKKyAgaWYgKHAtPmN1cl8gPT0gcC0+ZW5kXykgcC0+Y3VyXyA9IHAtPnN0YXJ0XzsgIC8vIHJvbGwtb3ZlcgorICAvLyBXZSByZXBsaWNhdGUgZWRnZXMsIGFzIGl0J3Mgc29tZXdoYXQgZWFzaWVyIGFzIGEgYm91bmRhcnkgY29uZGl0aW9uLgorICAvLyBUaGF0J3Mgd2h5IHdlIGRvbid0IHVwZGF0ZSB0aGUgJ3NyYycgcG9pbnRlciBvbiB0b3AvYm90dG9tIGFyZWE6CisgIGlmIChwLT5yb3dfID49IDAgJiYgcC0+cm93XyA8IHAtPmhlaWdodF8gLSAxKSB7CisgICAgcC0+c3JjXyArPSBwLT5zdHJpZGVfOworICB9Cit9CisKKy8vIGhvcml6b250YWwgYWNjdW11bGF0aW9uLiBXZSB1c2UgbWlycm9yIHJlcGxpY2F0aW9uIG9mIG1pc3NpbmcgcGl4ZWxzLCBhcyBpdCdzCisvLyBhIGxpdHRsZSBlYXNpZXIgdG8gaW1wbGVtZW50IChzdXJwcmlzaW5nbHkpLgorc3RhdGljIHZvaWQgSEZpbHRlcihTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGluID0gcC0+ZW5kXzsKKyAgdWludDE2X3QqIGNvbnN0IG91dCA9IHAtPmF2ZXJhZ2VfOworICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IHAtPnNjYWxlXzsKKyAgY29uc3QgaW50IHcgPSBwLT53aWR0aF87CisgIGNvbnN0IGludCByID0gcC0+cmFkaXVzXzsKKworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8PSByOyArK3gpIHsgICAvLyBsZWZ0IG1pcnJvcmluZworICAgIGNvbnN0IHVpbnQxNl90IGRlbHRhID0gaW5beCArIHIgLSAxXSArIGluW3IgLSB4XTsKKyAgICBvdXRbeF0gPSAoZGVsdGEgKiBzY2FsZSkgPj4gRklYOworICB9CisgIGZvciAoOyB4IDwgdyAtIHI7ICsreCkgeyAgICAgLy8gYnVsayBtaWRkbGUgcnVuCisgICAgY29uc3QgdWludDE2X3QgZGVsdGEgPSBpblt4ICsgcl0gLSBpblt4IC0gciAtIDFdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KKyAgZm9yICg7IHggPCB3OyArK3gpIHsgICAgICAgICAvLyByaWdodCBtaXJyb3JpbmcKKyAgICBjb25zdCB1aW50MTZfdCBkZWx0YSA9CisgICAgICAgIDIgKiBpblt3IC0gMV0gLSBpblsyICogdyAtIDIgLSByIC0geF0gLSBpblt4IC0gciAtIDFdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KK30KKworLy8gZW1pdCBvbmUgZmlsdGVyZWQgb3V0cHV0IHJvdworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXIoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBhdmVyYWdlID0gcC0+YXZlcmFnZV87CisgIGNvbnN0IGludCB3ID0gcC0+d2lkdGhfOworICBjb25zdCBpbnQxNl90KiBjb25zdCBjb3JyZWN0aW9uID0gcC0+Y29ycmVjdGlvbl87CisjaWYgZGVmaW5lZChVU0VfRElUSEVSSU5HKQorICBjb25zdCB1aW50OF90KiBjb25zdCBkaXRoZXIgPSBrT3JkZXJlZERpdGhlcltwLT5yb3dfICUgRFNJWkVdOworI2VuZGlmCisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHAtPmRzdF87CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgY29uc3QgaW50IHYgPSBkc3RbeF07CisgICAgaWYgKHYgPCBwLT5tYXhfICYmIHYgPiBwLT5taW5fKSB7CisgICAgICBjb25zdCBpbnQgYyA9ICh2IDw8IERGSVgpICsgY29ycmVjdGlvblthdmVyYWdlW3hdIC0gKHYgPDwgTEZJWCldOworI2lmIGRlZmluZWQoVVNFX0RJVEhFUklORykKKyAgICAgIGRzdFt4XSA9IGNsaXBfOGIoYyArIGRpdGhlclt4ICUgRFNJWkVdKTsKKyNlbHNlCisgICAgICBkc3RbeF0gPSBjbGlwXzhiKGMpOworI2VuZGlmCisgICAgfQorICB9CisgIHAtPmRzdF8gKz0gcC0+c3RyaWRlXzsgIC8vIGFkdmFuY2Ugb3V0cHV0IHBvaW50ZXIKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXRpYWxpemUgY29ycmVjdGlvbiB0YWJsZQorCitzdGF0aWMgdm9pZCBJbml0Q29ycmVjdGlvbkxVVChpbnQxNl90KiBjb25zdCBsdXQsIGludCBtaW5fZGlzdCkgeworICAvLyBUaGUgY29ycmVjdGlvbiBjdXJ2ZSBpczoKKyAgLy8gICBmKHgpID0geCBmb3IgeCA8PSB0aHJlc2hvbGQyCisgIC8vICAgZih4KSA9IDAgZm9yIHggPj0gdGhyZXNob2xkMQorICAvLyBhbmQgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgcmFuZ2UgeD1bdGhyZXNob2xkMiwgdGhyZXNob2xkMV0KKyAgLy8gKGFsb25nIHdpdGggZigteCkgPSAtZih4KSBzeW1tZXRyeSkuCisgIC8vIE5vdGUgdGhhdDogdGhyZXNob2xkMiA9IDMvNCAqIHRocmVzaG9sZDEKKyAgY29uc3QgaW50IHRocmVzaG9sZDEgPSBtaW5fZGlzdCA8PCBMRklYOworICBjb25zdCBpbnQgdGhyZXNob2xkMiA9ICgzICogdGhyZXNob2xkMSkgPj4gMjsKKyAgY29uc3QgaW50IG1heF90aHJlc2hvbGQgPSB0aHJlc2hvbGQyIDw8IERGSVg7CisgIGNvbnN0IGludCBkZWx0YSA9IHRocmVzaG9sZDEgLSB0aHJlc2hvbGQyOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8PSBMVVRfU0laRTsgKytpKSB7CisgICAgaW50IGMgPSAoaSA8PSB0aHJlc2hvbGQyKSA/IChpIDw8IERGSVgpCisgICAgICAgICAgOiAoaSA8IHRocmVzaG9sZDEpID8gbWF4X3RocmVzaG9sZCAqICh0aHJlc2hvbGQxIC0gaSkgLyBkZWx0YQorICAgICAgICAgIDogMDsKKyAgICBjID4+PSBMRklYOworICAgIGx1dFsraV0gPSArYzsKKyAgICBsdXRbLWldID0gLWM7CisgIH0KKyAgbHV0WzBdID0gMDsKK30KKworc3RhdGljIHZvaWQgQ291bnRMZXZlbHMoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGludCBpLCBqLCBsYXN0X2xldmVsOworICB1aW50OF90IHVzZWRfbGV2ZWxzWzI1Nl0gPSB7IDAgfTsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IHAtPnNyY187CisgIHAtPm1pbl8gPSAyNTU7CisgIHAtPm1heF8gPSAwOworICBmb3IgKGogPSAwOyBqIDwgcC0+aGVpZ2h0XzsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHAtPndpZHRoXzsgKytpKSB7CisgICAgICBjb25zdCBpbnQgdiA9IGRhdGFbaV07CisgICAgICBpZiAodiA8IHAtPm1pbl8pIHAtPm1pbl8gPSB2OworICAgICAgaWYgKHYgPiBwLT5tYXhfKSBwLT5tYXhfID0gdjsKKyAgICAgIHVzZWRfbGV2ZWxzW3ZdID0gMTsKKyAgICB9CisgICAgZGF0YSArPSBwLT5zdHJpZGVfOworICB9CisgIC8vIENvbXB1dGUgdGhlIG1pbmludW0gZGlzdGFuY2UgYmV0d2VlbiB0d28gbm9uLXplcm8gbGV2ZWxzLgorICBwLT5taW5fbGV2ZWxfZGlzdF8gPSBwLT5tYXhfIC0gcC0+bWluXzsKKyAgbGFzdF9sZXZlbCA9IC0xOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICBpZiAodXNlZF9sZXZlbHNbaV0pIHsKKyAgICAgICsrcC0+bnVtX2xldmVsc187CisgICAgICBpZiAobGFzdF9sZXZlbCA+PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBsZXZlbF9kaXN0ID0gaSAtIGxhc3RfbGV2ZWw7CisgICAgICAgIGlmIChsZXZlbF9kaXN0IDwgcC0+bWluX2xldmVsX2Rpc3RfKSB7CisgICAgICAgICAgcC0+bWluX2xldmVsX2Rpc3RfID0gbGV2ZWxfZGlzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdF9sZXZlbCA9IGk7CisgICAgfQorICB9Cit9CisKKy8vIEluaXRpYWxpemUgYWxsIHBhcmFtcy4KK3N0YXRpYyBpbnQgSW5pdFBhcmFtcyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHJhZGl1cywgU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IGludCBSID0gMiAqIHJhZGl1cyArIDE7ICAvLyB0b3RhbCBzaXplIG9mIHRoZSBrZXJuZWwKKworICBjb25zdCBzaXplX3Qgc2l6ZV9zY3JhdGNoX20gPSAoUiArIDEpICogd2lkdGggKiBzaXplb2YoKnAtPnN0YXJ0Xyk7CisgIGNvbnN0IHNpemVfdCBzaXplX20gPSAgd2lkdGggKiBzaXplb2YoKnAtPmF2ZXJhZ2VfKTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfbHV0ID0gKDEgKyAyICogTFVUX1NJWkUpICogc2l6ZW9mKCpwLT5jb3JyZWN0aW9uXyk7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0gc2l6ZV9zY3JhdGNoX20gKyBzaXplX20gKyBzaXplX2x1dDsKKyAgdWludDhfdCogbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVLCB0b3RhbF9zaXplKTsKKworICBpZiAobWVtID09IE5VTEwpIHJldHVybiAwOworICBwLT5tZW1fID0gKHZvaWQqKW1lbTsKKworICBwLT5zdGFydF8gPSAodWludDE2X3QqKW1lbTsKKyAgcC0+Y3VyXyA9IHAtPnN0YXJ0XzsKKyAgcC0+ZW5kXyA9IHAtPnN0YXJ0XyArIFIgKiB3aWR0aDsKKyAgcC0+dG9wXyA9IHAtPmVuZF8gLSB3aWR0aDsKKyAgbWVtc2V0KHAtPnRvcF8sIDAsIHdpZHRoICogc2l6ZW9mKCpwLT50b3BfKSk7CisgIG1lbSArPSBzaXplX3NjcmF0Y2hfbTsKKworICBwLT5hdmVyYWdlXyA9ICh1aW50MTZfdCopbWVtOworICBtZW0gKz0gc2l6ZV9tOworCisgIHAtPndpZHRoXyA9IHdpZHRoOworICBwLT5oZWlnaHRfID0gaGVpZ2h0OworICBwLT5zdHJpZGVfID0gc3RyaWRlOworICBwLT5zcmNfID0gZGF0YTsKKyAgcC0+ZHN0XyA9IGRhdGE7CisgIHAtPnJhZGl1c18gPSByYWRpdXM7CisgIHAtPnNjYWxlXyA9ICgxIDw8IChGSVggKyBMRklYKSkgLyAoUiAqIFIpOyAgLy8gbm9ybWFsaXphdGlvbiBjb25zdGFudAorICBwLT5yb3dfID0gLXJhZGl1czsKKworICAvLyBhbmFseXplIHRoZSBpbnB1dCBkaXN0cmlidXRpb24gc28gd2UgY2FuIGJlc3QtZml0IHRoZSB0aHJlc2hvbGQKKyAgQ291bnRMZXZlbHMocCk7CisKKyAgLy8gY29ycmVjdGlvbiB0YWJsZQorICBwLT5jb3JyZWN0aW9uXyA9ICgoaW50MTZfdCopbWVtKSArIExVVF9TSVpFOworICBJbml0Q29ycmVjdGlvbkxVVChwLT5jb3JyZWN0aW9uXywgcC0+bWluX2xldmVsX2Rpc3RfKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ2xlYW51cFBhcmFtcyhTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgV2ViUFNhZmVGcmVlKHAtPm1lbV8pOworfQorCitpbnQgV2ViUERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlbmd0aCkgeworICBjb25zdCBpbnQgcmFkaXVzID0gNCAqIHN0cmVuZ3RoIC8gMTAwOworICBpZiAoc3RyZW5ndGggPCAwIHx8IHN0cmVuZ3RoID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsgIC8vIGJhZCBwYXJhbXMKKyAgaWYgKHJhZGl1cyA+IDApIHsKKyAgICBTbW9vdGhQYXJhbXMgcDsKKyAgICBtZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7CisgICAgaWYgKCFJbml0UGFyYW1zKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcmFkaXVzLCAmcCkpIHJldHVybiAwOworICAgIGlmIChwLm51bV9sZXZlbHNfID4gMikgeworICAgICAgZm9yICg7IHAucm93XyA8IHAuaGVpZ2h0XzsgKytwLnJvd18pIHsKKyAgICAgICAgVkZpbHRlcigmcCk7ICAvLyBhY2N1bXVsYXRlIGF2ZXJhZ2Ugb2YgaW5wdXQKKyAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZldyByb3dzIGluIG9yZGVyIHRvIHByaW1lIHRoZSBmaWx0ZXIsCisgICAgICAgIC8vIGJlZm9yZSBlbWl0dGluZyBzb21lIG91dHB1dC4KKyAgICAgICAgaWYgKHAucm93XyA+PSBwLnJhZGl1c18pIHsKKyAgICAgICAgICBIRmlsdGVyKCZwKTsKKyAgICAgICAgICBBcHBseUZpbHRlcigmcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2xlYW51cFBhcmFtcygmcCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEgcGxhbmUgZGUtcXVhbnRpemF0aW9uIHV0aWxpdHkKKy8vCisvLyBBdXRob3I6ICBWaWthcyBBcm9yYSAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19VVElMU19IXworCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBBcHBseSBwb3N0LXByb2Nlc3NpbmcgdG8gaW5wdXQgJ2RhdGEnIG9mIHNpemUgJ3dpZHRoJ3gnaGVpZ2h0JyBhc3N1bWluZyB0aGF0CisvLyB0aGUgc291cmNlIHdhcyBxdWFudGl6ZWQgdG8gYSByZWR1Y2VkIG51bWJlciBvZiBsZXZlbHMuICdzdHJpZGUnIGlzIGluIGJ5dGVzLgorLy8gU3RyZW5ndGggaXMgaW4gWzAuLjEwMF0gYW5kIGNvbnRyb2xzIHRoZSBhbW91bnQgb2YgZGl0aGVyaW5nIGFwcGxpZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgaW52YWxpZCBwYXJhbWV0ZXJzLAorLy8gbWFsbG9jIGZhaWx1cmUsIC4uLikuCitpbnQgV2ViUERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlbmd0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19ERUNfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMKaW5kZXggMmZiNjEwYi4uZDY1YWQzYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jCkBAIC0xMiwxNyArMTIsOSBAQAogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQogI2luY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCiAKLSNpbmNsdWRlICIuL3F1YW50X2xldmVscy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgiCiAKICNkZWZpbmUgTlVNX1NZTUJPTFMgICAgIDI1NgogCkBAIC03Niw4ICs2OCw4IEBACiAgIC8vIEZpeGVkIHZhbHVlcy4gV29uJ3QgYmUgY2hhbmdlZC4KICAgcV9sZXZlbFttaW5fc10gPSAwOwogICBxX2xldmVsW21heF9zXSA9IG51bV9sZXZlbHMgLSAxOwotICBTQl9EQ0hFQ0soaW52X3FfbGV2ZWxbMF0gPT0gbWluX3MpOwotICBTQl9EQ0hFQ0soaW52X3FfbGV2ZWxbbnVtX2xldmVscyAtIDFdID09IG1heF9zKTsKKyAgYXNzZXJ0KGludl9xX2xldmVsWzBdID09IG1pbl9zKTsKKyAgYXNzZXJ0KGludl9xX2xldmVsW251bV9sZXZlbHMgLSAxXSA9PSBtYXhfcyk7CiAKICAgLy8gay1NZWFucyBpdGVyYXRpb25zLgogICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgTUFYX0lURVI7ICsraXRlcikgewpAQCAtMTQ2LDYgKzEzOCwzIEBACiAgIHJldHVybiAxOwogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgKaW5kZXggMmQ5MDgyOC4uNzVkZjJiYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5oCkBAIC0xMSwxNCArMTEsMTQgQEAKIC8vCiAvLyBBdXRob3I6ICBWaWthcyBBcm9yYSAodmlrYXNhQGdvb2dsZS5jb20pCiAKLSNpZm5kZWYgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfSF8KKyNpZm5kZWYgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfVVRJTFNfSF8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKQEAgLTI5LDggKzI5LDggQEAKIGludCBRdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBudW1fbGV2ZWxzLAogICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBjb25zdCBzc2UpOwogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAgIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0hfICovCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkMjZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUHNldWRvLXJhbmRvbSB1dGlsaXRpZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIDMxYi1yYW5nZSB2YWx1ZXMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrUmFuZG9tVGFibGVbVlA4X1JBTkRPTV9UQUJMRV9TSVpFXSA9IHsKKyAgMHgwZGUxNTIzMCwgMHgwM2IzMTg4NiwgMHg3NzVmYWNjYiwgMHgxYzg4NjI2YSwgMHg2ODM4NWM1NSwgMHgxNGIzYjgyOCwKKyAgMHg0YTg1ZmVmOCwgMHg0OWRkYjg0YiwgMHg2NGZjZjM5NywgMHg1YzU1MDI4OSwgMHg0YTI5MDAwMCwgMHgwZDdlYzFkYSwKKyAgMHg1OTQwYjdhYiwgMHg1NDkyNTc3ZCwgMHg0ZTE5Y2E3MiwgMHgzOGQzOGM2OSwgMHgwYzAxZWU2NSwgMHgzMmExNzU1ZiwKKyAgMHg1NDM3ZjY1MiwgMHg1YWJiMmMzMiwgMHgwZmFhNTdiMSwgMHg3M2Y1MzNlNywgMHg2ODVmZWVkYSwgMHg3NTYzY2NlMiwKKyAgMHg2ZTk5MGU4MywgMHg0NzMwYTdlZCwgMHg0ZmMwZDljNiwgMHg0OTZiMTUzYywgMHg0ZjE0MDNmYSwgMHg1NDFhZmIwYywKKyAgMHg3Mzk5MGIzMiwgMHgyNmQ3Y2IxYywgMHg2ZmNjMzcwNiwgMHgyY2JiNzdkOCwgMHg3NTc2MmYyYSwgMHg2NDI1Y2NkZCwKKyAgMHgyNGIzNTQ2MSwgMHgwYTdkODcxNSwgMHgyMjA0MTRhOCwgMHgxNDFlYmY2NywgMHg1NmI0MTU4MywgMHg3M2U1MDJlMywKKyAgMHg0NGNhYjE2ZiwgMHgyODI2NGQ0MiwgMHg3M2JhYWVmYiwgMHgwYTUwZWJlZCwgMHgxZDZhYjZmYiwgMHgwZDNhZDQwYiwKKyAgMHgzNWRiM2I2OCwgMHgyYjA4MWU4MywgMHg3N2NlNmI5NSwgMHg1MTgxZTVmMCwgMHg3ODg1M2JiYywgMHgwMDlmOTQ5NCwKKyAgMHgyN2U1ZWQzYworfTsKKwordm9pZCBWUDhJbml0UmFuZG9tKFZQOFJhbmRvbSogY29uc3QgcmcsIGZsb2F0IGRpdGhlcmluZykgeworICBtZW1jcHkocmctPnRhYl8sIGtSYW5kb21UYWJsZSwgc2l6ZW9mKHJnLT50YWJfKSk7CisgIHJnLT5pbmRleDFfID0gMDsKKyAgcmctPmluZGV4Ml8gPSAzMTsKKyAgcmctPmFtcF8gPSAoZGl0aGVyaW5nIDwgMC4wKSA/IDAKKyAgICAgICAgICAgOiAoZGl0aGVyaW5nID4gMS4wKSA/ICgxIDw8IFZQOF9SQU5ET01fRElUSEVSX0ZJWCkKKyAgICAgICAgICAgOiAodWludDMyX3QpKCgxIDw8IFZQOF9SQU5ET01fRElUSEVSX0ZJWCkgKiBkaXRoZXJpbmcpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkNWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUHNldWRvLXJhbmRvbSB1dGlsaXRpZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfUkFORE9NX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfUkFORE9NX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFZQOF9SQU5ET01fRElUSEVSX0ZJWCA4ICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBkaXRoZXJpbmcKKyNkZWZpbmUgVlA4X1JBTkRPTV9UQUJMRV9TSVpFIDU1CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGluZGV4MV8sIGluZGV4Ml87CisgIHVpbnQzMl90IHRhYl9bVlA4X1JBTkRPTV9UQUJMRV9TSVpFXTsKKyAgaW50IGFtcF87Cit9IFZQOFJhbmRvbTsKKworLy8gSW5pdGlhbGl6ZXMgcmFuZG9tIGdlbmVyYXRvciB3aXRoIGFuIGFtcGxpdHVkZSAnZGl0aGVyaW5nJyBpbiByYW5nZSBbMC4uMV0uCit2b2lkIFZQOEluaXRSYW5kb20oVlA4UmFuZG9tKiBjb25zdCByZywgZmxvYXQgZGl0aGVyaW5nKTsKKworLy8gUmV0dXJucyBhIGNlbnRlcmVkIHBzZXVkby1yYW5kb20gbnVtYmVyIHdpdGggJ251bV9iaXRzJyBhbXBsaXR1ZGUuCisvLyAodXNlcyBELktudXRoJ3MgRGlmZmVyZW5jZS1iYXNlZCByYW5kb20gZ2VuZXJhdG9yKS4KKy8vICdhbXAnIGlzIGluIFZQOF9SQU5ET01fRElUSEVSX0ZJWCBmaXhlZC1wb2ludCBwcmVjaXNpb24uCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJhbmRvbUJpdHMyKFZQOFJhbmRvbSogY29uc3QgcmcsIGludCBudW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFtcCkgeworICBpbnQgZGlmZjsKKyAgU0JfRENIRUNLKG51bV9iaXRzICsgVlA4X1JBTkRPTV9ESVRIRVJfRklYIDw9IDMxKTsKKyAgZGlmZiA9IHJnLT50YWJfW3JnLT5pbmRleDFfXSAtIHJnLT50YWJfW3JnLT5pbmRleDJfXTsKKyAgaWYgKGRpZmYgPCAwKSBkaWZmICs9ICgxdSA8PCAzMSk7CisgIHJnLT50YWJfW3JnLT5pbmRleDFfXSA9IGRpZmY7CisgIGlmICgrK3JnLT5pbmRleDFfID09IFZQOF9SQU5ET01fVEFCTEVfU0laRSkgcmctPmluZGV4MV8gPSAwOworICBpZiAoKytyZy0+aW5kZXgyXyA9PSBWUDhfUkFORE9NX1RBQkxFX1NJWkUpIHJnLT5pbmRleDJfID0gMDsKKyAgLy8gc2lnbi1leHRlbmQsIDAtY2VudGVyCisgIGRpZmYgPSAoaW50KSgodWludDMyX3QpZGlmZiA8PCAxKSA+PiAoMzIgLSBudW1fYml0cyk7CisgIGRpZmYgPSAoZGlmZiAqIGFtcCkgPj4gVlA4X1JBTkRPTV9ESVRIRVJfRklYOyAgLy8gcmVzdHJpY3QgcmFuZ2UKKyAgZGlmZiArPSAxIDw8IChudW1fYml0cyAtIDEpOyAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBiYWNrIHRvIDAuNS1jZW50ZXIKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmFuZG9tQml0cyhWUDhSYW5kb20qIGNvbnN0IHJnLCBpbnQgbnVtX2JpdHMpIHsKKyAgcmV0dXJuIFZQOFJhbmRvbUJpdHMyKHJnLCBudW1fYml0cywgcmctPmFtcF8pOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19SQU5ET01fVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMmVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5jCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgcmVzY2FsZXJfdCogY29uc3Qgd29yaykgeworICBjb25zdCBpbnQgeF9hZGQgPSBzcmNfd2lkdGgsIHhfc3ViID0gZHN0X3dpZHRoOworICBjb25zdCBpbnQgeV9hZGQgPSBzcmNfaGVpZ2h0LCB5X3N1YiA9IGRzdF9oZWlnaHQ7CisgIHdyay0+eF9leHBhbmQgPSAoc3JjX3dpZHRoIDwgZHN0X3dpZHRoKTsKKyAgd3JrLT55X2V4cGFuZCA9IChzcmNfaGVpZ2h0IDwgZHN0X2hlaWdodCk7CisgIHdyay0+c3JjX3dpZHRoID0gc3JjX3dpZHRoOworICB3cmstPnNyY19oZWlnaHQgPSBzcmNfaGVpZ2h0OworICB3cmstPmRzdF93aWR0aCA9IGRzdF93aWR0aDsKKyAgd3JrLT5kc3RfaGVpZ2h0ID0gZHN0X2hlaWdodDsKKyAgd3JrLT5zcmNfeSA9IDA7CisgIHdyay0+ZHN0X3kgPSAwOworICB3cmstPmRzdCA9IGRzdDsKKyAgd3JrLT5kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZTsKKyAgd3JrLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisKKyAgLy8gZm9yICd4X2V4cGFuZCcsIHdlIHVzZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgIHdyay0+eF9hZGQgPSB3cmstPnhfZXhwYW5kID8gKHhfc3ViIC0gMSkgOiB4X2FkZDsKKyAgd3JrLT54X3N1YiA9IHdyay0+eF9leHBhbmQgPyAoeF9hZGQgLSAxKSA6IHhfc3ViOworICBpZiAoIXdyay0+eF9leHBhbmQpIHsgIC8vIGZ4X3NjYWxlIGlzIG5vdCB1c2VkIG90aGVyd2lzZQorICAgIHdyay0+Znhfc2NhbGUgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoMSwgd3JrLT54X3N1Yik7CisgIH0KKyAgLy8gdmVydGljYWwgc2NhbGluZyBwYXJhbWV0ZXJzCisgIHdyay0+eV9hZGQgPSB3cmstPnlfZXhwYW5kID8geV9hZGQgLSAxIDogeV9hZGQ7CisgIHdyay0+eV9zdWIgPSB3cmstPnlfZXhwYW5kID8geV9zdWIgLSAxIDogeV9zdWI7CisgIHdyay0+eV9hY2N1bSA9IHdyay0+eV9leHBhbmQgPyB3cmstPnlfc3ViIDogd3JrLT55X2FkZDsKKyAgaWYgKCF3cmstPnlfZXhwYW5kKSB7CisgICAgLy8gVGhpcyBpcyBXRUJQX1JFU0NBTEVSX0ZSQUMoZHN0X2hlaWdodCwgeF9hZGQgKiB5X2FkZCkgd2l0aG91dCB0aGUgY2FzdC4KKyAgICAvLyBJdHMgdmFsdWUgaXMgPD0gV0VCUF9SRVNDQUxFUl9PTkUsIGJlY2F1c2UgZHN0X2hlaWdodCA8PSB3cmstPnlfYWRkLCBhbmQKKyAgICAvLyB3cmstPnhfYWRkID49IDE7CisgICAgY29uc3QgdWludDY0X3QgcmF0aW8gPQorICAgICAgICAodWludDY0X3QpZHN0X2hlaWdodCAqIFdFQlBfUkVTQ0FMRVJfT05FIC8gKHdyay0+eF9hZGQgKiB3cmstPnlfYWRkKTsKKyAgICBpZiAocmF0aW8gIT0gKHVpbnQzMl90KXJhdGlvKSB7CisgICAgICAvLyBXaGVuIHJhdGlvID09IFdFQlBfUkVTQ0FMRVJfT05FLCB3ZSBjYW4ndCByZXByZXNlbnQgdGhlIHJhdGlvIHdpdGggdGhlCisgICAgICAvLyBjdXJyZW50IGZpeGVkLXBvaW50IHByZWNpc2lvbi4gVGhpcyBoYXBwZW5zIHdoZW4gc3JjX2hlaWdodCA9PQorICAgICAgLy8gd3JrLT55X2FkZCAod2hpY2ggPT0gc3JjX2hlaWdodCksIGFuZCB3cmstPnhfYWRkID09IDEuCisgICAgICAvLyA9PiBXZSBzcGVjaWFsLWNhc2UgZnh5X3NjYWxlID0gMCwgaW4gV2ViUFJlc2NhbGVyRXhwb3J0Um93KCkuCisgICAgICB3cmstPmZ4eV9zY2FsZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyay0+Znh5X3NjYWxlID0gKHVpbnQzMl90KXJhdGlvOworICAgIH0KKyAgICB3cmstPmZ5X3NjYWxlID0gV0VCUF9SRVNDQUxFUl9GUkFDKDEsIHdyay0+eV9zdWIpOworICB9IGVsc2UgeworICAgIHdyay0+Znlfc2NhbGUgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoMSwgd3JrLT54X2FkZCk7CisgICAgLy8gd3JrLT5meHlfc2NhbGUgaXMgdW51c2VkIGhlcmUuCisgIH0KKyAgd3JrLT5pcm93ID0gd29yazsKKyAgd3JrLT5mcm93ID0gd29yayArIG51bV9jaGFubmVscyAqIGRzdF93aWR0aDsKKyAgbWVtc2V0KHdvcmssIDAsIDIgKiBkc3Rfd2lkdGggKiBudW1fY2hhbm5lbHMgKiBzaXplb2YoKndvcmspKTsKKworICBXZWJQUmVzY2FsZXJEc3BJbml0KCk7Cit9CisKK2ludCBXZWJQUmVzY2FsZXJHZXRTY2FsZWREaW1lbnNpb25zKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHNjYWxlZF9oZWlnaHQpIHsKKyAgYXNzZXJ0KHNjYWxlZF93aWR0aCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNjYWxlZF9oZWlnaHQgIT0gTlVMTCk7CisgIHsKKyAgICBpbnQgd2lkdGggPSAqc2NhbGVkX3dpZHRoOworICAgIGludCBoZWlnaHQgPSAqc2NhbGVkX2hlaWdodDsKKworICAgIC8vIGlmIHdpZHRoIGlzIHVuc3BlY2lmaWVkLCBzY2FsZSBvcmlnaW5hbCBwcm9wb3J0aW9uYWxseSB0byBoZWlnaHQgcmF0aW8uCisgICAgaWYgKHdpZHRoID09IDApIHsKKyAgICAgIHdpZHRoID0KKyAgICAgICAgICAoaW50KSgoKHVpbnQ2NF90KXNyY193aWR0aCAqIGhlaWdodCArIHNyY19oZWlnaHQgLyAyKSAvIHNyY19oZWlnaHQpOworICAgIH0KKyAgICAvLyBpZiBoZWlnaHQgaXMgdW5zcGVjaWZpZWQsIHNjYWxlIG9yaWdpbmFsIHByb3BvcnRpb25hbGx5IHRvIHdpZHRoIHJhdGlvLgorICAgIGlmIChoZWlnaHQgPT0gMCkgeworICAgICAgaGVpZ2h0ID0KKyAgICAgICAgICAoaW50KSgoKHVpbnQ2NF90KXNyY19oZWlnaHQgKiB3aWR0aCArIHNyY193aWR0aCAvIDIpIC8gc3JjX3dpZHRoKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIG92ZXJhbGwgZGltZW5zaW9ucyBzdGlsbCBtYWtlIHNlbnNlLgorICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqc2NhbGVkX3dpZHRoID0gd2lkdGg7CisgICAgKnNjYWxlZF9oZWlnaHQgPSBoZWlnaHQ7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFsbC1pbi1vbmUgY2FsbHMKKworaW50IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBtYXhfbnVtX2xpbmVzKSB7CisgIGNvbnN0IGludCBudW1fbGluZXMgPSAod3JrLT55X2FjY3VtICsgd3JrLT55X3N1YiAtIDEpIC8gd3JrLT55X3N1YjsKKyAgcmV0dXJuIChudW1fbGluZXMgPiBtYXhfbnVtX2xpbmVzKSA/IG1heF9udW1fbGluZXMgOiBudW1fbGluZXM7Cit9CisKK2ludCBXZWJQUmVzY2FsZXJJbXBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBudW1fbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUpIHsKKyAgaW50IHRvdGFsX2ltcG9ydGVkID0gMDsKKyAgd2hpbGUgKHRvdGFsX2ltcG9ydGVkIDwgbnVtX2xpbmVzICYmICFXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHdyaykpIHsKKyAgICBpZiAod3JrLT55X2V4cGFuZCkgeworICAgICAgcmVzY2FsZXJfdCogY29uc3QgdG1wID0gd3JrLT5pcm93OworICAgICAgd3JrLT5pcm93ID0gd3JrLT5mcm93OworICAgICAgd3JrLT5mcm93ID0gdG1wOworICAgIH0KKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3cod3JrLCBzcmMpOworICAgIGlmICghd3JrLT55X2V4cGFuZCkgeyAgICAgLy8gQWNjdW11bGF0ZSB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSBuZXcgcm93LgorICAgICAgaW50IHg7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd3JrLT5udW1fY2hhbm5lbHMgKiB3cmstPmRzdF93aWR0aDsgKyt4KSB7CisgICAgICAgIHdyay0+aXJvd1t4XSArPSB3cmstPmZyb3dbeF07CisgICAgICB9CisgICAgfQorICAgICsrd3JrLT5zcmNfeTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICArK3RvdGFsX2ltcG9ydGVkOworICAgIHdyay0+eV9hY2N1bSAtPSB3cmstPnlfc3ViOworICB9CisgIHJldHVybiB0b3RhbF9pbXBvcnRlZDsKK30KKworaW50IFdlYlBSZXNjYWxlckV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7CisgIGludCB0b3RhbF9leHBvcnRlZCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7CisgICAgKyt0b3RhbF9leHBvcnRlZDsKKyAgfQorICByZXR1cm4gdG90YWxfZXhwb3J0ZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTBlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfUkVTQ0FMRVJfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19SRVNDQUxFUl9VVElMU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfUkZJWCAzMiAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgbXVsdGlwbGllcworI2RlZmluZSBXRUJQX1JFU0NBTEVSX09ORSAoMXVsbCA8PCBXRUJQX1JFU0NBTEVSX1JGSVgpCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfRlJBQyh4LCB5KSBcCisgICAgKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoeCkgPDwgV0VCUF9SRVNDQUxFUl9SRklYKSAvICh5KSkpCisKKy8vIFN0cnVjdHVyZSB1c2VkIGZvciBvbi10aGUtZmx5IHJlc2NhbGluZwordHlwZWRlZiB1aW50MzJfdCByZXNjYWxlcl90OyAgIC8vIHR5cGUgZm9yIHNpZGUtYnVmZmVyCit0eXBlZGVmIHN0cnVjdCBXZWJQUmVzY2FsZXIgV2ViUFJlc2NhbGVyOworc3RydWN0IFdlYlBSZXNjYWxlciB7CisgIGludCB4X2V4cGFuZDsgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHdlJ3JlIGV4cGFuZGluZyBpbiB0aGUgeCBkaXJlY3Rpb24KKyAgaW50IHlfZXhwYW5kOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2UncmUgZXhwYW5kaW5nIGluIHRoZSB5IGRpcmVjdGlvbgorICBpbnQgbnVtX2NoYW5uZWxzOyAgICAgICAgICAgLy8gYnl0ZXMgdG8ganVtcCBiZXR3ZWVuIHBpeGVscworICB1aW50MzJfdCBmeF9zY2FsZTsgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgc2NhbGluZyBmYWN0b3JzCisgIHVpbnQzMl90IGZ5X3NjYWxlOyAgICAgICAgICAvLyAnJworICB1aW50MzJfdCBmeHlfc2NhbGU7ICAgICAgICAgLy8gJycKKyAgaW50IHlfYWNjdW07ICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGFjY3VtdWxhdG9yCisgIGludCB5X2FkZCwgeV9zdWI7ICAgICAgICAgICAvLyB2ZXJ0aWNhbCBpbmNyZW1lbnRzCisgIGludCB4X2FkZCwgeF9zdWI7ICAgICAgICAgICAvLyBob3Jpem9udGFsIGluY3JlbWVudHMKKyAgaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgIC8vIHNvdXJjZSBkaW1lbnNpb25zCisgIGludCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQ7ICAvLyBkZXN0aW5hdGlvbiBkaW1lbnNpb25zCisgIGludCBzcmNfeSwgZHN0X3k7ICAgICAgICAgICAvLyByb3cgY291bnRlcnMgZm9yIGlucHV0IGFuZCBvdXRwdXQKKyAgdWludDhfdCogZHN0OworICBpbnQgZHN0X3N0cmlkZTsKKyAgcmVzY2FsZXJfdCogaXJvdywgKmZyb3c7ICAgIC8vIHdvcmsgYnVmZmVyCit9OworCisvLyBJbml0aWFsaXplIGEgcmVzY2FsZXIgZ2l2ZW4gc2NyYXRjaCBhcmVhICd3b3JrJyBhbmQgZGltZW5zaW9ucyBvZiBzcmMgJiBkc3QuCit2b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZXJfdCogY29uc3Qgd29yayk7CisKKy8vIElmIGVpdGhlciAnc2NhbGVkX3dpZHRoJyBvciAnc2NhbGVkX2hlaWdodCcgKGJ1dCBub3QgYm90aCkgaXMgMCB0aGUgdmFsdWUKKy8vIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3QgcmF0aW8sIG90aGVyd2lzZSB0aGUgdmFsdWVzIGFyZQorLy8gbGVmdCB1bm1vZGlmaWVkLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgZWl0aGVyIHZhbHVlIGlzIDAgYWZ0ZXIKKy8vIHBlcmZvcm1pbmcgdGhlIHNjYWxpbmcgY2FsY3VsYXRpb24uCitpbnQgV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyhpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfaGVpZ2h0KTsKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGlucHV0IGxpbmVzIG5lZWRlZCBuZXh0IHRvIHByb2R1Y2Ugb25lIG91dHB1dCBsaW5lLAorLy8gY29uc2lkZXJpbmcgdGhhdCB0aGUgbWF4aW11bSBhdmFpbGFibGUgaW5wdXQgbGluZXMgYXJlICdtYXhfbnVtX2xpbmVzJy4KK2ludCBXZWJQUmVzY2FsZU5lZWRlZExpbmVzKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bV9saW5lcyk7CisKKy8vIEltcG9ydCBtdWx0aXBsZSByb3dzIG92ZXIgYWxsIGNoYW5uZWxzLCB1bnRpbCBhdCBsZWFzdCBvbmUgcm93IGlzIHJlYWR5IHRvCisvLyBiZSBleHBvcnRlZC4gUmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBsaW5lcyB0aGF0IHdlcmUgaW1wb3J0ZWQuCitpbnQgV2ViUFJlc2NhbGVySW1wb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSk7CisKKy8vIEV4cG9ydCBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUuIFJldHVybiB0aGUgbnVtYmVycyBvZiByb3dzIHdyaXR0ZW4uCitpbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpOworCisvLyBSZXR1cm4gdHJ1ZSBpZiBpbnB1dCBpcyBmaW5pc2hlZAorc3RhdGljIFdFQlBfSU5MSU5FCitpbnQgV2ViUFJlc2NhbGVySW5wdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+c3JjX3kgPj0gcmVzY2FsZXItPnNyY19oZWlnaHQpOworfQorLy8gUmV0dXJuIHRydWUgaWYgb3V0cHV0IGlzIGZpbmlzaGVkCitzdGF0aWMgV0VCUF9JTkxJTkUKK2ludCBXZWJQUmVzY2FsZXJPdXRwdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+ZHN0X3kgPj0gcmVzY2FsZXItPmRzdF9oZWlnaHQpOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcGVuZGluZyBvdXRwdXQgcm93cyByZWFkeS4KK3N0YXRpYyBXRUJQX0lOTElORQoraW50IFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgeworICByZXR1cm4gIVdlYlBSZXNjYWxlck91dHB1dERvbmUocmVzY2FsZXIpICYmIChyZXNjYWxlci0+eV9hY2N1bSA8PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUkVTQ0FMRVJfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy90aHJlYWRfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy90aHJlYWRfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUyYjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5jCkBAIC0wLDAgKzEsMzU5IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTXVsdGktdGhyZWFkZWQgd29ya2VyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBtZW1zZXQoKQorI2luY2x1ZGUgInNyYy91dGlscy90aHJlYWRfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorCisjaWYgZGVmaW5lZChfV0lOMzIpCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhBTkRMRSBwdGhyZWFkX3Q7Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gcHRocmVhZF9tdXRleF90OworCisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDYwMCAgLy8gV2luZG93cyBWaXN0YSAvIFNlcnZlciAyMDA4IG9yIGdyZWF0ZXIKKyNkZWZpbmUgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCit0eXBlZGVmIENPTkRJVElPTl9WQVJJQUJMRSBwdGhyZWFkX2NvbmRfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7CisgIEhBTkRMRSB3YWl0aW5nX3NlbV87CisgIEhBTkRMRSByZWNlaXZlZF9zZW1fOworICBIQU5ETEUgc2lnbmFsX2V2ZW50XzsKK30gcHRocmVhZF9jb25kX3Q7CisjZW5kaWYgIC8vIF9XSU4zMl9XSU5OVCA+PSAweDYwMAorCisjaWZuZGVmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OCisjZGVmaW5lIFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCAxCisjZGVmaW5lIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKHgpIHgKKyNlbmRpZgorCisjaWYgIVdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkKKyNkZWZpbmUgVVNFX0NSRUFURV9USFJFQUQKKyNlbmRpZgorCisjZWxzZSAgLy8gIV9XSU4zMgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZW5kaWYgIC8vIF9XSU4zMgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87CisgIHB0aHJlYWRfY29uZF90ICBjb25kaXRpb25fOworICBwdGhyZWFkX3QgICAgICAgdGhyZWFkXzsKK30gV2ViUFdvcmtlckltcGw7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsaXN0aWMgcHRocmVhZCBlbXVsYXRpb24gbGF5ZXIKKworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworLy8gX2JlZ2ludGhyZWFkZXggcmVxdWlyZXMgX19zdGRjYWxsCisjZGVmaW5lIFRIUkVBREZOIHVuc2lnbmVkIGludCBfX3N0ZGNhbGwKKyNkZWZpbmUgVEhSRUFEX1JFVFVSTih2YWwpICh1bnNpZ25lZCBpbnQpKChEV09SRF9QVFIpdmFsKQorCisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDUwMSAgLy8gV2luZG93cyBYUCBvciBncmVhdGVyCisjZGVmaW5lIFdhaXRGb3JTaW5nbGVPYmplY3Qob2JqLCB0aW1lb3V0KSBcCisgIFdhaXRGb3JTaW5nbGVPYmplY3RFeChvYmosIHRpbWVvdXQsIEZBTFNFIC8qYkFsZXJ0YWJsZSovKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiBjb25zdCB0aHJlYWQsIGNvbnN0IHZvaWQqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoX19zdGRjYWxsICpzdGFydCkodm9pZCopLCB2b2lkKiBhcmcpIHsKKyAgKHZvaWQpYXR0cjsKKyNpZmRlZiBVU0VfQ1JFQVRFX1RIUkVBRAorICAqdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsICAgLyogbHBUaHJlYWRBdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiBkd1N0YWNrU2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIGR3U3RhY2tTaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvKiBscFRocmVhZElkICovCisjZWxzZQorICAqdGhyZWFkID0gKHB0aHJlYWRfdClfYmVnaW50aHJlYWRleChOVUxMLCAgIC8qIHZvaWQgKnNlY3VyaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgc3RhY2tfc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIGluaXRmbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLyogdW5zaWduZWQgKnRocmRhZGRyICovCisjZW5kaWYKKyAgaWYgKCp0aHJlYWQgPT0gTlVMTCkgcmV0dXJuIDE7CisgIFNldFRocmVhZFByaW9yaXR5KCp0aHJlYWQsIFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUwpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCoqIHZhbHVlX3B0cikgeworICAodm9pZCl2YWx1ZV9wdHI7CisgIHJldHVybiAoV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wIHx8CisgICAgICAgICAgQ2xvc2VIYW5kbGUodGhyZWFkKSA9PSAwKTsKK30KKworLy8gTXV0ZXgKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgsIHZvaWQqIG11dGV4YXR0cikgeworICAodm9pZCltdXRleGF0dHI7CisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDYwMCAgLy8gV2luZG93cyBWaXN0YSAvIFNlcnZlciAyMDA4IG9yIGdyZWF0ZXIKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkV4KG11dGV4LCAwIC8qZHdTcGluQ291bnQqLywgMCAvKkZsYWdzKi8pOworI2Vsc2UKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENvbmRpdGlvbgorc3RhdGljIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7CisgIGludCBvayA9IDE7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgICh2b2lkKWNvbmRpdGlvbjsKKyNlbHNlCisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPndhaXRpbmdfc2VtXykgIT0gMCk7CisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8pICE9IDApOworICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKSAhPSAwKTsKKyNlbmRpZgorICByZXR1cm4gIW9rOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24sIHZvaWQqIGNvbmRfYXR0cikgeworICAodm9pZCljb25kX2F0dHI7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZShjb25kaXRpb24pOworI2Vsc2UKKyAgY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMSwgTlVMTCk7CisgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKKyAgY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fID09IE5VTEwgfHwKKyAgICAgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9PSBOVUxMIHx8CisgICAgICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPT0gTlVMTCkgeworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KGNvbmRpdGlvbik7CisgICAgcmV0dXJuIDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKKyAgaW50IG9rID0gMTsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKGNvbmRpdGlvbik7CisjZWxzZQorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgIC8vIGEgdGhyZWFkIGlzIHdhaXRpbmcgaW4gcHRocmVhZF9jb25kX3dhaXQ6IGFsbG93IGl0IHRvIGJlIG5vdGlmaWVkCisgICAgb2sgPSBTZXRFdmVudChjb25kaXRpb24tPnNpZ25hbF9ldmVudF8pOworICAgIC8vIHdhaXQgdW50aWwgdGhlIGV2ZW50IGlzIGNvbnN1bWVkIHNvIHRoZSBzaWduYWxlciBjYW5ub3QgY29uc3VtZQorICAgIC8vIHRoZSBldmVudCB2aWEgaXRzIG93biBwdGhyZWFkX2NvbmRfd2FpdC4KKyAgICBvayAmPSAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8sIElORklOSVRFKSAhPQorICAgICAgICAgICBXQUlUX09CSkVDVF8wKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgeworICBpbnQgb2s7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIG9rID0gU2xlZXBDb25kaXRpb25WYXJpYWJsZUNTKGNvbmRpdGlvbiwgbXV0ZXgsIElORklOSVRFKTsKKyNlbHNlCisgIC8vIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbnN1bWVyIGF2YWlsYWJsZSBzbyB0aGUgc2lnbmFsIGlzbid0IGRyb3BwZWQgaW4KKyAgLy8gcHRocmVhZF9jb25kX3NpZ25hbAorICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDEsIE5VTEwpKSByZXR1cm4gMTsKKyAgLy8gbm93IHVubG9jayB0aGUgbXV0ZXggc28gcHRocmVhZF9jb25kX3NpZ25hbCBtYXkgYmUgaXNzdWVkCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgb2sgPSAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPnNpZ25hbF9ldmVudF8sIElORklOSVRFKSA9PQorICAgICAgICBXQUlUX09CSkVDVF8wKTsKKyAgb2sgJj0gUmVsZWFzZVNlbWFwaG9yZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8sIDEsIE5VTEwpOworICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKKyNlbHNlICAvLyAhX1dJTjMyCisjIGRlZmluZSBUSFJFQURGTiB2b2lkKgorIyBkZWZpbmUgVEhSRUFEX1JFVFVSTih2YWwpIHZhbAorI2VuZGlmICAvLyBfV0lOMzIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFRIUkVBREZOIFRocmVhZExvb3Aodm9pZCogcHRyKSB7CisgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9IChXZWJQV29ya2VyKilwdHI7CisgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0gKFdlYlBXb3JrZXJJbXBsKil3b3JrZXItPmltcGxfOworICBpbnQgZG9uZSA9IDA7CisgIHdoaWxlICghZG9uZSkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgICB3aGlsZSAod29ya2VyLT5zdGF0dXNfID09IE9LKSB7ICAgLy8gd2FpdCBpbiBpZGxpbmcgbW9kZQorICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmltcGwtPmNvbmRpdGlvbl8sICZpbXBsLT5tdXRleF8pOworICAgIH0KKyAgICBpZiAod29ya2VyLT5zdGF0dXNfID09IFdPUkspIHsKKyAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RXhlY3V0ZSh3b3JrZXIpOworICAgICAgd29ya2VyLT5zdGF0dXNfID0gT0s7CisgICAgfSBlbHNlIGlmICh3b3JrZXItPnN0YXR1c18gPT0gTk9UX09LKSB7ICAgLy8gZmluaXNoIHRoZSB3b3JrZXIKKyAgICAgIGRvbmUgPSAxOworICAgIH0KKyAgICAvLyBzaWduYWwgdG8gdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UncmUgZG9uZSAoZm9yIFN5bmMoKSkKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZpbXBsLT5jb25kaXRpb25fKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgfQorICByZXR1cm4gVEhSRUFEX1JFVFVSTihOVUxMKTsgICAgLy8gVGhyZWFkIGlzIGZpbmlzaGVkCit9CisKKy8vIG1haW4gdGhyZWFkIHN0YXRlIGNvbnRyb2wKK3N0YXRpYyB2b2lkIENoYW5nZVN0YXRlKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciwgV2ViUFdvcmtlclN0YXR1cyBuZXdfc3RhdHVzKSB7CisgIC8vIE5vLW9wIHdoZW4gYXR0ZW1wdGluZyB0byBjaGFuZ2Ugc3RhdGUgb24gYSB0aHJlYWQgdGhhdCBkaWRuJ3QgY29tZSB1cC4KKyAgLy8gQ2hlY2tpbmcgc3RhdHVzXyB3aXRob3V0IGFjcXVpcmluZyB0aGUgbG9jayBmaXJzdCB3b3VsZCByZXN1bHQgaW4gYSBkYXRhCisgIC8vIHJhY2UuCisgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0gKFdlYlBXb3JrZXJJbXBsKil3b3JrZXItPmltcGxfOworICBpZiAoaW1wbCA9PSBOVUxMKSByZXR1cm47CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZpbXBsLT5tdXRleF8pOworICBpZiAod29ya2VyLT5zdGF0dXNfID49IE9LKSB7CisgICAgLy8gd2FpdCBmb3IgdGhlIHdvcmtlciB0byBmaW5pc2gKKyAgICB3aGlsZSAod29ya2VyLT5zdGF0dXNfICE9IE9LKSB7CisgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmaW1wbC0+Y29uZGl0aW9uXywgJmltcGwtPm11dGV4Xyk7CisgICAgfQorICAgIC8vIGFzc2lnbiBuZXcgc3RhdHVzIGFuZCByZWxlYXNlIHRoZSB3b3JraW5nIHRocmVhZCBpZiBuZWVkZWQKKyAgICBpZiAobmV3X3N0YXR1cyAhPSBPSykgeworICAgICAgd29ya2VyLT5zdGF0dXNfID0gbmV3X3N0YXR1czsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmltcGwtPmNvbmRpdGlvbl8pOworICAgIH0KKyAgfQorICBwdGhyZWFkX211dGV4X3VubG9jaygmaW1wbC0+bXV0ZXhfKTsKK30KKworI2VuZGlmICAvLyBXRUJQX1VTRV9USFJFQUQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSW5pdChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyAgbWVtc2V0KHdvcmtlciwgMCwgc2l6ZW9mKCp3b3JrZXIpKTsKKyAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOworfQorCitzdGF0aWMgaW50IFN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIENoYW5nZVN0YXRlKHdvcmtlciwgT0spOworI2VuZGlmCisgIGFzc2VydCh3b3JrZXItPnN0YXR1c18gPD0gT0spOworICByZXR1cm4gIXdvcmtlci0+aGFkX2Vycm9yOworfQorCitzdGF0aWMgaW50IFJlc2V0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworICBpbnQgb2sgPSAxOworICB3b3JrZXItPmhhZF9lcnJvciA9IDA7CisgIGlmICh3b3JrZXItPnN0YXR1c18gPCBPSykgeworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICAgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0KKyAgICAgICAgKFdlYlBXb3JrZXJJbXBsKilXZWJQU2FmZUNhbGxvYygxLCBzaXplb2YoV2ViUFdvcmtlckltcGwpKTsKKyAgICB3b3JrZXItPmltcGxfID0gKHZvaWQqKWltcGw7CisgICAgaWYgKHdvcmtlci0+aW1wbF8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwdGhyZWFkX211dGV4X2luaXQoJmltcGwtPm11dGV4XywgTlVMTCkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmaW1wbC0+Y29uZGl0aW9uXywgTlVMTCkpIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmaW1wbC0+bXV0ZXhfKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgICBvayA9ICFwdGhyZWFkX2NyZWF0ZSgmaW1wbC0+dGhyZWFkXywgTlVMTCwgVGhyZWFkTG9vcCwgd29ya2VyKTsKKyAgICBpZiAob2spIHdvcmtlci0+c3RhdHVzXyA9IE9LOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbXBsLT5tdXRleF8pOworICAgIGlmICghb2spIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmaW1wbC0+bXV0ZXhfKTsKKyAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZpbXBsLT5jb25kaXRpb25fKTsKKyBFcnJvcjoKKyAgICAgIFdlYlBTYWZlRnJlZShpbXBsKTsKKyAgICAgIHdvcmtlci0+aW1wbF8gPSBOVUxMOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2Vsc2UKKyAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA+IE9LKSB7CisgICAgb2sgPSBTeW5jKHdvcmtlcik7CisgIH0KKyAgYXNzZXJ0KCFvayB8fCAod29ya2VyLT5zdGF0dXNfID09IE9LKSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgRXhlY3V0ZShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyAgaWYgKHdvcmtlci0+aG9vayAhPSBOVUxMKSB7CisgICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBMYXVuY2goV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIENoYW5nZVN0YXRlKHdvcmtlciwgV09SSyk7CisjZWxzZQorICBFeGVjdXRlKHdvcmtlcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICBpZiAod29ya2VyLT5pbXBsXyAhPSBOVUxMKSB7CisgICAgV2ViUFdvcmtlckltcGwqIGNvbnN0IGltcGwgPSAoV2ViUFdvcmtlckltcGwqKXdvcmtlci0+aW1wbF87CisgICAgQ2hhbmdlU3RhdGUod29ya2VyLCBOT1RfT0spOworICAgIHB0aHJlYWRfam9pbihpbXBsLT50aHJlYWRfLCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmltcGwtPm11dGV4Xyk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmltcGwtPmNvbmRpdGlvbl8pOworICAgIFdlYlBTYWZlRnJlZShpbXBsKTsKKyAgICB3b3JrZXItPmltcGxfID0gTlVMTDsKKyAgfQorI2Vsc2UKKyAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOworICBhc3NlcnQod29ya2VyLT5pbXBsXyA9PSBOVUxMKTsKKyNlbmRpZgorICBhc3NlcnQod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXZWJQV29ya2VySW50ZXJmYWNlIGdfd29ya2VyX2ludGVyZmFjZSA9IHsKKyAgSW5pdCwgUmVzZXQsIFN5bmMsIExhdW5jaCwgRXhlY3V0ZSwgRW5kCit9OworCitpbnQgV2ViUFNldFdvcmtlckludGVyZmFjZShjb25zdCBXZWJQV29ya2VySW50ZXJmYWNlKiBjb25zdCB3aW50ZXJmYWNlKSB7CisgIGlmICh3aW50ZXJmYWNlID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkluaXQgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5SZXNldCA9PSBOVUxMIHx8CisgICAgICB3aW50ZXJmYWNlLT5TeW5jID09IE5VTEwgfHwgd2ludGVyZmFjZS0+TGF1bmNoID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkV4ZWN1dGUgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5FbmQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGdfd29ya2VyX2ludGVyZmFjZSA9ICp3aW50ZXJmYWNlOworICByZXR1cm4gMTsKK30KKworY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogV2ViUEdldFdvcmtlckludGVyZmFjZSh2b2lkKSB7CisgIHJldHVybiAmZ193b3JrZXJfaW50ZXJmYWNlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWU2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE11bHRpLXRocmVhZGVkIHdvcmtlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19USFJFQURfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19USFJFQURfVVRJTFNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBTdGF0ZSBvZiB0aGUgd29ya2VyIHRocmVhZCBvYmplY3QKK3R5cGVkZWYgZW51bSB7CisgIE5PVF9PSyA9IDAsICAgLy8gb2JqZWN0IGlzIHVudXNhYmxlCisgIE9LLCAgICAgICAgICAgLy8gcmVhZHkgdG8gd29yaworICBXT1JLICAgICAgICAgIC8vIGJ1c3kgZmluaXNoaW5nIHRoZSBjdXJyZW50IHRhc2sKK30gV2ViUFdvcmtlclN0YXR1czsKKworLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkLiBUYWtlcyB0d28gb3BhcXVlIHBvaW50ZXJzIGFzCisvLyBhcmd1bWVudHMgKGRhdGExIGFuZCBkYXRhMiksIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCit0eXBlZGVmIGludCAoKldlYlBXb3JrZXJIb29rKSh2b2lkKiwgdm9pZCopOworCisvLyBTeW5jaHJvbml6YXRpb24gb2JqZWN0IHVzZWQgdG8gbGF1bmNoIGpvYiBpbiB0aGUgd29ya2VyIHRocmVhZAordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkKiBpbXBsXzsgICAgICAgICAgICAvLyBwbGF0Zm9ybS1kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gd29ya2VyIGRldGFpbHMKKyAgV2ViUFdvcmtlclN0YXR1cyBzdGF0dXNfOworICBXZWJQV29ya2VySG9vayBob29rOyAgICAvLyBob29rIHRvIGNhbGwKKyAgdm9pZCogZGF0YTE7ICAgICAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJworICB2b2lkKiBkYXRhMjsgICAgICAgICAgICAvLyBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJworICBpbnQgaGFkX2Vycm9yOyAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlIGxhc3QgY2FsbCB0byAnaG9vaycKK30gV2ViUFdvcmtlcjsKKworLy8gVGhlIGludGVyZmFjZSBmb3IgYWxsIHRocmVhZC13b3JrZXIgcmVsYXRlZCBmdW5jdGlvbnMuIEFsbCB0aGVzZSBmdW5jdGlvbnMKKy8vIG11c3QgYmUgaW1wbGVtZW50ZWQuCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIE11c3QgYmUgY2FsbGVkIGZpcnN0LCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZC4KKyAgdm9pZCAoKkluaXQpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIE11c3QgYmUgY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdCBhbmQgc3Bhd24gdGhlIHRocmVhZC4gUmUtZW50cmFudC4KKyAgLy8gV2lsbCBwb3RlbnRpYWxseSBsYXVuY2ggdGhlIHRocmVhZC4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorICBpbnQgKCpSZXNldCkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgcHJldmlvdXMgd29yayBpcyBmaW5pc2hlZC4gUmV0dXJucyB0cnVlIGlmIHdvcmtlci0+aGFkX2Vycm9yCisgIC8vIHdhcyBub3Qgc2V0IGFuZCBubyBlcnJvciBjb25kaXRpb24gd2FzIHRyaWdnZXJlZCBieSB0aGUgd29ya2luZyB0aHJlYWQuCisgIGludCAoKlN5bmMpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIFRyaWdnZXJzIHRoZSB0aHJlYWQgdG8gY2FsbCBob29rKCkgd2l0aCBkYXRhMSBhbmQgZGF0YTIgYXJndW1lbnRzLiBUaGVzZQorICAvLyBob29rL2RhdGExL2RhdGEyIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgIC8vIGZ1bmN0aW9uLCBidXQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gU3luYygpLgorICB2b2lkICgqTGF1bmNoKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gTGF1bmNoKCkgZXhjZXB0IHRoYXQgaXQgY2FsbHMgdGhlCisgIC8vIGhvb2sgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBhIHRocmVhZC4gQ29udmVuaWVudCB0byBieXBhc3MgdGhlIHRocmVhZAorICAvLyBtZWNoYW5pc20gd2hpbGUgc3RpbGwgdXNpbmcgdGhlIFdlYlBXb3JrZXIgc3RydWN0cy4gU3luYygpIG11c3QKKyAgLy8gc3RpbGwgYmUgY2FsbGVkIGFmdGVyd2FyZCAoZm9yIGVycm9yIHJlcG9ydGluZykuCisgIHZvaWQgKCpFeGVjdXRlKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBLaWxsIHRoZSB0aHJlYWQgYW5kIHRlcm1pbmF0ZSB0aGUgb2JqZWN0LiBUbyB1c2UgdGhlIG9iamVjdCBhZ2Fpbiwgb25lCisgIC8vIG11c3QgY2FsbCBSZXNldCgpIGFnYWluLgorICB2b2lkICgqRW5kKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworfSBXZWJQV29ya2VySW50ZXJmYWNlOworCisvLyBJbnN0YWxsIGEgbmV3IHNldCBvZiB0aHJlYWRpbmcgZnVuY3Rpb25zLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4gVGhpcworLy8gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSB3b3JrZXJzIGFyZSBzdGFydGVkLCBpLmUuLCBiZWZvcmUgYW55IGVuY29kaW5nIG9yCisvLyBkZWNvZGluZyB0YWtlcyBwbGFjZS4gVGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcmZhY2Ugc3RydWN0IGFyZSBjb3BpZWQsIGl0CisvLyBpcyBzYWZlIHRvIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IGFmdGVyIHRoaXMgY2FsbC4gVGhpcyBmdW5jdGlvbiBpcworLy8gbm90IHRocmVhZC1zYWZlLiBSZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBpbnZhbGlkIHBvaW50ZXIgb3IgbWV0aG9kcy4KK1dFQlBfRVhURVJOIGludCBXZWJQU2V0V29ya2VySW50ZXJmYWNlKAorICAgIGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIGNvbnN0IHdpbnRlcmZhY2UpOworCisvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCB0aHJlYWQgd29ya2VyIGludGVyZmFjZS4KK1dFQlBfRVhURVJOIGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2Uodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX1RIUkVBRF9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY0ODZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3V0aWxzLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNaXNjLiBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciBtZW1jcHkoKQorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIiAgLy8gZm9yIE1BWF9QQUxFVFRFX1NJWkUKKyNpbmNsdWRlICJzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8gSWYgUFJJTlRfTUVNX0lORk8gaXMgZGVmaW5lZCwgZXh0cmEgaW5mbyAobGlrZSB0b3RhbCBtZW1vcnkgdXNlZCwgbnVtYmVyIG9mCisvLyBhbGxvYy9mcmVlIGV0YykgaXMgcHJpbnRlZC4gRm9yIGRlYnVnZ2luZy90dW5pbmcgcHVycG9zZSBvbmx5IChpdCdzIHNsb3csCisvLyBhbmQgbm90IG11bHRpLXRocmVhZCBzYWZlISkuCisvLyBBbiBpbnRlcmVzdGluZyBhbHRlcm5hdGl2ZSBpcyB2YWxncmluZCdzICdtYXNzaWYnIHRvb2w6CisvLyAgICBodHRwOi8vdmFsZ3JpbmQub3JnL2RvY3MvbWFudWFsL21zLW1hbnVhbC5odG1sCisvLyBIZXJlIGlzIGFuIGV4YW1wbGUgY29tbWFuZCBsaW5lOgorLyogICAgdmFsZ3JpbmQgLS10b29sPW1hc3NpZiAtLW1hc3NpZi1vdXQtZmlsZT1tYXNzaWYub3V0IFwKKyAgICAgICAgICAgICAgIC0tc3RhY2tzPXllcyAtLWFsbG9jLWZuPVdlYlBTYWZlTWFsbG9jIC0tYWxsb2MtZm49V2ViUFNhZmVDYWxsb2MKKyAgICAgIG1zX3ByaW50IG1hc3NpZi5vdXQKKyovCisvLyBJbiBhZGRpdGlvbjoKKy8vICogaWYgUFJJTlRfTUVNX1RSQUZGSUMgaXMgZGVmaW5lZCwgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBtYWxsb2MvZnJlZSBjeWNsZXMKKy8vICAgYXJlIHByaW50ZWQuCisvLyAqIGlmIE1BTExPQ19GQUlMX0FUIGlzIGRlZmluZWQsIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vICAgJE1BTExPQ19GQUlMX0FUIGlzIHVzZWQgdG8gc2ltdWxhdGUgYSBtZW1vcnkgZXJyb3Igd2hlbiBjYWxsb2Mgb3IgbWFsbG9jCisvLyAgIGlzIGNhbGxlZCBmb3IgdGhlIG50aCB0aW1lLiBFeGFtcGxlIHVzYWdlOgorLy8gICBleHBvcnQgTUFMTE9DX0ZBSUxfQVQ9NTAgJiYgLi9leGFtcGxlcy9jd2VicCBpbnB1dC5wbmcKKy8vICogaWYgTUFMTE9DX0xJTUlUIGlzIGRlZmluZWQsIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgJE1BTExPQ19MSU1JVAorLy8gICBzZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgKGluIGJ5dGVzKSBtYWRlIGF2YWlsYWJsZSB0byBsaWJ3ZWJwLgorLy8gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGVtdWxhdGUgZW52aXJvbm1lbnQgd2l0aCB2ZXJ5IGxpbWl0ZWQgbWVtb3J5LgorLy8gICBFeGFtcGxlOiBleHBvcnQgTUFMTE9DX0xJTUlUPTY0MDAwMDAwICYmIC4vZXhhbXBsZXMvZHdlYnAgcGljdHVyZS53ZWJwCisKKy8vICNkZWZpbmUgUFJJTlRfTUVNX0lORk8KKy8vICNkZWZpbmUgUFJJTlRfTUVNX1RSQUZGSUMKKy8vICNkZWZpbmUgTUFMTE9DX0ZBSUxfQVQKKy8vICNkZWZpbmUgTUFMTE9DX0xJTUlUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaGVja2VkIG1lbW9yeSBhbGxvY2F0aW9uCisKKyNpZiBkZWZpbmVkKFBSSU5UX01FTV9JTkZPKQorCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworc3RhdGljIGludCBudW1fbWFsbG9jX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2NhbGxvY19jYWxscyA9IDA7CitzdGF0aWMgaW50IG51bV9mcmVlX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgY291bnRkb3duX3RvX2ZhaWwgPSAwOyAgICAgLy8gMCA9IG9mZgorCit0eXBlZGVmIHN0cnVjdCBNZW1CbG9jayBNZW1CbG9jazsKK3N0cnVjdCBNZW1CbG9jayB7CisgIHZvaWQqIHB0cl87CisgIHNpemVfdCBzaXplXzsKKyAgTWVtQmxvY2sqIG5leHRfOworfTsKKworc3RhdGljIE1lbUJsb2NrKiBhbGxfYmxvY2tzID0gTlVMTDsKK3N0YXRpYyBzaXplX3QgdG90YWxfbWVtID0gMDsKK3N0YXRpYyBzaXplX3QgdG90YWxfbWVtX2FsbG9jYXRlZCA9IDA7CitzdGF0aWMgc2l6ZV90IGhpZ2hfd2F0ZXJfbWFyayA9IDA7CitzdGF0aWMgc2l6ZV90IG1lbV9saW1pdCA9IDA7CisKK3N0YXRpYyBpbnQgZXhpdF9yZWdpc3RlcmVkID0gMDsKKworc3RhdGljIHZvaWQgUHJpbnRNZW1JbmZvKHZvaWQpIHsKKyAgZnByaW50ZihzdGRlcnIsICJcbk1FTU9SWSBJTkZPOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAibnVtIGNhbGxzIHRvOiBtYWxsb2MgPSAlNGRcbiIsIG51bV9tYWxsb2NfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgY2FsbG9jID0gJTRkXG4iLCBudW1fY2FsbG9jX2NhbGxzKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgIGZyZWUgICA9ICU0ZFxuIiwgbnVtX2ZyZWVfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgInRvdGFsX21lbTogJXVcbiIsICh1aW50MzJfdCl0b3RhbF9tZW0pOworICBmcHJpbnRmKHN0ZGVyciwgInRvdGFsX21lbSBhbGxvY2F0ZWQ6ICV1XG4iLCAodWludDMyX3QpdG90YWxfbWVtX2FsbG9jYXRlZCk7CisgIGZwcmludGYoc3RkZXJyLCAiaGlnaC13YXRlciBtYXJrOiAldVxuIiwgKHVpbnQzMl90KWhpZ2hfd2F0ZXJfbWFyayk7CisgIHdoaWxlIChhbGxfYmxvY2tzICE9IE5VTEwpIHsKKyAgICBNZW1CbG9jayogYiA9IGFsbF9ibG9ja3M7CisgICAgYWxsX2Jsb2NrcyA9IGItPm5leHRfOworICAgIGZyZWUoYik7CisgIH0KK30KKworc3RhdGljIHZvaWQgSW5jcmVtZW50KGludCogY29uc3QgdikgeworICBpZiAoIWV4aXRfcmVnaXN0ZXJlZCkgeworI2lmIGRlZmluZWQoTUFMTE9DX0ZBSUxfQVQpCisgICAgeworICAgICAgY29uc3QgY2hhciogY29uc3QgbWFsbG9jX2ZhaWxfYXRfc3RyID0gZ2V0ZW52KCJNQUxMT0NfRkFJTF9BVCIpOworICAgICAgaWYgKG1hbGxvY19mYWlsX2F0X3N0ciAhPSBOVUxMKSB7CisgICAgICAgIGNvdW50ZG93bl90b19mYWlsID0gYXRvaShtYWxsb2NfZmFpbF9hdF9zdHIpOworICAgICAgfQorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoTUFMTE9DX0xJTUlUKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG1hbGxvY19saW1pdF9zdHIgPSBnZXRlbnYoIk1BTExPQ19MSU1JVCIpOworICAgICAgaWYgKG1hbGxvY19saW1pdF9zdHIgIT0gTlVMTCkgeworICAgICAgICBtZW1fbGltaXQgPSBhdG9pKG1hbGxvY19saW1pdF9zdHIpOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgICh2b2lkKWNvdW50ZG93bl90b19mYWlsOworICAgICh2b2lkKW1lbV9saW1pdDsKKyAgICBhdGV4aXQoUHJpbnRNZW1JbmZvKTsKKyAgICBleGl0X3JlZ2lzdGVyZWQgPSAxOworICB9CisgICsrKnY7Cit9CisKK3N0YXRpYyB2b2lkIEFkZE1lbSh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7CisgIGlmIChwdHIgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiBjb25zdCBiID0gKE1lbUJsb2NrKiltYWxsb2Moc2l6ZW9mKCpiKSk7CisgICAgaWYgKGIgPT0gTlVMTCkgYWJvcnQoKTsKKyAgICBiLT5uZXh0XyA9IGFsbF9ibG9ja3M7CisgICAgYWxsX2Jsb2NrcyA9IGI7CisgICAgYi0+cHRyXyA9IHB0cjsKKyAgICBiLT5zaXplXyA9IHNpemU7CisgICAgdG90YWxfbWVtICs9IHNpemU7CisgICAgdG90YWxfbWVtX2FsbG9jYXRlZCArPSBzaXplOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX1RSQUZGSUMpCisjaWYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWwtY291bnQ6ICU1ZCBbbWVtPSV1XVxuIiwKKyAgICAgICAgICAgIG51bV9tYWxsb2NfY2FsbHMgKyBudW1fY2FsbG9jX2NhbGxzLCAodWludDMyX3QpdG90YWxfbWVtKTsKKyNlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJNZW06ICV1ICgrJXUpXG4iLCAodWludDMyX3QpdG90YWxfbWVtLCAodWludDMyX3Qpc2l6ZSk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmICh0b3RhbF9tZW0gPiBoaWdoX3dhdGVyX21hcmspIGhpZ2hfd2F0ZXJfbWFyayA9IHRvdGFsX21lbTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTdWJNZW0odm9pZCogcHRyKSB7CisgIGlmIChwdHIgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiogYiA9ICZhbGxfYmxvY2tzOworICAgIC8vIEluZWZmaWNpZW50IHNlYXJjaCwgYnV0IHRoYXQncyBqdXN0IGZvciBkZWJ1Z2dpbmcuCisgICAgd2hpbGUgKCpiICE9IE5VTEwgJiYgKCpiKS0+cHRyXyAhPSBwdHIpIGIgPSAmKCpiKS0+bmV4dF87CisgICAgaWYgKCpiID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwb2ludGVyIGZyZWUhICglcClcbiIsIHB0cik7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB7CisgICAgICBNZW1CbG9jayogY29uc3QgYmxvY2sgPSAqYjsKKyAgICAgICpiID0gYmxvY2stPm5leHRfOworICAgICAgdG90YWxfbWVtIC09IGJsb2NrLT5zaXplXzsKKyNpZiBkZWZpbmVkKFBSSU5UX01FTV9UUkFGRklDKQorICAgICAgZnByaW50ZihzdGRlcnIsICJNZW06ICV1ICgtJXUpXG4iLAorICAgICAgICAgICAgICAodWludDMyX3QpdG90YWxfbWVtLCAodWludDMyX3QpYmxvY2stPnNpemVfKTsKKyNlbmRpZgorICAgICAgZnJlZShibG9jayk7CisgICAgfQorICB9Cit9CisKKyNlbHNlCisjZGVmaW5lIEluY3JlbWVudCh2KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQWRkTWVtKHAsIHMpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTdWJNZW0ocCkgICAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLy8gUmV0dXJucyAwIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb2Ygbm1lbWIgKiBzaXplLgorc3RhdGljIGludCBDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9IG5tZW1iICogc2l6ZTsKKyAgaWYgKG5tZW1iID09IDApIHJldHVybiAxOworICBpZiAoKHVpbnQ2NF90KXNpemUgPiBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZIC8gbm1lbWIpIHJldHVybiAwOworICBpZiAodG90YWxfc2l6ZSAhPSAoc2l6ZV90KXRvdGFsX3NpemUpIHJldHVybiAwOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX0lORk8pICYmIGRlZmluZWQoTUFMTE9DX0ZBSUxfQVQpCisgIGlmIChjb3VudGRvd25fdG9fZmFpbCA+IDAgJiYgLS1jb3VudGRvd25fdG9fZmFpbCA9PSAwKSB7CisgICAgcmV0dXJuIDA7ICAgIC8vIGZha2UgZmFpbCEKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChNQUxMT0NfTElNSVQpCisgIGlmIChtZW1fbGltaXQgPiAwKSB7CisgICAgY29uc3QgdWludDY0X3QgbmV3X3RvdGFsX21lbSA9ICh1aW50NjRfdCl0b3RhbF9tZW0gKyB0b3RhbF9zaXplOworICAgIGlmIChuZXdfdG90YWxfbWVtICE9IChzaXplX3QpbmV3X3RvdGFsX21lbSB8fAorICAgICAgICBuZXdfdG90YWxfbWVtID4gbWVtX2xpbWl0KSB7CisgICAgICByZXR1cm4gMDsgICAvLyBmYWtlIGZhaWwhCisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gMTsKK30KKwordm9pZCogV2ViUFNhZmVNYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0cjsKKyAgSW5jcmVtZW50KCZudW1fbWFsbG9jX2NhbGxzKTsKKyAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOworICBhc3NlcnQobm1lbWIgKiBzaXplID4gMCk7CisgIHB0ciA9IG1hbGxvYygoc2l6ZV90KShubWVtYiAqIHNpemUpKTsKKyAgQWRkTWVtKHB0ciwgKHNpemVfdCkobm1lbWIgKiBzaXplKSk7CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwdHI7CisgIEluY3JlbWVudCgmbnVtX2NhbGxvY19jYWxscyk7CisgIGlmICghQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3cobm1lbWIsIHNpemUpKSByZXR1cm4gTlVMTDsKKyAgYXNzZXJ0KG5tZW1iICogc2l6ZSA+IDApOworICBwdHIgPSBjYWxsb2MoKHNpemVfdClubWVtYiwgc2l6ZSk7CisgIEFkZE1lbShwdHIsIChzaXplX3QpKG5tZW1iICogc2l6ZSkpOworICByZXR1cm4gcHRyOworfQorCit2b2lkIFdlYlBTYWZlRnJlZSh2b2lkKiBjb25zdCBwdHIpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgSW5jcmVtZW50KCZudW1fZnJlZV9jYWxscyk7CisgICAgU3ViTWVtKHB0cik7CisgIH0KKyAgZnJlZShwdHIpOworfQorCisvLyBQdWJsaWMgQVBJIGZ1bmN0aW9uLgordm9pZCBXZWJQRnJlZSh2b2lkKiBwdHIpIHsKKyAgZnJlZShwdHIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyY19zdHJpZGUgPj0gd2lkdGggJiYgZHN0X3N0cmlkZSA+PSB3aWR0aCk7CisgIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCit2b2lkIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydChzcmMtPnVzZV9hcmdiICYmIGRzdC0+dXNlX2FyZ2IpOworICBXZWJQQ29weVBsYW5lKCh1aW50OF90KilzcmMtPmFyZ2IsIDQgKiBzcmMtPmFyZ2Jfc3RyaWRlLCAodWludDhfdCopZHN0LT5hcmdiLAorICAgICAgICAgICAgICAgIDQgKiBkc3QtPmFyZ2Jfc3RyaWRlLCA0ICogc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENPTE9SX0hBU0hfU0laRSAgICAgICAgIChNQVhfUEFMRVRURV9TSVpFICogNCkKKyNkZWZpbmUgQ09MT1JfSEFTSF9SSUdIVF9TSElGVCAgMjIgIC8vIDMyIC0gbG9nMihDT0xPUl9IQVNIX1NJWkUpLgorCitpbnQgV2ViUEdldENvbG9yUGFsZXR0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSkgeworICBpbnQgaTsKKyAgaW50IHgsIHk7CisgIGludCBudW1fY29sb3JzID0gMDsKKyAgdWludDhfdCBpbl91c2VbQ09MT1JfSEFTSF9TSVpFXSA9IHsgMCB9OworICB1aW50MzJfdCBjb2xvcnNbQ09MT1JfSEFTSF9TSVpFXTsKKyAgY29uc3QgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKyAgdWludDMyX3QgbGFzdF9waXggPSB+YXJnYlswXTsgICAvLyBzbyB3ZSdyZSBzdXJlIHRoYXQgbGFzdF9waXggIT0gYXJnYlswXQorICBhc3NlcnQocGljICE9IE5VTEwpOworICBhc3NlcnQocGljLT51c2VfYXJnYik7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgIGludCBrZXk7CisgICAgICBpZiAoYXJnYlt4XSA9PSBsYXN0X3BpeCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGxhc3RfcGl4ID0gYXJnYlt4XTsKKyAgICAgIGtleSA9IFZQOExIYXNoUGl4KGxhc3RfcGl4LCBDT0xPUl9IQVNIX1JJR0hUX1NISUZUKTsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghaW5fdXNlW2tleV0pIHsKKyAgICAgICAgICBjb2xvcnNba2V5XSA9IGxhc3RfcGl4OworICAgICAgICAgIGluX3VzZVtrZXldID0gMTsKKyAgICAgICAgICArK251bV9jb2xvcnM7CisgICAgICAgICAgaWYgKG51bV9jb2xvcnMgPiBNQVhfUEFMRVRURV9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gTUFYX1BBTEVUVEVfU0laRSArIDE7ICAvLyBFeGFjdCBjb3VudCBub3QgbmVlZGVkLgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xvcnNba2V5XSA9PSBsYXN0X3BpeCkgeworICAgICAgICAgIGJyZWFrOyAgLy8gVGhlIGNvbG9yIGlzIGFscmVhZHkgdGhlcmUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU29tZSBvdGhlciBjb2xvciBzaXRzIGhlcmUsIHNvIGRvIGxpbmVhciBjb25mbGljdCByZXNvbHV0aW9uLgorICAgICAgICAgICsra2V5OworICAgICAgICAgIGtleSAmPSAoQ09MT1JfSEFTSF9TSVpFIC0gMSk7ICAvLyBLZXkgbWFzay4KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgIH0KKworICBpZiAocGFsZXR0ZSAhPSBOVUxMKSB7ICAvLyBGaWxsIHRoZSBjb2xvcnMgaW50byBwYWxldHRlLgorICAgIG51bV9jb2xvcnMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBDT0xPUl9IQVNIX1NJWkU7ICsraSkgeworICAgICAgaWYgKGluX3VzZVtpXSkgeworICAgICAgICBwYWxldHRlW251bV9jb2xvcnNdID0gY29sb3JzW2ldOworICAgICAgICArK251bV9jb2xvcnM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudW1fY29sb3JzOworfQorCisjdW5kZWYgQ09MT1JfSEFTSF9TSVpFCisjdW5kZWYgQ09MT1JfSEFTSF9SSUdIVF9TSElGVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChXRUJQX05FRURfTE9HX1RBQkxFXzhCSVQpCitjb25zdCB1aW50OF90IFdlYlBMb2dUYWJsZThiaXRbMjU2XSA9IHsgICAvLyAzMSBeIGNseihpKQorICAwLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3Cit9OworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjlhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuaApAQCAtMCwwICsxLDE4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcnM6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorLy8gICAgICAgICAgVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfVVRJTFNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtb3J5IGFsbG9jYXRpb24KKworLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBtZW1vcnkgYW1vdW50IHRoYXQgbGlid2VicCB3aWxsIGV2ZXIgdHJ5IHRvIGFsbG9jYXRlLgorI2lmbmRlZiBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZCisjaWYgU0laRV9NQVggPiAoMVVMTCA8PCAzNCkKKyNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoMVVMTCA8PCAzNCkKKyNlbHNlCisvLyBGb3IgMzItYml0IHRhcmdldHMga2VlcCB0aGlzIGJlbG93IElOVF9NQVggdG8gYXZvaWQgdmFsZ3JpbmQgd2FybmluZ3MuCisjZGVmaW5lIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgKCgxVUxMIDw8IDMxKSAtICgxIDw8IDE2KSkKKyNlbmRpZgorI2VuZGlmICAvLyBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZCisKKy8vIHNpemUtY2hlY2tpbmcgc2FmZSBtYWxsb2MvY2FsbG9jOiB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbm90IHRvbworLy8gbGFyZ2UsIG9yIHJldHVybiBOVUxMLiBZb3UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZXNlIGZvciBjb25zdHJ1Y3RzIGxpa2UKKy8vIG1hbGxvYyhzaXplb2YoZm9vKSksIGJ1dCBvbmx5IGlmIHRoZXJlJ3MgcGljdHVyZS1kZXBlbmRlbnQgc2l6ZSBpbnZvbHZlZAorLy8gc29tZXdoZXJlIChsaWtlOiBtYWxsb2MobnVtX3BpeGVscyAqIHNpemVvZigqc29tZXRoaW5nKSkpLiBUaGF0J3Mgd2h5IHRoaXMKKy8vIHNhZmUgbWFsbG9jKCkgYm9ycm93cyB0aGUgc2lnbmF0dXJlIGZyb20gY2FsbG9jKCksIHBvaW50aW5nIGF0IHRoZSBkYW5nZXJvdXMKKy8vIHVuZGVybHlpbmcgbXVsdGlwbHkgaW52b2x2ZWQuCitXRUJQX0VYVEVSTiB2b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOworLy8gTm90ZSB0aGF0IFdlYlBTYWZlQ2FsbG9jKCkgZXhwZWN0cyB0aGUgc2Vjb25kIGFyZ3VtZW50IHR5cGUgdG8gYmUgJ3NpemVfdCcKKy8vIGluIG9yZGVyIHRvIGZhdm9yIHRoZSAiY2FsbG9jKG51bV9mb28sIHNpemVvZihmb28pKSIgcGF0dGVybi4KK1dFQlBfRVhURVJOIHZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisKKy8vIENvbXBhbmlvbiBkZWFsbG9jYXRpb24gZnVuY3Rpb24gdG8gdGhlIGFib3ZlIGFsbG9jYXRpb25zLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQU2FmZUZyZWUodm9pZCogY29uc3QgcHRyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsaWdubWVudAorCisjZGVmaW5lIFdFQlBfQUxJR05fQ1NUIDMxCisjZGVmaW5lIFdFQlBfQUxJR04oUFRSKSAoKCh1aW50cHRyX3QpKFBUUikgKyBXRUJQX0FMSUdOX0NTVCkgJiB+V0VCUF9BTElHTl9DU1QpCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworLy8gbWVtY3B5KCkgaXMgdGhlIHNhZmUgd2F5IG9mIG1vdmluZyBwb3RlbnRpYWxseSB1bmFsaWduZWQgMzJiIG1lbW9yeS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBXZWJQTWVtVG9VaW50MzIoY29uc3QgdWludDhfdCogY29uc3QgcHRyKSB7CisgIHVpbnQzMl90IEE7CisgIFNiTWVtb3J5Q29weSgmQSwgcHRyLCBzaXplb2YoQSkpOworICByZXR1cm4gQTsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBVaW50MzJUb01lbSh1aW50OF90KiBjb25zdCBwdHIsIHVpbnQzMl90IHZhbCkgeworICBTYk1lbW9yeUNvcHkocHRyLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZWFkaW5nL3dyaXRpbmcgZGF0YS4KKworLy8gUmVhZCAxNiwgMjQgb3IgMzIgYml0cyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TEUxNihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiAoaW50KShkYXRhWzBdIDw8IDApIHwgKGRhdGFbMV0gPDwgOCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TEUyNChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKGRhdGFbMl0gPDwgMTYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0TEUzMihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKCh1aW50MzJfdClHZXRMRTE2KGRhdGEgKyAyKSA8PCAxNik7Cit9CisKKy8vIFN0b3JlIDE2LCAyNCBvciAzMiBiaXRzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTE2KHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB2YWwpIHsKKyAgU0JfRENIRUNLKHZhbCA8ICgxIDw8IDE2KSk7CisgIGRhdGFbMF0gPSAodmFsID4+IDApOworICBkYXRhWzFdID0gKHZhbCA+PiA4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUyNCh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgdmFsKSB7CisgIFNCX0RDSEVDSyh2YWwgPCAoMSA8PCAyNCkpOworICBQdXRMRTE2KGRhdGEsIHZhbCAmIDB4ZmZmZik7CisgIGRhdGFbMl0gPSAodmFsID4+IDE2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUzMih1aW50OF90KiBjb25zdCBkYXRhLCB1aW50MzJfdCB2YWwpIHsKKyAgUHV0TEUxNihkYXRhLCAoaW50KSh2YWwgJiAweGZmZmYpKTsKKyAgUHV0TEUxNihkYXRhICsgMiwgKGludCkodmFsID4+IDE2KSk7Cit9CisKKy8vIFJldHVybnMgMzEgXiBjbHoobikgPSBsb2cyKG4pLiBUaGlzIGlzIHRoZSBkZWZhdWx0IEMtaW1wbGVtZW50YXRpb24sIGVpdGhlcgorLy8gYmFzZWQgb24gdGFibGUgb3Igbm90LiBDYW4gYmUgdXNlZCBhcyBmYWxsYmFjayBpZiBjbHooKSBpcyBub3QgYXZhaWxhYmxlLgorI2RlZmluZSBXRUJQX05FRURfTE9HX1RBQkxFXzhCSVQKK2V4dGVybiBjb25zdCB1aW50OF90IFdlYlBMb2dUYWJsZThiaXRbMjU2XTsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUExvZzJGbG9vckModWludDMyX3QgbikgeworICBpbnQgbG9nX3ZhbHVlID0gMDsKKyAgd2hpbGUgKG4gPj0gMjU2KSB7CisgICAgbG9nX3ZhbHVlICs9IDg7CisgICAgbiA+Pj0gODsKKyAgfQorICByZXR1cm4gbG9nX3ZhbHVlICsgV2ViUExvZ1RhYmxlOGJpdFtuXTsKK30KKworLy8gUmV0dXJucyAoaW50KWZsb29yKGxvZzIobikpLiBuIG11c3QgYmUgPiAwLgorLy8gdXNlIEdOVSBidWlsdGlucyB3aGVyZSBhdmFpbGFibGUuCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgICAgKChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpIHx8IF9fR05VQ19fID49IDQpCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICByZXR1cm4gMzEgXiBfX2J1aWx0aW5fY2x6KG4pOworfQorI2VsaWYgIWRlZmluZWQoU1RBUkJPQVJEKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+IDEzMTAgJiYgXAorICAgICAgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2luY2x1ZGUgPGludHJpbi5oPgorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICB1bnNpZ25lZCBsb25nIGZpcnN0X3NldF9iaXQ7CisgIF9CaXRTY2FuUmV2ZXJzZSgmZmlyc3Rfc2V0X2JpdCwgbik7CisgIHJldHVybiBmaXJzdF9zZXRfYml0OworfQorI2Vsc2UgICAvLyBkZWZhdWx0OiB1c2UgdGhlIEMtdmVyc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7IHJldHVybiBXZWJQTG9nMkZsb29yQyhuKTsgfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQaXhlbCBjb3B5aW5nLgorCitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIENvcHkgd2lkdGggeCBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcgaG9ub3JpbmcgdGhlIHN0cmlkZXMuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIENvcHkgQVJHQiBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyBzdHJpZGVzLiAnc3JjJyBhbmQgJ2RzdCcgYXJlCisvLyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkIGFuZCB1c2luZyBBUkdCIGRhdGEuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmlxdWUgY29sb3JzLgorCisvLyBSZXR1cm5zIGNvdW50IG9mIHVuaXF1ZSBjb2xvcnMgaW4gJ3BpYycsIGFzc3VtaW5nIHBpYy0+dXNlX2FyZ2IgaXMgdHJ1ZS4KKy8vIElmIHRoZSB1bmlxdWUgY29sb3IgY291bnQgaXMgbW9yZSB0aGFuIE1BWF9QQUxFVFRFX1NJWkUsIHJldHVybnMKKy8vIE1BWF9QQUxFVFRFX1NJWkUrMS4KKy8vIElmICdwYWxldHRlJyBpcyBub3QgTlVMTCBhbmQgbnVtYmVyIG9mIHVuaXF1ZSBjb2xvcnMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisvLyBNQVhfUEFMRVRURV9TSVpFLCBhbHNvIG91dHB1dHMgdGhlIGFjdHVhbCB1bmlxdWUgY29sb3JzIGludG8gJ3BhbGV0dGUnLgorLy8gTm90ZTogJ3BhbGV0dGUnIGlzIGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgYWxyZWFkeSBhbGxvY2F0ZWQgd2l0aCBhdCBsZWFzdAorLy8gTUFYX1BBTEVUVEVfU0laRSBlbGVtZW50cy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0Q29sb3JQYWxldHRlKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZWNvZGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2RlY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2RlY29kZS5oCmluZGV4IDFkOThiOGMuLjIxNjVlOTYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVjb2RlLmgKQEAgLTE2LDExICsxNiwxMSBAQAogCiAjaW5jbHVkZSAiLi90eXBlcy5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jZGVmaW5lIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTiAweDAyMDEgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCisjZGVmaW5lIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTiAweDAyMDggICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCiAKIC8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCiAvLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgpAQCAtMzYsNTQgKzM2LDU3IEBACiAKIC8vIFJldHVybiB0aGUgZGVjb2RlcidzIHZlcnNpb24gbnVtYmVyLCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcgOGJpdHMgZm9yCiAvLyBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBHZXREZWNvZGVyVmVyc2lvbih2b2lkKTsKIAogLy8gUmV0cmlldmUgYmFzaWMgaGVhZGVyIGluZm9ybWF0aW9uOiB3aWR0aCwgaGVpZ2h0LgotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gdmFsaWRhdGUgdGhlIGhlYWRlciBhbmQgcmV0dXJuIDAgaW4KLS8vIGNhc2Ugb2YgZm9ybWF0dGluZyBlcnJvci4KKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIHZhbGlkYXRlIHRoZSBoZWFkZXIsIHJldHVybmluZyB0cnVlIG9uIHN1Y2Nlc3MsCisvLyBmYWxzZSBvdGhlcndpc2UuICcqd2lkdGgnIGFuZCAnKmhlaWdodCcgYXJlIG9ubHkgdmFsaWQgb24gc3VjY2Vzc2Z1bCByZXR1cm4uCiAvLyBQb2ludGVycyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBjYW4gYmUgcGFzc2VkIE5VTEwgaWYgZGVlbWVkIGlycmVsZXZhbnQuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK1dFQlBfRVhURVJOIGludCBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKIAogLy8gRGVjb2RlcyBXZWJQIGltYWdlcyBwb2ludGVkIHRvIGJ5ICdkYXRhJyBhbmQgcmV0dXJucyBSR0JBIHNhbXBsZXMsIGFsb25nCiAvLyB3aXRoIHRoZSBkaW1lbnNpb25zIGluICp3aWR0aCBhbmQgKmhlaWdodC4gVGhlIG9yZGVyaW5nIG9mIHNhbXBsZXMgaW4KIC8vIG1lbW9yeSBpcyBSLCBHLCBCLCBBLCBSLCBHLCBCLCBBLi4uIGluIHNjYW4gb3JkZXIgKGVuZGlhbi1pbmRlcGVuZGVudCkuCi0vLyBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91bGQgYmUgZGVsZXRlZCBjYWxsaW5nIGZyZWUoKS4KKy8vIFRoZSByZXR1cm5lZCBwb2ludGVyIHNob3VsZCBiZSBkZWxldGVkIGNhbGxpbmcgV2ViUEZyZWUoKS4KIC8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQkEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKIAogLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBBLCBSLCBHLCBCLCBBLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVBUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CiAKIC8vIFNhbWUgYXMgV2ViUERlY29kZVJHQkEsIGJ1dCByZXR1cm5pbmcgQiwgRywgUiwgQSwgQiwgRywgUiwgQS4uLiBvcmRlcmVkIGRhdGEuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZUJHUkEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwogCiAvLyBTYW1lIGFzIFdlYlBEZWNvZGVSR0JBLCBidXQgcmV0dXJuaW5nIFIsIEcsIEIsIFIsIEcsIEIuLi4gb3JkZXJlZCBkYXRhLgogLy8gSWYgdGhlIGJpdHN0cmVhbSBjb250YWlucyB0cmFuc3BhcmVuY3ksIGl0IGlzIGlnbm9yZWQuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CiAKIC8vIFNhbWUgYXMgV2ViUERlY29kZVJHQiwgYnV0IHJldHVybmluZyBCLCBHLCBSLCBCLCBHLCBSLi4uIG9yZGVyZWQgZGF0YS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKIAogCiAvLyBEZWNvZGUgV2ViUCBpbWFnZXMgcG9pbnRlZCB0byBieSAnZGF0YScgdG8gWSdVViBmb3JtYXQoKikuIFRoZSBwb2ludGVyCiAvLyByZXR1cm5lZCBpcyB0aGUgWSBzYW1wbGVzIGJ1ZmZlci4gVXBvbiByZXR1cm4sICp1IGFuZCAqdiB3aWxsIHBvaW50IHRvCi0vLyB0aGUgVSBhbmQgViBjaHJvbWEgZGF0YS4gVGhlc2UgVSBhbmQgViBidWZmZXJzIG5lZWQgTk9UIGJlIGZyZWVkKCknZCwKLS8vIHVubGlrZSB0aGUgcmV0dXJuZWQgWSBsdW1hIG9uZS4gVGhlIGRpbWVuc2lvbiBvZiB0aGUgVSBhbmQgViBwbGFuZXMKLS8vIGFyZSBib3RoICgqd2lkdGggKyAxKSAvIDIgYW5kICgqaGVpZ2h0ICsgMSkvIDIuCisvLyB0aGUgVSBhbmQgViBjaHJvbWEgZGF0YS4gVGhlc2UgVSBhbmQgViBidWZmZXJzIG5lZWQgTk9UIGJlIHBhc3NlZCB0bworLy8gV2ViUEZyZWUoKSwgdW5saWtlIHRoZSByZXR1cm5lZCBZIGx1bWEgb25lLiBUaGUgZGltZW5zaW9uIG9mIHRoZSBVIGFuZCBWCisvLyBwbGFuZXMgYXJlIGJvdGggKCp3aWR0aCArIDEpIC8gMiBhbmQgKCpoZWlnaHQgKyAxKS8gMi4KIC8vIFVwb24gcmV0dXJuLCB0aGUgWSBidWZmZXIgaGFzIGEgc3RyaWRlIHJldHVybmVkIGFzICcqc3RyaWRlJywgd2hpbGUgVSBhbmQgVgogLy8gaGF2ZSBhIGNvbW1vbiBzdHJpZGUgcmV0dXJuZWQgYXMgJyp1dl9zdHJpZGUnLgogLy8gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KIC8vICgqKSBBbHNvIG5hbWVkIFknQ2JDci4gU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVlVVihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUpOworV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVlVVihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUpOworCisvLyBSZWxlYXNlcyBtZW1vcnkgcmV0dXJuZWQgYnkgdGhlIFdlYlBEZWNvZGUqKCkgZnVuY3Rpb25zIGFib3ZlLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRnJlZSh2b2lkKiBwdHIpOwogCiAvLyBUaGVzZSBmaXZlIGZ1bmN0aW9ucyBhcmUgdmFyaWFudHMgb2YgdGhlIGFib3ZlIG9uZXMsIHRoYXQgZGVjb2RlIHRoZSBpbWFnZQogLy8gZGlyZWN0bHkgaW50byBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyICdvdXRwdXRfYnVmZmVyJy4gVGhlIG1heGltdW0gc3RvcmFnZQpAQCAtOTMsMjIgKzk2LDIyIEBACiAvLyBUaGUgcGFyYW1ldGVyICdvdXRwdXRfc3RyaWRlJyBzcGVjaWZpZXMgdGhlIGRpc3RhbmNlIChpbiBieXRlcykKIC8vIGJldHdlZW4gc2NhbmxpbmVzLiBIZW5jZSwgb3V0cHV0X2J1ZmZlcl9zaXplIGlzIGV4cGVjdGVkIHRvIGJlIGF0IGxlYXN0CiAvLyBvdXRwdXRfc3RyaWRlIHggcGljdHVyZS1oZWlnaHQuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVJHQkFJbnRvKAorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQkFJbnRvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOwotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVBUkdCSW50bygKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVBUkdCSW50bygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSQUludG8oCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSQUludG8oCiAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CiAKIC8vIFJHQiBhbmQgQkdSIHZhcmlhbnRzLiBIZXJlIHRvbyB0aGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uLCBpZiBwcmVzZW50LAogLy8gd2lsbCBiZSBkcm9wcGVkIGFuZCBpZ25vcmVkLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0JJbnRvKAorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQkludG8oCiAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7Ci1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZUJHUkludG8oCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSSW50bygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKIApAQCAtMTE5LDcgKzEyMiw3IEBACiAvLyAndV9zaXplJyBhbmQgJ3Zfc2l6ZScgcmVzcGVjdGl2ZWx5LgogLy8gUG9pbnRlciB0byB0aGUgbHVtYSBwbGFuZSAoJypsdW1hJykgaXMgcmV0dXJuZWQgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAogLy8gZHVyaW5nIGRlY29kaW5nIChvciBiZWNhdXNlIHNvbWUgYnVmZmVycyB3ZXJlIGZvdW5kIHRvIGJlIHRvbyBzbWFsbCkuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVlVVkludG8oCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlWVVWSW50bygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgIHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKICAgICB1aW50OF90KiB1LCBzaXplX3QgdV9zaXplLCBpbnQgdV9zdHJpZGUsCkBAIC0xOTQsNyArMTk3LDEwIEBACiBzdHJ1Y3QgV2ViUERlY0J1ZmZlciB7CiAgIFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZTsgIC8vIENvbG9yc3BhY2UuCiAgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAgIC8vIERpbWVuc2lvbnMuCi0gIGludCBpc19leHRlcm5hbF9tZW1vcnk7ICAgIC8vIElmIHRydWUsICdpbnRlcm5hbF9tZW1vcnknIHBvaW50ZXIgaXMgbm90IHVzZWQuCisgIGludCBpc19leHRlcm5hbF9tZW1vcnk7ICAgIC8vIElmIG5vbi16ZXJvLCAnaW50ZXJuYWxfbWVtb3J5JyBwb2ludGVyIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkLiBJZiB2YWx1ZSBpcyAnMicgb3IgbW9yZSwgdGhlIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeSBpcyBjb25zaWRlcmVkICdzbG93JyBhbmQgbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZC93cml0ZSB3aWxsIGJlIGF2b2lkZWQuCiAgIHVuaW9uIHsKICAgICBXZWJQUkdCQUJ1ZmZlciBSR0JBOwogICAgIFdlYlBZVVZBQnVmZmVyIFlVVkE7CkBAIC0yMDIsMTIgKzIwOCwxMiBAQAogICB1aW50MzJfdCAgICAgICBwYWRbNF07ICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKIAogICB1aW50OF90KiBwcml2YXRlX21lbW9yeTsgICAvLyBJbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkgKG9ubHkgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc19leHRlcm5hbF9tZW1vcnkgaXMgZmFsc2UpLiBTaG91bGQgbm90IGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNfZXh0ZXJuYWxfbWVtb3J5IGlzIDApLiBTaG91bGQgbm90IGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWxseSwgYnV0IGFjY2Vzc2VkIHZpYSB0aGUgYnVmZmVyIHVuaW9uLgogfTsKIAogLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKGludCkgV2ViUEluaXREZWNCdWZmZXJJbnRlcm5hbChXZWJQRGVjQnVmZmVyKiwgaW50KTsKK1dFQlBfRVhURVJOIGludCBXZWJQSW5pdERlY0J1ZmZlckludGVybmFsKFdlYlBEZWNCdWZmZXIqLCBpbnQpOwogCiAvLyBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgYXMgZW1wdHkuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgdXNlLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2gKQEAgLTIxNyw3ICsyMjMsNyBAQAogCiAvLyBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIuIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBsYXN0LgogLy8gTm90ZTogZG9lc24ndCBmcmVlIHRoZSAnYnVmZmVyJyBzdHJ1Y3R1cmUgaXRzZWxmLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKTsKK1dFQlBfRVhURVJOIHZvaWQgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVudW1lcmF0aW9uIG9mIHRoZSBzdGF0dXMgY29kZXMKQEAgLTI0MiwxOSArMjQ4LDE5IEBACiAvLyBwaWN0dXJlIGlzIG9ubHkgcGFydGlhbGx5IGRlY29kZWQsIHBlbmRpbmcgYWRkaXRpb25hbCBpbnB1dC4KIC8vIENvZGUgZXhhbXBsZToKIC8vCi0vLyAgIFdlYlBJbml0RGVjQnVmZmVyKCZidWZmZXIpOwotLy8gICBidWZmZXIuY29sb3JzcGFjZSA9IG1vZGU7CisvLyAgIFdlYlBJbml0RGVjQnVmZmVyKCZvdXRwdXRfYnVmZmVyKTsKKy8vICAgb3V0cHV0X2J1ZmZlci5jb2xvcnNwYWNlID0gbW9kZTsKIC8vICAgLi4uCi0vLyAgIFdlYlBJRGVjb2RlciogaWRlYyA9IFdlYlBJTmV3RGVjb2RlcigmYnVmZmVyKTsKLS8vICAgd2hpbGUgKGhhc19tb3JlX2RhdGEpIHsKLS8vICAgICAvLyAuLi4gKGdldCBhZGRpdGlvbmFsIGRhdGEpCisvLyAgIFdlYlBJRGVjb2RlciogaWRlYyA9IFdlYlBJTmV3RGVjb2Rlcigmb3V0cHV0X2J1ZmZlcik7CisvLyAgIHdoaWxlIChhZGRpdGlvbmFsX2RhdGFfaXNfYXZhaWxhYmxlKSB7CisvLyAgICAgLy8gLi4uIChnZXQgYWRkaXRpb25hbCBkYXRhIGluIHNvbWUgbmV3X2RhdGFbXSBidWZmZXIpCiAvLyAgICAgc3RhdHVzID0gV2ViUElBcHBlbmQoaWRlYywgbmV3X2RhdGEsIG5ld19kYXRhX3NpemUpOwotLy8gICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19TVVNQRU5ERUQgfHwKLS8vICAgICAgIGJyZWFrOworLy8gICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSyAmJiBzdGF0dXMgIT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpIHsKKy8vICAgICAgIGJyZWFrOyAgICAvLyBhbiBlcnJvciBvY2N1cnJlZC4KIC8vICAgICB9CiAvLwogLy8gICAgIC8vIFRoZSBhYm92ZSBjYWxsIGRlY29kZXMgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGJ1ZmZlci4KLS8vICAgICAvLyBQYXJ0IG9mIHRoZSBpbWFnZSBjYW4gbm93IGJlIHJlZnJlc2hlZCBieSBjYWxsaW5nIHRvCisvLyAgICAgLy8gUGFydCBvZiB0aGUgaW1hZ2UgY2FuIG5vdyBiZSByZWZyZXNoZWQgYnkgY2FsbGluZwogLy8gICAgIC8vIFdlYlBJRGVjR2V0UkdCKCkvV2ViUElEZWNHZXRZVVZBKCkgZXRjLgogLy8gICB9CiAvLyAgIFdlYlBJRGVsZXRlKGlkZWMpOwpAQCAtMjY2LDEyICsyNzIsMTIgQEAKIC8vIHRoYXQgb2YgdGhlIHJldHVybmVkIFdlYlBJRGVjb2RlciBvYmplY3QuCiAvLyBUaGUgc3VwcGxpZWQgJ291dHB1dF9idWZmZXInIGNvbnRlbnQgTVVTVCBOT1QgYmUgY2hhbmdlZCBiZXR3ZWVuIGNhbGxzIHRvCiAvLyBXZWJQSUFwcGVuZCgpIG9yIFdlYlBJVXBkYXRlKCkgdW5sZXNzICdvdXRwdXRfYnVmZmVyLmlzX2V4dGVybmFsX21lbW9yeScgaXMKLS8vIHNldCB0byAxLiBJbiBzdWNoIGEgY2FzZSwgaXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIHBvaW50ZXJzLCBzaXplIGFuZAorLy8gbm90IHNldCB0byAwLiBJbiBzdWNoIGEgY2FzZSwgaXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIHBvaW50ZXJzLCBzaXplIGFuZAogLy8gc3RyaWRlIG9mIG91dHB1dF9idWZmZXIudS5SR0JBIG9yIG91dHB1dF9idWZmZXIudS5ZVVZBLCBwcm92aWRlZCB0aGV5IHJlbWFpbgogLy8gd2l0aGluIHZhbGlkIGJvdW5kcy4KIC8vIEFsbCBvdGhlciBmaWVsZHMgb2YgV2ViUERlY0J1ZmZlciBNVVNUIHJlbWFpbiBjb25zdGFudCBiZXR3ZWVuIGNhbGxzLgogLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4KLVdFQlBfRVhURVJOKFdlYlBJRGVjb2RlciopIFdlYlBJTmV3RGVjb2RlcihXZWJQRGVjQnVmZmVyKiBvdXRwdXRfYnVmZmVyKTsKK1dFQlBfRVhURVJOIFdlYlBJRGVjb2RlciogV2ViUElOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIG91dHB1dF9idWZmZXIpOwogCiAvLyBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYW4gaW5jcmVtZW50YWwtZGVjb2RlciBvYmplY3QsIHdoaWNoCiAvLyB3aWxsIG91dHB1dCB0aGUgUkdCL0Egc2FtcGxlcyBzcGVjaWZpZWQgYnkgJ2NzcCcgaW50byBhIHByZWFsbG9jYXRlZApAQCAtMjgzLDcgKzI4OSw3IEBACiAvLyBjb2xvcnNwYWNlICdjc3AnIGlzIHRha2VuIGludG8gYWNjb3VudCBmb3IgYWxsb2NhdGluZyB0aGlzIGJ1ZmZlci4gQWxsIG90aGVyCiAvLyBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgogLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgb3IgaWYgc29tZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElOZXdSR0IoCitXRUJQX0VYVEVSTiBXZWJQSURlY29kZXIqIFdlYlBJTmV3UkdCKAogICAgIFdFQlBfQ1NQX01PREUgY3NwLAogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKIApAQCAtMjk4LDcgKzMwNCw3IEBACiAvLyBJbiB0aGlzIGNhc2UsIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBhbGxvY2F0ZWQgKHVzaW5nCiAvLyBNT0RFX1lVVkEpIHdoZW4gZGVjb2Rpbmcgc3RhcnRzLiBBbGwgcGFyYW1ldGVycyBhcmUgdGhlbiBpZ25vcmVkLgogLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCBvciBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElOZXdZVVZBKAorV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVkEoCiAgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAogICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKICAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCkBAIC0zMDYsMTkgKzMxMiwxOSBAQAogCiAvLyBEZXByZWNhdGVkIHZlcnNpb24gb2YgdGhlIGFib3ZlLCB3aXRob3V0IHRoZSBhbHBoYSBwbGFuZS4KIC8vIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1lVVigKK1dFQlBfRVhURVJOIFdlYlBJRGVjb2RlciogV2ViUElOZXdZVVYoCiAgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAogICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKICAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUpOwogCiAvLyBEZWxldGVzIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIG1lbW9yeS4gTXVzdCBhbHdheXMgYmUgY2FsbGVkCiAvLyBpZiBXZWJQSU5ld0RlY29kZXIsIFdlYlBJTmV3UkdCIG9yIFdlYlBJTmV3WVVWIHN1Y2NlZWRlZC4KLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYyk7CitXRUJQX0VYVEVSTiB2b2lkIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYyk7CiAKIC8vIENvcGllcyBhbmQgZGVjb2RlcyB0aGUgbmV4dCBhdmFpbGFibGUgZGF0YS4gUmV0dXJucyBWUDhfU1RBVFVTX09LIHdoZW4KIC8vIHRoZSBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgZGVjb2RlZC4gUmV0dXJucyBWUDhfU1RBVFVTX1NVU1BFTkRFRCB3aGVuIG1vcmUKIC8vIGRhdGEgaXMgZXhwZWN0ZWQuIFJldHVybnMgZXJyb3IgaW4gb3RoZXIgY2FzZXMuCi1XRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQSUFwcGVuZCgKK1dFQlBfRVhURVJOIFZQOFN0YXR1c0NvZGUgV2ViUElBcHBlbmQoCiAgICAgV2ViUElEZWNvZGVyKiBpZGVjLCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKIAogLy8gQSB2YXJpYW50IG9mIHRoZSBhYm92ZSBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gZGF0YSBidWZmZXIgY29udGFpbnMKQEAgLTMyNiw3ICszMzIsNyBAQAogLy8gdG8gdGhlIGludGVybmFsIG1lbW9yeS4KIC8vIE5vdGUgdGhhdCB0aGUgdmFsdWUgb2YgdGhlICdkYXRhJyBwb2ludGVyIGNhbiBjaGFuZ2UgYmV0d2VlbiBjYWxscyB0bwogLy8gV2ViUElVcGRhdGUsIGZvciBpbnN0YW5jZSB3aGVuIHRoZSBkYXRhIGJ1ZmZlciBpcyByZXNpemVkIHRvIGZpdCBsYXJnZXIgZGF0YS4KLVdFQlBfRVhURVJOKFZQOFN0YXR1c0NvZGUpIFdlYlBJVXBkYXRlKAorV0VCUF9FWFRFUk4gVlA4U3RhdHVzQ29kZSBXZWJQSVVwZGF0ZSgKICAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwogCiAvLyBSZXR1cm5zIHRoZSBSR0IvQSBpbWFnZSBkZWNvZGVkIHNvIGZhci4gUmV0dXJucyBOVUxMIGlmIG91dHB1dCBwYXJhbXMKQEAgLTMzNCwxNSArMzQwLDE2IEBACiAvLyBzcGVjaWZpZWQgZHVyaW5nIGNhbGwgdG8gV2ViUElOZXdEZWNvZGVyKCkgb3IgV2ViUElOZXdSR0IoKS4KIC8vICpsYXN0X3kgaXMgdGhlIGluZGV4IG9mIGxhc3QgZGVjb2RlZCByb3cgaW4gcmFzdGVyIHNjYW4gb3JkZXIuIFNvbWUgcG9pbnRlcnMKIC8vICgqbGFzdF95LCAqd2lkdGggZXRjLikgY2FuIGJlIE5VTEwgaWYgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBpcyBub3QKLS8vIG5lZWRlZC4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQSURlY0dldFJHQigKKy8vIG5lZWRlZC4gVGhlIHZhbHVlcyBpbiB0aGVzZSBwb2ludGVycyBhcmUgb25seSB2YWxpZCBvbiBzdWNjZXNzZnVsIChub24tTlVMTCkKKy8vIHJldHVybi4KK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBJRGVjR2V0UkdCKAogICAgIGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCiAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlKTsKIAogLy8gU2FtZSBhcyBhYm92ZSBmdW5jdGlvbiB0byBnZXQgYSBZVVZBIGltYWdlLiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGx1bWEKIC8vIHBsYW5lIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gSWYgdGhlcmUgaXMgbm8gYWxwaGEgaW5mb3JtYXRpb24KIC8vIHRoZSBhbHBoYSBwb2ludGVyICcqYScgd2lsbCBiZSByZXR1cm5lZCBOVUxMLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0WVVWQSgKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBJRGVjR2V0WVVWQSgKICAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAogICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwgdWludDhfdCoqIGEsCiAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSwgaW50KiBhX3N0cmlkZSk7CkBAIC0zNjIsNyArMzY5LDcgQEAKIC8vIFJldHVybnMgTlVMTCBpbiBjYXNlIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyIG9iamVjdCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgogLy8gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBUaGlzIHN0cnVjdHVyZQogLy8gaXMgcmVhZC1vbmx5LCB0aWVkIHRvIFdlYlBJRGVjb2RlcidzIGxpZmVzcGFuIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotV0VCUF9FWFRFUk4oY29uc3QgV2ViUERlY0J1ZmZlciopIFdlYlBJRGVjb2RlZEFyZWEoCitXRUJQX0VYVEVSTiBjb25zdCBXZWJQRGVjQnVmZmVyKiBXZWJQSURlY29kZWRBcmVhKAogICAgIGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsZWZ0LCBpbnQqIHRvcCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDA0LDE4ICs0MTEsMTMgQEAKICAgaW50IGhlaWdodDsgICAgICAgICAvLyBIZWlnaHQgaW4gcGl4ZWxzLCBhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbS4KICAgaW50IGhhc19hbHBoYTsgICAgICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbC4KICAgaW50IGhhc19hbmltYXRpb247ICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gaXMgYW4gYW5pbWF0aW9uLgorICBpbnQgZm9ybWF0OyAgICAgICAgIC8vIDAgPSB1bmRlZmluZWQgKC9taXhlZCksIDEgPSBsb3NzeSwgMiA9IGxvc3NsZXNzCiAKLSAgLy8gVW51c2VkIGZvciBub3c6Ci0gIGludCBiaXRzdHJlYW1fdmVyc2lvbjsgICAgICAgIC8vIHNob3VsZCBiZSAwIGZvciBub3cuIFRPRE8obGF0ZXIpCi0gIGludCBub19pbmNyZW1lbnRhbF9kZWNvZGluZzsgIC8vIGlmIHRydWUsIHVzaW5nIGluY3JlbWVudGFsIGRlY29kaW5nIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbW1lbmRlZC4KLSAgaW50IHJvdGF0ZTsgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhsYXRlcikKLSAgaW50IHV2X3NhbXBsaW5nOyAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDAgZm9yIG5vdy4gVE9ETyhsYXRlcikKLSAgdWludDMyX3QgcGFkWzJdOyAgICAgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisgIHVpbnQzMl90IHBhZFs1XTsgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiB9OwogCiAvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oVlA4U3RhdHVzQ29kZSkgV2ViUEdldEZlYXR1cmVzSW50ZXJuYWwoCitXRUJQX0VYVEVSTiBWUDhTdGF0dXNDb2RlIFdlYlBHZXRGZWF0dXJlc0ludGVybmFsKAogICAgIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QsIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyosIGludCk7CiAKIC8vIFJldHJpZXZlIGZlYXR1cmVzIGZyb20gdGhlIGJpdHN0cmVhbS4gVGhlICpmZWF0dXJlcyBzdHJ1Y3R1cmUgaXMgZmlsbGVkCkBAIC00NDEsMTEgKzQ0MywxMSBAQAogICBpbnQgdXNlX3NjYWxpbmc7ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCBzY2FsaW5nIGlzIGFwcGxpZWQgX2FmdGVyd2FyZF8KICAgaW50IHNjYWxlZF93aWR0aCwgc2NhbGVkX2hlaWdodDsgICAgLy8gZmluYWwgcmVzb2x1dGlvbgogICBpbnQgdXNlX3RocmVhZHM7ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCB1c2UgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcKKyAgaW50IGRpdGhlcmluZ19zdHJlbmd0aDsgICAgICAgICAgICAgLy8gZGl0aGVyaW5nIHN0cmVuZ3RoICgwPU9mZiwgMTAwPWZ1bGwpCisgIGludCBmbGlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaXAgb3V0cHV0IHZlcnRpY2FsbHkKKyAgaW50IGFscGhhX2RpdGhlcmluZ19zdHJlbmd0aDsgICAgICAgLy8gYWxwaGEgZGl0aGVyaW5nIHN0cmVuZ3RoIGluIFswLi4xMDBdCiAKLSAgLy8gVW51c2VkIGZvciBub3c6Ci0gIGludCBmb3JjZV9yb3RhdGlvbjsgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCByb3RhdGlvbiAodG8gYmUgYXBwbGllZCBfbGFzdF8pCi0gIGludCBub19lbmhhbmNlbWVudDsgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIGRpc2NhcmQgZW5oYW5jZW1lbnQgbGF5ZXIKLSAgdWludDMyX3QgcGFkWzZdOyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisgIHVpbnQzMl90IHBhZFs1XTsgICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogfTsKIAogLy8gTWFpbiBvYmplY3Qgc3RvcmluZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWR2YW5jZWQgZGVjb2RpbmcuCkBAIC00NTYsNyArNDU4LDcgQEAKIH07CiAKIC8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKFdlYlBEZWNvZGVyQ29uZmlnKiwgaW50KTsKK1dFQlBfRVhURVJOIGludCBXZWJQSW5pdERlY29kZXJDb25maWdJbnRlcm5hbChXZWJQRGVjb2RlckNvbmZpZyosIGludCk7CiAKIC8vIEluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gYXMgZW1wdHkuIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHdheXMgYmUKIC8vIGNhbGxlZCBmaXJzdCwgdW5sZXNzIFdlYlBHZXRGZWF0dXJlcygpIGlzIHRvIGJlIGNhbGxlZC4KQEAgLTQ3MCwyMCArNDcyLDIyIEBACiAvLyBwYXJhbWV0ZXIsIGluIHdoaWNoIGNhc2UgdGhlIGZlYXR1cmVzIHdpbGwgYmUgcGFyc2VkIGFuZCBzdG9yZWQgaW50bwogLy8gY29uZmlnLT5pbnB1dC4gT3RoZXJ3aXNlLCAnZGF0YScgY2FuIGJlIE5VTEwgYW5kIG5vIHBhcnNpbmcgd2lsbCBvY2N1ci4KIC8vIE5vdGUgdGhhdCAnY29uZmlnJyBjYW4gYmUgTlVMTCB0b28sIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLS8vIGlzIHVzZWQuCisvLyBpcyB1c2VkLiBJZiAnY29uZmlnJyBpcyBub3QgTlVMTCwgaXQgbXVzdCBvdXRsaXZlIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0CisvLyBhcyBzb21lIHJlZmVyZW5jZXMgdG8gaXRzIGZpZWxkcyB3aWxsIGJlIHVzZWQuIE5vIGludGVybmFsIGNvcHkgb2YgJ2NvbmZpZycKKy8vIGlzIG1hZGUuCiAvLyBUaGUgcmV0dXJuIFdlYlBJRGVjb2RlciBvYmplY3QgbXVzdCBhbHdheXMgYmUgZGVsZXRlZCBjYWxsaW5nIFdlYlBJRGVsZXRlKCkuCiAvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAoYW5kIGNvbmZpZy0+c3RhdHVzIHdpbGwgdGhlbiByZWZsZWN0Ci0vLyB0aGUgZXJyb3IgY29uZGl0aW9uKS4KLVdFQlBfRVhURVJOKFdlYlBJRGVjb2RlciopIFdlYlBJRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKTsKKy8vIHRoZSBlcnJvciBjb25kaXRpb24sIGlmIGF2YWlsYWJsZSkuCitXRUJQX0VYVEVSTiBXZWJQSURlY29kZXIqIFdlYlBJRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOwogCiAvLyBOb24taW5jcmVtZW50YWwgdmVyc2lvbi4gVGhpcyB2ZXJzaW9uIGRlY29kZXMgdGhlIGZ1bGwgZGF0YSBhdCBvbmNlLCB0YWtpbmcKIC8vICdjb25maWcnIGludG8gYWNjb3VudC4gUmV0dXJucyBkZWNvZGluZyBzdGF0dXMgKHdoaWNoIHNob3VsZCBiZSBWUDhfU1RBVFVTX09LCi0vLyBpZiB0aGUgZGVjb2Rpbmcgd2FzIHN1Y2Nlc3NmdWwpLgotV0VCUF9FWFRFUk4oVlA4U3RhdHVzQ29kZSkgV2ViUERlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKTsKKy8vIGlmIHRoZSBkZWNvZGluZyB3YXMgc3VjY2Vzc2Z1bCkuIE5vdGUgdGhhdCAnY29uZmlnJyBjYW5ub3QgYmUgTlVMTC4KK1dFQlBfRVhURVJOIFZQOFN0YXR1c0NvZGUgV2ViUERlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOwogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAgIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZW11eC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTVkNjQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVtdXguaApAQCAtMCwwICsxLDM2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIERlbXV4IEFQSS4KKy8vIEVuYWJsZXMgZXh0cmFjdGlvbiBvZiBpbWFnZSBhbmQgZXh0ZW5kZWQgZm9ybWF0IGRhdGEgZnJvbSBXZWJQIGZpbGVzLgorCisvLyBDb2RlIEV4YW1wbGU6IERlbXV4aW5nIFdlYlAgZGF0YSB0byBleHRyYWN0IGFsbCB0aGUgZnJhbWVzLCBJQ0MgcHJvZmlsZQorLy8gYW5kIEVYSUYvWE1QIG1ldGFkYXRhLgorLyoKKyAgV2ViUERlbXV4ZXIqIGRlbXV4ID0gV2ViUERlbXV4KCZ3ZWJwX2RhdGEpOworCisgIHVpbnQzMl90IHdpZHRoID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOworICB1aW50MzJfdCBoZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOworICAvLyAuLi4gKEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmVhdHVyZXMgcHJlc2VudCBpbiB0aGUgV2ViUCBmaWxlKS4KKyAgdWludDMyX3QgZmxhZ3MgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUyk7CisKKyAgLy8gLi4uIChJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcykuCisgIFdlYlBJdGVyYXRvciBpdGVyOworICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXgsIDEsICZpdGVyKSkgeworICAgIGRvIHsKKyAgICAgIC8vIC4uLiAoQ29uc3VtZSAnaXRlcic7IGUuZy4gRGVjb2RlICdpdGVyLmZyYWdtZW50JyB3aXRoIFdlYlBEZWNvZGUoKSwKKyAgICAgIC8vIC4uLiBhbmQgZ2V0IG90aGVyIGZyYW1lIHByb3BlcnRpZXMgbGlrZSB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzIGV0Yy4KKyAgICAgIC8vIC4uLiBzZWUgJ3N0cnVjdCBXZWJQSXRlcmF0b3InIGJlbG93IGZvciBtb3JlIGluZm8pLgorICAgIH0gd2hpbGUgKFdlYlBEZW11eE5leHRGcmFtZSgmaXRlcikpOworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7CisgIH0KKworICAvLyAuLi4gKEV4dHJhY3QgbWV0YWRhdGEpLgorICBXZWJQQ2h1bmtJdGVyYXRvciBjaHVua19pdGVyOworICBpZiAoZmxhZ3MgJiBJQ0NQX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiSUNDUCIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBJQ0MgcHJvZmlsZSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIGlmIChmbGFncyAmIEVYSUZfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJFWElGIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIEVYSUYgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBpZiAoZmxhZ3MgJiBYTVBfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJYTVAgIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIFhNUCBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIFdlYlBEZW11eERlbGV0ZShkZW11eCk7CisqLworCisjaWZuZGVmIFdFQlBfV0VCUF9ERU1VWF9IXworI2RlZmluZSBXRUJQX1dFQlBfREVNVVhfSF8KKworI2luY2x1ZGUgIi4vZGVjb2RlLmgiICAgICAvLyBmb3IgV0VCUF9DU1BfTU9ERQorI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OIDB4MDEwNyAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgV2ViUERlbXV4U3RhdGU7CisvLyB0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgV2ViUEZvcm1hdEZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBXZWJQRGVtdXhlciBXZWJQRGVtdXhlcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBJdGVyYXRvciBXZWJQSXRlcmF0b3I7Cit0eXBlZGVmIHN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciBXZWJQQ2h1bmtJdGVyYXRvcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltSW5mbyBXZWJQQW5pbUluZm87Cit0eXBlZGVmIHN0cnVjdCBXZWJQQW5pbURlY29kZXJPcHRpb25zIFdlYlBBbmltRGVjb2Rlck9wdGlvbnM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkZW11eCBsaWJyYXJ5LCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcKKy8vIDhiaXRzIGZvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIERlbXV4IG9iamVjdAorCit0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgeworICBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SICAgID0gLTEsICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nLgorICBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSID0gIDAsICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2UgZnVsbCBoZWFkZXIuCisgIFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUiAgPSAgMSwgIC8vIEhlYWRlciBwYXJzaW5nIGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUuCisgIFdFQlBfREVNVVhfRE9ORSAgICAgICAgICAgPSAgMiAgIC8vIEVudGlyZSBmaWxlIGhhcyBiZWVuIHBhcnNlZC4KK30gV2ViUERlbXV4U3RhdGU7CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTiBXZWJQRGVtdXhlciogV2ViUERlbXV4SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqLCBpbnQsIFdlYlBEZW11eFN0YXRlKiwgaW50KTsKKworLy8gUGFyc2VzIHRoZSBmdWxsIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuIEZvciBzaW5nbGUgaW1hZ2VzIHRoZSBXZWJQIGZpbGUKKy8vIGhlYWRlciBhbG9uZSBvciB0aGUgZmlsZSBoZWFkZXIgYW5kIHRoZSBjaHVuayBoZWFkZXIgbWF5IGJlIGFic2VudC4KKy8vIFJldHVybnMgYSBXZWJQRGVtdXhlciBvYmplY3Qgb24gc3VjY2Vzc2Z1bCBwYXJzZSwgTlVMTCBvdGhlcndpc2UuCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUERlbXV4ZXIqIFdlYlBEZW11eChjb25zdCBXZWJQRGF0YSogZGF0YSkgeworICByZXR1cm4gV2ViUERlbXV4SW50ZXJuYWwoZGF0YSwgMCwgTlVMTCwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIFBhcnNlcyB0aGUgcG9zc2libHkgaW5jb21wbGV0ZSBXZWJQIGZpbGUgZ2l2ZW4gYnkgJ2RhdGEnLgorLy8gSWYgJ3N0YXRlJyBpcyBub24tTlVMTCBpdCB3aWxsIGJlIHNldCB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoZSBkZW11eGVyLgorLy8gUmV0dXJucyBOVUxMIGluIGNhc2Ugb2YgZXJyb3Igb3IgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgdG8gc3RhcnQgcGFyc2luZzsKKy8vIGFuZCBhIFdlYlBEZW11eGVyIG9iamVjdCBvbiBzdWNjZXNzZnVsIHBhcnNlLgorLy8gTm90ZSB0aGF0IFdlYlBEZW11eGVyIGtlZXBzIGludGVybmFsIHBvaW50ZXJzIHRvICdkYXRhJyBtZW1vcnkgc2VnbWVudC4KKy8vIElmIHRoaXMgZGF0YSBpcyB2b2xhdGlsZSwgdGhlIGRlbXV4ZXIgb2JqZWN0IHNob3VsZCBiZSBkZWxldGVkIChieSBjYWxsaW5nCisvLyBXZWJQRGVtdXhEZWxldGUoKSkgYW5kIFdlYlBEZW11eFBhcnRpYWwoKSBjYWxsZWQgYWdhaW4gb24gdGhlIG5ldyBkYXRhLgorLy8gVGhpcyBpcyB1c3VhbGx5IGFuIGluZXhwZW5zaXZlIG9wZXJhdGlvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQRGVtdXhlciogV2ViUERlbXV4UGFydGlhbCgKKyAgICBjb25zdCBXZWJQRGF0YSogZGF0YSwgV2ViUERlbXV4U3RhdGUqIHN0YXRlKSB7CisgIHJldHVybiBXZWJQRGVtdXhJbnRlcm5hbChkYXRhLCAxLCBzdGF0ZSwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIEZyZWVzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2RtdXgnLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YS9pbmZvcm1hdGlvbiBleHRyYWN0aW9uLgorCit0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgeworICBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgICAgICAvLyBiaXQtd2lzZSBjb21iaW5hdGlvbiBvZiBXZWJQRmVhdHVyZUZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlICdWUDhYJyBjaHVuayAoaWYgcHJlc2VudCkuCisgIFdFQlBfRkZfQ0FOVkFTX1dJRFRILAorICBXRUJQX0ZGX0NBTlZBU19IRUlHSFQsCisgIFdFQlBfRkZfTE9PUF9DT1VOVCwgICAgICAgIC8vIG9ubHkgcmVsZXZhbnQgZm9yIGFuaW1hdGVkIGZpbGUKKyAgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLCAgLy8gaWRlbS4KKyAgV0VCUF9GRl9GUkFNRV9DT1VOVCAgICAgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwcmVzZW50IGluIHRoZSBkZW11eCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBwYXJ0aWFsIGRlbXV4LCB0aGlzIGlzIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgZnJhbWVzIHNlZW4gc28gZmFyLCB3aXRoIHRoZSBsYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmx5IGJlaW5nIHBhcnRpYWwuCit9IFdlYlBGb3JtYXRGZWF0dXJlOworCisvLyBHZXQgdGhlICdmZWF0dXJlJyB2YWx1ZSBmcm9tIHRoZSAnZG11eCcuCisvLyBOT1RFOiB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgaWYgV2ViUERlbXV4KCkgd2FzIHVzZWQgb3IgV2ViUERlbXV4UGFydGlhbCgpCisvLyByZXR1cm5lZCBhIHN0YXRlID4gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUi4KKy8vIElmICdmZWF0dXJlJyBpcyBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgYml0LXdpc2UKKy8vIGNvbWJpbmF0aW9uIG9mIFdlYlBGZWF0dXJlRmxhZ3MgdmFsdWVzLgorLy8gSWYgJ2ZlYXR1cmUnIGlzIFdFQlBfRkZfTE9PUF9DT1VOVCwgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLCB0aGUgcmV0dXJuZWQKKy8vIHZhbHVlIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYml0c3RyZWFtIGlzIGFuaW1hdGVkLgorV0VCUF9FWFRFUk4gdWludDMyX3QgV2ViUERlbXV4R2V0SSgKKyAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGcmFtZSBpdGVyYXRpb24uCisKK3N0cnVjdCBXZWJQSXRlcmF0b3IgeworICBpbnQgZnJhbWVfbnVtOworICBpbnQgbnVtX2ZyYW1lczsgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBXRUJQX0ZGX0ZSQU1FX0NPVU5ULgorICBpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0OyAgLy8gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuCisgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAvLyBkaW1lbnNpb25zIG9mIHRoaXMgZnJhbWUuCisgIGludCBkdXJhdGlvbjsgICAgICAgICAgICAvLyBkaXNwbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kOyAgLy8gZGlzcG9zZSBtZXRob2QgZm9yIHRoZSBmcmFtZS4KKyAgaW50IGNvbXBsZXRlOyAgIC8vIHRydWUgaWYgJ2ZyYWdtZW50JyBjb250YWlucyBhIGZ1bGwgZnJhbWUuIHBhcnRpYWwgaW1hZ2VzCisgICAgICAgICAgICAgICAgICAvLyBtYXkgc3RpbGwgYmUgZGVjb2RlZCB3aXRoIHRoZSBXZWJQIGluY3JlbWVudGFsIGRlY29kZXIuCisgIFdlYlBEYXRhIGZyYWdtZW50OyAgLy8gVGhlIGZyYW1lIGdpdmVuIGJ5ICdmcmFtZV9udW0nLiBOb3RlIGZvciBoaXN0b3JpY2FsCisgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29ucyB0aGlzIGlzIGNhbGxlZCBhIGZyYWdtZW50LgorICBpbnQgaGFzX2FscGhhOyAgICAgIC8vIFRydWUgaWYgdGhlIGZyYW1lIGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KKyAgV2ViUE11eEFuaW1CbGVuZCBibGVuZF9tZXRob2Q7ICAvLyBCbGVuZCBvcGVyYXRpb24gZm9yIHRoZSBmcmFtZS4KKworICB1aW50MzJfdCBwYWRbMl07ICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlLgorICB2b2lkKiBwcml2YXRlXzsgICAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LgorfTsKKworLy8gUmV0cmlldmVzIGZyYW1lICdmcmFtZV9udW1iZXInIGZyb20gJ2RtdXgnLgorLy8gJ2l0ZXItPmZyYWdtZW50JyBwb2ludHMgdG8gdGhlIGZyYW1lIG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCisvLyBTZXR0aW5nICdmcmFtZV9udW1iZXInIGVxdWFsIHRvIDAgd2lsbCByZXR1cm4gdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGltYWdlLgorLy8gUmV0dXJucyBmYWxzZSBpZiAnZG11eCcgaXMgTlVMTCBvciBmcmFtZSAnZnJhbWVfbnVtYmVyJyBpcyBub3QgcHJlc2VudC4KKy8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgorLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mICdpdGVyJy4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lX251bWJlciwgV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+ZnJhbWVfbnVtJyArIDEpIG9yCisvLyBwcmV2aW91cyAoJ2l0ZXItPmZyYW1lX251bScgLSAxKSBmcmFtZS4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhOZXh0RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhQcmV2RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgorLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBEZW11eEdldENodW5rKCkgb24gdGhlIHNhbWUKKy8vIGl0ZXIuIEFsc28sIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKKy8vIFdlYlBEZW11eERlbGV0ZSgpLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGl0ZXJhdGlvbi4KKworc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIHsKKyAgLy8gVGhlIGN1cnJlbnQgYW5kIHRvdGFsIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZm91cmNjIGdpdmVuIHRvCisgIC8vIFdlYlBEZW11eEdldENodW5rKCkuCisgIGludCBjaHVua19udW07CisgIGludCBudW1fY2h1bmtzOworICBXZWJQRGF0YSBjaHVuazsgICAgLy8gVGhlIHBheWxvYWQgb2YgdGhlIGNodW5rLgorCisgIHVpbnQzMl90IHBhZFs2XTsgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdm9pZCogcHJpdmF0ZV87Cit9OworCisvLyBSZXRyaWV2ZXMgdGhlICdjaHVua19udW1iZXInIGluc3RhbmNlIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGZyb20KKy8vICdkbXV4Jy4KKy8vICdmb3VyY2MnIGlzIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bmsgdG8gcmV0dXJuLAorLy8gZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiwgZXRjLgorLy8gU2V0dGluZyAnY2h1bmtfbnVtYmVyJyBlcXVhbCB0byAwIHdpbGwgcmV0dXJuIHRoZSBsYXN0IGNodW5rIGluIGEgc2V0LgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaHVuayBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLiBJbWFnZSByZWxhdGVkIGNodW5rCisvLyBwYXlsb2FkcyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBXZWJQRGVtdXhHZXRGcmFtZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKy8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCisvLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGl0ZXJhdG9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+Y2h1bmsnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+Y2h1bmtfbnVtJyArIDEpIG9yIHByZXZpb3VzCisvLyAoJ2l0ZXItPmNodW5rX251bScgLSAxKSBjaHVuay4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhOZXh0Q2h1bmsoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpOworV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eFByZXZDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CisKKy8vIFJlbGVhc2VzIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdpdGVyJy4KKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKKy8vIFdlYlBEZW11eERlbGV0ZSgpLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcihXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQQW5pbURlY29kZXIgQVBJCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIGRlY29kaW5nIChwb3NzaWJseSkgYW5pbWF0ZWQgV2ViUCBpbWFnZXMuCisvLworLy8gQ29kZSBFeGFtcGxlOgorLyoKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyBkZWNfb3B0aW9uczsKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXQoJmRlY19vcHRpb25zKTsKKyAgLy8gVHVuZSAnZGVjX29wdGlvbnMnIGFzIG5lZWRlZC4KKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWMgPSBXZWJQQW5pbURlY29kZXJOZXcod2VicF9kYXRhLCAmZGVjX29wdGlvbnMpOworICBXZWJQQW5pbUluZm8gYW5pbV9pbmZvOworICBXZWJQQW5pbURlY29kZXJHZXRJbmZvKGRlYywgJmFuaW1faW5mbyk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhbmltX2luZm8ubG9vcF9jb3VudDsgKytpKSB7CisgICAgd2hpbGUgKFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoZGVjKSkgeworICAgICAgdWludDhfdCogYnVmOworICAgICAgaW50IHRpbWVzdGFtcDsKKyAgICAgIFdlYlBBbmltRGVjb2RlckdldE5leHQoZGVjLCAmYnVmLCAmdGltZXN0YW1wKTsKKyAgICAgIC8vIC4uLiAoUmVuZGVyICdidWYnIGJhc2VkIG9uICd0aW1lc3RhbXAnKS4KKyAgICAgIC8vIC4uLiAoRG8gTk9UIGZyZWUgJ2J1ZicsIGFzIGl0IGlzIG93bmVkIGJ5ICdkZWMnKS4KKyAgICB9CisgICAgV2ViUEFuaW1EZWNvZGVyUmVzZXQoZGVjKTsKKyAgfQorICBjb25zdCBXZWJQRGVtdXhlciogZGVtdXhlciA9IFdlYlBBbmltRGVjb2RlckdldERlbXV4ZXIoZGVjKTsKKyAgLy8gLi4uIChEbyBzb21ldGhpbmcgdXNpbmcgJ2RlbXV4ZXInOyBlLmcuIGdldCBFWElGL1hNUC9JQ0MgZGF0YSkuCisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworKi8KKwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyIFdlYlBBbmltRGVjb2RlcjsgIC8vIE1haW4gb3BhcXVlIG9iamVjdC4KKworLy8gR2xvYmFsIG9wdGlvbnMuCitzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyB7CisgIC8vIE91dHB1dCBjb2xvcnNwYWNlLiBPbmx5IHRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIHN1cHBvcnRlZDoKKyAgLy8gTU9ERV9SR0JBLCBNT0RFX0JHUkEsIE1PREVfcmdiQSBhbmQgTU9ERV9iZ3JBLgorICBXRUJQX0NTUF9NT0RFIGNvbG9yX21vZGU7CisgIGludCB1c2VfdGhyZWFkczsgICAgICAgICAgIC8vIElmIHRydWUsIHVzZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZy4KKyAgdWludDMyX3QgcGFkZGluZ1s3XTsgICAgICAgLy8gUGFkZGluZyBmb3IgbGF0ZXIgdXNlLgorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbCgKKyAgICBXZWJQQW5pbURlY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQsIHRvIGluaXRpYWxpemUgYSBmcmVzaCBXZWJQQW5pbURlY29kZXJPcHRpb25zCisvLyBzdHJ1Y3R1cmUgYmVmb3JlIG1vZGlmaWNhdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guCisvLyBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdCgpIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZQorLy8gJ2RlY19vcHRpb25zJyBvYmplY3QuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBBbmltRGVjb2Rlck9wdGlvbnNJbml0KAorICAgIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGRlY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdEludGVybmFsKGRlY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBXZWJQQW5pbURlY29kZXIqIFdlYlBBbmltRGVjb2Rlck5ld0ludGVybmFsKAorICAgIGNvbnN0IFdlYlBEYXRhKiwgY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyosIGludCk7CisKKy8vIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgV2ViUEFuaW1EZWNvZGVyIG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHdlYnBfZGF0YSAtIChpbikgV2ViUCBiaXRzdHJlYW0uIFRoaXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgV2ViUEFuaW1EZWNvZGVyIG9iamVjdC4KKy8vICAgZGVjX29wdGlvbnMgLSAoaW4pIGRlY29kaW5nIG9wdGlvbnMuIENhbiBiZSBwYXNzZWQgTlVMTCB0byBjaG9vc2UKKy8vICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmFibGUgZGVmYXVsdHMgKGluIHBhcnRpY3VsYXIsIGNvbG9yIG1vZGUgTU9ERV9SR0JBCisvLyAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBpY2tlZCkuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgV2ViUEFuaW1EZWNvZGVyIG9iamVjdCwgb3IgTlVMTCBpbiBjYXNlIG9mCisvLyAgIHBhcnNpbmcgZXJyb3IsIGludmFsaWQgb3B0aW9uIG9yIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQQW5pbURlY29kZXIqIFdlYlBBbmltRGVjb2Rlck5ldygKKyAgICBjb25zdCBXZWJQRGF0YSogd2VicF9kYXRhLCBjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucykgeworICByZXR1cm4gV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwod2VicF9kYXRhLCBkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBHbG9iYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFuaW1hdGlvbi4uCitzdHJ1Y3QgV2ViUEFuaW1JbmZvIHsKKyAgdWludDMyX3QgY2FudmFzX3dpZHRoOworICB1aW50MzJfdCBjYW52YXNfaGVpZ2h0OworICB1aW50MzJfdCBsb29wX2NvdW50OworICB1aW50MzJfdCBiZ2NvbG9yOworICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgdWludDMyX3QgcGFkWzRdOyAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gR2V0IGdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYW5pbWF0aW9uLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluKSBkZWNvZGVyIGluc3RhbmNlIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tLgorLy8gICBpbmZvIC0gKG91dCkgZ2xvYmFsIGluZm9ybWF0aW9uIGZldGNoZWQgZnJvbSB0aGUgYW5pbWF0aW9uLgorLy8gUmV0dXJuczoKKy8vICAgVHJ1ZSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRGVjb2RlckdldEluZm8oY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQW5pbUluZm8qIGluZm8pOworCisvLyBGZXRjaCB0aGUgbmV4dCBmcmFtZSBmcm9tICdkZWMnIGJhc2VkIG9uIG9wdGlvbnMgc3VwcGxpZWQgdG8KKy8vIFdlYlBBbmltRGVjb2Rlck5ldygpLiBUaGlzIHdpbGwgYmUgYSBmdWxseSByZWNvbnN0cnVjdGVkIGNhbnZhcyBvZiBzaXplCisvLyAnY2FudmFzX3dpZHRoICogNCAqIGNhbnZhc19oZWlnaHQnLCBhbmQgbm90IGp1c3QgdGhlIGZyYW1lIHN1Yi1yZWN0YW5nbGUuIFRoZQorLy8gcmV0dXJuZWQgYnVmZmVyICdidWYnIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1EZWNvZGVyR2V0TmV4dCgpLCBXZWJQQW5pbURlY29kZXJSZXNldCgpIG9yIFdlYlBBbmltRGVjb2RlckRlbGV0ZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluL291dCkgZGVjb2RlciBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoZSBuZXh0IGZyYW1lIGlzIHRvIGJlIGZldGNoZWQuCisvLyAgIGJ1ZiAtIChvdXQpIGRlY29kZWQgZnJhbWUuCisvLyAgIHRpbWVzdGFtcCAtIChvdXQpIHRpbWVzdGFtcCBvZiB0aGUgZnJhbWUgaW4gbWlsbGlzZWNvbmRzLgorLy8gUmV0dXJuczoKKy8vICAgRmFsc2UgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgYXJlIE5VTEwsIG9yIGlmIHRoZXJlIGlzIGEgcGFyc2luZyBvcgorLy8gICBkZWNvZGluZyBlcnJvciwgb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzLiBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbURlY29kZXJHZXROZXh0KFdlYlBBbmltRGVjb2RlciogZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGJ1ZiwgaW50KiB0aW1lc3RhbXApOworCisvLyBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgbGVmdCB0byBkZWNvZGUuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgdG8gYmUgY2hlY2tlZC4KKy8vIFJldHVybnM6CisvLyAgIFRydWUgaWYgJ2RlYycgaXMgbm90IE5VTEwgYW5kIHNvbWUgZnJhbWVzIGFyZSB5ZXQgdG8gYmUgZGVjb2RlZC4KKy8vICAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMpOworCisvLyBSZXNldHMgdGhlIFdlYlBBbmltRGVjb2RlciBvYmplY3QsIHNvIHRoYXQgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbURlY29kZXJHZXROZXh0KCkgd2lsbCByZXN0YXJ0IGRlY29kaW5nIGZyb20gMXN0IGZyYW1lLiBUaGlzIHdvdWxkIGJlCisvLyBoZWxwZnVsIHdoZW4gYWxsIGZyYW1lcyBuZWVkIHRvIGJlIGRlY29kZWQgbXVsdGlwbGUgdGltZXMgKGUuZy4KKy8vIGluZm8ubG9vcF9jb3VudCB0aW1lcykgd2l0aG91dCBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSAnZGVjJyBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIHRvIGJlIHJlc2V0CitXRUJQX0VYVEVSTiB2b2lkIFdlYlBBbmltRGVjb2RlclJlc2V0KFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworLy8gR3JhYiB0aGUgaW50ZXJuYWwgZGVtdXhlciBvYmplY3QuCisvLyBHZXR0aW5nIHRoZSBkZW11eGVyIG9iamVjdCBjYW4gYmUgdXNlZnVsIGlmIG9uZSB3YW50cyB0byB1c2Ugb3BlcmF0aW9ucyBvbmx5CisvLyBhdmFpbGFibGUgdGhyb3VnaCBkZW11eGVyOyBlLmcuIHRvIGdldCBYTVAvRVhJRi9JQ0MgbWV0YWRhdGEuIFRoZSByZXR1cm5lZAorLy8gZGVtdXhlciBvYmplY3QgaXMgb3duZWQgYnkgJ2RlYycgYW5kIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1EZWNvZGVyRGVsZXRlKCkuCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluKSBkZWNvZGVyIGluc3RhbmNlIGZyb20gd2hpY2ggdGhlIGRlbXV4ZXIgb2JqZWN0IGlzIHRvIGJlIGZldGNoZWQuCitXRUJQX0VYVEVSTiBjb25zdCBXZWJQRGVtdXhlciogV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcigKKyAgICBjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYyk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBBbmltRGVjb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIHRvIGJlIGRlbGV0ZWQKK1dFQlBfRVhURVJOIHZvaWQgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfV0VCUF9ERU1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9lbmNvZGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2VuY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZW5jb2RlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2VuY29kZS5oCmluZGV4IDQ3ZDlkOTEuLjdlYzM1NDMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZW5jb2RlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZW5jb2RlLmgKQEAgLTE2LDExICsxNiwxMSBAQAogCiAjaW5jbHVkZSAiLi90eXBlcy5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jZGVmaW5lIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTiAweDAyMDEgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCisjZGVmaW5lIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTiAweDAyMGUgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCiAKIC8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCiAvLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgpAQCAtMzUsNDUgKzM1LDQ4IEBACiAKIC8vIFJldHVybiB0aGUgZW5jb2RlcidzIHZlcnNpb24gbnVtYmVyLCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcgOGJpdHMgZm9yCiAvLyBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldEVuY29kZXJWZXJzaW9uKHZvaWQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRFbmNvZGVyVmVyc2lvbih2b2lkKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE9uZS1zdG9wLXNob3AgY2FsbCEgTm8gcXVlc3Rpb25zIGFza2VkOgogCiAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKHBvaW50ZWQgdG8gYnkgKm91dHB1dCksIG9yIDAgaWYKIC8vIGFuIGVycm9yIG9jY3VycmVkLiBUaGUgY29tcHJlc3NlZCBkYXRhIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIGNhbGxlcgotLy8gdXNpbmcgdGhlIGNhbGwgJ1NiTWVtb3J5RGVhbGxvY2F0ZSgqb3V0cHV0KScuCisvLyB1c2luZyB0aGUgY2FsbCAnV2ViUEZyZWUoKm91dHB1dCknLgogLy8gVGhlc2UgZnVuY3Rpb25zIGNvbXByZXNzIHVzaW5nIHRoZSBsb3NzeSBmb3JtYXQsIGFuZCB0aGUgcXVhbGl0eV9mYWN0b3IKIC8vIGNhbiBnbyBmcm9tIDAgKHNtYWxsZXIgb3V0cHV0LCBsb3dlciBxdWFsaXR5KSB0byAxMDAgKGJlc3QgcXVhbGl0eSwKIC8vIGxhcmdlciBvdXRwdXQpLgotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVCR1IoY29uc3QgdWludDhfdCogYmdyLAorV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZVJHQkEoY29uc3QgdWludDhfdCogcmdiYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwogCiAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBhYm92ZSwgYnV0IGNvbXByZXNzaW5nIGluIGEKIC8vIGxvc3NsZXNzIG1hbm5lci4gRmlsZXMgYXJlIHVzdWFsbHkgbGFyZ2VyIHRoYW4gbG9zc3kgZm9ybWF0LCBidXQgd2lsbAogLy8gbm90IHN1ZmZlciBhbnkgY29tcHJlc3Npb24gbG9zcy4KLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NSR0IoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc0JHUihjb25zdCB1aW50OF90KiBiZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTiBzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc0JHUihjb25zdCB1aW50OF90KiBiZ3IsCitXRUJQX0VYVEVSTiBzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEoY29uc3QgdWludDhfdCogcmdiYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoY29uc3QgdWludDhfdCogYmdyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKKy8vIFJlbGVhc2VzIG1lbW9yeSByZXR1cm5lZCBieSB0aGUgV2ViUEVuY29kZSooKSBmdW5jdGlvbnMgYWJvdmUuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBGcmVlKHZvaWQqIHB0cik7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBDb2RpbmcgcGFyYW1ldGVycwpAQCAtOTAsMTIgKzkzLDE1IEBACiAvLyBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgogc3RydWN0IFdlYlBDb25maWcgewogICBpbnQgbG9zc2xlc3M7ICAgICAgICAgICAvLyBMb3NzbGVzcyBlbmNvZGluZyAoMD1sb3NzeShkZWZhdWx0KSwgMT1sb3NzbGVzcykuCi0gIGZsb2F0IHF1YWxpdHk7ICAgICAgICAgIC8vIGJldHdlZW4gMCAoc21hbGxlc3QgZmlsZSkgYW5kIDEwMCAoYmlnZ2VzdCkKKyAgZmxvYXQgcXVhbGl0eTsgICAgICAgICAgLy8gYmV0d2VlbiAwIGFuZCAxMDAuIEZvciBsb3NzeSwgMCBnaXZlcyB0aGUgc21hbGxlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhbmQgMTAwIHRoZSBsYXJnZXN0LiBGb3IgbG9zc2xlc3MsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGlzIHRoZSBhbW91bnQgb2YgZWZmb3J0IHB1dCBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wcmVzc2lvbjogMCBpcyB0aGUgZmFzdGVzdCBidXQgZ2l2ZXMgbGFyZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGVzIGNvbXBhcmVkIHRvIHRoZSBzbG93ZXN0LCBidXQgYmVzdCwgMTAwLgogICBpbnQgbWV0aG9kOyAgICAgICAgICAgICAvLyBxdWFsaXR5L3NwZWVkIHRyYWRlLW9mZiAoMD1mYXN0LCA2PXNsb3dlci1iZXR0ZXIpCiAKICAgV2ViUEltYWdlSGludCBpbWFnZV9oaW50OyAgLy8gSGludCBmb3IgaW1hZ2UgdHlwZSAobG9zc2xlc3Mgb25seSBmb3Igbm93KS4KIAotICAvLyBQYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gbG9zc3kgY29tcHJlc3Npb24gb25seToKICAgaW50IHRhcmdldF9zaXplOyAgICAgICAgLy8gaWYgbm9uLXplcm8sIHNldCB0aGUgZGVzaXJlZCB0YXJnZXQgc2l6ZSBpbiBieXRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSAnY29tcHJlc3Npb24nIHBhcmFtZXRlci4KICAgZmxvYXQgdGFyZ2V0X1BTTlI7ICAgICAgLy8gaWYgbm9uLXplcm8sIHNwZWNpZmllcyB0aGUgbWluaW1hbCBkaXN0b3J0aW9uIHRvCkBAIC0xMTcsNyArMTIzLDggQEAKIAogICBpbnQgc2hvd19jb21wcmVzc2VkOyAgICAvLyBpZiB0cnVlLCBleHBvcnQgdGhlIGNvbXByZXNzZWQgcGljdHVyZSBiYWNrLgogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbi1sb29wIGZpbHRlcmluZyBpcyBub3QgYXBwbGllZC4KLSAgaW50IHByZXByb2Nlc3Npbmc7ICAgICAgLy8gcHJlcHJvY2Vzc2luZyBmaWx0ZXIgKDA9bm9uZSwgMT1zZWdtZW50LXNtb290aCkKKyAgaW50IHByZXByb2Nlc3Npbmc7ICAgICAgLy8gcHJlcHJvY2Vzc2luZyBmaWx0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA9bm9uZSwgMT1zZWdtZW50LXNtb290aCwgMj1wc2V1ZG8tcmFuZG9tIGRpdGhlcmluZwogICBpbnQgcGFydGl0aW9uczsgICAgICAgICAvLyBsb2cyKG51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zKSBpbiBbMC4uM10uIERlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2V0IHRvIDAgZm9yIGVhc2llciBwcm9ncmVzc2l2ZSBkZWNvZGluZy4KICAgaW50IHBhcnRpdGlvbl9saW1pdDsgICAgLy8gcXVhbGl0eSBkZWdyYWRhdGlvbiBhbGxvd2VkIHRvIGZpdCB0aGUgNTEyayBsaW1pdApAQCAtMTMwLDcgKzEzNywxNyBAQAogICBpbnQgdGhyZWFkX2xldmVsOyAgICAgICAvLyBJZiBub24temVybywgdHJ5IGFuZCB1c2UgbXVsdGktdGhyZWFkZWQgZW5jb2RpbmcuCiAgIGludCBsb3dfbWVtb3J5OyAgICAgICAgIC8vIElmIHNldCwgcmVkdWNlIG1lbW9yeSB1c2FnZSAoYnV0IGluY3JlYXNlIENQVSB1c2UpLgogCi0gIHVpbnQzMl90IHBhZFs1XTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorICBpbnQgbmVhcl9sb3NzbGVzczsgICAgICAvLyBOZWFyIGxvc3NsZXNzIGVuY29kaW5nIFswID0gbWF4IGxvc3MgLi4gMTAwID0gb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZWZhdWx0KV0uCisgIGludCBleGFjdDsgICAgICAgICAgICAgIC8vIGlmIG5vbi16ZXJvLCBwcmVzZXJ2ZSB0aGUgZXhhY3QgUkdCIHZhbHVlcyB1bmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc3BhcmVudCBhcmVhLiBPdGhlcndpc2UsIGRpc2NhcmQgdGhpcyBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkdCIGluZm9ybWF0aW9uIGZvciBiZXR0ZXIgY29tcHJlc3Npb24uIFRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIDAuCisKKyAgaW50IHVzZV9kZWx0YV9wYWxldHRlOyAgLy8gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBsb3NzbGVzcyBmZWF0dXJlCisgIGludCB1c2Vfc2hhcnBfeXV2OyAgICAgIC8vIGlmIG5lZWRlZCwgdXNlIHNoYXJwIChhbmQgc2xvdykgUkdCLT5ZVVYgY29udmVyc2lvbgorCisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogfTsKIAogLy8gRW51bWVyYXRlIHNvbWUgcHJlZGVmaW5lZCBzZXR0aW5ncyBmb3IgV2ViUENvbmZpZywgZGVwZW5kaW5nIG9uIHRoZSB0eXBlCkBAIC0xNDUsNyArMTYyLDcgQEAKIH0gV2ViUFByZXNldDsKIAogLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKGludCkgV2ViUENvbmZpZ0luaXRJbnRlcm5hbChXZWJQQ29uZmlnKiwgV2ViUFByZXNldCwgZmxvYXQsIGludCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUENvbmZpZ0luaXRJbnRlcm5hbChXZWJQQ29uZmlnKiwgV2ViUFByZXNldCwgZmxvYXQsIGludCk7CiAKIC8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIGEgZnJlc2ggV2ViUENvbmZpZyBzdHJ1Y3R1cmUgYmVmb3JlCiAvLyBtb2RpZmljYXRpb24uIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoLiBXZWJQQ29uZmlnSW5pdCgpCkBAIC0xNjYsMTMgKzE4MywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pOwogfQogCisvLyBBY3RpdmF0ZSB0aGUgbG9zc2xlc3MgY29tcHJlc3Npb24gbW9kZSB3aXRoIHRoZSBkZXNpcmVkIGVmZmljaWVuY3kgbGV2ZWwKKy8vIGJldHdlZW4gMCAoZmFzdGVzdCwgbG93ZXN0IGNvbXByZXNzaW9uKSBhbmQgOSAoc2xvd2VyLCBiZXN0IGNvbXByZXNzaW9uKS4KKy8vIEEgZ29vZCBkZWZhdWx0IGxldmVsIGlzICc2JywgcHJvdmlkaW5nIGEgZmFpciB0cmFkZW9mZiBiZXR3ZWVuIGNvbXByZXNzaW9uCisvLyBzcGVlZCBhbmQgZmluYWwgY29tcHJlc3NlZCBzaXplLgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBzZXZlcmFsIGZpZWxkcyBmcm9tIGNvbmZpZzogJ21ldGhvZCcsICdxdWFsaXR5JworLy8gYW5kICdsb3NzbGVzcycuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBwYXJhbWV0ZXIgZXJyb3IuCitXRUJQX0VYVEVSTiBpbnQgV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KFdlYlBDb25maWcqIGNvbmZpZywgaW50IGxldmVsKTsKKwogLy8gUmV0dXJucyB0cnVlIGlmICdjb25maWcnIGlzIG5vbi1OVUxMIGFuZCBhbGwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZQogLy8gd2l0aGluIHRoZWlyIHZhbGlkIHJhbmdlcy4KLVdFQlBfRVhURVJOKGludCkgV2ViUFZhbGlkYXRlQ29uZmlnKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZyk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFZhbGlkYXRlQ29uZmlnKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZyk7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBJbnB1dCAvIE91dHB1dAotLy8gU3RydWN0dXJlIGZvciBzdG9yaW5nIGF1eGlsaWFyeSBzdGF0aXN0aWNzIChtb3N0bHkgZm9yIGxvc3N5IGVuY29kaW5nKS4KKy8vIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBhdXhpbGlhcnkgc3RhdGlzdGljcy4KIAogc3RydWN0IFdlYlBBdXhTdGF0cyB7CiAgIGludCBjb2RlZF9zaXplOyAgICAgICAgIC8vIGZpbmFsIHNpemUKQEAgLTE5OCw4ICsyMjMsMTAgQEAKICAgaW50IGNhY2hlX2JpdHM7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYml0cyBmb3IgY29sb3IgY2FjaGUgbG9va3VwCiAgIGludCBwYWxldHRlX3NpemU7ICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbG9yIGluIHBhbGV0dGUsIGlmIHVzZWQKICAgaW50IGxvc3NsZXNzX3NpemU7ICAgICAgICAgICAvLyBmaW5hbCBsb3NzbGVzcyBzaXplCisgIGludCBsb3NzbGVzc19oZHJfc2l6ZTsgICAgICAgLy8gbG9zc2xlc3MgaGVhZGVyICh0cmFuc2Zvcm0sIGh1ZmZtYW4gZXRjKSBzaXplCisgIGludCBsb3NzbGVzc19kYXRhX3NpemU7ICAgICAgLy8gbG9zc2xlc3MgaW1hZ2UgZGF0YSBzaXplCiAKLSAgdWludDMyX3QgcGFkWzRdOyAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogfTsKIAogLy8gU2lnbmF0dXJlIGZvciBvdXRwdXQgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiB3cml0aW5nIHdhcyBzdWNjZXNzZnVsLgpAQCAtMjE4LDEzICsyNDUsMTYgQEAKIH07CiAKIC8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIGFueSB1c2UuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQTWVtb3J5V3JpdGVySW5pdChXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpOworV0VCUF9FWFRFUk4gdm9pZCBXZWJQTWVtb3J5V3JpdGVySW5pdChXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpOwogCisvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgY2FsbGVkIHRvIGRlYWxsb2NhdGUgd3JpdGVyLT5tZW0gbWVtb3J5LiBUaGUgJ3dyaXRlcicKKy8vIG9iamVjdCBpdHNlbGYgaXMgbm90IGRlYWxsb2NhdGVkLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKTsKIC8vIFRoZSBjdXN0b20gd3JpdGVyIHRvIGJlIHVzZWQgd2l0aCBXZWJQTWVtb3J5V3JpdGVyIGFzIGN1c3RvbV9wdHIuIFVwb24KIC8vIGNvbXBsZXRpb24sIHdyaXRlci5tZW0gYW5kIHdyaXRlci5zaXplIHdpbGwgaG9sZCB0aGUgY29kZWQgZGF0YS4KLS8vIHdyaXRlci5tZW0gbXVzdCBiZSBmcmVlZCB1c2luZyB0aGUgY2FsbCAnU2JNZW1vcnlEZWFsbG9jYXRlKHdyaXRlci5tZW0pJy4KLVdFQlBfRVhURVJOKGludCkgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisvLyB3cml0ZXIubWVtIG11c3QgYmUgZnJlZWQgYnkgY2FsbGluZyBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIuCitXRUJQX0VYVEVSTiBpbnQgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAogLy8gUHJvZ3Jlc3MgaG9vaywgY2FsbGVkIGZyb20gdGltZSB0byB0aW1lIHRvIHJlcG9ydCBwcm9ncmVzcy4gSXQgY2FuIHJldHVybgogLy8gZmFsc2UgdG8gcmVxdWVzdCBhbiBhYm9ydCBvZiB0aGUgZW5jb2RpbmcgcHJvY2Vzcywgb3IgdHJ1ZSBvdGhlcndpc2UgaWYKQEAgLTIzNCwxNiArMjY0LDkgQEAKIC8vIENvbG9yIHNwYWNlcy4KIHR5cGVkZWYgZW51bSBXZWJQRW5jQ1NQIHsKICAgLy8gY2hyb21hIHNhbXBsaW5nCi0gIFdFQlBfWVVWNDIwID0gMCwgICAvLyA0OjI6MAotICBXRUJQX1lVVjQyMiA9IDEsICAgLy8gNDoyOjIKLSAgV0VCUF9ZVVY0NDQgPSAyLCAgIC8vIDQ6NDo0Ci0gIFdFQlBfWVVWNDAwID0gMywgICAvLyBncmF5c2NhbGUKLSAgV0VCUF9DU1BfVVZfTUFTSyA9IDMsICAgLy8gYml0LW1hc2sgdG8gZ2V0IHRoZSBVViBzYW1wbGluZyBmYWN0b3JzCi0gIC8vIGFscGhhIGNoYW5uZWwgdmFyaWFudHMKLSAgV0VCUF9ZVVY0MjBBID0gNCwKLSAgV0VCUF9ZVVY0MjJBID0gNSwKLSAgV0VCUF9ZVVY0NDRBID0gNiwKLSAgV0VCUF9ZVVY0MDBBID0gNywgICAvLyBncmF5c2NhbGUgKyBhbHBoYQorICBXRUJQX1lVVjQyMCAgPSAwLCAgICAgICAgLy8gNDoyOjAKKyAgV0VCUF9ZVVY0MjBBID0gNCwgICAgICAgIC8vIGFscGhhIGNoYW5uZWwgdmFyaWFudAorICBXRUJQX0NTUF9VVl9NQVNLID0gMywgICAgLy8gYml0LW1hc2sgdG8gZ2V0IHRoZSBVViBzYW1wbGluZyBmYWN0b3JzCiAgIFdFQlBfQ1NQX0FMUEhBX0JJVCA9IDQgICAvLyBiaXQgdGhhdCBpcyBzZXQgaWYgYWxwaGEgaXMgcHJlc2VudAogfSBXZWJQRW5jQ1NQOwogCkBAIC0zMjIsMjEgKzM0NSwxOSBAQAogCiAgIHVpbnQzMl90IHBhZDNbM107ICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogCi0gIC8vIFVudXNlZCBmb3Igbm93OiBvcmlnaW5hbCBzYW1wbGVzIChmb3Igbm9uLVlVVjQyMCBtb2RlcykKLSAgdWludDhfdCAqdTAsICp2MDsKLSAgaW50IHV2MF9zdHJpZGU7Ci0KLSAgdWludDMyX3QgcGFkNFs3XTsgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisgIC8vIFVudXNlZCBmb3Igbm93CisgIHVpbnQ4X3QgKnBhZDQsICpwYWQ1OworICB1aW50MzJfdCBwYWQ2WzhdOyAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKIAogICAvLyBQUklWQVRFIEZJRUxEUwogICAvLy8vLy8vLy8vLy8vLy8vLy8vLwogICB2b2lkKiBtZW1vcnlfOyAgICAgICAgICAvLyByb3cgY2h1bmsgb2YgbWVtb3J5IGZvciB5dXZhIHBsYW5lcwogICB2b2lkKiBtZW1vcnlfYXJnYl87ICAgICAvLyBhbmQgZm9yIGFyZ2IgdG9vLgotICB2b2lkKiBwYWQ1WzJdOyAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdm9pZCogcGFkN1syXTsgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiB9OwogCiAvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSosIGludCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwoV2ViUFBpY3R1cmUqLCBpbnQpOwogCiAvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlLiBSZXR1cm5zIGZhbHNlIGluIGNhc2UKIC8vIG9mIHZlcnNpb24gbWlzbWF0Y2guIFdlYlBQaWN0dXJlSW5pdCgpIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZQpAQCAtMzUzLDI2ICszNzQsNDEgQEAKIC8vIEFsbG9jYXRlIHkvdS92IGJ1ZmZlcnMgYXMgcGVyIGNvbG9yc3BhY2Uvd2lkdGgvaGVpZ2h0IHNwZWNpZmljYXRpb24uCiAvLyBOb3RlISBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSB0aGUgcHJldmlvdXMgYnVmZmVyIGlmIG5lZWRlZC4KIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlQWxsb2MoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQWxsb2MoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBSZWxlYXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFdlYlBQaWN0dXJlQWxsb2MoKSBvciBXZWJQUGljdHVyZUltcG9ydCooKS4KIC8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgX25vdF8gZnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlICdwaWN0dXJlJwogLy8gb2JqZWN0IGl0c2VsZi4KIC8vIEJlc2lkZXMgbWVtb3J5ICh3aGljaCBpcyByZWNsYWltZWQpIGFsbCBvdGhlciBmaWVsZHMgb2YgJ3BpY3R1cmUnIGFyZQogLy8gcHJlc2VydmVkLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUFBpY3R1cmVGcmVlKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKK1dFQlBfRVhURVJOIHZvaWQgV2ViUFBpY3R1cmVGcmVlKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAogLy8gQ29weSB0aGUgcGl4ZWxzIG9mICpzcmMgaW50byAqZHN0LCB1c2luZyBXZWJQUGljdHVyZUFsbG9jLiBVcG9uIHJldHVybiwgKmRzdAogLy8gd2lsbCBmdWxseSBvd24gdGhlIGNvcGllZCBwaXhlbHMgKHRoaXMgaXMgbm90IGEgdmlldykuIFRoZSAnZHN0JyBwaWN0dXJlIG5lZWQKIC8vIG5vdCBiZSBpbml0aWFsaXplZCBhcyBpdHMgY29udGVudCBpcyBvdmVyd3JpdHRlbi4KIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KTsKIAotLy8gQ29tcHV0ZSBQU05SLCBTU0lNIG9yIExTSU0gZGlzdG9ydGlvbiBtZXRyaWMgYmV0d2VlbiB0d28gcGljdHVyZXMuCi0vLyBSZXN1bHQgaXMgaW4gZEIsIHN0b3JlcyBpbiByZXN1bHRbXSBpbiB0aGUgWS9VL1YvQWxwaGEvQWxsIG9yZGVyLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChzcmMgYW5kIHJlZiBkb24ndCBoYXZlIHNhbWUgZGltZW5zaW9uLCAuLi4pCisvLyBDb21wdXRlIHRoZSBzaW5nbGUgZGlzdG9ydGlvbiBmb3IgcGFja2VkIHBsYW5lcyBvZiBzYW1wbGVzLgorLy8gJ3NyYycgd2lsbCBiZSBjb21wYXJlZCB0byAncmVmJywgYW5kIHRoZSByYXcgZGlzdG9ydGlvbiBzdG9yZWQgaW50bworLy8gJypkaXN0b3J0aW9uJy4gVGhlIHJlZmluZWQgbWV0cmljIChsb2coTVNFKSwgbG9nKDEgLSBzc2ltKSwuLi4nIHdpbGwgYmUKKy8vIHN0b3JlZCBpbiAnKnJlc3VsdCcuCisvLyAneF9zdGVwJyBpcyB0aGUgaG9yaXpvbnRhbCBzdHJpZGUgKGluIGJ5dGVzKSBiZXR3ZWVuIHNhbXBsZXMuCisvLyAnc3JjL3JlZl9zdHJpZGUnIGlzIHRoZSBieXRlIGRpc3RhbmNlIGJldHdlZW4gcm93cy4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoYmFkIHBhcmFtZXRlciwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IsIC4uLikuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBsYW5lRGlzdG9ydGlvbihjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBzaXplX3QgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgICAvLyAwID0gUFNOUiwgMSA9IFNTSU0sIDIgPSBMU0lNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGlzdG9ydGlvbiwgZmxvYXQqIHJlc3VsdCk7CisKKy8vIENvbXB1dGUgUFNOUiwgU1NJTSBvciBMU0lNIGRpc3RvcnRpb24gbWV0cmljIGJldHdlZW4gdHdvIHBpY3R1cmVzLiBSZXN1bHRzCisvLyBhcmUgaW4gZEIsIHN0b3JlZCBpbiByZXN1bHRbXSBpbiB0aGUgQi9HL1IvQS9BbGwgb3JkZXIuIFRoZSBkaXN0b3J0aW9uIGlzCisvLyBhbHdheXMgcGVyZm9ybWVkIHVzaW5nIEFSR0Igc2FtcGxlcy4gSGVuY2UgaWYgdGhlIGlucHV0IGlzIFlVVihBKSwgdGhlCisvLyBwaWN0dXJlIHdpbGwgYmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG8gQVJHQiAoanVzdCBmb3IgdGhlIG1lYXN1cmVtZW50KS4KIC8vIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gaXMgcmF0aGVyIENQVS1pbnRlbnNpdmUuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlRGlzdG9ydGlvbigKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZURpc3RvcnRpb24oCiAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgY29uc3QgV2ViUFBpY3R1cmUqIHJlZiwKICAgICBpbnQgbWV0cmljX3R5cGUsICAgICAgICAgICAvLyAwID0gUFNOUiwgMSA9IFNTSU0sIDIgPSBMU0lNCiAgICAgZmxvYXQgcmVzdWx0WzVdKTsKQEAgLTM4NSw4ICs0MjEsOCBAQAogLy8gbXVzdCBiZSBmdWxseSBiZSBjb21wcmlzZWQgaW5zaWRlIHRoZSAnc3JjJyBzb3VyY2UgcGljdHVyZS4gSWYgdGhlIHNvdXJjZQogLy8gcGljdHVyZSB1c2VzIHRoZSBZVVY0MjAgY29sb3JzcGFjZSwgdGhlIHRvcCBhbmQgbGVmdCBjb29yZGluYXRlcyB3aWxsIGJlCiAvLyBzbmFwcGVkIHRvIGV2ZW4gdmFsdWVzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAvLyBFeHRyYWN0cyBhIHZpZXcgZnJvbSAnc3JjJyBwaWN0dXJlIGludG8gJ2RzdCcuIFRoZSByZWN0YW5nbGUgZm9yIHRoZSB2aWV3CiAvLyBpcyBkZWZpbmVkIGJ5IHRoZSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgY29vcmRpbmF0ZXMgKGxlZnQsIHRvcCkgYXMgd2VsbApAQCAtMzk5LDY3ICs0MzUsOTEgQEAKIC8vIHdpdGggV2ViUFBpY3R1cmVJbml0KCkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gJ3NyYycsIHNpbmNlIGl0cyBjb250ZW50IHdpbGwKIC8vIGJlIG92ZXJ3cml0dGVuLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIG9yIGludmFsaWQgcGFyYW1ldGVycy4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpOwogCiAvLyBSZXR1cm5zIHRydWUgaWYgdGhlICdwaWN0dXJlJyBpcyBhY3R1YWxseSBhIHZpZXcgYW5kIHRoZXJlZm9yZSBkb2VzCiAvLyBub3Qgb3duIHRoZSBtZW1vcnkgZm9yIHBpeGVscy4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSXNWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAogLy8gUmVzY2FsZSBhIHBpY3R1cmUgdG8gbmV3IGRpbWVuc2lvbiB3aWR0aCB4IGhlaWdodC4KLS8vIE5vdyBnYW1tYSBjb3JyZWN0aW9uIGlzIGFwcGxpZWQuCisvLyBJZiBlaXRoZXIgJ3dpZHRoJyBvciAnaGVpZ2h0JyAoYnV0IG5vdCBib3RoKSBpcyAwIHRoZSBjb3JyZXNwb25kaW5nCisvLyBkaW1lbnNpb24gd2lsbCBiZSBjYWxjdWxhdGVkIHByZXNlcnZpbmcgdGhlIGFzcGVjdCByYXRpby4KKy8vIE5vIGdhbW1hIGNvcnJlY3Rpb24gaXMgYXBwbGllZC4KIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbWV0ZXIgb3IgaW5zdWZmaWNpZW50IG1lbW9yeSkuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAvLyBDb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gaW1wb3J0IFJHQiBzYW1wbGVzLgogLy8gUHJldmlvdXMgYnVmZmVyIHdpbGwgYmUgZnJlZSdkLCBpZiBhbnkuCiAvLyAqcmdiIGJ1ZmZlciBzaG91bGQgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgaGVpZ2h0ICogcmdiX3N0cmlkZS4KIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0UkdCKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCKAogICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKTsKIC8vIFNhbWUsIGJ1dCBmb3IgUkdCQSBidWZmZXIuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSgKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydFJHQkEoCiAgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSk7CiAvLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLiBJbXBvcnRzIHRoZSBSR0IgZGlyZWN0IGZyb20gdGhlIDMyLWJpdCBmb3JtYXQKIC8vIGlucHV0IGJ1ZmZlciBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbC4gQXZvaWRzIG5lZWRpbmcgdG8gY29weSB0aGUgZGF0YQogLy8gdG8gYSB0ZW1wb3JhcnkgMjQtYml0IFJHQiBidWZmZXIgdG8gaW1wb3J0IHRoZSBSR0Igb25seS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCWCgKICAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdieCwgaW50IHJnYnhfc3RyaWRlKTsKIAogLy8gVmFyaWFudHMgb2YgdGhlIGFib3ZlLCBidXQgdGFraW5nIEJHUihBfFgpIGlucHV0LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydEJHUigKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydEJHUigKICAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogYmdyLCBpbnQgYmdyX3N0cmlkZSk7Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSgKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydEJHUkEoCiAgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIGJncmEsIGludCBiZ3JhX3N0cmlkZSk7Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0QkdSWCgKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydEJHUlgoCiAgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIGJncngsIGludCBiZ3J4X3N0cmlkZSk7CiAKLS8vIENvbnZlcnRzIHBpY3R1cmUtPmFyZ2IgZGF0YSB0byB0aGUgWVVWQSBmb3JtYXQgc3BlY2lmaWVkIGJ5ICdjb2xvcnNwYWNlJy4KKy8vIENvbnZlcnRzIHBpY3R1cmUtPmFyZ2IgZGF0YSB0byB0aGUgWVVWNDIwQSBmb3JtYXQuIFRoZSAnY29sb3JzcGFjZScKKy8vIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgZXF1YWwgdG8gV0VCUF9ZVVY0MjAuCiAvLyBVcG9uIHJldHVybiwgcGljdHVyZS0+dXNlX2FyZ2IgaXMgc2V0IHRvIGZhbHNlLiBUaGUgcHJlc2VuY2Ugb2YgcmVhbAogLy8gbm9uLW9wYXF1ZSB0cmFuc3BhcmVudCB2YWx1ZXMgaXMgZGV0ZWN0ZWQsIGFuZCAnY29sb3JzcGFjZScgd2lsbCBiZQogLy8gYWRqdXN0ZWQgYWNjb3JkaW5nbHkuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBsb3NzeS4KIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY0NTUCBjb2xvcnNwYWNlKTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNDU1AgLypjb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjAqLyk7CisKKy8vIFNhbWUgYXMgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKCksIGJ1dCB0aGUgY29udmVyc2lvbiBpcyBkb25lIHVzaW5nCisvLyBwc2V1ZG8tcmFuZG9tIGRpdGhlcmluZyB3aXRoIGEgc3RyZW5ndGggJ2RpdGhlcmluZycgYmV0d2VlbgorLy8gMC4wIChubyBkaXRoZXJpbmcpIGFuZCAxLjAgKG1heGltdW0gZGl0aGVyaW5nKS4gVGhpcyBpcyB1c2VmdWwKKy8vIGZvciBwaG90b2dyYXBoaWMgcGljdHVyZS4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUFSR0JUb1lVVkFEaXRoZXJlZCgKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgV2ViUEVuY0NTUCBjb2xvcnNwYWNlLCBmbG9hdCBkaXRoZXJpbmcpOworCisvLyBQZXJmb3JtcyAnc2hhcnAnIFJHQkEtPllVVkE0MjAgZG93bnNhbXBsaW5nIGFuZCBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisvLyBEb3duc2FtcGxpbmcgaXMgaGFuZGxlZCB3aXRoIGV4dHJhIGNhcmUgaW4gY2FzZSBvZiBjb2xvciBjbGlwcGluZy4gVGhpcworLy8gbWV0aG9kIGlzIHJvdWdobHkgMnggc2xvd2VyIHRoYW4gV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKCkgYnV0IHByb2R1Y2VzIGJldHRlcgorLy8gYW5kIHNoYXJwZXIgWVVWIHJlcHJlc2VudGF0aW9uLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKy8vIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVTbWFydEFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBDb252ZXJ0cyBwaWN0dXJlLT55dXYgdG8gcGljdHVyZS0+YXJnYiBhbmQgc2V0cyBwaWN0dXJlLT51c2VfYXJnYiB0byB0cnVlLgotLy8gVGhlIGlucHV0IGZvcm1hdCBtdXN0IGJlIFlVVl80MjAgb3IgWVVWXzQyMEEuCi0vLyBOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGlzIG1ldGhvZCBpcyBkaXNjb3VyYWdlZCBpZiBvbmUgaGFzIGFjY2VzcyB0byB0aGUKLS8vIHJhdyBBUkdCIHNhbXBsZXMsIHNpbmNlIHVzaW5nIFlVVjQyMCBpcyBjb21wYXJhdGl2ZWx5IGxvc3N5LiBBbHNvLCB0aGUKLS8vIGNvbnZlcnNpb24gZnJvbSBZVVY0MjAgdG8gQVJHQiBpbmN1cnMgYSBzbWFsbCBsb3NzIHRvby4KKy8vIFRoZSBpbnB1dCBmb3JtYXQgbXVzdCBiZSBZVVZfNDIwIG9yIFlVVl80MjBBLiBUaGUgY29udmVyc2lvbiBmcm9tIFlVVjQyMCB0bworLy8gQVJHQiBpbmN1cnMgYSBzbWFsbCBsb3NzIHRvby4KKy8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgY29sb3JzcGFjZSBpcyBkaXNjb3VyYWdlZCBpZiBvbmUgaGFzIGFjY2VzcyB0byB0aGUKKy8vIHJhdyBBUkdCIHNhbXBsZXMsIHNpbmNlIHVzaW5nIFlVVjQyMCBpcyBjb21wYXJhdGl2ZWx5IGxvc3N5LgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVlVVkFUb0FSR0IoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSk7CiAKLS8vIEhlbHBlciBmdW5jdGlvbjogZ2l2ZW4gYSB3aWR0aCB4IGhlaWdodCBwbGFuZSBvZiBZVVYoQSkgc2FtcGxlcwotLy8gKHdpdGggc3RyaWRlICdzdHJpZGUnKSwgY2xlYW4tdXAgdGhlIFlVViBzYW1wbGVzIHVuZGVyIGZ1bGx5IHRyYW5zcGFyZW50Ci0vLyBhcmVhLCB0byBoZWxwIGNvbXByZXNzaWJpbGl0eSAobm8gZ3VhcmFudGVlLCB0aG91Z2gpLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworLy8gSGVscGVyIGZ1bmN0aW9uOiBnaXZlbiBhIHdpZHRoIHggaGVpZ2h0IHBsYW5lIG9mIFJHQkEgb3IgWVVWKEEpIHNhbXBsZXMKKy8vIGNsZWFuLXVwIG9yIHNtb290aGVuIHRoZSBZVVYgb3IgUkdCIHNhbXBsZXMgdW5kZXIgZnVsbHkgdHJhbnNwYXJlbnQgYXJlYSwKKy8vIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5IChubyBndWFyYW50ZWUsIHRob3VnaCkuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAogLy8gU2NhbiB0aGUgcGljdHVyZSAncGljdHVyZScgZm9yIHRoZSBwcmVzZW5jZSBvZiBub24gZnVsbHkgb3BhcXVlIGFscGhhIHZhbHVlcy4KIC8vIFJldHVybnMgdHJ1ZSBpbiBzdWNoIGNhc2UuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlIChpbmRpY2F0aW5nIHRoYXQgdGhlCiAvLyBhbHBoYSBwbGFuZSBjYW4gYmUgaWdub3JlZCBhbHRvZ2V0aGVyIGUuZy4pLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBSZW1vdmUgdGhlIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiAoaWYgcHJlc2VudCkgYnkgYmxlbmRpbmcgdGhlIGNvbG9yIHdpdGgKKy8vIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICdiYWNrZ3JvdW5kX3JnYicgKHNwZWNpZmllZCBhcyAyNGJpdCBSR0IgdHJpcGxldCkuCisvLyBBZnRlciB0aGlzIGNhbGwsIGFsbCBhbHBoYSB2YWx1ZXMgYXJlIHJlc2V0IHRvIDB4ZmYuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBCbGVuZEFscGhhKFdlYlBQaWN0dXJlKiBwaWMsIHVpbnQzMl90IGJhY2tncm91bmRfcmdiKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE1haW4gY2FsbApAQCAtNDc0LDExICs1MzQsMTEgQEAKIC8vIHRoZSBmb3JtZXIgZm9yIGxvc3N5IGVuY29kaW5nLCBhbmQgdGhlIGxhdHRlciBmb3IgbG9zc2xlc3MgZW5jb2RpbmcKIC8vICh3aGVuIGNvbmZpZy5sb3NzbGVzcyBpcyB0cnVlKS4gQXV0b21hdGljIGNvbnZlcnNpb24gZnJvbSBvbmUgZm9ybWF0IHRvCiAvLyBhbm90aGVyIGlzIHByb3ZpZGVkIGJ1dCB0aGV5IGJvdGggaW5jdXIgc29tZSBsb3NzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQRW5jb2RlKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZywgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworV0VCUF9FWFRFUk4gaW50IFdlYlBFbmNvZGUoY29uc3QgV2ViUENvbmZpZyogY29uZmlnLCBXZWJQUGljdHVyZSogcGljdHVyZSk7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKaW5kZXggNGMwNGI1MC4uMzI5ZmM4YSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCkBAIC0xNSw3ICsxNSw3IEBACiAjZGVmaW5lIFdFQlBfV0VCUF9GT1JNQVRfQ09OU1RBTlRTX0hfCiAKIC8vIENyZWF0ZSBmb3VyY2Mgb2YgdGhlIGNodW5rIGZyb20gdGhlIGNodW5rIHRhZyBjaGFyYWN0ZXJzLgotI2RlZmluZSBNS0ZPVVJDQyhhLCBiLCBjLCBkKSAoKHVpbnQzMl90KShhKSB8IChiKSA8PCA4IHwgKGMpIDw8IDE2IHwgKGQpIDw8IDI0KQorI2RlZmluZSBNS0ZPVVJDQyhhLCBiLCBjLCBkKSAoKGEpIHwgKGIpIDw8IDggfCAoYykgPDwgMTYgfCAodWludDMyX3QpKGQpIDw8IDI0KQogCiAvLyBWUDggcmVsYXRlZCBjb25zdGFudHMuCiAjZGVmaW5lIFZQOF9TSUdOQVRVUkUgMHg5ZDAxMmEgICAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBpbiBWUDggZGF0YS4KQEAgLTcyLDE0ICs3MiwxMyBAQAogI2RlZmluZSBSSUZGX0hFQURFUl9TSVpFICAgMTIgICAgLy8gU2l6ZSBvZiB0aGUgUklGRiBoZWFkZXIgKCJSSUZGbm5ubldFQlAiKS4KICNkZWZpbmUgQU5NRl9DSFVOS19TSVpFICAgIDE2ICAgIC8vIFNpemUgb2YgYW4gQU5NRiBjaHVuay4KICNkZWZpbmUgQU5JTV9DSFVOS19TSVpFICAgIDYgICAgIC8vIFNpemUgb2YgYW4gQU5JTSBjaHVuay4KLSNkZWZpbmUgRlJHTV9DSFVOS19TSVpFICAgIDYgICAgIC8vIFNpemUgb2YgYSBGUkdNIGNodW5rLgogI2RlZmluZSBWUDhYX0NIVU5LX1NJWkUgICAgMTAgICAgLy8gU2l6ZSBvZiBhIFZQOFggY2h1bmsuCiAKICNkZWZpbmUgTUFYX0NBTlZBU19TSVpFICAgICAoMSA8PCAyNCkgICAgIC8vIDI0LWJpdCBtYXggZm9yIFZQOFggd2lkdGgvaGVpZ2h0LgogI2RlZmluZSBNQVhfSU1BR0VfQVJFQSAgICAgICgxVUxMIDw8IDMyKSAgLy8gMzItYml0IG1heCBmb3Igd2lkdGggeCBoZWlnaHQuCiAjZGVmaW5lIE1BWF9MT09QX0NPVU5UICAgICAgKDEgPDwgMTYpICAgICAvLyBtYXhpbXVtIHZhbHVlIGZvciBsb29wLWNvdW50CiAjZGVmaW5lIE1BWF9EVVJBVElPTiAgICAgICAgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGR1cmF0aW9uCi0jZGVmaW5lIE1BWF9QT1NJVElPTl9PRkZTRVQgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGZyYW1lL2ZyYWdtZW50IHgveSBvZmZzZXQKKyNkZWZpbmUgTUFYX1BPU0lUSU9OX09GRlNFVCAoMSA8PCAyNCkgICAgIC8vIG1heGltdW0gZnJhbWUgeC95IG9mZnNldAogCiAvLyBNYXhpbXVtIGNodW5rIHBheWxvYWQgaXMgc3VjaCB0aGF0IGFkZGluZyB0aGUgaGVhZGVyIGFuZCBwYWRkaW5nIHdvbid0CiAvLyBvdmVyZmxvdyBhIHVpbnQzMl90LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJiNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4LmgKQEAgLTAsMCArMSw1MzAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgUklGRiBjb250YWluZXIgbWFuaXB1bGF0aW9uIGFuZCBlbmNvZGluZyBmb3IgV2ViUCBpbWFnZXMuCisvLworLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1dFQlBfTVVYX0hfCisjZGVmaW5lIFdFQlBfV0VCUF9NVVhfSF8KKworI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXRUJQX01VWF9BQklfVkVSU0lPTiAweDAxMDggICAgICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4IEFQSQorLy8KKy8vIFRoaXMgQVBJIGFsbG93cyBtYW5pcHVsYXRpb24gb2YgV2ViUCBjb250YWluZXIgaW1hZ2VzIGNvbnRhaW5pbmcgZmVhdHVyZXMKKy8vIGxpa2UgY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEsIGFuaW1hdGlvbi4KKy8vCisvLyBDb2RlIEV4YW1wbGUjMTogQ3JlYXRlIGEgV2ViUE11eCBvYmplY3Qgd2l0aCBpbWFnZSBkYXRhLCBjb2xvciBwcm9maWxlIGFuZAorLy8gWE1QIG1ldGFkYXRhLgorLyoKKyAgaW50IGNvcHlfZGF0YSA9IDA7CisgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhOZXcoKTsKKyAgLy8gLi4uIChQcmVwYXJlIGltYWdlIGRhdGEpLgorICBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmaW1hZ2UsIGNvcHlfZGF0YSk7CisgIC8vIC4uLiAoUHJlcGFyZSBJQ0NQIGNvbG9yIHByb2ZpbGUgZGF0YSkuCisgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlLCBjb3B5X2RhdGEpOworICAvLyAuLi4gKFByZXBhcmUgWE1QIG1ldGFkYXRhKS4KKyAgV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wLCBjb3B5X2RhdGEpOworICAvLyBHZXQgZGF0YSBmcm9tIG11eCBpbiBXZWJQIFJJRkYgZm9ybWF0LgorICBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIC8vIC4uLiAoQ29uc3VtZSBvdXRwdXRfZGF0YTsgZS5nLiB3cml0ZSBvdXRwdXRfZGF0YS5ieXRlcyB0byBmaWxlKS4KKyAgV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOworKi8KKworLy8gQ29kZSBFeGFtcGxlIzI6IEdldCBpbWFnZSBhbmQgY29sb3IgcHJvZmlsZSBkYXRhIGZyb20gYSBXZWJQIGZpbGUuCisvKgorICBpbnQgY29weV9kYXRhID0gMDsKKyAgLy8gLi4uIChSZWFkIGRhdGEgZnJvbSBmaWxlKS4KKyAgV2ViUE11eCogbXV4ID0gV2ViUE11eENyZWF0ZSgmZGF0YSwgY29weV9kYXRhKTsKKyAgV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJmltYWdlKTsKKyAgLy8gLi4uIChDb25zdW1lIGltYWdlOyBlLmcuIGNhbGwgV2ViUERlY29kZSgpIHRvIGRlY29kZSB0aGUgZGF0YSkuCisgIFdlYlBNdXhHZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlKTsKKyAgLy8gLi4uIChDb25zdW1lIGljY19kYXRhKS4KKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBmcmVlKGRhdGEpOworKi8KKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUE11eEVycm9yIFdlYlBNdXhFcnJvcjsKKy8vIHR5cGVkZWYgZW51bSBXZWJQQ2h1bmtJZCBXZWJQQ2h1bmtJZDsKK3R5cGVkZWYgc3RydWN0IFdlYlBNdXggV2ViUE11eDsgICAvLyBtYWluIG9wYXF1ZSBvYmplY3QuCit0eXBlZGVmIHN0cnVjdCBXZWJQTXV4RnJhbWVJbmZvIFdlYlBNdXhGcmFtZUluZm87Cit0eXBlZGVmIHN0cnVjdCBXZWJQTXV4QW5pbVBhcmFtcyBXZWJQTXV4QW5pbVBhcmFtczsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgV2ViUEFuaW1FbmNvZGVyT3B0aW9uczsKKworLy8gRXJyb3IgY29kZXMKK3R5cGVkZWYgZW51bSBXZWJQTXV4RXJyb3IgeworICBXRUJQX01VWF9PSyAgICAgICAgICAgICAgICAgPSAgMSwKKyAgV0VCUF9NVVhfTk9UX0ZPVU5EICAgICAgICAgID0gIDAsCisgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgICA9IC0xLAorICBXRUJQX01VWF9CQURfREFUQSAgICAgICAgICAgPSAtMiwKKyAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SICAgICAgID0gLTMsCisgIFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSAgICA9IC00Cit9IFdlYlBNdXhFcnJvcjsKKworLy8gSURzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgY2h1bmtzLgordHlwZWRlZiBlbnVtIFdlYlBDaHVua0lkIHsKKyAgV0VCUF9DSFVOS19WUDhYLCAgICAgICAgLy8gVlA4WAorICBXRUJQX0NIVU5LX0lDQ1AsICAgICAgICAvLyBJQ0NQCisgIFdFQlBfQ0hVTktfQU5JTSwgICAgICAgIC8vIEFOSU0KKyAgV0VCUF9DSFVOS19BTk1GLCAgICAgICAgLy8gQU5NRgorICBXRUJQX0NIVU5LX0RFUFJFQ0FURUQsICAvLyAoZGVwcmVjYXRlZCBmcm9tIEZSR00pCisgIFdFQlBfQ0hVTktfQUxQSEEsICAgICAgIC8vIEFMUEgKKyAgV0VCUF9DSFVOS19JTUFHRSwgICAgICAgLy8gVlA4L1ZQOEwKKyAgV0VCUF9DSFVOS19FWElGLCAgICAgICAgLy8gRVhJRgorICBXRUJQX0NIVU5LX1hNUCwgICAgICAgICAvLyBYTVAKKyAgV0VCUF9DSFVOS19VTktOT1dOLCAgICAgLy8gT3RoZXIgY2h1bmtzLgorICBXRUJQX0NIVU5LX05JTAorfSBXZWJQQ2h1bmtJZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG11eCBsaWJyYXJ5LCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcKKy8vIDhiaXRzIGZvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0TXV4VmVyc2lvbih2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgYSBNdXggb2JqZWN0CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTiBXZWJQTXV4KiBXZWJQTmV3SW50ZXJuYWwoaW50KTsKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBtdXggb2JqZWN0LgorLy8gUmV0dXJuczoKKy8vICAgQSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGVtcHR5IG11eCBvYmplY3QuCisvLyAgIE9yIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUE11eCogV2ViUE11eE5ldyh2b2lkKSB7CisgIHJldHVybiBXZWJQTmV3SW50ZXJuYWwoV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBEZWxldGVzIHRoZSBtdXggb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKK1dFQlBfRVhURVJOIHZvaWQgV2ViUE11eERlbGV0ZShXZWJQTXV4KiBtdXgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4IGNyZWF0aW9uLgorCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAorV0VCUF9FWFRFUk4gV2ViUE11eCogV2ViUE11eENyZWF0ZUludGVybmFsKGNvbnN0IFdlYlBEYXRhKiwgaW50LCBpbnQpOworCisvLyBDcmVhdGVzIGEgbXV4IG9iamVjdCBmcm9tIHJhdyBkYXRhIGdpdmVuIGluIFdlYlAgUklGRiBmb3JtYXQuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBiaXRzdHJlYW0gLSAoaW4pIHRoZSBiaXRzdHJlYW0gZGF0YSBpbiBXZWJQIFJJRkYgZm9ybWF0CisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG11eCBvYmplY3QgY3JlYXRlZCBmcm9tIGdpdmVuIGRhdGEgLSBvbiBzdWNjZXNzLgorLy8gICBOVUxMIC0gSW4gY2FzZSBvZiBpbnZhbGlkIGRhdGEgb3IgbWVtb3J5IGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBNdXgqIFdlYlBNdXhDcmVhdGUoY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKKyAgcmV0dXJuIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChiaXRzdHJlYW0sIGNvcHlfZGF0YSwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWltYWdlIGNodW5rcy4KKworLy8gTm90ZTogT25seSBub24taW1hZ2UgcmVsYXRlZCBjaHVua3Mgc2hvdWxkIGJlIG1hbmFnZWQgdGhyb3VnaCBjaHVuayBBUElzLgorLy8gKEltYWdlIHJlbGF0ZWQgY2h1bmtzIGFyZTogIkFOTUYiLCAiVlA4ICIsICJWUDhMIiBhbmQgIkFMUEgiKS4KKy8vIFRvIGFkZCwgZ2V0IGFuZCBkZWxldGUgaW1hZ2VzLCB1c2UgV2ViUE11eFNldEltYWdlKCksIFdlYlBNdXhQdXNoRnJhbWUoKSwKKy8vIFdlYlBNdXhHZXRGcmFtZSgpIGFuZCBXZWJQTXV4RGVsZXRlRnJhbWUoKS4KKworLy8gQWRkcyBhIGNodW5rIHdpdGggaWQgJ2ZvdXJjYycgYW5kIGRhdGEgJ2NodW5rX2RhdGEnIGluIHRoZSBtdXggb2JqZWN0LgorLy8gQW55IGV4aXN0aW5nIGNodW5rKHMpIHdpdGggdGhlIHNhbWUgaWQgd2lsbCBiZSByZW1vdmVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBhZGRlZAorLy8gICBmb3VyY2MgLSAoaW4pIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgZ2l2ZW4gY2h1bms7CisvLyAgICAgICAgICAgICAgICAgZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiBldGMuCisvLyAgIGNodW5rX2RhdGEgLSAoaW4pIHRoZSBjaHVuayBkYXRhIHRvIGJlIGFkZGVkCisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCisvLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eFNldENodW5rKAorICAgIFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIGNvbnN0IFdlYlBEYXRhKiBjaHVua19kYXRhLAorICAgIGludCBjb3B5X2RhdGEpOworCisvLyBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGluIHRoZSBtdXggb2JqZWN0LgorLy8gVGhlIGNhbGxlciBzaG91bGQgTk9UIGZyZWUgdGhlIHJldHVybmVkIGRhdGEuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBkYXRhIGlzIHRvIGJlIGZldGNoZWQKKy8vICAgZm91cmNjIC0gKGluKSBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGNodW5rOworLy8gICAgICAgICAgICAgICAgIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIgZXRjLgorLy8gICBjaHVua19kYXRhIC0gKG91dCkgcmV0dXJuZWQgY2h1bmsgZGF0YQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCwgZm91cmNjIG9yIGNodW5rX2RhdGEgaXMgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgZm91cmNjIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIGNodW5rLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiBtdXggZG9lcyBub3QgY29udGFpbiBhIGNodW5rIHdpdGggdGhlIGdpdmVuIGlkLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eEdldENodW5rKAorICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIFdlYlBEYXRhKiBjaHVua19kYXRhKTsKKworLy8gRGVsZXRlcyB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gJ2ZvdXJjYycgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBkZWxldGVkCisvLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKKy8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZm91cmNjIGlzIE5VTEwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGZvdXJjYyBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSBjaHVuay4KKy8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gSWYgbXV4IGRvZXMgbm90IGNvbnRhaW4gYSBjaHVuayB3aXRoIHRoZSBnaXZlbiBmb3VyY2MuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4RGVsZXRlQ2h1bmsoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZXMuCisKKy8vIEVuY2Fwc3VsYXRlcyBkYXRhIGFib3V0IGEgc2luZ2xlIGZyYW1lLgorc3RydWN0IFdlYlBNdXhGcmFtZUluZm8geworICBXZWJQRGF0YSAgICBiaXRzdHJlYW07ICAvLyBpbWFnZSBkYXRhOiBjYW4gYmUgYSByYXcgVlA4L1ZQOEwgYml0c3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgc2luZ2xlLWltYWdlIFdlYlAgZmlsZS4KKyAgaW50ICAgICAgICAgeF9vZmZzZXQ7ICAgLy8geC1vZmZzZXQgb2YgdGhlIGZyYW1lLgorICBpbnQgICAgICAgICB5X29mZnNldDsgICAvLyB5LW9mZnNldCBvZiB0aGUgZnJhbWUuCisgIGludCAgICAgICAgIGR1cmF0aW9uOyAgIC8vIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSAoaW4gbWlsbGlzZWNvbmRzKS4KKworICBXZWJQQ2h1bmtJZCBpZDsgICAgICAgICAvLyBmcmFtZSB0eXBlOiBzaG91bGQgYmUgb25lIG9mIFdFQlBfQ0hVTktfQU5NRgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBXRUJQX0NIVU5LX0lNQUdFCisgIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZDsgIC8vIERpc3Bvc2FsIG1ldGhvZCBmb3IgdGhlIGZyYW1lLgorICBXZWJQTXV4QW5pbUJsZW5kICAgYmxlbmRfbWV0aG9kOyAgICAvLyBCbGVuZCBvcGVyYXRpb24gZm9yIHRoZSBmcmFtZS4KKyAgdWludDMyX3QgICAgcGFkWzFdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCit9OworCisvLyBTZXRzIHRoZSAobm9uLWFuaW1hdGVkKSBpbWFnZSBpbiB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGU6IEFueSBleGlzdGluZyBpbWFnZXMgKGluY2x1ZGluZyBmcmFtZXMpIHdpbGwgYmUgcmVtb3ZlZC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBpbiB3aGljaCB0aGUgaW1hZ2UgaXMgdG8gYmUgc2V0CisvLyAgIGJpdHN0cmVhbSAtIChpbikgY2FuIGJlIGEgcmF3IFZQOC9WUDhMIGJpdHN0cmVhbSBvciBhIHNpbmdsZS1pbWFnZQorLy8gICAgICAgICAgICAgICBXZWJQIGZpbGUgKG5vbi1hbmltYXRlZCkKKy8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKKy8vICAgICAgICAgICAgICAgb2JqZWN0IGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggaXMgTlVMTCBvciBiaXRzdHJlYW0gaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4U2V0SW1hZ2UoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQRGF0YSogYml0c3RyZWFtLCBpbnQgY29weV9kYXRhKTsKKworLy8gQWRkcyBhIGZyYW1lIGF0IHRoZSBlbmQgb2YgdGhlIG11eCBvYmplY3QuCisvLyBOb3RlczogKDEpIGZyYW1lLmlkIHNob3VsZCBiZSBXRUJQX0NIVU5LX0FOTUYKKy8vICAgICAgICAoMikgRm9yIHNldHRpbmcgYSBub24tYW5pbWF0ZWQgaW1hZ2UsIHVzZSBXZWJQTXV4U2V0SW1hZ2UoKSBpbnN0ZWFkLgorLy8gICAgICAgICgzKSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZCBtdXN0IGJlIHNhbWUgYXMgdGhlIGZyYW1lcyBpbiBtdXguCisvLyAgICAgICAgKDQpIEFzIFdlYlAgb25seSBzdXBwb3J0cyBldmVuIG9mZnNldHMsIGFueSBvZGQgb2Zmc2V0IHdpbGwgYmUgc25hcHBlZAorLy8gICAgICAgICAgICB0byBhbiBldmVuIGxvY2F0aW9uIHVzaW5nOiBvZmZzZXQgJj0gfjEKKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQKKy8vICAgZnJhbWUgLSAoaW4pIGZyYW1lIGRhdGEuCisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZyYW1lIGlzIE5VTEwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGNvbnRlbnQgb2YgJ2ZyYW1lJyBpcyBpbnZhbGlkLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhQdXNoRnJhbWUoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSwgaW50IGNvcHlfZGF0YSk7CisKKy8vIEdldHMgdGhlIG50aCBmcmFtZSBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gVGhlIGNvbnRlbnQgb2YgJ2ZyYW1lLT5iaXRzdHJlYW0nIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAorLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKKy8vIFdlYlBEYXRhQ2xlYXIoKS4KKy8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBpbmZvIGlzIHRvIGJlIGZldGNoZWQKKy8vICAgbnRoIC0gKGluKSBpbmRleCBvZiB0aGUgZnJhbWUgaW4gdGhlIG11eCBvYmplY3QKKy8vICAgZnJhbWUgLSAob3V0KSBkYXRhIG9mIHRoZSByZXR1cm5lZCBmcmFtZQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmcmFtZSBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QuCisvLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbnRoIGZyYW1lIGNodW5rIGluIG11eCBpcyBpbnZhbGlkLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCwgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUpOworCisvLyBEZWxldGVzIGEgZnJhbWUgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCBhIGZyYW1lIGlzIHRvIGJlIGRlbGV0ZWQKKy8vICAgbnRoIC0gKGluKSBUaGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgZGVsZXRlZAorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlbGV0aW9uLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eERlbGV0ZUZyYW1lKFdlYlBNdXgqIG11eCwgdWludDMyX3QgbnRoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFuaW1hdGlvbi4KKworLy8gQW5pbWF0aW9uIHBhcmFtZXRlcnMuCitzdHJ1Y3QgV2ViUE11eEFuaW1QYXJhbXMgeworICB1aW50MzJfdCBiZ2NvbG9yOyAgLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzIHN0b3JlZCAoaW4gTVNCIG9yZGVyKSBhczoKKyAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMDAgdG8gMDc6IEFscGhhLgorICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAwOCB0byAxNTogUmVkLgorICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAxNiB0byAyMzogR3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDI0IHRvIDMxOiBCbHVlLgorICBpbnQgbG9vcF9jb3VudDsgICAgLy8gTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uIFswID0gaW5maW5pdGVdLgorfTsKKworLy8gU2V0cyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgaW4gdGhlIG11eCBvYmplY3QuIEFueSBleGlzdGluZyBBTklNIGNodW5rcworLy8gd2lsbCBiZSByZW1vdmVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGluIHdoaWNoIEFOSU0gY2h1bmsgaXMgdG8gYmUgc2V0L2FkZGVkCisvLyAgIHBhcmFtcyAtIChpbikgYW5pbWF0aW9uIHBhcmFtZXRlcnMuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIHBhcmFtcyBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKKworLy8gR2V0cyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzIHRvIGJlIGZldGNoZWQKKy8vICAgcGFyYW1zIC0gKG91dCkgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIEFOSU0gY2h1bmsKKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgcGFyYW1zIGlzIE5VTEwuCisvLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIGlmIEFOSU0gY2h1bmsgaXMgbm90IHByZXNlbnQgaW4gbXV4IG9iamVjdC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMoCisgICAgY29uc3QgV2ViUE11eCogbXV4LCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1pc2MgVXRpbGl0aWVzLgorCisvLyBTZXRzIHRoZSBjYW52YXMgc2l6ZSBmb3IgdGhlIG11eCBvYmplY3QuIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZQorLy8gc3BlY2lmaWVkIGV4cGxpY2l0bHkgb3IgbGVmdCBhcyB6ZXJvICgwLCAwKS4KKy8vICogV2hlbiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhlbiB0aGlzIGZyYW1lIGJvdW5kIGlzCisvLyAgIGVuZm9yY2VkIGR1cmluZyBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBNdXhBc3NlbWJsZSgpIGFuZCBhbiBlcnJvciBpcworLy8gICByZXBvcnRlZCBpZiBhbnkgYW5pbWF0ZWQgZnJhbWUgZG9lcyBub3QgY29tcGxldGVseSBmaXQgd2l0aGluIHRoZSBjYW52YXMuCisvLyAqIFdoZW4gdW5zcGVjaWZpZWQgKDAsIDApLCB0aGUgY29uc3RydWN0ZWQgY2FudmFzIHdpbGwgZ2V0IHRoZSBmcmFtZSBib3VuZHMKKy8vICAgZnJvbSB0aGUgYm91bmRpbmctYm94IG92ZXIgYWxsIGZyYW1lcyBhZnRlciBjYWxsaW5nIFdlYlBNdXhBc3NlbWJsZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgdG8gd2hpY2ggdGhlIGNhbnZhcyBzaXplIGlzIHRvIGJlIHNldAorLy8gICB3aWR0aCAtIChpbikgY2FudmFzIHdpZHRoCisvLyAgIGhlaWdodCAtIChpbikgY2FudmFzIGhlaWdodAorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMOyBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggb3IgaGVpZ2h0IGFyZSBpbnZhbGlkIG9yIG91dCBvZiBib3VuZHMKKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhTZXRDYW52YXNTaXplKFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBHZXRzIHRoZSBjYW52YXMgc2l6ZSBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gTm90ZTogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBWUDhYIGNodW5rLCBpZiBwcmVzZW50LCBpcyB1cC10by1kYXRlLgorLy8gVGhhdCBpcywgdGhlIG11eCBvYmplY3QgaGFzbid0IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworLy8gV2ViUE11eEFzc2VtYmxlKCkgb3IgV2ViUE11eENyZWF0ZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY2FudmFzIHNpemUgaXMgdG8gYmUgZmV0Y2hlZAorLy8gICB3aWR0aCAtIChvdXQpIGNhbnZhcyB3aWR0aAorLy8gICBoZWlnaHQgLSAob3V0KSBjYW52YXMgaGVpZ2h0CisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCB3aWR0aCBvciBoZWlnaHQgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBWUDhYL1ZQOC9WUDhMIGNodW5rIG9yIGNhbnZhcyBzaXplIGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4R2V0Q2FudmFzU2l6ZShjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisvLyBHZXRzIHRoZSBmZWF0dXJlIGZsYWdzIGZyb20gdGhlIG11eCBvYmplY3QuCisvLyBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIFZQOFggY2h1bmssIGlmIHByZXNlbnQsIGlzIHVwLXRvLWRhdGUuCisvLyBUaGF0IGlzLCB0aGUgbXV4IG9iamVjdCBoYXNuJ3QgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisvLyBXZWJQTXV4QXNzZW1ibGUoKSBvciBXZWJQTXV4Q3JlYXRlKCkuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBmZWF0dXJlcyBhcmUgdG8gYmUgZmV0Y2hlZAorLy8gICBmbGFncyAtIChvdXQpIHRoZSBmbGFncyBzcGVjaWZ5aW5nIHdoaWNoIGZlYXR1cmVzIGFyZSBwcmVzZW50IGluIHRoZQorLy8gICAgICAgICAgIG11eCBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBPUiBvZiB2YXJpb3VzIGZsYWcgdmFsdWVzLgorLy8gICAgICAgICAgIEVudW0gJ1dlYlBGZWF0dXJlRmxhZ3MnIGNhbiBiZSB1c2VkIHRvIHRlc3QgaW5kaXZpZHVhbCBmbGFnIHZhbHVlcy4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZmxhZ3MgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBWUDhYL1ZQOC9WUDhMIGNodW5rIG9yIGNhbnZhcyBzaXplIGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4R2V0RmVhdHVyZXMoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZmxhZ3MpOworCisvLyBHZXRzIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZ2l2ZW4gJ2lkJyBpbiB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGluZm8gaXMgdG8gYmUgZmV0Y2hlZAorLy8gICBpZCAtIChpbikgY2h1bmsgaWQgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjaHVuaworLy8gICBudW1fZWxlbWVudHMgLSAob3V0KSBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhlIGdpdmVuIGNodW5rIGlkCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBvciBudW1fZWxlbWVudHMgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhOdW1DaHVua3MoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSWQgaWQsIGludCogbnVtX2VsZW1lbnRzKTsKKworLy8gQXNzZW1ibGVzIGFsbCBjaHVua3MgaW4gV2ViUCBSSUZGIGZvcm1hdCBhbmQgcmV0dXJucyBpbiAnYXNzZW1ibGVkX2RhdGEnLgorLy8gVGhpcyBmdW5jdGlvbiBhbHNvIHZhbGlkYXRlcyB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGU6IFRoZSBjb250ZW50IG9mICdhc3NlbWJsZWRfZGF0YScgd2lsbCBiZSBpZ25vcmVkIGFuZCBvdmVyd3JpdHRlbi4KKy8vIEFsc28sIHRoZSBjb250ZW50IG9mICdhc3NlbWJsZWRfZGF0YScgaXMgYWxsb2NhdGVkIHVzaW5nIG1hbGxvYygpLCBhbmQgTk9UCisvLyBvd25lZCBieSB0aGUgJ211eCcgb2JqZWN0LiBJdCBNVVNUIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYnkgY2FsbGluZworLy8gV2ViUERhdGFDbGVhcigpLiBJdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgV2ViUERhdGFDbGVhcigpIHVwb24gcmV0dXJuLAorLy8gZXZlbiBpbiBjYXNlIG9mIGVycm9yLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHdob3NlIGNodW5rcyBhcmUgdG8gYmUgYXNzZW1ibGVkCisvLyAgIGFzc2VtYmxlZF9kYXRhIC0gKG91dCkgYXNzZW1ibGVkIFdlYlAgZGF0YQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBtdXggb2JqZWN0IGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgYXNzZW1ibGVkX2RhdGEgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4QXNzZW1ibGUoV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogYXNzZW1ibGVkX2RhdGEpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUEFuaW1FbmNvZGVyIEFQSQorLy8KKy8vIFRoaXMgQVBJIGFsbG93cyBlbmNvZGluZyAocG9zc2libHkpIGFuaW1hdGVkIFdlYlAgaW1hZ2VzLgorLy8KKy8vIENvZGUgRXhhbXBsZToKKy8qCisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnM7CisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZlbmNfb3B0aW9ucyk7CisgIC8vIFR1bmUgJ2VuY19vcHRpb25zJyBhcyBuZWVkZWQuCisgIFdlYlBBbmltRW5jb2RlciogZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KHdpZHRoLCBoZWlnaHQsICZlbmNfb3B0aW9ucyk7CisgIHdoaWxlKDx0aGVyZSBhcmUgbW9yZSBmcmFtZXM+KSB7CisgICAgV2ViUENvbmZpZyBjb25maWc7CisgICAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7CisgICAgLy8gVHVuZSAnY29uZmlnJyBhcyBuZWVkZWQuCisgICAgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgZnJhbWUsIHRpbWVzdGFtcF9tcywgJmNvbmZpZyk7CisgIH0KKyAgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgTlVMTCwgdGltZXN0YW1wX21zLCBOVUxMKTsKKyAgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoZW5jLCB3ZWJwX2RhdGEpOworICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKyAgLy8gV3JpdGUgdGhlICd3ZWJwX2RhdGEnIHRvIGEgZmlsZSwgb3IgcmUtbXV4IGl0IGZ1cnRoZXIuCisqLworCit0eXBlZGVmIHN0cnVjdCBXZWJQQW5pbUVuY29kZXIgV2ViUEFuaW1FbmNvZGVyOyAgLy8gTWFpbiBvcGFxdWUgb2JqZWN0LgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gRGVmaW5lZCBpbiBlbmNvZGUuaC4KK3N0cnVjdCBXZWJQUGljdHVyZTsKK3N0cnVjdCBXZWJQQ29uZmlnOworCisvLyBHbG9iYWwgb3B0aW9ucy4KK3N0cnVjdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zIHsKKyAgV2ViUE11eEFuaW1QYXJhbXMgYW5pbV9wYXJhbXM7ICAvLyBBbmltYXRpb24gcGFyYW1ldGVycy4KKyAgaW50IG1pbmltaXplX3NpemU7ICAgIC8vIElmIHRydWUsIG1pbmltaXplIHRoZSBvdXRwdXQgc2l6ZSAoc2xvdykuIEltcGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVzIGtleS1mcmFtZSBpbnNlcnRpb24uCisgIGludCBrbWluOworICBpbnQga21heDsgICAgICAgICAgICAgLy8gTWluaW11bSBhbmQgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIGluIHRoZSBvdXRwdXQuIFRoZSBsaWJyYXJ5IG1heSBpbnNlcnQgc29tZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGlzIGNyaXRlcmlhLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGNvbmRpdGlvbnMgc2hvdWxkIGhvbGQ6IGttYXggPiBrbWluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQga21pbiA+PSBrbWF4IC8gMiArIDEuIEFsc28sIGlmIGttYXggPD0gMCwgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5LWZyYW1lIGluc2VydGlvbiBpcyBkaXNhYmxlZDsgYW5kIGlmIGttYXggPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gYWxsIGZyYW1lcyB3aWxsIGJlIGtleS1mcmFtZXMgKGttaW4gdmFsdWUgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdHRlciBmb3IgdGhlc2Ugc3BlY2lhbCBjYXNlcykuCisgIGludCBhbGxvd19taXhlZDsgICAgICAvLyBJZiB0cnVlLCB1c2UgbWl4ZWQgY29tcHJlc3Npb24gbW9kZTsgbWF5IGNob29zZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGxvc3N5IGFuZCBsb3NzbGVzcyBmb3IgZWFjaCBmcmFtZS4KKyAgaW50IHZlcmJvc2U7ICAgICAgICAgIC8vIElmIHRydWUsIHByaW50IGluZm8gYW5kIHdhcm5pbmcgbWVzc2FnZXMgdG8gc3RkZXJyLgorCisgIHVpbnQzMl90IHBhZGRpbmdbNF07ICAvLyBQYWRkaW5nIGZvciBsYXRlciB1c2UuCit9OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludC4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdEludGVybmFsKAorICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqLCBpbnQpOworCisvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSBhIGZyZXNoIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMKKy8vIHN0cnVjdHVyZSBiZWZvcmUgbW9kaWZpY2F0aW9uLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaC4KKy8vIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCkgbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlCisvLyAnZW5jX29wdGlvbnMnIG9iamVjdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoCisgICAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogZW5jX29wdGlvbnMpIHsKKyAgcmV0dXJuIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoZW5jX29wdGlvbnMsIFdFQlBfTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBXZWJQQW5pbUVuY29kZXIqIFdlYlBBbmltRW5jb2Rlck5ld0ludGVybmFsKAorICAgIGludCwgaW50LCBjb25zdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBXZWJQQW5pbUVuY29kZXIgb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgd2lkdGgvaGVpZ2h0IC0gKGluKSBjYW52YXMgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYW5pbWF0aW9uLgorLy8gICBlbmNfb3B0aW9ucyAtIChpbikgZW5jb2Rpbmcgb3B0aW9uczsgY2FuIGJlIHBhc3NlZCBOVUxMIHRvIHBpY2sKKy8vICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmFibGUgZGVmYXVsdHMuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgV2ViUEFuaW1FbmNvZGVyIG9iamVjdC4KKy8vICAgT3IgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQQW5pbUVuY29kZXIqIFdlYlBBbmltRW5jb2Rlck5ldygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGVuY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbUVuY29kZXJOZXdJbnRlcm5hbCh3aWR0aCwgaGVpZ2h0LCBlbmNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gT3B0aW1pemUgdGhlIGdpdmVuIGZyYW1lIGZvciBXZWJQLCBlbmNvZGUgaXQgYW5kIGFkZCBpdCB0byB0aGUKKy8vIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisvLyBUaGUgbGFzdCBjYWxsIHRvICdXZWJQQW5pbUVuY29kZXJBZGQnIHNob3VsZCBiZSB3aXRoIGZyYW1lID0gTlVMTCwgd2hpY2gKKy8vIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgZnJhbWVzIGFyZSB0byBiZSBhZGRlZC4gVGhpcyBjYWxsIGlzIGFsc28gdXNlZCB0bworLy8gZGV0ZXJtaW5lIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBmcmFtZS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGVuYyAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQuCisvLyAgIGZyYW1lIC0gKGluL291dCkgZnJhbWUgZGF0YSBpbiBBUkdCIG9yIFlVVihBKSBmb3JtYXQuIElmIGl0IGlzIGluIFlVVihBKQorLy8gICAgICAgICAgIGZvcm1hdCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gQVJHQiwgd2hpY2ggaW5jdXJzIGEgc21hbGwgbG9zcy4KKy8vICAgdGltZXN0YW1wX21zIC0gKGluKSB0aW1lc3RhbXAgb2YgdGhpcyBmcmFtZSBpbiBtaWxsaXNlY29uZHMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gb2YgYSBmcmFtZSB3b3VsZCBiZSBjYWxjdWxhdGVkIGFzCisvLyAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvZiBuZXh0IGZyYW1lIC0gdGltZXN0YW1wIG9mIHRoaXMgZnJhbWUiLgorLy8gICAgICAgICAgICAgICAgICAgICAgIEhlbmNlLCB0aW1lc3RhbXBzIHNob3VsZCBiZSBpbiBub24tZGVjcmVhc2luZyBvcmRlci4KKy8vICAgY29uZmlnIC0gKGluKSBlbmNvZGluZyBvcHRpb25zOyBjYW4gYmUgcGFzc2VkIE5VTEwgdG8gcGljaworLy8gICAgICAgICAgICByZWFzb25hYmxlIGRlZmF1bHRzLgorLy8gUmV0dXJuczoKKy8vICAgT24gZXJyb3IsIHJldHVybnMgZmFsc2UgYW5kIGZyYW1lLT5lcnJvcl9jb2RlIGlzIHNldCBhcHByb3ByaWF0ZWx5LgorLy8gICBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbUVuY29kZXJBZGQoCisgICAgV2ViUEFuaW1FbmNvZGVyKiBlbmMsIHN0cnVjdCBXZWJQUGljdHVyZSogZnJhbWUsIGludCB0aW1lc3RhbXBfbXMsCisgICAgY29uc3Qgc3RydWN0IFdlYlBDb25maWcqIGNvbmZpZyk7CisKKy8vIEFzc2VtYmxlIGFsbCBmcmFtZXMgYWRkZWQgc28gZmFyIGludG8gYSBXZWJQIGJpdHN0cmVhbS4KKy8vIFRoaXMgY2FsbCBzaG91bGQgYmUgcHJlY2VkZWQgYnkgIGEgY2FsbCB0byAnV2ViUEFuaW1FbmNvZGVyQWRkJyB3aXRoCisvLyBmcmFtZSA9IE5VTEw7IGlmIG5vdCwgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IGZyYW1lIHdpbGwgYmUgaW50ZXJuYWxseQorLy8gZXN0aW1hdGVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZW5jIC0gKGluL291dCkgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGZyYW1lcyBhcmUgdG8gYmUgYXNzZW1ibGVkLgorLy8gICB3ZWJwX2RhdGEgLSAob3V0KSBnZW5lcmF0ZWQgV2ViUCBiaXRzdHJlYW0uCisvLyBSZXR1cm5zOgorLy8gICBUcnVlIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIHdlYnBfZGF0YSk7CisKKy8vIEdldCBlcnJvciBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgbW9zdCByZWNlbnQgY2FsbCB1c2luZyAnZW5jJy4gVGhlCisvLyByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgJ2VuYycgYW5kIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1FbmNvZGVyQWRkKCkgb3IgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoKSBvciBXZWJQQW5pbUVuY29kZXJEZWxldGUoKS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGVuYyAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBlcnJvciBzdHJpbmcgaXMgdG8gYmUgZmV0Y2hlZC4KKy8vIFJldHVybnM6CisvLyAgIE5VTEwgaWYgJ2VuYycgaXMgTlVMTC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBlcnJvciBzdHJpbmcgaWYgdGhlIGxhc3QgY2FsbAorLy8gICB0byAnZW5jJyBoYWQgYW4gZXJyb3IsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbGFzdCBjYWxsIHdhcyBhIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBjb25zdCBjaGFyKiBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihXZWJQQW5pbUVuY29kZXIqIGVuYyk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBlbmMgLSAoaW4vb3V0KSBvYmplY3QgdG8gYmUgZGVsZXRlZAorV0VCUF9FWFRFUk4gdm9pZCBXZWJQQW5pbUVuY29kZXJEZWxldGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9XRUJQX01VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXhfdHlwZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL211eF90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4X3R5cGVzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL211eF90eXBlcy5oCmluZGV4IDdjN2FiYWMuLjBlYmQwNmYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4X3R5cGVzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4X3R5cGVzLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNlbmRpZgogI2luY2x1ZGUgIi4vdHlwZXMuaCIKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIApAQCAtMzEsMTYgKzMxLDE4IEBACiAvLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgogLy8gdHlwZWRlZiBlbnVtIFdlYlBGZWF0dXJlRmxhZ3MgV2ViUEZlYXR1cmVGbGFnczsKIC8vIHR5cGVkZWYgZW51bSBXZWJQTXV4QW5pbURpc3Bvc2UgV2ViUE11eEFuaW1EaXNwb3NlOworLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltQmxlbmQgV2ViUE11eEFuaW1CbGVuZDsKIHR5cGVkZWYgc3RydWN0IFdlYlBEYXRhIFdlYlBEYXRhOwogCiAvLyBWUDhYIEZlYXR1cmUgRmxhZ3MuCiB0eXBlZGVmIGVudW0gV2ViUEZlYXR1cmVGbGFncyB7Ci0gIEZSQUdNRU5UU19GTEFHICA9IDB4MDAwMDAwMDEsCiAgIEFOSU1BVElPTl9GTEFHICA9IDB4MDAwMDAwMDIsCiAgIFhNUF9GTEFHICAgICAgICA9IDB4MDAwMDAwMDQsCiAgIEVYSUZfRkxBRyAgICAgICA9IDB4MDAwMDAwMDgsCiAgIEFMUEhBX0ZMQUcgICAgICA9IDB4MDAwMDAwMTAsCi0gIElDQ1BfRkxBRyAgICAgICA9IDB4MDAwMDAwMjAKKyAgSUNDUF9GTEFHICAgICAgID0gMHgwMDAwMDAyMCwKKworICBBTExfVkFMSURfRkxBR1MgPSAweDAwMDAwMDNlCiB9IFdlYlBGZWF0dXJlRmxhZ3M7CiAKIC8vIERpc3Bvc2UgbWV0aG9kIChhbmltYXRpb24gb25seSkuIEluZGljYXRlcyBob3cgdGhlIGFyZWEgdXNlZCBieSB0aGUgY3VycmVudApAQCAtNTAsNiArNTIsMTMgQEAKICAgV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EICAvLyBEaXNwb3NlIHRvIGJhY2tncm91bmQgY29sb3IuCiB9IFdlYlBNdXhBbmltRGlzcG9zZTsKIAorLy8gQmxlbmQgb3BlcmF0aW9uIChhbmltYXRpb24gb25seSkuIEluZGljYXRlcyBob3cgdHJhbnNwYXJlbnQgcGl4ZWxzIG9mIHRoZQorLy8gY3VycmVudCBmcmFtZSBhcmUgYmxlbmRlZCB3aXRoIHRob3NlIG9mIHRoZSBwcmV2aW91cyBjYW52YXMuCit0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1CbGVuZCB7CisgIFdFQlBfTVVYX0JMRU5ELCAgICAgICAgICAgICAgLy8gQmxlbmQuCisgIFdFQlBfTVVYX05PX0JMRU5EICAgICAgICAgICAgLy8gRG8gbm90IGJsZW5kLgorfSBXZWJQTXV4QW5pbUJsZW5kOworCiAvLyBEYXRhIHR5cGUgdXNlZCB0byBkZXNjcmliZSAncmF3JyBkYXRhLCBlLmcuLCBjaHVuayBkYXRhCiAvLyAoSUNDIHByb2ZpbGUsIG1ldGFkYXRhKSBhbmQgV2ViUCBjb21wcmVzc2VkIGltYWdlIGRhdGEuCiBzdHJ1Y3QgV2ViUERhdGEgewpAQCAtODcsNyArOTYsNyBAQAogICByZXR1cm4gMTsKIH0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC90eXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvdHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL3R5cGVzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL3R5cGVzLmgKaW5kZXggNDU3MjA2My4uMTI3MzhmYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC90eXBlcy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL3R5cGVzLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgV0VCUF9XRUJQX1RZUEVTX0hfCiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCiAjZGVmaW5lIFdFQlBfSU5MSU5FIFNCX0NfSU5MSU5FCiAjZWxzZQpAQCAtMjIsMTAgKzIzLDExIEBACiAKICNpZm5kZWYgX01TQ19WRVIKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2lmZGVmIF9fU1RSSUNUX0FOU0lfXwotI2RlZmluZSBXRUJQX0lOTElORQotI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8ICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgXAorICAgIChkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKICNkZWZpbmUgV0VCUF9JTkxJTkUgaW5saW5lCisjZWxzZQorI2RlZmluZSBXRUJQX0lOTElORQogI2VuZGlmCiAjZWxzZQogdHlwZWRlZiBzaWduZWQgICBjaGFyIGludDhfdDsKQEAgLTQzLDcgKzQ1LDExIEBACiAjaWZuZGVmIFdFQlBfRVhURVJOCiAvLyBUaGlzIGV4cGxpY2l0bHkgbWFya3MgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGFsbG93cyBmb3IgY2hhbmdpbmcgdGhlCiAvLyBzaWduYXR1cmUgZm9yIGUuZy4sIFdpbmRvd3MgRExMIGJ1aWxkcy4KLSNkZWZpbmUgV0VCUF9FWFRFUk4odHlwZSkgZXh0ZXJuIHR5cGUKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorIyAgZGVmaW5lIFdFQlBfRVhURVJOIGV4dGVybiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCisjIGVsc2UKKyMgIGRlZmluZSBXRUJQX0VYVEVSTiBleHRlcm4KKyMgZW5kaWYgIC8qIF9fR05VQ19fID49IDQgKi8KICNlbmRpZiAgLyogV0VCUF9FWFRFUk4gKi8KIAogLy8gTWFjcm8gdG8gY2hlY2sgQUJJIGNvbXBhdGliaWxpdHkgKHNhbWUgbWFqb3IgcmV2aXNpb24gbnVtYmVyKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9SRUFETUUgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVjMDcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9SRUFETUUKQEAgLTAsMCArMSw1NiBAQAorQnVpbGRpbmc6Cis9PT09PT09PT0KKworSk5JIFNXSUcgYmluZGluZ3M6CistLS0tLS0tLS0tLS0tLS0tLS0KKyAkIGdjYyAtc2hhcmVkIC1mUElDIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1PMiBcCisgICAgICAgLUkvcGF0aC90by95b3VyL2pkay9pbmNsdWRlcyBcCisgICAgICAgbGlid2VicF9qYXZhX3dyYXAuYyBcCisgICAgICAgLWx3ZWJwIFwKKyAgICAgICAtbyBsaWJ3ZWJwX2puaS5zbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTiBQU0VVRE8gRVhBTVBMRQoraW1wb3J0IGNvbS5nb29nbGUud2VicC5saWJ3ZWJwOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgbGlid2VicF9qbmlfZXhhbXBsZSB7CisgIHN0YXRpYyB7CisgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ3ZWJwX2puaSIpOworICB9CisKKyAgLyoqCisgICAqIHVzYWdlOiBqYXZhIC1jcCBsaWJ3ZWJwLmphcjouIGxpYndlYnBfam5pX2V4YW1wbGUKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKKyAgICBmaW5hbCBpbnQgdmVyc2lvbiA9IGxpYndlYnAuV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJsaWJ3ZWJwIHZlcnNpb246ICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZlcnNpb24pKTsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGlid2VicCBtZXRob2RzOiIpOworICAgIGZpbmFsIE1ldGhvZFtdIGxpYndlYnBNZXRob2RzID0gbGlid2VicC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYndlYnBNZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGlid2VicE1ldGhvZHNbaV0pOworICAgIH0KKyAgfQorfQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBTRVVETyBFWEFNUExFCisKKyAkIGphdmFjIC1jcCBsaWJ3ZWJwLmphciBsaWJ3ZWJwX2puaV9leGFtcGxlLmphdmEKKyAkIGphdmEgLURqYXZhLmxpYnJhcnkucGF0aD0uIC1jcCBsaWJ3ZWJwLmphcjouIGxpYndlYnBfam5pX2V4YW1wbGUKKworUHl0aG9uIFNXSUcgYmluZGluZ3M6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkIHB5dGhvbiBzZXR1cC5weSBidWlsZF9leHQKKyAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0tcHJlZml4PXB5bG9jYWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU4gUFNFVURPIEVYQU1QTEUKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoZ2xvYi5nbG9iKCdweWxvY2FsL2xpYi9weXRob24qL3NpdGUtcGFja2FnZXMnKVswXSkKKworZnJvbSBjb20uZ29vZ2xlLndlYnAgaW1wb3J0IGxpYndlYnAKK3ByaW50ICJsaWJ3ZWJwIGRlY29kZXIgdmVyc2lvbjogJXgiICUgbGlid2VicC5XZWJQR2V0RGVjb2RlclZlcnNpb24oKQorCitwcmludCAibGlid2VicCBhdHRyaWJ1dGVzOiIKK2ZvciBhdHRyIGluIGRpcihsaWJ3ZWJwKTogcHJpbnQgYXR0cgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBTRVVETyBFWEFNUExFCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuZ28gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyMDVhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5nbwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgKGh0dHA6Ly93d3cuc3dpZy5vcmcpLgorICogVmVyc2lvbiAyLjAuMTAKKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGVhc2lseSByZWFkYWJsZSBhbmQgY29udGFpbnMgYSBudW1iZXIgb2YKKyAqIGNvZGluZyBjb252ZW50aW9ucyBkZXNpZ25lZCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFuZCBlZmZpY2llbmN5LiBEbyBub3QgbWFrZQorICogY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5IHRoZSBTV0lHCisgKiBpbnRlcmZhY2UgZmlsZSBpbnN0ZWFkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworcGFja2FnZSBsaWJ3ZWJwCisKK2ltcG9ydCBfICJydW50aW1lL2NnbyIKK2ltcG9ydCAidW5zYWZlIgorCit0eXBlIF8gdW5zYWZlLlBvaW50ZXIKKwordHlwZSBfc3dpZ19mbnB0ciAqYnl0ZQordHlwZSBfc3dpZ19tZW1iZXJwdHIgKmJ5dGUKKworLy9leHRlcm4gbGlid2VicFN3aWdDZ29jYWxsCitmdW5jIFN3aWdDZ29jYWxsKCkKKworLy9leHRlcm4gbGlid2VicFN3aWdDZ29jYWxsRG9uZQorZnVuYyBTd2lnQ2dvY2FsbERvbmUoKQorCisvL2V4dGVybiBsaWJ3ZWJwU3dpZ0Nnb2NhbGxCYWNrCitmdW5jIFN3aWdDZ29jYWxsQmFjaygpCisKKy8vZXh0ZXJuIGxpYndlYnBTd2lnQ2dvY2FsbEJhY2tEb25lCitmdW5jIFN3aWdDZ29jYWxsQmFja0RvbmUoKQorCitmdW5jIFdlYlBHZXREZWNvZGVyVmVyc2lvbigpIGludAorZnVuYyBXcmFwcGVkX1dlYlBHZXRJbmZvKHN0cmluZywgW11pbnQsIFtdaW50KSBpbnQKKworLy8gV2ViUEdldEluZm8gaGFzIDIgb3V0cHV0IHBhcmFtZXRlcnMsIHByb3ZpZGUgYSB2ZXJzaW9uIGluIHRoZSBtb3JlIG5hdHVyYWwKKy8vIGdvIGlkaW9tOgorZnVuYyBXZWJQR2V0SW5mbyh3ZWJwIFtdYnl0ZSkgKG9rIGJvb2wsIHdpZHRoIGludCwgaGVpZ2h0IGludCkgeworCXcgOj0gW11pbnR7MH0KKwloIDo9IFtdaW50ezB9CisJb2sgPSBXcmFwcGVkX1dlYlBHZXRJbmZvKHN0cmluZyh3ZWJwKSwgdywgaCkgIT0gMAorCXdpZHRoID0gd1swXQorCWhlaWdodCA9IGhbMF0KKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5qYXIgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzUwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5weSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYxMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnB5CkBAIC0wLDAgKzEsMTk4IEBACisjIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisjIFZlcnNpb24gMi4wLjQKKyMKKyMgRG8gbm90IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5CisjIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisKKworCitmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbl9pbmZvCitpZiB2ZXJzaW9uX2luZm8gPj0gKDIsNiwwKToKKyAgICBkZWYgc3dpZ19pbXBvcnRfaGVscGVyKCk6CisgICAgICAgIGZyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZQorICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgIGZwID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKCdfbGlid2VicCcsIFtkaXJuYW1lKF9fZmlsZV9fKV0pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGltcG9ydCBfbGlid2VicAorICAgICAgICAgICAgcmV0dXJuIF9saWJ3ZWJwCisgICAgICAgIGlmIGZwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9tb2QgPSBpbXAubG9hZF9tb2R1bGUoJ19saWJ3ZWJwJywgZnAsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIF9tb2QKKyAgICBfbGlid2VicCA9IHN3aWdfaW1wb3J0X2hlbHBlcigpCisgICAgZGVsIHN3aWdfaW1wb3J0X2hlbHBlcgorZWxzZToKKyAgICBpbXBvcnQgX2xpYndlYnAKK2RlbCB2ZXJzaW9uX2luZm8KK3RyeToKKyAgICBfc3dpZ19wcm9wZXJ0eSA9IHByb3BlcnR5CitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MgIyBQeXRob24gPCAyLjIgZG9lc24ndCBoYXZlICdwcm9wZXJ0eScuCitkZWYgX3N3aWdfc2V0YXR0cl9ub25keW5hbWljKHNlbGYsY2xhc3NfdHlwZSxuYW1lLHZhbHVlLHN0YXRpYz0xKToKKyAgICBpZiAobmFtZSA9PSAidGhpc293biIpOiByZXR1cm4gc2VsZi50aGlzLm93bih2YWx1ZSkKKyAgICBpZiAobmFtZSA9PSAidGhpcyIpOgorICAgICAgICBpZiB0eXBlKHZhbHVlKS5fX25hbWVfXyA9PSAnU3dpZ1B5T2JqZWN0JzoKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuCisgICAgbWV0aG9kID0gY2xhc3NfdHlwZS5fX3N3aWdfc2V0bWV0aG9kc19fLmdldChuYW1lLE5vbmUpCisgICAgaWYgbWV0aG9kOiByZXR1cm4gbWV0aG9kKHNlbGYsdmFsdWUpCisgICAgaWYgKG5vdCBzdGF0aWMpOgorICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWUKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiWW91IGNhbm5vdCBhZGQgYXR0cmlidXRlcyB0byAlcyIgJSBzZWxmKQorCitkZWYgX3N3aWdfc2V0YXR0cihzZWxmLGNsYXNzX3R5cGUsbmFtZSx2YWx1ZSk6CisgICAgcmV0dXJuIF9zd2lnX3NldGF0dHJfbm9uZHluYW1pYyhzZWxmLGNsYXNzX3R5cGUsbmFtZSx2YWx1ZSwwKQorCitkZWYgX3N3aWdfZ2V0YXR0cihzZWxmLGNsYXNzX3R5cGUsbmFtZSk6CisgICAgaWYgKG5hbWUgPT0gInRoaXNvd24iKTogcmV0dXJuIHNlbGYudGhpcy5vd24oKQorICAgIG1ldGhvZCA9IGNsYXNzX3R5cGUuX19zd2lnX2dldG1ldGhvZHNfXy5nZXQobmFtZSxOb25lKQorICAgIGlmIG1ldGhvZDogcmV0dXJuIG1ldGhvZChzZWxmKQorICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisKK2RlZiBfc3dpZ19yZXByKHNlbGYpOgorICAgIHRyeTogc3RydGhpcyA9ICJwcm94eSBvZiAiICsgc2VsZi50aGlzLl9fcmVwcl9fKCkKKyAgICBleGNlcHQ6IHN0cnRoaXMgPSAiIgorICAgIHJldHVybiAiPCVzLiVzOyAlcyA+IiAlIChzZWxmLl9fY2xhc3NfXy5fX21vZHVsZV9fLCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RydGhpcywpCisKK3RyeToKKyAgICBfb2JqZWN0ID0gb2JqZWN0CisgICAgX25ld2NsYXNzID0gMQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIGNsYXNzIF9vYmplY3QgOiBwYXNzCisgICAgX25ld2NsYXNzID0gMAorCisKKworZGVmIFdlYlBHZXREZWNvZGVyVmVyc2lvbigpOgorICAiIiJXZWJQR2V0RGVjb2RlclZlcnNpb24oKSAtPiBpbnQiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBHZXREZWNvZGVyVmVyc2lvbigpCisKK2RlZiBXZWJQR2V0SW5mbygqYXJncyk6CisgICIiIldlYlBHZXRJbmZvKHVpbnQ4X3QgZGF0YSkgLT4gKHdpZHRoLCBoZWlnaHQpIiIiCisgIHJldHVybiBfbGlid2VicC5XZWJQR2V0SW5mbygqYXJncykKKworZGVmIFdlYlBEZWNvZGVSR0IoKmFyZ3MpOgorICAiIiJXZWJQRGVjb2RlUkdCKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVSR0IoKmFyZ3MpCisKK2RlZiBXZWJQRGVjb2RlUkdCQSgqYXJncyk6CisgICIiIldlYlBEZWNvZGVSR0JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVSR0JBKCphcmdzKQorCitkZWYgV2ViUERlY29kZUFSR0IoKmFyZ3MpOgorICAiIiJXZWJQRGVjb2RlQVJHQih1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIiIiCisgIHJldHVybiBfbGlid2VicC5XZWJQRGVjb2RlQVJHQigqYXJncykKKworZGVmIFdlYlBEZWNvZGVCR1IoKmFyZ3MpOgorICAiIiJXZWJQRGVjb2RlQkdSKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVCR1IoKmFyZ3MpCisKK2RlZiBXZWJQRGVjb2RlQkdSQSgqYXJncyk6CisgICIiIldlYlBEZWNvZGVCR1JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVCR1JBKCphcmdzKQorCitkZWYgV2ViUEdldEVuY29kZXJWZXJzaW9uKCk6CisgICIiIldlYlBHZXRFbmNvZGVyVmVyc2lvbigpIC0+IGludCIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUEdldEVuY29kZXJWZXJzaW9uKCkKKworZGVmIHdyYXBfV2ViUEVuY29kZVJHQigqYXJncyk6CisgICIiInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiIiIgorICByZXR1cm4gX2xpYndlYnAud3JhcF9XZWJQRW5jb2RlUkdCKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlQkdSKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVCR1IoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVSR0JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVSR0JBKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlQkdSQSgqYXJncyk6CisgICIiInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiIiIgorICByZXR1cm4gX2xpYndlYnAud3JhcF9XZWJQRW5jb2RlQkdSQSgqYXJncykKKworZGVmIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQigqYXJncykKKworZGVmIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUigqYXJncykKKworZGVmIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSgqYXJncyk6CisgICIiInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiIiIgorICByZXR1cm4gX2xpYndlYnAud3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEoKmFyZ3MpCitfVU5VU0VEID0gMQorCitkZWYgV2ViUEVuY29kZVJHQihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlUkdCKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSAtPiBsb3NzeV93ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVSR0IoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlUkdCQShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlUkdCQSh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlUkdCQSgKKyAgICAgIHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvcikKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVCR1IocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKToKKyAgIiIiV2ViUEVuY29kZUJHUih1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlQkdSKAorICAgICAgcmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKQorICBpZiBsZW4od2VicFswXSkgPT0gMDoKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gd2VicFswXQorCitkZWYgV2ViUEVuY29kZUJHUkEocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKToKKyAgIiIiV2ViUEVuY29kZUJHUkEodWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIC0+IGxvc3N5X3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZUJHUkEoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlTG9zc2xlc3NSR0IocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NSR0IodWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgLT4gbG9zc2xlc3Nfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKToKKyAgIiIiV2ViUEVuY29kZUxvc3NsZXNzUkdCQSh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlTG9zc2xlc3NCR1IocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NCR1IodWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgLT4gbG9zc2xlc3Nfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKToKKyAgIiIiV2ViUEVuY29kZUxvc3NsZXNzQkdSQSh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKKyMgVGhpcyBmaWxlIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoIGNsYXNzaWMgYW5kIG5ldy1zdHlsZSBjbGFzc2VzLgorCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5zd2lnIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnN3aWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3NDhiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5zd2lnCkBAIC0wLDAgKzEsNDM1IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGlid2VicCBzd2lnIGludGVyZmFjZSBkZWZpbml0aW9uCisvLworLy8gQXV0aG9yOiBKYW1lcyBaZXJuIChqemVybkBnb29nbGUuY29tKQorCisvKgorICBHbyBiaW5kaW5nczoKKyAgJCBzd2lnIC1nbyBcCisgICAgICAgICAtb3V0ZGlyIC4gXAorICAgICAgICAgLW8gbGlid2VicF9nb193cmFwLmMgbGlid2VicC5zd2lnCisKKyAgSmF2YSBiaW5kaW5nczoKKyAgJCBta2RpciAtcCBqYXZhL2NvbS9nb29nbGUvd2VicAorICAkIHN3aWcgLWphdmEgXAorICAgICAgICAgLXBhY2thZ2UgY29tLmdvb2dsZS53ZWJwIFwKKyAgICAgICAgIC1vdXRkaXIgamF2YS9jb20vZ29vZ2xlL3dlYnAgXAorICAgICAgICAgLW8gbGlid2VicF9qYXZhX3dyYXAuYyBsaWJ3ZWJwLnN3aWcKKworICBQeXRob24gYmluZGluZ3M6CisgICQgc3dpZyAtcHl0aG9uIFwKKyAgICAgICAgIC1vdXRkaXIgLiBcCisgICAgICAgICAtbyBsaWJ3ZWJwX3B5dGhvbl93cmFwLmMgbGlid2VicC5zd2lnCisqLworCisjaWZkZWYgU1dJR1BZVEhPTgorJW1vZHVsZShwYWNrYWdlPSJjb20uZ29vZ2xlLndlYnAiKSBsaWJ3ZWJwCisjZWxzZQorJW1vZHVsZSBsaWJ3ZWJwCisjZW5kaWYgIC8qIFNXSUdQWVRIT04gKi8KKworJWluY2x1ZGUgImNvbnN0cmFpbnRzLmkiCislaW5jbHVkZSAidHlwZW1hcHMuaSIKKworI2lmZGVmIFNXSUdHTworJWFwcGx5IChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsgKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIH0KKworJXJlbmFtZSh3cmFwcGVkX1dlYlBHZXRJbmZvKSBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisjZW5kaWYgIC8qIFNXSUdHTyAqLworCisjaWZkZWYgU1dJR0pBVkEKKyVpbmNsdWRlICJhcnJheXNfamF2YS5pIjsKKyVpbmNsdWRlICJlbnVtcy5zd2ciIC8qTkI6IHJlcXVpcmVzIEpESy0xLjUrCisgICAgICAgICAgICAgICAgICAgICAgIFNlZTogaHR0cDovL3d3dy5zd2lnLm9yZy9Eb2MxLjMvSmF2YS5odG1sI2VudW1lcmF0aW9ucyAqLworCisvLyBtYXAgdWludDhfdCogc3VjaCB0aGF0IGEgYnl0ZVtdIGlzIHVzZWQKKyV7CisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorJX0KKy8vIGZyb20gYXJyYXlzX2phdmEuaSAoc2lnbmVkIGNoYXIpCitKQVZBX0FSUkFZU19ERUNMKHVpbnQ4X3QsIGpieXRlLCBCeXRlLCBVaW50OCkKK0pBVkFfQVJSQVlTX0lNUEwodWludDhfdCwgamJ5dGUsIEJ5dGUsIFVpbnQ4KQorSkFWQV9BUlJBWVNfVFlQRU1BUFModWludDhfdCwgYnl0ZSwgamJ5dGUsIFVpbnQ4LCAiW0IiKQorJWFwcGx5IHVpbnQ4X3RbXSB7IHVpbnQ4X3QqIH0KKyNlbmRpZiAgLyogU1dJR0pBVkEgKi8KKworI2lmZGVmIFNXSUdQWVRIT04KKyVhcHBseSAoY2hhciogU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB7IChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB9CisldHlwZW1hcChvdXQpIHVpbnQ4X3QqIHsKKyAgJHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKSQxLAorICAgICAgKCQxID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiJHN5bW5hbWUiLCBhcmczLCBhcmc0KSk7Cit9CisKKyV0eXBlbWFwIChpbikgY29uc3QgdWludDhfdCogcmdiIChQeV9idWZmZXIgcmdiX2J1ZmZlcikgeworICAvLyBOQjogd2l0aCBQeXRob24gPCAyLjYgdGhlIG9sZCBzdHlsZSBidWZmZXIgcHJvdG9jb2wgbWF5IGJlIHVzZWQ6CisgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoJGlucHV0LCAoY29uc3Qgdm9pZCoqKSgmJDEpLCAmdW51c2VkKTsKKyAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcigkaW5wdXQpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiBtZXRob2QgJyRzeW1uYW1lJywgYXJndW1lbnQgJGFyZ251bSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICB9CisgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoJGlucHV0LCAmcmdiX2J1ZmZlciwgUHlCVUZfU0lNUExFKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW4gbWV0aG9kICckc3ltbmFtZScsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgfQorICAkMSA9ICgkMV9sdHlwZSlyZ2JfYnVmZmVyLmJ1ZjsKK30KKworJXR5cGVtYXAoZnJlZWFyZykgY29uc3QgdWludDhfdCogcmdiIHsKKyAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlciRhcmdudW0pOworfQorCislZGVmaW5lIERFQ09ERV9BVVRPRE9DKGZ1bmMpCislZmVhdHVyZSgiYXV0b2RvYyIsICNmdW5jICIodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIpIGZ1bmM7CislZW5kZGVmCisKKyVmZWF0dXJlKCJhdXRvZG9jIiwgIjEiKTsKK0RFQ09ERV9BVVRPRE9DKFdlYlBEZWNvZGVSR0IpOworREVDT0RFX0FVVE9ET0MoV2ViUERlY29kZVJHQkEpOworREVDT0RFX0FVVE9ET0MoV2ViUERlY29kZUFSR0IpOworREVDT0RFX0FVVE9ET0MoV2ViUERlY29kZUJHUik7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlQkdSQSk7CislZmVhdHVyZSgiYXV0b2RvYyIsICJXZWJQR2V0SW5mbyh1aW50OF90IGRhdGEpIC0+ICh3aWR0aCwgaGVpZ2h0KSIpIFdlYlBHZXRJbmZvOworI2VuZGlmICAvKiBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGVyIHNwZWNpZmljCisKKyVhcHBseSBpbnQqIE9VVFBVVCB7IGludCogd2lkdGgsIGludCogaGVpZ2h0IH0KKworaW50IFdlYlBHZXREZWNvZGVyVmVyc2lvbih2b2lkKTsKK2ludCBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworI2lmIGRlZmluZWQoU1dJR0pBVkEpIHx8IGRlZmluZWQoU1dJR1BZVEhPTikKKworLy8gZnJlZSB0aGUgYnVmZmVyIHJldHVybmVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBhZnRlciBjb3B5aW5nIGludG8KKy8vIHRoZSBuYXRpdmUgdHlwZQorJW5ld29iamVjdCBXZWJQRGVjb2RlUkdCOworJW5ld29iamVjdCBXZWJQRGVjb2RlUkdCQTsKKyVuZXdvYmplY3QgV2ViUERlY29kZUFSR0I7CislbmV3b2JqZWN0IFdlYlBEZWNvZGVCR1I7CislbmV3b2JqZWN0IFdlYlBEZWNvZGVCR1JBOworJXR5cGVtYXAobmV3ZnJlZSkgdWludDhfdCogImZyZWUoJDEpOyIKKwordWludDhfdCogV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Cit1aW50OF90KiBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwordWludDhfdCogV2ViUERlY29kZUFSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK3VpbnQ4X3QqIFdlYlBEZWNvZGVCR1IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwordWludDhfdCogV2ViUERlY29kZUJHUkEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGVyIHNwZWNpZmljCisKKyNpZiBkZWZpbmVkKFNXSUdKQVZBKSB8fCBkZWZpbmVkKFNXSUdQWVRIT04pCisKK2ludCBXZWJQR2V0RW5jb2RlclZlcnNpb24odm9pZCk7CisKKyNlbmRpZiAgLyogU1dJR0pBVkEgfHwgU1dJR1BZVEhPTiAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV3JhcHBlciBjb2RlIGFkZGl0aW9ucworCisleworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyV9CisKKyNpZmRlZiBTV0lHSkFWQQorJXsKKyNkZWZpbmUgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5IFwKKyAgICAocmVzdWx0ID8gKGppbnQpUmV0dXJuZWRCdWZmZXJTaXplKF9fRlVOQ1RJT05fXywgYXJnMywgYXJnNCkgOiAwKQorJX0KKyNlbmRpZiAgLyogU1dJR0pBVkEgKi8KKworI2lmIGRlZmluZWQoU1dJR0pBVkEpIHx8IGRlZmluZWQoU1dJR1BZVEhPTikKKyV7CitzdGF0aWMgc2l6ZV90IFJldHVybmVkQnVmZmVyU2l6ZSgKKyAgICBjb25zdCBjaGFyKiBmdW5jdGlvbiwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBzaXplbWFwIHsKKyAgICBjb25zdCBjaGFyKiBmdW5jdGlvbjsKKyAgICBpbnQgc2l6ZV9tdWx0aXBsaWVyOworICB9IHNpemVfbWFwW10gPSB7CisjaWZkZWYgU1dJR0pBVkEKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0IiLCAgMyB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQkEiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQVJHQiIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1IiLCAgMyB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUkEiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCAxIH0sCisjZW5kaWYKKyNpZmRlZiBTV0lHUFlUSE9OCisgICAgeyAiV2ViUERlY29kZVJHQiIsICAzIH0sCisgICAgeyAiV2ViUERlY29kZVJHQkEiLCA0IH0sCisgICAgeyAiV2ViUERlY29kZUFSR0IiLCA0IH0sCisgICAgeyAiV2ViUERlY29kZUJHUiIsICAzIH0sCisgICAgeyAiV2ViUERlY29kZUJHUkEiLCA0IH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlUkdCIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVCR1IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZVJHQkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlQkdSQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCAxIH0sCisjZW5kaWYKKyAgICB7IE5VTEwsIDAgfQorICB9OworICBjb25zdCBzdHJ1Y3Qgc2l6ZW1hcCogcDsKKyAgc2l6ZV90IHNpemUgPSAwOworCisgIGZvciAocCA9IHNpemVfbWFwOyBwLT5mdW5jdGlvbjsgKytwKSB7CisgICAgaWYgKCFzdHJjbXAoZnVuY3Rpb24sIHAtPmZ1bmN0aW9uKSkgeworICAgICAgc2l6ZSA9ICp3aWR0aCAqICpoZWlnaHQgKiBwLT5zaXplX211bHRpcGxpZXI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKyV9CisKKyV7Cit0eXBlZGVmIHNpemVfdCAoKldlYlBFbmNvZGVGdW5jdGlvbikoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7Cit0eXBlZGVmIHNpemVfdCAoKldlYlBFbmNvZGVMb3NzbGVzc0Z1bmN0aW9uKShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKKworc3RhdGljIHVpbnQ4X3QqIEVuY29kZUxvc3N5KGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kZUZ1bmN0aW9uIGVuY2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0cHV0X3NpemUsIGludCogdW51c2VkKSB7CisgIHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBpbWFnZV9zaXplID0KKyAgICAgIGVuY2ZuKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvciwgJm91dHB1dCk7CisgIC8vIHRoZSB2YWx1ZXMgb2YgZm9sbG93aW5nIHR3byB3aWxsIGJlIGludGVycHJldGVkIGJ5IFJldHVybmVkQnVmZmVyU2l6ZSgpCisgIC8vIGFzICd3aWR0aCcgYW5kICdoZWlnaHQnIGluIHRoZSBzaXplIGNhbGN1bGF0aW9uLgorICAqb3V0cHV0X3NpemUgPSBpbWFnZV9zaXplOworICAqdW51c2VkID0gMTsKKyAgcmV0dXJuIGltYWdlX3NpemUgPyBvdXRwdXQgOiBOVUxMOworfQorCitzdGF0aWMgdWludDhfdCogRW5jb2RlTG9zc2xlc3MoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RlTG9zc2xlc3NGdW5jdGlvbiBlbmNmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dHB1dF9zaXplLCBpbnQqIHVudXNlZCkgeworICB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBjb25zdCBzaXplX3QgaW1hZ2Vfc2l6ZSA9IGVuY2ZuKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAmb3V0cHV0KTsKKyAgLy8gdGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIHR3byB3aWxsIGJlIGludGVycHJldGVkIGJ5CisgIC8vIFJldHVybmVkQnVmZmVyU2l6ZSgpIGFzICd3aWR0aCcgYW5kICdoZWlnaHQnIGluIHRoZSBzaXplIGNhbGN1bGF0aW9uLgorICAqb3V0cHV0X3NpemUgPSBpbWFnZV9zaXplOworICAqdW51c2VkID0gMTsKKyAgcmV0dXJuIGltYWdlX3NpemUgPyBvdXRwdXQgOiBOVUxMOworfQorJX0KKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsaWJ3ZWJwL2VuY29kZSB3cmFwcGVyIGZ1bmN0aW9ucworCisjaWYgZGVmaW5lZChTV0lHSkFWQSkgfHwgZGVmaW5lZChTV0lHUFlUSE9OKQorCislYXBwbHkgaW50KiBJTlBVVCB7IGludCogdW51c2VkMSwgaW50KiB1bnVzZWQyIH0KKyVhcHBseSBpbnQqIE9VVFBVVCB7IGludCogb3V0cHV0X3NpemUgfQorCisvLyBmcmVlIHRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlc2UgZnVuY3Rpb25zIGFmdGVyIGNvcHlpbmcgaW50bworLy8gdGhlIG5hdGl2ZSB0eXBlCislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZVJHQjsKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlQkdSOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVSR0JBOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVCR1JBOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQjsKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1I7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQTsKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBOworCisjaWZkZWYgU1dJR0pBVkEKKy8vIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIGNhbGwgdGhlc2UgZGlyZWN0bHkKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZVJHQiAicHJpdmF0ZSI7CislamF2YW1ldGhvZG1vZGlmaWVycyB3cmFwX1dlYlBFbmNvZGVCR1IgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlUkdCQSAicHJpdmF0ZSI7CislamF2YW1ldGhvZG1vZGlmaWVycyB3cmFwX1dlYlBFbmNvZGVCR1JBICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSAicHJpdmF0ZSI7CislamF2YW1ldGhvZG1vZGlmaWVycyB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEgInByaXZhdGUiOworI2VuZGlmICAvKiBTV0lHSkFWQSAqLworCisjaWZkZWYgU1dJR1BZVEhPTgorLy8gVGhpcyBhdXRvZG9jIHdpbGwgc2VydmUgYXMgYSBjYXRjaC1hbGwgZm9yIHdyYXBfKi4KKyVmZWF0dXJlKCJhdXRvZG9jIiwgInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiIpOworI2VuZGlmCisKKyVpbmxpbmUgJXsKKy8vIENoYW5nZXMgdGhlIHJldHVybiB0eXBlIG9mIFdlYlBFbmNvZGUqIHRvIG1vcmUgY2xvc2VseSBtYXRjaCBEZWNvZGUqLgorLy8gVGhpcyBhbHNvIG1ha2VzIGl0IGVhc2llciB0byB3cmFwIHRoZSBvdXRwdXQgYnVmZmVyIGluIGEgbmF0aXZlIHR5cGUgcmF0aGVyCisvLyB0aGFuIGRlYWxpbmcgd2l0aCB0aGUgcmV0dXJuIHBvaW50ZXIuCisvLyBUaGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSB0byBhbGxvdyByZXVzZSBvZiBSZXR1cm5lZEJ1ZmZlclNpemUoKSwKKy8vIHVudXNlZDIgYW5kIG91dHB1dF9zaXplIHdpbGwgYmUgdXNlZCBpbiB0aGlzIGNhc2UuCisjZGVmaW5lIExPU1NZX1dSQVBQRVIoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB1aW50OF90KiB3cmFwXyMjRlVOQyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCogdW51c2VkMSwgaW50KiB1bnVzZWQyLCBpbnQqIG91dHB1dF9zaXplLCBcCisgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSB7ICAgICAgICBcCisgICAgcmV0dXJuIEVuY29kZUxvc3N5KHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvciwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIEZVTkMsIG91dHB1dF9zaXplLCB1bnVzZWQyKTsgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQikKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUikKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQkEpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1JBKQorCisjdW5kZWYgTE9TU1lfV1JBUFBFUgorCisjZGVmaW5lIExPU1NMRVNTX1dSQVBQRVIoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB1aW50OF90KiB3cmFwXyMjRlVOQyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCogdW51c2VkMSwgaW50KiB1bnVzZWQyLCBpbnQqIG91dHB1dF9zaXplLCBcCisgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEVuY29kZUxvc3NsZXNzKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkMsIG91dHB1dF9zaXplLCB1bnVzZWQyKTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1IpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEpCisKKyN1bmRlZiBMT1NTTEVTU19XUkFQUEVSCisKKyV9CisKKyNlbmRpZiAgLyogU1dJR0pBVkEgfHwgU1dJR1BZVEhPTiAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMKKworI2lmZGVmIFNXSUdHTworJWluc2VydChnb193cmFwcGVyKSAleworCisvLyBXZWJQR2V0SW5mbyBoYXMgMiBvdXRwdXQgcGFyYW1ldGVycywgcHJvdmlkZSBhIHZlcnNpb24gaW4gdGhlIG1vcmUgbmF0dXJhbAorLy8gZ28gaWRpb206CitmdW5jIFdlYlBHZXRJbmZvKHdlYnAgW11ieXRlKSAob2sgYm9vbCwgd2lkdGggaW50LCBoZWlnaHQgaW50KSB7CisgICAgdyA6PSBbXWludHswfQorICAgIGggOj0gW11pbnR7MH0KKyAgICBvayA9IFdyYXBwZWRfV2ViUEdldEluZm8oc3RyaW5nKHdlYnApLCB3LCBoKSAhPSAwCisgICAgd2lkdGggPSB3WzBdCisgICAgaGVpZ2h0ID0gaFswXQorICAgIHJldHVybgorfQorCislfQorI2VuZGlmICAvKiBTV0lHR08gKi8KKworI2lmZGVmIFNXSUdKQVZBCisleworLyogV29yayBhcm91bmQgYnJva2VuIGdjaiBqbmkuaCAqLworI2lmZGVmIF9fR0NKX0pOSV9IX18KKyMgdW5kZWYgSk5JRVhQT1JUCisjIGRlZmluZSBKTklFWFBPUlQKKyMgdW5kZWYgSk5JQ0FMTAorIyBkZWZpbmUgSk5JQ0FMTAorI2VuZGlmCislfQorCislcHJhZ21hKGphdmEpIG1vZHVsZWNvZGU9JXsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOVVNFRCA9IDE7CisgIHByaXZhdGUgc3RhdGljIGludCBvdXRwdXRTaXplW10gPSB7IDAgfTsKKyV9CisKKworJWRlZmluZSBDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKGZ1bmMpCislcHJhZ21hKGphdmEpIG1vZHVsZWNvZGU9JXsKKyAgcHVibGljIHN0YXRpYyBieXRlW10gZnVuYygKKyAgICAgIGJ5dGVbXSByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIHsKKyAgICByZXR1cm4gd3JhcF8jI2Z1bmMoCisgICAgICAgIHJnYiwgVU5VU0VELCBVTlVTRUQsIG91dHB1dFNpemUsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOworICB9CislfQorJWVuZGRlZgorCislZGVmaW5lIENBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoZnVuYykKKyVwcmFnbWEoamF2YSkgbW9kdWxlY29kZT0leworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBmdW5jKAorICAgICAgYnl0ZVtdIHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7CisgICAgcmV0dXJuIHdyYXBfIyNmdW5jKAorICAgICAgICByZ2IsIFVOVVNFRCwgVU5VU0VELCBvdXRwdXRTaXplLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworICB9CislfQorJWVuZGRlZgorCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1IpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEpCisjZW5kaWYgIC8qIFNXSUdKQVZBICovCisKKyNpZmRlZiBTV0lHUFlUSE9OCislcHl0aG9uY29kZSAleworX1VOVVNFRCA9IDEKKyV9CisKKyVkZWZpbmUgQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihmdW5jKQorJXB5dGhvbmNvZGUgJXsKK2RlZiBmdW5jKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik6CisgICIiImZ1bmModWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIC0+IGxvc3N5X3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfIyNmdW5jKAorICAgICAgcmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKQorICBpZiBsZW4od2VicFswXSkgPT0gMDoKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gd2VicFswXQorJX0KKyVlbmRkZWYKKworJWRlZmluZSBDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKGZ1bmMpCislcHl0aG9uY29kZSAleworZGVmIGZ1bmMocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJmdW5jKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIC0+IGxvc3NsZXNzX3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfIyNmdW5jKHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKQorICBpZiBsZW4od2VicFswXSkgPT0gMDoKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gd2VicFswXQorJX0KKyVlbmRkZWYKKworQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCQSkKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUikKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUkEpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQikKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSkKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKQorI2VuZGlmICAvKiBTV0lHUFlUSE9OICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfZ2MuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGI3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfZ2MuYwpAQCAtMCwwICsxLDUyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgKGh0dHA6Ly93d3cuc3dpZy5vcmcpLgorICogVmVyc2lvbiAyLjAuMTAKKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGVhc2lseSByZWFkYWJsZSBhbmQgY29udGFpbnMgYSBudW1iZXIgb2YKKyAqIGNvZGluZyBjb252ZW50aW9ucyBkZXNpZ25lZCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFuZCBlZmZpY2llbmN5LiBEbyBub3QgbWFrZQorICogY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5IHRoZSBTV0lHCisgKiBpbnRlcmZhY2UgZmlsZSBpbnN0ZWFkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBmaWxlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIDZjLzhjLiAgKi8KKyNwcmFnbWEgZHluaW1wb3J0IF8gXyAibGlid2VicF9nby5zbyIKKworI2luY2x1ZGUgInJ1bnRpbWUuaCIKKyNpbmNsdWRlICJjZ29jYWxsLmgiCisKKyNpZmRlZiBfNjRCSVQKKyNkZWZpbmUgU1dJR19QQVJNX1NJWkUgOAorI2Vsc2UKKyNkZWZpbmUgU1dJR19QQVJNX1NJWkUgNAorI2VuZGlmCisKKyNwcmFnbWEgZHluaW1wb3J0IF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbiBfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24gIiIKK2V4dGVybiB2b2lkICgqX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uKSh2b2lkKik7CitzdGF0aWMgdm9pZCAoKnhfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24pKHZvaWQqKSA9IF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbjsKKwordm9pZAorwrdXZWJQR2V0RGVjb2RlclZlcnNpb24oc3RydWN0IHsKKyAgdWludDggeFtTV0lHX1BBUk1fU0laRV07Cit9IHApCisKK3sKKyAgcnVudGltZcK3Y2dvY2FsbCh4X3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uLCAmcCk7Cit9CisKKworCisjcHJhZ21hIGR5bmltcG9ydCBfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvIF93cmFwX3dyYXBwZWRfV2ViUEdldEluZm8gIiIKK2V4dGVybiB2b2lkICgqX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbykodm9pZCopOworc3RhdGljIHZvaWQgKCp4X3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbykodm9pZCopID0gX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbzsKKwordm9pZAorwrdXcmFwcGVkX1dlYlBHZXRJbmZvKHN0cnVjdCB7CisgIHVpbnQ4IHhbKDIgKiBTV0lHX1BBUk1fU0laRSkgKyAoMyAqIFNXSUdfUEFSTV9TSVpFKSArICgzICogU1dJR19QQVJNX1NJWkUpICsgU1dJR19QQVJNX1NJWkVdOworfSBwKQorCit7CisgIHJ1bnRpbWXCt2Nnb2NhbGwoeF93cmFwX3dyYXBwZWRfV2ViUEdldEluZm8sICZwKTsKK30KKworCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nb193cmFwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfZ29fd3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MWQ1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfZ29fd3JhcC5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgKGh0dHA6Ly93d3cuc3dpZy5vcmcpLgorICogVmVyc2lvbiAyLjAuMTAKKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGVhc2lseSByZWFkYWJsZSBhbmQgY29udGFpbnMgYSBudW1iZXIgb2YKKyAqIGNvZGluZyBjb252ZW50aW9ucyBkZXNpZ25lZCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFuZCBlZmZpY2llbmN5LiBEbyBub3QgbWFrZQorICogY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5IHRoZSBTV0lHCisgKiBpbnRlcmZhY2UgZmlsZSBpbnN0ZWFkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU1dJR01PRFVMRSBsaWJ3ZWJwCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgc2VjdGlvbiBjb250YWlucyBnZW5lcmljIFNXSUcgbGFiZWxzIGZvciBtZXRob2QvdmFyaWFibGUKKyAqICBkZWNsYXJhdGlvbnMvYXR0cmlidXRlcywgYW5kIG90aGVyIGNvbXBpbGVyIGRlcGVuZGVudCBsYWJlbHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMgdGhhdCBjYW5ub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgQysrIHN0YW5kYXJkICovCisjaWZuZGVmIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgaWYgZGVmaW5lZChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDw9IDB4NTYwKQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLyogTmVlZGVkIGV2ZW4gd2l0aCBgYUNDIC1BQScgd2hlbiBgYUNDIC1WJyByZXBvcnRzIEhQIEFOU0kgQysrIEIzOTEwQiBBLjAzLjU1ICovCisvKiBJZiB3ZSBmaW5kIGEgbWF4aW11bSB2ZXJzaW9uIHRoYXQgcmVxdWlyZXMgdGhpcywgdGhlIHRlc3Qgd291bGQgYmUgX19IUF9hQ0MgPD0gMzU1MDAgZm9yIEEuMDMuNTUgKi8KKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsc2UKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGVuZGlmCisjZW5kaWYKKworLyogaW5saW5lIGF0dHJpYnV0ZSAqLworI2lmbmRlZiBTV0lHSU5MSU5FCisjIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pKQorIyAgIGRlZmluZSBTV0lHSU5MSU5FIGlubGluZQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdJTkxJTkUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBhdHRyaWJ1dGUgcmVjb2duaXNlZCBieSBzb21lIGNvbXBpbGVycyB0byBhdm9pZCAndW51c2VkJyB3YXJuaW5ncyAqLworI2lmbmRlZiBTV0lHVU5VU0VECisjIGlmIGRlZmluZWQoX19HTlVDX18pCisjICAgaWYgIShkZWZpbmVkKF9fY3BsdXNwbHVzKSkgfHwgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSkKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRAorIyAgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0lDQykKKyMgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR19NU0NfVU5TVVBQUkVTU180NTA1CisjIGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1MDUpIC8qIHVucmVmZXJlbmNlZCBsb2NhbCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHVU5VU0VEUEFSTQorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApIHAgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGludGVybmFsIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk4KKyMgZGVmaW5lIFNXSUdJTlRFUk4gc3RhdGljIFNXSUdVTlVTRUQKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBpbmxpbmUgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTklOTElORQorIyBkZWZpbmUgU1dJR0lOVEVSTklOTElORSBTV0lHSU5URVJOIFNXSUdJTkxJTkUKKyNlbmRpZgorCisvKiBleHBvcnRpbmcgbWV0aG9kcyAqLworI2lmIChfX0dOVUNfXyA+PSA0KSB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorIyAgaWZuZGVmIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgICAgZGVmaW5lIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHRVhQT1JUCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGlmIGRlZmluZWQoU1RBVElDX0xJTktFRCkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgZW5kaWYKKyMgZWxzZQorIyAgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoR0NDX0hBU0NMQVNTVklTSUJJTElUWSkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBXaW5kb3dzICovCisjaWZuZGVmIFNXSUdTVERDQUxMCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTCBfX3N0ZGNhbGwKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTAorIyBlbmRpZgorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIEMgc3RhbmRhcmQgcnVudGltZSBmdW5jdGlvbnMgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBtZXRob2RzIGluIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisKK3R5cGVkZWYgbG9uZyBsb25nIGludGdvOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludGdvOworCisKKwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyICpwOyBpbnRnbyBuOyB9IF9nb3N0cmluZ187Cit0eXBlZGVmIHN0cnVjdCB7IHZvaWQqIGFycmF5OyBpbnRnbyBsZW47IGludGdvIGNhcDsgfSBfZ29zbGljZV87CisKKworCisKKyNkZWZpbmUgc3dpZ2dvX3NpemVfYXNzZXJ0X2VxKHgsIHksIG5hbWUpIHR5cGVkZWYgY2hhciBuYW1lWyh4LXkpKih4LXkpKi0yKzFdOworI2RlZmluZSBzd2lnZ29fc2l6ZV9hc3NlcnQodCwgbikgc3dpZ2dvX3NpemVfYXNzZXJ0X2VxKHNpemVvZih0KSwgbiwgc3dpZ2dvX3NpemVvZl8jI3QjI19pc19ub3RfIyNuKQorCitzd2lnZ29fc2l6ZV9hc3NlcnQoY2hhciwgMSkKK3N3aWdnb19zaXplX2Fzc2VydChzaG9ydCwgMikKK3N3aWdnb19zaXplX2Fzc2VydChpbnQsIDQpCit0eXBlZGVmIGxvbmcgbG9uZyBzd2lnZ29fbG9uZ19sb25nOworc3dpZ2dvX3NpemVfYXNzZXJ0KHN3aWdnb19sb25nX2xvbmcsIDgpCitzd2lnZ29fc2l6ZV9hc3NlcnQoZmxvYXQsIDQpCitzd2lnZ29fc2l6ZV9hc3NlcnQoZG91YmxlLCA4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gdm9pZCBjcm9zc2NhbGwyKHZvaWQgKCpmbikodm9pZCAqLCBpbnQpLCB2b2lkICosIGludCk7CitleHRlcm4gdm9pZCBfY2dvX2FsbG9jYXRlKHZvaWQgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9jZ29fcGFuaWModm9pZCAqLCBpbnQpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgKl9zd2lnX2dvYWxsb2NhdGUoc2l6ZV90IGxlbikgeworICBzdHJ1Y3QgeworICAgIHNpemVfdCBsZW47CisgICAgdm9pZCAqcmV0OworICB9IGE7CisgIGEubGVuID0gbGVuOworICBjcm9zc2NhbGwyKF9jZ29fYWxsb2NhdGUsICZhLCAoaW50KSBzaXplb2YgYSk7CisgIHJldHVybiBhLnJldDsKK30KKworc3RhdGljIHZvaWQgX3N3aWdfZ29wYW5pYyhjb25zdCBjaGFyICpwKSB7CisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqcDsKKyAgfSBhOworICBhLnAgPSBwOworICBjcm9zc2NhbGwyKF9jZ29fcGFuaWMsICZhLCAoaW50KSBzaXplb2YgYSk7Cit9CisKKworCisKK3N0YXRpYyBfZ29zdHJpbmdfIF9zd2lnX21ha2Vnb3N0cmluZyhjb25zdCBjaGFyICpwLCBzaXplX3QgbCkgeworICBfZ29zdHJpbmdfIHJldDsKKyAgcmV0LnAgPSAoY2hhciopX3N3aWdfZ29hbGxvY2F0ZShsICsgMSk7CisgIG1lbWNweShyZXQucCwgcCwgbCk7CisgIHJldC5uID0gbDsKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBTV0lHX2NvbnRyYWN0X2Fzc2VydChleHByLCBtc2cpIFwKKyAgaWYgKCEoZXhwcikpIHsgX3N3aWdfZ29wYW5pYyhtc2cpOyB9IGVsc2UKKworCisjZGVmaW5lIFNXSUdfZXhjZXB0aW9uKGNvZGUsIG1zZykgX3N3aWdfZ29wYW5pYyhtc2cpCisKKworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkCitfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24odm9pZCAqc3dpZ192KQoreworICBpbnQgcmVzdWx0OworCisgIHN0cnVjdCBzd2lnYXJncyB7CisgICAgbG9uZyA6IDA7CisgICAgaW50Z28gcmVzdWx0OworICB9ICpzd2lnX2EgPSAoc3RydWN0IHN3aWdhcmdzICopIHN3aWdfdjsKKworCisgIHJlc3VsdCA9IChpbnQpV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgIHN3aWdfYS0+cmVzdWx0ID0gcmVzdWx0OworfQorCisKK3ZvaWQKK193cmFwX3dyYXBwZWRfV2ViUEdldEluZm8odm9pZCAqc3dpZ192KQoreworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlc3VsdDsKKworICBzdHJ1Y3Qgc3dpZ2FyZ3MgeworICAgIF9nb3N0cmluZ18gYXJnMTsKKyAgICBfZ29zbGljZV8gYXJnMzsKKyAgICBfZ29zbGljZV8gYXJnNDsKKyAgICBsb25nIDogMDsKKyAgICBpbnRnbyByZXN1bHQ7CisgIH0gKnN3aWdfYSA9IChzdHJ1Y3Qgc3dpZ2FyZ3MgKikgc3dpZ192OworCisKKyAgYXJnMSA9ICh1aW50OF90ICopc3dpZ19hLT5hcmcxLnA7CisgIGFyZzIgPSAoc2l6ZV90KXN3aWdfYS0+YXJnMS5uOworCisgIHsKKyAgICBpZiAoc3dpZ19hLT5hcmczLmxlbiA9PSAwKSB7CisgICAgICBfc3dpZ19nb3BhbmljKCJhcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgfQorICAgIGFyZzMgPSAmdGVtcDM7CisgIH0KKyAgeworICAgIGlmIChzd2lnX2EtPmFyZzQubGVuID09IDApIHsKKyAgICAgIF9zd2lnX2dvcGFuaWMoImFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorCisgIHJlc3VsdCA9IChpbnQpV2ViUEdldEluZm8oKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAgc3dpZ19hLT5yZXN1bHQgPSByZXN1bHQ7CisgIHsKKyAgICBpbnQqIGEgPSAoaW50ICopIHN3aWdfYS0+YXJnMy5hcnJheTsKKyAgICBhWzBdID0gdGVtcDM7CisgIH0KKyAgeworICAgIGludCogYSA9IChpbnQgKikgc3dpZ19hLT5hcmc0LmFycmF5OworICAgIGFbMF0gPSB0ZW1wNDsKKyAgfQorCisKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfamF2YV93cmFwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfamF2YV93cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNGIxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9qYXZhX3dyYXAuYwpAQCAtMCwwICsxLDE3NjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC40CisgKgorICogVGhpcyBmaWxlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBlYXNpbHkgcmVhZGFibGUgYW5kIGNvbnRhaW5zIGEgbnVtYmVyIG9mCisgKiBjb2RpbmcgY29udmVudGlvbnMgZGVzaWduZWQgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBhbmQgZWZmaWNpZW5jeS4gRG8gbm90IG1ha2UKKyAqIGNoYW5nZXMgdG8gdGhpcyBmaWxlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmctLW1vZGlmeSB0aGUgU1dJRworICogaW50ZXJmYWNlIGZpbGUgaW5zdGVhZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU1dJR0pBVkEKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZ2VuZXJpYyBTV0lHIGxhYmVscyBmb3IgbWV0aG9kL3ZhcmlhYmxlCisgKiAgZGVjbGFyYXRpb25zL2F0dHJpYnV0ZXMsIGFuZCBvdGhlciBjb21waWxlciBkZXBlbmRlbnQgbGFiZWxzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgY29tcGlsZXJzIHRoYXQgY2Fubm90IGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIEMrKyBzdGFuZGFyZCAqLworI2lmbmRlZiBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8PSAweDU2MCkKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKKy8qIE5lZWRlZCBldmVuIHdpdGggYGFDQyAtQUEnIHdoZW4gYGFDQyAtVicgcmVwb3J0cyBIUCBBTlNJIEMrKyBCMzkxMEIgQS4wMy41NSAqLworLyogSWYgd2UgZmluZCBhIG1heGltdW0gdmVyc2lvbiB0aGF0IHJlcXVpcmVzIHRoaXMsIHRoZSB0ZXN0IHdvdWxkIGJlIF9fSFBfYUNDIDw9IDM1NTAwIGZvciBBLjAzLjU1ICovCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbHNlCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGlubGluZSBhdHRyaWJ1dGUgKi8KKyNpZm5kZWYgU1dJR0lOTElORQorIyBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSkKKyMgICBkZWZpbmUgU1dJR0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHSU5MSU5FCisjIGVuZGlmCisjZW5kaWYKKworLyogYXR0cmlidXRlIHJlY29nbmlzZWQgYnkgc29tZSBjb21waWxlcnMgdG8gYXZvaWQgJ3VudXNlZCcgd2FybmluZ3MgKi8KKyNpZm5kZWYgU1dJR1VOVVNFRAorIyBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgIGlmICEoZGVmaW5lZChfX2NwbHVzcGx1cykpIHx8IChfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkpCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19JQ0MpCisjICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdfTVNDX1VOU1VQUFJFU1NfNDUwNQorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NTA1KSAvKiB1bnJlZmVyZW5jZWQgbG9jYWwgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR1VOVVNFRFBBUk0KKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKSBwIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOCisjIGRlZmluZSBTV0lHSU5URVJOIHN0YXRpYyBTV0lHVU5VU0VECisjZW5kaWYKKworLyogaW50ZXJuYWwgaW5saW5lIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk5JTkxJTkUKKyMgZGVmaW5lIFNXSUdJTlRFUk5JTkxJTkUgU1dJR0lOVEVSTiBTV0lHSU5MSU5FCisjZW5kaWYKKworLyogZXhwb3J0aW5nIG1ldGhvZHMgKi8KKyNpZiAoX19HTlVDX18gPj0gNCkgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKKyMgIGlmbmRlZiBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICAgIGRlZmluZSBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR0VYUE9SVAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBpZiBkZWZpbmVkKFNUQVRJQ19MSU5LRUQpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgIGVuZGlmCisjIGVsc2UKKyMgICBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogY2FsbGluZyBjb252ZW50aW9ucyBmb3IgV2luZG93cyAqLworI2lmbmRlZiBTV0lHU1REQ0FMTAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBkZWZpbmUgU1dJR1NURENBTEwgX19zdGRjYWxsCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1NURENBTEwKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBDIHN0YW5kYXJkIHJ1bnRpbWUgZnVuY3Rpb25zICovCisjaWYgIWRlZmluZWQoU1dJR19OT19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgbWV0aG9kcyBpbiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisKKworLyogRml4IGZvciBqbG9uZyBvbiBzb21lIHZlcnNpb25zIG9mIGdjYyBvbiBXaW5kb3dzICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyAgdHlwZWRlZiBsb25nIGxvbmcgX19pbnQ2NDsKKyNlbmRpZgorCisvKiBGaXggZm9yIGpsb25nIG9uIDY0LWJpdCB4ODYgU29sYXJpcyAqLworI2lmIGRlZmluZWQoX194ODZfNjQpCisjIGlmZGVmIF9MUDY0CisjICAgdW5kZWYgX0xQNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworLyogU3VwcG9ydCBmb3IgdGhyb3dpbmcgSmF2YSBleGNlcHRpb25zICovCit0eXBlZGVmIGVudW0geworICBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yID0gMSwKKyAgU1dJR19KYXZhSU9FeGNlcHRpb24sCisgIFNXSUdfSmF2YVJ1bnRpbWVFeGNlcHRpb24sCisgIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sCisgIFNXSUdfSmF2YUFyaXRobWV0aWNFeGNlcHRpb24sCisgIFNXSUdfSmF2YUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKKyAgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sCisgIFNXSUdfSmF2YURpcmVjdG9yUHVyZVZpcnR1YWwsCisgIFNXSUdfSmF2YVVua25vd25FcnJvcgorfSBTV0lHX0phdmFFeGNlcHRpb25Db2RlczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTV0lHX0phdmFFeGNlcHRpb25Db2RlcyBjb2RlOworICBjb25zdCBjaGFyICpqYXZhX2V4Y2VwdGlvbjsKK30gU1dJR19KYXZhRXhjZXB0aW9uc190OworCisKK3N0YXRpYyB2b2lkIFNXSUdVTlVTRUQgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oSk5JRW52ICpqZW52LCBTV0lHX0phdmFFeGNlcHRpb25Db2RlcyBjb2RlLCBjb25zdCBjaGFyICptc2cpIHsKKyAgamNsYXNzIGV4Y2VwOworICBzdGF0aWMgY29uc3QgU1dJR19KYXZhRXhjZXB0aW9uc190IGphdmFfZXhjZXB0aW9uc1tdID0geworICAgIHsgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiB9LAorICAgIHsgU1dJR19KYXZhSU9FeGNlcHRpb24sICJqYXZhL2lvL0lPRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhUnVudGltZUV4Y2VwdGlvbiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgImphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhQXJpdGhtZXRpY0V4Y2VwdGlvbiwgImphdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgfSwKKyAgICB7IFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhRGlyZWN0b3JQdXJlVmlydHVhbCwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhVW5rbm93bkVycm9yLCAgImphdmEvbGFuZy9Vbmtub3duRXJyb3IiIH0sCisgICAgeyAoU1dJR19KYXZhRXhjZXB0aW9uQ29kZXMpMCwgICJqYXZhL2xhbmcvVW5rbm93bkVycm9yIiB9CisgIH07CisgIGNvbnN0IFNXSUdfSmF2YUV4Y2VwdGlvbnNfdCAqZXhjZXB0X3B0ciA9IGphdmFfZXhjZXB0aW9uczsKKworICB3aGlsZSAoZXhjZXB0X3B0ci0+Y29kZSAhPSBjb2RlICYmIGV4Y2VwdF9wdHItPmNvZGUpCisgICAgZXhjZXB0X3B0cisrOworCisgICgqamVudiktPkV4Y2VwdGlvbkNsZWFyKGplbnYpOworICBleGNlcCA9ICgqamVudiktPkZpbmRDbGFzcyhqZW52LCBleGNlcHRfcHRyLT5qYXZhX2V4Y2VwdGlvbik7CisgIGlmIChleGNlcCkKKyAgICAoKmplbnYpLT5UaHJvd05ldyhqZW52LCBleGNlcCwgbXNnKTsKK30KKworCisvKiBDb250cmFjdCBzdXBwb3J0ICovCisKKyNkZWZpbmUgU1dJR19jb250cmFjdF9hc3NlcnQobnVsbHJldHVybiwgZXhwciwgbXNnKSBpZiAoIShleHByKSkge1NXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgbXNnKTsgcmV0dXJuIG51bGxyZXR1cm47IH0gZWxzZQorCisvKiAgRXJyb3JzIGluIFNXSUcgKi8KKyNkZWZpbmUgIFNXSUdfVW5rbm93bkVycm9yICAgICAgICAgLTEKKyNkZWZpbmUgIFNXSUdfSU9FcnJvciAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgIFNXSUdfUnVudGltZUVycm9yICAgICAgICAgLTMKKyNkZWZpbmUgIFNXSUdfSW5kZXhFcnJvciAgICAgICAgICAgLTQKKyNkZWZpbmUgIFNXSUdfVHlwZUVycm9yICAgICAgICAgICAgLTUKKyNkZWZpbmUgIFNXSUdfRGl2aXNpb25CeVplcm8gICAgICAgLTYKKyNkZWZpbmUgIFNXSUdfT3ZlcmZsb3dFcnJvciAgICAgICAgLTcKKyNkZWZpbmUgIFNXSUdfU3ludGF4RXJyb3IgICAgICAgICAgLTgKKyNkZWZpbmUgIFNXSUdfVmFsdWVFcnJvciAgICAgICAgICAgLTkKKyNkZWZpbmUgIFNXSUdfU3lzdGVtRXJyb3IgICAgICAgICAgLTEwCisjZGVmaW5lICBTV0lHX0F0dHJpYnV0ZUVycm9yICAgICAgIC0xMQorI2RlZmluZSAgU1dJR19NZW1vcnlFcnJvciAgICAgICAgICAtMTIKKyNkZWZpbmUgIFNXSUdfTnVsbFJlZmVyZW5jZUVycm9yICAgLTEzCisKKworCisKK1NXSUdJTlRFUk4gdm9pZCBTV0lHX0phdmFFeGNlcHRpb24oSk5JRW52ICpqZW52LCBpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnKSB7CisgIFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzIGV4Y2VwdGlvbl9jb2RlID0gU1dJR19KYXZhVW5rbm93bkVycm9yOworICBzd2l0Y2goY29kZSkgeworICBjYXNlIFNXSUdfTWVtb3J5RXJyb3I6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfSU9FcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YUlPRXhjZXB0aW9uOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfU3lzdGVtRXJyb3I6CisgIGNhc2UgU1dJR19SdW50aW1lRXJyb3I6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFSdW50aW1lRXhjZXB0aW9uOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfT3ZlcmZsb3dFcnJvcjoKKyAgY2FzZSBTV0lHX0luZGV4RXJyb3I6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfRGl2aXNpb25CeVplcm86CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFBcml0aG1ldGljRXhjZXB0aW9uOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfU3ludGF4RXJyb3I6CisgIGNhc2UgU1dJR19WYWx1ZUVycm9yOgorICBjYXNlIFNXSUdfVHlwZUVycm9yOgorICAgIGV4Y2VwdGlvbl9jb2RlID0gU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfVW5rbm93bkVycm9yOgorICBkZWZhdWx0OgorICAgIGV4Y2VwdGlvbl9jb2RlID0gU1dJR19KYXZhVW5rbm93bkVycm9yOworICAgIGJyZWFrOworICB9CisgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIGV4Y2VwdGlvbl9jb2RlLCBtc2cpOworfQorCisKKyNpZiBkZWZpbmVkKFNXSUdfTk9JTkNMVURFKSB8fCBkZWZpbmVkKFNXSUdfTk9BUlJBWVMpCisKKworaW50IFNXSUdfSmF2YUFycmF5SW5TY2hhciAoSk5JRW52ICpqZW52LCBqYnl0ZSAqKmphcnIsIHNpZ25lZCBjaGFyICoqY2FyciwgamJ5dGVBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2NoYXIgKEpOSUVudiAqamVudiwgamJ5dGUgKmphcnIsIHNpZ25lZCBjaGFyICpjYXJyLCBqYnl0ZUFycmF5IGlucHV0KTsKK2pieXRlQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRTY2hhciAoSk5JRW52ICpqZW52LCBzaWduZWQgY2hhciAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VY2hhciAoSk5JRW52ICpqZW52LCBqc2hvcnQgKipqYXJyLCB1bnNpZ25lZCBjaGFyICoqY2FyciwganNob3J0QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqamFyciwgdW5zaWduZWQgY2hhciAqY2FyciwganNob3J0QXJyYXkgaW5wdXQpOworanNob3J0QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVY2hhciAoSk5JRW52ICpqZW52LCB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblNob3J0IChKTklFbnYgKmplbnYsIGpzaG9ydCAqKmphcnIsIHNob3J0ICoqY2FyciwganNob3J0QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFNob3J0IChKTklFbnYgKmplbnYsIGpzaG9ydCAqamFyciwgc2hvcnQgKmNhcnIsIGpzaG9ydEFycmF5IGlucHV0KTsKK2pzaG9ydEFycmF5IFNXSUdfSmF2YUFycmF5T3V0U2hvcnQgKEpOSUVudiAqamVudiwgc2hvcnQgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluVXNob3J0IChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCB1bnNpZ25lZCBzaG9ydCAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VXNob3J0IChKTklFbnYgKmplbnYsIGppbnQgKmphcnIsIHVuc2lnbmVkIHNob3J0ICpjYXJyLCBqaW50QXJyYXkgaW5wdXQpOworamludEFycmF5IFNXSUdfSmF2YUFycmF5T3V0VXNob3J0IChKTklFbnYgKmplbnYsIHVuc2lnbmVkIHNob3J0ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJbkludCAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgaW50ICoqY2FyciwgamludEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRJbnQgKEpOSUVudiAqamVudiwgamludCAqamFyciwgaW50ICpjYXJyLCBqaW50QXJyYXkgaW5wdXQpOworamludEFycmF5IFNXSUdfSmF2YUFycmF5T3V0SW50IChKTklFbnYgKmplbnYsIGludCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VaW50IChKTklFbnYgKmplbnYsIGpsb25nICoqamFyciwgdW5zaWduZWQgaW50ICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludCAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgdW5zaWduZWQgaW50ICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVaW50IChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGludCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Mb25nIChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCBsb25nICoqY2FyciwgamludEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRMb25nIChKTklFbnYgKmplbnYsIGppbnQgKmphcnIsIGxvbmcgKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7CitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRMb25nIChKTklFbnYgKmplbnYsIGxvbmcgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluVWxvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKipqYXJyLCB1bnNpZ25lZCBsb25nICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWxvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKmphcnIsIHVuc2lnbmVkIGxvbmcgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpOworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dFVsb25nIChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGxvbmcgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluTG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKipqYXJyLCBqbG9uZyAqKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCBqbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7CitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0TG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluRmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICoqamFyciwgZmxvYXQgKipjYXJyLCBqZmxvYXRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0RmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICpqYXJyLCBmbG9hdCAqY2FyciwgamZsb2F0QXJyYXkgaW5wdXQpOworamZsb2F0QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRGbG9hdCAoSk5JRW52ICpqZW52LCBmbG9hdCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Eb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqKmphcnIsIGRvdWJsZSAqKmNhcnIsIGpkb3VibGVBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0RG91YmxlIChKTklFbnYgKmplbnYsIGpkb3VibGUgKmphcnIsIGRvdWJsZSAqY2FyciwgamRvdWJsZUFycmF5IGlucHV0KTsKK2pkb3VibGVBcnJheSBTV0lHX0phdmFBcnJheU91dERvdWJsZSAoSk5JRW52ICpqZW52LCBkb3VibGUgKnJlc3VsdCwganNpemUgc3opOworCisKKyNlbHNlCisKKworLyogc2lnbmVkIGNoYXJbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJblNjaGFyIChKTklFbnYgKmplbnYsIGpieXRlICoqamFyciwgc2lnbmVkIGNoYXIgKipjYXJyLCBqYnl0ZUFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoc2lnbmVkIGNoYXIqKSBjYWxsb2Moc3osIHNpemVvZihzaWduZWQgY2hhcikpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9IChzaWduZWQgY2hhcikoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFNjaGFyIChKTklFbnYgKmplbnYsIGpieXRlICpqYXJyLCBzaWduZWQgY2hhciAqY2FyciwgamJ5dGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqYnl0ZSljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqYnl0ZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0U2NoYXIgKEpOSUVudiAqamVudiwgc2lnbmVkIGNoYXIgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamJ5dGUgKmFycjsKKyAgaW50IGk7CisgIGpieXRlQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0J5dGVBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqYnl0ZSlyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiB1bnNpZ25lZCBjaGFyW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5VY2hhciAoSk5JRW52ICpqZW52LCBqc2hvcnQgKipqYXJyLCB1bnNpZ25lZCBjaGFyICoqY2FyciwganNob3J0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAodW5zaWduZWQgY2hhciopIGNhbGxvYyhzeiwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAodW5zaWduZWQgY2hhcikoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqamFyciwgdW5zaWduZWQgY2hhciAqY2FyciwganNob3J0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoanNob3J0KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqc2hvcnRBcnJheSBTV0lHX0phdmFBcnJheU91dFVjaGFyIChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwganNpemUgc3opIHsKKyAganNob3J0ICphcnI7CisgIGludCBpOworICBqc2hvcnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3U2hvcnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoanNob3J0KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiBzaG9ydFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluU2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICoqamFyciwgc2hvcnQgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChzaG9ydCopIGNhbGxvYyhzeiwgc2l6ZW9mKHNob3J0KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHNob3J0KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCBzaG9ydCAqY2FyciwganNob3J0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoanNob3J0KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqc2hvcnRBcnJheSBTV0lHX0phdmFBcnJheU91dFNob3J0IChKTklFbnYgKmplbnYsIHNob3J0ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpzaG9ydCAqYXJyOworICBpbnQgaTsKKyAganNob3J0QXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld1Nob3J0QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpzaG9ydClyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogdW5zaWduZWQgc2hvcnRbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJblVzaG9ydCAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgdW5zaWduZWQgc2hvcnQgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVuc2lnbmVkIHNob3J0KikgY2FsbG9jKHN6LCBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAodW5zaWduZWQgc2hvcnQpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVc2hvcnQgKEpOSUVudiAqamVudiwgamludCAqamFyciwgdW5zaWduZWQgc2hvcnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqaW50KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamludEFycmF5IFNXSUdfSmF2YUFycmF5T3V0VXNob3J0IChKTklFbnYgKmplbnYsIHVuc2lnbmVkIHNob3J0ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGppbnQgKmFycjsKKyAgaW50IGk7CisgIGppbnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3SW50QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqaW50KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogaW50W10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5JbnQgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIGludCAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoaW50KikgY2FsbG9jKHN6LCBzaXplb2YoaW50KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGludCkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dEludCAoSk5JRW52ICpqZW52LCBqaW50ICpqYXJyLCBpbnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqaW50KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamludEFycmF5IFNXSUdfSmF2YUFycmF5T3V0SW50IChKTklFbnYgKmplbnYsIGludCAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqaW50ICphcnI7CisgIGludCBpOworICBqaW50QXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0ludEFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamludClyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIHVuc2lnbmVkIGludFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVWludCAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIHVuc2lnbmVkIGludCAqKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0TG9uZ0FycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9ICh1bnNpZ25lZCBpbnQqKSBjYWxsb2Moc3osIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAodW5zaWduZWQgaW50KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludCAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgdW5zaWduZWQgaW50ICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpsb25nKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVaW50IChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGludCAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqbG9uZyAqYXJyOworICBpbnQgaTsKKyAgamxvbmdBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3TG9uZ0FycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpsb25nKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIGxvbmdbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkxvbmcgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIGxvbmcgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKGxvbmcqKSBjYWxsb2Moc3osIHNpemVvZihsb25nKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGxvbmcpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRMb25nIChKTklFbnYgKmplbnYsIGppbnQgKmphcnIsIGxvbmcgKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqaW50KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamludEFycmF5IFNXSUdfSmF2YUFycmF5T3V0TG9uZyAoSk5JRW52ICpqZW52LCBsb25nICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGppbnQgKmFycjsKKyAgaW50IGk7CisgIGppbnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3SW50QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqaW50KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogdW5zaWduZWQgbG9uZ1tdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVWxvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKipqYXJyLCB1bnNpZ25lZCBsb25nICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVuc2lnbmVkIGxvbmcqKSBjYWxsb2Moc3osIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHVuc2lnbmVkIGxvbmcpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgdW5zaWduZWQgbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqbG9uZyljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0VWxvbmcgKEpOSUVudiAqamVudiwgdW5zaWduZWQgbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqbG9uZyAqYXJyOworICBpbnQgaTsKKyAgamxvbmdBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3TG9uZ0FycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpsb25nKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIGpsb25nW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5Mb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIGpsb25nICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKGpsb25nKikgY2FsbG9jKHN6LCBzaXplb2YoamxvbmcpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAoamxvbmcpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRMb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgamxvbmcgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamxvbmcpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dExvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpsb25nICphcnI7CisgIGludCBpOworICBqbG9uZ0FycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdMb25nQXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamxvbmcpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogZmxvYXRbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkZsb2F0IChKTklFbnYgKmplbnYsIGpmbG9hdCAqKmphcnIsIGZsb2F0ICoqY2FyciwgamZsb2F0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoZmxvYXQqKSBjYWxsb2Moc3osIHNpemVvZihmbG9hdCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9IChmbG9hdCkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dEZsb2F0IChKTklFbnYgKmplbnYsIGpmbG9hdCAqamFyciwgZmxvYXQgKmNhcnIsIGpmbG9hdEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpmbG9hdCljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamZsb2F0QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRGbG9hdCAoSk5JRW52ICpqZW52LCBmbG9hdCAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqZmxvYXQgKmFycjsKKyAgaW50IGk7CisgIGpmbG9hdEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdGbG9hdEFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqZmxvYXQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIGRvdWJsZVtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluRG91YmxlIChKTklFbnYgKmplbnYsIGpkb3VibGUgKipqYXJyLCBkb3VibGUgKipjYXJyLCBqZG91YmxlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKGRvdWJsZSopIGNhbGxvYyhzeiwgc2l6ZW9mKGRvdWJsZSkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9IChkb3VibGUpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXREb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqamFyciwgZG91YmxlICpjYXJyLCBqZG91YmxlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamRvdWJsZSljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pkb3VibGVBcnJheSBTV0lHX0phdmFBcnJheU91dERvdWJsZSAoSk5JRW52ICpqZW52LCBkb3VibGUgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamRvdWJsZSAqYXJyOworICBpbnQgaTsKKyAgamRvdWJsZUFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdEb3VibGVBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpkb3VibGUpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisjZW5kaWYKKworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisKK2ludCBTV0lHX0phdmFBcnJheUluVWludDggKEpOSUVudiAqamVudiwgamJ5dGUgKipqYXJyLCB1aW50OF90ICoqY2FyciwgamJ5dGVBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDggKEpOSUVudiAqamVudiwgamJ5dGUgKmphcnIsIHVpbnQ4X3QgKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpOworamJ5dGVBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQ4IChKTklFbnYgKmplbnYsIHVpbnQ4X3QgKnJlc3VsdCwganNpemUgc3opOworCisKKy8qIHVpbnQ4X3RbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJblVpbnQ4IChKTklFbnYgKmplbnYsIGpieXRlICoqamFyciwgdWludDhfdCAqKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9ICh1aW50OF90KikgY2FsbG9jKHN6LCBzaXplb2YodWludDhfdCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1aW50OF90KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDggKEpOSUVudiAqamVudiwgamJ5dGUgKmphcnIsIHVpbnQ4X3QgKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamJ5dGUpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamJ5dGVBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQ4IChKTklFbnYgKmplbnYsIHVpbnQ4X3QgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamJ5dGUgKmFycjsKKyAgaW50IGk7CisgIGpieXRlQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0J5dGVBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqYnl0ZSlyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisKKyNkZWZpbmUgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5IFwKKyAgICAocmVzdWx0ID8gKGppbnQpUmV0dXJuZWRCdWZmZXJTaXplKF9fRlVOQ1RJT05fXywgYXJnMywgYXJnNCkgOiAwKQorCisKK3N0YXRpYyBzaXplX3QgUmV0dXJuZWRCdWZmZXJTaXplKAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBzdGF0aWMgY29uc3Qgc3RydWN0IHNpemVtYXAgeworICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uOworICAgIGludCBzaXplX211bHRpcGxpZXI7CisgIH0gc2l6ZV9tYXBbXSA9IHsKKyNpZmRlZiBTV0lHSkFWQQorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorI2lmZGVmIFNXSUdQWVRIT04KKyAgICB7ICJXZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQVJHQiIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorICAgIHsgTlVMTCwgMCB9CisgIH07CisgIGNvbnN0IHN0cnVjdCBzaXplbWFwKiBwOworICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgZm9yIChwID0gc2l6ZV9tYXA7IHAtPmZ1bmN0aW9uOyArK3ApIHsKKyAgICBpZiAoIXN0cmNtcChmdW5jdGlvbiwgcC0+ZnVuY3Rpb24pKSB7CisgICAgICBzaXplID0gKndpZHRoICogKmhlaWdodCAqIHAtPnNpemVfbXVsdGlwbGllcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorCisKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUZ1bmN0aW9uKShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworCitzdGF0aWMgdWludDhfdCogRW5jb2RlTG9zc3koY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RlRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPQorICAgICAgZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAmb3V0cHV0KTsKKyAgLy8gdGhlIHZhbHVlcyBvZiBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgUmV0dXJuZWRCdWZmZXJTaXplKCkKKyAgLy8gYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVMb3NzbGVzc0Z1bmN0aW9uIGVuY2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0cHV0X3NpemUsIGludCogdW51c2VkKSB7CisgIHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBpbWFnZV9zaXplID0gZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkKKyAgLy8gUmV0dXJuZWRCdWZmZXJTaXplKCkgYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKKworLy8gQ2hhbmdlcyB0aGUgcmV0dXJuIHR5cGUgb2YgV2ViUEVuY29kZSogdG8gbW9yZSBjbG9zZWx5IG1hdGNoIERlY29kZSouCisvLyBUaGlzIGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHdyYXAgdGhlIG91dHB1dCBidWZmZXIgaW4gYSBuYXRpdmUgdHlwZSByYXRoZXIKKy8vIHRoYW4gZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gcG9pbnRlci4KKy8vIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHRvIGFsbG93IHJldXNlIG9mIFJldHVybmVkQnVmZmVyU2l6ZSgpLAorLy8gdW51c2VkMiBhbmQgb3V0cHV0X3NpemUgd2lsbCBiZSB1c2VkIGluIHRoaXMgY2FzZS4KKyNkZWZpbmUgTE9TU1lfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIHsgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc3kocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCQSkKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUkEpCisKKyN1bmRlZiBMT1NTWV9XUkFQUEVSCisKKyNkZWZpbmUgTE9TU0xFU1NfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc2xlc3MocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSkKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKworI3VuZGVmIExPU1NMRVNTX1dSQVBQRVIKKworCisKKy8qIFdvcmsgYXJvdW5kIGJyb2tlbiBnY2ogam5pLmggKi8KKyNpZmRlZiBfX0dDSl9KTklfSF9fCisjIHVuZGVmIEpOSUVYUE9SVAorIyBkZWZpbmUgSk5JRVhQT1JUCisjIHVuZGVmIEpOSUNBTEwKKyMgZGVmaW5lIEpOSUNBTEwKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworU1dJR0VYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQR2V0RGVjb2RlclZlcnNpb24oSk5JRW52ICpqZW52LCBqY2xhc3MgamNscykgeworICBqaW50IGpyZXN1bHQgPSAwIDsKKyAgaW50IHJlc3VsdDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICByZXN1bHQgPSAoaW50KVdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICBqcmVzdWx0ID0gKGppbnQpcmVzdWx0OworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBHZXRJbmZvKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGpsb25nIGphcmcyLCBqaW50QXJyYXkgamFyZzMsIGppbnRBcnJheSBqYXJnNCkgeworICBqaW50IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wMyA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXN1bHQ7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChzaXplX3QpamFyZzI7CisgIHsKKyAgICBpZiAoIWphcmczKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzMpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgcmVzdWx0ID0gKGludClXZWJQR2V0SW5mbygodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBqcmVzdWx0ID0gKGppbnQpcmVzdWx0OworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCQShKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUFSR0IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamxvbmcgamFyZzIsIGppbnRBcnJheSBqYXJnMywgamludEFycmF5IGphcmc0KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChzaXplX3QpamFyZzI7CisgIHsKKyAgICBpZiAoIWphcmczKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzMpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamxvbmcgamFyZzIsIGppbnRBcnJheSBqYXJnMywgamludEFycmF5IGphcmc0KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChzaXplX3QpamFyZzI7CisgIHsKKyAgICBpZiAoIWphcmczKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzMpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamxvbmcgamFyZzIsIGppbnRBcnJheSBqYXJnMywgamludEFycmF5IGphcmc0KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChzaXplX3QpamFyZzI7CisgIHsKKyAgICBpZiAoIWphcmczKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzMpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBHZXRFbmNvZGVyVmVyc2lvbihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzKSB7CisgIGppbnQganJlc3VsdCA9IDAgOworICBpbnQgcmVzdWx0OworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldEVuY29kZXJWZXJzaW9uKCk7CisgIGpyZXN1bHQgPSAoamludClyZXN1bHQ7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqaW50IGphcmcyLCBqaW50IGphcmczLCBqaW50QXJyYXkgamFyZzQsIGppbnQgamFyZzUsIGppbnQgamFyZzYsIGppbnQgamFyZzcsIGpmbG9hdCBqYXJnOCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChpbnQgKikmamFyZzI7CisgIGFyZzMgPSAoaW50ICopJmphcmczOworICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgYXJnNSA9IChpbnQpamFyZzU7CisgIGFyZzYgPSAoaW50KWphcmc2OworICBhcmc3ID0gKGludClqYXJnNzsKKyAgYXJnOCA9IChmbG9hdClqYXJnODsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSQShKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqaW50IGphcmcyLCBqaW50IGphcmczLCBqaW50QXJyYXkgamFyZzQsIGppbnQgamFyZzUsIGppbnQgamFyZzYsIGppbnQgamFyZzcsIGpmbG9hdCBqYXJnOCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChpbnQgKikmamFyZzI7CisgIGFyZzMgPSAoaW50ICopJmphcmczOworICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgYXJnNSA9IChpbnQpamFyZzU7CisgIGFyZzYgPSAoaW50KWphcmc2OworICBhcmc3ID0gKGludClqYXJnNzsKKyAgYXJnOCA9IChmbG9hdClqYXJnODsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNykgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqaW50IGphcmcyLCBqaW50IGphcmczLCBqaW50QXJyYXkgamFyZzQsIGppbnQgamFyZzUsIGppbnQgamFyZzYsIGppbnQgamFyZzcpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXA0IDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgaWYgKCFTV0lHX0phdmFBcnJheUluVWludDgoamVudiwgJmphcnIxLCAmYXJnMSwgamFyZzEpKSByZXR1cm4gMDsKKyAgYXJnMiA9IChpbnQgKikmamFyZzI7CisgIGFyZzMgPSAoaW50ICopJmphcmczOworICB7CisgICAgaWYgKCFqYXJnNCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmc0KSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzQgPSAmdGVtcDQ7CisgIH0KKyAgYXJnNSA9IChpbnQpamFyZzU7CisgIGFyZzYgPSAoaW50KWphcmc2OworICBhcmc3ID0gKGludClqYXJnNzsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNykgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNykgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX3B5dGhvbl93cmFwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfcHl0aG9uX3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjlmODM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX3B5dGhvbl93cmFwLmMKQEAgLTAsMCArMSw1Mzk4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgKGh0dHA6Ly93d3cuc3dpZy5vcmcpLgorICogVmVyc2lvbiAyLjAuNAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNXSUdQWVRIT04KKyNkZWZpbmUgU1dJR19QWVRIT05fRElSRUNUT1JfTk9fVlRBQkxFCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGdlbmVyaWMgU1dJRyBsYWJlbHMgZm9yIG1ldGhvZC92YXJpYWJsZQorICogIGRlY2xhcmF0aW9ucy9hdHRyaWJ1dGVzLCBhbmQgb3RoZXIgY29tcGlsZXIgZGVwZW5kZW50IGxhYmVscy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBDKysgc3RhbmRhcmQgKi8KKyNpZm5kZWYgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiAoX19TVU5QUk9fQ0MgPD0gMHg1NjApCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisvKiBOZWVkZWQgZXZlbiB3aXRoIGBhQ0MgLUFBJyB3aGVuIGBhQ0MgLVYnIHJlcG9ydHMgSFAgQU5TSSBDKysgQjM5MTBCIEEuMDMuNTUgKi8KKy8qIElmIHdlIGZpbmQgYSBtYXhpbXVtIHZlcnNpb24gdGhhdCByZXF1aXJlcyB0aGlzLCB0aGUgdGVzdCB3b3VsZCBiZSBfX0hQX2FDQyA8PSAzNTUwMCBmb3IgQS4wMy41NSAqLworIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxzZQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbmxpbmUgYXR0cmlidXRlICovCisjaWZuZGVmIFNXSUdJTkxJTkUKKyMgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykpCisjICAgZGVmaW5lIFNXSUdJTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR0lOTElORQorIyBlbmRpZgorI2VuZGlmCisKKy8qIGF0dHJpYnV0ZSByZWNvZ25pc2VkIGJ5IHNvbWUgY29tcGlsZXJzIHRvIGF2b2lkICd1bnVzZWQnIHdhcm5pbmdzICovCisjaWZuZGVmIFNXSUdVTlVTRUQKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBpZiAhKGRlZmluZWQoX19jcGx1c3BsdXMpKSB8fCAoX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpKQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VECisjICAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fSUNDKQorIyAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHX01TQ19VTlNVUFBSRVNTXzQ1MDUKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUwNSkgLyogdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdVTlVTRURQQVJNCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkgcCBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworLyogaW50ZXJuYWwgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTgorIyBkZWZpbmUgU1dJR0lOVEVSTiBzdGF0aWMgU1dJR1VOVVNFRAorI2VuZGlmCisKKy8qIGludGVybmFsIGlubGluZSBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOSU5MSU5FCisjIGRlZmluZSBTV0lHSU5URVJOSU5MSU5FIFNXSUdJTlRFUk4gU1dJR0lOTElORQorI2VuZGlmCisKKy8qIGV4cG9ydGluZyBtZXRob2RzICovCisjaWYgKF9fR05VQ19fID49IDQpIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpCisjICBpZm5kZWYgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgICBkZWZpbmUgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdFWFBPUlQKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgaWYgZGVmaW5lZChTVEFUSUNfTElOS0VEKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbmRpZgorIyBlbHNlCisjICAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIFdpbmRvd3MgKi8KKyNpZm5kZWYgU1dJR1NURENBTEwKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgZGVmaW5lIFNXSUdTVERDQUxMIF9fc3RkY2FsbAorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdTVERDQUxMCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgQyBzdGFuZGFyZCBydW50aW1lIGZ1bmN0aW9ucyAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIG1ldGhvZHMgaW4gdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5ICovCisjaWYgIWRlZmluZWQoU1dJR19OT19TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworCisKKy8qIFB5dGhvbi5oIGhhcyB0byBhcHBlYXIgZmlyc3QgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN3aWdydW4uc3dnCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGdlbmVyaWMgQyBBUEkgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIHBvaW50ZXIKKyAqIHR5cGUgY2hlY2tpbmcuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGluY3JlbWVudGVkIHdoZW4gZWl0aGVyIHRoZSBsYXlvdXQgb2Ygc3dpZ190eXBlX2luZm8gY2hhbmdlcywKKyAgIG9yIGZvciB3aGF0ZXZlciByZWFzb24sIHRoZSBydW50aW1lIGNoYW5nZXMgaW5jb21wYXRpYmx5ICovCisjZGVmaW5lIFNXSUdfUlVOVElNRV9WRVJTSU9OICI0IgorCisvKiBkZWZpbmUgU1dJR19UWVBFX1RBQkxFX05BTUUgYXMgIlNXSUdfVFlQRV9UQUJMRSIgKi8KKyNpZmRlZiBTV0lHX1RZUEVfVEFCTEUKKyMgZGVmaW5lIFNXSUdfUVVPVEVfU1RSSU5HKHgpICN4CisjIGRlZmluZSBTV0lHX0VYUEFORF9BTkRfUVVPVEVfU1RSSU5HKHgpIFNXSUdfUVVPVEVfU1RSSU5HKHgpCisjIGRlZmluZSBTV0lHX1RZUEVfVEFCTEVfTkFNRSBTV0lHX0VYUEFORF9BTkRfUVVPVEVfU1RSSU5HKFNXSUdfVFlQRV9UQUJMRSkKKyNlbHNlCisjIGRlZmluZSBTV0lHX1RZUEVfVEFCTEVfTkFNRQorI2VuZGlmCisKKy8qCisgIFlvdSBjYW4gdXNlIHRoZSBTV0lHUlVOVElNRSBhbmQgU1dJR1JVTlRJTUVJTkxJTkUgbWFjcm9zIGZvcgorICBjcmVhdGluZyBhIHN0YXRpYyBvciBkeW5hbWljIGxpYnJhcnkgZnJvbSB0aGUgU1dJRyBydW50aW1lIGNvZGUuCisgIEluIDk5LjklIG9mIHRoZSBjYXNlcywgU1dJRyBqdXN0IG5lZWRzIHRvIGRlY2xhcmUgdGhlbSBhcyAnc3RhdGljJy4KKworICBCdXQgb25seSBkbyB0aGlzIGlmIHN0cmljdGx5IG5lY2Vzc2FyeSwgaWUsIGlmIHlvdSBoYXZlIHByb2JsZW1zCisgIHdpdGggeW91ciBjb21waWxlciBvciBzdWNobGlrZS4KKyovCisKKyNpZm5kZWYgU1dJR1JVTlRJTUUKKyMgZGVmaW5lIFNXSUdSVU5USU1FIFNXSUdJTlRFUk4KKyNlbmRpZgorCisjaWZuZGVmIFNXSUdSVU5USU1FSU5MSU5FCisjIGRlZmluZSBTV0lHUlVOVElNRUlOTElORSBTV0lHUlVOVElNRSBTV0lHSU5MSU5FCisjZW5kaWYKKworLyogIEdlbmVyaWMgYnVmZmVyIHNpemUgKi8KKyNpZm5kZWYgU1dJR19CVUZGRVJfU0laRQorIyBkZWZpbmUgU1dJR19CVUZGRVJfU0laRSAxMDI0CisjZW5kaWYKKworLyogRmxhZ3MgZm9yIHBvaW50ZXIgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgU1dJR19QT0lOVEVSX0RJU09XTiAgICAgICAgMHgxCisjZGVmaW5lIFNXSUdfQ0FTVF9ORVdfTUVNT1JZICAgICAgIDB4MgorCisvKiBGbGFncyBmb3IgbmV3IHBvaW50ZXIgb2JqZWN0cyAqLworI2RlZmluZSBTV0lHX1BPSU5URVJfT1dOICAgICAgICAgICAweDEKKworCisvKgorICAgRmxhZ3MvbWV0aG9kcyBmb3IgcmV0dXJuaW5nIHN0YXRlcy4KKworICAgVGhlIFNXSUcgY29udmVyc2lvbiBtZXRob2RzLCBhcyBDb252ZXJ0UHRyLCByZXR1cm4gYW4gaW50ZWdlcgorICAgdGhhdCB0ZWxscyBpZiB0aGUgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuIEFuZCBpZiBub3QsCisgICBhbiBlcnJvciBjb2RlIGNhbiBiZSByZXR1cm5lZCAoc2VlIHN3aWdlcnJvcnMuc3dnIGZvciB0aGUgY29kZXMpLgorCisgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MvZmxhZ3MgdG8gc2V0IG9yIHByb2Nlc3MgdGhlIHJldHVybmluZworICAgc3RhdGVzLgorCisgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgY29kZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2FzIHVzdWFsbHkgd3JpdHRlbjoKKworICAgICBpZiAoU1dJR19Db252ZXJ0UHRyKG9iaix2cHRyLHR5LmZsYWdzKSAhPSAtMSkgeworICAgICAgIC8vIHN1Y2Nlc3MgY29kZQorICAgICB9IGVsc2UgeworICAgICAgIC8vZmFpbCBjb2RlCisgICAgIH0KKworICAgTm93IHlvdSBjYW4gYmUgbW9yZSBleHBsaWNpdDoKKworICAgIGludCByZXMgPSBTV0lHX0NvbnZlcnRQdHIob2JqLHZwdHIsdHkuZmxhZ3MpOworICAgIGlmIChTV0lHX0lzT0socmVzKSkgeworICAgICAgLy8gc3VjY2VzcyBjb2RlCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGZhaWwgY29kZQorICAgIH0KKworICAgd2hpY2ggaXMgdGhlIHNhbWUgcmVhbGx5LCBidXQgbm93IHlvdSBjYW4gYWxzbyBkbworCisgICAgVHlwZSAqcHRyOworICAgIGludCByZXMgPSBTV0lHX0NvbnZlcnRQdHIob2JqLCh2b2lkICoqKSgmcHRyKSx0eS5mbGFncyk7CisgICAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgICAvLyBzdWNjZXNzIGNvZGUKKyAgICAgIGlmIChTV0lHX0lzTmV3T2JqKHJlcykgeworICAgICAgICAuLi4KKyAgICAgICAgZGVsZXRlICpwdHI7CisgICAgICB9IGVsc2UgeworICAgICAgICAuLi4KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gZmFpbCBjb2RlCisgICAgfQorCisgICBJLmUuLCBub3cgU1dJR19Db252ZXJ0UHRyIGNhbiByZXR1cm4gbmV3IG9iamVjdHMgYW5kIHlvdSBjYW4KKyAgIGlkZW50aWZ5IHRoZSBjYXNlIGFuZCB0YWtlIGNhcmUgb2YgdGhlIGRlYWxsb2NhdGlvbi4gT2YgY291cnNlIHRoYXQKKyAgIGFsc28gcmVxdWlyZXMgU1dJR19Db252ZXJ0UHRyIHRvIHJldHVybiBuZXcgcmVzdWx0IHZhbHVlcywgc3VjaCBhcworCisgICAgICBpbnQgU1dJR19Db252ZXJ0UHRyKG9iaiwgcHRyLC4uLikgeworICAgICAgICBpZiAoPG9iaiBpcyBvaz4pIHsKKyAgICAgICAgICBpZiAoPG5lZWQgbmV3IG9iamVjdD4pIHsKKyAgICAgICAgICAgICpwdHIgPSA8cHRyIHRvIG5ldyBhbGxvY2F0ZWQgb2JqZWN0PjsKKyAgICAgICAgICAgIHJldHVybiBTV0lHX05FV09CSjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnB0ciA9IDxwdHIgdG8gb2xkIG9iamVjdD47CisgICAgICAgICAgICByZXR1cm4gU1dJR19PTERPQko7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBTV0lHX0JBRE9CSjsKKyAgICAgICAgfQorICAgICAgfQorCisgICBPZiBjb3Vyc2UsIHJldHVybmluZyB0aGUgcGxhaW4gJzAoc3VjY2VzcykvLTEoZmFpbCknIHN0aWxsIHdvcmtzLCBidXQgeW91IGNhbiBiZQorICAgbW9yZSBleHBsaWNpdCBieSByZXR1cm5pbmcgU1dJR19CQURPQkosIFNXSUdfRVJST1Igb3IgYW55IG9mIHRoZQorICAgU1dJRyBlcnJvcnMgY29kZS4KKworICAgRmluYWxseSwgaWYgdGhlIFNXSUdfQ0FTVFJBTktfTU9ERSBpcyBlbmFibGVkLCB0aGUgcmVzdWx0IGNvZGUKKyAgIGFsbG93cyB0byByZXR1cm4gdGhlICdjYXN0IHJhbmsnLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpcworCisgICAgICAgaW50IGZvb2QoZG91YmxlKQorICAgICAgIGludCBmb29pKGludCk7CisKKyAgIGFuZCB5b3UgY2FsbAorCisgICAgICBmb29kKDEpICAgLy8gY2FzdCByYW5rICcxJyAgKDEgLT4gMS4wKQorICAgICAgZm9vaSgxKSAgIC8vIGNhc3QgcmFuayAnMCcKKworICAganVzdCB1c2UgdGhlIFNXSUdfQWRkQ2FzdCgpL1NXSUdfQ2hlY2tTdGF0ZSgpCisqLworCisjZGVmaW5lIFNXSUdfT0sgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTV0lHX0VSUk9SICAgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFNXSUdfSXNPSyhyKSAgICAgICAgICAgICAgIChyID49IDApCisjZGVmaW5lIFNXSUdfQXJnRXJyb3IocikgICAgICAgICAgICgociAhPSBTV0lHX0VSUk9SKSA/IHIgOiBTV0lHX1R5cGVFcnJvcikKKworLyogVGhlIENhc3RSYW5rTGltaXQgc2F5cyBob3cgbWFueSBiaXRzIGFyZSB1c2VkIGZvciB0aGUgY2FzdCByYW5rICovCisjZGVmaW5lIFNXSUdfQ0FTVFJBTktMSU1JVCAgICAgICAgICgxIDw8IDgpCisvKiBUaGUgTmV3TWFzayBkZW5vdGVzIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgKHVzaW5nIG5ldy9tYWxsb2MpICovCisjZGVmaW5lIFNXSUdfTkVXT0JKTUFTSyAgICAgICAgICAgIChTV0lHX0NBU1RSQU5LTElNSVQgIDw8IDEpCisvKiBUaGUgVG1wTWFzayBpcyBmb3IgaW4vb3V0IHR5cGVtYXBzIHRoYXQgdXNlIHRlbXBvcmFsIG9iamVjdHMgKi8KKyNkZWZpbmUgU1dJR19UTVBPQkpNQVNLICAgICAgICAgICAgKFNXSUdfTkVXT0JKTUFTSyA8PCAxKQorLyogU2ltcGxlIHJldHVybmluZyB2YWx1ZXMgKi8KKyNkZWZpbmUgU1dJR19CQURPQkogICAgICAgICAgICAgICAgKFNXSUdfRVJST1IpCisjZGVmaW5lIFNXSUdfT0xET0JKICAgICAgICAgICAgICAgIChTV0lHX09LKQorI2RlZmluZSBTV0lHX05FV09CSiAgICAgICAgICAgICAgICAoU1dJR19PSyB8IFNXSUdfTkVXT0JKTUFTSykKKyNkZWZpbmUgU1dJR19UTVBPQkogICAgICAgICAgICAgICAgKFNXSUdfT0sgfCBTV0lHX1RNUE9CSk1BU0spCisvKiBDaGVjaywgYWRkIGFuZCBkZWwgbWFzayBtZXRob2RzICovCisjZGVmaW5lIFNXSUdfQWRkTmV3TWFzayhyKSAgICAgICAgIChTV0lHX0lzT0socikgPyAociB8IFNXSUdfTkVXT0JKTUFTSykgOiByKQorI2RlZmluZSBTV0lHX0RlbE5ld01hc2socikgICAgICAgICAoU1dJR19Jc09LKHIpID8gKHIgJiB+U1dJR19ORVdPQkpNQVNLKSA6IHIpCisjZGVmaW5lIFNXSUdfSXNOZXdPYmoocikgICAgICAgICAgIChTV0lHX0lzT0socikgJiYgKHIgJiBTV0lHX05FV09CSk1BU0spKQorI2RlZmluZSBTV0lHX0FkZFRtcE1hc2socikgICAgICAgICAoU1dJR19Jc09LKHIpID8gKHIgfCBTV0lHX1RNUE9CSk1BU0spIDogcikKKyNkZWZpbmUgU1dJR19EZWxUbXBNYXNrKHIpICAgICAgICAgKFNXSUdfSXNPSyhyKSA/IChyICYgflNXSUdfVE1QT0JKTUFTSykgOiByKQorI2RlZmluZSBTV0lHX0lzVG1wT2JqKHIpICAgICAgICAgICAoU1dJR19Jc09LKHIpICYmIChyICYgU1dJR19UTVBPQkpNQVNLKSkKKworLyogQ2FzdC1SYW5rIE1vZGUgKi8KKyNpZiBkZWZpbmVkKFNXSUdfQ0FTVFJBTktfTU9ERSkKKyMgIGlmbmRlZiBTV0lHX1R5cGVSYW5rCisjICAgIGRlZmluZSBTV0lHX1R5cGVSYW5rICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGVuZGlmCisjICBpZm5kZWYgU1dJR19NQVhDQVNUUkFOSyAgICAgICAgICAgIC8qIERlZmF1bHQgY2FzdCBhbGxvd2VkICovCisjICAgIGRlZmluZSBTV0lHX01BWENBU1RSQU5LICAgICAgICAgICgyKQorIyAgZW5kaWYKKyMgIGRlZmluZSBTV0lHX0NBU1RSQU5LTUFTSyAgICAgICAgICAoKFNXSUdfQ0FTVFJBTktMSU1JVCkgLTEpCisjICBkZWZpbmUgU1dJR19DYXN0UmFuayhyKSAgICAgICAgICAgKHIgJiBTV0lHX0NBU1RSQU5LTUFTSykKK1NXSUdJTlRFUk5JTkxJTkUgaW50IFNXSUdfQWRkQ2FzdChpbnQgcikgeworICByZXR1cm4gU1dJR19Jc09LKHIpID8gKChTV0lHX0Nhc3RSYW5rKHIpIDwgU1dJR19NQVhDQVNUUkFOSykgPyAociArIDEpIDogU1dJR19FUlJPUikgOiByOworfQorU1dJR0lOVEVSTklOTElORSBpbnQgU1dJR19DaGVja1N0YXRlKGludCByKSB7CisgIHJldHVybiBTV0lHX0lzT0socikgPyBTV0lHX0Nhc3RSYW5rKHIpICsgMSA6IDA7Cit9CisjZWxzZSAvKiBubyBjYXN0LXJhbmsgbW9kZSAqLworIyAgZGVmaW5lIFNXSUdfQWRkQ2FzdAorIyAgZGVmaW5lIFNXSUdfQ2hlY2tTdGF0ZShyKSAoU1dJR19Jc09LKHIpID8gMSA6IDApCisjZW5kaWYKKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICooKnN3aWdfY29udmVydGVyX2Z1bmMpKHZvaWQgKiwgaW50ICopOwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ190eXBlX2luZm8gKigqc3dpZ19keWNhc3RfZnVuYykodm9pZCAqKik7CisKKy8qIFN0cnVjdHVyZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBvbiBvbmUgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ190eXBlX2luZm8geworICBjb25zdCBjaGFyICAgICAgICAgICAgICpuYW1lOyAgICAgICAgICAgICAgICAgLyogbWFuZ2xlZCBuYW1lIG9mIHRoaXMgdHlwZSAqLworICBjb25zdCBjaGFyICAgICAgICAgICAgICpzdHI7ICAgICAgICAgICAgICAgICAgLyogaHVtYW4gcmVhZGFibGUgbmFtZSBvZiB0aGlzIHR5cGUgKi8KKyAgc3dpZ19keWNhc3RfZnVuYyAgICAgICAgZGNhc3Q7ICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgY2FzdCBmdW5jdGlvbiBkb3duIGEgaGllcmFyY2h5ICovCisgIHN0cnVjdCBzd2lnX2Nhc3RfaW5mbyAgKmNhc3Q7ICAgICAgICAgICAgICAgICAvKiBsaW5rZWQgbGlzdCBvZiB0eXBlcyB0aGF0IGNhbiBjYXN0IGludG8gdGhpcyB0eXBlICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgKmNsaWVudGRhdGE7ICAgICAgICAgICAvKiBsYW5ndWFnZSBzcGVjaWZpYyB0eXBlIGRhdGEgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICBvd25kYXRhOyAgICAgICAgICAgICAgIC8qIGZsYWcgaWYgdGhlIHN0cnVjdHVyZSBvd25zIHRoZSBjbGllbnRkYXRhICovCit9IHN3aWdfdHlwZV9pbmZvOworCisvKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgYSB0eXBlIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9uIHVzZWQgZm9yIGNhc3RpbmcgKi8KK3R5cGVkZWYgc3RydWN0IHN3aWdfY2FzdF9pbmZvIHsKKyAgc3dpZ190eXBlX2luZm8gICAgICAgICAqdHlwZTsgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdHlwZSB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyB0eXBlICovCisgIHN3aWdfY29udmVydGVyX2Z1bmMgICAgIGNvbnZlcnRlcjsgICAgICAgICAgICAvKiBmdW5jdGlvbiB0byBjYXN0IHRoZSB2b2lkIHBvaW50ZXJzICovCisgIHN0cnVjdCBzd2lnX2Nhc3RfaW5mbyAgKm5leHQ7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgY2FzdCBpbiBsaW5rZWQgbGlzdCAqLworICBzdHJ1Y3Qgc3dpZ19jYXN0X2luZm8gICpwcmV2OyAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgcHJldmlvdXMgY2FzdCAqLworfSBzd2lnX2Nhc3RfaW5mbzsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgbW9kdWxlIGluZm9ybWF0aW9uCisgKiBFYWNoIG1vZHVsZSBnZW5lcmF0ZXMgb25lIHN0cnVjdHVyZSBsaWtlIHRoaXMsIGFuZCB0aGUgcnVudGltZSBjb2xsZWN0cworICogYWxsIG9mIHRoZXNlIHN0cnVjdHVyZXMgYW5kIHN0b3JlcyB0aGVtIGluIGEgY2lyY3VsYXJseSBsaW5rZWQgbGlzdC4qLwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ19tb2R1bGVfaW5mbyB7CisgIHN3aWdfdHlwZV9pbmZvICAgICAgICAgKip0eXBlczsgICAgICAgICAgICAgICAvKiBBcnJheSBvZiBwb2ludGVycyB0byBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGluIHRoaXMgbW9kdWxlICovCisgIHNpemVfdCAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdHlwZXMgaW4gdGhpcyBtb2R1bGUgKi8KKyAgc3RydWN0IHN3aWdfbW9kdWxlX2luZm8gKm5leHQ7ICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBlbGVtZW50IGluIGNpcmN1bGFybHkgbGlua2VkIGxpc3QgKi8KKyAgc3dpZ190eXBlX2luZm8gICAgICAgICAqKnR5cGVfaW5pdGlhbDsgICAgICAgIC8qIEFycmF5IG9mIGluaXRpYWxseSBnZW5lcmF0ZWQgdHlwZSBzdHJ1Y3R1cmVzICovCisgIHN3aWdfY2FzdF9pbmZvICAgICAgICAgKipjYXN0X2luaXRpYWw7ICAgICAgICAvKiBBcnJheSBvZiBpbml0aWFsbHkgZ2VuZXJhdGVkIGNhc3Rpbmcgc3RydWN0dXJlcyAqLworICB2b2lkICAgICAgICAgICAgICAgICAgICAqY2xpZW50ZGF0YTsgICAgICAgICAgLyogTGFuZ3VhZ2Ugc3BlY2lmaWMgbW9kdWxlIGRhdGEgKi8KK30gc3dpZ19tb2R1bGVfaW5mbzsKKworLyoKKyAgQ29tcGFyZSB0d28gdHlwZSBuYW1lcyBza2lwcGluZyB0aGUgc3BhY2UgY2hhcmFjdGVycywgdGhlcmVmb3JlCisgICJjaGFyKiIgPT0gImNoYXIgKiIgYW5kICJDbGFzczxpbnQ+IiA9PSAiQ2xhc3M8aW50ID4iLCBldGMuCisKKyAgUmV0dXJuIDAgd2hlbiB0aGUgdHdvIG5hbWUgdHlwZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGluCisgIHN0cm5jbXAsIGJ1dCBza2lwcGluZyAnICcuCisqLworU1dJR1JVTlRJTUUgaW50CitTV0lHX1R5cGVOYW1lQ29tcChjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqbDEsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmMiwgY29uc3QgY2hhciAqbDIpIHsKKyAgZm9yICg7KGYxICE9IGwxKSAmJiAoZjIgIT0gbDIpOyArK2YxLCArK2YyKSB7CisgICAgd2hpbGUgKCgqZjEgPT0gJyAnKSAmJiAoZjEgIT0gbDEpKSArK2YxOworICAgIHdoaWxlICgoKmYyID09ICcgJykgJiYgKGYyICE9IGwyKSkgKytmMjsKKyAgICBpZiAoKmYxICE9ICpmMikgcmV0dXJuICgqZjEgPiAqZjIpID8gMSA6IC0xOworICB9CisgIHJldHVybiAoaW50KSgobDEgLSBmMSkgLSAobDIgLSBmMikpOworfQorCisvKgorICBDaGVjayB0eXBlIGVxdWl2YWxlbmNlIGluIGEgbmFtZSBsaXN0IGxpa2UgPG5hbWUxPnw8bmFtZTI+fC4uLgorICBSZXR1cm4gMCBpZiBub3QgZXF1YWwsIDEgaWYgZXF1YWwKKyovCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfVHlwZUVxdWl2KGNvbnN0IGNoYXIgKm5iLCBjb25zdCBjaGFyICp0YikgeworICBpbnQgZXF1aXYgPSAwOworICBjb25zdCBjaGFyKiB0ZSA9IHRiICsgc3RybGVuKHRiKTsKKyAgY29uc3QgY2hhciogbmUgPSBuYjsKKyAgd2hpbGUgKCFlcXVpdiAmJiAqbmUpIHsKKyAgICBmb3IgKG5iID0gbmU7ICpuZTsgKytuZSkgeworICAgICAgaWYgKCpuZSA9PSAnfCcpIGJyZWFrOworICAgIH0KKyAgICBlcXVpdiA9IChTV0lHX1R5cGVOYW1lQ29tcChuYiwgbmUsIHRiLCB0ZSkgPT0gMCkgPyAxIDogMDsKKyAgICBpZiAoKm5lKSArK25lOworICB9CisgIHJldHVybiBlcXVpdjsKK30KKworLyoKKyAgQ2hlY2sgdHlwZSBlcXVpdmFsZW5jZSBpbiBhIG5hbWUgbGlzdCBsaWtlIDxuYW1lMT58PG5hbWUyPnwuLi4KKyAgUmV0dXJuIDAgaWYgZXF1YWwsIC0xIGlmIG5iIDwgdGIsIDEgaWYgbmIgPiB0YgorKi8KK1NXSUdSVU5USU1FIGludAorU1dJR19UeXBlQ29tcGFyZShjb25zdCBjaGFyICpuYiwgY29uc3QgY2hhciAqdGIpIHsKKyAgaW50IGVxdWl2ID0gMDsKKyAgY29uc3QgY2hhciogdGUgPSB0YiArIHN0cmxlbih0Yik7CisgIGNvbnN0IGNoYXIqIG5lID0gbmI7CisgIHdoaWxlICghZXF1aXYgJiYgKm5lKSB7CisgICAgZm9yIChuYiA9IG5lOyAqbmU7ICsrbmUpIHsKKyAgICAgIGlmICgqbmUgPT0gJ3wnKSBicmVhazsKKyAgICB9CisgICAgZXF1aXYgPSAoU1dJR19UeXBlTmFtZUNvbXAobmIsIG5lLCB0YiwgdGUpID09IDApID8gMSA6IDA7CisgICAgaWYgKCpuZSkgKytuZTsKKyAgfQorICByZXR1cm4gZXF1aXY7Cit9CisKKworLyoKKyAgQ2hlY2sgdGhlIHR5cGVuYW1lCisqLworU1dJR1JVTlRJTUUgc3dpZ19jYXN0X2luZm8gKgorU1dJR19UeXBlQ2hlY2soY29uc3QgY2hhciAqYywgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIGlmICh0eSkgeworICAgIHN3aWdfY2FzdF9pbmZvICppdGVyID0gdHktPmNhc3Q7CisgICAgd2hpbGUgKGl0ZXIpIHsKKyAgICAgIGlmIChzdHJjbXAoaXRlci0+dHlwZS0+bmFtZSwgYykgPT0gMCkgeworICAgICAgICBpZiAoaXRlciA9PSB0eS0+Y2FzdCkKKyAgICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgICAgLyogTW92ZSBpdGVyIHRvIHRoZSB0b3Agb2YgdGhlIGxpbmtlZCBsaXN0ICovCisgICAgICAgIGl0ZXItPnByZXYtPm5leHQgPSBpdGVyLT5uZXh0OworICAgICAgICBpZiAoaXRlci0+bmV4dCkKKyAgICAgICAgICBpdGVyLT5uZXh0LT5wcmV2ID0gaXRlci0+cHJldjsKKyAgICAgICAgaXRlci0+bmV4dCA9IHR5LT5jYXN0OworICAgICAgICBpdGVyLT5wcmV2ID0gMDsKKyAgICAgICAgaWYgKHR5LT5jYXN0KSB0eS0+Y2FzdC0+cHJldiA9IGl0ZXI7CisgICAgICAgIHR5LT5jYXN0ID0gaXRlcjsKKyAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgICB9CisgICAgICBpdGVyID0gaXRlci0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgIElkZW50aWNhbCB0byBTV0lHX1R5cGVDaGVjaywgZXhjZXB0IHN0cmNtcCBpcyByZXBsYWNlZCB3aXRoIGEgcG9pbnRlciBjb21wYXJpc29uCisqLworU1dJR1JVTlRJTUUgc3dpZ19jYXN0X2luZm8gKgorU1dJR19UeXBlQ2hlY2tTdHJ1Y3Qoc3dpZ190eXBlX2luZm8gKmZyb20sIHN3aWdfdHlwZV9pbmZvICp0eSkgeworICBpZiAodHkpIHsKKyAgICBzd2lnX2Nhc3RfaW5mbyAqaXRlciA9IHR5LT5jYXN0OworICAgIHdoaWxlIChpdGVyKSB7CisgICAgICBpZiAoaXRlci0+dHlwZSA9PSBmcm9tKSB7CisgICAgICAgIGlmIChpdGVyID09IHR5LT5jYXN0KQorICAgICAgICAgIHJldHVybiBpdGVyOworICAgICAgICAvKiBNb3ZlIGl0ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICAgICAgaXRlci0+cHJldi0+bmV4dCA9IGl0ZXItPm5leHQ7CisgICAgICAgIGlmIChpdGVyLT5uZXh0KQorICAgICAgICAgIGl0ZXItPm5leHQtPnByZXYgPSBpdGVyLT5wcmV2OworICAgICAgICBpdGVyLT5uZXh0ID0gdHktPmNhc3Q7CisgICAgICAgIGl0ZXItPnByZXYgPSAwOworICAgICAgICBpZiAodHktPmNhc3QpIHR5LT5jYXN0LT5wcmV2ID0gaXRlcjsKKyAgICAgICAgdHktPmNhc3QgPSBpdGVyOworICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSBpdGVyLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAgQ2FzdCBhIHBvaW50ZXIgdXAgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5CisqLworU1dJR1JVTlRJTUVJTkxJTkUgdm9pZCAqCitTV0lHX1R5cGVDYXN0KHN3aWdfY2FzdF9pbmZvICp0eSwgdm9pZCAqcHRyLCBpbnQgKm5ld21lbW9yeSkgeworICByZXR1cm4gKCghdHkpIHx8ICghdHktPmNvbnZlcnRlcikpID8gcHRyIDogKCp0eS0+Y29udmVydGVyKShwdHIsIG5ld21lbW9yeSk7Cit9CisKKy8qCisgICBEeW5hbWljIHBvaW50ZXIgY2FzdGluZy4gRG93biBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyovCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqdHksIHZvaWQgKipwdHIpIHsKKyAgc3dpZ190eXBlX2luZm8gKmxhc3R0eSA9IHR5OworICBpZiAoIXR5IHx8ICF0eS0+ZGNhc3QpIHJldHVybiB0eTsKKyAgd2hpbGUgKHR5ICYmICh0eS0+ZGNhc3QpKSB7CisgICAgdHkgPSAoKnR5LT5kY2FzdCkocHRyKTsKKyAgICBpZiAodHkpIGxhc3R0eSA9IHR5OworICB9CisgIHJldHVybiBsYXN0dHk7Cit9CisKKy8qCisgIFJldHVybiB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlCisqLworU1dJR1JVTlRJTUVJTkxJTkUgY29uc3QgY2hhciAqCitTV0lHX1R5cGVOYW1lKGNvbnN0IHN3aWdfdHlwZV9pbmZvICp0eSkgeworICByZXR1cm4gdHktPm5hbWU7Cit9CisKKy8qCisgIFJldHVybiB0aGUgcHJldHR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHlwZSwKKyAgdGhhdCBpcyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGluIGEgZm9ybSBwcmVzZW50YWJsZSB0byB0aGUgdXNlci4KKyovCitTV0lHUlVOVElNRSBjb25zdCBjaGFyICoKK1NXSUdfVHlwZVByZXR0eU5hbWUoY29uc3Qgc3dpZ190eXBlX2luZm8gKnR5cGUpIHsKKyAgLyogVGhlICJzdHIiIGZpZWxkIGNvbnRhaW5zIHRoZSBlcXVpdmFsZW50IHByZXR0eSBuYW1lcyBvZiB0aGUKKyAgICAgdHlwZSwgc2VwYXJhdGVkIGJ5IHZlcnRpY2FsLWJhciBjaGFyYWN0ZXJzLiAgV2UgY2hvb3NlCisgICAgIHRvIHByaW50IHRoZSBsYXN0IG5hbWUsIGFzIGl0IGlzIG9mdGVuICg/KSB0aGUgbW9zdAorICAgICBzcGVjaWZpYy4gKi8KKyAgaWYgKCF0eXBlKSByZXR1cm4gTlVMTDsKKyAgaWYgKHR5cGUtPnN0ciAhPSBOVUxMKSB7CisgICAgY29uc3QgY2hhciAqbGFzdF9uYW1lID0gdHlwZS0+c3RyOworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgZm9yIChzID0gdHlwZS0+c3RyOyAqczsgcysrKQorICAgICAgaWYgKCpzID09ICd8JykgbGFzdF9uYW1lID0gcysxOworICAgIHJldHVybiBsYXN0X25hbWU7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiB0eXBlLT5uYW1lOworfQorCisvKgorICAgU2V0IHRoZSBjbGllbnRkYXRhIGZpZWxkIGZvciBhIHR5cGUKKyovCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1R5cGVDbGllbnREYXRhKHN3aWdfdHlwZV9pbmZvICp0aSwgdm9pZCAqY2xpZW50ZGF0YSkgeworICBzd2lnX2Nhc3RfaW5mbyAqY2FzdCA9IHRpLT5jYXN0OworICAvKiBpZiAodGktPmNsaWVudGRhdGEgPT0gY2xpZW50ZGF0YSkgcmV0dXJuOyAqLworICB0aS0+Y2xpZW50ZGF0YSA9IGNsaWVudGRhdGE7CisKKyAgd2hpbGUgKGNhc3QpIHsKKyAgICBpZiAoIWNhc3QtPmNvbnZlcnRlcikgeworICAgICAgc3dpZ190eXBlX2luZm8gKnRjID0gY2FzdC0+dHlwZTsKKyAgICAgIGlmICghdGMtPmNsaWVudGRhdGEpIHsKKyAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YSh0YywgY2xpZW50ZGF0YSk7CisgICAgICB9CisgICAgfQorICAgIGNhc3QgPSBjYXN0LT5uZXh0OworICB9Cit9CitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1R5cGVOZXdDbGllbnREYXRhKHN3aWdfdHlwZV9pbmZvICp0aSwgdm9pZCAqY2xpZW50ZGF0YSkgeworICBTV0lHX1R5cGVDbGllbnREYXRhKHRpLCBjbGllbnRkYXRhKTsKKyAgdGktPm93bmRhdGEgPSAxOworfQorCisvKgorICBTZWFyY2ggZm9yIGEgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlIG9ubHkgYnkgbWFuZ2xlZCBuYW1lCisgIFNlYXJjaCBpcyBhIE8obG9nICN0eXBlcykKKworICBXZSBzdGFydCBzZWFyY2hpbmcgYXQgbW9kdWxlIHN0YXJ0LCBhbmQgZmluaXNoIHNlYXJjaGluZyB3aGVuIHN0YXJ0ID09IGVuZC4KKyAgTm90ZTogaWYgc3RhcnQgPT0gZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLCB3ZSBnbyBhbGwgdGhlIHdheSBhcm91bmQKKyAgdGhlIGNpcmN1bGFyIGxpc3QuCisqLworU1dJR1JVTlRJTUUgc3dpZ190eXBlX2luZm8gKgorU1dJR19NYW5nbGVkVHlwZVF1ZXJ5TW9kdWxlKHN3aWdfbW9kdWxlX2luZm8gKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfbW9kdWxlX2luZm8gKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIHN3aWdfbW9kdWxlX2luZm8gKml0ZXIgPSBzdGFydDsKKyAgZG8geworICAgIGlmIChpdGVyLT5zaXplKSB7CisgICAgICByZWdpc3RlciBzaXplX3QgbCA9IDA7CisgICAgICByZWdpc3RlciBzaXplX3QgciA9IGl0ZXItPnNpemUgLSAxOworICAgICAgZG8geworICAgICAgICAvKiBzaW5jZSBsK3IgPj0gMCwgd2UgY2FuICg+PiAxKSBpbnN0ZWFkICgvIDIpICovCisgICAgICAgIHJlZ2lzdGVyIHNpemVfdCBpID0gKGwgKyByKSA+PiAxOworICAgICAgICBjb25zdCBjaGFyICppbmFtZSA9IGl0ZXItPnR5cGVzW2ldLT5uYW1lOworICAgICAgICBpZiAoaW5hbWUpIHsKKyAgICAgICAgICByZWdpc3RlciBpbnQgY29tcGFyZSA9IHN0cmNtcChuYW1lLCBpbmFtZSk7CisgICAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXItPnR5cGVzW2ldOworICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgICAgIHIgPSBpIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA+IDApIHsKKyAgICAgICAgICAgIGwgPSBpICsgMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAobCA8PSByKTsKKyAgICB9CisgICAgaXRlciA9IGl0ZXItPm5leHQ7CisgIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgIFNlYXJjaCBmb3IgYSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgZm9yIGVpdGhlciBhIG1hbmdsZWQgbmFtZSBvciBhIGh1bWFuIHJlYWRhYmxlIG5hbWUuCisgIEl0IGZpcnN0IHNlYXJjaGVzIHRoZSBtYW5nbGVkIG5hbWVzIG9mIHRoZSB0eXBlcywgd2hpY2ggaXMgYSBPKGxvZyAjdHlwZXMpCisgIElmIGEgdHlwZSBpcyBub3QgZm91bmQgaXQgdGhlbiBzZWFyY2hlcyB0aGUgaHVtYW4gcmVhZGFibGUgbmFtZXMsIHdoaWNoIGlzIE8oI3R5cGVzKS4KKworICBXZSBzdGFydCBzZWFyY2hpbmcgYXQgbW9kdWxlIHN0YXJ0LCBhbmQgZmluaXNoIHNlYXJjaGluZyB3aGVuIHN0YXJ0ID09IGVuZC4KKyAgTm90ZTogaWYgc3RhcnQgPT0gZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLCB3ZSBnbyBhbGwgdGhlIHdheSBhcm91bmQKKyAgdGhlIGNpcmN1bGFyIGxpc3QuCisqLworU1dJR1JVTlRJTUUgc3dpZ190eXBlX2luZm8gKgorU1dJR19UeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGVfaW5mbyAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBzd2lnX21vZHVsZV9pbmZvICplbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIC8qIFNURVAgMTogU2VhcmNoIHRoZSBuYW1lIGZpZWxkIHVzaW5nIGJpbmFyeSBzZWFyY2ggKi8KKyAgc3dpZ190eXBlX2luZm8gKnJldCA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZShzdGFydCwgZW5kLCBuYW1lKTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSB7CisgICAgLyogU1RFUCAyOiBJZiB0aGUgdHlwZSBoYXNuJ3QgYmVlbiBmb3VuZCwgZG8gYSBjb21wbGV0ZSBzZWFyY2gKKyAgICAgICBvZiB0aGUgc3RyIGZpZWxkICh0aGUgaHVtYW4gcmVhZGFibGUgbmFtZSkgKi8KKyAgICBzd2lnX21vZHVsZV9pbmZvICppdGVyID0gc3RhcnQ7CisgICAgZG8geworICAgICAgcmVnaXN0ZXIgc2l6ZV90IGkgPSAwOworICAgICAgZm9yICg7IGkgPCBpdGVyLT5zaXplOyArK2kpIHsKKyAgICAgICAgaWYgKGl0ZXItPnR5cGVzW2ldLT5zdHIgJiYgKFNXSUdfVHlwZUVxdWl2KGl0ZXItPnR5cGVzW2ldLT5zdHIsIG5hbWUpKSkKKyAgICAgICAgICByZXR1cm4gaXRlci0+dHlwZXNbaV07CisgICAgICB9CisgICAgICBpdGVyID0gaXRlci0+bmV4dDsKKyAgICB9IHdoaWxlIChpdGVyICE9IGVuZCk7CisgIH0KKworICAvKiBuZWl0aGVyIGZvdW5kIGEgbWF0Y2ggKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgICBQYWNrIGJpbmFyeSBkYXRhIGludG8gYSBzdHJpbmcKKyovCitTV0lHUlVOVElNRSBjaGFyICoKK1NXSUdfUGFja0RhdGEoY2hhciAqYywgdm9pZCAqcHRyLCBzaXplX3Qgc3opIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgaGV4WzE3XSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqdSA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZXUgPSAgdSArIHN6OworICBmb3IgKDsgdSAhPSBldTsgKyt1KSB7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1dSA9ICp1OworICAgICooYysrKSA9IGhleFsodXUgJiAweGYwKSA+PiA0XTsKKyAgICAqKGMrKykgPSBoZXhbdXUgJiAweGZdOworICB9CisgIHJldHVybiBjOworfQorCisvKgorICAgVW5wYWNrIGJpbmFyeSBkYXRhIGZyb20gYSBzdHJpbmcKKyovCitTV0lHUlVOVElNRSBjb25zdCBjaGFyICoKK1NXSUdfVW5wYWNrRGF0YShjb25zdCBjaGFyICpjLCB2b2lkICpwdHIsIHNpemVfdCBzeikgeworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICp1ID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpldSA9IHUgKyBzejsKKyAgZm9yICg7IHUgIT0gZXU7ICsrdSkgeworICAgIHJlZ2lzdGVyIGNoYXIgZCA9ICooYysrKTsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHV1OworICAgIGlmICgoZCA+PSAnMCcpICYmIChkIDw9ICc5JykpCisgICAgICB1dSA9ICgoZCAtICcwJykgPDwgNCk7CisgICAgZWxzZSBpZiAoKGQgPj0gJ2EnKSAmJiAoZCA8PSAnZicpKQorICAgICAgdXUgPSAoKGQgLSAoJ2EnLTEwKSkgPDwgNCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChjaGFyICopIDA7CisgICAgZCA9ICooYysrKTsKKyAgICBpZiAoKGQgPj0gJzAnKSAmJiAoZCA8PSAnOScpKQorICAgICAgdXUgfD0gKGQgLSAnMCcpOworICAgIGVsc2UgaWYgKChkID49ICdhJykgJiYgKGQgPD0gJ2YnKSkKKyAgICAgIHV1IHw9IChkIC0gKCdhJy0xMCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiAoY2hhciAqKSAwOworICAgICp1ID0gdXU7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKKy8qCisgICBQYWNrICd2b2lkIConIGludG8gYSBzdHJpbmcgYnVmZmVyLgorKi8KK1NXSUdSVU5USU1FIGNoYXIgKgorU1dJR19QYWNrVm9pZFB0cihjaGFyICpidWZmLCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBic3opIHsKKyAgY2hhciAqciA9IGJ1ZmY7CisgIGlmICgoMipzaXplb2Yodm9pZCAqKSArIDIpID4gYnN6KSByZXR1cm4gMDsKKyAgKihyKyspID0gJ18nOworICByID0gU1dJR19QYWNrRGF0YShyLCZwdHIsc2l6ZW9mKHZvaWQgKikpOworICBpZiAoc3RybGVuKG5hbWUpICsgMSA+IChic3ogLSAociAtIGJ1ZmYpKSkgcmV0dXJuIDA7CisgIHN0cmNweShyLG5hbWUpOworICByZXR1cm4gYnVmZjsKK30KKworU1dJR1JVTlRJTUUgY29uc3QgY2hhciAqCitTV0lHX1VucGFja1ZvaWRQdHIoY29uc3QgY2hhciAqYywgdm9pZCAqKnB0ciwgY29uc3QgY2hhciAqbmFtZSkgeworICBpZiAoKmMgIT0gJ18nKSB7CisgICAgaWYgKHN0cmNtcChjLCJOVUxMIikgPT0gMCkgeworICAgICAgKnB0ciA9ICh2b2lkICopIDA7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiBTV0lHX1VucGFja0RhdGEoKytjLHB0cixzaXplb2Yodm9pZCAqKSk7Cit9CisKK1NXSUdSVU5USU1FIGNoYXIgKgorU1dJR19QYWNrRGF0YU5hbWUoY2hhciAqYnVmZiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBic3opIHsKKyAgY2hhciAqciA9IGJ1ZmY7CisgIHNpemVfdCBsbmFtZSA9IChuYW1lID8gc3RybGVuKG5hbWUpIDogMCk7CisgIGlmICgoMipzeiArIDIgKyBsbmFtZSkgPiBic3opIHJldHVybiAwOworICAqKHIrKykgPSAnXyc7CisgIHIgPSBTV0lHX1BhY2tEYXRhKHIscHRyLHN6KTsKKyAgaWYgKGxuYW1lKSB7CisgICAgc3RybmNweShyLG5hbWUsbG5hbWUrMSk7CisgIH0gZWxzZSB7CisgICAgKnIgPSAwOworICB9CisgIHJldHVybiBidWZmOworfQorCitTV0lHUlVOVElNRSBjb25zdCBjaGFyICoKK1NXSUdfVW5wYWNrRGF0YU5hbWUoY29uc3QgY2hhciAqYywgdm9pZCAqcHRyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaWYgKCpjICE9ICdfJykgeworICAgIGlmIChzdHJjbXAoYywiTlVMTCIpID09IDApIHsKKyAgICAgIG1lbXNldChwdHIsMCxzeik7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiBTV0lHX1VucGFja0RhdGEoKytjLHB0cixzeik7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qICBFcnJvcnMgaW4gU1dJRyAqLworI2RlZmluZSAgU1dJR19Vbmtub3duRXJyb3IgICAgICAgICAtMQorI2RlZmluZSAgU1dJR19JT0Vycm9yICAgICAgICAgICAgICAtMgorI2RlZmluZSAgU1dJR19SdW50aW1lRXJyb3IgICAgICAgICAtMworI2RlZmluZSAgU1dJR19JbmRleEVycm9yICAgICAgICAgICAtNAorI2RlZmluZSAgU1dJR19UeXBlRXJyb3IgICAgICAgICAgICAtNQorI2RlZmluZSAgU1dJR19EaXZpc2lvbkJ5WmVybyAgICAgICAtNgorI2RlZmluZSAgU1dJR19PdmVyZmxvd0Vycm9yICAgICAgICAtNworI2RlZmluZSAgU1dJR19TeW50YXhFcnJvciAgICAgICAgICAtOAorI2RlZmluZSAgU1dJR19WYWx1ZUVycm9yICAgICAgICAgICAtOQorI2RlZmluZSAgU1dJR19TeXN0ZW1FcnJvciAgICAgICAgICAtMTAKKyNkZWZpbmUgIFNXSUdfQXR0cmlidXRlRXJyb3IgICAgICAgLTExCisjZGVmaW5lICBTV0lHX01lbW9yeUVycm9yICAgICAgICAgIC0xMgorI2RlZmluZSAgU1dJR19OdWxsUmVmZXJlbmNlRXJyb3IgICAtMTMKKworCisKKy8qIENvbXBhdGliaWxpdHkgbWFjcm9zIGZvciBQeXRob24gMyAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKworI2RlZmluZSBQeUNsYXNzX0NoZWNrKG9iaikgUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCAqKSZQeVR5cGVfVHlwZSkKKyNkZWZpbmUgUHlJbnRfQ2hlY2soeCkgUHlMb25nX0NoZWNrKHgpCisjZGVmaW5lIFB5SW50X0FzTG9uZyh4KSBQeUxvbmdfQXNMb25nKHgpCisjZGVmaW5lIFB5SW50X0Zyb21Mb25nKHgpIFB5TG9uZ19Gcm9tTG9uZyh4KQorI2RlZmluZSBQeVN0cmluZ19DaGVjayhuYW1lKSBQeUJ5dGVzX0NoZWNrKG5hbWUpCisjZGVmaW5lIFB5U3RyaW5nX0Zyb21TdHJpbmcoeCkgUHlVbmljb2RlX0Zyb21TdHJpbmcoeCkKKyNkZWZpbmUgUHlTdHJpbmdfRm9ybWF0KGZtdCwgYXJncykgIFB5VW5pY29kZV9Gb3JtYXQoZm10LCBhcmdzKQorI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpIFB5Qnl0ZXNfQXNTdHJpbmcoc3RyKQorI2RlZmluZSBQeVN0cmluZ19TaXplKHN0cikgUHlCeXRlc19TaXplKHN0cikKKyNkZWZpbmUgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhrZXkpIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKGtleSkKKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX0NMQVNTIFB5X1RQRkxBR1NfQkFTRVRZUEUKKyNkZWZpbmUgUHlTdHJpbmdfQVNfU1RSSU5HKHgpIFB5VW5pY29kZV9BU19TVFJJTkcoeCkKKyNkZWZpbmUgX1B5TG9uZ19Gcm9tU3NpemVfdCh4KSBQeUxvbmdfRnJvbVNzaXplX3QoeCkKKworI2VuZGlmCisKKyNpZm5kZWYgUHlfVFlQRQorIyAgZGVmaW5lIFB5X1RZUEUob3ApICgob3ApLT5vYl90eXBlKQorI2VuZGlmCisKKy8qIFNXSUcgQVBJcyBmb3IgY29tcGF0aWJpbGl0eSBvZiBib3RoIFB5dGhvbiAyICYgMyAqLworCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorIyAgZGVmaW5lIFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0IFB5VW5pY29kZV9Gcm9tRm9ybWF0CisjZWxzZQorIyAgZGVmaW5lIFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0IFB5U3RyaW5nX0Zyb21Gb3JtYXQKKyNlbmRpZgorCisKKy8qIFdhcm5pbmc6IFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIG5ldyBzdHJpbmcgaW4gUHl0aG9uIDMsCisgKiBzbyBwbGVhc2UgY2FsbCBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHgpIHRvIGZyZWUgdGhlIHNwYWNlLgorICovCitTV0lHSU5URVJOIGNoYXIqCitTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKFB5T2JqZWN0ICpzdHIpCit7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICBjaGFyICpjc3RyOworICBjaGFyICpuZXdzdHI7CisgIFB5X3NzaXplX3QgbGVuOworICBzdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHN0cik7CisgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKHN0ciwgJmNzdHIsICZsZW4pOworICBuZXdzdHIgPSAoY2hhciAqKSBtYWxsb2MobGVuKzEpOworICBtZW1jcHkobmV3c3RyLCBjc3RyLCBsZW4rMSk7CisgIFB5X1hERUNSRUYoc3RyKTsKKyAgcmV0dXJuIG5ld3N0cjsKKyNlbHNlCisgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworI2VuZGlmCit9CisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh4KSBmcmVlKCAodm9pZCopICh4KSApCisjZWxzZQorIyAgZGVmaW5lIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoeCkKKyNlbmRpZgorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QqCitTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIoY29uc3QgY2hhciAqYykKK3sKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhjKTsKKyNlbHNlCisgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGMpOworI2VuZGlmCit9CisKKy8qIEFkZCBQeU9TX3NucHJpbnRmIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfV0FUQ09NKQorIyAgZGVmaW5lIFB5T1Nfc25wcmludGYgX3NucHJpbnRmCisjIGVsc2UKKyMgIGRlZmluZSBQeU9TX3NucHJpbnRmIHNucHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworLyogQSBjcnVkZSBQeVN0cmluZ19Gcm9tRm9ybWF0IGltcGxlbWVudGF0aW9uIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorCisjaWZuZGVmIFNXSUdfUFlCVUZGRVJfU0laRQorIyBkZWZpbmUgU1dJR19QWUJVRkZFUl9TSVpFIDEwMjQKKyNlbmRpZgorCitzdGF0aWMgUHlPYmplY3QgKgorUHlTdHJpbmdfRnJvbUZvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLikgeworICB2YV9saXN0IGFwOworICBjaGFyIGJ1ZltTV0lHX1BZQlVGRkVSX1NJWkUgKiAyXTsKKyAgaW50IHJlczsKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIHJlcyA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIChyZXMgPCAwIHx8IHJlcyA+PSAoaW50KXNpemVvZihidWYpKSA/IDAgOiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Cit9CisjZW5kaWYKKworLyogQWRkIFB5T2JqZWN0X0RlbCBmb3Igb2xkIFB5dGhvbnMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDEwNjAwMDAKKyMgZGVmaW5lIFB5T2JqZWN0X0RlbChvcCkgUHlNZW1fREVMKChvcCkpCisjZW5kaWYKKyNpZm5kZWYgUHlPYmplY3RfREVMCisjIGRlZmluZSBQeU9iamVjdF9ERUwgUHlPYmplY3RfRGVsCisjZW5kaWYKKworLyogQSBjcnVkZSBQeUV4Y19TdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbiBmb3Igb2xkIFB5dGhvbnMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyMgaWZuZGVmIFB5RXhjX1N0b3BJdGVyYXRpb24KKyMgIGRlZmluZSBQeUV4Y19TdG9wSXRlcmF0aW9uIFB5RXhjX1J1bnRpbWVFcnJvcgorIyBlbmRpZgorIyBpZm5kZWYgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIKKyMgIGRlZmluZSBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciAwCisjIGVuZGlmCisjZW5kaWYKKworLyogUHlfTm90SW1wbGVtZW50ZWQgaXMgZGVmaW5lZCBpbiAyLjEgYW5kIHVwLiAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAxMDAwMAorIyBpZm5kZWYgUHlfTm90SW1wbGVtZW50ZWQKKyMgIGRlZmluZSBQeV9Ob3RJbXBsZW1lbnRlZCBQeUV4Y19SdW50aW1lRXJyb3IKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBIGNydWRlIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSBpbXBsZW1lbnRhdGlvbiBmb3Igb2xkIFB5dGhvbnMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMTAwMDAKKyMgaWZuZGVmIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZQorIyAgZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYmosIHMsIGxlbikgeypzID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsgKmxlbiA9ICpzID8gc3RybGVuKCpzKSA6IDA7fQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFB5U2VxdWVuY2VfU2l6ZSBmb3Igb2xkIFB5dGhvbnMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMDAwMDAKKyMgaWZuZGVmIFB5U2VxdWVuY2VfU2l6ZQorIyAgZGVmaW5lIFB5U2VxdWVuY2VfU2l6ZSBQeVNlcXVlbmNlX0xlbmd0aAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFB5Qm9vbF9Gcm9tTG9uZyBmb3Igb2xkIFB5dGhvbnMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMzAwMDAKK3N0YXRpYworUHlPYmplY3QgKlB5Qm9vbF9Gcm9tTG9uZyhsb25nIG9rKQoreworICBQeU9iamVjdCAqcmVzdWx0ID0gb2sgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgIFB5X0lOQ1JFRihyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qIFB5X3NzaXplX3QgZm9yIG9sZCBQeXRob25zICovCisvKiBUaGlzIGNvZGUgaXMgYXMgcmVjb21tZW5kZWQgYnk6ICovCisvKiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAzNTMvI2NvbnZlcnNpb24tZ3VpZGVsaW5lcyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCAmJiAhZGVmaW5lZChQWV9TU0laRV9UX01JTikKK3R5cGVkZWYgaW50IFB5X3NzaXplX3Q7CisjIGRlZmluZSBQWV9TU0laRV9UX01BWCBJTlRfTUFYCisjIGRlZmluZSBQWV9TU0laRV9UX01JTiBJTlRfTUlOCit0eXBlZGVmIGlucXVpcnkgbGVuZnVuYzsKK3R5cGVkZWYgaW50YXJnZnVuYyBzc2l6ZWFyZ2Z1bmM7Cit0eXBlZGVmIGludGludGFyZ2Z1bmMgc3NpemVzc2l6ZWFyZ2Z1bmM7Cit0eXBlZGVmIGludG9iamFyZ3Byb2Mgc3NpemVvYmphcmdwcm9jOwordHlwZWRlZiBpbnRpbnRvYmphcmdwcm9jIHNzaXplc3NpemVvYmphcmdwcm9jOwordHlwZWRlZiBnZXRyZWFkYnVmZmVycHJvYyByZWFkYnVmZmVycHJvYzsKK3R5cGVkZWYgZ2V0d3JpdGVidWZmZXJwcm9jIHdyaXRlYnVmZmVycHJvYzsKK3R5cGVkZWYgZ2V0c2VnY291bnRwcm9jIHNlZ2NvdW50cHJvYzsKK3R5cGVkZWYgZ2V0Y2hhcmJ1ZmZlcnByb2MgY2hhcmJ1ZmZlcnByb2M7CitzdGF0aWMgbG9uZyBQeU51bWJlcl9Bc1NzaXplX3QgKFB5T2JqZWN0ICp4LCB2b2lkICpTV0lHVU5VU0VEUEFSTShleGMpKQoreworICBsb25nIHJlc3VsdCA9IDA7CisgIFB5T2JqZWN0ICppID0gUHlOdW1iZXJfSW50KHgpOworICBpZiAoaSkgeworICAgIHJlc3VsdCA9IFB5SW50X0FzTG9uZyhpKTsKKyAgICBQeV9ERUNSRUYoaSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDQwMDAwCisjZGVmaW5lIFB5X1ZJU0lUKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgdnJldCA9IHZpc2l0KChvcCksIGFyZyk7ICAgICAgICAgICAgICBcCisgICAgICBpZiAodnJldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAzMDAwMAordHlwZWRlZiBzdHJ1Y3QgeworICBQeVR5cGVPYmplY3QgdHlwZTsKKyAgUHlOdW1iZXJNZXRob2RzIGFzX251bWJlcjsKKyAgUHlNYXBwaW5nTWV0aG9kcyBhc19tYXBwaW5nOworICBQeVNlcXVlbmNlTWV0aG9kcyBhc19zZXF1ZW5jZTsKKyAgUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7CisgIFB5T2JqZWN0ICpuYW1lLCAqc2xvdHM7Cit9IFB5SGVhcFR5cGVPYmplY3Q7CisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAzMDAwMAordHlwZWRlZiBkZXN0cnVjdG9yIGZyZWVmdW5jOworI2VuZGlmCisKKyNpZiAoKFBZX01BSk9SX1ZFUlNJT04gPT0gMiAmJiBQWV9NSU5PUl9WRVJTSU9OID4gNikgfHwgXAorICAgICAoUFlfTUFKT1JfVkVSU0lPTiA9PSAzICYmIFBZX01JTk9SX1ZFUlNJT04gPiAwKSB8fCBcCisgICAgIChQWV9NQUpPUl9WRVJTSU9OID4gMykpCisjIGRlZmluZSBTV0lHUFlfVVNFX0NBUFNVTEUKKyMgZGVmaW5lIFNXSUdQWV9DQVBTVUxFX05BTUUgKChjaGFyKikic3dpZ19ydW50aW1lX2RhdGEiIFNXSUdfUlVOVElNRV9WRVJTSU9OICIudHlwZV9wb2ludGVyX2NhcHN1bGUiIFNXSUdfVFlQRV9UQUJMRV9OQU1FKQorI2VuZGlmCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMjAwMDAKKyNkZWZpbmUgUHlEZXNjcl9UWVBFKHgpICgoKFB5RGVzY3JPYmplY3QgKikoeCkpLT5kX3R5cGUpCisjZGVmaW5lIFB5RGVzY3JfTkFNRSh4KSAoKChQeURlc2NyT2JqZWN0ICopKHgpKS0+ZF9uYW1lKQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBlcnJvciBtYW5pcHVsYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU1dJR19QeXRob25fRXJyb3JUeXBlKGludCBjb2RlKSB7CisgIFB5T2JqZWN0KiB0eXBlID0gMDsKKyAgc3dpdGNoKGNvZGUpIHsKKyAgY2FzZSBTV0lHX01lbW9yeUVycm9yOgorICAgIHR5cGUgPSBQeUV4Y19NZW1vcnlFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX0lPRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX0lPRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19SdW50aW1lRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX1J1bnRpbWVFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX0luZGV4RXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX0luZGV4RXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19UeXBlRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX1R5cGVFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX0RpdmlzaW9uQnlaZXJvOgorICAgIHR5cGUgPSBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX092ZXJmbG93RXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX092ZXJmbG93RXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeW50YXhFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfU3ludGF4RXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19WYWx1ZUVycm9yOgorICAgIHR5cGUgPSBQeUV4Y19WYWx1ZUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfU3lzdGVtRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX1N5c3RlbUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfQXR0cmlidXRlRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX0F0dHJpYnV0ZUVycm9yOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHR5cGUgPSBQeUV4Y19SdW50aW1lRXJyb3I7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fQWRkRXJyb3JNc2coY29uc3QgY2hhciogbWVzZykKK3sKKyAgUHlPYmplY3QgKnR5cGUgPSAwOworICBQeU9iamVjdCAqdmFsdWUgPSAwOworICBQeU9iamVjdCAqdHJhY2ViYWNrID0gMDsKKworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRyYWNlYmFjayk7CisgIGlmICh2YWx1ZSkgeworICAgIGNoYXIgKnRtcDsKKyAgICBQeU9iamVjdCAqb2xkX3N0ciA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YSU5DUkVGKHR5cGUpOworCisgICAgUHlFcnJfRm9ybWF0KHR5cGUsICIlcyAlcyIsIHRtcCA9IFNXSUdfUHl0aG9uX3N0cl9Bc0NoYXIob2xkX3N0ciksIG1lc2cpOworICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTModG1wKTsKKyAgICBQeV9ERUNSRUYob2xkX3N0cik7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCBtZXNnKTsKKyAgfQorfQorCisjaWYgZGVmaW5lZChTV0lHX1BZVEhPTl9OT19USFJFQURTKQorIyAgaWYgZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURTKQorIyAgICB1bmRlZiBTV0lHX1BZVEhPTl9USFJFQURTCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURTKSAvKiBUaHJlYWRpbmcgc3VwcG9ydCBpcyBlbmFibGVkICovCisjICBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9VU0VfR0lMKSAmJiAhZGVmaW5lZChTV0lHX1BZVEhPTl9OT19VU0VfR0lMKQorIyAgICBpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMCkgLyogRm9yIDIuMyBvciBsYXRlciwgdXNlIHRoZSBQeUdJTFN0YXRlIGNhbGxzICovCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1VTRV9HSUwKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1VTRV9HSUwpIC8qIFVzZSBQeUdJTFN0YXRlIHRocmVhZHMgY2FsbHMgKi8KKyMgICAgaWZuZGVmIFNXSUdfUFlUSE9OX0lOSVRJQUxJWkVfVEhSRUFEUworIyAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX0lOSVRJQUxJWkVfVEhSRUFEUyAgUHlFdmFsX0luaXRUaHJlYWRzKCkKKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgX19jcGx1c3BsdXMgLyogQysrIGNvZGUgKi8KKyAgICAgICBjbGFzcyBTV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2sgeworICAgICAgICAgYm9vbCBzdGF0dXM7CisgICAgICAgICBQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworICAgICAgIHB1YmxpYzoKKyAgICAgICAgIHZvaWQgZW5kKCkgeyBpZiAoc3RhdHVzKSB7IFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7IHN0YXR1cyA9IGZhbHNlO30gfQorICAgICAgICAgU1dJR19QeXRob25fVGhyZWFkX0Jsb2NrKCkgOiBzdGF0dXModHJ1ZSksIHN0YXRlKFB5R0lMU3RhdGVfRW5zdXJlKCkpIHt9CisgICAgICAgICB+U1dJR19QeXRob25fVGhyZWFkX0Jsb2NrKCkgeyBlbmQoKTsgfQorICAgICAgIH07CisgICAgICAgY2xhc3MgU1dJR19QeXRob25fVGhyZWFkX0FsbG93IHsKKyAgICAgICAgIGJvb2wgc3RhdHVzOworICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqc2F2ZTsKKyAgICAgICBwdWJsaWM6CisgICAgICAgICB2b2lkIGVuZCgpIHsgaWYgKHN0YXR1cykgeyBQeUV2YWxfUmVzdG9yZVRocmVhZChzYXZlKTsgc3RhdHVzID0gZmFsc2U7IH19CisgICAgICAgICBTV0lHX1B5dGhvbl9UaHJlYWRfQWxsb3coKSA6IHN0YXR1cyh0cnVlKSwgc2F2ZShQeUV2YWxfU2F2ZVRocmVhZCgpKSB7fQorICAgICAgICAgflNXSUdfUHl0aG9uX1RocmVhZF9BbGxvdygpIHsgZW5kKCk7IH0KKyAgICAgICB9OworIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sgICBTV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2sgX3N3aWdfdGhyZWFkX2Jsb2NrCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0sgICAgIF9zd2lnX3RocmVhZF9ibG9jay5lbmQoKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cgICBTV0lHX1B5dGhvbl9UaHJlYWRfQWxsb3cgX3N3aWdfdGhyZWFkX2FsbG93CisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQUxMT1cgICAgIF9zd2lnX3RocmVhZF9hbGxvdy5lbmQoKQorIyAgICBlbHNlIC8qIEMgY29kZSAqLworIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sgICBQeUdJTFN0YXRlX1NUQVRFIF9zd2lnX3RocmVhZF9ibG9jayA9IFB5R0lMU3RhdGVfRW5zdXJlKCkKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSyAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKF9zd2lnX3RocmVhZF9ibG9jaykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0FMTE9XICAgUHlUaHJlYWRTdGF0ZSAqX3N3aWdfdGhyZWFkX2FsbG93ID0gUHlFdmFsX1NhdmVUaHJlYWQoKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0FMTE9XICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfc3dpZ190aHJlYWRfYWxsb3cpCisjICAgIGVuZGlmCisjICBlbHNlIC8qIE9sZCB0aHJlYWQgd2F5LCBub3QgaW1wbGVtZW50ZWQsIHVzZXIgbXVzdCBwcm92aWRlIGl0ICovCisjICAgIGlmICFkZWZpbmVkKFNXSUdfUFlUSE9OX0lOSVRJQUxJWkVfVEhSRUFEUykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0spCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0sKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0FMTE9XKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbHNlIC8qIE5vIHRocmVhZCBzdXBwb3J0ICovCisjICBkZWZpbmUgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSworIyAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9BTExPVworIyAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQUxMT1cKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHl0aG9uIEFQSSBwb3J0aW9uIHRoYXQgZ29lcyBpbnRvIHRoZSBydW50aW1lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb25zdGFudCBkZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENvbnN0YW50IFR5cGVzICovCisjZGVmaW5lIFNXSUdfUFlfUE9JTlRFUiA0CisjZGVmaW5lIFNXSUdfUFlfQklOQVJZICA1CisKKy8qIENvbnN0YW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ19jb25zdF9pbmZvIHsKKyAgaW50IHR5cGU7CisgIGNoYXIgKm5hbWU7CisgIGxvbmcgbHZhbHVlOworICBkb3VibGUgZHZhbHVlOworICB2b2lkICAgKnB2YWx1ZTsKKyAgc3dpZ190eXBlX2luZm8gKipwdHlwZTsKK30gc3dpZ19jb25zdF9pbmZvOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcmFwcGVyIG9mIFB5SW5zdGFuY2VNZXRob2RfTmV3KCkgdXNlZCBpbiBQeXRob24gMworICogSXQgaXMgZXhwb3J0ZWQgdG8gdGhlIGdlbmVyYXRlZCBtb2R1bGUsIHVzZWQgZm9yIC1mYXN0cHJveHkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorU1dJR1JVTlRJTUUgUHlPYmplY3QqIFNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXcoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqZnVuYykKK3sKKyAgcmV0dXJuIFB5SW5zdGFuY2VNZXRob2RfTmV3KGZ1bmMpOworfQorI2Vsc2UKK1NXSUdSVU5USU1FIFB5T2JqZWN0KiBTV0lHX1B5SW5zdGFuY2VNZXRob2RfTmV3KFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKGZ1bmMpKQoreworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBweXJ1bi5zd2cKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUHl0aG9uIG1vZHVsZXMKKyAqIGFuZCBpbmNsdWRlcyBjb2RlIGZvciBtYW5hZ2luZyBnbG9iYWwgdmFyaWFibGVzIGFuZCBwb2ludGVyCisgKiB0eXBlIGNoZWNraW5nLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENvbW1vbiBTV0lHIEFQSSAqLworCisvKiBmb3IgcmF3IHBvaW50ZXJzICovCisjZGVmaW5lIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHIob2JqLCBwcHRyLCB0eXBlLCBmbGFncykgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJBbmRPd24ob2JqLCBwcHRyLCB0eXBlLCBmbGFncywgMCkKKyNkZWZpbmUgU1dJR19Db252ZXJ0UHRyKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MpICAgICAgICAgU1dJR19QeXRob25fQ29udmVydFB0cihvYmosIHBwdHIsIHR5cGUsIGZsYWdzKQorI2RlZmluZSBTV0lHX0NvbnZlcnRQdHJBbmRPd24ob2JqLHBwdHIsdHlwZSxmbGFncyxvd24pICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyQW5kT3duKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MsIG93bikKKworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorI2RlZmluZSBTV0lHX05ld1BvaW50ZXJPYmoocHRyLCB0eXBlLCBmbGFncykgICAgICAgICAgICBTV0lHX1B5dGhvbl9OZXdQb2ludGVyT2JqKHNlbGYsIHB0ciwgdHlwZSwgZmxhZ3MpCisjZWxzZQorI2RlZmluZSBTV0lHX05ld1BvaW50ZXJPYmoocHRyLCB0eXBlLCBmbGFncykgICAgICAgICAgICBTV0lHX1B5dGhvbl9OZXdQb2ludGVyT2JqKE5VTEwsIHB0ciwgdHlwZSwgZmxhZ3MpCisjZW5kaWYKKworI2RlZmluZSBTV0lHX0ludGVybmFsTmV3UG9pbnRlck9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICBTV0lHX1B5dGhvbl9OZXdQb2ludGVyT2JqKE5VTEwsIHB0ciwgdHlwZSwgZmxhZ3MpCisKKyNkZWZpbmUgU1dJR19DaGVja0ltcGxpY2l0KHR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJR19QeXRob25fQ2hlY2tJbXBsaWNpdCh0eSkKKyNkZWZpbmUgU1dJR19BY3F1aXJlUHRyKHB0ciwgc3JjKSAgICAgICAgICAgICAgICAgICAgICAgU1dJR19QeXRob25fQWNxdWlyZVB0cihwdHIsIHNyYykKKyNkZWZpbmUgc3dpZ19vd250eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CisKKy8qIGZvciByYXcgcGFja2VkIGRhdGEgKi8KKyNkZWZpbmUgU1dJR19Db252ZXJ0UGFja2VkKG9iaiwgcHRyLCBzeiwgdHkpICAgICAgICAgICAgU1dJR19QeXRob25fQ29udmVydFBhY2tlZChvYmosIHB0ciwgc3osIHR5KQorI2RlZmluZSBTV0lHX05ld1BhY2tlZE9iaihwdHIsIHN6LCB0eXBlKSAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9OZXdQYWNrZWRPYmoocHRyLCBzeiwgdHlwZSkKKworLyogZm9yIGNsYXNzIG9yIHN0cnVjdCBwb2ludGVycyAqLworI2RlZmluZSBTV0lHX0NvbnZlcnRJbnN0YW5jZShvYmosIHBwdHIsIHR5cGUsIGZsYWdzKSAgICBTV0lHX0NvbnZlcnRQdHIob2JqLCBwcHRyLCB0eXBlLCBmbGFncykKKyNkZWZpbmUgU1dJR19OZXdJbnN0YW5jZU9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKHB0ciwgdHlwZSwgZmxhZ3MpCisKKy8qIGZvciBDIG9yIEMrKyBmdW5jdGlvbiBwb2ludGVycyAqLworI2RlZmluZSBTV0lHX0NvbnZlcnRGdW5jdGlvblB0cihvYmosIHBwdHIsIHR5cGUpICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0RnVuY3Rpb25QdHIob2JqLCBwcHRyLCB0eXBlKQorI2RlZmluZSBTV0lHX05ld0Z1bmN0aW9uUHRyT2JqKHB0ciwgdHlwZSkgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9OZXdQb2ludGVyT2JqKE5VTEwsIHB0ciwgdHlwZSwgMCkKKworLyogZm9yIEMrKyBtZW1iZXIgcG9pbnRlcnMsIGllLCBtZW1iZXIgbWV0aG9kcyAqLworI2RlZmluZSBTV0lHX0NvbnZlcnRNZW1iZXIob2JqLCBwdHIsIHN6LCB0eSkgICAgICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UGFja2VkKG9iaiwgcHRyLCBzeiwgdHkpCisjZGVmaW5lIFNXSUdfTmV3TWVtYmVyT2JqKHB0ciwgc3osIHR5cGUpICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BhY2tlZE9iaihwdHIsIHN6LCB0eXBlKQorCisKKy8qIFJ1bnRpbWUgQVBJICovCisKKyNkZWZpbmUgU1dJR19HZXRNb2R1bGUoY2xpZW50ZGF0YSkgICAgICAgICAgICAgICAgICAgICAgU1dJR19QeXRob25fR2V0TW9kdWxlKCkKKyNkZWZpbmUgU1dJR19TZXRNb2R1bGUoY2xpZW50ZGF0YSwgcG9pbnRlcikgICAgICAgICAgICAgU1dJR19QeXRob25fU2V0TW9kdWxlKHBvaW50ZXIpCisjZGVmaW5lIFNXSUdfTmV3Q2xpZW50RGF0YShvYmopICAgICAgICAgICAgICAgICAgICAgICAgIFN3aWdQeUNsaWVudERhdGFfTmV3KG9iaikKKworI2RlZmluZSBTV0lHX1NldEVycm9yT2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRFcnJvck9iagorI2RlZmluZSBTV0lHX1NldEVycm9yTXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRFcnJvck1zZworI2RlZmluZSBTV0lHX0Vycm9yVHlwZShjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9FcnJvclR5cGUoY29kZSkKKyNkZWZpbmUgU1dJR19FcnJvcihjb2RlLCBtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJR19QeXRob25fU2V0RXJyb3JNc2coU1dJR19FcnJvclR5cGUoY29kZSksIG1zZykKKyNkZWZpbmUgU1dJR19mYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsCisKKworLyogUnVudGltZSBBUEkgaW1wbGVtZW50YXRpb24gKi8KKworLyogRXJyb3IgbWFuaXB1bGF0aW9uICovCisKK1NXSUdJTlRFUk4gdm9pZAorU1dJR19QeXRob25fU2V0RXJyb3JPYmooUHlPYmplY3QgKmVycnR5cGUsIFB5T2JqZWN0ICpvYmopIHsKKyAgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLOworICBQeUVycl9TZXRPYmplY3QoZXJydHlwZSwgb2JqKTsKKyAgUHlfREVDUkVGKG9iaik7CisgIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7Cit9CisKK1NXSUdJTlRFUk4gdm9pZAorU1dJR19QeXRob25fU2V0RXJyb3JNc2coUHlPYmplY3QgKmVycnR5cGUsIGNvbnN0IGNoYXIgKm1zZykgeworICBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisgIFB5RXJyX1NldFN0cmluZyhlcnJ0eXBlLCAoY2hhciAqKSBtc2cpOworICBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLOworfQorCisjZGVmaW5lIFNXSUdfUHl0aG9uX1JhaXNlKG9iaiwgdHlwZSwgZGVzYykgIFNXSUdfUHl0aG9uX1NldEVycm9yT2JqKFNXSUdfUHl0aG9uX0V4Y2VwdGlvblR5cGUoZGVzYyksIG9iaikKKworLyogU2V0IGEgY29uc3RhbnQgdmFsdWUgKi8KKworI2lmIGRlZmluZWQoU1dJR1BZVEhPTl9CVUlMVElOKQorCitTV0lHSU5URVJOIHZvaWQKK1N3aWdQeUJ1aWx0aW5fQWRkUHVibGljU3ltYm9sKFB5T2JqZWN0ICpzZXEsIGNvbnN0IGNoYXIgKmtleSkgeworICBQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoa2V5KTsKKyAgUHlMaXN0X0FwcGVuZChzZXEsIHMpOworICBQeV9ERUNSRUYocyk7Cit9CisKK1NXSUdJTlRFUk4gdm9pZAorU1dJR19QeXRob25fU2V0Q29uc3RhbnQoUHlPYmplY3QgKmQsIFB5T2JqZWN0ICpwdWJsaWNfaW50ZXJmYWNlLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqb2JqKSB7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIChjaGFyICopbmFtZSwgb2JqKTsKKyAgUHlfREVDUkVGKG9iaik7CisgIGlmIChwdWJsaWNfaW50ZXJmYWNlKQorICAgIFN3aWdQeUJ1aWx0aW5fQWRkUHVibGljU3ltYm9sKHB1YmxpY19pbnRlcmZhY2UsIG5hbWUpOworfQorCisjZWxzZQorCitTV0lHSU5URVJOIHZvaWQKK1NXSUdfUHl0aG9uX1NldENvbnN0YW50KFB5T2JqZWN0ICpkLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqb2JqKSB7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIChjaGFyICopbmFtZSwgb2JqKTsKKyAgUHlfREVDUkVGKG9iaik7Cit9CisKKyNlbmRpZgorCisvKiBBcHBlbmQgYSB2YWx1ZSB0byB0aGUgcmVzdWx0IG9iaiAqLworCitTV0lHSU5URVJOIFB5T2JqZWN0KgorU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KFB5T2JqZWN0KiByZXN1bHQsIFB5T2JqZWN0KiBvYmopIHsKKyNpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9PVVRQVVRfVFVQTEUpCisgIGlmICghcmVzdWx0KSB7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgeworICAgIGlmICghUHlMaXN0X0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgIFB5T2JqZWN0ICpvMiA9IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoMSk7CisgICAgICBQeUxpc3RfU2V0SXRlbShyZXN1bHQsIDAsIG8yKTsKKyAgICB9CisgICAgUHlMaXN0X0FwcGVuZChyZXN1bHQsb2JqKTsKKyAgICBQeV9ERUNSRUYob2JqKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworI2Vsc2UKKyAgUHlPYmplY3QqICAgbzI7CisgIFB5T2JqZWN0KiAgIG8zOworICBpZiAoIXJlc3VsdCkgeworICAgIHJlc3VsdCA9IG9iajsKKyAgfSBlbHNlIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkgeworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJlc3VsdCA9IG9iajsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSkgeworICAgICAgbzIgPSByZXN1bHQ7CisgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBvMik7CisgICAgfQorICAgIG8zID0gUHlUdXBsZV9OZXcoMSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShvMywgMCwgb2JqKTsKKyAgICBvMiA9IHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeVNlcXVlbmNlX0NvbmNhdChvMiwgbzMpOworICAgIFB5X0RFQ1JFRihvMik7CisgICAgUHlfREVDUkVGKG8zKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworI2VuZGlmCit9CisKKy8qIFVucGFjayB0aGUgYXJndW1lbnQgdHVwbGUgKi8KKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfUHl0aG9uX1VucGFja1R1cGxlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG1pbiwgUHlfc3NpemVfdCBtYXgsIFB5T2JqZWN0ICoqb2JqcykKK3sKKyAgaWYgKCFhcmdzKSB7CisgICAgaWYgKCFtaW4gJiYgIW1heCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyBleHBlY3RlZCAlcyVkIGFyZ3VtZW50cywgZ290IG5vbmUiLAorICAgICAgICAgICAgICAgICAgIG5hbWUsIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIChpbnQpbWluKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICBpZiAobWluIDw9IDEgJiYgbWF4ID49IDEpIHsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgb2Jqc1swXSA9IGFyZ3M7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgb2Jqc1tpXSA9IDA7CisgICAgICB9CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiVW5wYWNrVHVwbGUoKSBhcmd1bWVudCBsaXN0IGlzIG5vdCBhIHR1cGxlIik7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBsID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAobCA8IG1pbikgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzIGV4cGVjdGVkICVzJWQgYXJndW1lbnRzLCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgIG5hbWUsIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIChpbnQpbWluLCAoaW50KWwpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChsID4gbWF4KSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZXhwZWN0ZWQgJXMlZCBhcmd1bWVudHMsIGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCAoaW50KW1heCwgKGludClsKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyArK2kpIHsKKyAgICAgICAgb2Jqc1tpXSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICB9CisgICAgICBmb3IgKDsgbCA8IG1heDsgKytsKSB7CisgICAgICAgIG9ianNbbF0gPSAwOworICAgICAgfQorICAgICAgcmV0dXJuIGkgKyAxOworICAgIH0KKyAgfQorfQorCisvKiBBIGZ1bmN0b3IgaXMgYSBmdW5jdGlvbiBvYmplY3Qgd2l0aCBvbmUgc2luZ2xlIG9iamVjdCBhcmd1bWVudCAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAKKyNkZWZpbmUgU1dJR19QeXRob25fQ2FsbEZ1bmN0b3IoZnVuY3Rvciwgb2JqKSAgICAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jdG9yLCBvYmosIE5VTEwpOworI2Vsc2UKKyNkZWZpbmUgU1dJR19QeXRob25fQ2FsbEZ1bmN0b3IoZnVuY3Rvciwgb2JqKSAgICAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmN0b3IsICJPIiwgb2JqKTsKKyNlbmRpZgorCisvKgorICBIZWxwZXIgZm9yIHN0YXRpYyBwb2ludGVyIGluaXRpYWxpemF0aW9uIGZvciBib3RoIEMgYW5kIEMrKyBjb2RlLCBmb3IgZXhhbXBsZQorICBzdGF0aWMgUHlPYmplY3QgKlNXSUdfU1RBVElDX1BPSU5URVIoTXlWYXIpID0gTmV3U29tZXRoaW5nKC4uLik7CisqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIFNXSUdfU1RBVElDX1BPSU5URVIodmFyKSAgdmFyCisjZWxzZQorI2RlZmluZSBTV0lHX1NUQVRJQ19QT0lOVEVSKHZhcikgIHZhciA9IDA7IGlmICghdmFyKSB2YXIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9pbnRlciBkZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZsYWdzIGZvciBuZXcgcG9pbnRlciBvYmplY3RzICovCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9OT1NIQURPVyAgICAgICAoU1dJR19QT0lOVEVSX09XTiAgICAgIDw8IDEpCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9ORVcgICAgICAgICAgICAoU1dJR19QT0lOVEVSX05PU0hBRE9XIHwgU1dJR19QT0lOVEVSX09XTikKKworI2RlZmluZSBTV0lHX1BPSU5URVJfSU1QTElDSVRfQ09OViAgKFNXSUdfUE9JTlRFUl9ESVNPV04gICA8PCAxKQorCisjZGVmaW5lIFNXSUdfQlVJTFRJTl9UUF9JTklUICAgICAgICAoU1dJR19QT0lOVEVSX09XTiA8PCAyKQorI2RlZmluZSBTV0lHX0JVSUxUSU5fSU5JVCAgICAgICAgICAgKFNXSUdfQlVJTFRJTl9UUF9JTklUIHwgU1dJR19QT0lOVEVSX09XTikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAgSG93IHRvIGFjY2VzcyBQeV9Ob25lICovCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpZm5kZWYgU1dJR19QWVRIT05fTk9fQlVJTERfTk9ORQorIyAgICBpZm5kZWYgU1dJR19QWVRIT05fQlVJTERfTk9ORQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9CVUlMRF9OT05FCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBTV0lHX1BZVEhPTl9CVUlMRF9OT05FCisjICBpZmRlZiBQeV9Ob25lCisjICAgdW5kZWYgUHlfTm9uZQorIyAgIGRlZmluZSBQeV9Ob25lIFNXSUdfUHlfTm9uZSgpCisjICBlbmRpZgorU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorX1NXSUdfUHlfTm9uZSh2b2lkKQoreworICBQeU9iamVjdCAqbm9uZSA9IFB5X0J1aWxkVmFsdWUoKGNoYXIqKSIiKTsKKyAgUHlfREVDUkVGKG5vbmUpOworICByZXR1cm4gbm9uZTsKK30KK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1NXSUdfUHlfTm9uZSh2b2lkKQoreworICBzdGF0aWMgUHlPYmplY3QgKlNXSUdfU1RBVElDX1BPSU5URVIobm9uZSkgPSBfU1dJR19QeV9Ob25lKCk7CisgIHJldHVybiBub25lOworfQorI2VuZGlmCisKKy8qIFRoZSBweXRob24gdm9pZCByZXR1cm4gdmFsdWUgKi8KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorU1dJR19QeV9Wb2lkKHZvaWQpCit7CisgIFB5T2JqZWN0ICpub25lID0gUHlfTm9uZTsKKyAgUHlfSU5DUkVGKG5vbmUpOworICByZXR1cm4gbm9uZTsKK30KKworLyogU3dpZ1B5Q2xpZW50RGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIFB5T2JqZWN0ICprbGFzczsKKyAgUHlPYmplY3QgKm5ld3JhdzsKKyAgUHlPYmplY3QgKm5ld2FyZ3M7CisgIFB5T2JqZWN0ICpkZXN0cm95OworICBpbnQgZGVsYXJnczsKKyAgaW50IGltcGxpY2l0Y29udjsKKyAgUHlUeXBlT2JqZWN0ICpweXR5cGU7Cit9IFN3aWdQeUNsaWVudERhdGE7CisKK1NXSUdSVU5USU1FSU5MSU5FIGludAorU1dJR19QeXRob25fQ2hlY2tJbXBsaWNpdChzd2lnX3R5cGVfaW5mbyAqdHkpCit7CisgIFN3aWdQeUNsaWVudERhdGEgKmRhdGEgPSAoU3dpZ1B5Q2xpZW50RGF0YSAqKXR5LT5jbGllbnRkYXRhOworICByZXR1cm4gZGF0YSA/IGRhdGEtPmltcGxpY2l0Y29udiA6IDA7Cit9CisKK1NXSUdSVU5USU1FSU5MSU5FIFB5T2JqZWN0ICoKK1NXSUdfUHl0aG9uX0V4Y2VwdGlvblR5cGUoc3dpZ190eXBlX2luZm8gKmRlc2MpIHsKKyAgU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSA9IGRlc2MgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSBkZXNjLT5jbGllbnRkYXRhIDogMDsKKyAgUHlPYmplY3QgKmtsYXNzID0gZGF0YSA/IGRhdGEtPmtsYXNzIDogMDsKKyAgcmV0dXJuIChrbGFzcyA/IGtsYXNzIDogUHlFeGNfUnVudGltZUVycm9yKTsKK30KKworCitTV0lHUlVOVElNRSBTd2lnUHlDbGllbnREYXRhICoKK1N3aWdQeUNsaWVudERhdGFfTmV3KFB5T2JqZWN0KiBvYmopCit7CisgIGlmICghb2JqKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSA9IChTd2lnUHlDbGllbnREYXRhICopbWFsbG9jKHNpemVvZihTd2lnUHlDbGllbnREYXRhKSk7CisgICAgLyogdGhlIGtsYXNzIGVsZW1lbnQgKi8KKyAgICBkYXRhLT5rbGFzcyA9IG9iajsKKyAgICBQeV9JTkNSRUYoZGF0YS0+a2xhc3MpOworICAgIC8qIHRoZSBuZXdyYXcgbWV0aG9kIGFuZCBuZXdhcmdzIGFyZ3VtZW50cyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyByYXcgaW5zdGFuY2UgKi8KKyAgICBpZiAoUHlDbGFzc19DaGVjayhvYmopKSB7CisgICAgICBkYXRhLT5uZXdyYXcgPSAwOworICAgICAgZGF0YS0+bmV3YXJncyA9IG9iajsKKyAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIH0gZWxzZSB7CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMCkKKyAgICAgIGRhdGEtPm5ld3JhdyA9IDA7CisjZWxzZQorICAgICAgZGF0YS0+bmV3cmF3ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkYXRhLT5rbGFzcywgKGNoYXIgKikiX19uZXdfXyIpOworI2VuZGlmCisgICAgICBpZiAoZGF0YS0+bmV3cmF3KSB7CisgICAgICAgIFB5X0lOQ1JFRihkYXRhLT5uZXdyYXcpOworICAgICAgICBkYXRhLT5uZXdhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgICAgIFB5VHVwbGVfU2V0SXRlbShkYXRhLT5uZXdhcmdzLCAwLCBvYmopOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS0+bmV3YXJncyA9IG9iajsKKyAgICAgIH0KKyAgICAgIFB5X0lOQ1JFRihkYXRhLT5uZXdhcmdzKTsKKyAgICB9CisgICAgLyogdGhlIGRlc3Ryb3kgbWV0aG9kLCBha2EgYXMgdGhlIEMrKyBkZWxldGUgbWV0aG9kICovCisgICAgZGF0YS0+ZGVzdHJveSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGF0YS0+a2xhc3MsIChjaGFyICopIl9fc3dpZ19kZXN0cm95X18iKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgIGRhdGEtPmRlc3Ryb3kgPSAwOworICAgIH0KKyAgICBpZiAoZGF0YS0+ZGVzdHJveSkgeworICAgICAgaW50IGZsYWdzOworICAgICAgUHlfSU5DUkVGKGRhdGEtPmRlc3Ryb3kpOworICAgICAgZmxhZ3MgPSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZGF0YS0+ZGVzdHJveSk7CisjaWZkZWYgTUVUSF9PCisgICAgICBkYXRhLT5kZWxhcmdzID0gIShmbGFncyAmIChNRVRIX08pKTsKKyNlbHNlCisgICAgICBkYXRhLT5kZWxhcmdzID0gMDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICBkYXRhLT5kZWxhcmdzID0gMDsKKyAgICB9CisgICAgZGF0YS0+aW1wbGljaXRjb252ID0gMDsKKyAgICBkYXRhLT5weXR5cGUgPSAwOworICAgIHJldHVybiBkYXRhOworICB9Cit9CisKK1NXSUdSVU5USU1FIHZvaWQKK1N3aWdQeUNsaWVudERhdGFfRGVsKFN3aWdQeUNsaWVudERhdGEgKmRhdGEpIHsKKyAgUHlfWERFQ1JFRihkYXRhLT5uZXdyYXcpOworICBQeV9YREVDUkVGKGRhdGEtPm5ld2FyZ3MpOworICBQeV9YREVDUkVGKGRhdGEtPmRlc3Ryb3kpOworfQorCisvKiA9PT09PT09PT09PT09PT0gU3dpZ1B5T2JqZWN0ID09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3RfSEVBRAorICB2b2lkICpwdHI7CisgIHN3aWdfdHlwZV9pbmZvICp0eTsKKyAgaW50IG93bjsKKyAgUHlPYmplY3QgKm5leHQ7CisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgIFB5T2JqZWN0ICpkaWN0OworI2VuZGlmCit9IFN3aWdQeU9iamVjdDsKKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X2xvbmcoU3dpZ1B5T2JqZWN0ICp2KQoreworICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHYtPnB0cik7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9mb3JtYXQoY29uc3QgY2hhciogZm10LCBTd2lnUHlPYmplY3QgKnYpCit7CisgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KDEpOworICBpZiAoYXJncykgeworICAgIGlmIChQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgU3dpZ1B5T2JqZWN0X2xvbmcodikpID09IDApIHsKKyAgICAgIFB5T2JqZWN0ICpvZm10ID0gU1dJR19QeXRob25fc3RyX0Zyb21DaGFyKGZtdCk7CisgICAgICBpZiAob2ZtdCkgeworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgICAgICAgcmVzID0gUHlVbmljb2RlX0Zvcm1hdChvZm10LGFyZ3MpOworI2Vsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRm9ybWF0KG9mbXQsYXJncyk7CisjZW5kaWYKKyAgICAgICAgUHlfREVDUkVGKG9mbXQpOworICAgICAgfQorICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3Rfb2N0KFN3aWdQeU9iamVjdCAqdikKK3sKKyAgcmV0dXJuIFN3aWdQeU9iamVjdF9mb3JtYXQoIiVvIix2KTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X2hleChTd2lnUHlPYmplY3QgKnYpCit7CisgIHJldHVybiBTd2lnUHlPYmplY3RfZm9ybWF0KCIleCIsdik7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKKyNpZmRlZiBNRVRIX05PQVJHUworU3dpZ1B5T2JqZWN0X3JlcHIoU3dpZ1B5T2JqZWN0ICp2KQorI2Vsc2UKK1N3aWdQeU9iamVjdF9yZXByKFN3aWdQeU9iamVjdCAqdiwgUHlPYmplY3QgKmFyZ3MpCisjZW5kaWYKK3sKKyAgY29uc3QgY2hhciAqbmFtZSA9IFNXSUdfVHlwZVByZXR0eU5hbWUodi0+dHkpOworICBQeU9iamVjdCAqcmVwciA9IFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0KCI8U3dpZyBPYmplY3Qgb2YgdHlwZSAnJXMnIGF0ICVwPiIsIG5hbWUsICh2b2lkICopdik7CisgIGlmICh2LT5uZXh0KSB7CisjIGlmZGVmIE1FVEhfTk9BUkdTCisgICAgUHlPYmplY3QgKm5yZXAgPSBTd2lnUHlPYmplY3RfcmVwcigoU3dpZ1B5T2JqZWN0ICopdi0+bmV4dCk7CisjIGVsc2UKKyAgICBQeU9iamVjdCAqbnJlcCA9IFN3aWdQeU9iamVjdF9yZXByKChTd2lnUHlPYmplY3QgKil2LT5uZXh0LCBhcmdzKTsKKyMgZW5kaWYKKyMgaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIFB5T2JqZWN0ICpqb2luZWQgPSBQeVVuaWNvZGVfQ29uY2F0KHJlcHIsIG5yZXApOworICAgIFB5X0RlY1JlZihyZXByKTsKKyAgICBQeV9EZWNSZWYobnJlcCk7CisgICAgcmVwciA9IGpvaW5lZDsKKyMgZWxzZQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwcixucmVwKTsKKyMgZW5kaWYKKyAgfQorICByZXR1cm4gcmVwcjsKK30KKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlPYmplY3RfcHJpbnQoU3dpZ1B5T2JqZWN0ICp2LCBGSUxFICpmcCwgaW50IFNXSUdVTlVTRURQQVJNKGZsYWdzKSkKK3sKKyAgY2hhciAqc3RyOworI2lmZGVmIE1FVEhfTk9BUkdTCisgIFB5T2JqZWN0ICpyZXByID0gU3dpZ1B5T2JqZWN0X3JlcHIodik7CisjZWxzZQorICBQeU9iamVjdCAqcmVwciA9IFN3aWdQeU9iamVjdF9yZXByKHYsIE5VTEwpOworI2VuZGlmCisgIGlmIChyZXByKSB7CisgICAgc3RyID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihyZXByKTsKKyAgICBmcHV0cyhzdHIsIGZwKTsKKyAgICBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHN0cik7CisgICAgUHlfREVDUkVGKHJlcHIpOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAxOworICB9Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9zdHIoU3dpZ1B5T2JqZWN0ICp2KQoreworICBjaGFyIHJlc3VsdFtTV0lHX0JVRkZFUl9TSVpFXTsKKyAgcmV0dXJuIFNXSUdfUGFja1ZvaWRQdHIocmVzdWx0LCB2LT5wdHIsIHYtPnR5LT5uYW1lLCBzaXplb2YocmVzdWx0KSkgPworICAgIFNXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcihyZXN1bHQpIDogMDsKK30KKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlPYmplY3RfY29tcGFyZShTd2lnUHlPYmplY3QgKnYsIFN3aWdQeU9iamVjdCAqdykKK3sKKyAgdm9pZCAqaSA9IHYtPnB0cjsKKyAgdm9pZCAqaiA9IHctPnB0cjsKKyAgcmV0dXJuIChpIDwgaikgPyAtMSA6ICgoaSA+IGopID8gMSA6IDApOworfQorCisvKiBBZGRlZCBmb3IgUHl0aG9uIDMueCwgd291bGQgaXQgYWxzbyBiZSB1c2VmdWwgZm9yIFB5dGhvbiAyLng/ICovCitTV0lHUlVOVElNRSBQeU9iamVjdCoKK1N3aWdQeU9iamVjdF9yaWNoY29tcGFyZShTd2lnUHlPYmplY3QgKnYsIFN3aWdQeU9iamVjdCAqdywgaW50IG9wKQoreworICBQeU9iamVjdCogcmVzOworICBpZiggb3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUgKSB7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgIH0KKyAgcmVzID0gUHlCb29sX0Zyb21Mb25nKCAoU3dpZ1B5T2JqZWN0X2NvbXBhcmUodiwgdyk9PTApID09IChvcCA9PSBQeV9FUSkgPyAxIDogMCk7CisgIHJldHVybiByZXM7Cit9CisKKworU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KiBTd2lnUHlPYmplY3RfVHlwZU9uY2Uodm9pZCk7CisKKyNpZmRlZiBTV0lHUFlUSE9OX0JVSUxUSU4KK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyAqU3dpZ1B5T2JqZWN0X3N0eXBlID0gMDsKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCoKK1N3aWdQeU9iamVjdF90eXBlKHZvaWQpIHsKKyAgICBTd2lnUHlDbGllbnREYXRhICpjZDsKKyAgICBhc3NlcnQoU3dpZ1B5T2JqZWN0X3N0eXBlKTsKKyAgICBjZCA9IChTd2lnUHlDbGllbnREYXRhKikgU3dpZ1B5T2JqZWN0X3N0eXBlLT5jbGllbnRkYXRhOworICAgIGFzc2VydChjZCk7CisgICAgYXNzZXJ0KGNkLT5weXR5cGUpOworICAgIHJldHVybiBjZC0+cHl0eXBlOworfQorI2Vsc2UKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCoKK1N3aWdQeU9iamVjdF90eXBlKHZvaWQpIHsKKyAgc3RhdGljIFB5VHlwZU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUih0eXBlKSA9IFN3aWdQeU9iamVjdF9UeXBlT25jZSgpOworICByZXR1cm4gdHlwZTsKK30KKyNlbmRpZgorCitTV0lHUlVOVElNRUlOTElORSBpbnQKK1N3aWdQeU9iamVjdF9DaGVjayhQeU9iamVjdCAqb3ApIHsKKyNpZmRlZiBTV0lHUFlUSE9OX0JVSUxUSU4KKyAgUHlUeXBlT2JqZWN0ICp0YXJnZXRfdHAgPSBTd2lnUHlPYmplY3RfdHlwZSgpOworICBpZiAoUHlUeXBlX0lzU3VidHlwZShvcC0+b2JfdHlwZSwgdGFyZ2V0X3RwKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIChzdHJjbXAob3AtPm9iX3R5cGUtPnRwX25hbWUsICJTd2lnUHlPYmplY3QiKSA9PSAwKTsKKyNlbHNlCisgIHJldHVybiAoUHlfVFlQRShvcCkgPT0gU3dpZ1B5T2JqZWN0X3R5cGUoKSkKKyAgICB8fCAoc3RyY21wKFB5X1RZUEUob3ApLT50cF9uYW1lLCJTd2lnUHlPYmplY3QiKSA9PSAwKTsKKyNlbmRpZgorfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfTmV3KHZvaWQgKnB0ciwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgb3duKTsKKworU1dJR1JVTlRJTUUgdm9pZAorU3dpZ1B5T2JqZWN0X2RlYWxsb2MoUHlPYmplY3QgKnYpCit7CisgIFN3aWdQeU9iamVjdCAqc29iaiA9IChTd2lnUHlPYmplY3QgKikgdjsKKyAgUHlPYmplY3QgKm5leHQgPSBzb2JqLT5uZXh0OworICBpZiAoc29iai0+b3duID09IFNXSUdfUE9JTlRFUl9PV04pIHsKKyAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBzb2JqLT50eTsKKyAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gdHkgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSB0eS0+Y2xpZW50ZGF0YSA6IDA7CisgICAgUHlPYmplY3QgKmRlc3Ryb3kgPSBkYXRhID8gZGF0YS0+ZGVzdHJveSA6IDA7CisgICAgaWYgKGRlc3Ryb3kpIHsKKyAgICAgIC8qIGRlc3Ryb3kgaXMgYWx3YXlzIGEgVkFSQVJHUyBtZXRob2QgKi8KKyAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICBpZiAoZGF0YS0+ZGVsYXJncykgeworICAgICAgICAvKiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBvYmplY3QgdG8gY2FycnkgdGhlIGRlc3Ryb3kgb3BlcmF0aW9uICovCisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBTd2lnUHlPYmplY3RfTmV3KHNvYmotPnB0ciwgdHksIDApOworICAgICAgICByZXMgPSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihkZXN0cm95LCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZGVzdHJveSk7CisgICAgICAgIFB5T2JqZWN0ICptc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGRlc3Ryb3kpOworICAgICAgICByZXMgPSAoKCptZXRoKShtc2VsZiwgdikpOworICAgICAgfQorICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgIH0KKyNpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9TSUxFTlRfTUVNTEVBSykKKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBTV0lHX1R5cGVQcmV0dHlOYW1lKHR5KTsKKyAgICAgIHByaW50Zigic3dpZy9weXRob24gZGV0ZWN0ZWQgYSBtZW1vcnkgbGVhayBvZiB0eXBlICclcycsIG5vIGRlc3RydWN0b3IgZm91bmQuXG4iLCAobmFtZSA/IG5hbWUgOiAidW5rbm93biIpKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBQeV9YREVDUkVGKG5leHQpOworICBQeU9iamVjdF9ERUwodik7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU3dpZ1B5T2JqZWN0X2FwcGVuZChQeU9iamVjdCogdiwgUHlPYmplY3QqIG5leHQpCit7CisgIFN3aWdQeU9iamVjdCAqc29iaiA9IChTd2lnUHlPYmplY3QgKikgdjsKKyNpZm5kZWYgTUVUSF9PCisgIFB5T2JqZWN0ICp0bXAgPSAwOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUobmV4dCwoY2hhciAqKSJPOmFwcGVuZCIsICZ0bXApKSByZXR1cm4gTlVMTDsKKyAgbmV4dCA9IHRtcDsKKyNlbmRpZgorICBpZiAoIVN3aWdQeU9iamVjdF9DaGVjayhuZXh0KSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHNvYmotPm5leHQgPSBuZXh0OworICBQeV9JTkNSRUYobmV4dCk7CisgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QqCisjaWZkZWYgTUVUSF9OT0FSR1MKK1N3aWdQeU9iamVjdF9uZXh0KFB5T2JqZWN0KiB2KQorI2Vsc2UKK1N3aWdQeU9iamVjdF9uZXh0KFB5T2JqZWN0KiB2LCBQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oYXJncykpCisjZW5kaWYKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKSB2OworICBpZiAoc29iai0+bmV4dCkgeworICAgIFB5X0lOQ1JFRihzb2JqLT5uZXh0KTsKKyAgICByZXR1cm4gc29iai0+bmV4dDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisgIH0KK30KKworU1dJR0lOVEVSTiBQeU9iamVjdCoKKyNpZmRlZiBNRVRIX05PQVJHUworU3dpZ1B5T2JqZWN0X2Rpc293bihQeU9iamVjdCAqdikKKyNlbHNlCitTd2lnUHlPYmplY3RfZGlzb3duKFB5T2JqZWN0KiB2LCBQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oYXJncykpCisjZW5kaWYKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKXY7CisgIHNvYmotPm93biA9IDA7CisgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKK30KKworU1dJR0lOVEVSTiBQeU9iamVjdCoKKyNpZmRlZiBNRVRIX05PQVJHUworU3dpZ1B5T2JqZWN0X2FjcXVpcmUoUHlPYmplY3QgKnYpCisjZWxzZQorU3dpZ1B5T2JqZWN0X2FjcXVpcmUoUHlPYmplY3QqIHYsIFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShhcmdzKSkKKyNlbmRpZgoreworICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopdjsKKyAgc29iai0+b3duID0gU1dJR19QT0lOVEVSX09XTjsKKyAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworfQorCitTV0lHSU5URVJOIFB5T2JqZWN0KgorU3dpZ1B5T2JqZWN0X293bihQeU9iamVjdCAqdiwgUHlPYmplY3QgKmFyZ3MpCit7CisgIFB5T2JqZWN0ICp2YWwgPSAwOworI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDApCisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopInxPOm93biIsJnZhbCkpCisjZWxzZQorICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIChjaGFyICopIm93biIsIDAsIDEsICZ2YWwpKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKXY7CisgICAgICBQeU9iamVjdCAqb2JqID0gUHlCb29sX0Zyb21Mb25nKHNvYmotPm93bik7CisgICAgICBpZiAodmFsKSB7CisjaWZkZWYgTUVUSF9OT0FSR1MKKyAgICAgICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZSh2YWwpKSB7CisgICAgICAgICAgU3dpZ1B5T2JqZWN0X2FjcXVpcmUodik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3dpZ1B5T2JqZWN0X2Rpc293bih2KTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZSh2YWwpKSB7CisgICAgICAgICAgU3dpZ1B5T2JqZWN0X2FjcXVpcmUodixhcmdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfZGlzb3duKHYsYXJncyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICAgICAgcmV0dXJuIG9iajsKKyAgICB9Cit9CisKKyNpZmRlZiBNRVRIX08KK3N0YXRpYyBQeU1ldGhvZERlZgorc3dpZ29iamVjdF9tZXRob2RzW10gPSB7CisgIHsoY2hhciAqKSJkaXNvd24iLCAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9kaXNvd24sICBNRVRIX05PQVJHUywgIChjaGFyICopInJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikiYWNxdWlyZSIsIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfYWNxdWlyZSwgTUVUSF9OT0FSR1MsICAoY2hhciAqKSJhcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikib3duIiwgICAgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3Rfb3duLCAgICAgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJyZXR1cm5zL3NldHMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJhcHBlbmQiLCAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9hcHBlbmQsICBNRVRIX08sICAgICAgIChjaGFyICopImFwcGVuZHMgYW5vdGhlciAndGhpcycgb2JqZWN0In0sCisgIHsoY2hhciAqKSJuZXh0IiwgICAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9uZXh0LCAgICBNRVRIX05PQVJHUywgIChjaGFyICopInJldHVybnMgdGhlIG5leHQgJ3RoaXMnIG9iamVjdCJ9LAorICB7KGNoYXIgKikiX19yZXByX18iLChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfcmVwciwgICAgTUVUSF9OT0FSR1MsICAoY2hhciAqKSJyZXR1cm5zIG9iamVjdCByZXByZXNlbnRhdGlvbiJ9LAorICB7MCwgMCwgMCwgMH0KK307CisjZWxzZQorc3RhdGljIFB5TWV0aG9kRGVmCitzd2lnb2JqZWN0X21ldGhvZHNbXSA9IHsKKyAgeyhjaGFyICopImRpc293biIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2Rpc293biwgIE1FVEhfVkFSQVJHUywgIChjaGFyICopInJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikiYWNxdWlyZSIsIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfYWNxdWlyZSwgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikiYXF1aXJlcyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIifSwKKyAgeyhjaGFyICopIm93biIsICAgICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X293biwgICAgIE1FVEhfVkFSQVJHUywgIChjaGFyICopInJldHVybnMvc2V0cyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIifSwKKyAgeyhjaGFyICopImFwcGVuZCIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2FwcGVuZCwgIE1FVEhfVkFSQVJHUywgIChjaGFyICopImFwcGVuZHMgYW5vdGhlciAndGhpcycgb2JqZWN0In0sCisgIHsoY2hhciAqKSJuZXh0IiwgICAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9uZXh0LCAgICBNRVRIX1ZBUkFSR1MsICAoY2hhciAqKSJyZXR1cm5zIHRoZSBuZXh0ICd0aGlzJyBvYmplY3QifSwKKyAgeyhjaGFyICopIl9fcmVwcl9fIiwoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X3JlcHIsICAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikicmV0dXJucyBvYmplY3QgcmVwcmVzZW50YXRpb24ifSwKKyAgezAsIDAsIDAsIDB9Cit9OworI2VuZGlmCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKK1NXSUdJTlRFUk4gUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X2dldGF0dHIoU3dpZ1B5T2JqZWN0ICpzb2JqLGNoYXIgKm5hbWUpCit7CisgIHJldHVybiBQeV9GaW5kTWV0aG9kKHN3aWdvYmplY3RfbWV0aG9kcywgKFB5T2JqZWN0ICopc29iaiwgbmFtZSk7Cit9CisjZW5kaWYKKworU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5T2JqZWN0X1R5cGVPbmNlKHZvaWQpIHsKKyAgc3RhdGljIGNoYXIgc3dpZ29iamVjdF9kb2NbXSA9ICJTd2lnIG9iamVjdCBjYXJyaWVzIGEgQy9DKysgaW5zdGFuY2UgcG9pbnRlciI7CisKKyAgc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBTd2lnUHlPYmplY3RfYXNfbnVtYmVyID0geworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYykwLCAvKm5iX3N1YnRyYWN0Ki8KKyAgICAoYmluYXJ5ZnVuYykwLCAvKm5iX211bHRpcGx5Ki8KKyAgICAvKiBuYl9kaXZpZGUgcmVtb3ZlZCBpbiBQeXRob24gMyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMAorICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfZGl2aWRlKi8KKyNlbmRpZgorICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfcmVtYWluZGVyKi8KKyAgICAoYmluYXJ5ZnVuYykwLCAvKm5iX2Rpdm1vZCovCisgICAgKHRlcm5hcnlmdW5jKTAsLypuYl9wb3dlciovCisgICAgKHVuYXJ5ZnVuYykwLCAgLypuYl9uZWdhdGl2ZSovCisgICAgKHVuYXJ5ZnVuYykwLCAgLypuYl9wb3NpdGl2ZSovCisgICAgKHVuYXJ5ZnVuYykwLCAgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpMCwgICAgLypuYl9ub256ZXJvKi8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX2ludmVydCovCisgICAgMCwgICAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIDAsICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX2FuZCovCisgICAgMCwgICAgICAgICAgICAgLypuYl94b3IqLworICAgIDAsICAgICAgICAgICAgIC8qbmJfb3IqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMAorICAgIDAsICAgLypuYl9jb2VyY2UqLworI2VuZGlmCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3RfbG9uZywgLypuYl9pbnQqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMAorICAgICh1bmFyeWZ1bmMpU3dpZ1B5T2JqZWN0X2xvbmcsIC8qbmJfbG9uZyovCisjZWxzZQorICAgIDAsIC8qbmJfcmVzZXJ2ZWQqLworI2VuZGlmCisgICAgKHVuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3Rfb2N0LCAgLypuYl9vY3QqLworICAgICh1bmFyeWZ1bmMpU3dpZ1B5T2JqZWN0X2hleCwgIC8qbmJfaGV4Ki8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAgLyogMy4wICovCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgLyogbmJfaW5wbGFjZV9hZGQgLT4gbmJfaW5kZXgsIG5iX2lucGxhY2VfZGl2aWRlIHJlbW92ZWQgKi8KKyNlbGlmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNTAwMDAgLyogMi41LjAgKi8KKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIC8qIG5iX2lucGxhY2VfYWRkIC0+IG5iX2luZGV4ICovCisjZWxpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDIwMDAwIC8qIDIuMi4wICovCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgLyogbmJfaW5wbGFjZV9hZGQgLT4gbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworI2VsaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAwMDAwMCAvKiAyLjAuMCAqLworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAvKiBuYl9pbnBsYWNlX2FkZCAtPiBuYl9pbnBsYWNlX29yICovCisjZW5kaWYKKyAgfTsKKworICBzdGF0aWMgUHlUeXBlT2JqZWN0IHN3aWdweW9iamVjdF90eXBlOworICBzdGF0aWMgaW50IHR5cGVfaW5pdCA9IDA7CisgIGlmICghdHlwZV9pbml0KSB7CisgICAgY29uc3QgUHlUeXBlT2JqZWN0IHRtcCA9IHsKKyAgICAgIC8qIFB5T2JqZWN0IGhlYWRlciBjaGFuZ2VkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisjZWxzZQorICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyNlbmRpZgorICAgICAgKGNoYXIgKikiU3dpZ1B5T2JqZWN0IiwgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICBzaXplb2YoU3dpZ1B5T2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgKGRlc3RydWN0b3IpU3dpZ1B5T2JqZWN0X2RlYWxsb2MsICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAocHJpbnRmdW5jKVN3aWdQeU9iamVjdF9wcmludCwgICAgICAgIC8qIHRwX3ByaW50ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisgICAgICAoZ2V0YXR0cmZ1bmMpU3dpZ1B5T2JqZWN0X2dldGF0dHIsICAgIC8qIHRwX2dldGF0dHIgKi8KKyNlbHNlCisgICAgICAoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyNlbmRpZgorICAgICAgKHNldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIDAsIC8qIHRwX3Jlc2VydmVkIGluIDMuMC4xLCB0cF9jb21wYXJlIGluIDMuMC4wIGJ1dCBub3QgdXNlZCAqLworI2Vsc2UKKyAgICAgIChjbXBmdW5jKVN3aWdQeU9iamVjdF9jb21wYXJlLCAgICAgICAgLyogdHBfY29tcGFyZSAqLworI2VuZGlmCisgICAgICAocmVwcmZ1bmMpU3dpZ1B5T2JqZWN0X3JlcHIsICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICZTd2lnUHlPYmplY3RfYXNfbnVtYmVyLCAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAocmVwcmZ1bmMpU3dpZ1B5T2JqZWN0X3N0ciwgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgIHN3aWdvYmplY3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAocmljaGNtcGZ1bmMpU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlLC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICBzd2lnb2JqZWN0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWNoZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uICovCisjZW5kaWYKKyNpZmRlZiBDT1VOVF9BTExPQ1MKKyAgICAgIDAsMCwwLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgLT4gdHBfbmV4dCAqLworI2VuZGlmCisgICAgfTsKKyAgICBzd2lncHlvYmplY3RfdHlwZSA9IHRtcDsKKyAgICB0eXBlX2luaXQgPSAxOworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorICAgIHN3aWdweW9iamVjdF90eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisjZWxzZQorICAgIGlmIChQeVR5cGVfUmVhZHkoJnN3aWdweW9iamVjdF90eXBlKSA8IDApCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICB9CisgIHJldHVybiAmc3dpZ3B5b2JqZWN0X3R5cGU7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9OZXcodm9pZCAqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBvd24pCit7CisgIFN3aWdQeU9iamVjdCAqc29iaiA9IFB5T2JqZWN0X05FVyhTd2lnUHlPYmplY3QsIFN3aWdQeU9iamVjdF90eXBlKCkpOworICBpZiAoc29iaikgeworICAgIHNvYmotPnB0ciAgPSBwdHI7CisgICAgc29iai0+dHkgICA9IHR5OworICAgIHNvYmotPm93biAgPSBvd247CisgICAgc29iai0+bmV4dCA9IDA7CisgIH0KKyAgcmV0dXJuIChQeU9iamVjdCAqKXNvYmo7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRzIGEgc2ltcGxlIFN3aWcgUGFja2VkIHR5cGUsIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBzdHJpbmcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3RfSEVBRAorICB2b2lkICpwYWNrOworICBzd2lnX3R5cGVfaW5mbyAqdHk7CisgIHNpemVfdCBzaXplOworfSBTd2lnUHlQYWNrZWQ7CisKK1NXSUdSVU5USU1FIGludAorU3dpZ1B5UGFja2VkX3ByaW50KFN3aWdQeVBhY2tlZCAqdiwgRklMRSAqZnAsIGludCBTV0lHVU5VU0VEUEFSTShmbGFncykpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICBmcHV0cygiPFN3aWcgUGFja2VkICIsIGZwKTsKKyAgaWYgKFNXSUdfUGFja0RhdGFOYW1lKHJlc3VsdCwgdi0+cGFjaywgdi0+c2l6ZSwgMCwgc2l6ZW9mKHJlc3VsdCkpKSB7CisgICAgZnB1dHMoImF0ICIsIGZwKTsKKyAgICBmcHV0cyhyZXN1bHQsIGZwKTsKKyAgfQorICBmcHV0cyh2LT50eS0+bmFtZSxmcCk7CisgIGZwdXRzKCI+IiwgZnApOworICByZXR1cm4gMDsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5UGFja2VkX3JlcHIoU3dpZ1B5UGFja2VkICp2KQoreworICBjaGFyIHJlc3VsdFtTV0lHX0JVRkZFUl9TSVpFXTsKKyAgaWYgKFNXSUdfUGFja0RhdGFOYW1lKHJlc3VsdCwgdi0+cGFjaywgdi0+c2l6ZSwgMCwgc2l6ZW9mKHJlc3VsdCkpKSB7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0KCI8U3dpZyBQYWNrZWQgYXQgJXMlcz4iLCByZXN1bHQsIHYtPnR5LT5uYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQoIjxTd2lnIFBhY2tlZCAlcz4iLCB2LT50eS0+bmFtZSk7CisgIH0KK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5UGFja2VkX3N0cihTd2lnUHlQYWNrZWQgKnYpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICBpZiAoU1dJR19QYWNrRGF0YU5hbWUocmVzdWx0LCB2LT5wYWNrLCB2LT5zaXplLCAwLCBzaXplb2YocmVzdWx0KSkpeworICAgIHJldHVybiBTV0lHX1B5dGhvbl9zdHJfRnJvbUZvcm1hdCgiJXMlcyIsIHJlc3VsdCwgdi0+dHktPm5hbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIodi0+dHktPm5hbWUpOworICB9Cit9CisKK1NXSUdSVU5USU1FIGludAorU3dpZ1B5UGFja2VkX2NvbXBhcmUoU3dpZ1B5UGFja2VkICp2LCBTd2lnUHlQYWNrZWQgKncpCit7CisgIHNpemVfdCBpID0gdi0+c2l6ZTsKKyAgc2l6ZV90IGogPSB3LT5zaXplOworICBpbnQgcyA9IChpIDwgaikgPyAtMSA6ICgoaSA+IGopID8gMSA6IDApOworICByZXR1cm4gcyA/IHMgOiBzdHJuY21wKChjaGFyICopdi0+cGFjaywgKGNoYXIgKil3LT5wYWNrLCAyKnYtPnNpemUpOworfQorCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqIFN3aWdQeVBhY2tlZF9UeXBlT25jZSh2b2lkKTsKKworU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5UGFja2VkX3R5cGUodm9pZCkgeworICBzdGF0aWMgUHlUeXBlT2JqZWN0ICpTV0lHX1NUQVRJQ19QT0lOVEVSKHR5cGUpID0gU3dpZ1B5UGFja2VkX1R5cGVPbmNlKCk7CisgIHJldHVybiB0eXBlOworfQorCitTV0lHUlVOVElNRUlOTElORSBpbnQKK1N3aWdQeVBhY2tlZF9DaGVjayhQeU9iamVjdCAqb3ApIHsKKyAgcmV0dXJuICgob3ApLT5vYl90eXBlID09IFN3aWdQeVBhY2tlZF9UeXBlT25jZSgpKQorICAgIHx8IChzdHJjbXAoKG9wKS0+b2JfdHlwZS0+dHBfbmFtZSwiU3dpZ1B5UGFja2VkIikgPT0gMCk7Cit9CisKK1NXSUdSVU5USU1FIHZvaWQKK1N3aWdQeVBhY2tlZF9kZWFsbG9jKFB5T2JqZWN0ICp2KQoreworICBpZiAoU3dpZ1B5UGFja2VkX0NoZWNrKHYpKSB7CisgICAgU3dpZ1B5UGFja2VkICpzb2JqID0gKFN3aWdQeVBhY2tlZCAqKSB2OworICAgIGZyZWUoc29iai0+cGFjayk7CisgIH0KKyAgUHlPYmplY3RfREVMKHYpOworfQorCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqCitTd2lnUHlQYWNrZWRfVHlwZU9uY2Uodm9pZCkgeworICBzdGF0aWMgY2hhciBzd2lncGFja2VkX2RvY1tdID0gIlN3aWcgb2JqZWN0IGNhcnJpZXMgYSBDL0MrKyBpbnN0YW5jZSBwb2ludGVyIjsKKyAgc3RhdGljIFB5VHlwZU9iamVjdCBzd2lncHlwYWNrZWRfdHlwZTsKKyAgc3RhdGljIGludCB0eXBlX2luaXQgPSAwOworICBpZiAoIXR5cGVfaW5pdCkgeworICAgIGNvbnN0IFB5VHlwZU9iamVjdCB0bXAgPSB7CisgICAgICAvKiBQeU9iamVjdCBoZWFkZXIgY2hhbmdlZCBpbiBQeXRob24gMyAqLworI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyNlbHNlCisgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworI2VuZGlmCisgICAgICAoY2hhciAqKSJTd2lnUHlQYWNrZWQiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgIHNpemVvZihTd2lnUHlQYWNrZWQpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAoZGVzdHJ1Y3RvcilTd2lnUHlQYWNrZWRfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgIChwcmludGZ1bmMpU3dpZ1B5UGFja2VkX3ByaW50LCAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgKHNldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICAgIDAsIC8qIHRwX3Jlc2VydmVkIGluIDMuMC4xICovCisjZWxzZQorICAgICAgKGNtcGZ1bmMpU3dpZ1B5UGFja2VkX2NvbXBhcmUsICAgICAgICAvKiB0cF9jb21wYXJlICovCisjZW5kaWYKKyAgICAgIChyZXByZnVuYylTd2lnUHlQYWNrZWRfcmVwciwgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgIChyZXByZnVuYylTd2lnUHlQYWNrZWRfc3RyLCAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgc3dpZ3BhY2tlZF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDIwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb24gKi8KKyNlbmRpZgorI2lmZGVmIENPVU5UX0FMTE9DUworICAgICAgMCwwLDAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAtPiB0cF9uZXh0ICovCisjZW5kaWYKKyAgICB9OworICAgIHN3aWdweXBhY2tlZF90eXBlID0gdG1wOworICAgIHR5cGVfaW5pdCA9IDE7CisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisgICAgc3dpZ3B5cGFja2VkX3R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyNlbHNlCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3dpZ3B5cGFja2VkX3R5cGUpIDwgMCkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICZzd2lncHlwYWNrZWRfdHlwZTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5UGFja2VkX05ldyh2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzd2lnX3R5cGVfaW5mbyAqdHkpCit7CisgIFN3aWdQeVBhY2tlZCAqc29iaiA9IFB5T2JqZWN0X05FVyhTd2lnUHlQYWNrZWQsIFN3aWdQeVBhY2tlZF90eXBlKCkpOworICBpZiAoc29iaikgeworICAgIHZvaWQgKnBhY2sgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKHBhY2spIHsKKyAgICAgIG1lbWNweShwYWNrLCBwdHIsIHNpemUpOworICAgICAgc29iai0+cGFjayA9IHBhY2s7CisgICAgICBzb2JqLT50eSAgID0gdHk7CisgICAgICBzb2JqLT5zaXplID0gc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgUHlPYmplY3RfREVMKChQeU9iamVjdCAqKSBzb2JqKTsKKyAgICAgIHNvYmogPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gKFB5T2JqZWN0ICopIHNvYmo7Cit9CisKK1NXSUdSVU5USU1FIHN3aWdfdHlwZV9pbmZvICoKK1N3aWdQeVBhY2tlZF9VbnBhY2tEYXRhKFB5T2JqZWN0ICpvYmosIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIGlmIChTd2lnUHlQYWNrZWRfQ2hlY2sob2JqKSkgeworICAgIFN3aWdQeVBhY2tlZCAqc29iaiA9IChTd2lnUHlQYWNrZWQgKilvYmo7CisgICAgaWYgKHNvYmotPnNpemUgIT0gc2l6ZSkgcmV0dXJuIDA7CisgICAgbWVtY3B5KHB0ciwgc29iai0+cGFjaywgc2l6ZSk7CisgICAgcmV0dXJuIHNvYmotPnR5OworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwb2ludGVycy9kYXRhIG1hbmlwdWxhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorX1NXSUdfVGhpcyh2b2lkKQoreworICAgIHJldHVybiBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIoInRoaXMiKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpzd2lnX3RoaXMgPSBOVUxMOworCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTV0lHX1RoaXModm9pZCkKK3sKKyAgaWYgKHN3aWdfdGhpcyA9PSBOVUxMKQorICAgIHN3aWdfdGhpcyA9IF9TV0lHX1RoaXMoKTsKKyAgcmV0dXJuIHN3aWdfdGhpczsKK30KKworLyogI2RlZmluZSBTV0lHX1BZVEhPTl9TTE9XX0dFVFNFVF9USElTICovCisKKy8qIFRPRE86IEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZSBmYXN0IGdldHNldCBpbiBQeXRob24gMyByaWdodCBub3cgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorI2RlZmluZSBTV0lHX1BZVEhPTl9TTE9XX0dFVFNFVF9USElTCisjZW5kaWYKKworU1dJR1JVTlRJTUUgU3dpZ1B5T2JqZWN0ICoKK1NXSUdfUHl0aG9uX0dldFN3aWdUaGlzKFB5T2JqZWN0ICpweW9iaikKK3sKKyAgUHlPYmplY3QgKm9iajsKKworICBpZiAoU3dpZ1B5T2JqZWN0X0NoZWNrKHB5b2JqKSkKKyAgICByZXR1cm4gKFN3aWdQeU9iamVjdCAqKSBweW9iajsKKworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorICAodm9pZClvYmo7CisjIGlmZGVmIFB5V2Vha3JlZl9DaGVja1Byb3h5CisgIGlmIChQeVdlYWtyZWZfQ2hlY2tQcm94eShweW9iaikpIHsKKyAgICBweW9iaiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHB5b2JqKTsKKyAgICBpZiAocHlvYmogJiYgU3dpZ1B5T2JqZWN0X0NoZWNrKHB5b2JqKSkKKyAgICAgIHJldHVybiAoU3dpZ1B5T2JqZWN0KikgcHlvYmo7CisgIH0KKyMgZW5kaWYKKyAgcmV0dXJuIE5VTEw7CisjZWxzZQorCisgIG9iaiA9IDA7CisKKyNpZiAoIWRlZmluZWQoU1dJR19QWVRIT05fU0xPV19HRVRTRVRfVEhJUykgJiYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDApKQorICBpZiAoUHlJbnN0YW5jZV9DaGVjayhweW9iaikpIHsKKyAgICBvYmogPSBfUHlJbnN0YW5jZV9Mb29rdXAocHlvYmosIFNXSUdfVGhpcygpKTsKKyAgfSBlbHNlIHsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihweW9iaik7CisgICAgaWYgKGRpY3RwdHIgIT0gTlVMTCkgeworICAgICAgUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKKyAgICAgIG9iaiA9IGRpY3QgPyBQeURpY3RfR2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSkgOiAwOworICAgIH0gZWxzZSB7CisjaWZkZWYgUHlXZWFrcmVmX0NoZWNrUHJveHkKKyAgICAgIGlmIChQeVdlYWtyZWZfQ2hlY2tQcm94eShweW9iaikpIHsKKyAgICAgICAgUHlPYmplY3QgKndvYmogPSBQeVdlYWtyZWZfR0VUX09CSkVDVChweW9iaik7CisgICAgICAgIHJldHVybiB3b2JqID8gU1dJR19QeXRob25fR2V0U3dpZ1RoaXMod29iaikgOiAwOworICAgICAgfQorI2VuZGlmCisgICAgICBvYmogPSBQeU9iamVjdF9HZXRBdHRyKHB5b2JqLFNXSUdfVGhpcygpKTsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisjZWxzZQorICBvYmogPSBQeU9iamVjdF9HZXRBdHRyKHB5b2JqLFNXSUdfVGhpcygpKTsKKyAgaWYgKG9iaikgeworICAgIFB5X0RFQ1JFRihvYmopOworICB9IGVsc2UgeworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKG9iaiAmJiAhU3dpZ1B5T2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAvKiBhIFB5T2JqZWN0IGlzIGNhbGxlZCAndGhpcycsIHRyeSB0byBnZXQgdGhlICdyZWFsIHRoaXMnCisgICAgICAgU3dpZ1B5T2JqZWN0IGZyb20gaXQgKi8KKyAgICByZXR1cm4gU1dJR19QeXRob25fR2V0U3dpZ1RoaXMob2JqKTsKKyAgfQorICByZXR1cm4gKFN3aWdQeU9iamVjdCAqKW9iajsKKyNlbmRpZgorfQorCisvKiBBY3F1aXJlIGEgcG9pbnRlciB2YWx1ZSAqLworCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0FjcXVpcmVQdHIoUHlPYmplY3QgKm9iaiwgaW50IG93bikgeworICBpZiAob3duID09IFNXSUdfUE9JTlRFUl9PV04pIHsKKyAgICBTd2lnUHlPYmplY3QgKnNvYmogPSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhvYmopOworICAgIGlmIChzb2JqKSB7CisgICAgICBpbnQgb2xkb3duID0gc29iai0+b3duOworICAgICAgc29iai0+b3duID0gb3duOworICAgICAgcmV0dXJuIG9sZG93bjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIENvbnZlcnQgYSBwb2ludGVyIHZhbHVlICovCisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQ29udmVydFB0ckFuZE93bihQeU9iamVjdCAqb2JqLCB2b2lkICoqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBmbGFncywgaW50ICpvd24pIHsKKyAgaW50IHJlczsKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqOworCisgIGlmICghb2JqKQorICAgIHJldHVybiBTV0lHX0VSUk9SOworICBpZiAob2JqID09IFB5X05vbmUpIHsKKyAgICBpZiAocHRyKQorICAgICAgKnB0ciA9IDA7CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0KKworICByZXMgPSBTV0lHX0VSUk9SOworCisgIHNvYmogPSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhvYmopOworICBpZiAob3duKQorICAgICpvd24gPSAwOworICB3aGlsZSAoc29iaikgeworICAgIHZvaWQgKnZwdHIgPSBzb2JqLT5wdHI7CisgICAgaWYgKHR5KSB7CisgICAgICBzd2lnX3R5cGVfaW5mbyAqdG8gPSBzb2JqLT50eTsKKyAgICAgIGlmICh0byA9PSB0eSkgeworICAgICAgICAvKiBubyB0eXBlIGNhc3QgbmVlZGVkICovCisgICAgICAgIGlmIChwdHIpICpwdHIgPSB2cHRyOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aWdfY2FzdF9pbmZvICp0YyA9IFNXSUdfVHlwZUNoZWNrKHRvLT5uYW1lLHR5KTsKKyAgICAgICAgaWYgKCF0YykgeworICAgICAgICAgIHNvYmogPSAoU3dpZ1B5T2JqZWN0ICopc29iai0+bmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICBpbnQgbmV3bWVtb3J5ID0gMDsKKyAgICAgICAgICAgICpwdHIgPSBTV0lHX1R5cGVDYXN0KHRjLHZwdHIsJm5ld21lbW9yeSk7CisgICAgICAgICAgICBpZiAobmV3bWVtb3J5ID09IFNXSUdfQ0FTVF9ORVdfTUVNT1JZKSB7CisgICAgICAgICAgICAgIGFzc2VydChvd24pOyAvKiBiYWRseSBmb3JtZWQgdHlwZW1hcCB3aGljaCB3aWxsIGxlYWQgdG8gYSBtZW1vcnkgbGVhayAtIGl0IG11c3Qgc2V0IGFuZCB1c2Ugb3duIHRvIGRlbGV0ZSAqcHRyICovCisgICAgICAgICAgICAgIGlmIChvd24pCisgICAgICAgICAgICAgICAgKm93biA9ICpvd24gfCBTV0lHX0NBU1RfTkVXX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHB0cikgKnB0ciA9IHZwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHNvYmopIHsKKyAgICBpZiAob3duKQorICAgICAgKm93biA9ICpvd24gfCBzb2JqLT5vd247CisgICAgaWYgKGZsYWdzICYgU1dJR19QT0lOVEVSX0RJU09XTikgeworICAgICAgc29iai0+b3duID0gMDsKKyAgICB9CisgICAgcmVzID0gU1dJR19PSzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmxhZ3MgJiBTV0lHX1BPSU5URVJfSU1QTElDSVRfQ09OVikgeworICAgICAgU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSA9IHR5ID8gKFN3aWdQeUNsaWVudERhdGEgKikgdHktPmNsaWVudGRhdGEgOiAwOworICAgICAgaWYgKGRhdGEgJiYgIWRhdGEtPmltcGxpY2l0Y29udikgeworICAgICAgICBQeU9iamVjdCAqa2xhc3MgPSBkYXRhLT5rbGFzczsKKyAgICAgICAgaWYgKGtsYXNzKSB7CisgICAgICAgICAgUHlPYmplY3QgKmltcGNvbnY7CisgICAgICAgICAgZGF0YS0+aW1wbGljaXRjb252ID0gMTsgLyogYXZvaWQgcmVjdXJzaW9uIGFuZCBjYWxsICdleHBsaWNpdCcgY29uc3RydWN0b3JzKi8KKyAgICAgICAgICBpbXBjb252ID0gU1dJR19QeXRob25fQ2FsbEZ1bmN0b3Ioa2xhc3MsIG9iaik7CisgICAgICAgICAgZGF0YS0+aW1wbGljaXRjb252ID0gMDsKKyAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGltcGNvbnYgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaW1wY29udikgeworICAgICAgICAgICAgU3dpZ1B5T2JqZWN0ICppb2JqID0gU1dJR19QeXRob25fR2V0U3dpZ1RoaXMoaW1wY29udik7CisgICAgICAgICAgICBpZiAoaW9iaikgeworICAgICAgICAgICAgICB2b2lkICp2cHRyOworICAgICAgICAgICAgICByZXMgPSBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyQW5kT3duKChQeU9iamVjdCopaW9iaiwgJnZwdHIsIHR5LCAwLCAwKTsKKyAgICAgICAgICAgICAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgKnB0ciA9IHZwdHI7CisgICAgICAgICAgICAgICAgICAvKiB0cmFuc2ZlciB0aGUgb3duZXJzaGlwIHRvICdwdHInICovCisgICAgICAgICAgICAgICAgICBpb2JqLT5vd24gPSAwOworICAgICAgICAgICAgICAgICAgcmVzID0gU1dJR19BZGRDYXN0KHJlcyk7CisgICAgICAgICAgICAgICAgICByZXMgPSBTV0lHX0FkZE5ld01hc2socmVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmVzID0gU1dJR19BZGRDYXN0KHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaW1wY29udik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIENvbnZlcnQgYSBmdW5jdGlvbiBwdHIgdmFsdWUgKi8KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Db252ZXJ0RnVuY3Rpb25QdHIoUHlPYmplY3QgKm9iaiwgdm9pZCAqKnB0ciwgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIGlmICghUHlDRnVuY3Rpb25fQ2hlY2sob2JqKSkgeworICAgIHJldHVybiBTV0lHX0NvbnZlcnRQdHIob2JqLCBwdHIsIHR5LCAwKTsKKyAgfSBlbHNlIHsKKyAgICB2b2lkICp2cHRyID0gMDsKKworICAgIC8qIGhlcmUgd2UgZ2V0IHRoZSBtZXRob2QgcG9pbnRlciBmb3IgY2FsbGJhY2tzICovCisgICAgY29uc3QgY2hhciAqZG9jID0gKCgoUHlDRnVuY3Rpb25PYmplY3QgKilvYmopIC0+IG1fbWwgLT4gbWxfZG9jKTsKKyAgICBjb25zdCBjaGFyICpkZXNjID0gZG9jID8gc3Ryc3RyKGRvYywgInN3aWdfcHRyOiAiKSA6IDA7CisgICAgaWYgKGRlc2MpCisgICAgICBkZXNjID0gdHkgPyBTV0lHX1VucGFja1ZvaWRQdHIoZGVzYyArIDEwLCAmdnB0ciwgdHktPm5hbWUpIDogMDsKKyAgICBpZiAoIWRlc2MpCisgICAgICByZXR1cm4gU1dJR19FUlJPUjsKKyAgICBpZiAodHkpIHsKKyAgICAgIHN3aWdfY2FzdF9pbmZvICp0YyA9IFNXSUdfVHlwZUNoZWNrKGRlc2MsdHkpOworICAgICAgaWYgKHRjKSB7CisgICAgICAgIGludCBuZXdtZW1vcnkgPSAwOworICAgICAgICAqcHRyID0gU1dJR19UeXBlQ2FzdCh0Yyx2cHRyLCZuZXdtZW1vcnkpOworICAgICAgICBhc3NlcnQoIW5ld21lbW9yeSk7IC8qIG5ld21lbW9yeSBoYW5kbGluZyBub3QgeWV0IGltcGxlbWVudGVkICovCisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU1dJR19FUlJPUjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKnB0ciA9IHZwdHI7CisgICAgfQorICAgIHJldHVybiBTV0lHX09LOworICB9Cit9CisKKy8qIENvbnZlcnQgYSBwYWNrZWQgdmFsdWUgdmFsdWUgKi8KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Db252ZXJ0UGFja2VkKFB5T2JqZWN0ICpvYmosIHZvaWQgKnB0ciwgc2l6ZV90IHN6LCBzd2lnX3R5cGVfaW5mbyAqdHkpIHsKKyAgc3dpZ190eXBlX2luZm8gKnRvID0gU3dpZ1B5UGFja2VkX1VucGFja0RhdGEob2JqLCBwdHIsIHN6KTsKKyAgaWYgKCF0bykgcmV0dXJuIFNXSUdfRVJST1I7CisgIGlmICh0eSkgeworICAgIGlmICh0byAhPSB0eSkgeworICAgICAgLyogY2hlY2sgdHlwZSBjYXN0PyAqLworICAgICAgc3dpZ19jYXN0X2luZm8gKnRjID0gU1dJR19UeXBlQ2hlY2sodG8tPm5hbWUsdHkpOworICAgICAgaWYgKCF0YykgcmV0dXJuIFNXSUdfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBTV0lHX09LOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ3JlYXRlIGEgbmV3IHBvaW50ZXIgb2JqZWN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2JqZWN0LCB3aXRob3V0IGNhbGxpbmcgX19pbml0X18sIGFuZCBzZXQgdGhlCisgICd0aGlzJyBhdHRyaWJ1dGUuCisqLworCitTV0lHUlVOVElNRSBQeU9iamVjdCoKK1NXSUdfUHl0aG9uX05ld1NoYWRvd0luc3RhbmNlKFN3aWdQeUNsaWVudERhdGEgKmRhdGEsIFB5T2JqZWN0ICpzd2lnX3RoaXMpCit7CisjaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDApCisgIFB5T2JqZWN0ICppbnN0ID0gMDsKKyAgUHlPYmplY3QgKm5ld3JhdyA9IGRhdGEtPm5ld3JhdzsKKyAgaWYgKG5ld3JhdykgeworICAgIGluc3QgPSBQeU9iamVjdF9DYWxsKG5ld3JhdywgZGF0YS0+bmV3YXJncywgTlVMTCk7CisgICAgaWYgKGluc3QpIHsKKyNpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9TTE9XX0dFVFNFVF9USElTKQorICAgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoaW5zdCk7CisgICAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICAgICpkaWN0cHRyID0gZGljdDsKKyAgICAgICAgICBQeURpY3RfU2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyAgICAgICAgfQorICAgICAgfQorI2Vsc2UKKyAgICAgIFB5T2JqZWN0ICprZXkgPSBTV0lHX1RoaXMoKTsKKyAgICAgIFB5T2JqZWN0X1NldEF0dHIoaW5zdCwga2V5LCBzd2lnX3RoaXMpOworI2VuZGlmCisgICAgfQorICB9IGVsc2UgeworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgICBpbnN0ID0gUHlCYXNlT2JqZWN0X1R5cGUudHBfbmV3KChQeVR5cGVPYmplY3QqKSBkYXRhLT5uZXdhcmdzLCBQeV9Ob25lLCBQeV9Ob25lKTsKKyAgICBQeU9iamVjdF9TZXRBdHRyKGluc3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgIFB5X1RZUEUoaW5zdCktPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHOworI2Vsc2UKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeURpY3RfU2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyAgICBpbnN0ID0gUHlJbnN0YW5jZV9OZXdSYXcoZGF0YS0+bmV3YXJncywgZGljdCk7CisgICAgUHlfREVDUkVGKGRpY3QpOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGluc3Q7CisjZWxzZQorI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDEwMDAwKQorICBQeU9iamVjdCAqaW5zdDsKKyAgUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7CisgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICBpbnN0ID0gUHlJbnN0YW5jZV9OZXdSYXcoZGF0YS0+bmV3YXJncywgZGljdCk7CisgIFB5X0RFQ1JFRihkaWN0KTsKKyAgcmV0dXJuIChQeU9iamVjdCAqKSBpbnN0OworI2Vsc2UKKyAgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCA9IFB5T2JqZWN0X05FVyhQeUluc3RhbmNlT2JqZWN0LCAmUHlJbnN0YW5jZV9UeXBlKTsKKyAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGluc3QtPmluX2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKilkYXRhLT5uZXdhcmdzOworICBQeV9JTkNSRUYoaW5zdC0+aW5fY2xhc3MpOworICBpbnN0LT5pbl9kaWN0ID0gUHlEaWN0X05ldygpOworICBpZiAoaW5zdC0+aW5fZGljdCA9PSBOVUxMKSB7CisgICAgUHlfREVDUkVGKGluc3QpOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTCisgIGluc3QtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFB5X1RQRkxBR1NfR0MKKyAgUHlPYmplY3RfR0NfSW5pdChpbnN0KTsKKyNlbmRpZgorICBQeURpY3RfU2V0SXRlbShpbnN0LT5pbl9kaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyAgcmV0dXJuIChQeU9iamVjdCAqKSBpbnN0OworI2VuZGlmCisjZW5kaWYKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fU2V0U3dpZ1RoaXMoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpzd2lnX3RoaXMpCit7CisgUHlPYmplY3QgKmRpY3Q7CisjaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDApICYmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMpCisgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoaW5zdCk7CisgaWYgKGRpY3RwdHIgIT0gTlVMTCkgeworICAgZGljdCA9ICpkaWN0cHRyOworICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAqZGljdHB0ciA9IGRpY3Q7CisgICB9CisgICBQeURpY3RfU2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyAgIHJldHVybjsKKyB9CisjZW5kaWYKKyBkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhpbnN0LCAoY2hhciopIl9fZGljdF9fIik7CisgUHlEaWN0X1NldEl0ZW0oZGljdCwgU1dJR19UaGlzKCksIHN3aWdfdGhpcyk7CisgUHlfREVDUkVGKGRpY3QpOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKgorU1dJR19QeXRob25fSW5pdFNoYWRvd0luc3RhbmNlKFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpvYmpbMl07CisgIGlmICghU1dJR19QeXRob25fVW5wYWNrVHVwbGUoYXJncywoY2hhciopInN3aWdpbml0IiwgMiwgMiwgb2JqKSkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIFN3aWdQeU9iamVjdCAqc3RoaXMgPSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhvYmpbMF0pOworICAgIGlmIChzdGhpcykgeworICAgICAgU3dpZ1B5T2JqZWN0X2FwcGVuZCgoUHlPYmplY3QqKSBzdGhpcywgb2JqWzFdKTsKKyAgICB9IGVsc2UgeworICAgICAgU1dJR19QeXRob25fU2V0U3dpZ1RoaXMob2JqWzBdLCBvYmpbMV0pOworICAgIH0KKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisgIH0KK30KKworLyogQ3JlYXRlIGEgbmV3IHBvaW50ZXIgb2JqZWN0ICovCisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1NXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooUHlPYmplY3QgKnNlbGYsIHZvaWQgKnB0ciwgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBmbGFncykgeworICBTd2lnUHlDbGllbnREYXRhICpjbGllbnRkYXRhOworICBQeU9iamVjdCAqIHJvYmo7CisgIGludCBvd247CisKKyAgaWYgKCFwdHIpCisgICAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworCisgIGNsaWVudGRhdGEgPSB0eXBlID8gKFN3aWdQeUNsaWVudERhdGEgKikodHlwZS0+Y2xpZW50ZGF0YSkgOiAwOworICBvd24gPSAoZmxhZ3MgJiBTV0lHX1BPSU5URVJfT1dOKSA/IFNXSUdfUE9JTlRFUl9PV04gOiAwOworICBpZiAoY2xpZW50ZGF0YSAmJiBjbGllbnRkYXRhLT5weXR5cGUpIHsKKyAgICBTd2lnUHlPYmplY3QgKm5ld29iajsKKyAgICBpZiAoZmxhZ3MgJiBTV0lHX0JVSUxUSU5fVFBfSU5JVCkgeworICAgICAgbmV3b2JqID0gKFN3aWdQeU9iamVjdCopIHNlbGY7CisgICAgICBpZiAobmV3b2JqLT5wdHIpIHsKKyAgICAgICAgUHlPYmplY3QgKm5leHRfc2VsZiA9IGNsaWVudGRhdGEtPnB5dHlwZS0+dHBfYWxsb2MoY2xpZW50ZGF0YS0+cHl0eXBlLCAwKTsKKyAgICAgICAgd2hpbGUgKG5ld29iai0+bmV4dCkKKyAgICAgICAgICBuZXdvYmogPSAoU3dpZ1B5T2JqZWN0ICopIG5ld29iai0+bmV4dDsKKyAgICAgICAgbmV3b2JqLT5uZXh0ID0gbmV4dF9zZWxmOworICAgICAgICBuZXdvYmogPSAoU3dpZ1B5T2JqZWN0ICopbmV4dF9zZWxmOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBuZXdvYmogPSBQeU9iamVjdF9OZXcoU3dpZ1B5T2JqZWN0LCBjbGllbnRkYXRhLT5weXR5cGUpOworICAgIH0KKyAgICBpZiAobmV3b2JqKSB7CisgICAgICBuZXdvYmotPnB0ciA9IHB0cjsKKyAgICAgIG5ld29iai0+dHkgPSB0eXBlOworICAgICAgbmV3b2JqLT5vd24gPSBvd247CisgICAgICBuZXdvYmotPm5leHQgPSAwOworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorICAgICAgbmV3b2JqLT5kaWN0ID0gMDsKKyNlbmRpZgorICAgICAgcmV0dXJuIChQeU9iamVjdCopIG5ld29iajsKKyAgICB9CisgICAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworICB9CisKKyAgYXNzZXJ0KCEoZmxhZ3MgJiBTV0lHX0JVSUxUSU5fVFBfSU5JVCkpOworCisgIHJvYmogPSBTd2lnUHlPYmplY3RfTmV3KHB0ciwgdHlwZSwgb3duKTsKKyAgaWYgKGNsaWVudGRhdGEgJiYgIShmbGFncyAmIFNXSUdfUE9JTlRFUl9OT1NIQURPVykpIHsKKyAgICBQeU9iamVjdCAqaW5zdCA9IFNXSUdfUHl0aG9uX05ld1NoYWRvd0luc3RhbmNlKGNsaWVudGRhdGEsIHJvYmopOworICAgIGlmIChpbnN0KSB7CisgICAgICBQeV9ERUNSRUYocm9iaik7CisgICAgICByb2JqID0gaW5zdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJvYmo7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBwYWNrZWQgb2JqZWN0ICovCisKK1NXSUdSVU5USU1FSU5MSU5FIFB5T2JqZWN0ICoKK1NXSUdfUHl0aG9uX05ld1BhY2tlZE9iaih2b2lkICpwdHIsIHNpemVfdCBzeiwgc3dpZ190eXBlX2luZm8gKnR5cGUpIHsKKyAgcmV0dXJuIHB0ciA/IFN3aWdQeVBhY2tlZF9OZXcoKHZvaWQgKikgcHRyLCBzeiwgdHlwZSkgOiBTV0lHX1B5X1ZvaWQoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiAgR2V0IHR5cGUgbGlzdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgU1dJR19MSU5LX1JVTlRJTUUKK3ZvaWQgKlNXSUdfUmV0dXJuR2xvYmFsVHlwZUxpc3Qodm9pZCAqKTsKKyNlbmRpZgorCitTV0lHUlVOVElNRSBzd2lnX21vZHVsZV9pbmZvICoKK1NXSUdfUHl0aG9uX0dldE1vZHVsZSh2b2lkKSB7CisgIHN0YXRpYyB2b2lkICp0eXBlX3BvaW50ZXIgPSAodm9pZCAqKTA7CisgIC8qIGZpcnN0IGNoZWNrIGlmIG1vZHVsZSBhbHJlYWR5IGNyZWF0ZWQgKi8KKyAgaWYgKCF0eXBlX3BvaW50ZXIpIHsKKyNpZmRlZiBTV0lHX0xJTktfUlVOVElNRQorICAgIHR5cGVfcG9pbnRlciA9IFNXSUdfUmV0dXJuR2xvYmFsVHlwZUxpc3QoKHZvaWQgKikwKTsKKyNlbHNlCisjIGlmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorICAgIHR5cGVfcG9pbnRlciA9IFB5Q2Fwc3VsZV9JbXBvcnQoU1dJR1BZX0NBUFNVTEVfTkFNRSwgMCk7CisjIGVsc2UKKyAgICB0eXBlX3BvaW50ZXIgPSBQeUNPYmplY3RfSW1wb3J0KChjaGFyKikic3dpZ19ydW50aW1lX2RhdGEiIFNXSUdfUlVOVElNRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSJ0eXBlX3BvaW50ZXIiIFNXSUdfVFlQRV9UQUJMRV9OQU1FKTsKKyMgZW5kaWYKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgIHR5cGVfcG9pbnRlciA9ICh2b2lkICopMDsKKyAgICB9CisjZW5kaWYKKyAgfQorICByZXR1cm4gKHN3aWdfbW9kdWxlX2luZm8gKikgdHlwZV9wb2ludGVyOworfQorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDIKKy8qIFB5TW9kdWxlX0FkZE9iamVjdCBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMi4wLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbgorICAgaXMgY29waWVkIG91dCBvZiBQeXRob24vbW9kc3VwcG9ydC5jIGluIHB5dGhvbiB2ZXJzaW9uIDIuMy40ICovCitTV0lHSU5URVJOIGludAorUHlNb2R1bGVfQWRkT2JqZWN0KFB5T2JqZWN0ICptLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqbykKK3sKKyAgUHlPYmplY3QgKmRpY3Q7CisgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiUHlNb2R1bGVfQWRkT2JqZWN0KCkgbmVlZHMgbW9kdWxlIGFzIGZpcnN0IGFyZyIpOworICAgIHJldHVybiBTV0lHX0VSUk9SOworICB9CisgIGlmICghbykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBub24tTlVMTCB2YWx1ZSIpOworICAgIHJldHVybiBTV0lHX0VSUk9SOworICB9CisKKyAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAvKiBJbnRlcm5hbCBlcnJvciAtLSBtb2R1bGVzIG11c3QgaGF2ZSBhIGRpY3QhICovCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAibW9kdWxlICclcycgaGFzIG5vIF9fZGljdF9fIiwKKyAgICAgICAgICAgICAgICAgUHlNb2R1bGVfR2V0TmFtZShtKSk7CisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIH0KKyAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG5hbWUsIG8pKQorICAgIHJldHVybiBTV0lHX0VSUk9SOworICBQeV9ERUNSRUYobyk7CisgIHJldHVybiBTV0lHX09LOworfQorI2VuZGlmCisKK1NXSUdSVU5USU1FIHZvaWQKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKK1NXSUdfUHl0aG9uX0Rlc3Ryb3lNb2R1bGUoUHlPYmplY3QgKm9iaikKKyNlbHNlCitTV0lHX1B5dGhvbl9EZXN0cm95TW9kdWxlKHZvaWQgKnZwdHIpCisjZW5kaWYKK3sKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgc3dpZ19tb2R1bGVfaW5mbyAqc3dpZ19tb2R1bGUgPSAoc3dpZ19tb2R1bGVfaW5mbyAqKSBQeUNhcHN1bGVfR2V0UG9pbnRlcihvYmosIFNXSUdQWV9DQVBTVUxFX05BTUUpOworI2Vsc2UKKyAgc3dpZ19tb2R1bGVfaW5mbyAqc3dpZ19tb2R1bGUgPSAoc3dpZ19tb2R1bGVfaW5mbyAqKSB2cHRyOworI2VuZGlmCisgIHN3aWdfdHlwZV9pbmZvICoqdHlwZXMgPSBzd2lnX21vZHVsZS0+dHlwZXM7CisgIHNpemVfdCBpOworICBmb3IgKGkgPTA7IGkgPCBzd2lnX21vZHVsZS0+c2l6ZTsgKytpKSB7CisgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gdHlwZXNbaV07CisgICAgaWYgKHR5LT5vd25kYXRhKSB7CisgICAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gKFN3aWdQeUNsaWVudERhdGEgKikgdHktPmNsaWVudGRhdGE7CisgICAgICBpZiAoZGF0YSkgU3dpZ1B5Q2xpZW50RGF0YV9EZWwoZGF0YSk7CisgICAgfQorICB9CisgIFB5X0RFQ1JFRihTV0lHX1RoaXMoKSk7CisgIHN3aWdfdGhpcyA9IE5VTEw7Cit9CisKK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfUHl0aG9uX1NldE1vZHVsZShzd2lnX21vZHVsZV9pbmZvICpzd2lnX21vZHVsZSkgeworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAvKiBBZGQgYSBkdW1teSBtb2R1bGUgb2JqZWN0IGludG8gc3lzLm1vZHVsZXMgKi8KKyAgUHlPYmplY3QgKm1vZHVsZSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgoY2hhciopInN3aWdfcnVudGltZV9kYXRhIiBTV0lHX1JVTlRJTUVfVkVSU0lPTik7CisjZWxzZQorICBzdGF0aWMgUHlNZXRob2REZWYgc3dpZ19lbXB0eV9ydW50aW1lX21ldGhvZF90YWJsZVtdID0geyB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gfTsgLyogU2VudGluZWwgKi8KKyAgUHlPYmplY3QgKm1vZHVsZSA9IFB5X0luaXRNb2R1bGUoKGNoYXIqKSJzd2lnX3J1bnRpbWVfZGF0YSIgU1dJR19SVU5USU1FX1ZFUlNJT04sIHN3aWdfZW1wdHlfcnVudGltZV9tZXRob2RfdGFibGUpOworI2VuZGlmCisjaWZkZWYgU1dJR1BZX1VTRV9DQVBTVUxFCisgIFB5T2JqZWN0ICpwb2ludGVyID0gUHlDYXBzdWxlX05ldygodm9pZCAqKSBzd2lnX21vZHVsZSwgU1dJR1BZX0NBUFNVTEVfTkFNRSwgU1dJR19QeXRob25fRGVzdHJveU1vZHVsZSk7CisgIGlmIChwb2ludGVyICYmIG1vZHVsZSkgeworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsIChjaGFyKikidHlwZV9wb2ludGVyX2NhcHN1bGUiIFNXSUdfVFlQRV9UQUJMRV9OQU1FLCBwb2ludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9YREVDUkVGKHBvaW50ZXIpOworICB9CisjZWxzZQorICBQeU9iamVjdCAqcG9pbnRlciA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKSBzd2lnX21vZHVsZSwgU1dJR19QeXRob25fRGVzdHJveU1vZHVsZSk7CisgIGlmIChwb2ludGVyICYmIG1vZHVsZSkgeworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsIChjaGFyKikidHlwZV9wb2ludGVyIiBTV0lHX1RZUEVfVEFCTEVfTkFNRSwgcG9pbnRlcik7CisgIH0gZWxzZSB7CisgICAgUHlfWERFQ1JFRihwb2ludGVyKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIFRoZSBweXRob24gY2FjaGVkIHR5cGUgcXVlcnkgKi8KK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1NXSUdfUHl0aG9uX1R5cGVDYWNoZSh2b2lkKSB7CisgIHN0YXRpYyBQeU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUihjYWNoZSkgPSBQeURpY3RfTmV3KCk7CisgIHJldHVybiBjYWNoZTsKK30KKworU1dJR1JVTlRJTUUgc3dpZ190eXBlX2luZm8gKgorU1dJR19QeXRob25fVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKnR5cGUpCit7CisgIFB5T2JqZWN0ICpjYWNoZSA9IFNXSUdfUHl0aG9uX1R5cGVDYWNoZSgpOworICBQeU9iamVjdCAqa2V5ID0gU1dJR19QeXRob25fc3RyX0Zyb21DaGFyKHR5cGUpOworICBQeU9iamVjdCAqb2JqID0gUHlEaWN0X0dldEl0ZW0oY2FjaGUsIGtleSk7CisgIHN3aWdfdHlwZV9pbmZvICpkZXNjcmlwdG9yOworICBpZiAob2JqKSB7CisjaWZkZWYgU1dJR1BZX1VTRV9DQVBTVUxFCisgICAgZGVzY3JpcHRvciA9IChzd2lnX3R5cGVfaW5mbyAqKSBQeUNhcHN1bGVfR2V0UG9pbnRlcihvYmosIE5VTEwpOworI2Vsc2UKKyAgICBkZXNjcmlwdG9yID0gKHN3aWdfdHlwZV9pbmZvICopIFB5Q09iamVjdF9Bc1ZvaWRQdHIob2JqKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIHN3aWdfbW9kdWxlX2luZm8gKnN3aWdfbW9kdWxlID0gU1dJR19QeXRob25fR2V0TW9kdWxlKCk7CisgICAgZGVzY3JpcHRvciA9IFNXSUdfVHlwZVF1ZXJ5TW9kdWxlKHN3aWdfbW9kdWxlLCBzd2lnX21vZHVsZSwgdHlwZSk7CisgICAgaWYgKGRlc2NyaXB0b3IpIHsKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgICAgIG9iaiA9IFB5Q2Fwc3VsZV9OZXcoKHZvaWQqKSBkZXNjcmlwdG9yLCBOVUxMLCBOVUxMKTsKKyNlbHNlCisgICAgICBvYmogPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoZGVzY3JpcHRvciwgTlVMTCk7CisjZW5kaWYKKyAgICAgIFB5RGljdF9TZXRJdGVtKGNhY2hlLCBrZXksIG9iaik7CisgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICB9CisgIH0KKyAgUHlfREVDUkVGKGtleSk7CisgIHJldHVybiBkZXNjcmlwdG9yOworfQorCisvKgorICAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQorKi8KKyNkZWZpbmUgU1dJR19QT0lOVEVSX0VYQ0VQVElPTiAgMAorI2RlZmluZSBTV0lHX2FyZ19mYWlsKGFyZykgICAgICBTV0lHX1B5dGhvbl9BcmdGYWlsKGFyZykKKyNkZWZpbmUgU1dJR19NdXN0R2V0UHRyKHAsIHR5cGUsIGFyZ251bSwgZmxhZ3MpICBTV0lHX1B5dGhvbl9NdXN0R2V0UHRyKHAsIHR5cGUsIGFyZ251bSwgZmxhZ3MpCisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQWRkRXJyTWVzZyhjb25zdCBjaGFyKiBtZXNnLCBpbnQgaW5mcm9udCkKK3sKKyAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBQeU9iamVjdCAqdHlwZSA9IDA7CisgICAgUHlPYmplY3QgKnZhbHVlID0gMDsKKyAgICBQeU9iamVjdCAqdHJhY2ViYWNrID0gMDsKKyAgICBQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIGNoYXIgKnRtcDsKKyAgICAgIFB5T2JqZWN0ICpvbGRfc3RyID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICAgIFB5X1hJTkNSRUYodHlwZSk7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgaWYgKGluZnJvbnQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KHR5cGUsICIlcyAlcyIsIG1lc2csIHRtcCA9IFNXSUdfUHl0aG9uX3N0cl9Bc0NoYXIob2xkX3N0cikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KHR5cGUsICIlcyAlcyIsIHRtcCA9IFNXSUdfUHl0aG9uX3N0cl9Bc0NoYXIob2xkX3N0ciksIG1lc2cpOworICAgICAgfQorICAgICAgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh0bXApOworICAgICAgUHlfREVDUkVGKG9sZF9zdHIpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0FyZ0ZhaWwoaW50IGFyZ251bSkKK3sKKyAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAvKiBhZGQgaW5mb3JtYXRpb24gYWJvdXQgZmFpbGluZyBhcmd1bWVudCAqLworICAgIGNoYXIgbWVzZ1syNTZdOworICAgIFB5T1Nfc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLCAiYXJndW1lbnQgbnVtYmVyICVkOiIsIGFyZ251bSk7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX0FkZEVyck1lc2cobWVzZywgMSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworU1dJR1JVTlRJTUVJTkxJTkUgY29uc3QgY2hhciAqCitTd2lnUHlPYmplY3RfR2V0RGVzYyhQeU9iamVjdCAqc2VsZikKK3sKKyAgU3dpZ1B5T2JqZWN0ICp2ID0gKFN3aWdQeU9iamVjdCAqKXNlbGY7CisgIHN3aWdfdHlwZV9pbmZvICp0eSA9IHYgPyB2LT50eSA6IDA7CisgIHJldHVybiB0eSA/IHR5LT5zdHIgOiAoY2hhciopIiI7Cit9CisKK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfUHl0aG9uX1R5cGVFcnJvcihjb25zdCBjaGFyICp0eXBlLCBQeU9iamVjdCAqb2JqKQoreworICBpZiAodHlwZSkgeworI2lmIGRlZmluZWQoU1dJR19DT0JKRUNUX1RZUEVTKQorICAgIGlmIChvYmogJiYgU3dpZ1B5T2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAgIGNvbnN0IGNoYXIgKm90eXBlID0gKGNvbnN0IGNoYXIgKikgU3dpZ1B5T2JqZWN0X0dldERlc2Mob2JqKTsKKyAgICAgIGlmIChvdHlwZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYSAnJXMnIGlzIGV4cGVjdGVkLCAnU3dpZ1B5T2JqZWN0KCVzKScgaXMgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb3R5cGUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpvdHlwZSA9IChvYmogPyBvYmotPm9iX3R5cGUtPnRwX25hbWUgOiAwKTsKKyAgICAgIGlmIChvdHlwZSkgeworICAgICAgICBQeU9iamVjdCAqc3RyID0gUHlPYmplY3RfU3RyKG9iaik7CisgICAgICAgIGNvbnN0IGNoYXIgKmNzdHIgPSBzdHIgPyBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKHN0cikgOiAwOworICAgICAgICBpZiAoY3N0cikgeworICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhICclcycgaXMgZXhwZWN0ZWQsICclcyglcyknIGlzIHJlY2VpdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb3R5cGUsIGNzdHIpOworICAgICAgICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoY3N0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImEgJyVzJyBpcyBleHBlY3RlZCwgJyVzJyBpcyByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN0cik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImEgJyVzJyBpcyBleHBlY3RlZCIsIHR5cGUpOworICB9IGVsc2UgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ1bmV4cGVjdGVkIHR5cGUgaXMgcmVjZWl2ZWQiKTsKKyAgfQorfQorCisKKy8qIENvbnZlcnQgYSBwb2ludGVyIHZhbHVlLCBzaWduYWwgYW4gZXhjZXB0aW9uIG9uIGEgdHlwZSBtaXNtYXRjaCAqLworU1dJR1JVTlRJTUUgdm9pZCAqCitTV0lHX1B5dGhvbl9NdXN0R2V0UHRyKFB5T2JqZWN0ICpvYmosIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IFNXSUdVTlVTRURQQVJNKGFyZ251bSksIGludCBmbGFncykgeworICB2b2lkICpyZXN1bHQ7CisgIGlmIChTV0lHX1B5dGhvbl9Db252ZXJ0UHRyKG9iaiwgJnJlc3VsdCwgdHksIGZsYWdzKSA9PSAtMSkgeworICAgIFB5RXJyX0NsZWFyKCk7CisjaWYgU1dJR19QT0lOVEVSX0VYQ0VQVElPTgorICAgIGlmIChmbGFncykgeworICAgICAgU1dJR19QeXRob25fVHlwZUVycm9yKFNXSUdfVHlwZVByZXR0eU5hbWUodHkpLCBvYmopOworICAgICAgU1dJR19QeXRob25fQXJnRmFpbChhcmdudW0pOworICAgIH0KKyNlbmRpZgorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkgeworICBQeVR5cGVPYmplY3QgKnRwID0gb2JqLT5vYl90eXBlOworICBQeU9iamVjdCAqZGVzY3I7CisgIFB5T2JqZWN0ICplbmNvZGVkX25hbWU7CisgIGRlc2Nyc2V0ZnVuYyBmOworICBpbnQgcmVzOworCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICBpZiAoUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICBuYW1lID0gUHlVbmljb2RlX0RlY29kZShQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSwgUHlTdHJpbmdfU2l6ZShuYW1lKSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sobmFtZSkpCisjZWxzZQorICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKQorI2VuZGlmCisgIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIHsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgIH0KKworICBpZiAoIXRwLT50cF9kaWN0KSB7CisgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgcmVzID0gLTE7CisgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOworICBmID0gTlVMTDsKKyAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7CisgIGlmICghZikgeworICAgIGlmIChQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgZW5jb2RlZF9uYW1lID0gbmFtZTsKKyAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jb2RlZF9uYW1lID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhuYW1lKTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuMjAwcyciLCB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQXNTdHJpbmcoZW5jb2RlZF9uYW1lKSk7CisgICAgUHlfREVDUkVGKGVuY29kZWRfbmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7CisgIH0KKworICBkb25lOgorICBQeV9ERUNSRUYobmFtZSk7CisgIHJldHVybiByZXM7Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisKKyNkZWZpbmUgU1dJR19leGNlcHRpb25fZmFpbChjb2RlLCBtc2cpIGRvIHsgU1dJR19FcnJvcihjb2RlLCBtc2cpOyBTV0lHX2ZhaWw7IH0gd2hpbGUoMCkKKworI2RlZmluZSBTV0lHX2NvbnRyYWN0X2Fzc2VydChleHByLCBtc2cpIGlmICghKGV4cHIpKSB7IFNXSUdfRXJyb3IoU1dJR19SdW50aW1lRXJyb3IsIG1zZyk7IFNXSUdfZmFpbDsgfSBlbHNlCisKKworCisgICNkZWZpbmUgU1dJR19leGNlcHRpb24oY29kZSwgbXNnKSBkbyB7IFNXSUdfRXJyb3IoY29kZSwgbXNnKTsgU1dJR19mYWlsOzsgfSB3aGlsZSgwKQorCisKKy8qIC0tLS0tLS0tIFRZUEVTIFRBQkxFIChCRUdJTikgLS0tLS0tLS0gKi8KKworI2RlZmluZSBTV0lHVFlQRV9wX2NoYXIgc3dpZ190eXBlc1swXQorI2RlZmluZSBTV0lHVFlQRV9wX2ludCBzd2lnX3R5cGVzWzFdCisjZGVmaW5lIFNXSUdUWVBFX3BfdWludDhfdCBzd2lnX3R5cGVzWzJdCitzdGF0aWMgc3dpZ190eXBlX2luZm8gKnN3aWdfdHlwZXNbNF07CitzdGF0aWMgc3dpZ19tb2R1bGVfaW5mbyBzd2lnX21vZHVsZSA9IHtzd2lnX3R5cGVzLCAzLCAwLCAwLCAwLCAwfTsKKyNkZWZpbmUgU1dJR19UeXBlUXVlcnkobmFtZSkgU1dJR19UeXBlUXVlcnlNb2R1bGUoJnN3aWdfbW9kdWxlLCAmc3dpZ19tb2R1bGUsIG5hbWUpCisjZGVmaW5lIFNXSUdfTWFuZ2xlZFR5cGVRdWVyeShuYW1lKSBTV0lHX01hbmdsZWRUeXBlUXVlcnlNb2R1bGUoJnN3aWdfbW9kdWxlLCAmc3dpZ19tb2R1bGUsIG5hbWUpCisKKy8qIC0tLS0tLS0tIFRZUEVTIFRBQkxFIChFTkQpIC0tLS0tLS0tICovCisKKyNpZiAoUFlfVkVSU0lPTl9IRVggPD0gMHgwMjAwMDAwMCkKKyMgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fQ0xBU1NJQykKKyMgIGVycm9yICJUaGlzIHB5dGhvbiB2ZXJzaW9uIHJlcXVpcmVzIHN3aWcgdG8gYmUgcnVuIHdpdGggdGhlICctY2xhc3NpYycgb3B0aW9uIgorIyBlbmRpZgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgQCh0YXJnZXQpOj0gX2xpYndlYnAuc28KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisjICBkZWZpbmUgU1dJR19pbml0ICAgIFB5SW5pdF9fbGlid2VicAorCisjZWxzZQorIyAgZGVmaW5lIFNXSUdfaW5pdCAgICBpbml0X2xpYndlYnAKKworI2VuZGlmCisjZGVmaW5lIFNXSUdfbmFtZSAgICAiX2xpYndlYnAiCisKKyNkZWZpbmUgU1dJR1ZFUlNJT04gMHgwMjAwMDQKKyNkZWZpbmUgU1dJR19WRVJTSU9OIFNXSUdWRVJTSU9OCisKKworI2RlZmluZSBTV0lHX2FzX3ZvaWRwdHIoYSkgKHZvaWQgKikoKGNvbnN0IHZvaWQgKikoYSkpCisjZGVmaW5lIFNXSUdfYXNfdm9pZHB0cnB0cihhKSAoKHZvaWQpU1dJR19hc192b2lkcHRyKCphKSwodm9pZCoqKShhKSkKKworCisgICNkZWZpbmUgU1dJR19Gcm9tX2xvbmcgICBQeUludF9Gcm9tTG9uZworCisKK1NXSUdJTlRFUk5JTkxJTkUgUHlPYmplY3QgKgorU1dJR19Gcm9tX2ludCAgKGludCB2YWx1ZSkKK3sKKyAgcmV0dXJuIFNXSUdfRnJvbV9sb25nICAodmFsdWUpOworfQorCisKK1NXSUdJTlRFUk4gc3dpZ190eXBlX2luZm8qCitTV0lHX3BjaGFyX2Rlc2NyaXB0b3Iodm9pZCkKK3sKKyAgc3RhdGljIGludCBpbml0ID0gMDsKKyAgc3RhdGljIHN3aWdfdHlwZV9pbmZvKiBpbmZvID0gMDsKKyAgaWYgKCFpbml0KSB7CisgICAgaW5mbyA9IFNXSUdfVHlwZVF1ZXJ5KCJfcF9jaGFyIik7CisgICAgaW5pdCA9IDE7CisgIH0KKyAgcmV0dXJuIGluZm87Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNDaGFyUHRyQW5kU2l6ZShQeU9iamVjdCAqb2JqLCBjaGFyKiogY3B0ciwgc2l6ZV90KiBwc2l6ZSwgaW50ICphbGxvYykKK3sKKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpCisjZWxzZQorICBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkKKyNlbmRpZgorICB7CisgICAgY2hhciAqY3N0cjsgUHlfc3NpemVfdCBsZW47CisjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICBpZiAoIWFsbG9jICYmIGNwdHIpIHsKKyAgICAgICAgLyogV2UgY2FuJ3QgYWxsb3cgY29udmVydGluZyB3aXRob3V0IGFsbG9jYXRpb24sIHNpbmNlIHRoZSBpbnRlcm5hbAorICAgICAgICAgICByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgaW4gUHl0aG9uIDMgaXMgVUNTLTIvVUNTLTQgYnV0IHdlIHJlcXVpcmUKKyAgICAgICAgICAgYSBVVEYtOCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgVE9ETyhiaHkpIE1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gKi8KKyAgICAgICAgcmV0dXJuIFNXSUdfUnVudGltZUVycm9yOworICAgIH0KKyAgICBvYmogPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG9iaik7CisgICAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUob2JqLCAmY3N0ciwgJmxlbik7CisgICAgaWYoYWxsb2MpICphbGxvYyA9IFNXSUdfTkVXT0JKOworI2Vsc2UKKyAgICBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob2JqLCAmY3N0ciwgJmxlbik7CisjZW5kaWYKKyAgICBpZiAoY3B0cikgeworICAgICAgaWYgKGFsbG9jKSB7CisgICAgICAgIC8qCisgICAgICAgICAgIEluIHB5dGhvbiB0aGUgdXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gbW9kaWZ5IHRoZSBpbm5lcgorICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFRvIHdhcnJhbnR5IHRoYXQsIGlmIHlvdSBkZWZpbmUKKyAgICAgICAgICAgU1dJR19QWVRIT05fU0FGRV9DU1RSSU5HUywgYSBuZXcvY29weSBvZiB0aGUgcHl0aG9uIHN0cmluZworICAgICAgICAgICBidWZmZXIgaXMgYWx3YXlzIHJldHVybmVkLgorCisgICAgICAgICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGp1c3QgdG8gcmV0dXJuIHRoZSBwb2ludGVyIHZhbHVlLAorICAgICAgICAgICBzbywgYmUgY2FyZWZ1bC4KKyAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1NBRkVfQ1NUUklOR1MpCisgICAgICAgIGlmICgqYWxsb2MgIT0gU1dJR19PTERPQkopCisjZWxzZQorICAgICAgICBpZiAoKmFsbG9jID09IFNXSUdfTkVXT0JKKQorI2VuZGlmCisgICAgICAgICAgeworICAgICAgICAgICAgKmNwdHIgPSAoY2hhciAqKW1lbWNweSgoY2hhciAqKW1hbGxvYygobGVuICsgMSkqc2l6ZW9mKGNoYXIpKSwgY3N0ciwgc2l6ZW9mKGNoYXIpKihsZW4gKyAxKSk7CisgICAgICAgICAgICAqYWxsb2MgPSBTV0lHX05FV09CSjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICpjcHRyID0gY3N0cjsKKyAgICAgICAgICAqYWxsb2MgPSBTV0lHX09MRE9CSjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisgICAgICAgIGFzc2VydCgwKTsgLyogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgaW4gUHl0aG9uIDMgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgICpjcHRyID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvYmopOworICAgICAgfQorICAgIH0KKyAgICBpZiAocHNpemUpICpwc2l6ZSA9IGxlbiArIDE7CisjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICBQeV9YREVDUkVGKG9iaik7CisjZW5kaWYKKyAgICByZXR1cm4gU1dJR19PSzsKKyAgfSBlbHNlIHsKKyAgICBzd2lnX3R5cGVfaW5mbyogcGNoYXJfZGVzY3JpcHRvciA9IFNXSUdfcGNoYXJfZGVzY3JpcHRvcigpOworICAgIGlmIChwY2hhcl9kZXNjcmlwdG9yKSB7CisgICAgICB2b2lkKiB2cHRyID0gMDsKKyAgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIob2JqLCAmdnB0ciwgcGNoYXJfZGVzY3JpcHRvciwgMCkgPT0gU1dJR19PSykgeworICAgICAgICBpZiAoY3B0cikgKmNwdHIgPSAoY2hhciAqKSB2cHRyOworICAgICAgICBpZiAocHNpemUpICpwc2l6ZSA9IHZwdHIgPyAoc3RybGVuKChjaGFyICopdnB0cikgKyAxKSA6IDA7CisgICAgICAgIGlmIChhbGxvYykgKmFsbG9jID0gU1dJR19PTERPQko7CisgICAgICAgIHJldHVybiBTV0lHX09LOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gU1dJR19UeXBlRXJyb3I7Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNWYWxfZG91YmxlIChQeU9iamVjdCAqb2JqLCBkb3VibGUgKnZhbCkKK3sKKyAgaW50IHJlcyA9IFNXSUdfVHlwZUVycm9yOworICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7CisgICAgaWYgKHZhbCkgKnZhbCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKKyAgICByZXR1cm4gU1dJR19PSzsKKyAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgaWYgKHZhbCkgKnZhbCA9IFB5SW50X0FzTG9uZyhvYmopOworICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgZG91YmxlIHYgPSBQeUxvbmdfQXNEb3VibGUob2JqKTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIGlmICh2YWwpICp2YWwgPSB2OworICAgICAgcmV0dXJuIFNXSUdfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICB9CisjaWZkZWYgU1dJR19QWVRIT05fQ0FTVF9NT0RFCisgIHsKKyAgICBpbnQgZGlzcGF0Y2ggPSAwOworICAgIGRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IGQ7CisgICAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOworICAgIH0gZWxzZSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIWRpc3BhdGNoKSB7CisgICAgICBsb25nIHYgPSBQeUxvbmdfQXNMb25nKG9iaik7CisgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19BZGRDYXN0KFNXSUdfT0spKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHJlczsKK30KKworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworCisjaW5jbHVkZSA8bWF0aC5oPgorCisKK1NXSUdJTlRFUk5JTkxJTkUgaW50CitTV0lHX0NhbkNhc3RBc0ludGVnZXIoZG91YmxlICpkLCBkb3VibGUgbWluLCBkb3VibGUgbWF4KSB7CisgIGRvdWJsZSB4ID0gKmQ7CisgIGlmICgobWluIDw9IHggJiYgeCA8PSBtYXgpKSB7CisgICBkb3VibGUgZnggPSBmbG9vcih4KTsKKyAgIGRvdWJsZSBjeCA9IGNlaWwoeCk7CisgICBkb3VibGUgcmQgPSAgKCh4IC0gZngpIDwgMC41KSA/IGZ4IDogY3g7IC8qIHNpbXBsZSByaW50ICovCisgICBpZiAoKGVycm5vID09IEVET00pIHx8IChlcnJubyA9PSBFUkFOR0UpKSB7CisgICAgIGVycm5vID0gMDsKKyAgIH0gZWxzZSB7CisgICAgIGRvdWJsZSBzdW1tLCByZXBzLCBkaWZmOworICAgICBpZiAocmQgPCB4KSB7CisgICAgICAgZGlmZiA9IHggLSByZDsKKyAgICAgfSBlbHNlIGlmIChyZCA+IHgpIHsKKyAgICAgICBkaWZmID0gcmQgLSB4OworICAgICB9IGVsc2UgeworICAgICAgIHJldHVybiAxOworICAgICB9CisgICAgIHN1bW0gPSByZCArIHg7CisgICAgIHJlcHMgPSBkaWZmL3N1bW07CisgICAgIGlmIChyZXBzIDwgOCpEQkxfRVBTSUxPTikgeworICAgICAgICpkID0gcmQ7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc1ZhbF91bnNpZ25lZF9TU19sb25nIChQeU9iamVjdCAqb2JqLCB1bnNpZ25lZCBsb25nICp2YWwpCit7CisgIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgbG9uZyB2ID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgaWYgKHYgPj0gMCkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNXSUdfT3ZlcmZsb3dFcnJvcjsKKyAgICB9CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICB1bnNpZ25lZCBsb25nIHYgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcob2JqKTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIGlmICh2YWwpICp2YWwgPSB2OworICAgICAgcmV0dXJuIFNXSUdfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICB9CisjaWZkZWYgU1dJR19QWVRIT05fQ0FTVF9NT0RFCisgIHsKKyAgICBpbnQgZGlzcGF0Y2ggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgdiA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOworICAgIH0gZWxzZSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIWRpc3BhdGNoKSB7CisgICAgICBkb3VibGUgZDsKKyAgICAgIGludCByZXMgPSBTV0lHX0FkZENhc3QoU1dJR19Bc1ZhbF9kb3VibGUgKG9iaiwmZCkpOworICAgICAgaWYgKFNXSUdfSXNPSyhyZXMpICYmIFNXSUdfQ2FuQ2FzdEFzSW50ZWdlcigmZCwgMCwgVUxPTkdfTUFYKSkgeworICAgICAgICBpZiAodmFsKSAqdmFsID0gKHVuc2lnbmVkIGxvbmcpKGQpOworICAgICAgICByZXR1cm4gcmVzOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBTV0lHX1R5cGVFcnJvcjsKK30KKworCitTV0lHSU5URVJOSU5MSU5FIGludAorU1dJR19Bc1ZhbF9zaXplX3QgKFB5T2JqZWN0ICogb2JqLCBzaXplX3QgKnZhbCkKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworICBpbnQgcmVzID0gU1dJR19Bc1ZhbF91bnNpZ25lZF9TU19sb25nIChvYmosIHZhbCA/ICZ2IDogMCk7CisgIGlmIChTV0lHX0lzT0socmVzKSAmJiB2YWwpICp2YWwgPSAoc2l6ZV90KSh2KTsKKyAgcmV0dXJuIHJlczsKK30KKworCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisKK3N0YXRpYyBzaXplX3QgUmV0dXJuZWRCdWZmZXJTaXplKAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBzdGF0aWMgY29uc3Qgc3RydWN0IHNpemVtYXAgeworICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uOworICAgIGludCBzaXplX211bHRpcGxpZXI7CisgIH0gc2l6ZV9tYXBbXSA9IHsKKyNpZmRlZiBTV0lHSkFWQQorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorI2lmZGVmIFNXSUdQWVRIT04KKyAgICB7ICJXZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQVJHQiIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorICAgIHsgTlVMTCwgMCB9CisgIH07CisgIGNvbnN0IHN0cnVjdCBzaXplbWFwKiBwOworICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgZm9yIChwID0gc2l6ZV9tYXA7IHAtPmZ1bmN0aW9uOyArK3ApIHsKKyAgICBpZiAoIXN0cmNtcChmdW5jdGlvbiwgcC0+ZnVuY3Rpb24pKSB7CisgICAgICBzaXplID0gKndpZHRoICogKmhlaWdodCAqIHAtPnNpemVfbXVsdGlwbGllcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorCisKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUZ1bmN0aW9uKShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworCitzdGF0aWMgdWludDhfdCogRW5jb2RlTG9zc3koY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RlRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPQorICAgICAgZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAmb3V0cHV0KTsKKyAgLy8gdGhlIHZhbHVlcyBvZiBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgUmV0dXJuZWRCdWZmZXJTaXplKCkKKyAgLy8gYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVMb3NzbGVzc0Z1bmN0aW9uIGVuY2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0cHV0X3NpemUsIGludCogdW51c2VkKSB7CisgIHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBpbWFnZV9zaXplID0gZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkKKyAgLy8gUmV0dXJuZWRCdWZmZXJTaXplKCkgYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKKworLy8gQ2hhbmdlcyB0aGUgcmV0dXJuIHR5cGUgb2YgV2ViUEVuY29kZSogdG8gbW9yZSBjbG9zZWx5IG1hdGNoIERlY29kZSouCisvLyBUaGlzIGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHdyYXAgdGhlIG91dHB1dCBidWZmZXIgaW4gYSBuYXRpdmUgdHlwZSByYXRoZXIKKy8vIHRoYW4gZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gcG9pbnRlci4KKy8vIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHRvIGFsbG93IHJldXNlIG9mIFJldHVybmVkQnVmZmVyU2l6ZSgpLAorLy8gdW51c2VkMiBhbmQgb3V0cHV0X3NpemUgd2lsbCBiZSB1c2VkIGluIHRoaXMgY2FzZS4KKyNkZWZpbmUgTE9TU1lfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIHsgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc3kocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCQSkKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUkEpCisKKyN1bmRlZiBMT1NTWV9XUkFQUEVSCisKKyNkZWZpbmUgTE9TU0xFU1NfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc2xlc3MocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSkKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKworI3VuZGVmIExPU1NMRVNTX1dSQVBQRVIKKworCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiAhZGVmaW5lZChTV0lHX05PX0xMT05HX01BWCkKKyMgaWYgIWRlZmluZWQoTExPTkdfTUFYKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX0xPTkdfTE9OR19NQVhfXykKKyMgICBkZWZpbmUgTExPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisjICAgZGVmaW5lIExMT05HX01JTiAoLUxMT05HX01BWCAtIDFMTCkKKyMgICBkZWZpbmUgVUxMT05HX01BWCAoTExPTkdfTUFYICogMlVMTCArIDFVTEwpCisjIGVuZGlmCisjZW5kaWYKKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc1ZhbF9sb25nIChQeU9iamVjdCAqb2JqLCBsb25nKiB2YWwpCit7CisgIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgaWYgKHZhbCkgKnZhbCA9IFB5SW50X0FzTG9uZyhvYmopOworICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgbG9uZyB2ID0gUHlMb25nX0FzTG9uZyhvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgIH0KKyNpZmRlZiBTV0lHX1BZVEhPTl9DQVNUX01PREUKKyAgeworICAgIGludCBkaXNwYXRjaCA9IDA7CisgICAgbG9uZyB2ID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gpIHsKKyAgICAgIGRvdWJsZSBkOworICAgICAgaW50IHJlcyA9IFNXSUdfQWRkQ2FzdChTV0lHX0FzVmFsX2RvdWJsZSAob2JqLCZkKSk7CisgICAgICBpZiAoU1dJR19Jc09LKHJlcykgJiYgU1dJR19DYW5DYXN0QXNJbnRlZ2VyKCZkLCBMT05HX01JTiwgTE9OR19NQVgpKSB7CisgICAgICAgIGlmICh2YWwpICp2YWwgPSAobG9uZykoZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIFNXSUdfVHlwZUVycm9yOworfQorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX2ludCAoUHlPYmplY3QgKiBvYmosIGludCAqdmFsKQoreworICBsb25nIHY7CisgIGludCByZXMgPSBTV0lHX0FzVmFsX2xvbmcgKG9iaiwgJnYpOworICBpZiAoU1dJR19Jc09LKHJlcykpIHsKKyAgICBpZiAoKHYgPCBJTlRfTUlOIHx8IHYgPiBJTlRfTUFYKSkgeworICAgICAgcmV0dXJuIFNXSUdfT3ZlcmZsb3dFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IChpbnQpKHYpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX2Zsb2F0IChQeU9iamVjdCAqIG9iaiwgZmxvYXQgKnZhbCkKK3sKKyAgZG91YmxlIHY7CisgIGludCByZXMgPSBTV0lHX0FzVmFsX2RvdWJsZSAob2JqLCAmdik7CisgIGlmIChTV0lHX0lzT0socmVzKSkgeworICAgIGlmICgodiA8IC1GTFRfTUFYIHx8IHYgPiBGTFRfTUFYKSkgeworICAgICAgcmV0dXJuIFNXSUdfT3ZlcmZsb3dFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IChmbG9hdCkodik7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICBpbnQgcmVzdWx0OworCisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIjpXZWJQR2V0RGVjb2RlclZlcnNpb24iKSkgU1dJR19mYWlsOworICByZXN1bHQgPSAoaW50KVdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICByZXN1bHRvYmogPSBTV0lHX0Zyb21faW50KChpbnQpKHJlc3VsdCkpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUEdldEluZm8oUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCByZXMxIDsKKyAgY2hhciAqYnVmMSA9IDAgOworICBzaXplX3Qgc2l6ZTEgPSAwIDsKKyAgaW50IGFsbG9jMSA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBpbnQgcmVzdWx0OworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUEdldEluZm8iLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUEdldEluZm8iICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0SW5mbygodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICByZXN1bHRvYmogPSBTV0lHX0Zyb21faW50KChpbnQpKHJlc3VsdCkpOworICBpZiAoU1dJR19Jc1RtcE9iaihyZXMzKSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmczKSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczMpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzMpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVSR0IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCByZXMxIDsKKyAgY2hhciAqYnVmMSA9IDAgOworICBzaXplX3Qgc2l6ZTEgPSAwIDsKKyAgaW50IGFsbG9jMSA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmczID0gJnRlbXAzOworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPOldlYlBEZWNvZGVSR0IiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJXZWJQRGVjb2RlUkdCIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQRGVjb2RlUkdCQShQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZVJHQkEiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZVJHQkEiICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVSR0JBIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQRGVjb2RlQVJHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZUFSR0IiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZUFSR0IiICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVBUkdCIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQRGVjb2RlQkdSKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgcmVzMSA7CisgIGNoYXIgKmJ1ZjEgPSAwIDsKKyAgc2l6ZV90IHNpemUxID0gMCA7CisgIGludCBhbGxvYzEgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSBTV0lHX1RNUE9CSiA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQRGVjb2RlQkdSIiwmb2JqMCkpIFNXSUdfZmFpbDsKKyAgcmVzMSA9IFNXSUdfQXNDaGFyUHRyQW5kU2l6ZShvYmowLCAmYnVmMSwgJnNpemUxLCAmYWxsb2MxKTsKKyAgaWYgKCFTV0lHX0lzT0socmVzMSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IocmVzMSksICJpbiBtZXRob2QgJyIgIldlYlBEZWNvZGVCR1IiICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiV2ViUERlY29kZUJHUiIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXMzKSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmczKSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczMpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzMpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUERlY29kZUJHUkEoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCByZXMxIDsKKyAgY2hhciAqYnVmMSA9IDAgOworICBzaXplX3Qgc2l6ZTEgPSAwIDsKKyAgaW50IGFsbG9jMSA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmczID0gJnRlbXAzOworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPOldlYlBEZWNvZGVCR1JBIiwmb2JqMCkpIFNXSUdfZmFpbDsKKyAgcmVzMSA9IFNXSUdfQXNDaGFyUHRyQW5kU2l6ZShvYmowLCAmYnVmMSwgJnNpemUxLCAmYWxsb2MxKTsKKyAgaWYgKCFTV0lHX0lzT0socmVzMSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IocmVzMSksICJpbiBtZXRob2QgJyIgIldlYlBEZWNvZGVCR1JBIiAiJywgYXJndW1lbnQgIiAiMSIiIG9mIHR5cGUgJyIgInVpbnQ4X3QgY29uc3QgKiIiJyIpOworICB9CisgIGFyZzEgPSAodWludDhfdCAqKShidWYxKTsKKyAgYXJnMiA9IChzaXplX3QpKHNpemUxIC0gMSk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZUJHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJXZWJQRGVjb2RlQkdSQSIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXMzKSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmczKSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczMpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzMpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUEdldEVuY29kZXJWZXJzaW9uKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIGludCByZXN1bHQ7CisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiOldlYlBHZXRFbmNvZGVyVmVyc2lvbiIpKSBTV0lHX2ZhaWw7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldEVuY29kZXJWZXJzaW9uKCk7CisgIHJlc3VsdG9iaiA9IFNXSUdfRnJvbV9pbnQoKGludCkocmVzdWx0KSk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVSR0IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZVJHQiIsJm9iajAsJm9iajEsJm9iajIsJm9iajMsJm9iajQsJm9iajUsJm9iajYpKSBTV0lHX2ZhaWw7CisgIHsKKyAgICAvLyBOQjogd2l0aCBQeXRob24gPCAyLjYgdGhlIG9sZCBzdHlsZSBidWZmZXIgcHJvdG9jb2wgbWF5IGJlIHVzZWQ6CisgICAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgICAgLy8gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iajAsIChjb25zdCB2b2lkKiopKCZhcmcxKSwgJnVudXNlZCk7CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihvYmowKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlUkdCJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVSR0InLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjIiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDIgPSAoaW50KSh2YWwpOworICAgIGFyZzIgPSAmdGVtcDI7CisgICAgcmVzMiA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMzID0gU1dJR19Db252ZXJ0UHRyKG9iajIsU1dJR19hc192b2lkcHRycHRyKCZhcmczKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMiwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0IiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0IiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiNiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzYgPSAoaW50KSh2YWw2KTsKKyAgZWNvZGU3ID0gU1dJR19Bc1ZhbF9pbnQob2JqNSwgJnZhbDcpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTcpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNyksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIGVjb2RlOCA9IFNXSUdfQXNWYWxfZmxvYXQob2JqNiwgJnZhbDgpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTgpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlOCksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgid3JhcF9XZWJQRW5jb2RlUkdCIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVCR1IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZUJHUiIsJm9iajAsJm9iajEsJm9iajIsJm9iajMsJm9iajQsJm9iajUsJm9iajYpKSBTV0lHX2ZhaWw7CisgIHsKKyAgICAvLyBOQjogd2l0aCBQeXRob24gPCAyLjYgdGhlIG9sZCBzdHlsZSBidWZmZXIgcHJvdG9jb2wgbWF5IGJlIHVzZWQ6CisgICAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgICAgLy8gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iajAsIChjb25zdCB2b2lkKiopKCZhcmcxKSwgJnVudXNlZCk7CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihvYmowKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlQkdSJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVCR1InLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjIiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDIgPSAoaW50KSh2YWwpOworICAgIGFyZzIgPSAmdGVtcDI7CisgICAgcmVzMiA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMzID0gU1dJR19Db252ZXJ0UHRyKG9iajIsU1dJR19hc192b2lkcHRycHRyKCZhcmczKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMiwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1IiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1IiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiNiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzYgPSAoaW50KSh2YWw2KTsKKyAgZWNvZGU3ID0gU1dJR19Bc1ZhbF9pbnQob2JqNSwgJnZhbDcpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTcpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNyksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIGVjb2RlOCA9IFNXSUdfQXNWYWxfZmxvYXQob2JqNiwgJnZhbDgpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTgpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlOCksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgid3JhcF9XZWJQRW5jb2RlQkdSIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVSR0JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBmbG9hdCB2YWw4IDsKKyAgaW50IGVjb2RlOCA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICBQeU9iamVjdCAqIG9iajYgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiT09PT09PTzp3cmFwX1dlYlBFbmNvZGVSR0JBIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVSR0JBJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVSR0JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIGVjb2RlOCA9IFNXSUdfQXNWYWxfZmxvYXQob2JqNiwgJnZhbDgpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTgpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlOCksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICI4IiIgb2YgdHlwZSAnIiAiZmxvYXQiIiciKTsKKyAgfQorICBhcmc4ID0gKGZsb2F0KSh2YWw4KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVSR0JBIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVCR1JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBmbG9hdCB2YWw4IDsKKyAgaW50IGVjb2RlOCA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICBQeU9iamVjdCAqIG9iajYgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiT09PT09PTzp3cmFwX1dlYlBFbmNvZGVCR1JBIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVCR1JBJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVCR1JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIGVjb2RlOCA9IFNXSUdfQXNWYWxfZmxvYXQob2JqNiwgJnZhbDgpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTgpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlOCksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICI4IiIgb2YgdHlwZSAnIiAiZmxvYXQiIiciKTsKKyAgfQorICBhcmc4ID0gKGZsb2F0KSh2YWw4KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT086d3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBQeV9idWZmZXIgcmdiX2J1ZmZlcjEgOworICBpbnQgdGVtcDIgOworICBpbnQgcmVzMiA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IDAgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHZhbDUgOworICBpbnQgZWNvZGU1ID0gMCA7CisgIGludCB2YWw2IDsKKyAgaW50IGVjb2RlNiA9IDAgOworICBpbnQgdmFsNyA7CisgIGludCBlY29kZTcgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMSA9IDAgOworICBQeU9iamVjdCAqIG9iajIgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmozID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNCA9IDAgOworICBQeU9iamVjdCAqIG9iajUgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiT09PT09POndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSkpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUicsIGFyZ3VtZW50IDEiCisgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iajAsICZyZ2JfYnVmZmVyMSwgUHlCVUZfU0lNUExFKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1InLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiAiJywgYXJndW1lbnQgIiAiMyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMyA9IChpbnQpKHZhbCk7CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgICByZXMzID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBlY29kZTUgPSBTV0lHX0FzVmFsX2ludChvYmozLCAmdmFsNSk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU1KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICI3IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNyA9IChpbnQpKHZhbDcpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQShQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT086d3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSkpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQScsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQShQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT086d3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSkpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQScsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBQeU1ldGhvZERlZiBTd2lnTWV0aG9kc1tdID0geworICAgICAgICAgeyAoY2hhciAqKSJTV0lHX1B5SW5zdGFuY2VNZXRob2RfTmV3IiwgKFB5Q0Z1bmN0aW9uKVNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXcsIE1FVEhfTywgTlVMTH0sCisgICAgICAgICB7IChjaGFyICopIldlYlBHZXREZWNvZGVyVmVyc2lvbiIsIF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQR2V0RGVjb2RlclZlcnNpb24oKSAtPiBpbnQifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUEdldEluZm8iLCBfd3JhcF9XZWJQR2V0SW5mbywgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQR2V0SW5mbyh1aW50OF90IGRhdGEpIC0+ICh3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlUkdCIiwgX3dyYXBfV2ViUERlY29kZVJHQiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlUkdCKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUERlY29kZVJHQkEiLCBfd3JhcF9XZWJQRGVjb2RlUkdCQSwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlUkdCQSh1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBEZWNvZGVBUkdCIiwgX3dyYXBfV2ViUERlY29kZUFSR0IsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikiV2ViUERlY29kZUFSR0IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlQkdSIiwgX3dyYXBfV2ViUERlY29kZUJHUiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlQkdSKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUERlY29kZUJHUkEiLCBfd3JhcF9XZWJQRGVjb2RlQkdSQSwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlQkdSQSh1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBHZXRFbmNvZGVyVmVyc2lvbiIsIF93cmFwX1dlYlBHZXRFbmNvZGVyVmVyc2lvbiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQR2V0RW5jb2RlclZlcnNpb24oKSAtPiBpbnQifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlUkdCIiwgX3dyYXBfd3JhcF9XZWJQRW5jb2RlUkdCLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVCR1IiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVCR1IsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZVJHQkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVSR0JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgX3dyYXBfd3JhcF9XZWJQRW5jb2RlQkdSQSwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IE5VTEwsIE5VTEwsIDAsIE5VTEwgfQorfTsKKworCisvKiAtLS0tLS0tLSBUWVBFIENPTlZFUlNJT04gQU5EIEVRVUlWQUxFTkNFIFJVTEVTIChCRUdJTikgLS0tLS0tLS0gKi8KKworc3RhdGljIHN3aWdfdHlwZV9pbmZvIF9zd2lndF9fcF9jaGFyID0geyJfcF9jaGFyIiwgImNoYXIgKiIsIDAsIDAsICh2b2lkKikwLCAwfTsKK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyBfc3dpZ3RfX3BfaW50ID0geyJfcF9pbnQiLCAiaW50ICoiLCAwLCAwLCAodm9pZCopMCwgMH07CitzdGF0aWMgc3dpZ190eXBlX2luZm8gX3N3aWd0X19wX3VpbnQ4X3QgPSB7Il9wX3VpbnQ4X3QiLCAidWludDhfdCAqIiwgMCwgMCwgKHZvaWQqKTAsIDB9OworCitzdGF0aWMgc3dpZ190eXBlX2luZm8gKnN3aWdfdHlwZV9pbml0aWFsW10gPSB7CisgICZfc3dpZ3RfX3BfY2hhciwKKyAgJl9zd2lndF9fcF9pbnQsCisgICZfc3dpZ3RfX3BfdWludDhfdCwKK307CisKK3N0YXRpYyBzd2lnX2Nhc3RfaW5mbyBfc3dpZ2NfX3BfY2hhcltdID0geyAgeyZfc3dpZ3RfX3BfY2hhciwgMCwgMCwgMH0sezAsIDAsIDAsIDB9fTsKK3N0YXRpYyBzd2lnX2Nhc3RfaW5mbyBfc3dpZ2NfX3BfaW50W10gPSB7ICB7Jl9zd2lndF9fcF9pbnQsIDAsIDAsIDB9LHswLCAwLCAwLCAwfX07CitzdGF0aWMgc3dpZ19jYXN0X2luZm8gX3N3aWdjX19wX3VpbnQ4X3RbXSA9IHsgIHsmX3N3aWd0X19wX3VpbnQ4X3QsIDAsIDAsIDB9LHswLCAwLCAwLCAwfX07CisKK3N0YXRpYyBzd2lnX2Nhc3RfaW5mbyAqc3dpZ19jYXN0X2luaXRpYWxbXSA9IHsKKyAgX3N3aWdjX19wX2NoYXIsCisgIF9zd2lnY19fcF9pbnQsCisgIF9zd2lnY19fcF91aW50OF90LAorfTsKKworCisvKiAtLS0tLS0tLSBUWVBFIENPTlZFUlNJT04gQU5EIEVRVUlWQUxFTkNFIFJVTEVTIChFTkQpIC0tLS0tLS0tICovCisKK3N0YXRpYyBzd2lnX2NvbnN0X2luZm8gc3dpZ19jb25zdF90YWJsZVtdID0geworezAsIDAsIDAsIDAuMCwgMCwgMH19OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgaW5pdGlhbGl6YXRpb246CisgKiBUaGlzIHByb2JsZW0gaXMgdG91Z2ggYnkgdGhlIHJlcXVpcmVtZW50IHRoYXQgbm8gZHluYW1pYworICogbWVtb3J5IGlzIHVzZWQuIEFsc28sIHNpbmNlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZXMgc3RvcmUgcG9pbnRlcnMgdG8KKyAqIHN3aWdfY2FzdF9pbmZvIHN0cnVjdHVyZXMgYW5kIHN3aWdfY2FzdF9pbmZvIHN0cnVjdHVyZXMgc3RvcmUgcG9pbnRlcnMgYmFjaworICogdG8gc3dpZ190eXBlX2luZm8gc3RydWN0dXJlcywgd2UgbmVlZCBzb21lIGxvb2t1cCBjb2RlIGF0IGluaXRpYWxpemF0aW9uLgorICogVGhlIGlkZWEgaXMgdGhhdCBzd2lnIGdlbmVyYXRlcyBhbGwgdGhlIHN0cnVjdHVyZXMgdGhhdCBhcmUgbmVlZGVkLgorICogVGhlIHJ1bnRpbWUgdGhlbiBjb2xsZWN0cyB0aGVzZSBwYXJ0aWFsbHkgZmlsbGVkIHN0cnVjdHVyZXMuCisgKiBUaGUgU1dJR19Jbml0aWFsaXplTW9kdWxlIGZ1bmN0aW9uIHRha2VzIHRoZXNlIGluaXRpYWwgYXJyYXlzIG91dCBvZgorICogc3dpZ19tb2R1bGUsIGFuZCBkb2VzIGFsbCB0aGUgbG9va3VwLCBmaWxsaW5nIGluIHRoZSBzd2lnX21vZHVsZS50eXBlcworICogYXJyYXkgd2l0aCB0aGUgY29ycmVjdCBkYXRhIGFuZCBsaW5raW5nIHRoZSBjb3JyZWN0IHN3aWdfY2FzdF9pbmZvCisgKiBzdHJ1Y3R1cmVzIHRvZ2V0aGVyLgorICoKKyAqIFRoZSBnZW5lcmF0ZWQgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlcyBhcmUgYXNzaWduZWQgc3RhdGljbHkgdG8gYW4gaW5pdGlhbAorICogYXJyYXkuIFdlIGp1c3QgbG9vcCB0aHJvdWdoIHRoYXQgYXJyYXksIGFuZCBoYW5kbGUgZWFjaCB0eXBlIGluZGl2aWR1YWxseS4KKyAqIEZpcnN0IHdlIGxvb2t1cCBpZiB0aGlzIHR5cGUgaGFzIGJlZW4gYWxyZWFkeSBsb2FkZWQsIGFuZCBpZiBzbywgdXNlIHRoZQorICogbG9hZGVkIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmF0ZWQgb25lLiBUaGVuIHdlIGhhdmUgdG8gZmlsbCBpbiB0aGUKKyAqIGNhc3QgbGlua2VkIGxpc3QuIFRoZSBjYXN0IGRhdGEgaXMgaW5pdGlhbGx5IHN0b3JlZCBpbiBzb21ldGhpbmcgbGlrZSBhCisgKiB0d28tZGltZW5zaW9uYWwgYXJyYXkuIEVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgdHlwZSAodGhlcmUgYXJlIHRoZSBzYW1lCisgKiBudW1iZXIgb2Ygcm93cyBhcyB0aGVyZSBhcmUgaW4gdGhlIHN3aWdfdHlwZV9pbml0aWFsIGFycmF5KS4gRWFjaCBlbnRyeSBpbgorICogYSBjb2x1bW4gaXMgb25lIG9mIHRoZSBzd2lnX2Nhc3RfaW5mbyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHR5cGUuCisgKiBUaGUgY2FzdF9pbml0aWFsIGFycmF5IGlzIGFjdHVhbGx5IGFuIGFycmF5IG9mIGFycmF5cywgYmVjYXVzZSBlYWNoIHJvdyBoYXMKKyAqIGEgdmFyaWFibGUgbnVtYmVyIG9mIGNvbHVtbnMuIFNvIHRvIGFjdHVhbGx5IGJ1aWxkIHRoZSBjYXN0IGxpbmtlZCBsaXN0LAorICogd2UgZmluZCB0aGUgYXJyYXkgb2YgY2FzdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlLCBhbmQgbG9vcCB0aHJvdWdoIGl0CisgKiBhZGRpbmcgdGhlIGNhc3RzIHRvIHRoZSBsaXN0LiBUaGUgb25lIGxhc3QgdHJpY2sgd2UgbmVlZCB0byBkbyBpcyBtYWtpbmcKKyAqIHN1cmUgdGhlIHR5cGUgcG9pbnRlciBpbiB0aGUgc3dpZ19jYXN0X2luZm8gc3RydWN0IGlzIGNvcnJlY3QuCisgKgorICogRmlyc3Qgb2ZmLCB3ZSBsb29rdXAgdGhlIGNhc3QtPnR5cGUgbmFtZSB0byBzZWUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCisgKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgdG8gaGFuZGxlOgorICogIDEpIElmIHRoZSBjYXN0LT50eXBlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIEFORCB0aGUgdHlwZSB3ZSBhcmUgYWRkaW5nCisgKiAgICAgY2FzdGluZyBpbmZvIHRvIGhhcyBub3QgYmVlbiBsb2FkZWQgKGl0IGlzIGluIHRoaXMgbW9kdWxlKSwgVEhFTiB3ZQorICogICAgIHJlcGxhY2UgdGhlIGNhc3QtPnR5cGUgcG9pbnRlciB3aXRoIHRoZSB0eXBlIHBvaW50ZXIgdGhhdCBoYXMgYWxyZWFkeQorICogICAgIGJlZW4gbG9hZGVkLgorICogIDIpIElmIEJPVEggdHlwZXMgKHRoZSBvbmUgd2UgYXJlIGFkZGluZyBjYXN0aW5nIGluZm8gdG8sIGFuZCB0aGUKKyAqICAgICBjYXN0LT50eXBlKSBhcmUgbG9hZGVkLCBUSEVOIHRoZSBjYXN0IGluZm8gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkKKyAqICAgICB0aGUgcHJldmlvdXMgbW9kdWxlIHNvIHdlIGp1c3QgaWdub3JlIGl0LgorICogIDMpIEZpbmFsbHksIGlmIGNhc3QtPnR5cGUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkLCB0aGVuIHdlIGFkZCB0aGF0CisgKiAgICAgc3dpZ19jYXN0X2luZm8gdG8gdGhlIGxpbmtlZCBsaXN0IChiZWNhdXNlIHRoZSBjYXN0LT50eXBlKSBwb2ludGVyIHdpbGwKKyAqICAgICBiZSBjb3JyZWN0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNpZiAwCit9IC8qIGMtbW9kZSAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUgU1dJR1JVTlRJTUVfREVCVUcKKyNlbmRpZgorCisKK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfSW5pdGlhbGl6ZU1vZHVsZSh2b2lkICpjbGllbnRkYXRhKSB7CisgIHNpemVfdCBpOworICBzd2lnX21vZHVsZV9pbmZvICptb2R1bGVfaGVhZCwgKml0ZXI7CisgIGludCBmb3VuZCwgaW5pdDsKKworICBjbGllbnRkYXRhID0gY2xpZW50ZGF0YTsKKworICAvKiBjaGVjayB0byBzZWUgaWYgdGhlIGNpcmN1bGFyIGxpc3QgaGFzIGJlZW4gc2V0dXAsIGlmIG5vdCwgc2V0IGl0IHVwICovCisgIGlmIChzd2lnX21vZHVsZS5uZXh0PT0wKSB7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3dpZ19tb2R1bGUgKi8KKyAgICBzd2lnX21vZHVsZS50eXBlX2luaXRpYWwgPSBzd2lnX3R5cGVfaW5pdGlhbDsKKyAgICBzd2lnX21vZHVsZS5jYXN0X2luaXRpYWwgPSBzd2lnX2Nhc3RfaW5pdGlhbDsKKyAgICBzd2lnX21vZHVsZS5uZXh0ID0gJnN3aWdfbW9kdWxlOworICAgIGluaXQgPSAxOworICB9IGVsc2UgeworICAgIGluaXQgPSAwOworICB9CisKKyAgLyogVHJ5IGFuZCBsb2FkIGFueSBhbHJlYWR5IGNyZWF0ZWQgbW9kdWxlcyAqLworICBtb2R1bGVfaGVhZCA9IFNXSUdfR2V0TW9kdWxlKGNsaWVudGRhdGEpOworICBpZiAoIW1vZHVsZV9oZWFkKSB7CisgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgbW9kdWxlIGxvYWRlZCBmb3IgdGhpcyBpbnRlcnByZXRlciAqLworICAgIC8qIHNvIHNldCB0aGUgc3dpZyBtb2R1bGUgaW50byB0aGUgaW50ZXJwcmV0ZXIgKi8KKyAgICBTV0lHX1NldE1vZHVsZShjbGllbnRkYXRhLCAmc3dpZ19tb2R1bGUpOworICAgIG1vZHVsZV9oZWFkID0gJnN3aWdfbW9kdWxlOworICB9IGVsc2UgeworICAgIC8qIHRoZSBpbnRlcnByZXRlciBoYXMgbG9hZGVkIGEgU1dJRyBtb2R1bGUsIGJ1dCBoYXMgaXQgbG9hZGVkIHRoaXMgb25lPyAqLworICAgIGZvdW5kPTA7CisgICAgaXRlcj1tb2R1bGVfaGVhZDsKKyAgICBkbyB7CisgICAgICBpZiAoaXRlcj09JnN3aWdfbW9kdWxlKSB7CisgICAgICAgIGZvdW5kPTE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXRlcj1pdGVyLT5uZXh0OworICAgIH0gd2hpbGUgKGl0ZXIhPSBtb2R1bGVfaGVhZCk7CisKKyAgICAvKiBpZiB0aGUgaXMgZm91bmQgaW4gdGhlIGxpc3QsIHRoZW4gYWxsIGlzIGRvbmUgYW5kIHdlIG1heSBsZWF2ZSAqLworICAgIGlmIChmb3VuZCkgcmV0dXJuOworICAgIC8qIG90aGVyd2lzZSB3ZSBtdXN0IGFkZCBvdXQgbW9kdWxlIGludG8gdGhlIGxpc3QgKi8KKyAgICBzd2lnX21vZHVsZS5uZXh0ID0gbW9kdWxlX2hlYWQtPm5leHQ7CisgICAgbW9kdWxlX2hlYWQtPm5leHQgPSAmc3dpZ19tb2R1bGU7CisgIH0KKworICAvKiBXaGVuIG11bHRpcGxlIGludGVycGV0ZXJzIGFyZSB1c2VkLCBhIG1vZHVsZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBpbgorICAgICAgIGEgZGlmZmVyZW50IGludGVycHJldGVyLCBidXQgbm90IHlldCBoYXZlIGEgcG9pbnRlciBpbiB0aGlzIGludGVycHJldGVyLgorICAgICAgIEluIHRoaXMgY2FzZSwgd2UgZG8gbm90IHdhbnQgdG8gY29udGludWUgYWRkaW5nIHR5cGVzLi4uIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisgICAgICAgc2V0IHVwIGFscmVhZHkgKi8KKyAgaWYgKGluaXQgPT0gMCkgcmV0dXJuOworCisgIC8qIE5vdyB3b3JrIG9uIGZpbGxpbmcgaW4gc3dpZ19tb2R1bGUudHlwZXMgKi8KKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogc2l6ZSAlZFxuIiwgc3dpZ19tb2R1bGUuc2l6ZSk7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IHN3aWdfbW9kdWxlLnNpemU7ICsraSkgeworICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlID0gMDsKKyAgICBzd2lnX3R5cGVfaW5mbyAqcmV0OworICAgIHN3aWdfY2FzdF9pbmZvICpjYXN0OworCisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogdHlwZSAlZCAlc1xuIiwgaSwgc3dpZ19tb2R1bGUudHlwZV9pbml0aWFsW2ldLT5uYW1lKTsKKyNlbmRpZgorCisgICAgLyogaWYgdGhlcmUgaXMgYW5vdGhlciBtb2R1bGUgYWxyZWFkeSBsb2FkZWQgKi8KKyAgICBpZiAoc3dpZ19tb2R1bGUubmV4dCAhPSAmc3dpZ19tb2R1bGUpIHsKKyAgICAgIHR5cGUgPSBTV0lHX01hbmdsZWRUeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGUubmV4dCwgJnN3aWdfbW9kdWxlLCBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPm5hbWUpOworICAgIH0KKyAgICBpZiAodHlwZSkgeworICAgICAgLyogT3ZlcndyaXRlIGNsaWVudGRhdGEgZmllbGQgKi8KKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGZvdW5kIHR5cGUgJXNcbiIsIHR5cGUtPm5hbWUpOworI2VuZGlmCisgICAgICBpZiAoc3dpZ19tb2R1bGUudHlwZV9pbml0aWFsW2ldLT5jbGllbnRkYXRhKSB7CisgICAgICAgIHR5cGUtPmNsaWVudGRhdGEgPSBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPmNsaWVudGRhdGE7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGZvdW5kIGFuZCBvdmVyd3JpdGUgdHlwZSAlcyBcbiIsIHR5cGUtPm5hbWUpOworI2VuZGlmCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGUgPSBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV07CisgICAgfQorCisgICAgLyogSW5zZXJ0IGNhc3RpbmcgdHlwZXMgKi8KKyAgICBjYXN0ID0gc3dpZ19tb2R1bGUuY2FzdF9pbml0aWFsW2ldOworICAgIHdoaWxlIChjYXN0LT50eXBlKSB7CisgICAgICAvKiBEb24ndCBuZWVkIHRvIGFkZCBpbmZvcm1hdGlvbiBhbHJlYWR5IGluIHRoZSBsaXN0ICovCisgICAgICByZXQgPSAwOworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogbG9vayBjYXN0ICVzXG4iLCBjYXN0LT50eXBlLT5uYW1lKTsKKyNlbmRpZgorICAgICAgaWYgKHN3aWdfbW9kdWxlLm5leHQgIT0gJnN3aWdfbW9kdWxlKSB7CisgICAgICAgIHJldCA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZShzd2lnX21vZHVsZS5uZXh0LCAmc3dpZ19tb2R1bGUsIGNhc3QtPnR5cGUtPm5hbWUpOworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICAgIGlmIChyZXQpIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBmb3VuZCBjYXN0ICVzXG4iLCByZXQtPm5hbWUpOworI2VuZGlmCisgICAgICB9CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGlmICh0eXBlID09IHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXSkgeworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICAgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IHNraXAgb2xkIHR5cGUgJXNcbiIsIHJldC0+bmFtZSk7CisjZW5kaWYKKyAgICAgICAgICBjYXN0LT50eXBlID0gcmV0OworICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogQ2hlY2sgZm9yIGNhc3RpbmcgYWxyZWFkeSBpbiB0aGUgbGlzdCAqLworICAgICAgICAgIHN3aWdfY2FzdF9pbmZvICpvY2FzdCA9IFNXSUdfVHlwZUNoZWNrKHJldC0+bmFtZSwgdHlwZSk7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgICBpZiAob2Nhc3QpIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBza2lwIG9sZCBjYXN0ICVzXG4iLCByZXQtPm5hbWUpOworI2VuZGlmCisgICAgICAgICAgaWYgKCFvY2FzdCkgcmV0ID0gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXJldCkgeworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBhZGRpbmcgY2FzdCAlc1xuIiwgY2FzdC0+dHlwZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgICAgaWYgKHR5cGUtPmNhc3QpIHsKKyAgICAgICAgICB0eXBlLT5jYXN0LT5wcmV2ID0gY2FzdDsKKyAgICAgICAgICBjYXN0LT5uZXh0ID0gdHlwZS0+Y2FzdDsKKyAgICAgICAgfQorICAgICAgICB0eXBlLT5jYXN0ID0gY2FzdDsKKyAgICAgIH0KKyAgICAgIGNhc3QrKzsKKyAgICB9CisgICAgLyogU2V0IGVudHJ5IGluIG1vZHVsZXMtPnR5cGVzIGFycmF5IGVxdWFsIHRvIHRoZSB0eXBlICovCisgICAgc3dpZ19tb2R1bGUudHlwZXNbaV0gPSB0eXBlOworICB9CisgIHN3aWdfbW9kdWxlLnR5cGVzW2ldID0gMDsKKworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgIHByaW50ZigiKioqKiBTV0lHX0luaXRpYWxpemVNb2R1bGU6IENhc3QgTGlzdCAqKioqKipcbiIpOworICBmb3IgKGkgPSAwOyBpIDwgc3dpZ19tb2R1bGUuc2l6ZTsgKytpKSB7CisgICAgaW50IGogPSAwOworICAgIHN3aWdfY2FzdF9pbmZvICpjYXN0ID0gc3dpZ19tb2R1bGUuY2FzdF9pbml0aWFsW2ldOworICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiB0eXBlICVkICVzXG4iLCBpLCBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPm5hbWUpOworICAgIHdoaWxlIChjYXN0LT50eXBlKSB7CisgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogY2FzdCB0eXBlICVzXG4iLCBjYXN0LT50eXBlLT5uYW1lKTsKKyAgICAgIGNhc3QrKzsKKyAgICAgICsrajsKKyAgICB9CisgICAgcHJpbnRmKCItLS0tIFRvdGFsIGNhc3RzOiAlZFxuIixqKTsKKyAgfQorICBwcmludGYoIioqKiogU1dJR19Jbml0aWFsaXplTW9kdWxlOiBDYXN0IExpc3QgKioqKioqXG4iKTsKKyNlbmRpZgorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvcGFnYXRlIHRoZSBjbGllbnRkYXRhIGZpZWxkIG9mIHR5cGUgdG8KKyogYW55IG5ldyBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGludG8gdGhlIGxpc3QKKyogb2YgZXF1aXZhbGVudCB0eXBlcy4gIEl0IGlzIGxpa2UgY2FsbGluZworKiBTV0lHX1R5cGVDbGllbnREYXRhKHR5cGUsIGNsaWVudGRhdGEpIGEgc2Vjb25kIHRpbWUuCisqLworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19Qcm9wYWdhdGVDbGllbnREYXRhKHZvaWQpIHsKKyAgc2l6ZV90IGk7CisgIHN3aWdfY2FzdF9pbmZvICplcXVpdjsKKyAgc3RhdGljIGludCBpbml0X3J1biA9IDA7CisKKyAgaWYgKGluaXRfcnVuKSByZXR1cm47CisgIGluaXRfcnVuID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3dpZ19tb2R1bGUuc2l6ZTsgaSsrKSB7CisgICAgaWYgKHN3aWdfbW9kdWxlLnR5cGVzW2ldLT5jbGllbnRkYXRhKSB7CisgICAgICBlcXVpdiA9IHN3aWdfbW9kdWxlLnR5cGVzW2ldLT5jYXN0OworICAgICAgd2hpbGUgKGVxdWl2KSB7CisgICAgICAgIGlmICghZXF1aXYtPmNvbnZlcnRlcikgeworICAgICAgICAgIGlmIChlcXVpdi0+dHlwZSAmJiAhZXF1aXYtPnR5cGUtPmNsaWVudGRhdGEpCisgICAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YShlcXVpdi0+dHlwZSwgc3dpZ19tb2R1bGUudHlwZXNbaV0tPmNsaWVudGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVxdWl2ID0gZXF1aXYtPm5leHQ7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDAKK3sKKyAgLyogYy1tb2RlICovCisjZW5kaWYKK30KKyNlbmRpZgorCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgIC8qIFB5dGhvbi1zcGVjaWZpYyBTV0lHIEFQSSAqLworI2RlZmluZSBTV0lHX25ld3ZhcmxpbmsoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJR19QeXRob25fbmV3dmFybGluaygpCisjZGVmaW5lIFNXSUdfYWRkdmFybGluayhwLCBuYW1lLCBnZXRfYXR0ciwgc2V0X2F0dHIpICBTV0lHX1B5dGhvbl9hZGR2YXJsaW5rKHAsIG5hbWUsIGdldF9hdHRyLCBzZXRfYXR0cikKKyNkZWZpbmUgU1dJR19JbnN0YWxsQ29uc3RhbnRzKGQsIGNvbnN0YW50cykgICAgICAgICAgIFNXSUdfUHl0aG9uX0luc3RhbGxDb25zdGFudHMoZCwgY29uc3RhbnRzKQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIGdsb2JhbCB2YXJpYWJsZSBzdXBwb3J0IGNvZGUuCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgdHlwZWRlZiBzdHJ1Y3Qgc3dpZ19nbG9iYWx2YXIgeworICAgIGNoYXIgICAgICAgKm5hbWU7ICAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICBQeU9iamVjdCAqKCpnZXRfYXR0cikodm9pZCk7ICAgICAgIC8qIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSAqLworICAgIGludCAgICAgICAoKnNldF9hdHRyKShQeU9iamVjdCAqKTsgLyogU2V0IHRoZSB2YWx1ZSAqLworICAgIHN0cnVjdCBzd2lnX2dsb2JhbHZhciAqbmV4dDsKKyAgfSBzd2lnX2dsb2JhbHZhcjsKKworICB0eXBlZGVmIHN0cnVjdCBzd2lnX3ZhcmxpbmtvYmplY3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyczsKKyAgfSBzd2lnX3ZhcmxpbmtvYmplY3Q7CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIHN3aWdfdmFybGlua19yZXByKHN3aWdfdmFybGlua29iamVjdCAqU1dJR1VOVVNFRFBBUk0odikpIHsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgcmV0dXJuIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCI8U3dpZyBnbG9iYWwgdmFyaWFibGVzPiIpOworI2Vsc2UKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPFN3aWcgZ2xvYmFsIHZhcmlhYmxlcz4iKTsKKyNlbmRpZgorICB9CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIHN3aWdfdmFybGlua19zdHIoc3dpZ192YXJsaW5rb2JqZWN0ICp2KSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIFB5T2JqZWN0ICpzdHIgPSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZygiKCIpOworICAgIFB5T2JqZWN0ICp0YWlsOworICAgIFB5T2JqZWN0ICpqb2luZWQ7CisgICAgc3dpZ19nbG9iYWx2YXIgKnZhcjsKKyAgICBmb3IgKHZhciA9IHYtPnZhcnM7IHZhcjsgdmFyPXZhci0+bmV4dCkgeworICAgICAgdGFpbCA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHZhci0+bmFtZSk7CisgICAgICBqb2luZWQgPSBQeVVuaWNvZGVfQ29uY2F0KHN0ciwgdGFpbCk7CisgICAgICBQeV9EZWNSZWYoc3RyKTsKKyAgICAgIFB5X0RlY1JlZih0YWlsKTsKKyAgICAgIHN0ciA9IGpvaW5lZDsKKyAgICAgIGlmICh2YXItPm5leHQpIHsKKyAgICAgICAgdGFpbCA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCIsICIpOworICAgICAgICBqb2luZWQgPSBQeVVuaWNvZGVfQ29uY2F0KHN0ciwgdGFpbCk7CisgICAgICAgIFB5X0RlY1JlZihzdHIpOworICAgICAgICBQeV9EZWNSZWYodGFpbCk7CisgICAgICAgIHN0ciA9IGpvaW5lZDsKKyAgICAgIH0KKyAgICB9CisgICAgdGFpbCA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCIpIik7CisgICAgam9pbmVkID0gUHlVbmljb2RlX0NvbmNhdChzdHIsIHRhaWwpOworICAgIFB5X0RlY1JlZihzdHIpOworICAgIFB5X0RlY1JlZih0YWlsKTsKKyAgICBzdHIgPSBqb2luZWQ7CisjZWxzZQorICAgIFB5T2JqZWN0ICpzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoIik7CisgICAgc3dpZ19nbG9iYWx2YXIgKnZhcjsKKyAgICBmb3IgKHZhciA9IHYtPnZhcnM7IHZhcjsgdmFyPXZhci0+bmV4dCkgeworICAgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzdHIsUHlTdHJpbmdfRnJvbVN0cmluZyh2YXItPm5hbWUpKTsKKyAgICAgIGlmICh2YXItPm5leHQpIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmc3RyLFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIikpOworICAgIH0KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnN0cixQeVN0cmluZ19Gcm9tU3RyaW5nKCIpIikpOworI2VuZGlmCisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIFNXSUdJTlRFUk4gaW50CisgIHN3aWdfdmFybGlua19wcmludChzd2lnX3ZhcmxpbmtvYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgU1dJR1VOVVNFRFBBUk0oZmxhZ3MpKSB7CisgICAgY2hhciAqdG1wOworICAgIFB5T2JqZWN0ICpzdHIgPSBzd2lnX3Zhcmxpbmtfc3RyKHYpOworICAgIGZwcmludGYoZnAsIlN3aWcgZ2xvYmFsIHZhcmlhYmxlcyAiKTsKKyAgICBmcHJpbnRmKGZwLCIlc1xuIiwgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihzdHIpKTsKKyAgICBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHRtcCk7CisgICAgUHlfREVDUkVGKHN0cik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBTV0lHSU5URVJOIHZvaWQKKyAgc3dpZ192YXJsaW5rX2RlYWxsb2Moc3dpZ192YXJsaW5rb2JqZWN0ICp2KSB7CisgICAgc3dpZ19nbG9iYWx2YXIgKnZhciA9IHYtPnZhcnM7CisgICAgd2hpbGUgKHZhcikgeworICAgICAgc3dpZ19nbG9iYWx2YXIgKm4gPSB2YXItPm5leHQ7CisgICAgICBmcmVlKHZhci0+bmFtZSk7CisgICAgICBmcmVlKHZhcik7CisgICAgICB2YXIgPSBuOworICAgIH0KKyAgfQorCisgIFNXSUdJTlRFUk4gUHlPYmplY3QgKgorICBzd2lnX3ZhcmxpbmtfZ2V0YXR0cihzd2lnX3ZhcmxpbmtvYmplY3QgKnYsIGNoYXIgKm4pIHsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyID0gdi0+dmFyczsKKyAgICB3aGlsZSAodmFyKSB7CisgICAgICBpZiAoc3RyY21wKHZhci0+bmFtZSxuKSA9PSAwKSB7CisgICAgICAgIHJlcyA9ICgqdmFyLT5nZXRfYXR0cikoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB2YXIgPSB2YXItPm5leHQ7CisgICAgfQorICAgIGlmIChyZXMgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05hbWVFcnJvciwiVW5rbm93biBDIGdsb2JhbCB2YXJpYWJsZSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgU1dJR0lOVEVSTiBpbnQKKyAgc3dpZ192YXJsaW5rX3NldGF0dHIoc3dpZ192YXJsaW5rb2JqZWN0ICp2LCBjaGFyICpuLCBQeU9iamVjdCAqcCkgeworICAgIGludCByZXMgPSAxOworICAgIHN3aWdfZ2xvYmFsdmFyICp2YXIgPSB2LT52YXJzOworICAgIHdoaWxlICh2YXIpIHsKKyAgICAgIGlmIChzdHJjbXAodmFyLT5uYW1lLG4pID09IDApIHsKKyAgICAgICAgcmVzID0gKCp2YXItPnNldF9hdHRyKShwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB2YXIgPSB2YXItPm5leHQ7CisgICAgfQorICAgIGlmIChyZXMgPT0gMSAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05hbWVFcnJvciwiVW5rbm93biBDIGdsb2JhbCB2YXJpYWJsZSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgU1dJR0lOVEVSTiBQeVR5cGVPYmplY3QqCisgIHN3aWdfdmFybGlua190eXBlKHZvaWQpIHsKKyAgICBzdGF0aWMgY2hhciB2YXJsaW5rX19kb2NfX1tdID0gIlN3aWcgdmFyIGxpbmsgb2JqZWN0IjsKKyAgICBzdGF0aWMgUHlUeXBlT2JqZWN0IHZhcmxpbmtfdHlwZTsKKyAgICBzdGF0aWMgaW50IHR5cGVfaW5pdCA9IDA7CisgICAgaWYgKCF0eXBlX2luaXQpIHsKKyAgICAgIGNvbnN0IFB5VHlwZU9iamVjdCB0bXAgPSB7CisgICAgICAgIC8qIFB5T2JqZWN0IGhlYWRlciBjaGFuZ2VkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyNlbHNlCisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisjZW5kaWYKKyAgICAgICAgKGNoYXIgKikic3dpZ3ZhcmxpbmsiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2Yoc3dpZ192YXJsaW5rb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpIHN3aWdfdmFybGlua19kZWFsbG9jLCAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAocHJpbnRmdW5jKSBzd2lnX3ZhcmxpbmtfcHJpbnQsICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAoZ2V0YXR0cmZ1bmMpIHN3aWdfdmFybGlua19nZXRhdHRyLCAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIChzZXRhdHRyZnVuYykgc3dpZ192YXJsaW5rX3NldGF0dHIsIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAocmVwcmZ1bmMpIHN3aWdfdmFybGlua19yZXByLCAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAocmVwcmZ1bmMpIHN3aWdfdmFybGlua19zdHIsICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIHZhcmxpbmtfX2RvY19fLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAKKyAgICAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiB0cF9pdGVyIC0+IHRwX3dlYWtsaXN0ICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uICovCisjZW5kaWYKKyNpZmRlZiBDT1VOVF9BTExPQ1MKKyAgICAgICAgMCwwLDAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgLT4gdHBfbmV4dCAqLworI2VuZGlmCisgICAgICB9OworICAgICAgdmFybGlua190eXBlID0gdG1wOworICAgICAgdHlwZV9pbml0ID0gMTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyAgICAgIHZhcmxpbmtfdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworI2Vsc2UKKyAgICAgIGlmIChQeVR5cGVfUmVhZHkoJnZhcmxpbmtfdHlwZSkgPCAwKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuICZ2YXJsaW5rX3R5cGU7CisgIH0KKworICAvKiBDcmVhdGUgYSB2YXJpYWJsZSBsaW5raW5nIG9iamVjdCBmb3IgdXNlIGxhdGVyICovCisgIFNXSUdJTlRFUk4gUHlPYmplY3QgKgorICBTV0lHX1B5dGhvbl9uZXd2YXJsaW5rKHZvaWQpIHsKKyAgICBzd2lnX3ZhcmxpbmtvYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X05FVyhzd2lnX3ZhcmxpbmtvYmplY3QsIHN3aWdfdmFybGlua190eXBlKCkpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgIHJlc3VsdC0+dmFycyA9IDA7CisgICAgfQorICAgIHJldHVybiAoKFB5T2JqZWN0KikgcmVzdWx0KTsKKyAgfQorCisgIFNXSUdJTlRFUk4gdm9pZAorICBTV0lHX1B5dGhvbl9hZGR2YXJsaW5rKFB5T2JqZWN0ICpwLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqKCpnZXRfYXR0cikodm9pZCksIGludCAoKnNldF9hdHRyKShQeU9iamVjdCAqcCkpIHsKKyAgICBzd2lnX3ZhcmxpbmtvYmplY3QgKnYgPSAoc3dpZ192YXJsaW5rb2JqZWN0ICopIHA7CisgICAgc3dpZ19nbG9iYWx2YXIgKmd2ID0gKHN3aWdfZ2xvYmFsdmFyICopIG1hbGxvYyhzaXplb2Yoc3dpZ19nbG9iYWx2YXIpKTsKKyAgICBpZiAoZ3YpIHsKKyAgICAgIHNpemVfdCBzaXplID0gc3RybGVuKG5hbWUpKzE7CisgICAgICBndi0+bmFtZSA9IChjaGFyICopbWFsbG9jKHNpemUpOworICAgICAgaWYgKGd2LT5uYW1lKSB7CisgICAgICAgIHN0cm5jcHkoZ3YtPm5hbWUsbmFtZSxzaXplKTsKKyAgICAgICAgZ3YtPmdldF9hdHRyID0gZ2V0X2F0dHI7CisgICAgICAgIGd2LT5zZXRfYXR0ciA9IHNldF9hdHRyOworICAgICAgICBndi0+bmV4dCA9IHYtPnZhcnM7CisgICAgICB9CisgICAgfQorICAgIHYtPnZhcnMgPSBndjsKKyAgfQorCisgIFNXSUdJTlRFUk4gUHlPYmplY3QgKgorICBTV0lHX2dsb2JhbHModm9pZCkgeworICAgIHN0YXRpYyBQeU9iamVjdCAqX1NXSUdfZ2xvYmFscyA9IDA7CisgICAgaWYgKCFfU1dJR19nbG9iYWxzKSBfU1dJR19nbG9iYWxzID0gU1dJR19uZXd2YXJsaW5rKCk7CisgICAgcmV0dXJuIF9TV0lHX2dsb2JhbHM7CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBjb25zdGFudHMvbWV0aG9kcyBtYW5pcHVsYXRpb24KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBJbnN0YWxsIENvbnN0YW50cyAqLworICBTV0lHSU5URVJOIHZvaWQKKyAgU1dJR19QeXRob25fSW5zdGFsbENvbnN0YW50cyhQeU9iamVjdCAqZCwgc3dpZ19jb25zdF9pbmZvIGNvbnN0YW50c1tdKSB7CisgICAgUHlPYmplY3QgKm9iaiA9IDA7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgY29uc3RhbnRzW2ldLnR5cGU7ICsraSkgeworICAgICAgc3dpdGNoKGNvbnN0YW50c1tpXS50eXBlKSB7CisgICAgICBjYXNlIFNXSUdfUFlfUE9JTlRFUjoKKyAgICAgICAgb2JqID0gU1dJR19JbnRlcm5hbE5ld1BvaW50ZXJPYmooY29uc3RhbnRzW2ldLnB2YWx1ZSwgKihjb25zdGFudHNbaV0pLnB0eXBlLDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1dJR19QWV9CSU5BUlk6CisgICAgICAgIG9iaiA9IFNXSUdfTmV3UGFja2VkT2JqKGNvbnN0YW50c1tpXS5wdmFsdWUsIGNvbnN0YW50c1tpXS5sdmFsdWUsICooY29uc3RhbnRzW2ldLnB0eXBlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgb2JqID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIGNvbnN0YW50c1tpXS5uYW1lLCBvYmopOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIEZpeCBTd2lnTWV0aG9kcyB0byBjYXJyeSB0aGUgY2FsbGJhY2sgcHRycyB3aGVuIG5lZWRlZCAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgU1dJR0lOVEVSTiB2b2lkCisgIFNXSUdfUHl0aG9uX0ZpeE1ldGhvZHMoUHlNZXRob2REZWYgKm1ldGhvZHMsCisgICAgc3dpZ19jb25zdF9pbmZvICpjb25zdF90YWJsZSwKKyAgICBzd2lnX3R5cGVfaW5mbyAqKnR5cGVzLAorICAgIHN3aWdfdHlwZV9pbmZvICoqdHlwZXNfaW5pdGlhbCkgeworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IG1ldGhvZHNbaV0ubWxfbmFtZTsgKytpKSB7CisgICAgICBjb25zdCBjaGFyICpjID0gbWV0aG9kc1tpXS5tbF9kb2M7CisgICAgICBpZiAoYyAmJiAoYyA9IHN0cnN0cihjLCAic3dpZ19wdHI6ICIpKSkgeworICAgICAgICBpbnQgajsKKyAgICAgICAgc3dpZ19jb25zdF9pbmZvICpjaSA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBjICsgMTA7CisgICAgICAgIGZvciAoaiA9IDA7IGNvbnN0X3RhYmxlW2pdLnR5cGU7ICsraikgeworICAgICAgICAgIGlmIChzdHJuY21wKGNvbnN0X3RhYmxlW2pdLm5hbWUsIG5hbWUsCisgICAgICAgICAgICAgIHN0cmxlbihjb25zdF90YWJsZVtqXS5uYW1lKSkgPT0gMCkgeworICAgICAgICAgICAgY2kgPSAmKGNvbnN0X3RhYmxlW2pdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2kpIHsKKyAgICAgICAgICB2b2lkICpwdHIgPSAoY2ktPnR5cGUgPT0gU1dJR19QWV9QT0lOVEVSKSA/IGNpLT5wdmFsdWUgOiAwOworICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBzaGlmdCA9IChjaS0+cHR5cGUpIC0gdHlwZXM7CisgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSB0eXBlc19pbml0aWFsW3NoaWZ0XTsKKyAgICAgICAgICAgIHNpemVfdCBsZG9jID0gKGMgLSBtZXRob2RzW2ldLm1sX2RvYyk7CisgICAgICAgICAgICBzaXplX3QgbHB0ciA9IHN0cmxlbih0eS0+bmFtZSkrMipzaXplb2Yodm9pZCopKzI7CisgICAgICAgICAgICBjaGFyICpuZG9jID0gKGNoYXIqKW1hbGxvYyhsZG9jICsgbHB0ciArIDEwKTsKKyAgICAgICAgICAgIGlmIChuZG9jKSB7CisgICAgICAgICAgICAgIGNoYXIgKmJ1ZmYgPSBuZG9jOworICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZmYsIG1ldGhvZHNbaV0ubWxfZG9jLCBsZG9jKTsKKyAgICAgICAgICAgICAgYnVmZiArPSBsZG9jOworICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZmYsICJzd2lnX3B0cjogIiwgMTApOworICAgICAgICAgICAgICBidWZmICs9IDEwOworICAgICAgICAgICAgICBTV0lHX1BhY2tWb2lkUHRyKGJ1ZmYsIHB0ciwgdHktPm5hbWUsIGxwdHIpOworICAgICAgICAgICAgICBtZXRob2RzW2ldLm1sX2RvYyA9IG5kb2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogIFBhcnRpYWwgSW5pdCBtZXRob2QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKworU1dJR0VYUE9SVAorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKK1B5T2JqZWN0KgorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorU1dJR19pbml0KHZvaWQpIHsKKyAgUHlPYmplY3QgKm0sICpkLCAqbWQ7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICBzdGF0aWMgc3RydWN0IFB5TW9kdWxlRGVmIFNXSUdfbW9kdWxlID0geworIyBpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDIwMDAwCisgICAgUHlNb2R1bGVEZWZfSEVBRF9JTklULAorIyBlbHNlCisgICAgeworICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICBOVUxMLCAvKiBtX2luaXQgKi8KKyAgICAgIDAsICAgIC8qIG1faW5kZXggKi8KKyAgICAgIE5VTEwsIC8qIG1fY29weSAqLworICAgIH0sCisjIGVuZGlmCisgICAgKGNoYXIgKikgU1dJR19uYW1lLAorICAgIE5VTEwsCisgICAgLTEsCisgICAgU3dpZ01ldGhvZHMsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTAorICB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNXSUdQWVRIT05fQlVJTFRJTikKKyAgc3RhdGljIFN3aWdQeUNsaWVudERhdGEgU3dpZ1B5T2JqZWN0X2NsaWVudGRhdGEgPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMAorICB9OworICBzdGF0aWMgUHlHZXRTZXREZWYgdGhpc19nZXRzZXRfZGVmID0geworICAgIChjaGFyICopInRoaXMiLCAmU3dpZ1B5QnVpbHRpbl9UaGlzQ2xvc3VyZSwgTlVMTCwgTlVMTCwgTlVMTAorICB9OworICBzdGF0aWMgU3dpZ1B5R2V0U2V0IHRoaXNvd25fZ2V0c2V0X2Nsb3N1cmUgPSB7CisgICAgKFB5Q0Z1bmN0aW9uKSBTd2lnUHlPYmplY3Rfb3duLAorICAgIChQeUNGdW5jdGlvbikgU3dpZ1B5T2JqZWN0X293bgorICB9OworICBzdGF0aWMgUHlHZXRTZXREZWYgdGhpc293bl9nZXRzZXRfZGVmID0geworICAgIChjaGFyICopInRoaXNvd24iLCBTd2lnUHlCdWlsdGluX0dldHRlckNsb3N1cmUsIFN3aWdQeUJ1aWx0aW5fU2V0dGVyQ2xvc3VyZSwgTlVMTCwgJnRoaXNvd25fZ2V0c2V0X2Nsb3N1cmUKKyAgfTsKKyAgUHlPYmplY3QgKm1ldGF0eXBlX2FyZ3M7CisgIFB5VHlwZU9iamVjdCAqYnVpbHRpbl9weXR5cGU7CisgIGludCBidWlsdGluX2Jhc2VfY291bnQ7CisgIHN3aWdfdHlwZV9pbmZvICpidWlsdGluX2Jhc2V0eXBlOworICBQeU9iamVjdCAqdHVwbGU7CisgIFB5R2V0U2V0RGVzY3JPYmplY3QgKnN0YXRpY19nZXRzZXQ7CisgIFB5VHlwZU9iamVjdCAqbWV0YXR5cGU7CisgIFN3aWdQeUNsaWVudERhdGEgKmNkOworICBQeU9iamVjdCAqcHVibGljX2ludGVyZmFjZSwgKnB1YmxpY19zeW1ib2w7CisgIFB5T2JqZWN0ICp0aGlzX2Rlc2NyOworICBQeU9iamVjdCAqdGhpc293bl9kZXNjcjsKKyAgaW50IGk7CisKKyAgKHZvaWQpYnVpbHRpbl9weXR5cGU7CisgICh2b2lkKWJ1aWx0aW5fYmFzZV9jb3VudDsKKyAgKHZvaWQpYnVpbHRpbl9iYXNldHlwZTsKKyAgKHZvaWQpdHVwbGU7CisgICh2b2lkKXN0YXRpY19nZXRzZXQ7CisKKyAgLyogbWV0YXR5cGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuICovCisgIG1ldGF0eXBlX2FyZ3MgPSBQeV9CdWlsZFZhbHVlKCIocyhPKXt9KSIsICJTd2lnUHlPYmplY3RUeXBlIiwgJlB5VHlwZV9UeXBlKTsKKyAgYXNzZXJ0KG1ldGF0eXBlX2FyZ3MpOworICBtZXRhdHlwZSA9IChQeVR5cGVPYmplY3QgKikgUHlUeXBlX1R5cGUudHBfY2FsbCgoUHlPYmplY3QgKikgJlB5VHlwZV9UeXBlLCBtZXRhdHlwZV9hcmdzLCBOVUxMKTsKKyAgYXNzZXJ0KG1ldGF0eXBlKTsKKyAgUHlfREVDUkVGKG1ldGF0eXBlX2FyZ3MpOworICBtZXRhdHlwZS0+dHBfc2V0YXR0cm8gPSAoc2V0YXR0cm9mdW5jKSAmU3dpZ1B5T2JqZWN0VHlwZV9zZXRhdHRybzsKKyAgYXNzZXJ0KFB5VHlwZV9SZWFkeShtZXRhdHlwZSkgPj0gMCk7CisjZW5kaWYKKworICAvKiBGaXggU3dpZ01ldGhvZHMgdG8gY2FycnkgdGhlIGNhbGxiYWNrIHB0cnMgd2hlbiBuZWVkZWQgKi8KKyAgU1dJR19QeXRob25fRml4TWV0aG9kcyhTd2lnTWV0aG9kcywgc3dpZ19jb25zdF90YWJsZSwgc3dpZ190eXBlcywgc3dpZ190eXBlX2luaXRpYWwpOworCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICBtID0gUHlNb2R1bGVfQ3JlYXRlKCZTV0lHX21vZHVsZSk7CisjZWxzZQorICBtID0gUHlfSW5pdE1vZHVsZSgoY2hhciAqKSBTV0lHX25hbWUsIFN3aWdNZXRob2RzKTsKKyNlbmRpZgorICBtZCA9IGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworCisgIFNXSUdfSW5pdGlhbGl6ZU1vZHVsZSgwKTsKKworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorICBTd2lnUHlPYmplY3Rfc3R5cGUgPSBTV0lHX01hbmdsZWRUeXBlUXVlcnkoIl9wX1N3aWdQeU9iamVjdCIpOworICBhc3NlcnQoU3dpZ1B5T2JqZWN0X3N0eXBlKTsKKyAgY2QgPSAoU3dpZ1B5Q2xpZW50RGF0YSopIFN3aWdQeU9iamVjdF9zdHlwZS0+Y2xpZW50ZGF0YTsKKyAgaWYgKCFjZCkgeworICAgIFN3aWdQeU9iamVjdF9zdHlwZS0+Y2xpZW50ZGF0YSA9ICZTd2lnUHlPYmplY3RfY2xpZW50ZGF0YTsKKyAgICBTd2lnUHlPYmplY3RfY2xpZW50ZGF0YS5weXR5cGUgPSBTd2lnUHlPYmplY3RfVHlwZU9uY2UoKTsKKyAgfSBlbHNlIGlmIChTd2lnUHlPYmplY3RfVHlwZU9uY2UoKS0+dHBfYmFzaWNzaXplICE9IGNkLT5weXR5cGUtPnRwX2Jhc2ljc2l6ZSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJJbXBvcnQgZXJyb3I6IGF0dGVtcHRlZCB0byBsb2FkIHR3byBpbmNvbXBhdGlibGUgc3dpZy1nZW5lcmF0ZWQgbW9kdWxlcy4iKTsKKyMgaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIHJldHVybiBOVUxMOworIyBlbHNlCisgICAgcmV0dXJuOworIyBlbmRpZgorICB9CisKKyAgLyogQWxsIG9iamVjdHMgaGF2ZSBhICd0aGlzJyBhdHRyaWJ1dGUgKi8KKyAgdGhpc19kZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KFN3aWdQeU9iamVjdF90eXBlKCksICZ0aGlzX2dldHNldF9kZWYpOworICAodm9pZCl0aGlzX2Rlc2NyOworCisgIC8qIEFsbCBvYmplY3RzIGhhdmUgYSAndGhpc293bicgYXR0cmlidXRlICovCisgIHRoaXNvd25fZGVzY3IgPSBQeURlc2NyX05ld0dldFNldChTd2lnUHlPYmplY3RfdHlwZSgpLCAmdGhpc293bl9nZXRzZXRfZGVmKTsKKyAgKHZvaWQpdGhpc293bl9kZXNjcjsKKworICBwdWJsaWNfaW50ZXJmYWNlID0gUHlMaXN0X05ldygwKTsKKyAgcHVibGljX3N5bWJvbCA9IDA7CisgICh2b2lkKXB1YmxpY19zeW1ib2w7CisKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcobWQsICJfX2FsbF9fIiwgcHVibGljX2ludGVyZmFjZSk7CisgIFB5X0RFQ1JFRihwdWJsaWNfaW50ZXJmYWNlKTsKKyAgZm9yIChpID0gMDsgU3dpZ01ldGhvZHNbaV0ubWxfbmFtZSAhPSBOVUxMOyArK2kpCisgIFN3aWdQeUJ1aWx0aW5fQWRkUHVibGljU3ltYm9sKHB1YmxpY19pbnRlcmZhY2UsIFN3aWdNZXRob2RzW2ldLm1sX25hbWUpOworICBmb3IgKGkgPSAwOyBzd2lnX2NvbnN0X3RhYmxlW2ldLm5hbWUgIT0gMDsgKytpKQorICBTd2lnUHlCdWlsdGluX0FkZFB1YmxpY1N5bWJvbChwdWJsaWNfaW50ZXJmYWNlLCBzd2lnX2NvbnN0X3RhYmxlW2ldLm5hbWUpOworI2VuZGlmCisKKyAgU1dJR19JbnN0YWxsQ29uc3RhbnRzKGQsc3dpZ19jb25zdF90YWJsZSk7CisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIHJldHVybiBtOworI2Vsc2UKKyAgcmV0dXJuOworI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvc2V0dXAucHkgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2JmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL3NldHVwLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiImRpc3R1dGlscyBzY3JpcHQgZm9yIGxpYndlYnAgcHl0aG9uIG1vZHVsZS4iIiIKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQorCit0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKK3BhY2thZ2UgPSAiY29tLmdvb2dsZS53ZWJwIgorcGFja2FnZV9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgKnBhY2thZ2Uuc3BsaXQoIi4iKSkKK29zLm1ha2VkaXJzKHBhY2thZ2VfcGF0aCkKKworIyBDcmVhdGUgX19pbml0Xy5weSBmaWxlcyBhbG9uZyB0aGUgcGFja2FnZSBwYXRoLgoraW5pdHB5X3BhdGggPSB0bXBkaXIKK2ZvciBkIGluIHBhY2thZ2Uuc3BsaXQoIi4iKToKKyAgaW5pdHB5X3BhdGggPSBvcy5wYXRoLmpvaW4oaW5pdHB5X3BhdGgsIGQpCisgIG9wZW4ob3MucGF0aC5qb2luKGluaXRweV9wYXRoLCAiX19pbml0X18ucHkiKSwgInciKS5jbG9zZSgpCisKK3NodXRpbC5jb3B5MigibGlid2VicC5weSIsIHBhY2thZ2VfcGF0aCkKK3NldHVwKG5hbWU9ImxpYndlYnAiLAorICAgICAgdmVyc2lvbj0iMC4wIiwKKyAgICAgIGRlc2NyaXB0aW9uPSJsaWJ3ZWJwIHB5dGhvbiB3cmFwcGVyIiwKKyAgICAgIGxvbmdfZGVzY3JpcHRpb249IlByb3ZpZGVzIGFjY2VzcyB0byAnc2ltcGxlJyBsaWJ3ZWJwIGRlY29kZSBpbnRlcmZhY2UiLAorICAgICAgbGljZW5zZT0iQlNEIiwKKyAgICAgIHVybD0iaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwIiwKKyAgICAgIGV4dF9wYWNrYWdlPXBhY2thZ2UsCisgICAgICBleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCJfbGlid2VicCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsibGlid2VicF9weXRob25fd3JhcC5jIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1bIndlYnAiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgIHBhY2thZ2VfZGlyPXsiIjogdG1wZGlyfSwKKyAgICAgIHBhY2thZ2VzPVsiY29tIiwgImNvbS5nb29nbGUiLCAiY29tLmdvb2dsZS53ZWJwIl0sCisgICAgICBweV9tb2R1bGVzPVtwYWNrYWdlICsgIi5saWJ3ZWJwIl0sCisgICAgICkKKworc2h1dGlsLnJtdHJlZSh0bXBkaXIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmRlZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBCb29sZWFuIGRlY29kZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi9iaXRfcmVhZGVyLmgiCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLSNkZWZpbmUgTUsoWCkgKCgocmFuZ2VfdCkoWCkgPDwgKEJJVFMpKSB8IChNQVNLKSkKLSNlbHNlCi0jZGVmaW5lIE1LKFgpICgocmFuZ2VfdCkoWCkpCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOEJpdFJlYWRlcgotCi12b2lkIFZQOEluaXRCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwgY29uc3QgdWludDhfdCogY29uc3QgZW5kKSB7Ci0gIFNCX0RDSEVDSyhiciAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKHN0YXJ0ICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3RhcnQgPD0gZW5kKTsKLSAgYnItPnJhbmdlXyAgID0gTUsoMjU1IC0gMSk7Ci0gIGJyLT5idWZfICAgICA9IHN0YXJ0OwotICBici0+YnVmX2VuZF8gPSBlbmQ7Ci0gIGJyLT52YWx1ZV8gICA9IDA7Ci0gIGJyLT5iaXRzXyAgICA9IC04OyAgIC8vIHRvIGxvYWQgdGhlIHZlcnkgZmlyc3QgOGJpdHMKLSAgYnItPmVvZl8gICAgID0gMDsKLX0KLQotY29uc3QgdWludDhfdCBrVlA4TG9nMlJhbmdlWzEyOF0gPSB7Ci0gICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDAKLX07Ci0KLS8vIHJhbmdlID0gKHJhbmdlIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSArIHRyYWlsaW5nIDEncwotY29uc3QgcmFuZ2VfdCBrVlA4TmV3UmFuZ2VbMTI4XSA9IHsKLSAgTUsoMTI3KSwgTUsoMTI3KSwgTUsoMTkxKSwgTUsoMTI3KSwgTUsoMTU5KSwgTUsoMTkxKSwgTUsoMjIzKSwgTUsoMTI3KSwKLSAgTUsoMTQzKSwgTUsoMTU5KSwgTUsoMTc1KSwgTUsoMTkxKSwgTUsoMjA3KSwgTUsoMjIzKSwgTUsoMjM5KSwgTUsoMTI3KSwKLSAgTUsoMTM1KSwgTUsoMTQzKSwgTUsoMTUxKSwgTUsoMTU5KSwgTUsoMTY3KSwgTUsoMTc1KSwgTUsoMTgzKSwgTUsoMTkxKSwKLSAgTUsoMTk5KSwgTUsoMjA3KSwgTUsoMjE1KSwgTUsoMjIzKSwgTUsoMjMxKSwgTUsoMjM5KSwgTUsoMjQ3KSwgTUsoMTI3KSwKLSAgTUsoMTMxKSwgTUsoMTM1KSwgTUsoMTM5KSwgTUsoMTQzKSwgTUsoMTQ3KSwgTUsoMTUxKSwgTUsoMTU1KSwgTUsoMTU5KSwKLSAgTUsoMTYzKSwgTUsoMTY3KSwgTUsoMTcxKSwgTUsoMTc1KSwgTUsoMTc5KSwgTUsoMTgzKSwgTUsoMTg3KSwgTUsoMTkxKSwKLSAgTUsoMTk1KSwgTUsoMTk5KSwgTUsoMjAzKSwgTUsoMjA3KSwgTUsoMjExKSwgTUsoMjE1KSwgTUsoMjE5KSwgTUsoMjIzKSwKLSAgTUsoMjI3KSwgTUsoMjMxKSwgTUsoMjM1KSwgTUsoMjM5KSwgTUsoMjQzKSwgTUsoMjQ3KSwgTUsoMjUxKSwgTUsoMTI3KSwKLSAgTUsoMTI5KSwgTUsoMTMxKSwgTUsoMTMzKSwgTUsoMTM1KSwgTUsoMTM3KSwgTUsoMTM5KSwgTUsoMTQxKSwgTUsoMTQzKSwKLSAgTUsoMTQ1KSwgTUsoMTQ3KSwgTUsoMTQ5KSwgTUsoMTUxKSwgTUsoMTUzKSwgTUsoMTU1KSwgTUsoMTU3KSwgTUsoMTU5KSwKLSAgTUsoMTYxKSwgTUsoMTYzKSwgTUsoMTY1KSwgTUsoMTY3KSwgTUsoMTY5KSwgTUsoMTcxKSwgTUsoMTczKSwgTUsoMTc1KSwKLSAgTUsoMTc3KSwgTUsoMTc5KSwgTUsoMTgxKSwgTUsoMTgzKSwgTUsoMTg1KSwgTUsoMTg3KSwgTUsoMTg5KSwgTUsoMTkxKSwKLSAgTUsoMTkzKSwgTUsoMTk1KSwgTUsoMTk3KSwgTUsoMTk5KSwgTUsoMjAxKSwgTUsoMjAzKSwgTUsoMjA1KSwgTUsoMjA3KSwKLSAgTUsoMjA5KSwgTUsoMjExKSwgTUsoMjEzKSwgTUsoMjE1KSwgTUsoMjE3KSwgTUsoMjE5KSwgTUsoMjIxKSwgTUsoMjIzKSwKLSAgTUsoMjI1KSwgTUsoMjI3KSwgTUsoMjI5KSwgTUsoMjMxKSwgTUsoMjMzKSwgTUsoMjM1KSwgTUsoMjM3KSwgTUsoMjM5KSwKLSAgTUsoMjQxKSwgTUsoMjQzKSwgTUsoMjQ1KSwgTUsoMjQ3KSwgTUsoMjQ5KSwgTUsoMjUxKSwgTUsoMjUzKSwgTUsoMTI3KQotfTsKLQotI3VuZGVmIE1LCi0KLXZvaWQgVlA4TG9hZEZpbmFsQnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKLSAgLy8gT25seSByZWFkIDhiaXRzIGF0IGEgdGltZQotICBpZiAoYnItPmJ1Zl8gPCBici0+YnVmX2VuZF8pIHsKLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLSAgICBici0+dmFsdWVfIHw9IChiaXRfdCkoKmJyLT5idWZfKyspIDw8ICgoQklUUykgLSA4IC0gYnItPmJpdHNfKTsKLSNlbHNlCi0gICAgYnItPnZhbHVlXyA9IChiaXRfdCkoKmJyLT5idWZfKyspIHwgKGJyLT52YWx1ZV8gPDwgOCk7Ci0jZW5kaWYKLSAgICBici0+Yml0c18gKz0gODsKLSAgfSBlbHNlIGlmICghYnItPmVvZl8pIHsKLSNpZmRlZiBVU0VfUklHSFRfSlVTVElGWQotICAgIC8vIFRoZXNlIGFyZSBub3Qgc3RyaWN0bHkgbmVlZGVkLCBidXQgaXQgbWFrZXMgdGhlIGJlaGF2aW91cgotICAgIC8vIGNvbnNpc3RlbnQgZm9yIGJvdGggVVNFX1JJR0hUX0pVU1RJRlkgYW5kICFVU0VfUklHSFRfSlVTVElGWS4KLSAgICBici0+dmFsdWVfIDw8PSA4OwotICAgIGJyLT5iaXRzXyArPSA4OwotI2VuZGlmCi0gICAgYnItPmVvZl8gPSAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIaWdoZXItbGV2ZWwgY2FsbHMKLQotdWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKLSAgdWludDMyX3QgdiA9IDA7Ci0gIHdoaWxlIChiaXRzLS0gPiAwKSB7Ci0gICAgdiB8PSBWUDhHZXRCaXQoYnIsIDB4ODApIDw8IGJpdHM7Ci0gIH0KLSAgcmV0dXJuIHY7Ci19Ci0KLWludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKLSAgY29uc3QgaW50IHZhbHVlID0gVlA4R2V0VmFsdWUoYnIsIGJpdHMpOwotICByZXR1cm4gVlA4R2V0KGJyKSA/IC12YWx1ZSA6IHZhbHVlOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TEJpdFJlYWRlcgotCi0jZGVmaW5lIE1BWF9OVU1fQklUX1JFQUQgMjUKLQotI2RlZmluZSBMQklUUyA2NCAgICAgIC8vIE51bWJlciBvZiBiaXRzIHByZWZldGNoZWQuCi0jZGVmaW5lIFdCSVRTIDMyICAgICAgLy8gTWluaW11bSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGFmdGVyIFZQOExGaWxsQml0V2luZG93LgotI2RlZmluZSBMT0c4X1dCSVRTIDQgIC8vIE51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgV0JJVFMgYml0cy4KLQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtCaXRNYXNrW01BWF9OVU1fQklUX1JFQURdID0gewotICAwLCAxLCAzLCA3LCAxNSwgMzEsIDYzLCAxMjcsIDI1NSwgNTExLCAxMDIzLCAyMDQ3LCA0MDk1LCA4MTkxLCAxNjM4MywgMzI3NjcsCi0gIDY1NTM1LCAxMzEwNzEsIDI2MjE0MywgNTI0Mjg3LCAxMDQ4NTc1LCAyMDk3MTUxLCA0MTk0MzAzLCA4Mzg4NjA3LCAxNjc3NzIxNQotfTsKLQotdm9pZCBWUDhMSW5pdEJpdFJlYWRlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgc2l6ZV90IGk7Ci0gIFNCX0RDSEVDSyhiciAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKHN0YXJ0ICE9IE5VTEwpOwotICBTQl9EQ0hFQ0sobGVuZ3RoIDwgMHhmZmZmZmZmOHUpOyAgIC8vIGNhbid0IGhhcHBlbiB3aXRoIGEgUklGRiBjaHVuay4KLQotICBici0+YnVmXyA9IHN0YXJ0OwotICBici0+bGVuXyA9IGxlbmd0aDsKLSAgYnItPnZhbF8gPSAwOwotICBici0+cG9zXyA9IDA7Ci0gIGJyLT5iaXRfcG9zXyA9IDA7Ci0gIGJyLT5lb3NfID0gMDsKLSAgYnItPmVycm9yXyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnItPnZhbF8pICYmIGkgPCBici0+bGVuXzsgKytpKSB7Ci0gICAgYnItPnZhbF8gfD0gKCh2cDhsX3ZhbF90KWJyLT5idWZfW2JyLT5wb3NfXSkgPDwgKDggKiBpKTsKLSAgICArK2JyLT5wb3NfOwotICB9Ci19Ci0KLXZvaWQgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYsIHNpemVfdCBsZW4pIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soYnVmICE9IE5VTEwpOwotICBTQl9EQ0hFQ0sobGVuIDwgMHhmZmZmZmZmOHUpOyAgIC8vIGNhbid0IGhhcHBlbiB3aXRoIGEgUklGRiBjaHVuay4KLSAgYnItPmVvc18gPSAoYnItPnBvc18gPj0gbGVuKTsKLSAgYnItPmJ1Zl8gPSBidWY7Ci0gIGJyLT5sZW5fID0gbGVuOwotfQotCi0vLyBJZiBub3QgYXQgRU9TLCByZWxvYWQgdXAgdG8gTEJJVFMgYnl0ZS1ieS1ieXRlCi1zdGF0aWMgdm9pZCBTaGlmdEJ5dGVzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIHdoaWxlIChici0+Yml0X3Bvc18gPj0gOCAmJiBici0+cG9zXyA8IGJyLT5sZW5fKSB7Ci0gICAgYnItPnZhbF8gPj49IDg7Ci0gICAgYnItPnZhbF8gfD0gKCh2cDhsX3ZhbF90KWJyLT5idWZfW2JyLT5wb3NfXSkgPDwgKExCSVRTIC0gOCk7Ci0gICAgKytici0+cG9zXzsKLSAgICBici0+Yml0X3Bvc18gLT0gODsKLSAgfQotfQotCi12b2lkIFZQOExGaWxsQml0V2luZG93KFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIGlmIChici0+Yml0X3Bvc18gPj0gV0JJVFMpIHsKLSNpZiAoZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX1g2NCkpCi0gICAgaWYgKGJyLT5wb3NfICsgc2l6ZW9mKGJyLT52YWxfKSA8IGJyLT5sZW5fKSB7Ci0gICAgICBici0+dmFsXyA+Pj0gV0JJVFM7Ci0gICAgICBici0+Yml0X3Bvc18gLT0gV0JJVFM7Ci0gICAgICAvLyBUaGUgZXhwcmVzc2lvbiBiZWxvdyBuZWVkcyBhIGxpdHRsZS1lbmRpYW4gYXJjaCB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAgIC8vIFRoaXMgZ2l2ZXMgYSBsYXJnZSBzcGVlZHVwIGZvciBkZWNvZGluZyBzcGVlZC4KLSAgICAgIGJyLT52YWxfIHw9ICooY29uc3QgdnA4bF92YWxfdCopKGJyLT5idWZfICsgYnItPnBvc18pIDw8IChMQklUUyAtIFdCSVRTKTsKLSAgICAgIGJyLT5wb3NfICs9IExPRzhfV0JJVFM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgU2hpZnRCeXRlcyhicik7ICAgICAgIC8vIFNsb3cgcGF0aC4KLSAgICBpZiAoYnItPnBvc18gPT0gYnItPmxlbl8gJiYgYnItPmJpdF9wb3NfID09IExCSVRTKSB7Ci0gICAgICBici0+ZW9zXyA9IDE7Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQzMl90IFZQOExSZWFkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG5fYml0cykgewotICBTQl9EQ0hFQ0sobl9iaXRzID49IDApOwotICAvLyBGbGFnIGFuIGVycm9yIGlmIGVuZF9vZl9zdHJlYW0gb3Igbl9iaXRzIGlzIG1vcmUgdGhhbiBhbGxvd2VkIGxpbWl0LgotICBpZiAoIWJyLT5lb3NfICYmIG5fYml0cyA8IE1BWF9OVU1fQklUX1JFQUQpIHsKLSAgICBjb25zdCB1aW50MzJfdCB2YWwgPQotICAgICAgICAodWludDMyX3QpKGJyLT52YWxfID4+IGJyLT5iaXRfcG9zXykgJiBrQml0TWFza1tuX2JpdHNdOwotICAgIGNvbnN0IGludCBuZXdfYml0cyA9IGJyLT5iaXRfcG9zXyArIG5fYml0czsKLSAgICBici0+Yml0X3Bvc18gPSBuZXdfYml0czsKLSAgICAvLyBJZiB0aGlzIHJlYWQgaXMgZ29pbmcgdG8gY3Jvc3MgdGhlIHJlYWQgYnVmZmVyLCBzZXQgdGhlIGVvcyBmbGFnLgotICAgIGlmIChici0+cG9zXyA9PSBici0+bGVuXykgewotICAgICAgaWYgKG5ld19iaXRzID49IExCSVRTKSB7Ci0gICAgICAgIGJyLT5lb3NfID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2hpZnRCeXRlcyhicik7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfSBlbHNlIHsKLSAgICBici0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2OGI1Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJvb2xlYW4gZGVjb2RlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0vLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfQklUX1JFQURFUl9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9ieXRlX3N3YXAuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gX2J5dGVzd2FwX3Vsb25nCi0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBtZW1jcHkKLSNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gVGhlIEJvb2xlYW4gZGVjb2RlciBuZWVkcyB0byBtYWludGFpbiBpbmZpbml0ZSBwcmVjaXNpb24gb24gdGhlIHZhbHVlXyBmaWVsZC4KLS8vIEhvd2V2ZXIsIHNpbmNlIHJhbmdlXyBpcyBvbmx5IDhiaXQsIHdlIG9ubHkgbmVlZCBhbiBhY3RpdmUgd2luZG93IG9mIDggYml0cwotLy8gZm9yIHZhbHVlXy4gTGVmdCBiaXRzIChNU0IpIGdldHMgemVyb2VkIGFuZCBzaGlmdGVkIGF3YXkgd2hlbiB2YWx1ZV8gZmFsbHMKLS8vIGJlbG93IDEyOCwgcmFuZ2VfIGlzIHVwZGF0ZWQsIGFuZCBmcmVzaCBiaXRzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIGFyZQotLy8gYnJvdWdodCBpbiBhcyBMU0IuCi0vLyBUbyBhdm9pZCByZWFkaW5nIHRoZSBmcmVzaCBiaXRzIG9uZSBieSBvbmUgKHNsb3cpLCB3ZSBjYWNoZSBhIGZldyBvZiB0aGVtCi0vLyBhaGVhZCAoYWN0dWFsbHksIHdlIGNhY2hlIEJJVFMgb2YgdGhlbSBhaGVhZC4gU2VlIGJlbG93KS4gVGhlcmUncyB0d28KLS8vIHN0cmF0ZWdpZXMgcmVnYXJkaW5nIGhvdyB0byBzaGlmdCB0aGVzZSBsb29rZWQtYWhlYWQgZnJlc2ggYml0cyBpbnRvIHRoZQotLy8gOGJpdCB3aW5kb3cgb2YgdmFsdWVfOiBlaXRoZXIgd2Ugc2hpZnQgdGhlbSBpbiwgd2hpbGUga2VlcGluZyB0aGUgcG9zaXRpb24gb2YKLS8vIHRoZSB3aW5kb3cgZml4ZWQuIE9yIHdlIHNsaWRlIHRoZSB3aW5kb3cgdG8gdGhlIHJpZ2h0IHdoaWxlIGtlZXBpbmcgdGhlIGNhY2hlCi0vLyBiaXRzIGF0IGEgZml4ZWQsIHJpZ2h0LWp1c3RpZmllZCwgcG9zaXRpb24uCi0vLwotLy8gIEV4YW1wbGUsIGZvciBCSVRTPTE2OiBoZXJlIGlzIHRoZSBjb250ZW50IG9mIHZhbHVlXyBmb3IgYm90aCBzdHJhdGVnaWVzOgotLy8KLS8vICAgICAgICAgICFVU0VfUklHSFRfSlVTVElGWSAgICAgICAgICAgIHx8ICAgICAgICBVU0VfUklHSFRfSlVTVElGWQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLS8vICAgPC0gOGIgLT48LSA4YiAtPjwtIEJJVFMgYml0cyAgLT4gICAgIHx8ICA8LSA4YiszYiAtPjwtIDhiIC0+PC0gMTMgYml0cyAtPgotLy8gICBbdW51c2VkXVt2YWx1ZV9dW2NhY2hlZCBiaXRzXVswXSAgICAgfHwgIFt1bnVzZWQuLi5dW3ZhbHVlX11bY2FjaGVkIGJpdHNdCi0vLyAgWy4uLi4uLi4uMDB2dnZ2dnZCQkJCQkJCQkJCQkJCMDAwXUxTQiB8fCBbLi4uLi4uLi4uLi4wMHZ2dnZ2dkJCQkJCQkJCQkJCQkJdCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotLy8gQWZ0ZXIgY2FsbGluZyBWUDhTaGlmdCgpLCB3aGVyZSB3ZSBuZWVkIHRvIHNoaWZ0IGF3YXkgdHdvIHplcm9zOgotLy8gIFsuLi4uLi4uLnZ2dnZ2dnZ2QkJCQkJCQkJCQkIwMDAwMF1MU0IgfHwgWy4uLi4uLi4uLi4uLi52dnZ2dnZ2dkJCQkJCQkJCQkJCXQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLS8vIEp1c3QgYmVmb3JlIHdlIG5lZWQgdG8gY2FsbCBWUDhMb2FkTmV3Qnl0ZXMoKSwgdGhlIHNpdHVhdGlvbiBpczoKLS8vICBbLi4uLi4uLi52dnZ2dnYwMDAwMDAwMDAwMDAwMDAwMDBdTFNCIHx8IFsuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnZ2dnZ2dl0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0vLyBBbmQganVzdCBhZnRlciBjYWxsaW5nIFZQOExvYWROZXdCeXRlcygpOgotLy8gIFsuLi4uLi4uLnZ2dnZ2dnZ2QkJCQkJCQkJCQkJCQkJCQl1MU0IgfHwgWy4uLi4uLi4udnZ2dnZ2dnZCQkJCQkJCQkJCQkJCQkJCXQotLy8KLS8vIC0+IHdlJ3JlIGJhY2sgdG8gaGVpZ2h0IGFjdGl2ZSAndmFsdWVfJyBiaXRzIChtYXJrZWQgJ3YnKSBhbmQgQklUUyBjYWNoZWQKLS8vIGJpdHMgKG1hcmtlZCAnQicpCi0vLwotLy8gVGhlIHJpZ2h0LWp1c3RpZnkgc3RyYXRlZ3kgdGVuZHMgdG8gdXNlIGxlc3Mgc2hpZnRzIGFuZCBpcyBvZnRlbiBmYXN0ZXIuCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCSVRTIGNhbiBiZSBhbnkgbXVsdGlwbGUgb2YgOCBmcm9tIDggdG8gNTYgKGluY2x1c2l2ZSkuCi0vLyBQaWNrIHZhbHVlcyB0aGF0IGZpdCBuYXR1cmFsIHJlZ2lzdGVyIHNpemUuCi0KLSNpZiAhZGVmaW5lZChXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTikKLQotI2RlZmluZSBVU0VfUklHSFRfSlVTVElGWQotCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSAgICAgIC8vIHg4NiAzMmJpdAotI2RlZmluZSBCSVRTIDE2Ci0jZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KSAgIC8vIHg4NiA2NGJpdAotI2RlZmluZSBCSVRTIDU2Ci0jZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSAgICAgIC8vIEFSTQotI2RlZmluZSBCSVRTIDI0Ci0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHQKLSNkZWZpbmUgQklUUyAyNAotI2VuZGlmCi0KLSNlbHNlICAgICAvLyByZWZlcmVuY2UgY2hvaWNlcwotCi0jZGVmaW5lIFVTRV9SSUdIVF9KVVNUSUZZCi0jZGVmaW5lIEJJVFMgOAotCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlcml2ZWQgdHlwZXMgYW5kIGNvbnN0YW50cwotCi0vLyBiaXRfdCA9IG5hdHVyYWwgcmVnaXN0ZXIgdHlwZQotLy8gbGJpdF90ID0gbmF0dXJhbCB0eXBlIGZvciBtZW1vcnkgSS9PCi0KLSNpZiAoQklUUyA+IDMyKQotdHlwZWRlZiB1aW50NjRfdCBiaXRfdDsKLXR5cGVkZWYgdWludDY0X3QgbGJpdF90OwotI2VsaWYgKEJJVFMgPT0gMzIpCi10eXBlZGVmIHVpbnQ2NF90IGJpdF90OwotdHlwZWRlZiB1aW50MzJfdCBsYml0X3Q7Ci0jZWxpZiAoQklUUyA9PSAyNCkKLXR5cGVkZWYgdWludDMyX3QgYml0X3Q7Ci10eXBlZGVmIHVpbnQzMl90IGxiaXRfdDsKLSNlbGlmIChCSVRTID09IDE2KQotdHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKLXR5cGVkZWYgdWludDE2X3QgbGJpdF90OwotI2Vsc2UKLXR5cGVkZWYgdWludDMyX3QgYml0X3Q7Ci10eXBlZGVmIHVpbnQ4X3QgbGJpdF90OwotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLXR5cGVkZWYgYml0X3QgcmFuZ2VfdDsgICAgIC8vIHR5cGUgZm9yIHN0b3JpbmcgcmFuZ2VfCi0jZGVmaW5lIE1BU0sgKCgoKGJpdF90KTEpIDw8IChCSVRTKSkgLSAxKQotI2Vsc2UKLXR5cGVkZWYgdWludDMyX3QgcmFuZ2VfdDsgIC8vIHJhbmdlXyBvbmx5IHVzZXMgOGJpdHMgaGVyZS4gTm8gbmVlZCBmb3IgYml0X3QuCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJpdHJlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBWUDhCaXRSZWFkZXIgVlA4Qml0UmVhZGVyOwotc3RydWN0IFZQOEJpdFJlYWRlciB7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBuZXh0IGJ5dGUgdG8gYmUgcmVhZAotICBjb25zdCB1aW50OF90KiBidWZfZW5kXzsgICAgLy8gZW5kIG9mIHJlYWQgYnVmZmVyCi0gIGludCBlb2ZfOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGlucHV0IGlzIGV4aGF1c3RlZAotCi0gIC8vIGJvb2xlYW4gZGVjb2RlcgotICByYW5nZV90IHJhbmdlXzsgICAgICAgICAgICAvLyBjdXJyZW50IHJhbmdlIG1pbnVzIDEuIEluIFsxMjcsIDI1NF0gaW50ZXJ2YWwuCi0gIGJpdF90IHZhbHVlXzsgICAgICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUKLSAgaW50IGJpdHNfOyAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgbGVmdAotfTsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgYml0IHJlYWRlciBhbmQgdGhlIGJvb2xlYW4gZGVjb2Rlci4KLXZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBjb25zdCB1aW50OF90KiBjb25zdCBlbmQpOwotCi0vLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgbWFkZSBvZiAnbnVtX2JpdHMnIGJpdHMKLXVpbnQzMl90IFZQOEdldFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7Ci1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4R2V0KFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgcmV0dXJuIFZQOEdldFZhbHVlKGJyLCAxKTsKLX0KLQotLy8gcmV0dXJuIHRoZSBuZXh0IHZhbHVlIHdpdGggc2lnbi1leHRlbnNpb24uCi1pbnQzMl90IFZQOEdldFNpZ25lZFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7Ci0KLS8vIFJlYWQgYSBiaXQgd2l0aCBwcm9iYSAncHJvYicuIFNwZWVkLWNyaXRpY2FsIGZ1bmN0aW9uIQotZXh0ZXJuIGNvbnN0IHVpbnQ4X3Qga1ZQOExvZzJSYW5nZVsxMjhdOwotZXh0ZXJuIGNvbnN0IHJhbmdlX3Qga1ZQOE5ld1JhbmdlWzEyOF07Ci0KLXZvaWQgVlA4TG9hZEZpbmFsQnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicik7ICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIHRhaWwKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TG9hZE5ld0J5dGVzKFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwgJiYgYnItPmJ1Zl8gIT0gTlVMTCk7Ci0gIC8vIFJlYWQgJ0JJVFMnIGJpdHMgYXQgYSB0aW1lIGlmIHBvc3NpYmxlLgotICBpZiAoYnItPmJ1Zl8gKyBzaXplb2YobGJpdF90KSA8PSBici0+YnVmX2VuZF8pIHsKLSAgICAvLyBjb252ZXJ0IG1lbW9yeSB0eXBlIHRvIHJlZ2lzdGVyIHR5cGUgKHdpdGggc29tZSB6ZXJvJ2luZyEpCi0gICAgYml0X3QgYml0czsKLSAgICBsYml0X3QgaW5fYml0cyA9ICoobGJpdF90Kilici0+YnVmXzsKLSAgICBici0+YnVmXyArPSAoQklUUykgPj4gMzsKLSNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSNpZiAoQklUUyA+IDMyKQotLy8gZ2NjIDQuMyBoYXMgYnVpbHRpbiBmdW5jdGlvbnMgZm9yIHN3YXAzMi9zd2FwNjQKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSAgICBiaXRzID0gU2JCeXRlU3dhcFU2NChpbl9iaXRzKTsKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIFwKLSAgICAgICAgICAgKF9fR05VQ19fID4gNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAzKSkKLSAgICBiaXRzID0gKGJpdF90KV9fYnVpbHRpbl9ic3dhcDY0KGluX2JpdHMpOwotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLSAgICBiaXRzID0gKGJpdF90KV9ieXRlc3dhcF91aW50NjQoaW5fYml0cyk7Ci0jZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXBxICUwIiA6ICI9ciIoYml0cykgOiAiMCIoaW5fYml0cykpOwotI2Vsc2UgIC8vIGdlbmVyaWMgY29kZSBmb3Igc3dhcHBpbmcgNjQtYml0IHZhbHVlcyAoc3VnZ2VzdGVkIGJ5IGJkYkApCi0gICAgYml0cyA9IChiaXRfdClpbl9iaXRzOwotICAgIGJpdHMgPSAoKGJpdHMgJiAweGZmZmZmZmZmMDAwMDAwMDB1bGwpID4+IDMyKSB8Ci0gICAgICAgICAgICgoYml0cyAmIDB4MDAwMDAwMDBmZmZmZmZmZnVsbCkgPDwgMzIpOwotICAgIGJpdHMgPSAoKGJpdHMgJiAweGZmZmYwMDAwZmZmZjAwMDB1bGwpID4+IDE2KSB8Ci0gICAgICAgICAgICgoYml0cyAmIDB4MDAwMGZmZmYwMDAwZmZmZnVsbCkgPDwgMTYpOwotICAgIGJpdHMgPSAoKGJpdHMgJiAweGZmMDBmZjAwZmYwMGZmMDB1bGwpID4+IDgpIHwKLSAgICAgICAgICAgKChiaXRzICYgMHgwMGZmMDBmZjAwZmYwMGZmdWxsKSA8PCA4KTsKLSNlbmRpZgotICAgIGJpdHMgPj49IDY0IC0gQklUUzsKLSNlbGlmIChCSVRTID49IDI0KQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotICAgIGJpdHMgPSBTYkJ5dGVTd2FwVTMyKGluX2JpdHMpOwotI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotICAgIF9fYXNtX18gdm9sYXRpbGUoImJzd2FwICVrMCIgOiAiPXIiKGluX2JpdHMpIDogIjAiKGluX2JpdHMpKTsKLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7ICAgLy8gMjRiLzMyYiAtPiAzMmIvNjRiIHplcm8tZXh0ZW5zaW9uCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIGJpdHMgPSAoYml0X3QpX2J5dGVzd2FwX3Vsb25nKGluX2JpdHMpOwotI2Vsc2UKLSAgICBiaXRzID0gKGJpdF90KShpbl9iaXRzID4+IDI0KSB8ICgoaW5fYml0cyA+PiA4KSAmIDB4ZmYwMCkKLSAgICAgICAgIHwgKChpbl9iaXRzIDw8IDgpICYgMHhmZjAwMDApICB8IChpbl9iaXRzIDw8IDI0KTsKLSNlbmRpZiAgLy8geDg2Ci0gICAgYml0cyA+Pj0gKDMyIC0gQklUUyk7Ci0jZWxpZiAoQklUUyA9PSAxNikKLSAgICAvLyBnY2Mgd2lsbCByZWNvZ25pemUgYSAncm9ydyAkOCwgLi4uJyBoZXJlOgotICAgIGJpdHMgPSAoYml0X3QpKGluX2JpdHMgPj4gOCkgfCAoKGluX2JpdHMgJiAweGZmKSA8PCA4KTsKLSNlbHNlICAgLy8gQklUUyA9PSA4Ci0gICAgYml0cyA9IChiaXRfdClpbl9iaXRzOwotI2VuZGlmCi0jZWxzZSAgICAvLyBCSUdfRU5ESUFOCi0gICAgYml0cyA9IChiaXRfdClpbl9iaXRzOwotICAgIGlmIChCSVRTICE9IDggKiBzaXplb2YoYml0X3QpKSBiaXRzID4+PSAoOCAqIHNpemVvZihiaXRfdCkgLSBCSVRTKTsKLSNlbmRpZgotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICAgIGJyLT52YWx1ZV8gfD0gYml0cyA8PCAoLWJyLT5iaXRzXyk7Ci0jZWxzZQotICAgIGJyLT52YWx1ZV8gPSBiaXRzIHwgKGJyLT52YWx1ZV8gPDwgKEJJVFMpKTsKLSNlbmRpZgotICAgIGJyLT5iaXRzXyArPSAoQklUUyk7Ci0gIH0gZWxzZSB7Ci0gICAgVlA4TG9hZEZpbmFsQnl0ZXMoYnIpOyAgICAvLyBubyBuZWVkIHRvIGJlIGlubGluZWQKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEJpdFVwZGF0ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCByYW5nZV90IHNwbGl0KSB7Ci0gIGlmIChici0+Yml0c18gPCAwKSB7ICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGxlYXN0IEJJVFMgYml0cyBpbiAndmFsdWVfJwotICAgIFZQOExvYWROZXdCeXRlcyhicik7Ci0gIH0KLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLSAgc3BsaXQgfD0gKE1BU0spOwotICBpZiAoYnItPnZhbHVlXyA+IHNwbGl0KSB7Ci0gICAgYnItPnJhbmdlXyAtPSBzcGxpdCArIDE7Ci0gICAgYnItPnZhbHVlXyAtPSBzcGxpdCArIDE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgYnItPnJhbmdlXyA9IHNwbGl0OwotICAgIHJldHVybiAwOwotICB9Ci0jZWxzZQotICB7Ci0gICAgY29uc3QgaW50IHBvcyA9IGJyLT5iaXRzXzsKLSAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKLSAgICBpZiAodmFsdWUgPiBzcGxpdCkgewotICAgICAgYnItPnJhbmdlXyAtPSBzcGxpdCArIDE7Ci0gICAgICBici0+dmFsdWVfIC09IChiaXRfdCkoc3BsaXQgKyAxKSA8PCBwb3M7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgYnItPnJhbmdlXyA9IHNwbGl0OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4U2hpZnQoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICAvLyByYW5nZV8gaXMgaW4gWzAuLjEyN10gaW50ZXJ2YWwgaGVyZS4KLSAgY29uc3QgYml0X3QgaWR4ID0gYnItPnJhbmdlXyA+PiAoQklUUyk7Ci0gIGNvbnN0IGludCBzaGlmdCA9IGtWUDhMb2cyUmFuZ2VbaWR4XTsKLSAgYnItPnJhbmdlXyA9IGtWUDhOZXdSYW5nZVtpZHhdOwotICBici0+dmFsdWVfIDw8PSBzaGlmdDsKLSAgYnItPmJpdHNfIC09IHNoaWZ0OwotI2Vsc2UKLSAgY29uc3QgaW50IHNoaWZ0ID0ga1ZQOExvZzJSYW5nZVtici0+cmFuZ2VfXTsKLSAgU0JfRENIRUNLKGJyLT5yYW5nZV8gPCAocmFuZ2VfdCkxMjgpOwotICBici0+cmFuZ2VfID0ga1ZQOE5ld1JhbmdlW2JyLT5yYW5nZV9dOwotICBici0+Yml0c18gLT0gc2hpZnQ7Ci0jZW5kaWYKLX0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0Qml0KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBwcm9iKSB7Ci0jaWZuZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gIC8vIEl0J3MgaW1wb3J0YW50IHRvIGF2b2lkIGdlbmVyYXRpbmcgYSA2NGJpdCB4IDY0Yml0IG11bHRpcGx5IGhlcmUuCi0gIC8vIFdlIGp1c3QgbmVlZCBhbiA4YiB4IDhiIGFmdGVyIGFsbC4KLSAgY29uc3QgcmFuZ2VfdCBzcGxpdCA9Ci0gICAgICAocmFuZ2VfdCkoKHVpbnQzMl90KShici0+cmFuZ2VfID4+IChCSVRTKSkgKiBwcm9iKSA8PCAoKEJJVFMpIC0gOCk7Ci0gIGNvbnN0IGludCBiaXQgPSBWUDhCaXRVcGRhdGUoYnIsIHNwbGl0KTsKLSAgaWYgKGJyLT5yYW5nZV8gPD0gKCgocmFuZ2VfdCkweDdlIDw8IChCSVRTKSkgfCAoTUFTSykpKSB7Ci0gICAgVlA4U2hpZnQoYnIpOwotICB9Ci0gIHJldHVybiBiaXQ7Ci0jZWxzZQotICBjb25zdCByYW5nZV90IHNwbGl0ID0gKGJyLT5yYW5nZV8gKiBwcm9iKSA+PiA4OwotICBjb25zdCBpbnQgYml0ID0gVlA4Qml0VXBkYXRlKGJyLCBzcGxpdCk7Ci0gIGlmIChici0+cmFuZ2VfIDw9IChyYW5nZV90KTB4N2UpIHsKLSAgICBWUDhTaGlmdChicik7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLSNlbmRpZgotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldFNpZ25lZChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgdikgewotICBjb25zdCByYW5nZV90IHNwbGl0ID0gKGJyLT5yYW5nZV8gPj4gMSk7Ci0gIGNvbnN0IGludCBiaXQgPSBWUDhCaXRVcGRhdGUoYnIsIHNwbGl0KTsKLSAgVlA4U2hpZnQoYnIpOwotICByZXR1cm4gYml0ID8gLXYgOiB2OwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCaXRyZWFkZXIgZm9yIGxvc3NsZXNzIGZvcm1hdAotCi10eXBlZGVmIHVpbnQ2NF90IHZwOGxfdmFsX3Q7ICAvLyByaWdodCBub3csIHRoaXMgYml0LXJlYWRlciBjYW4gb25seSB1c2UgNjRiaXQuCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdnA4bF92YWxfdCAgICAgdmFsXzsgICAgICAgIC8vIHByZS1mZXRjaGVkIGJpdHMKLSAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIGlucHV0IGJ5dGUgYnVmZmVyCi0gIHNpemVfdCAgICAgICAgIGxlbl87ICAgICAgICAvLyBidWZmZXIgbGVuZ3RoCi0gIHNpemVfdCAgICAgICAgIHBvc187ICAgICAgICAvLyBieXRlIHBvc2l0aW9uIGluIGJ1Zl8KLSAgaW50ICAgICAgICAgICAgYml0X3Bvc187ICAgIC8vIGN1cnJlbnQgYml0LXJlYWRpbmcgcG9zaXRpb24gaW4gdmFsXwotICBpbnQgICAgICAgICAgICBlb3NfOyAgICAgICAgLy8gYml0c3RyZWFtIGlzIGZpbmlzaGVkCi0gIGludCAgICAgICAgICAgIGVycm9yXzsgICAgICAvLyBhbiBlcnJvciBvY2N1cnJlZCAoYnVmZmVyIG92ZXJmbG93IGF0dGVtcHQuLi4pCi19IFZQOExCaXRSZWFkZXI7Ci0KLXZvaWQgVlA4TEluaXRCaXRSZWFkZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLQotLy8gIFNldHMgYSBuZXcgZGF0YSBidWZmZXIuCi12b2lkIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKLQotLy8gUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBmcm9tIFJlYWQgQnVmZmVyLgotLy8gRmxhZ3MgYW4gZXJyb3IgaW4gY2FzZSBlbmRfb2Zfc3RyZWFtIG9yIG5fYml0cyBpcyBtb3JlIHRoYW4gYWxsb3dlZCBsaW1pdC4KLS8vIEZsYWdzIGVvcyBpZiB0aGlzIHJlYWQgYXR0ZW1wdCBpcyBnb2luZyB0byBjcm9zcyB0aGUgcmVhZCBidWZmZXIuCi11aW50MzJfdCBWUDhMUmVhZEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCBuX2JpdHMpOwotCi0vLyBSZXR1cm4gdGhlIHByZWZldGNoZWQgYml0cywgc28gdGhleSBjYW4gYmUgbG9va2VkIHVwLgotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExQcmVmZXRjaEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgcmV0dXJuICh1aW50MzJfdCkoYnItPnZhbF8gPj4gYnItPmJpdF9wb3NfKTsKLX0KLQotLy8gRGlzY2FyZCAnbnVtX2JpdHMnIGJpdHMgZnJvbSB0aGUgY2FjaGUuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMRGlzY2FyZEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cykgewotICBici0+Yml0X3Bvc18gKz0gbnVtX2JpdHM7Ci19Ci0KLS8vIEFkdmFuY2VzIHRoZSBSZWFkIGJ1ZmZlciBieSA0IGJ5dGVzIHRvIG1ha2Ugcm9vbSBmb3IgcmVhZGluZyBuZXh0IDMyIGJpdHMuCi12b2lkIFZQOExGaWxsQml0V2luZG93KFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19CSVRfUkVBREVSX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTFjZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBCaXQgd3JpdGluZyBhbmQgYm9vbGVhbiBjb2RlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0vLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIG1lbWNweSgpCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYml0X3dyaXRlci5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOEJpdFdyaXRlcgotCi1zdGF0aWMgaW50IEJpdFdyaXRlclJlc2l6ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXh0cmFfc2l6ZSkgewotICB1aW50OF90KiBuZXdfYnVmOwotICBzaXplX3QgbmV3X3NpemU7Ci0gIGNvbnN0IHVpbnQ2NF90IG5lZWRlZF9zaXplXzY0YiA9ICh1aW50NjRfdClidy0+cG9zXyArIGV4dHJhX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBuZWVkZWRfc2l6ZSA9IChzaXplX3QpbmVlZGVkX3NpemVfNjRiOwotICBpZiAobmVlZGVkX3NpemVfNjRiICE9IG5lZWRlZF9zaXplKSB7Ci0gICAgYnctPmVycm9yXyA9IDE7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG5lZWRlZF9zaXplIDw9IGJ3LT5tYXhfcG9zXykgcmV0dXJuIDE7Ci0gIC8vIElmIHRoZSBmb2xsb3dpbmcgbGluZSB3cmFwcyBvdmVyIDMyYml0LCB0aGUgdGVzdCBqdXN0IGFmdGVyIHdpbGwgY2F0Y2ggaXQuCi0gIG5ld19zaXplID0gMiAqIGJ3LT5tYXhfcG9zXzsKLSAgaWYgKG5ld19zaXplIDwgbmVlZGVkX3NpemUpIG5ld19zaXplID0gbmVlZGVkX3NpemU7Ci0gIGlmIChuZXdfc2l6ZSA8IDEwMjQpIG5ld19zaXplID0gMTAyNDsKLSAgbmV3X2J1ZiA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKG5ld19zaXplKTsKLSAgaWYgKG5ld19idWYgPT0gTlVMTCkgewotICAgIGJ3LT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gIFNiTWVtb3J5Q29weShuZXdfYnVmLCBidy0+YnVmXywgYnctPnBvc18pOwotICBTYk1lbW9yeURlYWxsb2NhdGUoYnctPmJ1Zl8pOwotICBidy0+YnVmXyA9IG5ld19idWY7Ci0gIGJ3LT5tYXhfcG9zXyA9IG5ld19zaXplOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQga0ZsdXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgY29uc3QgaW50IHMgPSA4ICsgYnctPm5iX2JpdHNfOwotICBjb25zdCBpbnQzMl90IGJpdHMgPSBidy0+dmFsdWVfID4+IHM7Ci0gIFNCX0RDSEVDSyhidy0+bmJfYml0c18gPj0gMCk7Ci0gIGJ3LT52YWx1ZV8gLT0gYml0cyA8PCBzOwotICBidy0+bmJfYml0c18gLT0gODsKLSAgaWYgKChiaXRzICYgMHhmZikgIT0gMHhmZikgewotICAgIHNpemVfdCBwb3MgPSBidy0+cG9zXzsKLSAgICBpZiAoIUJpdFdyaXRlclJlc2l6ZShidywgYnctPnJ1bl8gKyAxKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYml0cyAmIDB4MTAwKSB7ICAvLyBvdmVyZmxvdyAtPiBwcm9wYWdhdGUgY2Fycnkgb3ZlciBwZW5kaW5nIDB4ZmYncwotICAgICAgaWYgKHBvcyA+IDApIGJ3LT5idWZfW3BvcyAtIDFdKys7Ci0gICAgfQotICAgIGlmIChidy0+cnVuXyA+IDApIHsKLSAgICAgIGNvbnN0IGludCB2YWx1ZSA9IChiaXRzICYgMHgxMDApID8gMHgwMCA6IDB4ZmY7Ci0gICAgICBmb3IgKDsgYnctPnJ1bl8gPiAwOyAtLWJ3LT5ydW5fKSBidy0+YnVmX1twb3MrK10gPSB2YWx1ZTsKLSAgICB9Ci0gICAgYnctPmJ1Zl9bcG9zKytdID0gYml0czsKLSAgICBidy0+cG9zXyA9IHBvczsKLSAgfSBlbHNlIHsKLSAgICBidy0+cnVuXysrOyAgIC8vIGRlbGF5IHdyaXRpbmcgb2YgYnl0ZXMgMHhmZiwgcGVuZGluZyBldmVudHVhbCBjYXJyeS4KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVub3JtYWxpemF0aW9uCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtOb3JtWzEyOF0gPSB7ICAvLyByZW5vcm1fc2l6ZXNbaV0gPSA4IC0gbG9nMihpKQotICAgICA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAwCi19OwotCi0vLyByYW5nZSA9ICgocmFuZ2UgKyAxKSA8PCBrVlA4TG9nMlJhbmdlW3JhbmdlXSkgLSAxCi1zdGF0aWMgY29uc3QgdWludDhfdCBrTmV3UmFuZ2VbMTI4XSA9IHsKLSAgMTI3LCAxMjcsIDE5MSwgMTI3LCAxNTksIDE5MSwgMjIzLCAxMjcsIDE0MywgMTU5LCAxNzUsIDE5MSwgMjA3LCAyMjMsIDIzOSwKLSAgMTI3LCAxMzUsIDE0MywgMTUxLCAxNTksIDE2NywgMTc1LCAxODMsIDE5MSwgMTk5LCAyMDcsIDIxNSwgMjIzLCAyMzEsIDIzOSwKLSAgMjQ3LCAxMjcsIDEzMSwgMTM1LCAxMzksIDE0MywgMTQ3LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2NywgMTcxLCAxNzUsIDE3OSwKLSAgMTgzLCAxODcsIDE5MSwgMTk1LCAxOTksIDIwMywgMjA3LCAyMTEsIDIxNSwgMjE5LCAyMjMsIDIyNywgMjMxLCAyMzUsIDIzOSwKLSAgMjQzLCAyNDcsIDI1MSwgMTI3LCAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywgMTQ1LCAxNDcsIDE0OSwKLSAgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksIDE2MSwgMTYzLCAxNjUsIDE2NywgMTY5LCAxNzEsIDE3MywgMTc1LCAxNzcsIDE3OSwKLSAgMTgxLCAxODMsIDE4NSwgMTg3LCAxODksIDE5MSwgMTkzLCAxOTUsIDE5NywgMTk5LCAyMDEsIDIwMywgMjA1LCAyMDcsIDIwOSwKLSAgMjExLCAyMTMsIDIxNSwgMjE3LCAyMTksIDIyMSwgMjIzLCAyMjUsIDIyNywgMjI5LCAyMzEsIDIzMywgMjM1LCAyMzcsIDIzOSwKLSAgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDksIDI1MSwgMjUzLCAxMjcKLX07Ci0KLWludCBWUDhQdXRCaXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCwgaW50IHByb2IpIHsKLSAgY29uc3QgaW50IHNwbGl0ID0gKGJ3LT5yYW5nZV8gKiBwcm9iKSA+PiA4OwotICBpZiAoYml0KSB7Ci0gICAgYnctPnZhbHVlXyArPSBzcGxpdCArIDE7Ci0gICAgYnctPnJhbmdlXyAtPSBzcGxpdCArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgYnctPnJhbmdlXyA9IHNwbGl0OwotICB9Ci0gIGlmIChidy0+cmFuZ2VfIDwgMTI3KSB7ICAgLy8gZW1pdCAnc2hpZnQnIGJpdHMgb3V0IGFuZCByZW5vcm1hbGl6ZQotICAgIGNvbnN0IGludCBzaGlmdCA9IGtOb3JtW2J3LT5yYW5nZV9dOwotICAgIGJ3LT5yYW5nZV8gPSBrTmV3UmFuZ2VbYnctPnJhbmdlX107Ci0gICAgYnctPnZhbHVlXyA8PD0gc2hpZnQ7Ci0gICAgYnctPm5iX2JpdHNfICs9IHNoaWZ0OwotICAgIGlmIChidy0+bmJfYml0c18gPiAwKSBrRmx1c2goYncpOwotICB9Ci0gIHJldHVybiBiaXQ7Ci19Ci0KLWludCBWUDhQdXRCaXRVbmlmb3JtKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQpIHsKLSAgY29uc3QgaW50IHNwbGl0ID0gYnctPnJhbmdlXyA+PiAxOwotICBpZiAoYml0KSB7Ci0gICAgYnctPnZhbHVlXyArPSBzcGxpdCArIDE7Ci0gICAgYnctPnJhbmdlXyAtPSBzcGxpdCArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgYnctPnJhbmdlXyA9IHNwbGl0OwotICB9Ci0gIGlmIChidy0+cmFuZ2VfIDwgMTI3KSB7Ci0gICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKLSAgICBidy0+dmFsdWVfIDw8PSAxOwotICAgIGJ3LT5uYl9iaXRzXyArPSAxOwotICAgIGlmIChidy0+bmJfYml0c18gPiAwKSBrRmx1c2goYncpOwotICB9Ci0gIHJldHVybiBiaXQ7Ci19Ci0KLXZvaWQgVlA4UHV0VmFsdWUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cykgewotICBpbnQgbWFzazsKLSAgZm9yIChtYXNrID0gMSA8PCAobmJfYml0cyAtIDEpOyBtYXNrOyBtYXNrID4+PSAxKQotICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIHZhbHVlICYgbWFzayk7Ci19Ci0KLXZvaWQgVlA4UHV0U2lnbmVkVmFsdWUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cykgewotICBpZiAoIVZQOFB1dEJpdFVuaWZvcm0oYncsIHZhbHVlICE9IDApKQotICAgIHJldHVybjsKLSAgaWYgKHZhbHVlIDwgMCkgewotICAgIFZQOFB1dFZhbHVlKGJ3LCAoKC12YWx1ZSkgPDwgMSkgfCAxLCBuYl9iaXRzICsgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgVlA4UHV0VmFsdWUoYncsIHZhbHVlIDw8IDEsIG5iX2JpdHMgKyAxKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgVlA4Qml0V3JpdGVySW5pdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSkgewotICBidy0+cmFuZ2VfICAgPSAyNTUgLSAxOwotICBidy0+dmFsdWVfICAgPSAwOwotICBidy0+cnVuXyAgICAgPSAwOwotICBidy0+bmJfYml0c18gPSAtODsKLSAgYnctPnBvc18gICAgID0gMDsKLSAgYnctPm1heF9wb3NfID0gMDsKLSAgYnctPmVycm9yXyAgID0gMDsKLSAgYnctPmJ1Zl8gICAgID0gTlVMTDsKLSAgcmV0dXJuIChleHBlY3RlZF9zaXplID4gMCkgPyBCaXRXcml0ZXJSZXNpemUoYncsIGV4cGVjdGVkX3NpemUpIDogMTsKLX0KLQotdWludDhfdCogVlA4Qml0V3JpdGVyRmluaXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgVlA4UHV0VmFsdWUoYncsIDAsIDkgLSBidy0+bmJfYml0c18pOwotICBidy0+bmJfYml0c18gPSAwOyAgIC8vIHBhZCB3aXRoIHplcm9lcwotICBrRmx1c2goYncpOwotICByZXR1cm4gYnctPmJ1Zl87Ci19Ci0KLWludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgU0JfRENIRUNLKGRhdGEpOwotICBpZiAoYnctPm5iX2JpdHNfICE9IC04KSByZXR1cm4gMDsgICAvLyBrRmx1c2goKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQKLSAgaWYgKCFCaXRXcml0ZXJSZXNpemUoYncsIHNpemUpKSByZXR1cm4gMDsKLSAgU2JNZW1vcnlDb3B5KGJ3LT5idWZfICsgYnctPnBvc18sIGRhdGEsIHNpemUpOwotICBidy0+cG9zXyArPSBzaXplOwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhCaXRXcml0ZXJXaXBlT3V0KFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgaWYgKGJ3KSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGJ3LT5idWZfKTsKLSAgICBTYk1lbW9yeVNldChidywgMCwgc2l6ZW9mKCpidykpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQml0V3JpdGVyCi0KLS8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgotc3RhdGljIGludCBWUDhMQml0V3JpdGVyUmVzaXplKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXh0cmFfc2l6ZSkgewotICB1aW50OF90KiBhbGxvY2F0ZWRfYnVmOwotICBzaXplX3QgYWxsb2NhdGVkX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBjdXJyZW50X3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpOwotICBjb25zdCB1aW50NjRfdCBzaXplX3JlcXVpcmVkXzY0YiA9ICh1aW50NjRfdCljdXJyZW50X3NpemUgKyBleHRyYV9zaXplOwotICBjb25zdCBzaXplX3Qgc2l6ZV9yZXF1aXJlZCA9IChzaXplX3Qpc2l6ZV9yZXF1aXJlZF82NGI7Ci0gIGlmIChzaXplX3JlcXVpcmVkICE9IHNpemVfcmVxdWlyZWRfNjRiKSB7Ci0gICAgYnctPmVycm9yXyA9IDE7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGJ3LT5tYXhfYnl0ZXNfID4gMCAmJiBzaXplX3JlcXVpcmVkIDw9IGJ3LT5tYXhfYnl0ZXNfKSByZXR1cm4gMTsKLSAgYWxsb2NhdGVkX3NpemUgPSAoMyAqIGJ3LT5tYXhfYnl0ZXNfKSA+PiAxOwotICBpZiAoYWxsb2NhdGVkX3NpemUgPCBzaXplX3JlcXVpcmVkKSBhbGxvY2F0ZWRfc2l6ZSA9IHNpemVfcmVxdWlyZWQ7Ci0gIC8vIG1ha2UgYWxsb2NhdGVkIHNpemUgbXVsdGlwbGUgb2YgMWsKLSAgYWxsb2NhdGVkX3NpemUgPSAoKChhbGxvY2F0ZWRfc2l6ZSA+PiAxMCkgKyAxKSA8PCAxMCk7Ci0gIGFsbG9jYXRlZF9idWYgPSAodWludDhfdCopU2JNZW1vcnlBbGxvY2F0ZShhbGxvY2F0ZWRfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWRfYnVmID09IE5VTEwpIHsKLSAgICBidy0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBTYk1lbW9yeUNvcHkoYWxsb2NhdGVkX2J1ZiwgYnctPmJ1Zl8sIGN1cnJlbnRfc2l6ZSk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShidy0+YnVmXyk7Ci0gIGJ3LT5idWZfID0gYWxsb2NhdGVkX2J1ZjsKLSAgYnctPm1heF9ieXRlc18gPSBhbGxvY2F0ZWRfc2l6ZTsKLSAgU2JNZW1vcnlTZXQoYWxsb2NhdGVkX2J1ZiArIGN1cnJlbnRfc2l6ZSwgMCwgYWxsb2NhdGVkX3NpemUgLSBjdXJyZW50X3NpemUpOwotICByZXR1cm4gMTsKLX0KLQotaW50IFZQOExCaXRXcml0ZXJJbml0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSkgewotICBTYk1lbW9yeVNldChidywgMCwgc2l6ZW9mKCpidykpOwotICByZXR1cm4gVlA4TEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSk7Ci19Ci0KLXZvaWQgVlA4TEJpdFdyaXRlckRlc3Ryb3koVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgaWYgKGJ3ICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoYnctPmJ1Zl8pOwotICAgIFNiTWVtb3J5U2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7Ci0gIH0KLX0KLQotdm9pZCBWUDhMV3JpdGVCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbl9iaXRzLCB1aW50MzJfdCBiaXRzKSB7Ci0gIGlmIChuX2JpdHMgPCAxKSByZXR1cm47Ci0jaWYgIWRlZmluZWQoX19CSUdfRU5ESUFOX18pCi0gIC8vIFRlY2huaWNhbGx5LCB0aGlzIGJyYW5jaCBvZiB0aGUgY29kZSBjYW4gd3JpdGUgdXAgdG8gMjUgYml0cyBhdCBhIHRpbWUsCi0gIC8vIGJ1dCBpbiBwcmVmaXggZW5jb2RpbmcsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4gaXMgMTggYXQgYSB0aW1lLgotICB7Ci0gICAgdWludDhfdCogY29uc3QgcCA9ICZidy0+YnVmX1tidy0+Yml0X3Bvc18gPj4gM107Ci0gICAgdWludDMyX3QgdiA9ICooY29uc3QgdWludDMyX3QqKXA7Ci0gICAgdiB8PSBiaXRzIDw8IChidy0+Yml0X3Bvc18gJiA3KTsKLSAgICAqKHVpbnQzMl90KilwID0gdjsKLSAgICBidy0+Yml0X3Bvc18gKz0gbl9iaXRzOwotICB9Ci0jZWxzZSAgLy8gQklHX0VORElBTgotICB7Ci0gICAgdWludDhfdCogcCA9ICZidy0+YnVmX1tidy0+Yml0X3Bvc18gPj4gM107Ci0gICAgY29uc3QgaW50IGJpdHNfcmVzZXJ2ZWRfaW5fZmlyc3RfYnl0ZSA9IGJ3LT5iaXRfcG9zXyAmIDc7Ci0gICAgY29uc3QgaW50IGJpdHNfbGVmdF90b193cml0ZSA9IG5fYml0cyAtIDggKyBiaXRzX3Jlc2VydmVkX2luX2ZpcnN0X2J5dGU7Ci0gICAgLy8gaW1wbGljaXQgJiAweGZmIGlzIGFzc3VtZWQgZm9yIHVpbnQ4X3QgYXJpdGhtZXRpY3MKLSAgICAqcCsrIHw9IGJpdHMgPDwgYml0c19yZXNlcnZlZF9pbl9maXJzdF9ieXRlOwotICAgIGJpdHMgPj49IDggLSBiaXRzX3Jlc2VydmVkX2luX2ZpcnN0X2J5dGU7Ci0gICAgaWYgKGJpdHNfbGVmdF90b193cml0ZSA+PSAxKSB7Ci0gICAgICAqcCsrID0gYml0czsKLSAgICAgIGJpdHMgPj49IDg7Ci0gICAgICBpZiAoYml0c19sZWZ0X3RvX3dyaXRlID49IDkpIHsKLSAgICAgICAgKnArKyA9IGJpdHM7Ci0gICAgICAgIGJpdHMgPj49IDg7Ci0gICAgICB9Ci0gICAgfQotICAgIFNCX0RDSEVDSyhuX2JpdHMgPD0gMjUpOwotICAgICpwID0gYml0czsKLSAgICBidy0+Yml0X3Bvc18gKz0gbl9iaXRzOwotICB9Ci0jZW5kaWYKLSAgaWYgKChidy0+Yml0X3Bvc18gPj4gMykgPiAoYnctPm1heF9ieXRlc18gLSA4KSkgewotICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAzMjc2OFVMTCArIGJ3LT5tYXhfYnl0ZXNfOwotICAgIGlmIChleHRyYV9zaXplICE9IChzaXplX3QpZXh0cmFfc2l6ZSB8fAotICAgICAgICAhVlA4TEJpdFdyaXRlclJlc2l6ZShidywgKHNpemVfdClleHRyYV9zaXplKSkgewotICAgICAgYnctPmJpdF9wb3NfID0gMDsKLSAgICAgIGJ3LT5lcnJvcl8gPSAxOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiMDk1Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX0JJVF9XUklURVJfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19CSVRfV1JJVEVSX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQml0LXdyaXRpbmcKLQotdHlwZWRlZiBzdHJ1Y3QgVlA4Qml0V3JpdGVyIFZQOEJpdFdyaXRlcjsKLXN0cnVjdCBWUDhCaXRXcml0ZXIgewotICBpbnQzMl90ICByYW5nZV87ICAgICAgLy8gcmFuZ2UtMQotICBpbnQzMl90ICB2YWx1ZV87Ci0gIGludCAgICAgIHJ1bl87ICAgICAgICAvLyBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYml0cwotICBpbnQgICAgICBuYl9iaXRzXzsgICAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgYml0cwotICB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW50ZXJuYWwgYnVmZmVyLiBSZS1hbGxvY2F0ZWQgcmVndWxhcmx5LiBOb3Qgb3duZWQuCi0gIHNpemVfdCAgIHBvc187Ci0gIHNpemVfdCAgIG1heF9wb3NfOwotICBpbnQgICAgICBlcnJvcl87ICAgICAgLy8gdHJ1ZSBpbiBjYXNlIG9mIGVycm9yCi19OwotCi0vLyBJbml0aWFsaXplIHRoZSBvYmplY3QuIEFsbG9jYXRlcyBzb21lIGluaXRpYWwgbWVtb3J5IGJhc2VkIG9uIGV4cGVjdGVkX3NpemUuCi1pbnQgVlA4Qml0V3JpdGVySW5pdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSk7Ci0vLyBGaW5hbGl6ZSB0aGUgYml0c3RyZWFtIGNvZGluZy4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KLXVpbnQ4X3QqIFZQOEJpdFdyaXRlckZpbmlzaChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKLS8vIFJlbGVhc2UgYW55IHBlbmRpbmcgbWVtb3J5IGFuZCB6ZXJvZXMgdGhlIG9iamVjdC4gTm90IGEgbWFuZGF0b3J5IGNhbGwuCi0vLyBPbmx5IHVzZWZ1bCBpbiBjYXNlIG9mIGVycm9yLCB3aGVuIHRoZSBpbnRlcm5hbCBidWZmZXIgaGFzbid0IGJlZW4gZ3JhYmJlZCEKLXZvaWQgVlA4Qml0V3JpdGVyV2lwZU91dChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKLQotaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYik7Ci1pbnQgVlA4UHV0Qml0VW5pZm9ybShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0KTsKLXZvaWQgVlA4UHV0VmFsdWUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cyk7Ci12b2lkIFZQOFB1dFNpZ25lZFZhbHVlKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB2YWx1ZSwgaW50IG5iX2JpdHMpOwotCi0vLyBBcHBlbmRzIHNvbWUgYnl0ZXMgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4gRGF0YSBpcyBjb3BpZWQuCi1pbnQgVlA4Qml0V3JpdGVyQXBwZW5kKFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotLy8gcmV0dXJuIGFwcHJveGltYXRlIHdyaXRlIHBvc2l0aW9uIChpbiBiaXRzKQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IFZQOEJpdFdyaXRlclBvcyhjb25zdCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIHJldHVybiAodWludDY0X3QpKGJ3LT5wb3NfICsgYnctPnJ1bl8pICogOCArIDggKyBidy0+bmJfYml0c187Ci19Ci0KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCogVlA4Qml0V3JpdGVyQnVmKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgcmV0dXJuIGJ3LT5idWZfOwotfQotLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhCaXRXcml0ZXJTaXplKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgcmV0dXJuIGJ3LT5wb3NfOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TEJpdFdyaXRlcgotLy8gVE9ETyh2aWthc2EpOiBWUDhMQml0V3JpdGVyIGlzIGNvcGllZCBhcy1pcyBmcm9tIGxvc3NsZXNzIGNvZGUuIFRoZXJlJ3Mgc2NvcGUKLS8vIG9mIHJlLXVzaW5nIFZQOEJpdFdyaXRlci4gV2lsbCBldmFsdWF0ZSBvbmNlIGJhc2ljIGxvc3NsZXNzIGVuY29kZXIgaXMKLS8vIGltcGxlbWVudGVkLgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QqIGJ1Zl87Ci0gIHNpemVfdCBiaXRfcG9zXzsKLSAgc2l6ZV90IG1heF9ieXRlc187Ci0KLSAgLy8gQWZ0ZXIgYWxsIGJpdHMgYXJlIHdyaXR0ZW4sIHRoZSBjYWxsZXIgbXVzdCBvYnNlcnZlIHRoZSBzdGF0ZSBvZgotICAvLyBlcnJvcl8uIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhhdCBhIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKLSAgLy8gaGFzIGhhcHBlbmVkIGR1cmluZyBiaXQgd3JpdGluZy4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBzdWNjZXNzZnVsCi0gIC8vIHdyaXRpbmcgb2YgYml0cy4KLSAgaW50IGVycm9yXzsKLX0gVlA4TEJpdFdyaXRlcjsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgcmV0dXJuIChidy0+Yml0X3Bvc18gKyA3KSA+PiAzOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCogVlA4TEJpdFdyaXRlckZpbmlzaChWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gYnctPmJ1Zl87Ci19Ci0KLS8vIFJldHVybnMgMCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotaW50IFZQOExCaXRXcml0ZXJJbml0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSk7Ci0KLXZvaWQgVlA4TEJpdFdyaXRlckRlc3Ryb3koVlA4TEJpdFdyaXRlciogY29uc3QgYncpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBiaXRzIGludG8gYnl0ZXMgaW4gaW5jcmVhc2luZyBhZGRyZXNzZXMsIGFuZCB3aXRoaW4KLS8vIGEgYnl0ZSBsZWFzdC1zaWduaWZpY2FudC1iaXQgZmlyc3QuCi0vLwotLy8gVGhlIGZ1bmN0aW9uIGNhbiB3cml0ZSB1cCB0byAxNiBiaXRzIGluIG9uZSBnbyB3aXRoIFdyaXRlQml0cwotLy8gRXhhbXBsZTogbGV0J3MgYXNzdW1lIHRoYXQgMyBiaXRzIChScyBiZWxvdykgaGF2ZSBiZWVuIHdyaXR0ZW4gYWxyZWFkeToKLS8vCi0vLyBCWVRFLTAgICAgIEJZVEUrMSAgICAgICBCWVRFKzIKLS8vCi0vLyAwMDAwIDBSUlIgICAgMDAwMCAwMDAwICAgIDAwMDAgMDAwMAotLy8KLS8vIE5vdywgd2UgY291bGQgd3JpdGUgNSBvciBsZXNzIGJpdHMgaW4gTVNCIGJ5IGp1c3Qgc2lmdGluZyBieSAzCi0vLyBhbmQgT1InaW5nIHRvIEJZVEUtMC4KLS8vCi0vLyBGb3IgbiBiaXRzLCB3ZSB0YWtlIHRoZSBsYXN0IDUgYnl0ZXMsIE9SIHRoYXQgd2l0aCBoaWdoIGJpdHMgaW4gQllURS0wLAotLy8gYW5kIGxvY2F0ZSB0aGUgcmVzdCBpbiBCWVRFKzEgYW5kIEJZVEUrMi4KLS8vCi0vLyBWUDhMQml0V3JpdGVyJ3MgZXJyb3JfIGZsYWcgaXMgc2V0IGluIGNhc2Ugb2YgIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotdm9pZCBWUDhMV3JpdGVCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbl9iaXRzLCB1aW50MzJfdCBiaXRzKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19CSVRfV1JJVEVSX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMGM2Y2QuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCi0vLwotLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9maWx0ZXJzLmgiCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlbHBmdWwgbWFjcm8uCi0KLSMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKGluICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKG91dCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKHN0cmlkZSA+PSB3aWR0aCk7Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCwgaW50IGludmVyc2UpIHsKLSAgaW50IGk7Ci0gIGlmIChpbnZlcnNlKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gKyBwcmVkW2ldOwotICB9IGVsc2UgewotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSG9yaXpvbnRhbCBmaWx0ZXIuCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvSG9yaXpvbnRhbEZpbHRlcihjb25zdCB1aW50OF90KiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgewotICBpbnQgaDsKLSAgY29uc3QgdWludDhfdCogcHJlZHMgPSAoaW52ZXJzZSA/IG91dCA6IGluKTsKLSAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOwotCi0gIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCi0gIGZvciAoaCA9IDA7IGggPCBoZWlnaHQ7ICsraCkgewotICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlIChleGNlcHQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUpLgotICAgIGlmIChoID09IDApIHsKLSAgICAgIG91dFswXSA9IGluWzBdOwotICAgIH0gZWxzZSB7Ci0gICAgICBQcmVkaWN0TGluZShpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCwgMSwgaW52ZXJzZSk7Ci0gICAgfQotICAgIFByZWRpY3RMaW5lKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7Ci0gICAgcHJlZHMgKz0gc3RyaWRlOwotICAgIGluICs9IHN0cmlkZTsKLSAgICBvdXQgKz0gc3RyaWRlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7Ci0gIERvSG9yaXpvbnRhbEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGZpbHRlcmVkX2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpIHsKLSAgRG9Ib3Jpem9udGFsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMSwgZGF0YSk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWZXJ0aWNhbCBmaWx0ZXIuCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgewotICBpbnQgaDsKLSAgY29uc3QgdWludDhfdCogcHJlZHMgPSAoaW52ZXJzZSA/IG91dCA6IGluKTsKLSAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOwotCi0gIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgotICBvdXRbMF0gPSBpblswXTsKLSAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgotICBQcmVkaWN0TGluZShpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOwotCi0gIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCi0gIGZvciAoaCA9IDE7IGggPCBoZWlnaHQ7ICsraCkgewotICAgIGluICs9IHN0cmlkZTsKLSAgICBvdXQgKz0gc3RyaWRlOwotICAgIFByZWRpY3RMaW5lKGluLCBwcmVkcywgb3V0LCB3aWR0aCwgaW52ZXJzZSk7Ci0gICAgcHJlZHMgKz0gc3RyaWRlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKLSAgRG9WZXJ0aWNhbEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGZpbHRlcmVkX2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgdWludDhfdCogZGF0YSkgewotICBEb1ZlcnRpY2FsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMSwgZGF0YSk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBHcmFkaWVudCBmaWx0ZXIuCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3IodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgewotICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKLSAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUKLXZvaWQgRG9HcmFkaWVudEZpbHRlcihjb25zdCB1aW50OF90KiBpbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKLSAgY29uc3QgdWludDhfdCogcHJlZHMgPSAoaW52ZXJzZSA/IG91dCA6IGluKTsKLSAgaW50IGg7Ci0gIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKLQotICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKLSAgb3V0WzBdID0gaW5bMF07Ci0gIFByZWRpY3RMaW5lKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7Ci0KLSAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KLSAgZm9yIChoID0gMTsgaCA8IGhlaWdodDsgKytoKSB7Ci0gICAgaW50IHc7Ci0gICAgcHJlZHMgKz0gc3RyaWRlOwotICAgIGluICs9IHN0cmlkZTsKLSAgICBvdXQgKz0gc3RyaWRlOwotICAgIC8vIGxlZnRtb3N0IHBpeGVsOiBwcmVkaWN0IGZyb20gYWJvdmUuCi0gICAgUHJlZGljdExpbmUoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOwotICAgIGZvciAodyA9IDE7IHcgPCB3aWR0aDsgKyt3KSB7Ci0gICAgICBjb25zdCBpbnQgcHJlZCA9IEdyYWRpZW50UHJlZGljdG9yKHByZWRzW3cgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHNbdyAtIHN0cmlkZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRzW3cgLSBzdHJpZGUgLSAxXSk7Ci0gICAgICBvdXRbd10gPSBpblt3XSArIChpbnZlcnNlID8gcHJlZCA6IC1wcmVkKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgewotICBEb0dyYWRpZW50RmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgZmlsdGVyZWRfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCB1aW50OF90KiBkYXRhKSB7Ci0gIERvR3JhZGllbnRGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAxLCBkYXRhKTsKLX0KLQotI3VuZGVmIFNBTklUWV9DSEVDSwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUXVpY2sgZXN0aW1hdGUgb2YgYSBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBmaWx0ZXIgbW9kZSB0byB0cnkuCi0KLSNkZWZpbmUgU01BWCAxNgotI2RlZmluZSBTRElGRihhLCBiKSAoYWJzKChhKSAtIChiKSkgPj4gNCkgICAvLyBTY29yaW5nIGRpZmYsIGluIFswLi5TTUFYKQotCi1XRUJQX0ZJTFRFUl9UWVBFIEVzdGltYXRlQmVzdEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7Ci0gIGludCBpLCBqOwotICBpbnQgYmluc1tXRUJQX0ZJTFRFUl9MQVNUXVtTTUFYXTsKLSAgU2JNZW1vcnlTZXQoYmlucywgMCwgc2l6ZW9mKGJpbnMpKTsKLQotICAvLyBXZSBvbmx5IHNhbXBsZSBldmVyeSBvdGhlciBwaXhlbHMuIFRoYXQncyBlbm91Z2guCi0gIGZvciAoaiA9IDI7IGogPCBoZWlnaHQgLSAxOyBqICs9IDIpIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gZGF0YSArIGogKiBzdHJpZGU7Ci0gICAgaW50IG1lYW4gPSBwWzBdOwotICAgIGZvciAoaSA9IDI7IGkgPCB3aWR0aCAtIDE7IGkgKz0gMikgewotICAgICAgY29uc3QgaW50IGRpZmYwID0gU0RJRkYocFtpXSwgbWVhbik7Ci0gICAgICBjb25zdCBpbnQgZGlmZjEgPSBTRElGRihwW2ldLCBwW2kgLSAxXSk7Ci0gICAgICBjb25zdCBpbnQgZGlmZjIgPSBTRElGRihwW2ldLCBwW2kgLSB3aWR0aF0pOwotICAgICAgY29uc3QgaW50IGdyYWRfcHJlZCA9Ci0gICAgICAgICAgR3JhZGllbnRQcmVkaWN0b3IocFtpIC0gMV0sIHBbaSAtIHdpZHRoXSwgcFtpIC0gd2lkdGggLSAxXSk7Ci0gICAgICBjb25zdCBpbnQgZGlmZjMgPSBTRElGRihwW2ldLCBncmFkX3ByZWQpOwotICAgICAgYmluc1tXRUJQX0ZJTFRFUl9OT05FXVtkaWZmMF0gPSAxOwotICAgICAgYmluc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXVtkaWZmMV0gPSAxOwotICAgICAgYmluc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF1bZGlmZjJdID0gMTsKLSAgICAgIGJpbnNbV0VCUF9GSUxURVJfR1JBRElFTlRdW2RpZmYzXSA9IDE7Ci0gICAgICBtZWFuID0gKDMgKiBtZWFuICsgcFtpXSArIDIpID4+IDI7Ci0gICAgfQotICB9Ci0gIHsKLSAgICBXRUJQX0ZJTFRFUl9UWVBFIGZpbHRlciwgYmVzdF9maWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOwotICAgIGludCBiZXN0X3Njb3JlID0gMHg3ZmZmZmZmZjsKLSAgICBmb3IgKGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7IGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1Q7ICsrZmlsdGVyKSB7Ci0gICAgICBpbnQgc2NvcmUgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IFNNQVg7ICsraSkgewotICAgICAgICBpZiAoYmluc1tmaWx0ZXJdW2ldID4gMCkgewotICAgICAgICAgIHNjb3JlICs9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKLSAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOwotICAgICAgICBiZXN0X2ZpbHRlciA9IGZpbHRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJlc3RfZmlsdGVyOwotICB9Ci19Ci0KLSN1bmRlZiBTTUFYCi0jdW5kZWYgU0RJRkYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgV2ViUEZpbHRlckZ1bmMgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF0gPSB7Ci0gIE5VTEwsICAgICAgICAgICAgICAvLyBXRUJQX0ZJTFRFUl9OT05FCi0gIEhvcml6b250YWxGaWx0ZXIsICAvLyBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMCi0gIFZlcnRpY2FsRmlsdGVyLCAgICAvLyBXRUJQX0ZJTFRFUl9WRVJUSUNBTAotICBHcmFkaWVudEZpbHRlciAgICAgLy8gV0VCUF9GSUxURVJfR1JBRElFTlQKLX07Ci0KLWNvbnN0IFdlYlBVbmZpbHRlckZ1bmMgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXSA9IHsKLSAgTlVMTCwgICAgICAgICAgICAgICAgLy8gV0VCUF9GSUxURVJfTk9ORQotICBIb3Jpem9udGFsVW5maWx0ZXIsICAvLyBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMCi0gIFZlcnRpY2FsVW5maWx0ZXIsICAgIC8vIFdFQlBfRklMVEVSX1ZFUlRJQ0FMCi0gIEdyYWRpZW50VW5maWx0ZXIgICAgIC8vIFdFQlBfRklMVEVSX0dSQURJRU5UCi19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZmExNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycwotLy8KLS8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX0ZJTFRFUlNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19GSUxURVJTX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBGaWx0ZXJzLgotdHlwZWRlZiBlbnVtIHsKLSAgV0VCUF9GSUxURVJfTk9ORSA9IDAsCi0gIFdFQlBfRklMVEVSX0hPUklaT05UQUwsCi0gIFdFQlBfRklMVEVSX1ZFUlRJQ0FMLAotICBXRUJQX0ZJTFRFUl9HUkFESUVOVCwKLSAgV0VCUF9GSUxURVJfTEFTVCA9IFdFQlBfRklMVEVSX0dSQURJRU5UICsgMSwgIC8vIGVuZCBtYXJrZXIKLSAgV0VCUF9GSUxURVJfQkVTVCwKLSAgV0VCUF9GSUxURVJfRkFTVAotfSBXRUJQX0ZJTFRFUl9UWVBFOwotCi10eXBlZGVmIHZvaWQgKCpXZWJQRmlsdGVyRnVuYykoY29uc3QgdWludDhfdCogaW4sIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBvdXQpOwotdHlwZWRlZiB2b2lkICgqV2ViUFVuZmlsdGVyRnVuYykoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSk7Ci0KLS8vIEZpbHRlciB0aGUgZ2l2ZW4gZGF0YSB1c2luZyB0aGUgZ2l2ZW4gcHJlZGljdG9yLgotLy8gJ2luJyBjb3JyZXNwb25kcyB0byBhIDItZGltZW5zaW9uYWwgcGl4ZWwgYXJyYXkgb2Ygc2l6ZSAoc3RyaWRlICogaGVpZ2h0KQotLy8gaW4gcmFzdGVyIG9yZGVyLgotLy8gJ3N0cmlkZScgaXMgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FuIGxpbmUgKHdpdGggcG9zc2libGUgcGFkZGluZykuCi0vLyAnb3V0JyBzaG91bGQgYmUgcHJlLWFsbG9jYXRlZC4KLWV4dGVybiBjb25zdCBXZWJQRmlsdGVyRnVuYyBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKLQotLy8gSW4tcGxhY2UgcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsdGVyZWQgZGF0YS4KLWV4dGVybiBjb25zdCBXZWJQVW5maWx0ZXJGdW5jIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07Ci0KLS8vIEZhc3QgZXN0aW1hdGUgb2YgYSBwb3RlbnRpYWxseSBnb29kIGZpbHRlci4KLWV4dGVybiBXRUJQX0ZJTFRFUl9UWVBFIEVzdGltYXRlQmVzdEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSk7Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfRklMVEVSU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI4ODNmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhbmQgbG9va2luZyB1cCBIdWZmbWFuIHRyZWVzLgotLy8KLS8vIEF1dGhvcjogVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL2h1ZmZtYW4uaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBOT05fRVhJU1RFTlRfU1lNQk9MICgtMSkKLQotc3RhdGljIHZvaWQgVHJlZU5vZGVJbml0KEh1ZmZtYW5UcmVlTm9kZSogY29uc3Qgbm9kZSkgewotICBub2RlLT5jaGlsZHJlbl8gPSAtMTsgICAvLyBtZWFuczogJ3VuYXNzaWduZWQgc28gZmFyJwotfQotCi1zdGF0aWMgaW50IE5vZGVJc0VtcHR5KGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogY29uc3Qgbm9kZSkgewotICByZXR1cm4gKG5vZGUtPmNoaWxkcmVuXyA8IDApOwotfQotCi1zdGF0aWMgaW50IElzRnVsbChjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgdHJlZSkgewotICByZXR1cm4gKHRyZWUtPm51bV9ub2Rlc18gPT0gdHJlZS0+bWF4X25vZGVzXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIEFzc2lnbkNoaWxkcmVuKEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVOb2RlKiBjb25zdCBub2RlKSB7Ci0gIEh1ZmZtYW5UcmVlTm9kZSogY29uc3QgY2hpbGRyZW4gPSB0cmVlLT5yb290XyArIHRyZWUtPm51bV9ub2Rlc187Ci0gIG5vZGUtPmNoaWxkcmVuXyA9IChpbnQpKGNoaWxkcmVuIC0gbm9kZSk7Ci0gIFNCX0RDSEVDSyhjaGlsZHJlbiAtIG5vZGUgPT0gKGludCkoY2hpbGRyZW4gLSBub2RlKSk7Ci0gIHRyZWUtPm51bV9ub2Rlc18gKz0gMjsKLSAgVHJlZU5vZGVJbml0KGNoaWxkcmVuICsgMCk7Ci0gIFRyZWVOb2RlSW5pdChjaGlsZHJlbiArIDEpOwotfQotCi1zdGF0aWMgaW50IFRyZWVJbml0KEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLCBpbnQgbnVtX2xlYXZlcykgewotICBTQl9EQ0hFQ0sodHJlZSAhPSBOVUxMKTsKLSAgaWYgKG51bV9sZWF2ZXMgPT0gMCkgcmV0dXJuIDA7Ci0gIC8vIFdlIGFsbG9jYXRlIG1heGltdW0gcG9zc2libGUgbm9kZXMgaW4gdGhlIHRyZWUgYXQgb25jZS4KLSAgLy8gTm90ZSB0aGF0IGEgSHVmZm1hbiB0cmVlIGlzIGEgZnVsbCBiaW5hcnkgdHJlZTsgYW5kIGluIGEgZnVsbCBiaW5hcnkgdHJlZQotICAvLyB3aXRoIEwgbGVhdmVzLCB0aGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIE4gPSAyICogTCAtIDEuCi0gIHRyZWUtPm1heF9ub2Rlc18gPSAyICogbnVtX2xlYXZlcyAtIDE7Ci0gIHRyZWUtPnJvb3RfID0gKEh1ZmZtYW5UcmVlTm9kZSopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXRyZWUtPm1heF9ub2Rlc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCp0cmVlLT5yb290XykpOwotICBpZiAodHJlZS0+cm9vdF8gPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIFRyZWVOb2RlSW5pdCh0cmVlLT5yb290Xyk7ICAvLyBJbml0aWFsaXplIHJvb3QuCi0gIHRyZWUtPm51bV9ub2Rlc18gPSAxOwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBIdWZmbWFuVHJlZVJlbGVhc2UoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUpIHsKLSAgaWYgKHRyZWUgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSh0cmVlLT5yb290Xyk7Ci0gICAgdHJlZS0+cm9vdF8gPSBOVUxMOwotICAgIHRyZWUtPm1heF9ub2Rlc18gPSAwOwotICAgIHRyZWUtPm51bV9ub2Rlc18gPSAwOwotICB9Ci19Ci0KLWludCBIdWZmbWFuQ29kZUxlbmd0aHNUb0NvZGVzKGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfbGVuZ3Roc19zaXplLCBpbnQqIGNvbnN0IGh1ZmZfY29kZXMpIHsKLSAgaW50IHN5bWJvbDsKLSAgaW50IGNvZGVfbGVuOwotICBpbnQgY29kZV9sZW5ndGhfaGlzdFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdID0geyAwIH07Ci0gIGludCBjdXJyX2NvZGU7Ci0gIGludCBuZXh0X2NvZGVzW01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV0gPSB7IDAgfTsKLSAgaW50IG1heF9jb2RlX2xlbmd0aCA9IDA7Ci0KLSAgU0JfRENIRUNLKGNvZGVfbGVuZ3RocyAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGNvZGVfbGVuZ3Roc19zaXplID4gMCk7Ci0gIFNCX0RDSEVDSyhodWZmX2NvZGVzICE9IE5VTEwpOwotCi0gIC8vIENhbGN1bGF0ZSBtYXggY29kZSBsZW5ndGguCi0gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7Ci0gICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gbWF4X2NvZGVfbGVuZ3RoKSB7Ci0gICAgICBtYXhfY29kZV9sZW5ndGggPSBjb2RlX2xlbmd0aHNbc3ltYm9sXTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1heF9jb2RlX2xlbmd0aCA+IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKSByZXR1cm4gMDsKLQotICAvLyBDYWxjdWxhdGUgY29kZSBsZW5ndGggaGlzdG9ncmFtLgotICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgewotICAgICsrY29kZV9sZW5ndGhfaGlzdFtjb2RlX2xlbmd0aHNbc3ltYm9sXV07Ci0gIH0KLSAgY29kZV9sZW5ndGhfaGlzdFswXSA9IDA7Ci0KLSAgLy8gQ2FsY3VsYXRlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiAnbmV4dF9jb2RlcycgZm9yIGVhY2ggY29kZSBsZW5ndGguCi0gIC8vIG5leHRfY29kZXNbY29kZV9sZW5dIGRlbm90ZXMgdGhlIGNvZGUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG5leHQgc3ltYm9sCi0gIC8vIG9mIGNvZGUgbGVuZ3RoICdjb2RlX2xlbicuCi0gIGN1cnJfY29kZSA9IDA7Ci0gIG5leHRfY29kZXNbMF0gPSAtMTsgIC8vIFVudXNlZCwgYXMgY29kZSBsZW5ndGggPSAwIGltcGxpZXMgY29kZSBkb2Vzbid0IGV4aXN0LgotICBmb3IgKGNvZGVfbGVuID0gMTsgY29kZV9sZW4gPD0gbWF4X2NvZGVfbGVuZ3RoOyArK2NvZGVfbGVuKSB7Ci0gICAgY3Vycl9jb2RlID0gKGN1cnJfY29kZSArIGNvZGVfbGVuZ3RoX2hpc3RbY29kZV9sZW4gLSAxXSkgPDwgMTsKLSAgICBuZXh0X2NvZGVzW2NvZGVfbGVuXSA9IGN1cnJfY29kZTsKLSAgfQotCi0gIC8vIEdldCBzeW1ib2xzLgotICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgewotICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IDApIHsKLSAgICAgIGh1ZmZfY29kZXNbc3ltYm9sXSA9IG5leHRfY29kZXNbY29kZV9sZW5ndGhzW3N5bWJvbF1dKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGh1ZmZfY29kZXNbc3ltYm9sXSA9IE5PTl9FWElTVEVOVF9TWU1CT0w7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IFRyZWVBZGRTeW1ib2woSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5bWJvbCwgaW50IGNvZGUsIGludCBjb2RlX2xlbmd0aCkgewotICBIdWZmbWFuVHJlZU5vZGUqIG5vZGUgPSB0cmVlLT5yb290XzsKLSAgY29uc3QgSHVmZm1hblRyZWVOb2RlKiBjb25zdCBtYXhfbm9kZSA9IHRyZWUtPnJvb3RfICsgdHJlZS0+bWF4X25vZGVzXzsKLSAgd2hpbGUgKGNvZGVfbGVuZ3RoLS0gPiAwKSB7Ci0gICAgaWYgKG5vZGUgPj0gbWF4X25vZGUpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoTm9kZUlzRW1wdHkobm9kZSkpIHsKLSAgICAgIGlmIChJc0Z1bGwodHJlZSkpIHJldHVybiAwOyAgICAvLyBlcnJvcjogdG9vIG1hbnkgc3ltYm9scy4KLSAgICAgIEFzc2lnbkNoaWxkcmVuKHRyZWUsIG5vZGUpOwotICAgIH0gZWxzZSBpZiAoSHVmZm1hblRyZWVOb2RlSXNMZWFmKG5vZGUpKSB7Ci0gICAgICByZXR1cm4gMDsgIC8vIGxlYWYgaXMgYWxyZWFkeSBvY2N1cGllZC4KLSAgICB9Ci0gICAgbm9kZSArPSBub2RlLT5jaGlsZHJlbl8gKyAoKGNvZGUgPj4gY29kZV9sZW5ndGgpICYgMSk7Ci0gIH0KLSAgaWYgKE5vZGVJc0VtcHR5KG5vZGUpKSB7Ci0gICAgbm9kZS0+Y2hpbGRyZW5fID0gMDsgICAgICAvLyB0dXJuIG5ld2x5IGNyZWF0ZWQgbm9kZSBpbnRvIGEgbGVhZi4KLSAgfSBlbHNlIGlmICghSHVmZm1hblRyZWVOb2RlSXNMZWFmKG5vZGUpKSB7Ci0gICAgcmV0dXJuIDA7ICAgLy8gdHJ5aW5nIHRvIGFzc2lnbiBhIHN5bWJvbCB0byBhbHJlYWR5IHVzZWQgY29kZS4KLSAgfQotICBub2RlLT5zeW1ib2xfID0gc3ltYm9sOyAgLy8gQWRkIHN5bWJvbCBpbiB0aGlzIG5vZGUuCi0gIHJldHVybiAxOwotfQotCi1pbnQgSHVmZm1hblRyZWVCdWlsZEltcGxpY2l0KEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfbGVuZ3Roc19zaXplKSB7Ci0gIGludCBzeW1ib2w7Ci0gIGludCBudW1fc3ltYm9scyA9IDA7Ci0gIGludCByb290X3N5bWJvbCA9IDA7Ci0KLSAgU0JfRENIRUNLKHRyZWUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhjb2RlX2xlbmd0aHMgIT0gTlVMTCk7Ci0KLSAgLy8gRmluZCBvdXQgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHRoZSByb290IHN5bWJvbC4KLSAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKLSAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiAwKSB7Ci0gICAgICAvLyBOb3RlOiBjb2RlIGxlbmd0aCA9IDAgaW5kaWNhdGVzIG5vbi1leGlzdGVudCBzeW1ib2wuCi0gICAgICArK251bV9zeW1ib2xzOwotICAgICAgcm9vdF9zeW1ib2wgPSBzeW1ib2w7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgdHJlZS4gV2lsbCBmYWlsIGZvciBudW1fc3ltYm9scyA9IDAKLSAgaWYgKCFUcmVlSW5pdCh0cmVlLCBudW1fc3ltYm9scykpIHJldHVybiAwOwotCi0gIC8vIEJ1aWxkIHRyZWUuCi0gIGlmIChudW1fc3ltYm9scyA9PSAxKSB7ICAvLyBUcml2aWFsIGNhc2UuCi0gICAgY29uc3QgaW50IG1heF9zeW1ib2wgPSBjb2RlX2xlbmd0aHNfc2l6ZTsKLSAgICBpZiAocm9vdF9zeW1ib2wgPCAwIHx8IHJvb3Rfc3ltYm9sID49IG1heF9zeW1ib2wpIHsKLSAgICAgIEh1ZmZtYW5UcmVlUmVsZWFzZSh0cmVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gVHJlZUFkZFN5bWJvbCh0cmVlLCByb290X3N5bWJvbCwgMCwgMCk7Ci0gIH0gZWxzZSB7ICAvLyBOb3JtYWwgY2FzZS4KLSAgICBpbnQgb2sgPSAwOwotCi0gICAgLy8gR2V0IEh1ZmZtYW4gY29kZXMgZnJvbSB0aGUgY29kZSBsZW5ndGhzLgotICAgIGludCogY29uc3QgY29kZXMgPQotICAgICAgICAoaW50KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpY29kZV9sZW5ndGhzX3NpemUsIHNpemVvZigqY29kZXMpKTsKLSAgICBpZiAoY29kZXMgPT0gTlVMTCkgZ290byBFbmQ7Ci0KLSAgICBpZiAoIUh1ZmZtYW5Db2RlTGVuZ3Roc1RvQ29kZXMoY29kZV9sZW5ndGhzLCBjb2RlX2xlbmd0aHNfc2l6ZSwgY29kZXMpKSB7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0KLSAgICAvLyBBZGQgc3ltYm9scyBvbmUtYnktb25lLgotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7Ci0gICAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiAwKSB7Ci0gICAgICAgIGlmICghVHJlZUFkZFN5bWJvbCh0cmVlLCBzeW1ib2wsIGNvZGVzW3N5bWJvbF0sIGNvZGVfbGVuZ3Roc1tzeW1ib2xdKSkgewotICAgICAgICAgIGdvdG8gRW5kOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG9rID0gMTsKLSBFbmQ6Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGNvZGVzKTsKLSAgICBvayA9IG9rICYmIElzRnVsbCh0cmVlKTsKLSAgICBpZiAoIW9rKSBIdWZmbWFuVHJlZVJlbGVhc2UodHJlZSk7Ci0gICAgcmV0dXJuIG9rOwotICB9Ci19Ci0KLWludCBIdWZmbWFuVHJlZUJ1aWxkRXhwbGljaXQoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IHN5bWJvbHMsIGludCBtYXhfc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N5bWJvbHMpIHsKLSAgaW50IG9rID0gMDsKLSAgaW50IGk7Ci0KLSAgU0JfRENIRUNLKHRyZWUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhjb2RlX2xlbmd0aHMgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhjb2RlcyAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKHN5bWJvbHMgIT0gTlVMTCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgdHJlZS4gV2lsbCBmYWlsIGlmIG51bV9zeW1ib2xzID0gMC4KLSAgaWYgKCFUcmVlSW5pdCh0cmVlLCBudW1fc3ltYm9scykpIHJldHVybiAwOwotCi0gIC8vIEFkZCBzeW1ib2xzIG9uZS1ieS1vbmUuCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7Ci0gICAgaWYgKGNvZGVzW2ldICE9IE5PTl9FWElTVEVOVF9TWU1CT0wpIHsKLSAgICAgIGlmIChzeW1ib2xzW2ldIDwgMCB8fCBzeW1ib2xzW2ldID49IG1heF9zeW1ib2wpIHsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIVRyZWVBZGRTeW1ib2wodHJlZSwgc3ltYm9sc1tpXSwgY29kZXNbaV0sIGNvZGVfbGVuZ3Roc1tpXSkpIHsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIG9rID0gMTsKLSBFbmQ6Ci0gIG9rID0gb2sgJiYgSXNGdWxsKHRyZWUpOwotICBpZiAoIW9rKSBIdWZmbWFuVHJlZVJlbGVhc2UodHJlZSk7Ci0gIHJldHVybiBvazsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTliN2QuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgYW5kIGxvb2tpbmcgdXAgSHVmZm1hbiB0cmVlcy4KLS8vCi0vLyBBdXRob3I6IFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9VVElMU19IVUZGTUFOX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfSFVGRk1BTl9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEEgbm9kZSBvZiBhIEh1ZmZtYW4gdHJlZS4KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHN5bWJvbF87Ci0gIGludCBjaGlsZHJlbl87ICAvLyBkZWx0YSBvZmZzZXQgdG8gYm90aCBjaGlsZHJlbiAoY29udGlndW91cykgb3IgMCBpZiBsZWFmLgotfSBIdWZmbWFuVHJlZU5vZGU7Ci0KLS8vIEh1ZmZtYW4gVHJlZS4KLXR5cGVkZWYgc3RydWN0IEh1ZmZtYW5UcmVlIEh1ZmZtYW5UcmVlOwotc3RydWN0IEh1ZmZtYW5UcmVlIHsKLSAgSHVmZm1hblRyZWVOb2RlKiByb290XzsgICAvLyBhbGwgdGhlIG5vZGVzLCBzdGFydGluZyBhdCByb290LgotICBpbnQgbWF4X25vZGVzXzsgICAgICAgICAgIC8vIG1heCBudW1iZXIgb2Ygbm9kZXMKLSAgaW50IG51bV9ub2Rlc187ICAgICAgICAgICAvLyBudW1iZXIgb2YgY3VycmVudGx5IG9jY3VwaWVkIG5vZGVzCi19OwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG5vZGUgaXMgYSBsZWFmIG9mIHRoZSBIdWZmbWFuIHRyZWUuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEh1ZmZtYW5UcmVlTm9kZUlzTGVhZigKLSAgICBjb25zdCBIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IG5vZGUpIHsKLSAgcmV0dXJuIChub2RlLT5jaGlsZHJlbl8gPT0gMCk7Ci19Ci0KLS8vIEdvIGRvd24gb25lIGxldmVsLiBNb3N0IGNyaXRpY2FsIGZ1bmN0aW9uLiAncmlnaHRfY2hpbGQnIG11c3QgYmUgMCBvciAxLgotc3RhdGljIFdFQlBfSU5MSU5FIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogSHVmZm1hblRyZWVOZXh0Tm9kZSgKLSAgICBjb25zdCBIdWZmbWFuVHJlZU5vZGUqIG5vZGUsIGludCByaWdodF9jaGlsZCkgewotICByZXR1cm4gbm9kZSArIG5vZGUtPmNoaWxkcmVuXyArIHJpZ2h0X2NoaWxkOwotfQotCi0vLyBSZWxlYXNlcyB0aGUgbm9kZXMgb2YgdGhlIEh1ZmZtYW4gdHJlZS4KLS8vIE5vdGU6IEl0IGRvZXMgTk9UIGZyZWUgJ3RyZWUnIGl0c2VsZi4KLXZvaWQgSHVmZm1hblRyZWVSZWxlYXNlKEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlKTsKLQotLy8gQnVpbGRzIEh1ZmZtYW4gdHJlZSBhc3N1bWluZyBjb2RlIGxlbmd0aHMgYXJlIGltcGxpY2l0bHkgaW4gc3ltYm9sIG9yZGVyLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHRyZWUgb3IgbWVtb3J5IGVycm9yKS4KLWludCBIdWZmbWFuVHJlZUJ1aWxkSW1wbGljaXQoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZV9sZW5ndGhzX3NpemUpOwotCi0vLyBCdWlsZCBhIEh1ZmZtYW4gdHJlZSB3aXRoIGV4cGxpY2l0bHkgZ2l2ZW4gbGlzdHMgb2YgY29kZSBsZW5ndGhzLCBjb2RlcwotLy8gYW5kIHN5bWJvbHMuIFZlcmlmaWVzIHRoYXQgYWxsIHN5bWJvbHMgYWRkZWQgYXJlIHNtYWxsZXIgdGhhbiBtYXhfc3ltYm9sLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGFuIGludmFsaWQgc3ltYm9sLCBpbnZhbGlkIHRyZWUgb3IgbWVtb3J5IGVycm9yLgotaW50IEh1ZmZtYW5UcmVlQnVpbGRFeHBsaWNpdChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3Qgc3ltYm9scywgaW50IG1heF9zeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fc3ltYm9scyk7Ci0KLS8vIFV0aWxpdHk6IGNvbnZlcnRzIEh1ZmZtYW4gY29kZSBsZW5ndGhzIHRvIGNvcnJlc3BvbmRpbmcgSHVmZm1hbiBjb2Rlcy4KLS8vICdodWZmX2NvZGVzJyBzaG91bGQgYmUgcHJlLWFsbG9jYXRlZC4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAobWVtb3J5IGFsbG9jYXRpb24sIGludmFsaWQgY29kZXMpLgotaW50IEh1ZmZtYW5Db2RlTGVuZ3Roc1RvQ29kZXMoY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZV9sZW5ndGhzX3NpemUsIGludCogY29uc3QgaHVmZl9jb2Rlcyk7Ci0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV0VCUF9VVElMU19IVUZGTUFOX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzU5NGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRPRE8oc2thbCk6IGltcGxlbWVudCBncmFkaWVudCBzbW9vdGhpbmcuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgIi4vcXVhbnRfbGV2ZWxzX2RlYy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotaW50IERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuIDA7Ci0gICh2b2lkKWRhdGE7Ci0gICh2b2lkKXdpZHRoOwotICAodm9pZCloZWlnaHQ7Ci0gIHJldHVybiAxOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MTA2Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQWxwaGEgcGxhbmUgZGUtcXVhbnRpemF0aW9uIHV0aWxpdHkKLS8vCi0vLyBBdXRob3I6ICBWaWthcyBBcm9yYSAodmlrYXNhQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19IXwotCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gQXBwbHkgcG9zdC1wcm9jZXNzaW5nIHRvIGlucHV0ICdkYXRhJyBvZiBzaXplICd3aWR0aCd4J2hlaWdodCcgYXNzdW1pbmcKLS8vIHRoYXQgdGhlIHNvdXJjZSB3YXMgcXVhbnRpemVkIHRvIGEgcmVkdWNlZCBudW1iZXIgb2YgbGV2ZWxzLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChkYXRhIGlzIE5VTEwsIGludmFsaWQgcGFyYW1ldGVycywgLi4uKS4KLWludCBEZXF1YW50aXplTGV2ZWxzKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZGRjMjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICIuL3Jlc2NhbGVyLmgiCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFJGSVggMzAKLSNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgoaW50NjRfdCkoeCkgKiAoeSkgKyAoMSA8PCAoUkZJWCAtIDEpKSkgPj4gUkZJWCkKLQotdm9pZCBXZWJQUmVzY2FsZXJJbml0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLCBpbnQgbnVtX2NoYW5uZWxzLCBpbnQgeF9hZGQsIGludCB4X3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9hZGQsIGludCB5X3N1YiwgaW50MzJfdCogY29uc3Qgd29yaykgewotICB3cmstPnhfZXhwYW5kID0gKHNyY193aWR0aCA8IGRzdF93aWR0aCk7Ci0gIHdyay0+c3JjX3dpZHRoID0gc3JjX3dpZHRoOwotICB3cmstPnNyY19oZWlnaHQgPSBzcmNfaGVpZ2h0OwotICB3cmstPmRzdF93aWR0aCA9IGRzdF93aWR0aDsKLSAgd3JrLT5kc3RfaGVpZ2h0ID0gZHN0X2hlaWdodDsKLSAgd3JrLT5kc3QgPSBkc3Q7Ci0gIHdyay0+ZHN0X3N0cmlkZSA9IGRzdF9zdHJpZGU7Ci0gIHdyay0+bnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOwotICAvLyBmb3IgJ3hfZXhwYW5kJywgd2UgdXNlIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgd3JrLT54X2FkZCA9IHdyay0+eF9leHBhbmQgPyAoeF9zdWIgLSAxKSA6IHhfYWRkIC0geF9zdWI7Ci0gIHdyay0+eF9zdWIgPSB3cmstPnhfZXhwYW5kID8gKHhfYWRkIC0gMSkgOiB4X3N1YjsKLSAgd3JrLT55X2FjY3VtID0geV9hZGQ7Ci0gIHdyay0+eV9hZGQgPSB5X2FkZDsKLSAgd3JrLT55X3N1YiA9IHlfc3ViOwotICB3cmstPmZ4X3NjYWxlID0gKDEgPDwgUkZJWCkgLyB4X3N1YjsKLSAgd3JrLT5meV9zY2FsZSA9ICgxIDw8IFJGSVgpIC8geV9zdWI7Ci0gIHdyay0+Znh5X3NjYWxlID0gd3JrLT54X2V4cGFuZCA/Ci0gICAgICAoKGludDY0X3QpZHN0X2hlaWdodCA8PCBSRklYKSAvICh4X3N1YiAqIHNyY19oZWlnaHQpIDoKLSAgICAgICgoaW50NjRfdClkc3RfaGVpZ2h0IDw8IFJGSVgpIC8gKHhfYWRkICogc3JjX2hlaWdodCk7Ci0gIHdyay0+aXJvdyA9IHdvcms7Ci0gIHdyay0+ZnJvdyA9IHdvcmsgKyBudW1fY2hhbm5lbHMgKiBkc3Rfd2lkdGg7Ci19Ci0KLXZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBpbnQgY2hhbm5lbCkgewotICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKLSAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7Ci0gIGludCB4X2luID0gY2hhbm5lbDsKLSAgaW50IHhfb3V0OwotICBpbnQgYWNjdW0gPSAwOwotICBpZiAoIXdyay0+eF9leHBhbmQpIHsKLSAgICBpbnQgc3VtID0gMDsKLSAgICBmb3IgKHhfb3V0ID0gY2hhbm5lbDsgeF9vdXQgPCB4X291dF9tYXg7IHhfb3V0ICs9IHhfc3RyaWRlKSB7Ci0gICAgICBhY2N1bSArPSB3cmstPnhfYWRkOwotICAgICAgZm9yICg7IGFjY3VtID4gMDsgYWNjdW0gLT0gd3JrLT54X3N1YikgewotICAgICAgICBzdW0gKz0gc3JjW3hfaW5dOwotICAgICAgICB4X2luICs9IHhfc3RyaWRlOwotICAgICAgfQotICAgICAgeyAgICAgICAgLy8gRW1pdCBuZXh0IGhvcml6b250YWwgcGl4ZWwuCi0gICAgICAgIGNvbnN0IGludDMyX3QgYmFzZSA9IHNyY1t4X2luXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCBmcmFjID0gYmFzZSAqICgtYWNjdW0pOwotICAgICAgICB4X2luICs9IHhfc3RyaWRlOwotICAgICAgICB3cmstPmZyb3dbeF9vdXRdID0gKHN1bSArIGJhc2UpICogd3JrLT54X3N1YiAtIGZyYWM7Ci0gICAgICAgIC8vIGZyZXNoIGZyYWN0aW9uYWwgc3RhcnQgZm9yIG5leHQgcGl4ZWwKLSAgICAgICAgc3VtID0gKGludClNVUxUX0ZJWChmcmFjLCB3cmstPmZ4X3NjYWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7ICAgICAgICAvLyBzaW1wbGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIGludCBsZWZ0ID0gc3JjW2NoYW5uZWxdLCByaWdodCA9IHNyY1tjaGFubmVsXTsKLSAgICBmb3IgKHhfb3V0ID0gY2hhbm5lbDsgeF9vdXQgPCB4X291dF9tYXg7IHhfb3V0ICs9IHhfc3RyaWRlKSB7Ci0gICAgICBpZiAoYWNjdW0gPCAwKSB7Ci0gICAgICAgIGxlZnQgPSByaWdodDsKLSAgICAgICAgeF9pbiArPSB4X3N0cmlkZTsKLSAgICAgICAgcmlnaHQgPSBzcmNbeF9pbl07Ci0gICAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7Ci0gICAgICB9Ci0gICAgICB3cmstPmZyb3dbeF9vdXRdID0gcmlnaHQgKiB3cmstPnhfYWRkICsgKGxlZnQgLSByaWdodCkgKiBhY2N1bTsKLSAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7Ci0gICAgfQotICB9Ci0gIC8vIEFjY3VtdWxhdGUgdGhlIG5ldyByb3cncyBjb250cmlidXRpb24KLSAgZm9yICh4X291dCA9IGNoYW5uZWw7IHhfb3V0IDwgeF9vdXRfbWF4OyB4X291dCArPSB4X3N0cmlkZSkgewotICAgIHdyay0+aXJvd1t4X291dF0gKz0gd3JrLT5mcm93W3hfb3V0XTsKLSAgfQotfQotCi11aW50OF90KiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKLSAgaWYgKHdyay0+eV9hY2N1bSA8PSAwKSB7Ci0gICAgaW50IHhfb3V0OwotICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OwotICAgIGludDMyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7Ci0gICAgY29uc3QgaW50MzJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKLSAgICBjb25zdCBpbnQgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKLSAgICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKLQotICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgewotICAgICAgY29uc3QgaW50IGZyYWMgPSAoaW50KU1VTFRfRklYKGZyb3dbeF9vdXRdLCB5c2NhbGUpOwotICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOwotICAgICAgZHN0W3hfb3V0XSA9ICghKHYgJiB+MHhmZikpID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OwotICAgICAgaXJvd1t4X291dF0gPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0Ci0gICAgfQotICAgIHdyay0+eV9hY2N1bSArPSB3cmstPnlfYWRkOwotICAgIHdyay0+ZHN0ICs9IHdyay0+ZHN0X3N0cmlkZTsKLSAgICByZXR1cm4gZHN0OwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLSN1bmRlZiBNVUxUX0ZJWAotI3VuZGVmIFJGSVgKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGFsbC1pbi1vbmUgY2FsbHMKLQotaW50IFdlYlBSZXNjYWxlckltcG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IG51bV9saW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSkgewotICBpbnQgdG90YWxfaW1wb3J0ZWQgPSAwOwotICB3aGlsZSAodG90YWxfaW1wb3J0ZWQgPCBudW1fbGluZXMgJiYgd3JrLT55X2FjY3VtID4gMCkgewotICAgIGludCBjaGFubmVsOwotICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB3cmstPm51bV9jaGFubmVsczsgKytjaGFubmVsKSB7Ci0gICAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3cod3JrLCBzcmMsIGNoYW5uZWwpOwotICAgIH0KLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICArK3RvdGFsX2ltcG9ydGVkOwotICAgIHdyay0+eV9hY2N1bSAtPSB3cmstPnlfc3ViOwotICB9Ci0gIHJldHVybiB0b3RhbF9pbXBvcnRlZDsKLX0KLQotaW50IFdlYlBSZXNjYWxlckV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7Ci0gIGludCB0b3RhbF9leHBvcnRlZCA9IDA7Ci0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgewotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7Ci0gICAgKyt0b3RhbF9leHBvcnRlZDsKLSAgfQotICByZXR1cm4gdG90YWxfZXhwb3J0ZWQ7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGNlNDYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBSZXNjYWxpbmcgZnVuY3Rpb25zCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1JFU0NBTEVSX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfUkVTQ0FMRVJfSF8KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLS8vIFN0cnVjdHVyZSB1c2VkIGZvciBvbi10aGUtZmx5IHJlc2NhbGluZwotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgeF9leHBhbmQ7ICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB3ZSdyZSBleHBhbmRpbmcgaW4gdGhlIHggZGlyZWN0aW9uCi0gIGludCBudW1fY2hhbm5lbHM7ICAgICAgICAgICAvLyBieXRlcyB0byBqdW1wIGJldHdlZW4gcGl4ZWxzCi0gIGludCBmeV9zY2FsZSwgZnhfc2NhbGU7ICAgICAvLyBmaXhlZC1wb2ludCBzY2FsaW5nIGZhY3RvcgotICBpbnQ2NF90IGZ4eV9zY2FsZTsgICAgICAgICAgLy8gJycKLSAgLy8gd2UgbmVlZCBocGVsLXByZWNpc2UgYWRkL3N1YiBpbmNyZW1lbnRzLCBmb3IgdGhlIGRvd25zYW1wbGVkIFUvViBwbGFuZXMuCi0gIGludCB5X2FjY3VtOyAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBhY2N1bXVsYXRvcgotICBpbnQgeV9hZGQsIHlfc3ViOyAgICAgICAgICAgLy8gdmVydGljYWwgaW5jcmVtZW50cyAoYWRkIH49IHNyYywgc3ViIH49IGRzdCkKLSAgaW50IHhfYWRkLCB4X3N1YjsgICAgICAgICAgIC8vIGhvcml6b250YWwgaW5jcmVtZW50cyAoYWRkIH49IHNyYywgc3ViIH49IGRzdCkKLSAgaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgIC8vIHNvdXJjZSBkaW1lbnNpb25zCi0gIGludCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQ7ICAvLyBkZXN0aW5hdGlvbiBkaW1lbnNpb25zCi0gIHVpbnQ4X3QqIGRzdDsKLSAgaW50IGRzdF9zdHJpZGU7Ci0gIGludDMyX3QqIGlyb3csICpmcm93OyAgICAgICAvLyB3b3JrIGJ1ZmZlcgotfSBXZWJQUmVzY2FsZXI7Ci0KLS8vIEluaXRpYWxpemUgYSByZXNjYWxlciBnaXZlbiBzY3JhdGNoIGFyZWEgJ3dvcmsnIGFuZCBkaW1lbnNpb25zIG9mIHNyYyAmIGRzdC4KLXZvaWQgV2ViUFJlc2NhbGVySW5pdChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LAotICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGludCB4X2FkZCwgaW50IHhfc3ViLAotICAgICAgICAgICAgICAgICAgICAgIGludCB5X2FkZCwgaW50IHlfc3ViLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbnN0IHdvcmspOwotCi0vLyBJbXBvcnQgYSByb3cgb2YgZGF0YSBhbmQgc2F2ZSBpdHMgY29udHJpYnV0aW9uIGluIHRoZSByZXNjYWxlci4KLS8vICdjaGFubmVsJyBkZW5vdGVzIHRoZSBjaGFubmVsIG51bWJlciB0byBiZSBpbXBvcnRlZC4KLXZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBjaGFubmVsKTsKLQotLy8gSW1wb3J0IG11bHRpcGxlIHJvd3Mgb3ZlciBhbGwgY2hhbm5lbHMsIHVudGlsIGF0IGxlYXN0IG9uZSByb3cgaXMgcmVhZHkgdG8KLS8vIGJlIGV4cG9ydGVkLiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxpbmVzIHRoYXQgd2VyZSBpbXBvcnRlZC4KLWludCBXZWJQUmVzY2FsZXJJbXBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlKTsKLQotLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgcGVuZGluZyBvdXRwdXQgcm93cyByZWFkeS4KLXN0YXRpYyBXRUJQX0lOTElORQotaW50IFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgewotICByZXR1cm4gKHJlc2NhbGVyLT55X2FjY3VtIDw9IDApOwotfQotCi0vLyBFeHBvcnQgb25lIHJvdyBmcm9tIHJlc2NhbGVyLiBSZXR1cm5zIHRoZSBwb2ludGVyIHdoZXJlIG91dHB1dCB3YXMgd3JpdHRlbiwKLS8vIG9yIE5VTEwgaWYgbm8gcm93IHdhcyBwZW5kaW5nLgotdWludDhfdCogV2ViUFJlc2NhbGVyRXhwb3J0Um93KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKLQotLy8gRXhwb3J0IGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZS4gUmV0dXJuIHRoZSBudW1iZXJzIG9mIHJvd3Mgd3JpdHRlbi4KLWludCBXZWJQUmVzY2FsZXJFeHBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX1JFU0NBTEVSX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy90aHJlYWQuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQwM2E4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNdWx0aS10aHJlYWRlZCB3b3JrZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgU2JNZW1vcnlTZXQoKQotI2VuZGlmCi0jaW5jbHVkZSAiLi90aHJlYWQuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc2ltcGxpc3RpYyBwdGhyZWFkIGVtdWxhdGlvbiBsYXllcgotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0vLyBfYmVnaW50aHJlYWRleCByZXF1aXJlcyBfX3N0ZGNhbGwKLSNkZWZpbmUgVEhSRUFERk4gdW5zaWduZWQgaW50IF9fc3RkY2FsbAotI2RlZmluZSBUSFJFQURfUkVUVVJOKHZhbCkgKHVuc2lnbmVkIGludCkoKERXT1JEX1BUUil2YWwpCi0KLXN0YXRpYyBpbnQgcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiBjb25zdCB0aHJlYWQsIGNvbnN0IHZvaWQqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoX19zdGRjYWxsICpzdGFydCkodm9pZCopLCB2b2lkKiBhcmcpIHsKLSAgKHZvaWQpYXR0cjsKLSAgKnRocmVhZCA9IChwdGhyZWFkX3QpX2JlZ2ludGhyZWFkZXgoTlVMTCwgICAvKiB2b2lkICpzZWN1cml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIHN0YWNrX3NpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiB1bnNpZ25lZCBpbml0ZmxhZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8qIHVuc2lnbmVkICp0aHJkYWRkciAqLwotICBpZiAoKnRocmVhZCA9PSBOVUxMKSByZXR1cm4gMTsKLSAgU2V0VGhyZWFkUHJpb3JpdHkoKnRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX0FCT1ZFX05PUk1BTCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkKiogdmFsdWVfcHRyKSB7Ci0gICh2b2lkKXZhbHVlX3B0cjsKLSAgcmV0dXJuIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpICE9IFdBSVRfT0JKRUNUXzAgfHwKLSAgICAgICAgICBDbG9zZUhhbmRsZSh0aHJlYWQpID09IDApOwotfQotCi0vLyBNdXRleAotc3RhdGljIGludCBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCwgdm9pZCogbXV0ZXhhdHRyKSB7Ci0gICh2b2lkKW11dGV4YXR0cjsKLSAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgewotICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBDb25kaXRpb24KLXN0YXRpYyBpbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbikgewotICBpbnQgb2sgPSAxOwotICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8pICE9IDApOwotICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fKSAhPSAwKTsKLSAgb2sgJj0gKENsb3NlSGFuZGxlKGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XykgIT0gMCk7Ci0gIHJldHVybiAhb2s7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwgdm9pZCogY29uZF9hdHRyKSB7Ci0gICh2b2lkKWNvbmRfYXR0cjsKLSAgY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMSwgTlVMTCk7Ci0gIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKLSAgY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKLSAgaWYgKGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fID09IE5VTEwgfHwKLSAgICAgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9PSBOVUxMIHx8Ci0gICAgICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPT0gTlVMTCkgewotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KGNvbmRpdGlvbik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7Ci0gIGludCBvayA9IDE7Ci0gIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fLCAwKSA9PSBXQUlUX09CSkVDVF8wKSB7Ci0gICAgLy8gYSB0aHJlYWQgaXMgd2FpdGluZyBpbiBwdGhyZWFkX2NvbmRfd2FpdDogYWxsb3cgaXQgdG8gYmUgbm90aWZpZWQKLSAgICBvayA9IFNldEV2ZW50KGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50Xyk7Ci0gICAgLy8gd2FpdCB1bnRpbCB0aGUgZXZlbnQgaXMgY29uc3VtZWQgc28gdGhlIHNpZ25hbGVyIGNhbm5vdCBjb25zdW1lCi0gICAgLy8gdGhlIGV2ZW50IHZpYSBpdHMgb3duIHB0aHJlYWRfY29uZF93YWl0LgotICAgIG9rICY9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXywgSU5GSU5JVEUpICE9Ci0gICAgICAgICAgIFdBSVRfT0JKRUNUXzApOwotICB9Ci0gIHJldHVybiAhb2s7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgewotICBpbnQgb2s7Ci0gIC8vIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbnN1bWVyIGF2YWlsYWJsZSBzbyB0aGUgc2lnbmFsIGlzbid0IGRyb3BwZWQgaW4KLSAgLy8gcHRocmVhZF9jb25kX3NpZ25hbAotICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDEsIE5VTEwpKQotICAgIHJldHVybiAxOwotICAvLyBub3cgdW5sb2NrIHRoZSBtdXRleCBzbyBwdGhyZWFkX2NvbmRfc2lnbmFsIG1heSBiZSBpc3N1ZWQKLSAgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOwotICBvayA9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XywgSU5GSU5JVEUpID09Ci0gICAgICAgIFdBSVRfT0JKRUNUXzApOwotICBvayAmPSBSZWxlYXNlU2VtYXBob3JlKGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXywgMSwgTlVMTCk7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7Ci0gIHJldHVybiAhb2s7Ci19Ci0KLSNlbHNlICAvLyBfV0lOMzIKLSMgZGVmaW5lIFRIUkVBREZOIHZvaWQqCi0jIGRlZmluZSBUSFJFQURfUkVUVVJOKHZhbCkgdmFsCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFRIUkVBREZOIFdlYlBXb3JrZXJUaHJlYWRMb29wKHZvaWQgKnB0cikgeyAgICAvLyB0aHJlYWQgbG9vcAotICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAoV2ViUFdvcmtlciopcHRyOwotICBpbnQgZG9uZSA9IDA7Ci0gIHdoaWxlICghZG9uZSkgewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd29ya2VyLT5tdXRleF8pOwotICAgIHdoaWxlICh3b3JrZXItPnN0YXR1c18gPT0gT0spIHsgICAvLyB3YWl0IGluIGlkbGluZyBtb2RlCi0gICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmd29ya2VyLT5jb25kaXRpb25fLCAmd29ya2VyLT5tdXRleF8pOwotICAgIH0KLSAgICBpZiAod29ya2VyLT5zdGF0dXNfID09IFdPUkspIHsKLSAgICAgIGlmICh3b3JrZXItPmhvb2spIHsKLSAgICAgICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKLSAgICAgIH0KLSAgICAgIHdvcmtlci0+c3RhdHVzXyA9IE9LOwotICAgIH0gZWxzZSBpZiAod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSykgeyAgIC8vIGZpbmlzaCB0aGUgd29ya2VyCi0gICAgICBkb25lID0gMTsKLSAgICB9Ci0gICAgLy8gc2lnbmFsIHRvIHRoZSBtYWluIHRocmVhZCB0aGF0IHdlJ3JlIGRvbmUgKGZvciBTeW5jKCkpCi0gICAgcHRocmVhZF9jb25kX3NpZ25hbCgmd29ya2VyLT5jb25kaXRpb25fKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyLT5tdXRleF8pOwotICB9Ci0gIHJldHVybiBUSFJFQURfUkVUVVJOKE5VTEwpOyAgICAvLyBUaHJlYWQgaXMgZmluaXNoZWQKLX0KLQotLy8gbWFpbiB0aHJlYWQgc3RhdGUgY29udHJvbAotc3RhdGljIHZvaWQgV2ViUFdvcmtlckNoYW5nZVN0YXRlKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQV29ya2VyU3RhdHVzIG5ld19zdGF0dXMpIHsKLSAgLy8gbm8tb3Agd2hlbiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBzdGF0ZSBvbiBhIHRocmVhZCB0aGF0IGRpZG4ndCBjb21lIHVwCi0gIGlmICh3b3JrZXItPnN0YXR1c18gPCBPSykgcmV0dXJuOwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmd29ya2VyLT5tdXRleF8pOwotICAvLyB3YWl0IGZvciB0aGUgd29ya2VyIHRvIGZpbmlzaAotICB3aGlsZSAod29ya2VyLT5zdGF0dXNfICE9IE9LKSB7Ci0gICAgcHRocmVhZF9jb25kX3dhaXQoJndvcmtlci0+Y29uZGl0aW9uXywgJndvcmtlci0+bXV0ZXhfKTsKLSAgfQotICAvLyBhc3NpZ24gbmV3IHN0YXR1cyBhbmQgcmVsZWFzZSB0aGUgd29ya2luZyB0aHJlYWQgaWYgbmVlZGVkCi0gIGlmIChuZXdfc3RhdHVzICE9IE9LKSB7Ci0gICAgd29ya2VyLT5zdGF0dXNfID0gbmV3X3N0YXR1czsKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3b3JrZXItPmNvbmRpdGlvbl8pOwotICB9Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci19Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFdlYlBXb3JrZXJJbml0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgewotICBTYk1lbW9yeVNldCh3b3JrZXIsIDAsIHNpemVvZigqd29ya2VyKSk7Ci0gIHdvcmtlci0+c3RhdHVzXyA9IE5PVF9PSzsKLX0KLQotaW50IFdlYlBXb3JrZXJTeW5jKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgewotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotICBXZWJQV29ya2VyQ2hhbmdlU3RhdGUod29ya2VyLCBPSyk7Ci0jZW5kaWYKLSAgU0JfRENIRUNLKHdvcmtlci0+c3RhdHVzXyA8PSBPSyk7Ci0gIHJldHVybiAhd29ya2VyLT5oYWRfZXJyb3I7Ci19Ci0KLWludCBXZWJQV29ya2VyUmVzZXQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0gIGludCBvayA9IDE7Ci0gIHdvcmtlci0+aGFkX2Vycm9yID0gMDsKLSAgaWYgKHdvcmtlci0+c3RhdHVzXyA8IE9LKSB7Ci0jaWZkZWYgV0VCUF9VU0VfVEhSRUFECi0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmd29ya2VyLT5tdXRleF8sIE5VTEwpIHx8Ci0gICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZ3b3JrZXItPmNvbmRpdGlvbl8sIE5VTEwpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gICAgb2sgPSAhcHRocmVhZF9jcmVhdGUoJndvcmtlci0+dGhyZWFkXywgTlVMTCwgV2ViUFdvcmtlclRocmVhZExvb3AsIHdvcmtlcik7Ci0gICAgaWYgKG9rKSB3b3JrZXItPnN0YXR1c18gPSBPSzsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyLT5tdXRleF8pOwotI2Vsc2UKLSAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKLSNlbmRpZgotICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA+IE9LKSB7Ci0gICAgb2sgPSBXZWJQV29ya2VyU3luYyh3b3JrZXIpOwotICB9Ci0gIFNCX0RDSEVDSyghb2sgfHwgKHdvcmtlci0+c3RhdHVzXyA9PSBPSykpOwotICByZXR1cm4gb2s7Ci19Ci0KLXZvaWQgV2ViUFdvcmtlckxhdW5jaChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgV2ViUFdvcmtlckNoYW5nZVN0YXRlKHdvcmtlciwgV09SSyk7Ci0jZWxzZQotICBpZiAod29ya2VyLT5ob29rKQotICAgIHdvcmtlci0+aGFkX2Vycm9yIHw9ICF3b3JrZXItPmhvb2sod29ya2VyLT5kYXRhMSwgd29ya2VyLT5kYXRhMik7Ci0jZW5kaWYKLX0KLQotdm9pZCBXZWJQV29ya2VyRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgewotICBpZiAod29ya2VyLT5zdGF0dXNfID49IE9LKSB7Ci0jaWZkZWYgV0VCUF9VU0VfVEhSRUFECi0gICAgV2ViUFdvcmtlckNoYW5nZVN0YXRlKHdvcmtlciwgTk9UX09LKTsKLSAgICBwdGhyZWFkX2pvaW4od29ya2VyLT50aHJlYWRfLCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJndvcmtlci0+bXV0ZXhfKTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmd29ya2VyLT5jb25kaXRpb25fKTsKLSNlbHNlCi0gICAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOwotI2VuZGlmCi0gIH0KLSAgU0JfRENIRUNLKHdvcmtlci0+c3RhdHVzXyA9PSBOT1RfT0spOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3RocmVhZC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTYxYTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTXVsdGktdGhyZWFkZWQgd29ya2VyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1RIUkVBRF9IXwotI2RlZmluZSBXRUJQX1VUSUxTX1RIUkVBRF9IXwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgV0VCUF9VU0VfVEhSRUFECi0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLXR5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKLXR5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiBwdGhyZWFkX211dGV4X3Q7Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIEhBTkRMRSB3YWl0aW5nX3NlbV87Ci0gIEhBTkRMRSByZWNlaXZlZF9zZW1fOwotICBIQU5ETEUgc2lnbmFsX2V2ZW50XzsKLX0gcHRocmVhZF9jb25kX3Q7Ci0KLSNlbHNlCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNlbmRpZiAgICAvKiBfV0lOMzIgKi8KLSNlbmRpZiAgICAvKiBXRUJQX1VTRV9USFJFQUQgKi8KLQotLy8gU3RhdGUgb2YgdGhlIHdvcmtlciB0aHJlYWQgb2JqZWN0Ci10eXBlZGVmIGVudW0gewotICBOT1RfT0sgPSAwLCAgIC8vIG9iamVjdCBpcyB1bnVzYWJsZQotICBPSywgICAgICAgICAgIC8vIHJlYWR5IHRvIHdvcmsKLSAgV09SSyAgICAgICAgICAvLyBidXN5IGZpbmlzaGluZyB0aGUgY3VycmVudCB0YXNrCi19IFdlYlBXb3JrZXJTdGF0dXM7Ci0KLS8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSB0aGUgd29ya2VyIHRocmVhZC4gVGFrZXMgdHdvIG9wYXF1ZSBwb2ludGVycyBhcwotLy8gYXJndW1lbnRzIChkYXRhMSBhbmQgZGF0YTIpLCBhbmQgc2hvdWxkIHJldHVybiBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotdHlwZWRlZiBpbnQgKCpXZWJQV29ya2VySG9vaykodm9pZCosIHZvaWQqKTsKLQotLy8gU3luY2hyb25pemUgb2JqZWN0IHVzZWQgdG8gbGF1bmNoIGpvYiBpbiB0aGUgd29ya2VyIHRocmVhZAotdHlwZWRlZiBzdHJ1Y3QgewotI2lmIFdFQlBfVVNFX1RIUkVBRAotICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfOwotICBwdGhyZWFkX2NvbmRfdCAgY29uZGl0aW9uXzsKLSAgcHRocmVhZF90ICAgICAgIHRocmVhZF87Ci0jZW5kaWYKLSAgV2ViUFdvcmtlclN0YXR1cyBzdGF0dXNfOwotICBXZWJQV29ya2VySG9vayBob29rOyAgICAvLyBob29rIHRvIGNhbGwKLSAgdm9pZCogZGF0YTE7ICAgICAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJwotICB2b2lkKiBkYXRhMjsgICAgICAgICAgICAvLyBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJwotICBpbnQgaGFkX2Vycm9yOyAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlIGxhc3QgY2FsbCB0byAnaG9vaycKLX0gV2ViUFdvcmtlcjsKLQotLy8gTXVzdCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kLgotdm9pZCBXZWJQV29ya2VySW5pdChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOwotLy8gTXVzdCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGFuZCBzcGF3biB0aGUgdGhyZWFkLiBSZS1lbnRyYW50LgotLy8gV2lsbCBwb3RlbnRpYWxseSBsYXVuY2ggdGhlIHRocmVhZC4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotaW50IFdlYlBXb3JrZXJSZXNldChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOwotLy8gTWFrZXMgc3VyZSB0aGUgcHJldmlvdXMgd29yayBpcyBmaW5pc2hlZC4gUmV0dXJucyB0cnVlIGlmIHdvcmtlci0+aGFkX2Vycm9yCi0vLyB3YXMgbm90IHNldCBhbmQgbm8gZXJyb3IgY29uZGl0aW9uIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHdvcmtpbmcgdGhyZWFkLgotaW50IFdlYlBXb3JrZXJTeW5jKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0vLyBUcmlnZ2VycyB0aGUgdGhyZWFkIHRvIGNhbGwgaG9vaygpIHdpdGggZGF0YTEgYW5kIGRhdGEyIGFyZ3VtZW50LiBUaGVzZQotLy8gaG9vay9kYXRhMS9kYXRhMiBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLAotLy8gYnV0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyd2FyZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIFdlYlBXb3JrZXJTeW5jKCkuCi12b2lkIFdlYlBXb3JrZXJMYXVuY2goV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKLS8vIEtpbGwgdGhlIHRocmVhZCBhbmQgdGVybWluYXRlIHRoZSBvYmplY3QuIFRvIHVzZSB0aGUgb2JqZWN0IGFnYWluLCBvbmUKLS8vIG11c3QgY2FsbCBXZWJQV29ya2VyUmVzZXQoKSBhZ2Fpbi4KLXZvaWQgV2ViUFdvcmtlckVuZChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX1RIUkVBRF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Njk3YzMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNaXNjLiBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ2hlY2tlZCBtZW1vcnkgYWxsb2NhdGlvbgotCi0vLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBvZiBubWVtYiAqIHNpemUuCi1zdGF0aWMgaW50IENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgewotICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gbm1lbWIgKiBzaXplOwotICBpZiAobm1lbWIgPT0gMCkgcmV0dXJuIDE7Ci0gIGlmICgodWludDY0X3Qpc2l6ZSA+IFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgLyBubWVtYikgcmV0dXJuIDA7Ci0gIGlmICh0b3RhbF9zaXplICE9IChzaXplX3QpdG90YWxfc2l6ZSkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi12b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOwotICBTQl9EQ0hFQ0sobm1lbWIgKiBzaXplID4gMCk7Ci0gIHJldHVybiBTYk1lbW9yeUFsbG9jYXRlKChzaXplX3QpKG5tZW1iICogc2l6ZSkpOwotfQotCi12b2lkKiBXZWJQU2FmZUNhbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOwotICBTQl9EQ0hFQ0sobm1lbWIgKiBzaXplID4gMCk7Ci0gIHJldHVybiBTYk1lbW9yeUNhbGxvYygoc2l6ZV90KW5tZW1iLCBzaXplKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1YzMzOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucwotLy8KLS8vIEF1dGhvcnM6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotLy8gICAgICAgICAgVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1VUSUxTX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfVVRJTFNfSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZW1vcnkgYWxsb2NhdGlvbgotCi0vLyBUaGlzIGlzIHRoZSBtYXhpbXVtIG1lbW9yeSBhbW91bnQgdGhhdCBsaWJ3ZWJwIHdpbGwgZXZlciB0cnkgdG8gYWxsb2NhdGUuCi0jZGVmaW5lIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgKDFVTEwgPDwgNDApCi0KLS8vIHNpemUtY2hlY2tpbmcgc2FmZSBtYWxsb2MvY2FsbG9jOiB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbm90IHRvbwotLy8gbGFyZ2UsIG9yIHJldHVybiBOVUxMLiBZb3UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZXNlIGZvciBjb25zdHJ1Y3RzIGxpa2UKLS8vIG1hbGxvYyhzaXplb2YoZm9vKSksIGJ1dCBvbmx5IGlmIHRoZXJlJ3MgcGljdHVyZS1kZXBlbmRlbnQgc2l6ZSBpbnZvbHZlZAotLy8gc29tZXdoZXJlIChsaWtlOiBtYWxsb2MobnVtX3BpeGVscyAqIHNpemVvZigqc29tZXRoaW5nKSkpLiBUaGF0J3Mgd2h5IHRoaXMKLS8vIHNhZmUgbWFsbG9jKCkgYm9ycm93cyB0aGUgc2lnbmF0dXJlIGZyb20gbWFsbG9jKCksIHBvaW50aW5nIGF0IHRoZSBkYW5nZXJvdXMKLS8vIHVuZGVybHlpbmcgbXVsdGlwbHkgaW52b2x2ZWQuCi12b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOwotLy8gTm90ZSB0aGF0IFdlYlBTYWZlQ2FsbG9jKCkgZXhwZWN0cyB0aGUgc2Vjb25kIGFyZ3VtZW50IHR5cGUgdG8gYmUgJ3NpemVfdCcKLS8vIGluIG9yZGVyIHRvIGZhdm9yIHRoZSAiU2JNZW1vcnlDYWxsb2MobnVtX2Zvbywgc2l6ZW9mKGZvbykpIiBwYXR0ZXJuLgotdm9pZCogV2ViUFNhZmVDYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlYWRpbmcvd3JpdGluZyBkYXRhLgotCi0vLyBSZWFkIDE2LCAyNCBvciAzMiBiaXRzIHN0b3JlZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRMRTE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKLSAgcmV0dXJuIChpbnQpKGRhdGFbMF0gPDwgMCkgfCAoZGF0YVsxXSA8PCA4KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRMRTI0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKLSAgcmV0dXJuIEdldExFMTYoZGF0YSkgfCAoZGF0YVsyXSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRMRTMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKLSAgcmV0dXJuICh1aW50MzJfdClHZXRMRTE2KGRhdGEpIHwgKEdldExFMTYoZGF0YSArIDIpIDw8IDE2KTsKLX0KLQotLy8gU3RvcmUgMTYsIDI0IG9yIDMyIGJpdHMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMTYodWludDhfdCogY29uc3QgZGF0YSwgaW50IHZhbCkgewotICBTQl9EQ0hFQ0sodmFsIDwgKDEgPDwgMTYpKTsKLSAgZGF0YVswXSA9ICh2YWwgPj4gMCk7Ci0gIGRhdGFbMV0gPSAodmFsID4+IDgpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTI0KHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB2YWwpIHsKLSAgU0JfRENIRUNLKHZhbCA8ICgxIDw8IDI0KSk7Ci0gIFB1dExFMTYoZGF0YSwgdmFsICYgMHhmZmZmKTsKLSAgZGF0YVsyXSA9ICh2YWwgPj4gMTYpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTMyKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHVpbnQzMl90IHZhbCkgewotICBQdXRMRTE2KGRhdGEsIChpbnQpKHZhbCAmIDB4ZmZmZikpOwotICBQdXRMRTE2KGRhdGEgKyAyLCAoaW50KSh2YWwgPj4gMTYpKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZW11eC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZW11eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NkNWQ2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZGVtdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRGVtdXggQVBJLgotLy8gRW5hYmxlcyBleHRyYWN0aW9uIG9mIGltYWdlIGFuZCBleHRlbmRlZCBmb3JtYXQgZGF0YSBmcm9tIFdlYlAgZmlsZXMuCi0KLS8vIENvZGUgRXhhbXBsZTogRGVtdXhpbmcgV2ViUCBkYXRhIHRvIGV4dHJhY3QgYWxsIHRoZSBmcmFtZXMsIElDQyBwcm9maWxlCi0vLyBhbmQgRVhJRi9YTVAgbWV0YWRhdGEuCi0vLwotLy8gICBXZWJQRGVtdXhlciogZGVtdXggPSBXZWJQRGVtdXgoJndlYnBfZGF0YSk7Ci0vLwotLy8gICB1aW50MzJfdCB3aWR0aCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKLS8vICAgdWludDMyX3QgaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKLS8vICAgLy8gLi4uIChHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZlYXR1cmVzIHByZXNlbnQgaW4gdGhlIFdlYlAgZmlsZSkuCi0vLyAgIHVpbnQzMl90IGZsYWdzID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpOwotLy8KLS8vICAgLy8gLi4uIChJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcykuCi0vLyAgIFdlYlBJdGVyYXRvciBpdGVyOwotLy8gICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXgsIDEsICZpdGVyKSkgewotLy8gICAgIGRvIHsKLS8vICAgICAgIC8vIC4uLiAoQ29uc3VtZSAnaXRlcic7IGUuZy4gRGVjb2RlICdpdGVyLmZyYWdtZW50JyB3aXRoIFdlYlBEZWNvZGUoKSwKLS8vICAgICAgIC8vIC4uLiBhbmQgZ2V0IG90aGVyIGZyYW1lIHByb3BlcnRpZXMgbGlrZSB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzIGV0Yy4KLS8vICAgICAgIC8vIC4uLiBzZWUgJ3N0cnVjdCBXZWJQSXRlcmF0b3InIGJlbG93IGZvciBtb3JlIGluZm8pLgotLy8gICAgIH0gd2hpbGUgKFdlYlBEZW11eE5leHRGcmFtZSgmaXRlcikpOwotLy8gICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7Ci0vLyAgIH0KLS8vCi0vLyAgIC8vIC4uLiAoRXh0cmFjdCBtZXRhZGF0YSkuCi0vLyAgIFdlYlBDaHVua0l0ZXJhdG9yIGNodW5rX2l0ZXI7Ci0vLyAgIGlmIChmbGFncyAmIElDQ1BfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJJQ0NQIiwgMSwgJmNodW5rX2l0ZXIpOwotLy8gICAvLyAuLi4gKENvbnN1bWUgdGhlIElDQyBwcm9maWxlIGluICdjaHVua19pdGVyLmNodW5rJykuCi0vLyAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKLS8vICAgaWYgKGZsYWdzICYgRVhJRl9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIkVYSUYiLCAxLCAmY2h1bmtfaXRlcik7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSB0aGUgRVhJRiBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgotLy8gICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7Ci0vLyAgIGlmIChmbGFncyAmIFhNUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIlhNUCAiLCAxLCAmY2h1bmtfaXRlcik7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSB0aGUgWE1QIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCi0vLyAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKLS8vICAgV2ViUERlbXV4RGVsZXRlKGRlbXV4KTsKLQotI2lmbmRlZiBXRUJQX1dFQlBfREVNVVhfSF8KLSNkZWZpbmUgV0VCUF9XRUJQX0RFTVVYX0hfCi0KLSNpbmNsdWRlICIuL211eF90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OIDB4MDEwMCAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKLQotLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKLS8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCi0vLyB0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgV2ViUERlbXV4U3RhdGU7Ci0vLyB0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgV2ViUEZvcm1hdEZlYXR1cmU7Ci10eXBlZGVmIHN0cnVjdCBXZWJQRGVtdXhlciBXZWJQRGVtdXhlcjsKLXR5cGVkZWYgc3RydWN0IFdlYlBJdGVyYXRvciBXZWJQSXRlcmF0b3I7Ci10eXBlZGVmIHN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciBXZWJQQ2h1bmtJdGVyYXRvcjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZwotLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTGlmZSBvZiBhIERlbXV4IG9iamVjdAotCi10eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgewotICBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSLCAgLy8gTm90IGVub3VnaCBkYXRhIHRvIHBhcnNlIGZ1bGwgaGVhZGVyLgotICBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVIsICAgLy8gSGVhZGVyIHBhcnNpbmcgY29tcGxldGUsIGRhdGEgbWF5IGJlIGF2YWlsYWJsZS4KLSAgV0VCUF9ERU1VWF9ET05FICAgICAgICAgICAgIC8vIEVudGlyZSBmaWxlIGhhcyBiZWVuIHBhcnNlZC4KLX0gV2ViUERlbXV4U3RhdGU7Ci0KLS8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihXZWJQRGVtdXhlciopIFdlYlBEZW11eEludGVybmFsKAotICAgIGNvbnN0IFdlYlBEYXRhKiwgaW50LCBXZWJQRGVtdXhTdGF0ZSosIGludCk7Ci0KLS8vIFBhcnNlcyB0aGUgZnVsbCBXZWJQIGZpbGUgZ2l2ZW4gYnkgJ2RhdGEnLgotLy8gUmV0dXJucyBhIFdlYlBEZW11eGVyIG9iamVjdCBvbiBzdWNjZXNzZnVsIHBhcnNlLCBOVUxMIG90aGVyd2lzZS4KLXN0YXRpYyBXRUJQX0lOTElORSBXZWJQRGVtdXhlciogV2ViUERlbXV4KGNvbnN0IFdlYlBEYXRhKiBkYXRhKSB7Ci0gIHJldHVybiBXZWJQRGVtdXhJbnRlcm5hbChkYXRhLCAwLCBOVUxMLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8gUGFyc2VzIHRoZSBwb3NzaWJseSBpbmNvbXBsZXRlIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuCi0vLyBJZiAnc3RhdGUnIGlzIG5vbi1OVUxMIGl0IHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIGRlbXV4ZXIuCi0vLyBSZXR1cm5zIGEgV2ViUERlbXV4ZXIgb2JqZWN0IG9uIHN1Y2Nlc3NmdWwgcGFyc2UsIE5VTEwgb3RoZXJ3aXNlLgotc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBEZW11eGVyKiBXZWJQRGVtdXhQYXJ0aWFsKAotICAgIGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBXZWJQRGVtdXhTdGF0ZSogc3RhdGUpIHsKLSAgcmV0dXJuIFdlYlBEZW11eEludGVybmFsKGRhdGEsIDEsIHN0YXRlLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8gRnJlZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnZG11eCcuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGF0YS9pbmZvcm1hdGlvbiBleHRyYWN0aW9uLgotCi10eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgewotICBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgIC8vIEV4dGVuZGVkIGZvcm1hdCBmbGFncyBwcmVzZW50IGluIHRoZSAnVlA4WCcgY2h1bmsuCi0gIFdFQlBfRkZfQ0FOVkFTX1dJRFRILAotICBXRUJQX0ZGX0NBTlZBU19IRUlHSFQsCi0gIFdFQlBfRkZfTE9PUF9DT1VOVCwKLSAgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLAotICBXRUJQX0ZGX0ZSQU1FX0NPVU5UICAgIC8vIE51bWJlciBvZiBmcmFtZXMgcHJlc2VudCBpbiB0aGUgZGVtdXggb2JqZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBwYXJ0aWFsIGRlbXV4LCB0aGlzIGlzIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgc2VlbiBzbyBmYXIsIHdpdGggdGhlIGxhc3QgZnJhbWUgcG9zc2libHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBwYXJ0aWFsLgotfSBXZWJQRm9ybWF0RmVhdHVyZTsKLQotLy8gR2V0IHRoZSAnZmVhdHVyZScgdmFsdWUgZnJvbSB0aGUgJ2RtdXgnLgotLy8gTk9URTogdmFsdWVzIGFyZSBvbmx5IHZhbGlkIGlmIFdlYlBEZW11eCgpIHdhcyB1c2VkIG9yIFdlYlBEZW11eFBhcnRpYWwoKQotLy8gcmV0dXJuZWQgYSBzdGF0ZSA+IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIuCi1XRUJQX0VYVEVSTih1aW50MzJfdCkgV2ViUERlbXV4R2V0SSgKLSAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGcmFtZSBpdGVyYXRpb24uCi0KLXN0cnVjdCBXZWJQSXRlcmF0b3IgewotICBpbnQgZnJhbWVfbnVtOwotICBpbnQgbnVtX2ZyYW1lczsgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBXRUJQX0ZGX0ZSQU1FX0NPVU5ULgotICBpbnQgZnJhZ21lbnRfbnVtOwotICBpbnQgbnVtX2ZyYWdtZW50czsKLSAgaW50IHhfb2Zmc2V0LCB5X29mZnNldDsgIC8vIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgY2FudmFzLgotICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgLy8gZGltZW5zaW9ucyBvZiB0aGlzIGZyYW1lIG9yIGZyYWdtZW50LgotICBpbnQgZHVyYXRpb247ICAgICAgICAgICAgLy8gZGlzcGxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0gIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZDsgIC8vIGRpc3Bvc2UgbWV0aG9kIGZvciB0aGUgZnJhbWUuCi0gIGludCBjb21wbGV0ZTsgICAvLyB0cnVlIGlmICdmcmFnbWVudCcgY29udGFpbnMgYSBmdWxsIGZyYW1lLiBwYXJ0aWFsIGltYWdlcwotICAgICAgICAgICAgICAgICAgLy8gbWF5IHN0aWxsIGJlIGRlY29kZWQgd2l0aCB0aGUgV2ViUCBpbmNyZW1lbnRhbCBkZWNvZGVyLgotICBXZWJQRGF0YSBmcmFnbWVudDsgIC8vIFRoZSBmcmFtZSBvciBmcmFnbWVudCBnaXZlbiBieSAnZnJhbWVfbnVtJyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAvLyAnZnJhZ21lbnRfbnVtJy4KLQotICB1aW50MzJfdCBwYWRbNF07ICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlLgotICB2b2lkKiBwcml2YXRlXzsgICAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LgotfTsKLQotLy8gUmV0cmlldmVzIGZyYW1lICdmcmFtZV9udW1iZXInIGZyb20gJ2RtdXgnLgotLy8gJ2l0ZXItPmZyYWdtZW50JyBwb2ludHMgdG8gdGhlIGZpcnN0IGZyYWdtZW50IG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCi0vLyBJbmRpdmlkdWFsIGZyYWdtZW50cyBtYXkgYmUgZXh0cmFjdGVkIHVzaW5nIFdlYlBEZW11eFNldEZyYWdtZW50KCkuCi0vLyBTZXR0aW5nICdmcmFtZV9udW1iZXInIGVxdWFsIHRvIDAgd2lsbCByZXR1cm4gdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGltYWdlLgotLy8gUmV0dXJucyBmYWxzZSBpZiAnZG11eCcgaXMgTlVMTCBvciBmcmFtZSAnZnJhbWVfbnVtYmVyJyBpcyBub3QgcHJlc2VudC4KLS8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgotLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mICdpdGVyJy4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4R2V0RnJhbWUoCi0gICAgY29uc3QgV2ViUERlbXV4ZXIqIGRtdXgsIGludCBmcmFtZV9udW1iZXIsIFdlYlBJdGVyYXRvciogaXRlcik7Ci0KLS8vIFNldHMgJ2l0ZXItPmZyYWdtZW50JyB0byBwb2ludCB0byB0aGUgbmV4dCAoJ2l0ZXItPmZyYW1lX251bScgKyAxKSBvcgotLy8gcHJldmlvdXMgKCdpdGVyLT5mcmFtZV9udW0nIC0gMSkgZnJhbWUuIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgbG9vcC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eE5leHRGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOwotV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhQcmV2RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKLQotLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHJlZmxlY3QgZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudF9udW0nLgotLy8gUmV0dXJucyB0cnVlIGlmIGZyYWdtZW50ICdmcmFnbWVudF9udW0nIGlzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lzZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4U2VsZWN0RnJhZ21lbnQoV2ViUEl0ZXJhdG9yKiBpdGVyLCBpbnQgZnJhZ21lbnRfbnVtKTsKLQotLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgotLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBEZW11eEdldENodW5rKCkgb24gdGhlIHNhbWUKLS8vIGl0ZXIuIEFsc28sIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKLS8vIFdlYlBEZW11eERlbGV0ZSgpLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKFdlYlBJdGVyYXRvciogaXRlcik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaHVuayBpdGVyYXRpb24uCi0KLXN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciB7Ci0gIC8vIFRoZSBjdXJyZW50IGFuZCB0b3RhbCBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhlIGZvdXJjYyBnaXZlbiB0bwotICAvLyBXZWJQRGVtdXhHZXRDaHVuaygpLgotICBpbnQgY2h1bmtfbnVtOwotICBpbnQgbnVtX2NodW5rczsKLSAgV2ViUERhdGEgY2h1bms7ICAgIC8vIFRoZSBwYXlsb2FkIG9mIHRoZSBjaHVuay4KLQotICB1aW50MzJfdCBwYWRbNl07ICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi0gIHZvaWQqIHByaXZhdGVfOwotfTsKLQotLy8gUmV0cmlldmVzIHRoZSAnY2h1bmtfbnVtYmVyJyBpbnN0YW5jZSBvZiB0aGUgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBmcm9tCi0vLyAnZG11eCcuCi0vLyAnZm91cmNjJyBpcyBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGNodW5rIHRvIHJldHVybiwKLS8vIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIsIGV0Yy4KLS8vIFNldHRpbmcgJ2NodW5rX251bWJlcicgZXF1YWwgdG8gMCB3aWxsIHJldHVybiB0aGUgbGFzdCBjaHVuayBpbiBhIHNldC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2h1bmsgaXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4gSW1hZ2UgcmVsYXRlZCBjaHVuawotLy8gcGF5bG9hZHMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggV2ViUERlbXV4R2V0RnJhbWUoKSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCi0vLyBDYWxsIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgotLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBpdGVyYXRvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4R2V0Q2h1bmsoY29uc3QgV2ViUERlbXV4ZXIqIGRtdXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci0KLS8vIFNldHMgJ2l0ZXItPmNodW5rJyB0byBwb2ludCB0byB0aGUgbmV4dCAoJ2l0ZXItPmNodW5rX251bScgKyAxKSBvciBwcmV2aW91cwotLy8gKCdpdGVyLT5jaHVua19udW0nIC0gMSkgY2h1bmsuIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgbG9vcC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eE5leHRDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eFByZXZDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci0KLS8vIFJlbGVhc2VzIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdpdGVyJy4KLS8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKLS8vIFdlYlBEZW11eERlbGV0ZSgpLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1dFQlBfREVNVVhfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL211eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM3ZGM2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBSSUZGIGNvbnRhaW5lciBtYW5pcHVsYXRpb24gZm9yIFdFQlAgaW1hZ2VzLgotLy8KLS8vIEF1dGhvcnM6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCi0vLyAgICAgICAgICBWaWthcyAodmlrYXNhQGdvb2dsZS5jb20pCi0KLS8vIFRoaXMgQVBJIGFsbG93cyBtYW5pcHVsYXRpb24gb2YgV2ViUCBjb250YWluZXIgaW1hZ2VzIGNvbnRhaW5pbmcgZmVhdHVyZXMKLS8vIGxpa2UgY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEsIGFuaW1hdGlvbiBhbmQgZnJhZ21lbnRlZCBpbWFnZXMuCi0vLwotLy8gQ29kZSBFeGFtcGxlIzE6IENyZWF0aW5nIGEgTVVYIHdpdGggaW1hZ2UgZGF0YSwgY29sb3IgcHJvZmlsZSBhbmQgWE1QCi0vLyBtZXRhZGF0YS4KLS8vCi0vLyAgIGludCBjb3B5X2RhdGEgPSAwOwotLy8gICBXZWJQTXV4KiBtdXggPSBXZWJQTXV4TmV3KCk7Ci0vLyAgIC8vIC4uLiAoUHJlcGFyZSBpbWFnZSBkYXRhKS4KLS8vICAgV2ViUE11eFNldEltYWdlKG11eCwgJmltYWdlLCBjb3B5X2RhdGEpOwotLy8gICAvLyAuLi4gKFByZXBhcmUgSUNDUCBjb2xvciBwcm9maWxlIGRhdGEpLgotLy8gICBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSwgY29weV9kYXRhKTsKLS8vICAgLy8gLi4uIChQcmVwYXJlIFhNUCBtZXRhZGF0YSkuCi0vLyAgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJYTVAgIiwgJnhtcCwgY29weV9kYXRhKTsKLS8vICAgLy8gR2V0IGRhdGEgZnJvbSBtdXggaW4gV2ViUCBSSUZGIGZvcm1hdC4KLS8vICAgV2ViUE11eEFzc2VtYmxlKG11eCwgJm91dHB1dF9kYXRhKTsKLS8vICAgV2ViUE11eERlbGV0ZShtdXgpOwotLy8gICAvLyAuLi4gKENvbnN1bWUgb3V0cHV0X2RhdGE7IGUuZy4gd3JpdGUgb3V0cHV0X2RhdGEuYnl0ZXMgdG8gZmlsZSkuCi0vLyAgIFdlYlBEYXRhQ2xlYXIoJm91dHB1dF9kYXRhKTsKLS8vCi0vLyBDb2RlIEV4YW1wbGUjMjogR2V0IGltYWdlIGFuZCBjb2xvciBwcm9maWxlIGRhdGEgZnJvbSBhIFdlYlAgZmlsZS4KLS8vCi0vLyAgIGludCBjb3B5X2RhdGEgPSAwOwotLy8gICAvLyAuLi4gKFJlYWQgZGF0YSBmcm9tIGZpbGUpLgotLy8gICBXZWJQTXV4KiBtdXggPSBXZWJQTXV4Q3JlYXRlKCZkYXRhLCBjb3B5X2RhdGEpOwotLy8gICBXZWJQTXV4R2V0RnJhbWUobXV4LCAxLCAmaW1hZ2UpOwotLy8gICAvLyAuLi4gKENvbnN1bWUgaW1hZ2U7IGUuZy4gY2FsbCBXZWJQRGVjb2RlKCkgdG8gZGVjb2RlIHRoZSBkYXRhKS4KLS8vICAgV2ViUE11eEdldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUpOwotLy8gICAvLyAuLi4gKENvbnN1bWUgaWNjX2RhdGEpLgotLy8gICBXZWJQTXV4RGVsZXRlKG11eCk7Ci0vLyAgIGZyZWUoZGF0YSk7Ci0KLSNpZm5kZWYgV0VCUF9XRUJQX01VWF9IXwotI2RlZmluZSBXRUJQX1dFQlBfTVVYX0hfCi0KLSNpbmNsdWRlICIuL211eF90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXRUJQX01VWF9BQklfVkVSU0lPTiAweDAxMDAgICAgICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQotCi0vLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAotLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KLS8vIHR5cGVkZWYgZW51bSBXZWJQTXV4RXJyb3IgV2ViUE11eEVycm9yOwotLy8gdHlwZWRlZiBlbnVtIFdlYlBDaHVua0lkIFdlYlBDaHVua0lkOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUE11eCBXZWJQTXV4OyAgIC8vIG1haW4gb3BhcXVlIG9iamVjdC4KLXR5cGVkZWYgc3RydWN0IFdlYlBNdXhGcmFtZUluZm8gV2ViUE11eEZyYW1lSW5mbzsKLXR5cGVkZWYgc3RydWN0IFdlYlBNdXhBbmltUGFyYW1zIFdlYlBNdXhBbmltUGFyYW1zOwotCi0vLyBFcnJvciBjb2RlcwotdHlwZWRlZiBlbnVtIFdlYlBNdXhFcnJvciB7Ci0gIFdFQlBfTVVYX09LICAgICAgICAgICAgICAgICA9ICAxLAotICBXRUJQX01VWF9OT1RfRk9VTkQgICAgICAgICAgPSAgMCwKLSAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAgID0gLTEsCi0gIFdFQlBfTVVYX0JBRF9EQVRBICAgICAgICAgICA9IC0yLAotICBXRUJQX01VWF9NRU1PUllfRVJST1IgICAgICAgPSAtMywKLSAgV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBICAgID0gLTQKLX0gV2ViUE11eEVycm9yOwotCi0vLyBJRHMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBjaHVua3MuCi10eXBlZGVmIGVudW0gV2ViUENodW5rSWQgewotICBXRUJQX0NIVU5LX1ZQOFgsICAgICAvLyBWUDhYCi0gIFdFQlBfQ0hVTktfSUNDUCwgICAgIC8vIElDQ1AKLSAgV0VCUF9DSFVOS19BTklNLCAgICAgLy8gQU5JTQotICBXRUJQX0NIVU5LX0FOTUYsICAgICAvLyBBTk1GCi0gIFdFQlBfQ0hVTktfRlJHTSwgICAgIC8vIEZSR00KLSAgV0VCUF9DSFVOS19BTFBIQSwgICAgLy8gQUxQSAotICBXRUJQX0NIVU5LX0lNQUdFLCAgICAvLyBWUDgvVlA4TAotICBXRUJQX0NIVU5LX0VYSUYsICAgICAvLyBFWElGCi0gIFdFQlBfQ0hVTktfWE1QLCAgICAgIC8vIFhNUAotICBXRUJQX0NIVU5LX1VOS05PV04sICAvLyBPdGhlciBjaHVua3MuCi0gIFdFQlBfQ0hVTktfTklMCi19IFdlYlBDaHVua0lkOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZwotLy8gOGJpdHMgb3IgZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBHZXRNdXhWZXJzaW9uKHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTGlmZSBvZiBhIE11eCBvYmplY3QKLQotLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKFdlYlBNdXgqKSBXZWJQTmV3SW50ZXJuYWwoaW50KTsKLQotLy8gQ3JlYXRlcyBhbiBlbXB0eSBtdXggb2JqZWN0LgotLy8gUmV0dXJuczoKLS8vICAgQSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGVtcHR5IG11eCBvYmplY3QuCi1zdGF0aWMgV0VCUF9JTkxJTkUgV2ViUE11eCogV2ViUE11eE5ldyh2b2lkKSB7Ci0gIHJldHVybiBXZWJQTmV3SW50ZXJuYWwoV0VCUF9NVVhfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBEZWxldGVzIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBNdXhEZWxldGUoV2ViUE11eCogbXV4KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE11eCBjcmVhdGlvbi4KLQotLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKFdlYlBNdXgqKSBXZWJQTXV4Q3JlYXRlSW50ZXJuYWwoY29uc3QgV2ViUERhdGEqLCBpbnQsIGludCk7Ci0KLS8vIENyZWF0ZXMgYSBtdXggb2JqZWN0IGZyb20gcmF3IGRhdGEgZ2l2ZW4gaW4gV2ViUCBSSUZGIGZvcm1hdC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIGJpdHN0cmVhbSAtIChpbikgdGhlIGJpdHN0cmVhbSBkYXRhIGluIFdlYlAgUklGRiBmb3JtYXQKLS8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKLS8vICAgICAgICAgICAgICAgYW5kIHZhbHVlIDAgaW5kaWNhdGVzIGRhdGEgd2lsbCBOT1QgYmUgY29waWVkLgotLy8gUmV0dXJuczoKLS8vICAgQSBwb2ludGVyIHRvIHRoZSBtdXggb2JqZWN0IGNyZWF0ZWQgZnJvbSBnaXZlbiBkYXRhIC0gb24gc3VjY2Vzcy4KLS8vICAgTlVMTCAtIEluIGNhc2Ugb2YgaW52YWxpZCBkYXRhIG9yIG1lbW9yeSBlcnJvci4KLXN0YXRpYyBXRUJQX0lOTElORSBXZWJQTXV4KiBXZWJQTXV4Q3JlYXRlKGNvbnN0IFdlYlBEYXRhKiBiaXRzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weV9kYXRhKSB7Ci0gIHJldHVybiBXZWJQTXV4Q3JlYXRlSW50ZXJuYWwoYml0c3RyZWFtLCBjb3B5X2RhdGEsIFdFQlBfTVVYX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vbi1pbWFnZSBjaHVua3MuCi0KLS8vIE5vdGU6IE9ubHkgbm9uLWltYWdlIHJlbGF0ZWQgY2h1bmtzIHNob3VsZCBiZSBtYW5hZ2VkIHRocm91Z2ggY2h1bmsgQVBJcy4KLS8vIChJbWFnZSByZWxhdGVkIGNodW5rcyBhcmU6ICJBTk1GIiwgIkZSR00iLCAiVlA4ICIsICJWUDhMIiBhbmQgIkFMUEgiKS4KLS8vIFRvIGFkZCwgZ2V0IGFuZCBkZWxldGUgaW1hZ2VzLCB1c2UgQVBJcyBXZWJQTXV4U2V0SW1hZ2UoKSwKLS8vIFdlYlBNdXhQdXNoRnJhbWUoKSwgV2ViUE11eEdldEZyYW1lKCkgYW5kIFdlYlBNdXhEZWxldGVGcmFtZSgpLgotCi0vLyBBZGRzIGEgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBhbmQgZGF0YSAnY2h1bmtfZGF0YScgaW4gdGhlIG11eCBvYmplY3QuCi0vLyBBbnkgZXhpc3RpbmcgY2h1bmsocykgd2l0aCB0aGUgc2FtZSBpZCB3aWxsIGJlIHJlbW92ZWQuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gd2hpY2ggdGhlIGNodW5rIGlzIHRvIGJlIGFkZGVkCi0vLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBnaXZlbiBjaHVuazsKLS8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KLS8vICAgY2h1bmtfZGF0YSAtIChpbikgdGhlIGNodW5rIGRhdGEgdG8gYmUgYWRkZWQKLS8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKLS8vICAgICAgICAgICAgICAgYW5kIHZhbHVlIDAgaW5kaWNhdGVzIGRhdGEgd2lsbCBOT1QgYmUgY29waWVkLgotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCwgZm91cmNjIG9yIGNodW5rX2RhdGEgaXMgTlVMTAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgZm91cmNjIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIGNodW5rLgotLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4U2V0Q2h1bmsoCi0gICAgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwgY29uc3QgV2ViUERhdGEqIGNodW5rX2RhdGEsCi0gICAgaW50IGNvcHlfZGF0YSk7Ci0KLS8vIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgb2YgdGhlIGNodW5rIHdpdGggaWQgJ2ZvdXJjYycgaW4gdGhlIG11eCBvYmplY3QuCi0vLyBUaGUgY2FsbGVyIHNob3VsZCBOT1QgZnJlZSB0aGUgcmV0dXJuZWQgZGF0YS4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGNodW5rIGRhdGEgaXMgdG8gYmUgZmV0Y2hlZAotLy8gICBmb3VyY2MgLSAoaW4pIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bms7Ci0vLyAgICAgICAgICAgICAgICAgZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiBldGMuCi0vLyAgIGNodW5rX2RhdGEgLSAob3V0KSByZXR1cm5lZCBjaHVuayBkYXRhCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZWl0aGVyIG11eCwgZm91cmNjIG9yIGNodW5rX2RhdGEgaXMgTlVMTAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgZm91cmNjIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIGNodW5rLgotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiBtdXggZG9lcyBub3QgY29udGFpbiBhIGNodW5rIHdpdGggdGhlIGdpdmVuIGlkLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhHZXRDaHVuaygKLSAgICBjb25zdCBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBXZWJQRGF0YSogY2h1bmtfZGF0YSk7Ci0KLS8vIERlbGV0ZXMgdGhlIGNodW5rIHdpdGggdGhlIGdpdmVuICdmb3VyY2MnIGZyb20gdGhlIG11eCBvYmplY3QuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY2h1bmsgaXMgdG8gYmUgZGVsZXRlZAotLy8gICBmb3VyY2MgLSAoaW4pIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bms7Ci0vLyAgICAgICAgICAgICAgICAgZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiBldGMuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZvdXJjYyBpcyBOVUxMCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCi0vLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIElmIG11eCBkb2VzIG5vdCBjb250YWluIGEgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gZm91cmNjLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhEZWxldGVDaHVuaygKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltYWdlcy4KLQotLy8gRW5jYXBzdWxhdGVzIGRhdGEgYWJvdXQgYSBzaW5nbGUgZnJhbWUvZnJhZ21lbnQuCi1zdHJ1Y3QgV2ViUE11eEZyYW1lSW5mbyB7Ci0gIFdlYlBEYXRhICAgIGJpdHN0cmVhbTsgIC8vIGltYWdlIGRhdGE6IGNhbiBlaXRoZXIgYmUgYSByYXcgVlA4L1ZQOEwgYml0c3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgc2luZ2xlLWltYWdlIFdlYlAgZmlsZS4KLSAgaW50ICAgICAgICAgeF9vZmZzZXQ7ICAgLy8geC1vZmZzZXQgb2YgdGhlIGZyYW1lLgotICBpbnQgICAgICAgICB5X29mZnNldDsgICAvLyB5LW9mZnNldCBvZiB0aGUgZnJhbWUuCi0gIGludCAgICAgICAgIGR1cmF0aW9uOyAgIC8vIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSAoaW4gbWlsbGlzZWNvbmRzKS4KLQotICBXZWJQQ2h1bmtJZCBpZDsgICAgICAgICAvLyBmcmFtZSB0eXBlOiBzaG91bGQgYmUgb25lIG9mIFdFQlBfQ0hVTktfQU5NRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV0VCUF9DSFVOS19GUkdNIG9yIFdFQlBfQ0hVTktfSU1BR0UKLSAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kOyAgLy8gRGlzcG9zYWwgbWV0aG9kIGZvciB0aGUgZnJhbWUuCi0gIHVpbnQzMl90ICAgIHBhZFsyXTsgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotfTsKLQotLy8gU2V0cyB0aGUgKG5vbi1hbmltYXRlZCBhbmQgbm9uLWZyYWdtZW50ZWQpIGltYWdlIGluIHRoZSBtdXggb2JqZWN0LgotLy8gTm90ZTogQW55IGV4aXN0aW5nIGltYWdlcyAoaW5jbHVkaW5nIGZyYW1lcy9mcmFnbWVudHMpIHdpbGwgYmUgcmVtb3ZlZC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBpbiB3aGljaCB0aGUgaW1hZ2UgaXMgdG8gYmUgc2V0Ci0vLyAgIGJpdHN0cmVhbSAtIChpbikgY2FuIGVpdGhlciBiZSBhIHJhdyBWUDgvVlA4TCBiaXRzdHJlYW0gb3IgYSBzaW5nbGUtaW1hZ2UKLS8vICAgICAgICAgICAgICAgV2ViUCBmaWxlIChub24tYW5pbWF0ZWQgYW5kIG5vbi1mcmFnbWVudGVkKQotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IGlzIE5VTEwgb3IgYml0c3RyZWFtIGlzIE5VTEwuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhTZXRJbWFnZSgKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBEYXRhKiBiaXRzdHJlYW0sIGludCBjb3B5X2RhdGEpOwotCi0vLyBBZGRzIGEgZnJhbWUgYXQgdGhlIGVuZCBvZiB0aGUgbXV4IG9iamVjdC4KLS8vIE5vdGVzOiAoMSkgZnJhbWUuaWQgc2hvdWxkIGJlIG9uZSBvZiBXRUJQX0NIVU5LX0FOTUYgb3IgV0VCUF9DSFVOS19GUkdNCi0vLyAgICAgICAgKDIpIEZvciBzZXR0aW5nIGEgbm9uLWFuaW1hdGVkIG5vbi1mcmFnbWVudGVkIGltYWdlLCB1c2UKLS8vICAgICAgICAgICAgV2ViUE11eFNldEltYWdlKCkgaW5zdGVhZC4KLS8vICAgICAgICAoMykgVHlwZSBvZiBmcmFtZSBiZWluZyBwdXNoZWQgbXVzdCBiZSBzYW1lIGFzIHRoZSBmcmFtZXMgaW4gbXV4LgotLy8gICAgICAgICg0KSBBcyBXZWJQIG9ubHkgc3VwcG9ydHMgZXZlbiBvZmZzZXRzLCBhbnkgb2RkIG9mZnNldCB3aWxsIGJlIHNuYXBwZWQKLS8vICAgICAgICAgICAgdG8gYW4gZXZlbiBsb2NhdGlvbiB1c2luZzogb2Zmc2V0ICY9IH4xCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gd2hpY2ggdGhlIGZyYW1lIGlzIHRvIGJlIGFkZGVkCi0vLyAgIGZyYW1lIC0gKGluKSBmcmFtZSBkYXRhLgotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZyYW1lIGlzIE5VTEwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGNvbnRlbnQgb2YgJ2ZyYW1lJyBpcyBpbnZhbGlkLgotLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4UHVzaEZyYW1lKAotICAgIFdlYlBNdXgqIG11eCwgY29uc3QgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUsIGludCBjb3B5X2RhdGEpOwotCi0vLyBHZXRzIHRoZSBudGggZnJhbWUgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIFRoZSBjb250ZW50IG9mICdmcmFtZS0+Yml0c3RyZWFtJyBpcyBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jKCksIGFuZCBOT1QKLS8vIG93bmVkIGJ5IHRoZSAnbXV4JyBvYmplY3QuIEl0IE1VU1QgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBieSBjYWxsaW5nCi0vLyBXZWJQRGF0YUNsZWFyKCkuCi0vLyBudGg9MCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgLSBsYXN0IHBvc2l0aW9uLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgaW5mbyBpcyB0byBiZSBmZXRjaGVkCi0vLyAgIG50aCAtIChpbikgaW5kZXggb2YgdGhlIGZyYW1lIGluIHRoZSBtdXggb2JqZWN0Ci0vLyAgIGZyYW1lIC0gKG91dCkgZGF0YSBvZiB0aGUgcmV0dXJuZWQgZnJhbWUKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZnJhbWUgaXMgTlVMTC4KLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gaWYgdGhlcmUgYXJlIGxlc3MgdGhhbiBudGggZnJhbWVzIGluIHRoZSBtdXggb2JqZWN0LgotLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIG50aCBmcmFtZSBjaHVuayBpbiBtdXggaXMgaW52YWxpZC4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4R2V0RnJhbWUoCi0gICAgY29uc3QgV2ViUE11eCogbXV4LCB1aW50MzJfdCBudGgsIFdlYlBNdXhGcmFtZUluZm8qIGZyYW1lKTsKLQotLy8gRGVsZXRlcyBhIGZyYW1lIGZyb20gdGhlIG11eCBvYmplY3QuCi0vLyBudGg9MCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgLSBsYXN0IHBvc2l0aW9uLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGZyb20gd2hpY2ggYSBmcmFtZSBpcyB0byBiZSBkZWxldGVkCi0vLyAgIG50aCAtIChpbikgVGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdGhlIGZyYW1lIGlzIHRvIGJlIGRlbGV0ZWQKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggaXMgTlVMTC4KLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiBudGggZnJhbWVzIGluIHRoZSBtdXggb2JqZWN0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBkZWxldGlvbi4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4RGVsZXRlRnJhbWUoV2ViUE11eCogbXV4LCB1aW50MzJfdCBudGgpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW5pbWF0aW9uLgotCi0vLyBBbmltYXRpb24gcGFyYW1ldGVycy4KLXN0cnVjdCBXZWJQTXV4QW5pbVBhcmFtcyB7Ci0gIHVpbnQzMl90IGJnY29sb3I7ICAvLyBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMgc3RvcmVkIChpbiBNU0Igb3JkZXIpIGFzOgotICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAwMCB0byAwNzogQWxwaGEuCi0gICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDA4IHRvIDE1OiBSZWQuCi0gICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDE2IHRvIDIzOiBHcmVlbi4KLSAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMjQgdG8gMzE6IEJsdWUuCi0gIGludCBsb29wX2NvdW50OyAgICAvLyBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBhbmltYXRpb24gWzAgPSBpbmZpbml0ZV0uCi19OwotCi0vLyBTZXRzIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgbXV4IG9iamVjdC4gQW55IGV4aXN0aW5nIEFOSU0gY2h1bmtzCi0vLyB3aWxsIGJlIHJlbW92ZWQuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgaW4gd2hpY2ggQU5JTSBjaHVuayBpcyB0byBiZSBzZXQvYWRkZWQKLS8vICAgcGFyYW1zIC0gKGluKSBhbmltYXRpb24gcGFyYW1ldGVycy4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgbXV4IG9yIHBhcmFtcyBpcyBOVUxMCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMoCi0gICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKLQotLy8gR2V0cyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzIHRvIGJlIGZldGNoZWQKLS8vICAgcGFyYW1zIC0gKG91dCkgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIEFOSU0gY2h1bmsKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgb2YgbXV4IG9yIHBhcmFtcyBpcyBOVUxMCi0vLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIGlmIEFOSU0gY2h1bmsgaXMgbm90IHByZXNlbnQgaW4gbXV4IG9iamVjdC4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKAotICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgV2ViUE11eEFuaW1QYXJhbXMqIHBhcmFtcyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNaXNjIFV0aWxpdGllcy4KLQotLy8gR2V0cyB0aGUgZmVhdHVyZSBmbGFncyBmcm9tIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgZmVhdHVyZXMgYXJlIHRvIGJlIGZldGNoZWQKLS8vICAgZmxhZ3MgLSAob3V0KSB0aGUgZmxhZ3Mgc3BlY2lmeWluZyB3aGljaCBmZWF0dXJlcyBhcmUgcHJlc2VudCBpbiB0aGUKLS8vICAgICAgICAgICBtdXggb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gT1Igb2YgdmFyaW91cyBmbGFnIHZhbHVlcy4KLS8vICAgICAgICAgICBFbnVtICdXZWJQRmVhdHVyZUZsYWdzJyBjYW4gYmUgdXNlZCB0byB0ZXN0IGluZGl2aWR1YWwgZmxhZyB2YWx1ZXMuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZsYWdzIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gaWYgVlA4WCBjaHVuayBpcyBub3QgcHJlc2VudCBpbiBtdXggb2JqZWN0LgotLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIFZQOFggY2h1bmsgaW4gbXV4IGlzIGludmFsaWQuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eEdldEZlYXR1cmVzKGNvbnN0IFdlYlBNdXgqIG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBmbGFncyk7Ci0KLS8vIEdldHMgbnVtYmVyIG9mIGNodW5rcyBoYXZpbmcgdGFnIHZhbHVlIHRhZyBpbiB0aGUgbXV4IG9iamVjdC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGluZm8gaXMgdG8gYmUgZmV0Y2hlZAotLy8gICBpZCAtIChpbikgY2h1bmsgaWQgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjaHVuawotLy8gICBudW1fZWxlbWVudHMgLSAob3V0KSBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhlIGdpdmVuIGNodW5rIGlkCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZWl0aGVyIG11eCwgb3IgbnVtX2VsZW1lbnRzIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4TnVtQ2h1bmtzKGNvbnN0IFdlYlBNdXgqIG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJZCBpZCwgaW50KiBudW1fZWxlbWVudHMpOwotCi0vLyBBc3NlbWJsZXMgYWxsIGNodW5rcyBpbiBXZWJQIFJJRkYgZm9ybWF0IGFuZCByZXR1cm5zIGluICdhc3NlbWJsZWRfZGF0YScuCi0vLyBUaGlzIGZ1bmN0aW9uIGFsc28gdmFsaWRhdGVzIHRoZSBtdXggb2JqZWN0LgotLy8gTm90ZTogVGhlIGNvbnRlbnQgb2YgJ2Fzc2VtYmxlZF9kYXRhJyB3aWxsIGJlIGlnbm9yZWQgYW5kIG92ZXJ3cml0dGVuLgotLy8gQWxzbywgdGhlIGNvbnRlbnQgb2YgJ2Fzc2VtYmxlZF9kYXRhJyBpcyBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jKCksIGFuZCBOT1QKLS8vIG93bmVkIGJ5IHRoZSAnbXV4JyBvYmplY3QuIEl0IE1VU1QgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBieSBjYWxsaW5nCi0vLyBXZWJQRGF0YUNsZWFyKCkuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3Qgd2hvc2UgY2h1bmtzIGFyZSB0byBiZSBhc3NlbWJsZWQKLS8vICAgYXNzZW1ibGVkX2RhdGEgLSAob3V0KSBhc3NlbWJsZWQgV2ViUCBkYXRhCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIG11eCBvYmplY3QgaXMgaW52YWxpZC4KLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGVpdGhlciBtdXgsIG91dHB1dF9kYXRhIG9yIG91dHB1dF9zaXplIGlzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLgotLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhBc3NlbWJsZShXZWJQTXV4KiBtdXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogYXNzZW1ibGVkX2RhdGEpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1dFQlBfTVVYX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4Lmh0bWwgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4NzNhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXguaHRtbApAQCAtMCwwICsxLDc1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KKworPGhlYWQ+CisgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KKyAgPHRpdGxlPnNpbXBsZSBKYXZhc2NyaXB0IFdlYlAgZGVjb2RpbmcgZGVtbzwvdGl0bGU+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgTW9kdWxlID0geworICAgICAgbm9Jbml0aWFsUnVuIDogdHJ1ZQorICAgIH07CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuL3dlYnAuanMiPjwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisKKyd1c2Ugc3RyaWN0JzsKKworLy8gbWFpbiB3cmFwcGVyIGZvciB0aGUgZnVuY3Rpb24gZGVjb2RpbmcgYSBXZWJQIGludG8gYSBjYW52YXMgb2JqZWN0Cit2YXIgV2VicFRvQ2FudmFzOworCitmdW5jdGlvbiBpbml0KCkgeworICBXZWJwVG9DYW52YXMgPSBNb2R1bGUuY3dyYXAoJ1dlYnBUb1NETCcsICdudW1iZXInLCBbJ2FycmF5JywgJ251bWJlciddKTsKK30KK3dpbmRvdy5vbmxvYWQgPSBpbml0OworCitmdW5jdGlvbiBkZWNvZGUod2VicF9kYXRhLCBjYW52YXNfaWQpIHsKKyAgLy8gZ2V0IHRoZSBjYW52YXMgdG8gZGVjb2RlIGludG8KKyAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbnZhc19pZCk7CisgIGlmIChjYW52YXMgPT0gbnVsbCkgcmV0dXJuOworICAvLyBjbGVhciBwcmV2aW91cyBwaWN0dXJlIChpZiBhbnkpCisgIE1vZHVsZS5jYW52YXMgPSBjYW52YXM7CisgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOworICAvLyBkZWNvZGUgYW5kIG1lYXN1cmUgdGltaW5nCisgIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7CisgIHZhciByZXQgPSBXZWJwVG9DYW52YXMod2VicF9kYXRhLCB3ZWJwX2RhdGEubGVuZ3RoKTsKKyAgdmFyIGVuZCA9IG5ldyBEYXRlKCk7CisgIHZhciBzcGVlZF9yZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltaW5nJyk7CisgIC8vIGRpc3BsYXkgdGltaW5nIHJlc3VsdAorICBpZiAoc3BlZWRfcmVzdWx0ICE9IG51bGwpIHsKKyAgICB2YXIgZGVjb2RlX3RpbWUgPSBlbmQgLSBzdGFydDsKKyAgICBzcGVlZF9yZXN1bHQuaW5uZXJIVE1MID0gJzxwPmRlY29kaW5nIHRpbWU6ICcgKyBkZWNvZGVfdGltZSArJyBtcy48L3A+JzsKKyAgfQorfQorCitmdW5jdGlvbiBsb2FkZmlsZShmaWxlbmFtZSwgY2FudmFzX2lkKSB7CisgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgeGhyLm9wZW4oJ0dFVCcsIGZpbGVuYW1lKTsKKyAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCAmJiB4aHIuc3RhdHVzID09IDIwMCkgeworICAgICAgdmFyIHdlYnBfZGF0YSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7CisgICAgICBkZWNvZGUod2VicF9kYXRhLCBjYW52YXNfaWQpOworICAgIH0KKyAgfTsKKyAgeGhyLnNlbmQoKTsKK30KKyAgPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5PgorICA8cD4KKyAgICA8c3Ryb25nPldlYlAgaW4gSmF2YVNjcmlwdCBkZW1vPC9zdHJvbmc+IC0KKyAgPC9wPgorICA8cD4KKyAgICBXZWJQIGRlY29kZXIgaW4gSmF2YVNjcmlwdCwgdXNpbmcgbGlid2VicCBjb21waWxlZCB3aXRoCisgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2tyaXBrZW4vZW1zY3JpcHRlbi93aWtpIj5FbXNjcmlwdGVuPC9hPi4KKyAgPC9wPgorICA8cCBpZD0iaW1hZ2VfYnV0dG9ucyI+CisgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9InRlc3QgaW1hZ2UhIiBuYW1lPSIuL3Rlc3Rfd2VicF9qcy53ZWJwIgorICAgICAgICAgICBvbmNsaWNrPSJsb2FkZmlsZSh0aGlzLm5hbWUsICdvdXRwdXRfY2FudmFzJykiPgorICA8L3A+CisgIDxwIGlkPSJ0aW1pbmciPlRpbWluZzogTi9BPC9wPgorICA8Y2FudmFzIGlkPSJvdXRwdXRfY2FudmFzIj5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjYW52YXM8L2NhbnZhcz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleF93YXNtLmh0bWwgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4X3dhc20uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdjMjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleF93YXNtLmh0bWwKQEAgLTAsMCArMSw5MCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CisKKzxoZWFkPgorICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CisgIDx0aXRsZT5zaW1wbGUgSmF2YXNjcmlwdCBXZWJQIGRlY29kaW5nIGRlbW8sIHVzaW5nIFdlYi1Bc3NlbWJseSAoV0FTTSk8L3RpdGxlPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIE1vZHVsZSA9IHsKKyAgICAgIG5vSW5pdGlhbFJ1biA6IHRydWUKKyAgICB9OworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCisndXNlIHN0cmljdCc7CisKKy8vIG1haW4gd3JhcHBlciBmb3IgdGhlIGZ1bmN0aW9uIGRlY29kaW5nIGEgV2ViUCBpbnRvIGEgY2FudmFzIG9iamVjdAordmFyIFdlYnBUb0NhbnZhczsKKworZnVuY3Rpb24gaW5pdCgpIHsKKyAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICB4aHIub3BlbignR0VUJywgJ3dlYnBfd2FzbS53YXNtJywgdHJ1ZSk7CisgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInOworICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CisgICAgTW9kdWxlLndhc21CaW5hcnkgPSB4aHIucmVzcG9uc2U7CisgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOworICAgIHNjcmlwdC5zcmMgPSAid2VicF93YXNtLmpzIjsKKyAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CisgIH07CisgIHhoci5zZW5kKG51bGwpOworfQord2luZG93Lm9ubG9hZCA9IGluaXQ7CisKK2Z1bmN0aW9uIGRlY29kZSh3ZWJwX2RhdGEsIGNhbnZhc19pZCkgeworICB2YXIgcmVzdWx0OworICBpZiAoTW9kdWxlWyJhc20iXSAhPSB1bmRlZmluZWQpIHsKKyAgICAvLyB3cmFwcGVyIGZvciB0aGUgZnVuY3Rpb24gZGVjb2RpbmcgYSBXZWJQIGludG8gYSBjYW52YXMgb2JqZWN0CisgICAgV2VicFRvQ2FudmFzID0gTW9kdWxlLmN3cmFwKCdXZWJwVG9TREwnLCAnbnVtYmVyJywgWydhcnJheScsICdudW1iZXInXSk7CisgICAgLy8gZ2V0IHRoZSBjYW52YXMgdG8gZGVjb2RlIGludG8KKyAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzX2lkKTsKKyAgICBpZiAoY2FudmFzID09IG51bGwpIHJldHVybjsKKyAgICAvLyBjbGVhciBwcmV2aW91cyBwaWN0dXJlIChpZiBhbnkpCisgICAgTW9kdWxlLmNhbnZhcyA9IGNhbnZhczsKKyAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKKyAgICAvLyBkZWNvZGUgYW5kIG1lYXN1cmUgdGltaW5nCisgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKKyAgICB2YXIgcmV0ID0gV2VicFRvQ2FudmFzKHdlYnBfZGF0YSwgd2VicF9kYXRhLmxlbmd0aCk7CisgICAgdmFyIGVuZCA9IG5ldyBEYXRlKCk7CisgICAgdmFyIGRlY29kZV90aW1lID0gZW5kIC0gc3RhcnQ7CisgICAgcmVzdWx0ID0gJ2RlY29kaW5nIHRpbWU6ICcgKyBkZWNvZGVfdGltZSArJyBtcy4nOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9ICJXQVNNIG1vZHVsZSBub3QgZmluaXNoZWQgbG9hZGluZyEgUGxlYXNlIHJldHJ5IjsKKyAgfQorICAvLyBkaXNwbGF5IHRpbWluZyByZXN1bHQKKyAgdmFyIHNwZWVkX3Jlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1pbmcnKTsKKyAgaWYgKHNwZWVkX3Jlc3VsdCAhPSBudWxsKSB7CisgICAgc3BlZWRfcmVzdWx0LmlubmVySFRNTCA9ICc8cD4nKyByZXN1bHQgKyAnPC9wPic7CisgIH0KK30KKworZnVuY3Rpb24gbG9hZGZpbGUoZmlsZW5hbWUsIGNhbnZhc19pZCkgeworICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgIHhoci5vcGVuKCdHRVQnLCBmaWxlbmFtZSk7CisgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInOworICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQgJiYgeGhyLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHZhciB3ZWJwX2RhdGEgPSBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOworICAgICAgZGVjb2RlKHdlYnBfZGF0YSwgY2FudmFzX2lkKTsKKyAgICB9CisgIH07CisgIHhoci5zZW5kKCk7Cit9CisgIDwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keT4KKyAgPHA+CisgICAgPHN0cm9uZz5XZWJQIGRlbW8gdXNpbmcgV2ViLUFzc2VtYmx5PC9zdHJvbmc+IC0KKyAgPC9wPgorICA8cD4KKyAgICBXQVNNIHZlcnNpb24gb2YgdGhlIFdlYlAgZGVjb2RlciwgdXNpbmcgbGlid2VicCBjb21waWxlZCB3aXRoCisgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2tyaXBrZW4vZW1zY3JpcHRlbi93aWtpIj5FbXNjcmlwdGVuPC9hPi4KKyAgPC9wPgorICA8cCBpZD0iaW1hZ2VfYnV0dG9ucyI+CisgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9InRlc3QgaW1hZ2UhIgorICAgICAgICAgICBvbmNsaWNrPSJsb2FkZmlsZSgnLi90ZXN0X3dlYnBfd2FzbS53ZWJwJywgJ291dHB1dF9jYW52YXMnKSI+CisgIDwvcD4KKyAgPHAgaWQ9InRpbWluZyI+VGltaW5nOiBOL0E8L3A+CisgIDxjYW52YXMgaWQ9Im91dHB1dF9jYW52YXMiPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGNhbnZhczwvY2FudmFzPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfanMud2VicCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX2pzLndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5OGY1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX2pzLndlYnAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfd2FzbS53ZWJwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfd2FzbS53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OThmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF93YXNtLndlYnAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYnhtbC9saWJ4bWwuZ3lwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYnhtbC9saWJ4bWwuZ3lwCmluZGV4IDg2ZmU0YTQuLjVmMTRlMmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ4bWwvbGlieG1sLmd5cAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlieG1sL2xpYnhtbC5neXAKQEAgLTMwMCw2ICszMDAsOSBAQAogICAgICAgICAgICAgICAgICMgdHJpb19pc19zcGVjaWFsX3F1YW50aXR5IGFuZCB0cmlvX2lzX25lZ2F0aXZlIGFyZSBvbmx5CiAgICAgICAgICAgICAgICAgIyB1c2VkIHdpdGggY2VydGFpbiBwcmVwcm9jZXNzb3IgZGVmaW5lcyBzZXQuCiAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWZ1bmN0aW9uJywKKyAgICAgICAgICAgICAgICAjIHhwYXRoLmMgeG1sWFBhdGhOb2RlQ29sbGVjdEFuZFRlc3QgY29tcGFyZXMgJ3htbEVsZW1lbnRUeXBlJworICAgICAgICAgICAgICAgICMgYW5kICd4bWxYUGF0aFR5cGVWYWwnLgorICAgICAgICAgICAgICAgICctV25vLWVudW0tY29tcGFyZScsCiAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICB9XSwKICAgICAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L21mYnQvbWZidF9Db21wcmVzc2lvbi5jcHAgYi9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvbWZidC9tZmJ0X0NvbXByZXNzaW9uLmNwcAppbmRleCBjMTE0YzZjLi4yMjNmYjIzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvbWZidC9tZmJ0X0NvbXByZXNzaW9uLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvbWZidC9tZmJ0X0NvbXByZXNzaW9uLmNwcApAQCAtMTQsNiArMTQsMTUgQEAKIAogdXNpbmcgbmFtZXNwYWNlIG1vemlsbGE6OkNvbXByZXNzaW9uOwogCisvLyBCZWNhdXNlIHdlIHdyYXAgbHo0LmMgaW4gYW4gYW5vbnltb3VzIG5hbWVzcGFjZSwgYWxsIG9mIGl0cyAjaW5jbHVkZXMKKy8vIGdvIGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvby4gVGhpcyB3b3VsZCBjcmVhdGUgY29uZmxpY3RpbmcKKy8vIGRlY2xhcmF0aW9ucyBmb3IgaW50cmluc2ljIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnRlcm5hbGx5IGRlZmluZWQKKy8vIGF0IHRvcC1sZXZlbC4gSW5jbHVkaW5nIGludHJpbi5oIG5vdyBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkCisvLyBsYXRlciB3aXRoaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UuCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNlbmRpZgorCiBuYW1lc3BhY2UgewogCiAjaW5jbHVkZSAibHo0LmMiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcC5oCmluZGV4IDZmMWE3MWUuLmQ4NzFiNTggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcC5oCkBAIC0xMzExLDcgKzEzMTEsNyBAQAogICAgICAgR09PR0xFX0RDSEVDSyhuID49IGtNaW5UYWJsZVNpemUpOwogICAgICAgR09PR0xFX0RDSEVDS19FUShuICYgKG4gLSAxKSwgMCk7CiAgICAgICB2b2lkKiogcmVzdWx0ID0gQWxsb2M8dm9pZCo+KG4pOwotICAgICAgbWVtc2V0KHJlc3VsdCwgMCwgbiAqIHNpemVvZihyZXN1bHRbMF0pKTsKKyAgICAgIDo6bWVtc2V0KHJlc3VsdCwgMCwgbiAqIHNpemVvZihyZXN1bHRbMF0pKTsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYwppbmRleCA2ODhmYWJkLi43Y2QxYTE5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKQEAgLTI5LDEyICsyOSwzOSBAQAogLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3RydXRpbC5jYwotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAKICNpZm5kZWYgU1RBUkJPQVJECisKICNpbmNsdWRlIDxzdGRpby5oPgorCisvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gYnVpbGQgdGhpcyBsaWJyYXJ5IHVzaW5nIHRoZSBob3N0IHRvb2xjaGFpbiBmb3Igc29tZQorLy8gcGxhdGZvcm1zLCBhbmQgU3RhcmJvYXJkIGlzIG5vdCBhdmFpbGFibGUgdGhlcmUuICBTbyB3ZSBkZWZpbmUgdGhlc2UKKy8vICJyZXZlcnNlIHBvZW1zIiB0byBtb3ZlIHBhc3QgdGhpcyBpc3N1ZSBmb3IgaG9zdCBidWlsZHMuICBGb3Igd2h5IHdlIGRvbid0CisvLyBqdXN0IHVzZSBwb2Vtcywgc2VlIHRoZSBjb21tZW50IGluIHRoZSAjZWxzZSBjbGF1c2UuCisjZGVmaW5lIFNiTWVtb3J5Q29weSBtZW1jcHkKKyNkZWZpbmUgU2JNZW1vcnlNb3ZlIG1lbW1vdmUKKyNkZWZpbmUgU2JTdHJpbmdHZXRMZW5ndGggc3RybGVuCisjZGVmaW5lIFNiU3RyaW5nQ29weVVuc2FmZSBzdHJjcHkKKyNkZWZpbmUgUG9lbUZpbmRDaGFyYWN0ZXJJblN0cmluZyBzdHJjaHIKKyNkZWZpbmUgU2JTdHJpbmdGb3JtYXRGIHNucHJpbnRmCisjZGVmaW5lIFNiU3RyaW5nRm9ybWF0VW5zYWZlRiBzcHJpbnRmCisjZGVmaW5lIFNiU3RyaW5nUGFyc2VVbnNpZ25lZEludGVnZXIgc3RydG91bAorI2RlZmluZSBTYlN0cmluZ1BhcnNlU2lnbmVkSW50ZWdlciBzdHJ0b2wKKyNkZWZpbmUgU2JTdHJpbmdQYXJzZURvdWJsZSBzdHJ0b2QKKworI2Vsc2UgIC8vIFNUQVJCT0FSRAorCisvLyBXZSBhdm9pZCB1c2luZyBwb2VtcyBoZXJlIGJlY2F1c2UgYSBzdWJzZXF1ZW50ICNpbmNsdWRlIG9mIG1hdGguaCBtYXkKKy8vIHJlc3VsdCwgb24gc29tZSBwbGF0Zm9ybXMsIG9mIHRoZSBpbmRpcmVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmgsIHdoaWNoCisvLyB3aWxsIHRoZW4gY29uZmxpY3Qgd2l0aCBvdXIgcG9lbSBpbmNsdWRlcy4KKyNkZWZpbmUgUE9FTV9OT19FTVVMQVRJT04KKy8vIEZvciBhY2Nlc3MgdG8gUG9lbUZpbmRDaGFyYWN0ZXJJblN0cmluZygpIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHN0cmNocigpLgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjdW5kZWYgUE9FTV9OT19FTVVMQVRJT04KKworI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKICNlbmRpZiAgLy8gU1RBUkJPQVJECiAKICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtMjc4LDcgKzMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogcmVzdWx0KSB7CiAgIEdPT0dMRV9DSEVDSyhyZXN1bHQgIT0gTlVMTCk7CiAgIHJlc3VsdC0+Y2xlYXIoKTsKLSAgaW50IGRlbGltX2xlbmd0aCA9IHN0cmxlbihkZWxpbSk7CisgIGludCBkZWxpbV9sZW5ndGggPSBTYlN0cmluZ0dldExlbmd0aChkZWxpbSk7CiAKICAgLy8gUHJlY29tcHV0ZSByZXN1bHRpbmcgbGVuZ3RoIHNvIHdlIGNhbiByZXNlcnZlKCkgbWVtb3J5IGluIG9uZSBzaG90LgogICBpbnQgbGVuZ3RoID0gMDsKQEAgLTUxNyw3ICs1NDQsNyBAQAogICAgICAgICAgICAgIChsYXN0X2hleF9lc2NhcGUgJiYgaXN4ZGlnaXQoKnNyYykpKSkgewogICAgICAgICAgIGlmIChkZXN0X2xlbiAtIHVzZWQgPCA0KSAvLyBuZWVkIHNwYWNlIGZvciA0IGxldHRlciBlc2NhcGUKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICBzcHJpbnRmKGRlc3QgKyB1c2VkLCAodXNlX2hleCA/ICJcXHglMDJ4IiA6ICJcXCUwM28iKSwKKyAgICAgICAgICBTYlN0cmluZ0Zvcm1hdFVuc2FmZUYoZGVzdCArIHVzZWQsICh1c2VfaGV4ID8gIlxceCUwMngiIDogIlxcJTAzbyIpLAogICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDg+KCpzcmMpKTsKICAgICAgICAgICBpc19oZXhfZXNjYXBlID0gdXNlX2hleDsKICAgICAgICAgICB1c2VkICs9IDQ7CkBAIC02NDUsNyArNjcyLDcgQEAKIGludDMyIHN0cnRvMzJfYWRhcHRvcihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgewogICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKICAgZXJybm8gPSAwOwotICBjb25zdCBsb25nIHJlc3VsdCA9IHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOworICBjb25zdCBsb25nIHJlc3VsdCA9IFNiU3RyaW5nUGFyc2VTaWduZWRJbnRlZ2VyKG5wdHIsIGVuZHB0ciwgYmFzZSk7CiAgIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IExPTkdfTUlOKSB7CiAgICAgcmV0dXJuIGtpbnQzMm1pbjsKICAgfSBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IExPTkdfTUFYKSB7CkBAIC02NjUsNyArNjkyLDcgQEAKIHVpbnQzMiBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CiAgIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOwogICBlcnJubyA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpOworICBjb25zdCB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IFNiU3RyaW5nUGFyc2VVbnNpZ25lZEludGVnZXIobnB0ciwgZW5kcHRyLCBiYXNlKTsKICAgaWYgKGVycm5vID09IEVSQU5HRSAmJiByZXN1bHQgPT0gVUxPTkdfTUFYKSB7CiAgICAgcmV0dXJuIGt1aW50MzJtYXg7CiAgIH0gZWxzZSBpZiAoZXJybm8gPT0gMCAmJiByZXN1bHQgPiBrdWludDMybWF4KSB7CkBAIC0xMjI3LDcgKzEyNTQsNyBAQAogdm9pZCBEZWxvY2FsaXplUmFkaXgoY2hhciogYnVmZmVyKSB7CiAgIC8vIEZhc3QgY2hlY2s6ICBpZiB0aGUgYnVmZmVyIGhhcyBhIG5vcm1hbCBkZWNpbWFsIHBvaW50LCBhc3N1bWUgbm8KICAgLy8gdHJhbnNsYXRpb24gaXMgbmVlZGVkLgotICBpZiAoc3RyY2hyKGJ1ZmZlciwgJy4nKSAhPSBOVUxMKSByZXR1cm47CisgIGlmIChQb2VtRmluZENoYXJhY3RlckluU3RyaW5nKGJ1ZmZlciwgJy4nKSAhPSBOVUxMKSByZXR1cm47CiAKICAgLy8gRmluZCB0aGUgZmlyc3QgdW5rbm93biBjaGFyYWN0ZXIuCiAgIHdoaWxlIChJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpKSArK2J1ZmZlcjsKQEAgLTEyNDcsNyArMTI3NCw3IEBACiAgICAgLy8gZXh0cmEgYnl0ZXMuCiAgICAgY2hhciogdGFyZ2V0ID0gYnVmZmVyOwogICAgIGRvIHsgKytidWZmZXI7IH0gd2hpbGUgKCFJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpICYmICpidWZmZXIgIT0gJ1wwJyk7Ci0gICAgbWVtbW92ZSh0YXJnZXQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKyAgICBTYk1lbW9yeU1vdmUodGFyZ2V0LCBidWZmZXIsIFNiU3RyaW5nR2V0TGVuZ3RoKGJ1ZmZlcikgKyAxKTsKICAgfQogfQogCkBAIC0xMjU5LDIwICsxMjg2LDIwIEBACiAgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChEQkxfRElHIDwgMjAsIERCTF9ESUdfaXNfdG9vX2JpZyk7CiAKICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAiaW5mIik7CisgICAgU2JTdHJpbmdDb3B5VW5zYWZlKGJ1ZmZlciwgImluZiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAiLWluZiIpOworICAgIFNiU3RyaW5nQ29weVVuc2FmZShidWZmZXIsICItaW5mIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfSBlbHNlIGlmIChNYXRoTGltaXRzPGRvdWJsZT46OklzTmFOKHZhbHVlKSkgewotICAgIHN0cmNweShidWZmZXIsICJuYW4iKTsKKyAgICBTYlN0cmluZ0NvcHlVbnNhZmUoYnVmZmVyLCAibmFuIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfQogCiAgIGludCBzbnByaW50Zl9yZXN1bHQgPQotICAgIHNucHJpbnRmKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHLCB2YWx1ZSk7CisgICAgU2JTdHJpbmdGb3JtYXRGKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHLCB2YWx1ZSk7CiAKLSAgLy8gVGhlIHNucHJpbnRmIHNob3VsZCBuZXZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBidWZmZXIgaXMgc2lnbmlmaWNhbnRseQorICAvLyBUaGUgU2JTdHJpbmdGb3JtYXRGIHNob3VsZCBuZXZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBidWZmZXIgaXMgc2lnbmlmaWNhbnRseQogICAvLyBsYXJnZXIgdGhhbiB0aGUgcHJlY2lzaW9uIHdlIGFza2VkIGZvci4KICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtEb3VibGVUb0J1ZmZlclNpemUpOwogCkBAIC0xMjgyLDEwICsxMzA5LDEwIEBACiAgIC8vIG9mIGEgZG91YmxlLiAgVGhpcyBsb25nIGRvdWJsZSBtYXkgaGF2ZSBleHRyYSBiaXRzIHRoYXQgbWFrZSBpdCBjb21wYXJlCiAgIC8vIHVuZXF1YWwgdG8gInZhbHVlIiBldmVuIHRob3VnaCBpdCB3b3VsZCBiZSBleGFjdGx5IGVxdWFsIGlmIGl0IHdlcmUKICAgLy8gdHJ1bmNhdGVkIHRvIGEgZG91YmxlLgotICB2b2xhdGlsZSBkb3VibGUgcGFyc2VkX3ZhbHVlID0gc3RydG9kKGJ1ZmZlciwgTlVMTCk7CisgIHZvbGF0aWxlIGRvdWJsZSBwYXJzZWRfdmFsdWUgPSBTYlN0cmluZ1BhcnNlRG91YmxlKGJ1ZmZlciwgTlVMTCk7CiAgIGlmIChwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKICAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHKzIsIHZhbHVlKTsKKyAgICAgIFNiU3RyaW5nRm9ybWF0RihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRysyLCB2YWx1ZSk7CiAKICAgICAvLyBTaG91bGQgbmV2ZXIgb3ZlcmZsb3c7IHNlZSBhYm92ZS4KICAgICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0RvdWJsZVRvQnVmZmVyU2l6ZSk7CkBAIC0xMzM0LDcgKzEzNjEsNyBAQAogICBjaGFyKiBlbmRwdHI7CiAgIGVycm5vID0gMDsgIC8vIGVycm5vIG9ubHkgZ2V0cyBzZXQgb24gZXJyb3JzCiAjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQgKF9faHB1eCkgfHwgZGVmaW5lZChTVEFSQk9BUkQpICAvLyBoYXMgbm8gc3RydG9mKCkKLSAgKnZhbHVlID0gc3RydG9kKHN0ciwgJmVuZHB0cik7CisgICp2YWx1ZSA9IFNiU3RyaW5nUGFyc2VEb3VibGUoc3RyLCAmZW5kcHRyKTsKICNlbHNlCiAgICp2YWx1ZSA9IHN0cnRvZihzdHIsICZlbmRwdHIpOwogI2VuZGlmCkBAIC0xMzQzLDcgKzEzNzAsNyBAQAogCiBib29sIHNhZmVfc3RydG9kKGNvbnN0IGNoYXIqIHN0ciwgZG91YmxlKiB2YWx1ZSkgewogICBjaGFyKiBlbmRwdHI7Ci0gICp2YWx1ZSA9IHN0cnRvZChzdHIsICZlbmRwdHIpOworICAqdmFsdWUgPSBTYlN0cmluZ1BhcnNlRG91YmxlKHN0ciwgJmVuZHB0cik7CiAgIGlmIChlbmRwdHIgIT0gc3RyKSB7CiAgICAgd2hpbGUgKGFzY2lpX2lzc3BhY2UoKmVuZHB0cikpICsrZW5kcHRyOwogICB9CkBAIC0xMzc3LDI3ICsxNDA0LDI3IEBACiAgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChGTFRfRElHIDwgMTAsIEZMVF9ESUdfaXNfdG9vX2JpZyk7CiAKICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAiaW5mIik7CisgICAgU2JTdHJpbmdDb3B5VW5zYWZlKGJ1ZmZlciwgImluZiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAiLWluZiIpOworICAgIFNiU3RyaW5nQ29weVVuc2FmZShidWZmZXIsICItaW5mIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfSBlbHNlIGlmIChNYXRoTGltaXRzPGZsb2F0Pjo6SXNOYU4odmFsdWUpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIm5hbiIpOworICAgIFNiU3RyaW5nQ29weVVuc2FmZShidWZmZXIsICJuYW4iKTsKICAgICByZXR1cm4gYnVmZmVyOwogICB9CiAKICAgaW50IHNucHJpbnRmX3Jlc3VsdCA9Ci0gICAgc25wcmludGYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRywgdmFsdWUpOworICAgIFNiU3RyaW5nRm9ybWF0RihidWZmZXIsIGtGbG9hdFRvQnVmZmVyU2l6ZSwgIiUuKmciLCBGTFRfRElHLCB2YWx1ZSk7CiAKLSAgLy8gVGhlIHNucHJpbnRmIHNob3VsZCBuZXZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBidWZmZXIgaXMgc2lnbmlmaWNhbnRseQotICAvLyBsYXJnZXIgdGhhbiB0aGUgcHJlY2lzaW9uIHdlIGFza2VkIGZvci4KKyAgLy8gVGhlIFNiU3RyaW5nRm9ybWF0RiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzCisgIC8vIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCiAgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRmxvYXRUb0J1ZmZlclNpemUpOwogCiAgIGZsb2F0IHBhcnNlZF92YWx1ZTsKICAgaWYgKCFzYWZlX3N0cnRvZihidWZmZXIsICZwYXJzZWRfdmFsdWUpIHx8IHBhcnNlZF92YWx1ZSAhPSB2YWx1ZSkgewogICAgIGludCBzbnByaW50Zl9yZXN1bHQgPQotICAgICAgc25wcmludGYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRysyLCB2YWx1ZSk7CisgICAgICBTYlN0cmluZ0Zvcm1hdEYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRysyLCB2YWx1ZSk7CiAKICAgICAvLyBTaG91bGQgbmV2ZXIgb3ZlcmZsb3c7IHNlZSBhYm92ZS4KICAgICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKQEAgLTE0MzcsMzUgKzE0NjQsMzUgQEAKIC8vICAgIG9mIGEgbWl4IG9mIHJhdyBDIHN0cmluZ3MsIEMrKyBzdHJpbmdzLCBhbmQgaW50ZWdlciB2YWx1ZXMuCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEFwcGVuZCBpcyBtZXJlbHkgYSB2ZXJzaW9uIG9mIG1lbWNweSB0aGF0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUKKy8vIEFwcGVuZCBpcyBtZXJlbHkgYSB2ZXJzaW9uIG9mIFNiTWVtb3J5Q29weSB0aGF0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUKIC8vIGFmdGVyIHRoZSBhcmVhIGp1c3Qgb3ZlcndyaXR0ZW4uICBJdCBjb21lcyBpbiBtdWx0aXBsZSBmbGF2b3JzIHRvIG1pbmltaXplCiAvLyBjYWxsIG92ZXJoZWFkLgogc3RhdGljIGNoYXIgKkFwcGVuZDEoY2hhciAqb3V0LCBjb25zdCBBbHBoYU51bSAmeCkgewotICBtZW1jcHkob3V0LCB4LmRhdGEoKSwgeC5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4LmRhdGEoKSwgeC5zaXplKCkpOwogICByZXR1cm4gb3V0ICsgeC5zaXplKCk7CiB9CiAKIHN0YXRpYyBjaGFyICpBcHBlbmQyKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIpIHsKLSAgbWVtY3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4MS5kYXRhKCksIHgxLnNpemUoKSk7CiAgIG91dCArPSB4MS5zaXplKCk7CiAKLSAgbWVtY3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4Mi5kYXRhKCksIHgyLnNpemUoKSk7CiAgIHJldHVybiBvdXQgKyB4Mi5zaXplKCk7CiB9CiAKIHN0YXRpYyBjaGFyICpBcHBlbmQ0KGNoYXIgKm91dCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZ4MSwgY29uc3QgQWxwaGFOdW0gJngyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJngzLCBjb25zdCBBbHBoYU51bSAmeDQpIHsKLSAgbWVtY3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4MS5kYXRhKCksIHgxLnNpemUoKSk7CiAgIG91dCArPSB4MS5zaXplKCk7CiAKLSAgbWVtY3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4Mi5kYXRhKCksIHgyLnNpemUoKSk7CiAgIG91dCArPSB4Mi5zaXplKCk7CiAKLSAgbWVtY3B5KG91dCwgeDMuZGF0YSgpLCB4My5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4My5kYXRhKCksIHgzLnNpemUoKSk7CiAgIG91dCArPSB4My5zaXplKCk7CiAKLSAgbWVtY3B5KG91dCwgeDQuZGF0YSgpLCB4NC5zaXplKCkpOworICBTYk1lbW9yeUNvcHkob3V0LCB4NC5kYXRhKCksIHg0LnNpemUoKSk7CiAgIHJldHVybiBvdXQgKyB4NC5zaXplKCk7CiB9CiAKQEAgLTIyNzEsNyArMjI5OCw3IEBACiAgICAgbGVuID0gNDsKICAgfQogICB0bXAgPSBnaHRvbmwodG1wKTsKLSAgbWVtY3B5KG91dHB1dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRtcCkgKyBzaXplb2YodG1wKSAtIGxlbiwgbGVuKTsKKyAgU2JNZW1vcnlDb3B5KG91dHB1dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRtcCkgKyBzaXplb2YodG1wKSAtIGxlbiwgbGVuKTsKICAgcmV0dXJuIGxlbjsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmggYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDYW52YXMuaAppbmRleCA4ZmJjYTcxLi5hZmQ1ZTk2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDYW52YXMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDYW52YXMuaApAQCAtMTgwLDYgKzE4MCwxNSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgR3JDb250ZXh0KiBnZXRHckNvbnRleHQoKTsKIAorI2lmIGRlZmluZWQoQ09CQUxUKQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnJhbWVidWZmZXIgb2JqZWN0IGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXIgdGFyZ2V0LCBpZgorICAgICAqIGFwcGxpY2FibGUuCisgICAgICogTk9URTogVGhpcyB3aWxsIGNhdXNlIGEgZmx1c2gsIHNvIHVzZSBzcGFyaW5nbHkuCisgICAgICovCisgICAgaW50cHRyX3QgZ2V0UmVuZGVyVGFyZ2V0SGFuZGxlKCkgY29uc3Q7CisjZW5kaWYKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0NhbnZhcy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0NhbnZhcy5jcHAKaW5kZXggZGFiNWJlNC4uOTMwMmQ2YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tDYW52YXMuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9jb3JlL1NrQ2FudmFzLmNwcApAQCAtMTY3OSw2ICsxNjc5LDE5IEBACiAgICAgcmV0dXJuIGRldmljZSA/IGRldmljZS0+Y29udGV4dCgpIDogbnVsbHB0cjsKIH0KIAorI2lmIGRlZmluZWQoQ09CQUxUKQoraW50cHRyX3QgU2tDYW52YXM6OmdldFJlbmRlclRhcmdldEhhbmRsZSgpIGNvbnN0IHsKKyAgICBpZiAoZlN1cmZhY2VCYXNlKSB7CisgICAgICAgIEdyQmFja2VuZE9iamVjdCBoYW5kbGU7CisgICAgICAgIGlmIChmU3VyZmFjZUJhc2UtPmdldFJlbmRlclRhcmdldEhhbmRsZSgmaGFuZGxlLAorICAgICAgICAgICAgICAgIFNrU3VyZmFjZTo6a0ZsdXNoUmVhZF9CYWNrZW5kSGFuZGxlQWNjZXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCiB2b2lkIFNrQ2FudmFzOjpkcmF3RFJSZWN0KGNvbnN0IFNrUlJlY3QmIG91dGVyLCBjb25zdCBTa1JSZWN0JiBpbm5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tQYWludCYgcGFpbnQpIHsKICAgICBUUkFDRV9FVkVOVDAoImRpc2FibGVkLWJ5LWRlZmF1bHQtc2tpYSIsICJTa0NhbnZhczo6ZHJhd0RSUmVjdCgpIik7Cg==